mirror of
https://github.com/wiiu-env/ftpiiu_plugin.git
synced 2024-11-16 17:59:19 +01:00
Add timestamp-related features
This commit is contained in:
parent
55816af44b
commit
74ec300fc8
95
source/ftp.c
95
source/ftp.c
@ -57,6 +57,7 @@ FTP_DECLARE(DELE);
|
|||||||
FTP_DECLARE(FEAT);
|
FTP_DECLARE(FEAT);
|
||||||
FTP_DECLARE(HELP);
|
FTP_DECLARE(HELP);
|
||||||
FTP_DECLARE(LIST);
|
FTP_DECLARE(LIST);
|
||||||
|
FTP_DECLARE(MDTM);
|
||||||
FTP_DECLARE(MKD);
|
FTP_DECLARE(MKD);
|
||||||
FTP_DECLARE(MODE);
|
FTP_DECLARE(MODE);
|
||||||
FTP_DECLARE(NLST);
|
FTP_DECLARE(NLST);
|
||||||
@ -118,6 +119,7 @@ struct ftp_session_t
|
|||||||
int cmd_fd; /*!< socket for command connection */
|
int cmd_fd; /*!< socket for command connection */
|
||||||
int pasv_fd; /*!< listen socket for PASV */
|
int pasv_fd; /*!< listen socket for PASV */
|
||||||
int data_fd; /*!< socket for data transfer */
|
int data_fd; /*!< socket for data transfer */
|
||||||
|
time_t timestamp; /*!< time from last command */
|
||||||
session_flags_t flags; /*!< session flags */
|
session_flags_t flags; /*!< session flags */
|
||||||
session_state_t state; /*!< session state */
|
session_state_t state; /*!< session state */
|
||||||
ftp_session_t *next; /*!< link to next session */
|
ftp_session_t *next; /*!< link to next session */
|
||||||
@ -160,6 +162,7 @@ static ftp_command_t ftp_commands[] =
|
|||||||
FTP_COMMAND(FEAT),
|
FTP_COMMAND(FEAT),
|
||||||
FTP_COMMAND(HELP),
|
FTP_COMMAND(HELP),
|
||||||
FTP_COMMAND(LIST),
|
FTP_COMMAND(LIST),
|
||||||
|
FTP_COMMAND(MDTM),
|
||||||
FTP_COMMAND(MKD),
|
FTP_COMMAND(MKD),
|
||||||
FTP_COMMAND(MODE),
|
FTP_COMMAND(MODE),
|
||||||
FTP_COMMAND(NLST),
|
FTP_COMMAND(NLST),
|
||||||
@ -1225,6 +1228,9 @@ ftp_session_read_command(ftp_session_t *session,
|
|||||||
num_ftp_commands, sizeof(ftp_command_t),
|
num_ftp_commands, sizeof(ftp_command_t),
|
||||||
ftp_command_cmp);
|
ftp_command_cmp);
|
||||||
|
|
||||||
|
/* update command timestamp */
|
||||||
|
session->timestamp = time(NULL);
|
||||||
|
|
||||||
/* execute the command */
|
/* execute the command */
|
||||||
if(command == NULL)
|
if(command == NULL)
|
||||||
{
|
{
|
||||||
@ -1773,6 +1779,9 @@ list_transfer(ftp_session_t *session)
|
|||||||
{
|
{
|
||||||
ssize_t rc;
|
ssize_t rc;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
uint64_t mtime;
|
||||||
|
time_t t_mtime;
|
||||||
|
struct tm *tm;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
@ -1842,6 +1851,14 @@ list_transfer(ftp_session_t *session)
|
|||||||
st.st_mode = S_IFREG;
|
st.st_mode = S_IFREG;
|
||||||
|
|
||||||
st.st_size = dir->entry_data.fileSize;
|
st.st_size = dir->entry_data.fileSize;
|
||||||
|
|
||||||
|
if((rc = build_path(session, session->lwd, dent->d_name)) != 0)
|
||||||
|
console_print(RED "build_path: %d %s\n" RESET, errno, strerror(errno));
|
||||||
|
else if((rc = sdmc_getmtime(session->buffer, &mtime)) != 0)
|
||||||
|
{
|
||||||
|
console_print(RED "sdmc_getmtime '%s': 0x%x\n" RESET, session->buffer, rc);
|
||||||
|
mtime = 0;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* lstat the entry */
|
/* lstat the entry */
|
||||||
if((rc = build_path(session, session->lwd, dent->d_name)) != 0)
|
if((rc = build_path(session, session->lwd, dent->d_name)) != 0)
|
||||||
@ -1856,8 +1873,9 @@ list_transfer(ftp_session_t *session)
|
|||||||
ftp_send_response(session, 550, "unavailable\r\n");
|
ftp_send_response(session, 550, "unavailable\r\n");
|
||||||
return LOOP_EXIT;
|
return LOOP_EXIT;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
mtime = st.st_mtime;
|
||||||
|
#endif
|
||||||
/* encode \n in path */
|
/* encode \n in path */
|
||||||
len = strlen(dent->d_name);
|
len = strlen(dent->d_name);
|
||||||
buffer = encode_path(dent->d_name, &len, false);
|
buffer = encode_path(dent->d_name, &len, false);
|
||||||
@ -1866,10 +1884,29 @@ list_transfer(ftp_session_t *session)
|
|||||||
/* copy to the session buffer to send */
|
/* copy to the session buffer to send */
|
||||||
session->buffersize =
|
session->buffersize =
|
||||||
sprintf(session->buffer,
|
sprintf(session->buffer,
|
||||||
"%crwxrwxrwx 1 3DS 3DS %llu Jan 1 1970 ",
|
"%crwxrwxrwx 1 3DS 3DS %llu ",
|
||||||
S_ISDIR(st.st_mode) ? 'd' :
|
S_ISDIR(st.st_mode) ? 'd' :
|
||||||
S_ISLNK(st.st_mode) ? 'l' : '-',
|
S_ISLNK(st.st_mode) ? 'l' : '-',
|
||||||
(unsigned long long)st.st_size);
|
(unsigned long long)st.st_size);
|
||||||
|
|
||||||
|
t_mtime = mtime;
|
||||||
|
tm = gmtime(&t_mtime);
|
||||||
|
if(tm != NULL)
|
||||||
|
{
|
||||||
|
const char *fmt = "%b %e %Y ";
|
||||||
|
if(session->timestamp > mtime && session->timestamp - mtime < (60*60*24*365/2))
|
||||||
|
fmt = "%b %e %H:%M ";
|
||||||
|
session->buffersize +=
|
||||||
|
strftime(session->buffer + session->buffersize,
|
||||||
|
sizeof(session->buffer) - session->buffersize,
|
||||||
|
fmt, tm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
session->buffersize +=
|
||||||
|
sprintf(session->buffer + session->buffersize, "Jan 1 1970 ");
|
||||||
|
}
|
||||||
|
|
||||||
if(session->buffersize + len + 2 > sizeof(session->buffer))
|
if(session->buffersize + len + 2 > sizeof(session->buffer))
|
||||||
{
|
{
|
||||||
/* buffer will overflow */
|
/* buffer will overflow */
|
||||||
@ -2471,8 +2508,12 @@ FTP_DECLARE(FEAT)
|
|||||||
|
|
||||||
ftp_session_set_state(session, COMMAND_STATE, 0);
|
ftp_session_set_state(session, COMMAND_STATE, 0);
|
||||||
|
|
||||||
/* our only feature is UTF-8 */
|
/* list our features */
|
||||||
return ftp_send_response(session, -211, "\r\n UTF8\r\n211 End\r\n");
|
return ftp_send_response(session, -211, "\r\n"
|
||||||
|
" MDTM\r\n"
|
||||||
|
" UTF8\r\n"
|
||||||
|
"\r\n"
|
||||||
|
"211 End\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! @fn static int HELP(ftp_session_t *session, const char *args)
|
/*! @fn static int HELP(ftp_session_t *session, const char *args)
|
||||||
@ -2493,9 +2534,9 @@ FTP_DECLARE(HELP)
|
|||||||
/* list our accepted commands */
|
/* list our accepted commands */
|
||||||
return ftp_send_response(session, -214,
|
return ftp_send_response(session, -214,
|
||||||
"The following commands are recognized\r\n"
|
"The following commands are recognized\r\n"
|
||||||
" ABOR ALLO APPE CDUP CWD DELE FEAT HELP LIST MKD MODE NLST NOOP OPTS\r\n"
|
" ABOR ALLO APPE CDUP CWD DELE FEAT HELP LIST MDTM MKD MODE NLST NOOP\r\n"
|
||||||
" PASS PASV PORT PWD QUIT REST RETR RMD RNFR RNTO STAT STOR STOU STRU\r\n"
|
" OPTS PASS PASV PORT PWD QUIT REST RETR RMD RNFR RNTO STAT STOR STOU\r\n"
|
||||||
" SYST TYPE USER XCUP XCWD XMKD XPWD XRMD\r\n"
|
" STRU SYST TYPE USER XCUP XCWD XMKD XPWD XRMD\r\n"
|
||||||
"214 End\r\n");
|
"214 End\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2518,6 +2559,46 @@ FTP_DECLARE(LIST)
|
|||||||
return ftp_xfer_dir(session, args, XFER_DIR_LIST);
|
return ftp_xfer_dir(session, args, XFER_DIR_LIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! @fn static int 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)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
uint64_t mtime;
|
||||||
|
time_t t_mtime;
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
console_print(CYAN "%s %s\n" RESET, __func__, args ? args : "");
|
||||||
|
|
||||||
|
ftp_session_set_state(session, COMMAND_STATE, 0);
|
||||||
|
|
||||||
|
/* build the path */
|
||||||
|
if(build_path(session, session->cwd, args) != 0)
|
||||||
|
return ftp_send_response(session, 553, "%s\r\n", strerror(errno));
|
||||||
|
|
||||||
|
rc = sdmc_getmtime(session->buffer, &mtime);
|
||||||
|
if(rc != 0)
|
||||||
|
return ftp_send_response(session, 550, "Error getting mtime\r\n");
|
||||||
|
|
||||||
|
t_mtime = mtime;
|
||||||
|
tm = gmtime(&t_mtime);
|
||||||
|
if(tm == NULL)
|
||||||
|
return ftp_send_response(session, 550, "Error getting mtime\r\n");
|
||||||
|
|
||||||
|
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");
|
||||||
|
session->buffer[session->buffersize] = 0;
|
||||||
|
|
||||||
|
return ftp_send_response(session, 213, "%s\r\n", session->buffer);
|
||||||
|
}
|
||||||
/*! @fn static int MKD(ftp_session_t *session, const char *args)
|
/*! @fn static int MKD(ftp_session_t *session, const char *args)
|
||||||
*
|
*
|
||||||
* @brief create a directory
|
* @brief create a directory
|
||||||
|
Loading…
Reference in New Issue
Block a user