From 5f1227eaeabacad273fdd0c41d5d485f05bfa19f Mon Sep 17 00:00:00 2001 From: Michael Theall Date: Tue, 21 Jun 2016 22:17:33 -0500 Subject: [PATCH] Add SIZE command --- source/ftp.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/source/ftp.c b/source/ftp.c index 0d040a5..42552f2 100644 --- a/source/ftp.c +++ b/source/ftp.c @@ -75,6 +75,7 @@ FTP_DECLARE(RETR); FTP_DECLARE(RMD); FTP_DECLARE(RNFR); FTP_DECLARE(RNTO); +FTP_DECLARE(SIZE); FTP_DECLARE(STAT); FTP_DECLARE(STOR); FTP_DECLARE(STOU); @@ -180,6 +181,7 @@ static ftp_command_t ftp_commands[] = FTP_COMMAND(RMD), FTP_COMMAND(RNFR), FTP_COMMAND(RNTO), + FTP_COMMAND(SIZE), FTP_COMMAND(STAT), FTP_COMMAND(STOR), FTP_COMMAND(STOU), @@ -2651,6 +2653,8 @@ FTP_DECLARE(FEAT) /* 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"); @@ -3343,6 +3347,36 @@ FTP_DECLARE(RNTO) return ftp_send_response(session, 250, "OK\r\n"); } +/*! @fn static int 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) +{ + int rc; + struct stat st; + + console_print(CYAN "%s %s\n" RESET, __func__, args ? args : ""); + + ftp_session_set_state(session, COMMAND_STATE, 0); + + /* build the path to stat */ + if(build_path(session, session->cwd, args) != 0) + return ftp_send_response(session, 553, "%s\r\n", strerror(errno)); + + 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"); + + return ftp_send_response(session, 213, "%" PRIu64 "\r\n", + (uint64_t)st.st_size); +} + /*! @fn static int STAT(ftp_session_t *session, const char *args) * * @brief get status