From 30c1b7a77ddd542dbac8b2b451ee015560638666 Mon Sep 17 00:00:00 2001 From: Michael Theall Date: Wed, 26 Jul 2017 08:56:37 -0500 Subject: [PATCH] Make ftp_send_response[_buffer] return void --- source/ftp.c | 542 +++++++++++++++++++++++++++------------------------ 1 file changed, 287 insertions(+), 255 deletions(-) diff --git a/source/ftp.c b/source/ftp.c index a842e85..b2e0b0f 100644 --- a/source/ftp.c +++ b/source/ftp.c @@ -48,7 +48,7 @@ typedef struct ftp_session_t ftp_session_t; -#define FTP_DECLARE(x) static int x(ftp_session_t *session, const char *args) +#define FTP_DECLARE(x) static void x(ftp_session_t *session, const char *args) FTP_DECLARE(ABOR); FTP_DECLARE(ALLO); FTP_DECLARE(APPE); @@ -144,7 +144,7 @@ struct ftp_session_t typedef struct ftp_command { const char *name; /*!< command name */ - int (*handler)(ftp_session_t*, const char*); /*!< command callback */ + void (*handler)(ftp_session_t*, const char*); /*!< command callback */ } ftp_command_t; /*! ftp command list */ @@ -784,27 +784,32 @@ decode_path(ftp_session_t *session, * @param[in] session ftp session * @param[in] buffer buffer to send * @param[in] len buffer length - * - * @returns bytes sent to peer */ -static ssize_t +static void ftp_send_response_buffer(ftp_session_t *session, const char *buffer, size_t len) { ssize_t rc, to_send; + if(session->cmd_fd < 0) + return; + /* send response */ to_send = len; console_print(GREEN "%s" RESET, buffer); rc = send(session->cmd_fd, buffer, to_send, 0); if(rc < 0) + { console_print(RED "send: %d %s\n" RESET, errno, strerror(errno)); + ftp_session_close_cmd(session); + } else if(rc != to_send) + { console_print(RED "only sent %u/%u bytes\n" RESET, (unsigned int)rc, (unsigned int)to_send); - - return rc; + ftp_session_close_cmd(session); + } } __attribute__((format(printf,3,4))) @@ -814,10 +819,8 @@ __attribute__((format(printf,3,4))) * @param[in] code response code * @param[in] fmt format string * @param[in] ... format arguments - * - * returns bytes sent to peer */ -static ssize_t +static void ftp_send_response(ftp_session_t *session, int code, const char *fmt, ...) @@ -826,6 +829,9 @@ ftp_send_response(ftp_session_t *session, ssize_t rc; va_list ap; + if(session->cmd_fd < 0) + return; + /* print response code and message to buffer */ va_start(ap, fmt); if(code > 0) @@ -845,7 +851,7 @@ ftp_send_response(ftp_session_t *session, rc = sprintf(buffer, "%d-\r\n", -code); } - return ftp_send_response_buffer(session, buffer, rc); + ftp_send_response_buffer(session, buffer, rc); } /*! destroy ftp session @@ -952,12 +958,7 @@ ftp_session_new(int listen_fd) session->cmd_fd = new_fd; /* send initiator response */ - rc = ftp_send_response(session, 220, "Hello!\r\n"); - if(rc <= 0) - { - debug_print("failed to send initiator response\n"); - ftp_session_destroy(session); - } + ftp_send_response(session, 220, "Hello!\r\n"); } /*! accept PASV connection for ftp session @@ -2267,7 +2268,7 @@ typedef enum * * @returns failure */ -static int +static void ftp_xfer_file(ftp_session_t *session, const char *args, xfer_file_mode_t mode) @@ -2279,7 +2280,8 @@ ftp_xfer_file(ftp_session_t *session, { rc = errno; ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 553, "%s\r\n", strerror(rc)); + ftp_send_response(session, 553, "%s\r\n", strerror(rc)); + return; } /* open the file for retrieving or storing */ @@ -2292,7 +2294,8 @@ ftp_xfer_file(ftp_session_t *session, { /* error opening the file */ ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 450, "failed to open file\r\n"); + ftp_send_response(session, 450, "failed to open file\r\n"); + return; } if(session->flags & (SESSION_PORT|SESSION_PASV)) @@ -2307,7 +2310,8 @@ ftp_xfer_file(ftp_session_t *session, { /* error connecting */ ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 425, "can't open data connection\r\n"); + ftp_send_response(session, 425, "can't open data connection\r\n"); + return; } } @@ -2327,11 +2331,11 @@ ftp_xfer_file(ftp_session_t *session, session->bufferpos = 0; session->buffersize = 0; - return 0; + return; } ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 503, "Bad sequence of commands\r\n"); + ftp_send_response(session, 503, "Bad sequence of commands\r\n"); } /*! ftp_xfer_dir mode */ @@ -2348,10 +2352,8 @@ typedef enum * @param[in] args ftp arguments * @param[in] mode transfer mode * @param[in] workaround whether to workaround LIST -a - * - * @returns failure */ -static int +static void ftp_xfer_dir(ftp_session_t *session, const char *args, xfer_dir_mode_t mode, @@ -2378,7 +2380,8 @@ ftp_xfer_dir(ftp_session_t *session, { /* error building path */ ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 550, "%s\r\n", strerror(errno)); + ftp_send_response(session, 550, "%s\r\n", strerror(errno)); + return; } /* check if this is a directory */ @@ -2403,9 +2406,9 @@ ftp_xfer_dir(ftp_session_t *session, if(buffer != NULL) { - rc = ftp_xfer_dir(session, buffer, mode, false); + ftp_xfer_dir(session, buffer, mode, false); free(buffer); - return rc; + return; } rc = ENOMEM; @@ -2413,41 +2416,41 @@ ftp_xfer_dir(ftp_session_t *session, } ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 550, "%s\r\n", strerror(rc)); + ftp_send_response(session, 550, "%s\r\n", strerror(rc)); + return; + } + + /* get the base name */ + base = strrchr(session->buffer, '/') + 1; + + /* encode \n in path */ + len = strlen(base); + buffer = encode_path(base, &len, false); + if(buffer != NULL) + { + /* copy to the session buffer to send */ + session->buffersize = + sprintf(session->buffer, + "-rwxrwxrwx 1 3DS 3DS %lld Jan 1 1970 ", + (signed long long)st.st_size); + if(session->buffersize + len + 2 > sizeof(session->buffer)) + { + /* buffer will overflow */ + free(buffer); + ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); + ftp_send_response(session, 425, "%s\r\n", strerror(EOVERFLOW)); + return; + } + + memcpy(session->buffer + session->buffersize, buffer, len); + free(buffer); + len = session->buffersize + len; + session->buffer[len++] = '\r'; + session->buffer[len++] = '\n'; + session->buffersize = len; } else - { - /* get the base name */ - base = strrchr(session->buffer, '/') + 1; - - /* encode \n in path */ - len = strlen(base); - buffer = encode_path(base, &len, false); - if(buffer != NULL) - { - /* copy to the session buffer to send */ - session->buffersize = - sprintf(session->buffer, - "-rwxrwxrwx 1 3DS 3DS %lld Jan 1 1970 ", - (signed long long)st.st_size); - if(session->buffersize + len + 2 > sizeof(session->buffer)) - { - /* buffer will overflow */ - free(buffer); - ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - ftp_send_response(session, 425, "%s\r\n", strerror(EOVERFLOW)); - return LOOP_EXIT; - } - memcpy(session->buffer + session->buffersize, buffer, len); - free(buffer); - len = session->buffersize + len; - session->buffer[len++] = '\r'; - session->buffer[len++] = '\n'; - session->buffersize = len; - } - else - session->buffersize = 0; - } + session->buffersize = 0; } else { @@ -2459,7 +2462,8 @@ ftp_xfer_dir(ftp_session_t *session, { /* no argument, but opening cwd failed */ ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 550, "%s\r\n", strerror(errno)); + ftp_send_response(session, 550, "%s\r\n", strerror(errno)); + return; } else { @@ -2479,11 +2483,11 @@ ftp_xfer_dir(ftp_session_t *session, { /* error connecting */ ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 425, "can't open data connection\r\n"); + ftp_send_response(session, 425, "can't open data connection\r\n"); } } - return 0; + return; } else if(mode == XFER_DIR_STAT) { @@ -2491,12 +2495,13 @@ ftp_xfer_dir(ftp_session_t *session, ftp_session_set_state(session, DATA_TRANSFER_STATE, CLOSE_PASV | CLOSE_DATA); session->data_fd = session->cmd_fd; session->flags |= SESSION_SEND; - return ftp_send_response(session, -213, "Status\r\n"); + ftp_send_response(session, -213, "Status\r\n"); + return; } /* we must have got LIST or NLST without a preceding PORT or PASV */ ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); - return ftp_send_response(session, 503, "Bad sequence of commands\r\n"); + ftp_send_response(session, 503, "Bad sequence of commands\r\n"); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -2505,21 +2510,22 @@ ftp_xfer_dir(ftp_session_t *session, * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/*! @fn static int ABOR(ftp_session_t *session, const char *args) +/*! @fn static void ABOR(ftp_session_t *session, const char *args) * * @brief abort a transfer * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(ABOR) { console_print(CYAN "%s %s\n" RESET, __func__, args ? args : ""); if(session->state == COMMAND_STATE) - return ftp_send_response(session, 225, "No transfer to abort\r\n"); + { + ftp_send_response(session, 225, "No transfer to abort\r\n"); + return; + } /* abort the transfer */ ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); @@ -2528,17 +2534,15 @@ FTP_DECLARE(ABOR) ftp_send_response(session, 225, "Aborted\r\n"); /* send response for transfer */ - return ftp_send_response(session, 425, "Transfer aborted\r\n"); + ftp_send_response(session, 425, "Transfer aborted\r\n"); } -/*! @fn static int ALLO(ftp_session_t *session, const char *args) +/*! @fn static void ALLO(ftp_session_t *session, const char *args) * * @brief allocate space * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(ALLO) { @@ -2546,10 +2550,10 @@ FTP_DECLARE(ALLO) ftp_session_set_state(session, COMMAND_STATE, 0); - return ftp_send_response(session, 202, "superfluous command\r\n"); + ftp_send_response(session, 202, "superfluous command\r\n"); } -/*! @fn static int APPE(ftp_session_t *session, const char *args) +/*! @fn static void APPE(ftp_session_t *session, const char *args) * * @brief append data to a file * @@ -2557,8 +2561,6 @@ FTP_DECLARE(ALLO) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(APPE) { @@ -2568,14 +2570,12 @@ FTP_DECLARE(APPE) return ftp_xfer_file(session, args, XFER_FILE_APPE); } -/*! @fn static int CDUP(ftp_session_t *session, const char *args) +/*! @fn static void CDUP(ftp_session_t *session, const char *args) * * @brief CWD to parent directory * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(CDUP) { @@ -2586,17 +2586,15 @@ FTP_DECLARE(CDUP) /* change to parent directory */ cd_up(session); - return ftp_send_response(session, 200, "OK\r\n"); + ftp_send_response(session, 200, "OK\r\n"); } -/*! @fn static int CWD(ftp_session_t *session, const char *args) +/*! @fn static void CWD(ftp_session_t *session, const char *args) * * @brief change working directory * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(CWD) { @@ -2611,39 +2609,45 @@ FTP_DECLARE(CWD) if(strcmp(args, "..") == 0) { cd_up(session); - return ftp_send_response(session, 200, "OK\r\n"); + ftp_send_response(session, 200, "OK\r\n"); + return; } /* build the new cwd path */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + return; + } /* get the path status */ rc = stat(session->buffer, &st); if(rc != 0) { console_print(RED "stat '%s': %d %s\n" RESET, session->buffer, errno, strerror(errno)); - return ftp_send_response(session, 550, "unavailable\r\n"); + ftp_send_response(session, 550, "unavailable\r\n"); + return; } /* make sure it is a directory */ if(!S_ISDIR(st.st_mode)) - return ftp_send_response(session, 553, "not a directory\r\n"); + { + ftp_send_response(session, 553, "not a directory\r\n"); + return; + } /* copy the path into the cwd */ strncpy(session->cwd, session->buffer, sizeof(session->cwd)); - return ftp_send_response(session, 200, "OK\r\n"); + ftp_send_response(session, 200, "OK\r\n"); } -/*! @fn static int DELE(ftp_session_t *session, const char *args) +/*! @fn static void DELE(ftp_session_t *session, const char *args) * * @brief delete a file * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(DELE) { @@ -2655,7 +2659,10 @@ FTP_DECLARE(DELE) /* build the file path */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + return; + } /* try to unlink the path */ rc = unlink(session->buffer); @@ -2663,21 +2670,20 @@ FTP_DECLARE(DELE) { /* error unlinking the file */ console_print(RED "unlink: %d %s\n" RESET, errno, strerror(errno)); - return ftp_send_response(session, 550, "failed to delete file\r\n"); + ftp_send_response(session, 550, "failed to delete file\r\n"); + return; } update_free_space(); - return ftp_send_response(session, 250, "OK\r\n"); + ftp_send_response(session, 250, "OK\r\n"); } -/*! @fn static int FEAT(ftp_session_t *session, const char *args) +/*! @fn static void FEAT(ftp_session_t *session, const char *args) * * @brief list server features * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(FEAT) { @@ -2686,23 +2692,21 @@ FTP_DECLARE(FEAT) ftp_session_set_state(session, COMMAND_STATE, 0); /* list our features */ - return ftp_send_response(session, -211, "\r\n" - " MDTM\r\n" - " PASV\r\n" - " SIZE\r\n" - " UTF8\r\n" - "\r\n" - "211 End\r\n"); + ftp_send_response(session, -211, "\r\n" + " MDTM\r\n" + " PASV\r\n" + " SIZE\r\n" + " UTF8\r\n" + "\r\n" + "211 End\r\n"); } -/*! @fn static int HELP(ftp_session_t *session, const char *args) +/*! @fn static void HELP(ftp_session_t *session, const char *args) * * @brief print server help * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(HELP) { @@ -2711,7 +2715,7 @@ FTP_DECLARE(HELP) ftp_session_set_state(session, COMMAND_STATE, 0); /* list our accepted commands */ - return ftp_send_response(session, -214, + ftp_send_response(session, -214, "The following commands are recognized\r\n" " ABOR ALLO APPE CDUP CWD DELE FEAT HELP LIST MDTM MKD MODE NLST NOOP\r\n" " OPTS PASS PASV PORT PWD QUIT REST RETR RMD RNFR RNTO STAT STOR STOU\r\n" @@ -2719,7 +2723,7 @@ FTP_DECLARE(HELP) "214 End\r\n"); } -/*! @fn static int LIST(ftp_session_t *session, const char *args) +/*! @fn static void LIST(ftp_session_t *session, const char *args) * * @brief retrieve a directory listing * @@ -2727,8 +2731,6 @@ FTP_DECLARE(HELP) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(LIST) { @@ -2738,14 +2740,12 @@ FTP_DECLARE(LIST) return ftp_xfer_dir(session, args, XFER_DIR_LIST, true); } -/*! @fn static int MDTM(ftp_session_t *session, const char *args) +/*! @fn static void MDTM(ftp_session_t *session, const char *args) * * @brief get last modification time * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(MDTM) { @@ -2764,39 +2764,53 @@ FTP_DECLARE(MDTM) /* build the path */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + return; + } #ifdef _3DS rc = sdmc_getmtime(session->buffer, &mtime); if(rc != 0) - return ftp_send_response(session, 550, "Error getting mtime\r\n"); + { + ftp_send_response(session, 550, "Error getting mtime\r\n"); + return; + } t_mtime = mtime; #else rc = stat(session->buffer, &st); if(rc != 0) - return ftp_send_response(session, 550, "Error getting mtime\r\n"); + { + ftp_send_response(session, 550, "Error getting mtime\r\n"); + return; + } t_mtime = st.st_mtime; #endif tm = gmtime(&t_mtime); if(tm == NULL) - return ftp_send_response(session, 550, "Error getting mtime\r\n"); + { + ftp_send_response(session, 550, "Error getting mtime\r\n"); + return; + } session->buffersize = strftime(session->buffer, sizeof(session->buffer), "%Y%m%d%H%M%S", tm); if(session->buffersize == 0) - return ftp_send_response(session, 550, "Error getting mtime\r\n"); + { + ftp_send_response(session, 550, "Error getting mtime\r\n"); + return; + } + session->buffer[session->buffersize] = 0; - return ftp_send_response(session, 213, "%s\r\n", session->buffer); + ftp_send_response(session, 213, "%s\r\n", session->buffer); } -/*! @fn static int MKD(ftp_session_t *session, const char *args) +/*! @fn static void MKD(ftp_session_t *session, const char *args) * * @brief create a directory * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(MKD) { @@ -2808,7 +2822,10 @@ FTP_DECLARE(MKD) /* build the path */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + return; + } /* try to create the directory */ rc = mkdir(session->buffer, 0755); @@ -2816,21 +2833,20 @@ FTP_DECLARE(MKD) { /* mkdir failure */ console_print(RED "mkdir: %d %s\n" RESET, errno, strerror(errno)); - return ftp_send_response(session, 550, "failed to create directory\r\n"); + ftp_send_response(session, 550, "failed to create directory\r\n"); + return; } update_free_space(); - return ftp_send_response(session, 250, "OK\r\n"); + ftp_send_response(session, 250, "OK\r\n"); } -/*! @fn static int MODE(ftp_session_t *session, const char *args) +/*! @fn static void MODE(ftp_session_t *session, const char *args) * * @brief set transfer mode * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(MODE) { @@ -2840,12 +2856,15 @@ FTP_DECLARE(MODE) /* we only accept S (stream) mode */ if(strcasecmp(args, "S") == 0) - return ftp_send_response(session, 200, "OK\r\n"); + { + ftp_send_response(session, 200, "OK\r\n"); + return; + } - return ftp_send_response(session, 504, "unavailable\r\n"); + ftp_send_response(session, 504, "unavailable\r\n"); } -/*! @fn static int NLST(ftp_session_t *session, const char *args) +/*! @fn static void NLST(ftp_session_t *session, const char *args) * * @brief retrieve a name list * @@ -2853,8 +2872,6 @@ FTP_DECLARE(MODE) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(NLST) { @@ -2864,31 +2881,27 @@ FTP_DECLARE(NLST) return ftp_xfer_dir(session, args, XFER_DIR_NLST, false); } -/*! @fn static int NOOP(ftp_session_t *session, const char *args) +/*! @fn static void NOOP(ftp_session_t *session, const char *args) * * @brief no-op * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(NOOP) { console_print(CYAN "%s %s\n" RESET, __func__, args ? args : ""); /* this is a no-op */ - return ftp_send_response(session, 200, "OK\r\n"); + ftp_send_response(session, 200, "OK\r\n"); } -/*! @fn static int OPTS(ftp_session_t *session, const char *args) +/*! @fn static void OPTS(ftp_session_t *session, const char *args) * * @brief set options * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(OPTS) { @@ -2900,19 +2913,20 @@ FTP_DECLARE(OPTS) if(strcasecmp(args, "UTF8") == 0 || strcasecmp(args, "UTF8 ON") == 0 || strcasecmp(args, "UTF8 NLST") == 0) - return ftp_send_response(session, 200, "OK\r\n"); + { + ftp_send_response(session, 200, "OK\r\n"); + return; + } - return ftp_send_response(session, 504, "invalid argument\r\n"); + ftp_send_response(session, 504, "invalid argument\r\n"); } -/*! @fn static int PASS(ftp_session_t *session, const char *args) +/*! @fn static void PASS(ftp_session_t *session, const char *args) * * @brief provide password * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(PASS) { @@ -2921,17 +2935,15 @@ FTP_DECLARE(PASS) /* we accept any password */ ftp_session_set_state(session, COMMAND_STATE, 0); - return ftp_send_response(session, 230, "OK\r\n"); + ftp_send_response(session, 230, "OK\r\n"); } -/*! @fn static int PASV(ftp_session_t *session, const char *args) +/*! @fn static void PASV(ftp_session_t *session, const char *args) * * @brief request an address to connect to * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(PASV) { @@ -2953,7 +2965,8 @@ FTP_DECLARE(PASV) if(session->pasv_fd < 0) { console_print(RED "socket: %d %s\n" RESET, errno, strerror(errno)); - return ftp_send_response(session, 451, "\r\n"); + ftp_send_response(session, 451, "\r\n"); + return; } /* set the socket options */ @@ -2962,7 +2975,8 @@ FTP_DECLARE(PASV) { /* failed to set socket options */ ftp_session_close_pasv(session); - return ftp_send_response(session, 451, "\r\n"); + ftp_send_response(session, 451, "\r\n"); + return; } /* grab a new port */ @@ -2982,7 +2996,8 @@ FTP_DECLARE(PASV) /* failed to bind */ console_print(RED "bind: %d %s\n" RESET, errno, strerror(errno)); ftp_session_close_pasv(session); - return ftp_send_response(session, 451, "\r\n"); + ftp_send_response(session, 451, "\r\n"); + return; } /* listen on the socket */ @@ -2992,7 +3007,8 @@ FTP_DECLARE(PASV) /* failed to listen */ console_print(RED "listen: %d %s\n" RESET, errno, strerror(errno)); ftp_session_close_pasv(session); - return ftp_send_response(session, 451, "\r\n"); + ftp_send_response(session, 451, "\r\n"); + return; } #ifndef _3DS @@ -3006,7 +3022,8 @@ FTP_DECLARE(PASV) /* failed to get socket address */ console_print(RED "getsockname: %d %s\n" RESET, errno, strerror(errno)); ftp_session_close_pasv(session); - return ftp_send_response(session, 451, "\r\n"); + ftp_send_response(session, 451, "\r\n"); + return; } } #endif @@ -3028,17 +3045,15 @@ FTP_DECLARE(PASV) *p = ','; } - return ftp_send_response(session, 227, "%s\r\n", buffer); + ftp_send_response(session, 227, "%s\r\n", buffer); } -/*! @fn static int PORT(ftp_session_t *session, const char *args) +/*! @fn static void PORT(ftp_session_t *session, const char *args) * * @brief provide an address for the server to connect to * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(PORT) { @@ -3057,7 +3072,10 @@ FTP_DECLARE(PORT) /* dup the args since they are const and we need to change it */ addrstr = strdup(args); if(addrstr == NULL) - return ftp_send_response(session, 425, "%s\r\n", strerror(ENOMEM)); + { + ftp_send_response(session, 425, "%s\r\n", strerror(ENOMEM)); + return; + } /* replace a,b,c,d,e,f with a.b.c.d\0e.f */ for(p = addrstr; *p; ++p) @@ -3079,7 +3097,8 @@ FTP_DECLARE(PORT) if(commas != 5) { free(addrstr); - return ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + return; } /* parse the address */ @@ -3087,7 +3106,8 @@ FTP_DECLARE(PORT) if(rc == 0) { free(addrstr); - return ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + return; } /* parse the port */ @@ -3100,7 +3120,8 @@ FTP_DECLARE(PORT) if(p == portstr || *p != '.' || val > 0xFF) { free(addrstr); - return ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + return; } port <<= 8; port += val; @@ -3117,7 +3138,8 @@ FTP_DECLARE(PORT) if(val > 0xFF || port > 0xFF) { free(addrstr); - return ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + ftp_send_response(session, 501, "%s\r\n", strerror(EINVAL)); + return; } port <<= 8; port += val; @@ -3132,17 +3154,15 @@ FTP_DECLARE(PORT) /* we are ready to connect to the client */ session->flags |= SESSION_PORT; - return ftp_send_response(session, 200, "OK\r\n"); + ftp_send_response(session, 200, "OK\r\n"); } -/*! @fn static int PWD(ftp_session_t *session, const char *args) +/*! @fn static void PWD(ftp_session_t *session, const char *args) * * @brief print working directory * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(PWD) { @@ -3166,7 +3186,8 @@ FTP_DECLARE(PWD) free(path); ftp_session_set_state(session, COMMAND_STATE, CLOSE_PASV | CLOSE_DATA); ftp_send_response(session, 550, "unavailable\r\n"); - return ftp_send_response(session, 425, "%s\r\n", strerror(EOVERFLOW)); + ftp_send_response(session, 425, "%s\r\n", strerror(EOVERFLOW)); + return; } memcpy(buffer+i, path, len); free(path); @@ -3175,19 +3196,19 @@ FTP_DECLARE(PWD) buffer[len++] = '\r'; buffer[len++] = '\n'; - return ftp_send_response_buffer(session, buffer, len); + ftp_send_response_buffer(session, buffer, len); + return; } - return ftp_send_response(session, 425, "%s\r\n", strerror(ENOMEM)); + + ftp_send_response(session, 425, "%s\r\n", strerror(ENOMEM)); } -/*! @fn static int QUIT(ftp_session_t *session, const char *args) +/*! @fn static void QUIT(ftp_session_t *session, const char *args) * * @brief terminate ftp session * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(QUIT) { @@ -3196,11 +3217,9 @@ FTP_DECLARE(QUIT) /* disconnect from the client */ ftp_send_response(session, 221, "disconnecting\r\n"); ftp_session_close_cmd(session); - - return 0; } -/*! @fn static int REST(ftp_session_t *session, const char *args) +/*! @fn static void REST(ftp_session_t *session, const char *args) * * @brief restart a transfer * @@ -3208,8 +3227,6 @@ FTP_DECLARE(QUIT) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(REST) { @@ -3222,31 +3239,43 @@ FTP_DECLARE(REST) /* make sure an argument is provided */ if(args == NULL) - return ftp_send_response(session, 504, "invalid argument\r\n"); + { + ftp_send_response(session, 504, "invalid argument\r\n"); + return; + } /* parse the offset */ for(p = args; *p; ++p) { if(!isdigit((int)*p)) - return ftp_send_response(session, 504, "invalid argument\r\n"); + { + ftp_send_response(session, 504, "invalid argument\r\n"); + return; + } if(UINT64_MAX / 10 < pos) - return ftp_send_response(session, 504, "invalid argument\r\n"); + { + ftp_send_response(session, 504, "invalid argument\r\n"); + return; + } pos *= 10; if(UINT64_MAX - (*p - '0') < pos) - return ftp_send_response(session, 504, "invalid argument\r\n"); + { + ftp_send_response(session, 504, "invalid argument\r\n"); + return; + } pos += (*p - '0'); } /* set the restart offset */ session->filepos = pos; - return ftp_send_response(session, 200, "OK\r\n"); + ftp_send_response(session, 200, "OK\r\n"); } -/*! @fn static int RETR(ftp_session_t *session, const char *args) +/*! @fn static void RETR(ftp_session_t *session, const char *args) * * @brief retrieve a file * @@ -3254,8 +3283,6 @@ FTP_DECLARE(REST) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(RETR) { @@ -3265,14 +3292,12 @@ FTP_DECLARE(RETR) return ftp_xfer_file(session, args, XFER_FILE_RETR); } -/*! @fn static int RMD(ftp_session_t *session, const char *args) +/*! @fn static void RMD(ftp_session_t *session, const char *args) * * @brief remove a directory * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(RMD) { @@ -3284,7 +3309,10 @@ FTP_DECLARE(RMD) /* build the path to remove */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + return; + } /* remove the directory */ rc = rmdir(session->buffer); @@ -3292,14 +3320,15 @@ FTP_DECLARE(RMD) { /* rmdir error */ console_print(RED "rmdir: %d %s\n" RESET, errno, strerror(errno)); - return ftp_send_response(session, 550, "failed to delete directory\r\n"); + ftp_send_response(session, 550, "failed to delete directory\r\n"); + return; } update_free_space(); - return ftp_send_response(session, 250, "OK\r\n"); + ftp_send_response(session, 250, "OK\r\n"); } -/*! @fn static int RNFR(ftp_session_t *session, const char *args) +/*! @fn static void RNFR(ftp_session_t *session, const char *args) * * @brief rename from * @@ -3307,8 +3336,6 @@ FTP_DECLARE(RMD) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(RNFR) { @@ -3320,7 +3347,10 @@ FTP_DECLARE(RNFR) /* build the path to rename from */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + return; + } /* make sure the path exists */ rc = lstat(session->buffer, &st); @@ -3328,15 +3358,16 @@ FTP_DECLARE(RNFR) { /* error getting path status */ console_print(RED "lstat: %d %s\n" RESET, errno, strerror(errno)); - return ftp_send_response(session, 450, "no such file or directory\r\n"); + ftp_send_response(session, 450, "no such file or directory\r\n"); + return; } /* we are ready for RNTO */ session->flags |= SESSION_RENAME; - return ftp_send_response(session, 350, "OK\r\n"); + ftp_send_response(session, 350, "OK\r\n"); } -/*! @fn static int RNTO(ftp_session_t *session, const char *args) +/*! @fn static void RNTO(ftp_session_t *session, const char *args) * * @brief rename to * @@ -3344,8 +3375,6 @@ FTP_DECLARE(RNFR) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(RNTO) { @@ -3358,7 +3387,10 @@ FTP_DECLARE(RNTO) /* make sure the previous command was RNFR */ if(!(session->flags & SESSION_RENAME)) - return ftp_send_response(session, 503, "Bad sequence of commands\r\n"); + { + ftp_send_response(session, 503, "Bad sequence of commands\r\n"); + return; + } /* clear the rename state */ session->flags &= ~SESSION_RENAME; @@ -3368,7 +3400,10 @@ FTP_DECLARE(RNTO) /* build the path to rename to */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 554, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 554, "%s\r\n", strerror(errno)); + return; + } /* rename the file */ rc = rename(rnfr, session->buffer); @@ -3376,21 +3411,20 @@ FTP_DECLARE(RNTO) { /* rename failure */ console_print(RED "rename: %d %s\n" RESET, errno, strerror(errno)); - return ftp_send_response(session, 550, "failed to rename file/directory\r\n"); + ftp_send_response(session, 550, "failed to rename file/directory\r\n"); + return; } update_free_space(); - return ftp_send_response(session, 250, "OK\r\n"); + ftp_send_response(session, 250, "OK\r\n"); } -/*! @fn static int SIZE(ftp_session_t *session, const char *args) +/*! @fn static void SIZE(ftp_session_t *session, const char *args) * * @brief get file size * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(SIZE) { @@ -3403,17 +3437,23 @@ FTP_DECLARE(SIZE) /* build the path to stat */ if(build_path(session, session->cwd, args) != 0) - return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + { + ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + return; + } rc = stat(session->buffer, &st); if(rc != 0 || !S_ISREG(st.st_mode)) - return ftp_send_response(session, 550, "Could not get file size.\r\n"); + { + ftp_send_response(session, 550, "Could not get file size.\r\n"); + return; + } - return ftp_send_response(session, 213, "%" PRIu64 "\r\n", - (uint64_t)st.st_size); + ftp_send_response(session, 213, "%" PRIu64 "\r\n", + (uint64_t)st.st_size); } -/*! @fn static int STAT(ftp_session_t *session, const char *args) +/*! @fn static void STAT(ftp_session_t *session, const char *args) * * @brief get status * @@ -3425,8 +3465,6 @@ FTP_DECLARE(SIZE) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(STAT) { @@ -3440,33 +3478,36 @@ FTP_DECLARE(STAT) if(session->state == DATA_CONNECT_STATE) { /* we are waiting to connect to the client */ - return ftp_send_response(session, -211, "FTP server status\r\n" - " Waiting for data connection\r\n" - "211 End\r\n"); + ftp_send_response(session, -211, "FTP server status\r\n" + " Waiting for data connection\r\n" + "211 End\r\n"); + return; } else if(session->state == DATA_TRANSFER_STATE) { /* we are in the middle of a transfer */ - return ftp_send_response(session, -211, "FTP server status\r\n" - " Transferred %" PRIu64 " bytes\r\n" - "211 End\r\n", - session->filepos); + ftp_send_response(session, -211, "FTP server status\r\n" + " Transferred %" PRIu64 " bytes\r\n" + "211 End\r\n", + session->filepos); + return; } if(strlen(args) == 0) { /* no argument provided, send the server status */ - return ftp_send_response(session, -211, "FTP server status\r\n" - " Uptime: %02d:%02d:%02d\r\n" - "211 End\r\n", - hours, minutes, seconds); + ftp_send_response(session, -211, "FTP server status\r\n" + " Uptime: %02d:%02d:%02d\r\n" + "211 End\r\n", + hours, minutes, seconds); + return; } /* argument provided, open the path in STAT mode */ - return ftp_xfer_dir(session, args, XFER_DIR_STAT, false); + ftp_xfer_dir(session, args, XFER_DIR_STAT, false); } -/*! @fn static int STOR(ftp_session_t *session, const char *args) +/*! @fn static void STOR(ftp_session_t *session, const char *args) * * @brief store a file * @@ -3474,8 +3515,6 @@ FTP_DECLARE(STAT) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(STOR) { @@ -3485,14 +3524,12 @@ FTP_DECLARE(STOR) return ftp_xfer_file(session, args, XFER_FILE_STOR); } -/*! @fn static int STOU(ftp_session_t *session, const char *args) +/*! @fn static void STOU(ftp_session_t *session, const char *args) * * @brief store a unique file * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(STOU) { @@ -3501,17 +3538,15 @@ FTP_DECLARE(STOU) /* we do not support this yet */ ftp_session_set_state(session, COMMAND_STATE, 0); - return ftp_send_response(session, 502, "unavailable\r\n"); + ftp_send_response(session, 502, "unavailable\r\n"); } -/*! @fn static int STRU(ftp_session_t *session, const char *args) +/*! @fn static void STRU(ftp_session_t *session, const char *args) * * @brief set file structure * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(STRU) { @@ -3521,19 +3556,20 @@ FTP_DECLARE(STRU) /* we only support F (no structure) mode */ if(strcasecmp(args, "F") == 0) - return ftp_send_response(session, 200, "OK\r\n"); + { + ftp_send_response(session, 200, "OK\r\n"); + return; + } - return ftp_send_response(session, 504, "unavailable\r\n"); + ftp_send_response(session, 504, "unavailable\r\n"); } -/*! @fn static int SYST(ftp_session_t *session, const char *args) +/*! @fn static void SYST(ftp_session_t *session, const char *args) * * @brief identify system * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(SYST) { @@ -3542,10 +3578,10 @@ FTP_DECLARE(SYST) ftp_session_set_state(session, COMMAND_STATE, 0); /* we are UNIX compliant with 8-bit characters */ - return ftp_send_response(session, 215, "UNIX Type: L8\r\n"); + ftp_send_response(session, 215, "UNIX Type: L8\r\n"); } -/*! @fn static int TYPE(ftp_session_t *session, const char *args) +/*! @fn static void TYPE(ftp_session_t *session, const char *args) * * @brief set transfer mode * @@ -3553,8 +3589,6 @@ FTP_DECLARE(SYST) * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(TYPE) { @@ -3563,17 +3597,15 @@ FTP_DECLARE(TYPE) ftp_session_set_state(session, COMMAND_STATE, 0); /* we always transfer in binary mode */ - return ftp_send_response(session, 200, "OK\r\n"); + ftp_send_response(session, 200, "OK\r\n"); } -/*! @fn static int USER(ftp_session_t *session, const char *args) +/*! @fn static void USER(ftp_session_t *session, const char *args) * * @brief provide user name * * @param[in] session ftp session * @param[in] args arguments - * - * @returns error */ FTP_DECLARE(USER) { @@ -3582,5 +3614,5 @@ FTP_DECLARE(USER) ftp_session_set_state(session, COMMAND_STATE, 0); /* we accept any user name */ - return ftp_send_response(session, 230, "OK\r\n"); + ftp_send_response(session, 230, "OK\r\n"); }