#include #include "lwip/tcp.h" #include "ff.h" #include "diskio.h" #define msg110 "110 MARK %s = %s." #define msg120 "120 Service ready in nnn minutes." #define msg125 "125 Data connection already open; transfer starting." #define msg150 "150 File status okay; about to open data connection." #define msg150recv "150 Opening BINARY mode data connection for %s (%i bytes)." #define msg150stor "150 Opening BINARY mode data connection for %s." #define msg200 "200 Command okay." #define msg202 "202 Command not implemented, superfluous at this site." #define msg211 "211 System status, or system help reply." #define msg212 "212 Directory status." #define msg213 "213 ." #define msg214 "214 %s." #define msg214SYST "214 %s system type." #define msg220 "220 Enlogic PDU FTP Server ready." #define msg221 "221 Goodbye." #define msg225 "225 Data connection open; no transfer in progress." #define msg226 "226 Closing data connection." #define msg227 "227 Entering Passive Mode (%i,%i,%i,%i,%i,%i)." #define msg230 "230 User logged in, proceed." #define msg250 "250 Requested file action okay, completed." #define msg257PWD "257 \"%s\" is current directory." #define msg257 "257 \"%s\" created." #define msg331 "331 User name okay, need password." #define msg332 "332 Need account for login." #define msg350 "350 Requested file action pending further information." #define msg421 "421 Service not available, closing control connection." #define msg425 "425 Can't open data connection." #define msg426 "426 Connection closed; transfer aborted." #define msg450 "450 Requested file action not taken." #define msg451 "451 Requested action aborted: local error in processing." #define msg452 "452 Requested action not taken." #define msg500 "500 Syntax error, command unrecognized." #define msg501 "501 Syntax error in parameters or arguments." #define msg502 "502 Command not implemented." #define msg503 "503 Bad sequence of commands." #define msg504 "504 Command not implemented for that parameter." #define msg530 "530 Not logged in." #define msg532 "532 Need account for storing files." #define msg550 "550 Requested action not taken." #define msg551 "551 Requested action aborted: page type unknown." #define msg552 "552 Requested file action aborted." #define msg553 "553 Requested action not taken." #define FTP_THREAD_PRIO 7 #define SFIFO_MAX_BUFFER_SIZE 256 #define DATACONNECT_BUFFER_SIZE 2048 enum ftpd_state_e { FTPD_USER, FTPD_PASS, FTPD_IDLE, FTPD_NLST, FTPD_LIST, FTPD_RETR, FTPD_RNFR, FTPD_STOR, FTPD_QUIT }; typedef struct sfifo_t { char *buffer; int size; int readpos; int writepos; } sfifo_t; struct ftpd_datastate { int connected; FIL *fil; DIR *dir; FILINFO *fno; sfifo_t fifo; struct tcp_pcb *msgpcb; struct ftpd_msgstate *msgfs; }; struct ftpd_msgstate { enum ftpd_state_e state; sfifo_t fifo; u16_t dataport; int passive; char *renamefrom; struct ip_addr dataip; struct tcp_pcb *datapcb; struct tcp_pcb *listenpcb; struct ftpd_datastate *datafs; }; struct ftpd_command { char *cmd; void (*func) (const char *arg, struct tcp_pcb * pcb, struct ftpd_msgstate * fsm); }; #define SFIFO_SIZEMASK(x) ((x)->size - 1) #define sfifo_used(x) (((x)->writepos - (x)->readpos) & SFIFO_SIZEMASK(x)) #define sfifo_space(x) ((x)->size - 1 - sfifo_used(x)) void ftpd_init(void); void Ftp_task(void *pvArg);