A little more FTP daemon cleanup

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4374 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-02-05 22:46:56 +00:00
parent b28d2ce389
commit ed6abe6d2e
2 changed files with 126 additions and 110 deletions

View File

@ -271,7 +271,7 @@ int MAIN_NAME(int s_argc, char **s_argv)
#ifdef CONFIG_NSH_BUILTIN_APPS #ifdef CONFIG_NSH_BUILTIN_APPS
int ftpd_stop(int s_argc, char **s_argv) int ftpd_stop(int s_argc, char **s_argv)
{ {
if (!g_ftpdglob.initialized || g_ftpdglob.running) if (!g_ftpdglob.initialized || !g_ftpdglob.running)
{ {
printf("The FTP daemon not running\n"); printf("The FTP daemon not running\n");
return EXIT_FAILURE; return EXIT_FAILURE;

View File

@ -245,12 +245,15 @@ static const struct ftpd_cmd_s g_ftpdcmdtab[] =
{NULL, (ftpd_cmdhandler_t)0, 0} {NULL, (ftpd_cmdhandler_t)0, 0}
}; };
static const char g_cdup[] = ".."; static const char g_cdup[] = "..";
static const char g_respfmt[] = "%03u%c%s\r\n"; static const char g_respfmt1[] = "%03u%c%s\r\n"; /* Integer, character, string */
static const char g_respfmt2[] = "%03u%c%s%s\r\n"; /* Integer, character, two strings */
static const char *g_monthtab[] = static const char *g_monthtab[] =
{ {
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
}; };
static const char *g_ftpdhelp[] = static const char *g_ftpdhelp[] =
{ {
"The following commands are recognized (* =>'s unimplemented):", "The following commands are recognized (* =>'s unimplemented):",
@ -1008,7 +1011,7 @@ static int ftpd_dataopen(FAR struct ftpd_session_s *session)
int errval = errno; int errval = errno;
ndbg("socket() failed: %d\n", errval); ndbg("socket() failed: %d\n", errval);
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 451, ' ', "Socket error !"); g_respfmt1, 451, ' ', "Socket error !");
return -errval; return -errval;
} }
@ -1020,7 +1023,7 @@ static int ftpd_dataopen(FAR struct ftpd_session_s *session)
int errval = errno; int errval = errno;
ndbg("connect() failed: %d\n", errval); ndbg("connect() failed: %d\n", errval);
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 451, ' ', "Connect error !"); g_respfmt1, 451, ' ', "Connect error !");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return -errval; return -errval;
} }
@ -1048,7 +1051,7 @@ static int ftpd_dataopen(FAR struct ftpd_session_s *session)
{ {
ndbg("ftpd_accept() failed: %d\n", sd); ndbg("ftpd_accept() failed: %d\n", sd);
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 451, ' ', "Accept error !"); g_respfmt1, 451, ' ', "Accept error !");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return sd; return sd;
} }
@ -1597,7 +1600,7 @@ static int ftpd_changedir(FAR struct ftpd_session_s *session,
if (ret < 0) if (ret < 0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not change directory !"); "Can not change directory !");
} }
@ -1607,7 +1610,7 @@ static int ftpd_changedir(FAR struct ftpd_session_s *session,
free(workpath); free(workpath);
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', rempath, g_respfmt2, 550, ' ', rempath,
": No such file or directory"); ": No such file or directory");
} }
@ -1616,7 +1619,7 @@ static int ftpd_changedir(FAR struct ftpd_session_s *session,
free(workpath); free(workpath);
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', rempath, g_respfmt2, 550, ' ', rempath,
": No such file or directory"); ": No such file or directory");
} }
@ -1628,7 +1631,7 @@ static int ftpd_changedir(FAR struct ftpd_session_s *session,
session->work = workpath; session->work = workpath;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 250, ' ', "CWD command successful"); g_respfmt1, 250, ' ', "CWD command successful");
} }
/**************************************************************************** /****************************************************************************
@ -1719,7 +1722,7 @@ static int ftpd_stream(FAR struct ftpd_session_s *session, int cmdtype)
if (ret < 0) if (ret < 0)
{ {
ftpd_response(session->cmd.sd, session->txtimeout, ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Stream error !"); g_respfmt1, 550, ' ', "Stream error !");
goto errout; goto errout;
} }
path = abspath; path = abspath;
@ -1782,7 +1785,7 @@ static int ftpd_stream(FAR struct ftpd_session_s *session, int cmdtype)
{ {
ret = -errno; ret = -errno;
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Can not open file !"); g_respfmt1, 550, ' ', "Can not open file !");
goto errout_with_data; goto errout_with_data;
} }
@ -1834,7 +1837,7 @@ static int ftpd_stream(FAR struct ftpd_session_s *session, int cmdtype)
if (seekoffs < 0) if (seekoffs < 0)
{ {
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Can not seek file !"); g_respfmt1, 550, ' ', "Can not seek file !");
goto errout_with_session; goto errout_with_session;
} }
@ -1844,7 +1847,7 @@ static int ftpd_stream(FAR struct ftpd_session_s *session, int cmdtype)
/* Send success message */ /* Send success message */
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 150, ' ', "Opening data connection"); g_respfmt1, 150, ' ', "Opening data connection");
if (ret < 0) if (ret < 0)
{ {
ndbg("ftpd_response failed: %d\n", ret); ndbg("ftpd_response failed: %d\n", ret);
@ -1879,7 +1882,7 @@ static int ftpd_stream(FAR struct ftpd_session_s *session, int cmdtype)
{ {
ndbg("ftp_recv failed: %d\n", rdbytes); ndbg("ftp_recv failed: %d\n", rdbytes);
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Data read error !"); g_respfmt1, 550, ' ', "Data read error !");
ret = rdbytes; ret = rdbytes;
break; break;
} }
@ -1890,7 +1893,7 @@ static int ftpd_stream(FAR struct ftpd_session_s *session, int cmdtype)
ret = -ECONNRESET; ret = -ECONNRESET;
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 226, ' ', "Transfer complete"); g_respfmt1, 226, ' ', "Transfer complete");
break; break;
} }
@ -1938,7 +1941,7 @@ static int ftpd_stream(FAR struct ftpd_session_s *session, int cmdtype)
if (wrbytes != ((ssize_t)buflen)) if (wrbytes != ((ssize_t)buflen))
{ {
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Data send error !"); g_respfmt1, 550, ' ', "Data send error !");
break; break;
} }
@ -2353,18 +2356,32 @@ static int ftpd_command_user(FAR struct ftpd_session_s *session)
{ {
int ret; int ret;
/* Clear session status (USER, REST, RNFR) */
session->flags = 0;
session->restartpos = 0;
/* Free session strings */
if (session->user) if (session->user)
{ {
free(session->user); free(session->user);
session->user = NULL;
} }
/* Set up the user */ if (session->renamefrom)
{
free(session->renamefrom);
session->renamefrom = NULL;
}
/* Set up the new user */
session->user = strdup(session->param); session->user = strdup(session->param);
if (!session->user) if (!session->user)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 451, ' ', "Memory exhausted !"); g_respfmt1, 451, ' ', "Memory exhausted !");
} }
session->flags |= FTPD_SESSIONFLAG_USER; session->flags |= FTPD_SESSIONFLAG_USER;
@ -2380,7 +2397,7 @@ static int ftpd_command_user(FAR struct ftpd_session_s *session)
session->work = strdup("/"); session->work = strdup("/");
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 230, ' ', "Login successful."); g_respfmt1, 230, ' ', "Login successful.");
if (ret < 0) if (ret < 0)
{ {
session->curr = NULL; session->curr = NULL;
@ -2396,7 +2413,7 @@ static int ftpd_command_user(FAR struct ftpd_session_s *session)
if (session->curr) if (session->curr)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 230, ' ', "Login successful."); g_respfmt1, 230, ' ', "Login successful.");
if (ret < 0) if (ret < 0)
{ {
session->curr = NULL; session->curr = NULL;
@ -2407,7 +2424,7 @@ static int ftpd_command_user(FAR struct ftpd_session_s *session)
/* A password is required */ /* A password is required */
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 331, ' ', "Password required for ", g_respfmt2, 331, ' ', "Password required for ",
session->user); session->user);
} }
@ -2422,14 +2439,14 @@ static int ftpd_command_pass(FAR struct ftpd_session_s *session)
if (!session->user) if (!session->user)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 530, ' ', "Please login with USER !"); g_respfmt1, 530, ' ', "Please login with USER !");
} }
session->curr = ftpd_account_login(session, session->user, session->param); session->curr = ftpd_account_login(session, session->user, session->param);
if (session->curr) if (session->curr)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 230, ' ', "Login successful."); g_respfmt1, 230, ' ', "Login successful.");
if (ret < 0) if (ret < 0)
{ {
session->curr = NULL; session->curr = NULL;
@ -2438,7 +2455,7 @@ static int ftpd_command_pass(FAR struct ftpd_session_s *session)
} }
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 530, ' ', "Login incorrect !"); g_respfmt1, 530, ' ', "Login incorrect !");
} }
/**************************************************************************** /****************************************************************************
@ -2448,7 +2465,7 @@ static int ftpd_command_pass(FAR struct ftpd_session_s *session)
static int ftpd_command_syst(FAR struct ftpd_session_s *session) static int ftpd_command_syst(FAR struct ftpd_session_s *session)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 215, ' ', "UNIX Type: L8"); g_respfmt1, 215, ' ', "UNIX Type: L8");
} }
/**************************************************************************** /****************************************************************************
@ -2467,21 +2484,21 @@ static int ftpd_command_type(FAR struct ftpd_session_s *session)
{ {
session->type = FTPD_SESSIONTYPE_A; session->type = FTPD_SESSIONTYPE_A;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', "Type set to A"); g_respfmt1, 200, ' ', "Type set to A");
} }
case 'I': case 'I':
{ {
session->type = FTPD_SESSIONTYPE_I; session->type = FTPD_SESSIONTYPE_I;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', "Type set to I"); g_respfmt1, 200, ' ', "Type set to I");
} }
case 'L': case 'L':
{ {
session->type = FTPD_SESSIONTYPE_L8; session->type = FTPD_SESSIONTYPE_L8;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', g_respfmt1, 200, ' ',
"Type set to L (byte size 8)"); "Type set to L (byte size 8)");
} }
@ -2489,7 +2506,7 @@ static int ftpd_command_type(FAR struct ftpd_session_s *session)
{ {
session->type = FTPD_SESSIONTYPE_NONE; session->type = FTPD_SESSIONTYPE_NONE;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 501, ' ', "Type unknown !"); g_respfmt1, 501, ' ', "Type unknown !");
} }
} }
} }
@ -2501,20 +2518,20 @@ static int ftpd_command_type(FAR struct ftpd_session_s *session)
{ {
session->type = FTPD_SESSIONTYPE_L8; session->type = FTPD_SESSIONTYPE_L8;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', "Type set to L 8"); g_respfmt1, 200, ' ', "Type set to L 8");
} }
else else
{ {
session->type = FTPD_SESSIONTYPE_NONE; session->type = FTPD_SESSIONTYPE_NONE;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 504, ' ', "Byte size must be 8 !"); g_respfmt1, 504, ' ', "Byte size must be 8 !");
} }
} }
} }
session->type = FTPD_SESSIONTYPE_NONE; session->type = FTPD_SESSIONTYPE_NONE;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 500, ' ', "TYPE not understood !"); g_respfmt1, 500, ' ', "TYPE not understood !");
} }
/**************************************************************************** /****************************************************************************
@ -2524,7 +2541,7 @@ static int ftpd_command_type(FAR struct ftpd_session_s *session)
static int ftpd_command_mode(FAR struct ftpd_session_s *session) static int ftpd_command_mode(FAR struct ftpd_session_s *session)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', g_respfmt1, 502, ' ',
"MODE command not implemented !"); "MODE command not implemented !");
} }
@ -2536,7 +2553,7 @@ static int ftpd_command_abor(FAR struct ftpd_session_s *session)
{ {
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 426, ' ', g_respfmt1, 426, ' ',
"Transfer aborted. Data connection closed."); "Transfer aborted. Data connection closed.");
} }
@ -2546,15 +2563,12 @@ static int ftpd_command_abor(FAR struct ftpd_session_s *session)
static int ftpd_command_quit(FAR struct ftpd_session_s *session) static int ftpd_command_quit(FAR struct ftpd_session_s *session)
{ {
int ret; (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt1, 221, ' ', "Good-bye");
ret = ftpd_response(session->cmd.sd, session->txtimeout, /* Return a negative value to force the server to disconnect */
g_respfmt, 221, ' ', "Good-bye");
if (ret >= 0) return -1;
{
ret = 1; /* To disconnect */
}
return ret;
} }
/**************************************************************************** /****************************************************************************
@ -2564,7 +2578,7 @@ static int ftpd_command_quit(FAR struct ftpd_session_s *session)
static int ftpd_command_noop(FAR struct ftpd_session_s *session) static int ftpd_command_noop(FAR struct ftpd_session_s *session)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', g_respfmt1, 200, ' ',
"NOOP command successful"); "NOOP command successful");
} }
@ -2608,7 +2622,7 @@ static int ftpd_command_port(FAR struct ftpd_session_s *session)
if (temp < 0 || temp > 255) if (temp < 0 || temp > 255)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 501, ' ', g_respfmt1, 501, ' ',
"Illegal PORT command"); "Illegal PORT command");
if (ret < 0) if (ret < 0)
{ {
@ -2623,7 +2637,7 @@ static int ftpd_command_port(FAR struct ftpd_session_s *session)
if (index < 6) if (index < 6)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 501, ' ', "Illegal PORT command"); g_respfmt1, 501, ' ', "Illegal PORT command");
} }
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
@ -2675,7 +2689,7 @@ static int ftpd_command_port(FAR struct ftpd_session_s *session)
#endif #endif
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', g_respfmt1, 200, ' ',
"PORT command successful"); "PORT command successful");
} }
@ -2701,7 +2715,7 @@ static int ftpd_command_eprt(FAR struct ftpd_session_s *session)
/* no message ? */ /* no message ? */
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', g_respfmt1, 502, ' ',
"EPRT command not implemented !"); "EPRT command not implemented !");
return -EINVAL; return -EINVAL;
} }
@ -2722,7 +2736,7 @@ static int ftpd_command_eprt(FAR struct ftpd_session_s *session)
/* Invalid format */ /* Invalid format */
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', g_respfmt1, 502, ' ',
"EPRT command not implemented !"); "EPRT command not implemented !");
return -EINVAL; return -EINVAL;
} }
@ -2759,7 +2773,7 @@ static int ftpd_command_eprt(FAR struct ftpd_session_s *session)
} }
(void)ftpd_response(session->cmd.sd, session->txtimeout, (void)ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', g_respfmt1, 502, ' ',
"EPRT command not implemented !"); "EPRT command not implemented !");
return -EINVAL; return -EINVAL;
} }
@ -2806,13 +2820,13 @@ static int ftpd_command_eprt(FAR struct ftpd_session_s *session)
if (family == AF_UNSPEC) if (family == AF_UNSPEC)
{ {
ftpd_response(session->cmd.sd, session->txtimeout, ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', g_respfmt1, 502, ' ',
"EPRT command not implemented !"); "EPRT command not implemented !");
return -EINVAL; return -EINVAL;
} }
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', "EPRT command successful"); g_respfmt1, 200, ' ', "EPRT command successful");
} }
/**************************************************************************** /****************************************************************************
@ -2869,7 +2883,7 @@ static int ftpd_command_rmd(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not remove directory !"); "Can not remove directory !");
} }
@ -2879,7 +2893,7 @@ static int ftpd_command_rmd(FAR struct ftpd_session_s *session)
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not remove home directory !"); "Can not remove home directory !");
} }
@ -2889,7 +2903,7 @@ static int ftpd_command_rmd(FAR struct ftpd_session_s *session)
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not remove current directory !"); "Can not remove current directory !");
} }
@ -2900,7 +2914,7 @@ static int ftpd_command_rmd(FAR struct ftpd_session_s *session)
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not remove directory !"); "Can not remove directory !");
} }
@ -2908,7 +2922,7 @@ static int ftpd_command_rmd(FAR struct ftpd_session_s *session)
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 250, ' ', g_respfmt1, 250, ' ',
"RMD command successful"); "RMD command successful");
} }
@ -2925,7 +2939,7 @@ static int ftpd_command_mkd(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not make directory !"); "Can not make directory !");
} }
@ -2934,12 +2948,12 @@ static int ftpd_command_mkd(FAR struct ftpd_session_s *session)
{ {
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Can not make directory !"); g_respfmt1, 550, ' ', "Can not make directory !");
} }
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 250, ' ', "MKD command successful"); g_respfmt1, 250, ' ', "MKD command successful");
} }
/**************************************************************************** /****************************************************************************
@ -2956,7 +2970,7 @@ static int ftpd_command_dele(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Can not delete file !"); g_respfmt1, 550, ' ', "Can not delete file !");
} }
if (strcmp(session->home, abspath) == 0) if (strcmp(session->home, abspath) == 0)
@ -2965,7 +2979,7 @@ static int ftpd_command_dele(FAR struct ftpd_session_s *session)
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not delete home directory !"); "Can not delete home directory !");
} }
@ -2975,7 +2989,7 @@ static int ftpd_command_dele(FAR struct ftpd_session_s *session)
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', g_respfmt1, 550, ' ',
"Can not delete current directory !"); "Can not delete current directory !");
} }
@ -2986,14 +3000,14 @@ static int ftpd_command_dele(FAR struct ftpd_session_s *session)
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Can not delete file !"); g_respfmt1, 550, ' ', "Can not delete file !");
} }
free(abspath); free(abspath);
free(workpath); free(workpath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 250, ' ', "DELE command successful"); g_respfmt1, 250, ' ', "DELE command successful");
} }
/**************************************************************************** /****************************************************************************
@ -3015,7 +3029,7 @@ static int ftpd_command_pasv(FAR struct ftpd_session_s *session)
{ {
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 425, ' ', "PASV socket create fail !"); g_respfmt1, 425, ' ', "PASV socket create fail !");
} }
ret = getsockname(session->cmd.sd, (FAR struct sockaddr *)&session->data.addr, ret = getsockname(session->cmd.sd, (FAR struct sockaddr *)&session->data.addr,
@ -3024,7 +3038,7 @@ static int ftpd_command_pasv(FAR struct ftpd_session_s *session)
{ {
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 425, ' ', "PASV getsockname fail !"); g_respfmt1, 425, ' ', "PASV getsockname fail !");
} }
#ifdef CONFIG_NET_IPv6 #ifdef CONFIG_NET_IPv6
@ -3070,7 +3084,7 @@ static int ftpd_command_pasv(FAR struct ftpd_session_s *session)
{ {
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 425, ' ', "PASV bind fail !"); g_respfmt1, 425, ' ', "PASV bind fail !");
} }
ret = getsockname(session->data.sd, (FAR struct sockaddr *)&session->data.addr, ret = getsockname(session->data.sd, (FAR struct sockaddr *)&session->data.addr,
@ -3079,7 +3093,7 @@ static int ftpd_command_pasv(FAR struct ftpd_session_s *session)
{ {
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 425, ' ', "PASV getsockname fail !"); g_respfmt1, 425, ' ', "PASV getsockname fail !");
} }
ret = listen(session->data.sd, 1); ret = listen(session->data.sd, 1);
@ -3087,14 +3101,14 @@ static int ftpd_command_pasv(FAR struct ftpd_session_s *session)
{ {
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 425, ' ', "PASV listen fail !"); g_respfmt1, 425, ' ', "PASV listen fail !");
} }
if (ntohl(session->data.addr.in4.sin_addr.s_addr) == INADDR_ANY) if (ntohl(session->data.addr.in4.sin_addr.s_addr) == INADDR_ANY)
{ {
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 425, ' ', g_respfmt1, 425, ' ',
"Can not open passive connection"); "Can not open passive connection");
} }
@ -3153,7 +3167,7 @@ static int ftpd_command_epsv(FAR struct ftpd_session_s *session)
if (session->data.sd < 0) if (session->data.sd < 0)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 500, ' ', "EPSV socket create fail !"); g_respfmt1, 500, ' ', "EPSV socket create fail !");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ret; return ret;
} }
@ -3163,7 +3177,7 @@ static int ftpd_command_epsv(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 500, ' ', "EPSV getsockname fail !"); g_respfmt1, 500, ' ', "EPSV getsockname fail !");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ret; return ret;
} }
@ -3186,7 +3200,7 @@ static int ftpd_command_epsv(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 500, ' ', "EPSV bind fail !"); g_respfmt1, 500, ' ', "EPSV bind fail !");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ret; return ret;
} }
@ -3196,7 +3210,7 @@ static int ftpd_command_epsv(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 500, ' ', "EPSV getsockname fail !"); g_respfmt1, 500, ' ', "EPSV getsockname fail !");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ret; return ret;
} }
@ -3205,7 +3219,7 @@ static int ftpd_command_epsv(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 500, ' ', "EPSV listen fail !"); g_respfmt1, 500, ' ', "EPSV listen fail !");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ret; return ret;
} }
@ -3241,7 +3255,7 @@ static int ftpd_command_epsv(FAR struct ftpd_session_s *session)
#endif #endif
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', g_respfmt1, 502, ' ',
"EPSV command not implemented !"); "EPSV command not implemented !");
} }
@ -3264,7 +3278,7 @@ static int ftpd_command_list(FAR struct ftpd_session_s *session)
} }
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 150, ' ', g_respfmt1, 150, ' ',
"Opening ASCII mode data connection for file list"); "Opening ASCII mode data connection for file list");
if (ret < 0) if (ret < 0)
{ {
@ -3276,7 +3290,7 @@ static int ftpd_command_list(FAR struct ftpd_session_s *session)
(void)ftpd_list(session, opton); (void)ftpd_list(session, opton);
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 226, ' ', "Transfer complete"); g_respfmt1, 226, ' ', "Transfer complete");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ret; return ret;
@ -3298,7 +3312,7 @@ static int ftpd_command_nlst(FAR struct ftpd_session_s *session)
} }
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 150, ' ', g_respfmt1, 150, ' ',
"Opening ASCII mode data connection for file list"); "Opening ASCII mode data connection for file list");
if (ret < 0) if (ret < 0)
{ {
@ -3310,7 +3324,7 @@ static int ftpd_command_nlst(FAR struct ftpd_session_s *session)
(void)ftpd_list(session, opton); (void)ftpd_list(session, opton);
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 226, ' ', "Transfer complete"); g_respfmt1, 226, ' ', "Transfer complete");
(void)ftpd_dataclose(session); (void)ftpd_dataclose(session);
return ret; return ret;
@ -3323,7 +3337,7 @@ static int ftpd_command_nlst(FAR struct ftpd_session_s *session)
static int ftpd_command_acct(FAR struct ftpd_session_s *session) static int ftpd_command_acct(FAR struct ftpd_session_s *session)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', "ACCT command not implemented !"); g_respfmt1, 502, ' ', "ACCT command not implemented !");
} }
/**************************************************************************** /****************************************************************************
@ -3345,7 +3359,7 @@ static int ftpd_command_size(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Unknown size !"); g_respfmt1, 550, ' ', "Unknown size !");
} }
path = abspath; path = abspath;
@ -3360,13 +3374,13 @@ static int ftpd_command_size(FAR struct ftpd_session_s *session)
if (status < 0) if (status < 0)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": not a regular file."); ": not a regular file.");
} }
else if (!S_ISREG(st.st_mode)) else if (!S_ISREG(st.st_mode))
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": not a regular file."); ": not a regular file.");
} }
else else
@ -3383,7 +3397,7 @@ static int ftpd_command_size(FAR struct ftpd_session_s *session)
if (status < 0) if (status < 0)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": not a regular file."); ": not a regular file.");
if (ret < 0) if (ret < 0)
{ {
@ -3393,7 +3407,7 @@ static int ftpd_command_size(FAR struct ftpd_session_s *session)
else if (!S_ISREG(st.st_mode)) else if (!S_ISREG(st.st_mode))
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": not a regular file."); ": not a regular file.");
if (ret < 0) if (ret < 0)
{ {
@ -3406,7 +3420,7 @@ static int ftpd_command_size(FAR struct ftpd_session_s *session)
if (!outstream) if (!outstream)
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": Can not open file !"); ": Can not open file !");
if (ret < 0) if (ret < 0)
{ {
@ -3438,7 +3452,7 @@ static int ftpd_command_size(FAR struct ftpd_session_s *session)
default: default:
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 504, ' ', "SIZE not implemented for type"); g_respfmt1, 504, ' ', "SIZE not implemented for type");
} }
break; break;
} }
@ -3454,7 +3468,7 @@ static int ftpd_command_size(FAR struct ftpd_session_s *session)
static int ftpd_command_stru(FAR struct ftpd_session_s *session) static int ftpd_command_stru(FAR struct ftpd_session_s *session)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', "STRU command not implemented !"); g_respfmt1, 502, ' ', "STRU command not implemented !");
} }
/**************************************************************************** /****************************************************************************
@ -3478,7 +3492,7 @@ static int ftpd_command_rnfr(FAR struct ftpd_session_s *session)
if (ret < 0) if (ret < 0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "RNFR error !"); g_respfmt1, 550, ' ', "RNFR error !");
} }
path = abspath; path = abspath;
@ -3487,7 +3501,7 @@ static int ftpd_command_rnfr(FAR struct ftpd_session_s *session)
{ {
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": No such file or directory."); ": No such file or directory.");
} }
@ -3495,7 +3509,7 @@ static int ftpd_command_rnfr(FAR struct ftpd_session_s *session)
session->flags |= FTPD_SESSIONFLAG_RENAMEFROM; session->flags |= FTPD_SESSIONFLAG_RENAMEFROM;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 350, ' ', "RNFR successful"); g_respfmt1, 350, ' ', "RNFR successful");
} }
/**************************************************************************** /****************************************************************************
@ -3510,14 +3524,14 @@ static int ftpd_command_rnto(FAR struct ftpd_session_s *session)
if (!session->renamefrom) if (!session->renamefrom)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "RNTO error !"); g_respfmt1, 550, ' ', "RNTO error !");
} }
ret = ftpd_getpath(session, session->param, &abspath, NULL); ret = ftpd_getpath(session, session->param, &abspath, NULL);
if (ret < 0) if (ret < 0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "RNTO error !"); g_respfmt1, 550, ' ', "RNTO error !");
} }
ret = rename(session->renamefrom, abspath); ret = rename(session->renamefrom, abspath);
@ -3525,13 +3539,13 @@ static int ftpd_command_rnto(FAR struct ftpd_session_s *session)
{ {
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": Rename error."); ": Rename error.");
} }
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 250, ' ', "Rename successful"); g_respfmt1, 250, ' ', "Rename successful");
} }
/**************************************************************************** /****************************************************************************
@ -3575,7 +3589,7 @@ static int ftpd_command_rest(FAR struct ftpd_session_s *session)
session->flags |= FTPD_SESSIONFLAG_RESTARTPOS; session->flags |= FTPD_SESSIONFLAG_RESTARTPOS;
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 320, ' ', "Restart position ready"); g_respfmt1, 320, ' ', "Restart position ready");
} }
/**************************************************************************** /****************************************************************************
@ -3594,7 +3608,7 @@ static int ftpd_command_mdtm(FAR struct ftpd_session_s *session)
if (ret <0) if (ret <0)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 550, ' ', "Unknown size !"); g_respfmt1, 550, ' ', "Unknown size !");
} }
path = abspath; path = abspath;
@ -3603,7 +3617,7 @@ static int ftpd_command_mdtm(FAR struct ftpd_session_s *session)
{ {
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": not a plain file."); ": not a plain file.");
} }
@ -3611,7 +3625,7 @@ static int ftpd_command_mdtm(FAR struct ftpd_session_s *session)
{ {
free(abspath); free(abspath);
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 550, ' ', session->param, g_respfmt2, 550, ' ', session->param,
": not a plain file."); ": not a plain file.");
} }
@ -3687,11 +3701,11 @@ static int ftpd_command_opts(FAR struct ftpd_session_s *session)
if (remote != local) if (remote != local)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 504, ' ', "UIF-8 disabled"); g_respfmt1, 504, ' ', "UIF-8 disabled");
} }
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 200, ' ', "OK, UTF-8 enabled"); g_respfmt1, 200, ' ', "OK, UTF-8 enabled");
} }
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
@ -3706,7 +3720,7 @@ static int ftpd_command_opts(FAR struct ftpd_session_s *session)
static int ftpd_command_site(FAR struct ftpd_session_s *session) static int ftpd_command_site(FAR struct ftpd_session_s *session)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 502, ' ', "SITE command not implemented !"); g_respfmt1, 502, ' ', "SITE command not implemented !");
} }
/**************************************************************************** /****************************************************************************
@ -3724,7 +3738,7 @@ static int ftpd_command_help(FAR struct ftpd_session_s *session)
if (index == 0 || !g_ftpdhelp[index + 1]) if (index == 0 || !g_ftpdhelp[index + 1])
{ {
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 214, g_respfmt1, 214,
!g_ftpdhelp[index + 1] ? ' ' : '-', !g_ftpdhelp[index + 1] ? ' ' : '-',
g_ftpdhelp[index]); g_ftpdhelp[index]);
} }
@ -3770,7 +3784,7 @@ static int ftpd_command(FAR struct ftpd_session_s *session)
if (!session->curr && session->head) if (!session->curr && session->head)
{ {
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 530, ' ', g_respfmt1, 530, ' ',
"Please login with USER and PASS !"); "Please login with USER and PASS !");
} }
} }
@ -3784,7 +3798,9 @@ static int ftpd_command(FAR struct ftpd_session_s *session)
return g_ftpdcmdtab[index].handler(session); return g_ftpdcmdtab[index].handler(session);
} }
/* No... that is bad break out of the loop and send the 500 message */ /* No... this command is not in the command table. Break out of
* the loop and send the 500 message.
*/
break; break;
} }
@ -3793,7 +3809,7 @@ static int ftpd_command(FAR struct ftpd_session_s *session)
/* There is nothing in the command table matching this command */ /* There is nothing in the command table matching this command */
return ftpd_response(session->cmd.sd, session->txtimeout, return ftpd_response(session->cmd.sd, session->txtimeout,
"%03u%c%s%s\r\n", 500, ' ', session->command, g_respfmt2, 500, ' ', session->command,
" not understood"); " not understood");
} }
@ -3958,7 +3974,7 @@ static FAR void *ftpd_worker(FAR void *arg)
/* Send the welcoming message */ /* Send the welcoming message */
ret = ftpd_response(session->cmd.sd, session->txtimeout, ret = ftpd_response(session->cmd.sd, session->txtimeout,
g_respfmt, 220, ' ', CONFIG_FTPD_SERVERID); g_respfmt1, 220, ' ', CONFIG_FTPD_SERVERID);
if (ret < 0) if (ret < 0)
{ {
ndbg("ftpd_response() failed: %d\n", ret); ndbg("ftpd_response() failed: %d\n", ret);
@ -4052,7 +4068,7 @@ static FAR void *ftpd_worker(FAR void *arg)
ret = ftpd_command(session); ret = ftpd_command(session);
if (ret < 0) if (ret < 0)
{ {
ndbg("Disconnected by the command handler: %s\n", ret); ndbg("Disconnected by the command handler: %d\n", ret);
break; break;
} }
} }