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_
 |