/* * lwftpc.h * * Created on: Feb 20, 2024 * Author: "SeungJu Lim" */ #include #include "lwip/api.h" #ifdef __cplusplus #include #include #include #include #else #include #include #include #endif #ifdef __cplusplus extern "C" { #endif #ifndef LWFTPC_H_ #define LWFTPC_H_ typedef struct lwftp_session lwftp_session_t; /** Timeout */ #define FTP_TIMEOUT 10000 /** Setting for LwFTP debug print */ #define LWFTP_DEBUG 1 /** Callback functions */ typedef void (*lwftp_data_callback_t)(lwftp_session_t *s, char *filename, char *data); void lwftp_store_callback(lwftp_session_t *s, char *filename, char *data); void lwftp_retrieve_callback(lwftp_session_t *s, char *filename, char *data); void lwftp_list_callback(lwftp_session_t *s, char *filename, char *outStr); /** Connection state enums */ typedef enum { LWFTP_CLOSED = 0, LWFTP_CONNECTED, LWFTP_USER_SENT, LWFTP_PASS_SENT, LWFTP_LOGGED, LWFTP_PASV_SENT, LWFTP_PASV_MODE, LWFTP_LIST_SENT, LWFTP_RETR_SENT, LWFTP_STOR_SENT, } control_state_t; typedef enum { LWFTP_DATA_CLOSED = 0, LWFTP_DATA_XFER_READY, LWFTP_DATA_XFERING, LWFTP_DATA_XFER_COMPLETE, } data_state_t; /** Session structure */ typedef struct lwftp_session { // user data char *user; char *pass; ip_addr_t cli_ip; ip_addr_t svr_ip; u16_t svr_port; u16_t data_port; // connection data struct netconn *conn; struct netconn *data_conn; control_state_t ctrl_state; data_state_t data_state; // callback things lwftp_data_callback_t data_callback; char *filename; char *data; char **outStr; // semaphore things SemaphoreHandle_t xfer_semaphore; err_t result; } lwftp_session_t; /** Control & Data threads */ void lwftp_ctrl_thread(void *arg); void lwftp_data_thread(void *arg); /** FTP Commands */ err_t lwftp_store(lwftp_session_t *s, char *filename, char *data); err_t lwftp_retrieve(lwftp_session_t *s, char *filename); err_t lwftp_list(lwftp_session_t *s, char **outStr); err_t lwftp_close(lwftp_session_t *s); /** Transfer cmd & Open data port */ err_t lwftp_send(struct netconn *conn, char *data); err_t lwftp_send_pasv(lwftp_session_t *s); err_t lwftp_login(lwftp_session_t *s); err_t lwftp_data_open(lwftp_session_t *s, char *response); /** Data reception */ void onDataReceived(lwftp_session_t *s, void *data, size_t size); /** Utilities */ void resetSession(lwftp_session_t *s); char** extractFileNames(const char *input, int *fileCount); char* genUniqFilName(char **fileNames, int fileCount, const char *targetFileName); /** Debugging print */ void debugPrint(const char *format, ...); #ifdef __cplusplus } #endif #endif /* LWFTPC_H_ */