132 lines
2.8 KiB
C
132 lines
2.8 KiB
C
/*
|
|
* lwftpc.h
|
|
*
|
|
* Created on: Feb 20, 2024
|
|
* Author: "SeungJu Lim"
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include "lwip/api.h"
|
|
|
|
#ifdef __cplusplus
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <cstdarg>
|
|
#include <cstdlib>
|
|
#else
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#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_ */
|