From 58c8d7a5742eb2a6d5aa88ed7363af7a9825b95d Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Thu, 24 May 2018 21:54:59 +0200 Subject: [PATCH] Issue #13: Initial framework for FTP REST Signed-off-by: Joachim Nilsson --- ftpcmd.c | 17 +++++++++++++++++ uftpd.h | 1 + 2 files changed, 18 insertions(+) diff --git a/ftpcmd.c b/ftpcmd.c index b3b8a8a..1c02a69 100644 --- a/ftpcmd.c +++ b/ftpcmd.c @@ -875,6 +875,21 @@ static void handle_RMD(ctrl_t *ctrl, char *arg) } #endif +static void handle_REST(ctrl_t *ctrl, char *arg) +{ + const char *errstr; + char buf[80]; + + if (!string_valid(arg)) { + send_msg(ctrl->sd, "550 Invalid argument.\r\n"); + return; + } + + ctrl->offset = strtonum(arg, 0, INT64_MAX, &errstr); + snprintf(buf, sizeof(buf), "350 Restarting at %ld. Send STOR or RETR to continue transfer.\r\n", ctrl->offset); + send_msg(ctrl->sd, buf); +} + static size_t num_nl(char *file) { FILE *fp; @@ -987,6 +1002,7 @@ static void handle_FEAT(ctrl_t *ctrl, char *arg) " PASV\r\n" " SIZE\r\n" " UTF8\r\n" + " REST STREAM\r\n" " MLST modify*;perm*;size*;type*;\r\n" "211 End\r\n"); send_msg(ctrl->sd, ctrl->buf); @@ -1010,6 +1026,7 @@ static ftp_cmd_t supported[] = { COMMAND(PORT), COMMAND(EPRT), COMMAND(RETR), + COMMAND(REST), COMMAND(MDTM), COMMAND(PASV), COMMAND(EPSV), diff --git a/uftpd.h b/uftpd.h index d5c12bb..a954023 100644 --- a/uftpd.h +++ b/uftpd.h @@ -122,6 +122,7 @@ typedef struct { /* TFTP */ char *file; /* Current file name to fetch */ + off_t offset; /* Offset in current file, for REST */ FILE *fp; /* Current file in operation */ tftp_t *th; /* Same as buf, only as tftp_t */ size_t segsize; /* SEGSIZE, or per session negotiated */