97 lines
2.5 KiB
C
97 lines
2.5 KiB
C
|
#ifndef HV_FTP_H_
|
||
|
#define HV_FTP_H_
|
||
|
|
||
|
#include "hexport.h"
|
||
|
|
||
|
#define FTP_COMMAND_PORT 21
|
||
|
#define FTP_DATA_PORT 20
|
||
|
|
||
|
// ftp_command
|
||
|
// X(name)
|
||
|
#define FTP_COMMAND_MAP(X) \
|
||
|
X(HELP) \
|
||
|
X(USER) \
|
||
|
X(PASS) \
|
||
|
X(PWD) \
|
||
|
X(CWD) \
|
||
|
X(CDUP) \
|
||
|
X(MKD) \
|
||
|
X(RMD) \
|
||
|
X(STAT) \
|
||
|
X(SIZE) \
|
||
|
X(DELE) \
|
||
|
X(RNFR) \
|
||
|
X(RNTO) \
|
||
|
X(PORT) \
|
||
|
X(PASV) \
|
||
|
X(LIST) \
|
||
|
X(NLST) \
|
||
|
X(APPE) \
|
||
|
X(RETR) \
|
||
|
X(STOR) \
|
||
|
X(QUIT) \
|
||
|
|
||
|
enum ftp_command {
|
||
|
#define X(name) FTP_##name,
|
||
|
FTP_COMMAND_MAP(X)
|
||
|
#undef X
|
||
|
};
|
||
|
|
||
|
// ftp_status
|
||
|
// XXX(code, name, string)
|
||
|
#define FTP_STATUS_MAP(XXX) \
|
||
|
XXX(220, READY, Ready) \
|
||
|
XXX(221, BYE, Bye) \
|
||
|
XXX(226, TRANSFER_COMPLETE, Transfer complete) \
|
||
|
XXX(227, PASV, Entering Passive Mode) \
|
||
|
XXX(331, PASS, Password required) \
|
||
|
XXX(230, LOGIN_OK, Login OK) \
|
||
|
XXX(250, OK, OK) \
|
||
|
XXX(500, BAD_SYNTAX, Bad syntax) \
|
||
|
XXX(530, NOT_LOGIN, Not login) \
|
||
|
|
||
|
enum ftp_status {
|
||
|
#define XXX(code, name, string) FTP_STATUS_##name = code,
|
||
|
FTP_STATUS_MAP(XXX)
|
||
|
#undef XXX
|
||
|
};
|
||
|
|
||
|
// more friendly macros
|
||
|
#define FTP_MKDIR FTP_MKD
|
||
|
#define FTP_RMDIR FTP_RMD
|
||
|
#define FTP_APPEND FTP_APPE
|
||
|
#define FTP_REMOVE FTP_DELE
|
||
|
#define FTP_DOWNLOAD FTP_RETR
|
||
|
#define FTP_UPLOAD FTP_STOR
|
||
|
|
||
|
#define FTP_RECV_BUFSIZE 8192
|
||
|
|
||
|
typedef struct ftp_handle_s {
|
||
|
int sockfd;
|
||
|
char recvbuf[FTP_RECV_BUFSIZE];
|
||
|
void* userdata;
|
||
|
} ftp_handle_t;
|
||
|
|
||
|
BEGIN_EXTERN_C
|
||
|
|
||
|
HV_EXPORT const char* ftp_command_str(enum ftp_command cmd);
|
||
|
HV_EXPORT const char* ftp_status_str(enum ftp_status status);
|
||
|
|
||
|
HV_EXPORT int ftp_connect(ftp_handle_t* hftp, const char* host, int port);
|
||
|
HV_EXPORT int ftp_login(ftp_handle_t* hftp, const char* username, const char* password);
|
||
|
HV_EXPORT int ftp_quit(ftp_handle_t* hftp);
|
||
|
|
||
|
HV_EXPORT int ftp_exec(ftp_handle_t* hftp, const char* cmd, const char* param);
|
||
|
|
||
|
// local => remote
|
||
|
HV_EXPORT int ftp_upload(ftp_handle_t* hftp, const char* local_filepath, const char* remote_filepath);
|
||
|
// remote => local
|
||
|
HV_EXPORT int ftp_download(ftp_handle_t* hftp, const char* remote_filepath, const char* local_filepath);
|
||
|
|
||
|
typedef int (*ftp_download_cb)(ftp_handle_t* hftp, char* buf, int len);
|
||
|
HV_EXPORT int ftp_download_with_cb(ftp_handle_t* hftp, const char* filepath, ftp_download_cb cb);
|
||
|
|
||
|
END_EXTERN_C
|
||
|
|
||
|
#endif // HV_FTP_H_
|