ql_ftp_client.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. /**
  2. @file
  3. ql_ftp_client.h
  4. @brief
  5. This file provides the definitions for ftp client, and declares the
  6. API functions.
  7. */
  8. /*============================================================================
  9. Copyright (c) 2017 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
  10. Quectel Wireless Solution Proprietary and Confidential.
  11. =============================================================================*/
  12. /*===========================================================================
  13. EDIT HISTORY FOR MODULE
  14. This section contains comments describing changes made to the module.
  15. Notice that changes are listed in reverse chronological order.
  16. WHEN WHO WHAT, WHERE, WHY
  17. ---------- ------------ ----------------------------------------------------
  18. =============================================================================*/
  19. #ifndef __QL_FTP_CLIENT_H__
  20. #define __QL_FTP_CLIENT_H__
  21. #include <time.h>
  22. #include "ql_api_common.h"
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26. #define MAX_FILE_NAME_SIZE 256
  27. #define MAX_OWNER_SIZE 64
  28. #define QL_FTP_CLIENT_FREE(p) if(p){free(p);p=NULL;}
  29. #define QL_FTP_ERRCODE_BASE (QL_COMPONENT_LWIP_FTP << 16)
  30. typedef enum
  31. {
  32. QL_FTP_ERR_OK = 0, /*Operation successful*/
  33. QL_FTP_ERR_UNKNOWN = 601 | QL_FTP_ERRCODE_BASE, /*Unknown error*/
  34. QL_FTP_ERR_WOULDBLOCK = 602 | QL_FTP_ERRCODE_BASE, /*FTP(S) server blocked*/
  35. QL_FTP_ERR_BUSY = 603 | QL_FTP_ERRCODE_BASE, /*FTP(S) server busy*/
  36. QL_FTP_ERR_DNS = 604 | QL_FTP_ERRCODE_BASE, /*failed to parse domain name*/
  37. QL_FTP_ERR_NETWORK = 605 | QL_FTP_ERRCODE_BASE, /*failed to establish socket or the network is deactivated*/
  38. QL_FTP_ERR_CTRL_CLOSE = 606 | QL_FTP_ERRCODE_BASE, /*the ftp session has been closed by the ftp server*/
  39. QL_FTP_ERR_DATA_CLOSE = 607 | QL_FTP_ERRCODE_BASE, /*the data connection was closed by the ftp server*/
  40. QL_FTP_ERR_BEARER_FAIL = 608 | QL_FTP_ERRCODE_BASE, /*Socket closed by peer*/
  41. QL_FTP_ERR_TIMEOUT = 609 | QL_FTP_ERRCODE_BASE, /*Timeout error*/
  42. QL_FTP_ERR_INVALID_PARAM = 610 | QL_FTP_ERRCODE_BASE, /*Invalid parameter*/
  43. QL_FTP_ERR_FILE_NOT_FOUND = 611 | QL_FTP_ERRCODE_BASE, /*Failed to open file*/
  44. QL_FTP_ERR_FILE_POINT_ERR = 612 | QL_FTP_ERRCODE_BASE, /*File position invalid*/
  45. QL_FTP_ERR_FS_FILE_ERROR = 613 | QL_FTP_ERRCODE_BASE, /*File error*/
  46. QL_FTP_ERR_SERVICE_END = 614 | QL_FTP_ERRCODE_BASE, /*Service not available, closing control connection*/
  47. QL_FTP_ERR_DATA_FAILED = 615 | QL_FTP_ERRCODE_BASE, /*Open data connection failed*/
  48. QL_FTP_ERR_CLOSE_CONN = 616 | QL_FTP_ERRCODE_BASE, /*Connection closed; transfer aborted*/
  49. QL_FTP_ERR_FILE_UNOPER = 617 | QL_FTP_ERRCODE_BASE, /*Requested file action not taken*/
  50. QL_FTP_ERR_REQUEST_ABORT = 618 | QL_FTP_ERRCODE_BASE, /*Requested action aborted: local error in processing*/
  51. QL_FTP_ERR_OVER_MEMORY = 619 | QL_FTP_ERRCODE_BASE, /*Requested action not taken: insufficient system storage*/
  52. QL_FTP_ERR_COMMAND_ERROR = 620 | QL_FTP_ERRCODE_BASE, /*Syntax error, command unrecognized*/
  53. QL_FTP_ERR_PARAM_ERROR = 621 | QL_FTP_ERRCODE_BASE, /*Syntax error in parameters or arguments*/
  54. QL_FTP_ERR_COMMAND_FAILED = 622 | QL_FTP_ERRCODE_BASE, /*Command not implemented*/
  55. QL_FTP_ERR_COMMAND_BAD_SEQUENCE = 623 | QL_FTP_ERRCODE_BASE, /*Bad sequence of commands*/
  56. QL_FTP_ERR_COMMAND_NOT_IMPLENT = 624 | QL_FTP_ERRCODE_BASE, /*Command parameter not implemented*/
  57. QL_FTP_ERR_UNLOGIN = 625 | QL_FTP_ERRCODE_BASE, /*Not logged in*/
  58. QL_FTP_ERR_NO_ACCOUNT = 626 | QL_FTP_ERRCODE_BASE, /*Need account for storing files*/
  59. QL_FTP_ERR_REQUEST_FAILED = 627 | QL_FTP_ERRCODE_BASE, /*Requested action not taken*/
  60. QL_FTP_ERR_REQUEST_STOP = 628 | QL_FTP_ERRCODE_BASE, /*Requested action aborted: page type unknown*/
  61. QL_FTP_ERR_FILEREQ_STOP = 629 | QL_FTP_ERRCODE_BASE, /*Requested file action aborted*/
  62. QL_FTP_ERR_FILENAME_ERROR = 630 | QL_FTP_ERRCODE_BASE, /*Requested file name invalid*/
  63. QL_FTP_ERR_SSL_AUTH_FAIL = 631 | QL_FTP_ERRCODE_BASE, /*SSL authentication failed*/
  64. QL_FTP_ERR_INTERFACE_FAILED = 632 | QL_FTP_ERRCODE_BASE, /*Source IP address for transmission cannot use*/
  65. QL_FTP_ERR_SEND_ERROR = 633 | QL_FTP_ERRCODE_BASE, /*Send data failed*/
  66. QL_FTP_ERR_RECV_ERROR = 634 | QL_FTP_ERRCODE_BASE, /*Receive data failed*/
  67. } QL_FTP_CLIENT_ERR_E;
  68. typedef enum {
  69. QL_FTP_CLIENT_SIM_CID,//设置SIM卡的CID
  70. QL_FTP_CLIENT_SSL_CTX,//设置FTP客户端使用的SSL Context
  71. QL_FTP_CLIENT_SSL_ENABLE,//设置FTP客户端是否使用SSL连接
  72. QL_FTP_CLIENT_OPT_PDP_CID, //设置ftp client使用的数据通道CID,执行数据拨号操作时使用的CID
  73. QL_FTP_CLIENT_OPT_SSL_CTX, //设置SSL
  74. QL_FTP_CLIENT_OPT_START_POS,//设置下载的起始偏移位置
  75. QL_FTP_CLIENT_SSL_VERIFY_LEVEL,//设置SSL的校验方式
  76. QL_FTP_CLIENT_SSL_CACERT_PATH,//设置SSL的证书
  77. QL_FTP_CLIENT_SSL_OWNCERT_PATH,//设置SSL的本地证书
  78. QL_FTP_CLIENT_SSL_CIPHERSUITE,//设置SSL的加密套件
  79. QL_FTP_CLIENT_SSL_VERSION,//设置SSL的版本信息
  80. QL_FTP_CLIENT_SSL_TRANSPORT,//设置SSL的协议类型
  81. QL_FTP_CLIENT_PORT_MODE,//设置FTP建立数据连接的主被动模式
  82. QL_FTP_CLIENT_IPV6_EXTEND,//设置IPV6扩展功能是否开启
  83. //QL_FTP_CLIENT_SSL_PSK,
  84. }QL_FTP_CLIENT_OPT_E;
  85. typedef enum {
  86. QL_FTP_CLIENT_SSL_TYPE_NONE, // 连接FTP服务器
  87. QL_FTP_CLIENT_SSL_TYPE_IMP, // 隐式加密连接FTPS服务器
  88. QL_FTP_CLIENT_SSL_TYPE_EXP, // 显式加密连接FTPS服务器
  89. QL_FTP_CLIENT_SSL_TYPE_SSH, // 连接SFTP服务器
  90. }QL_FTP_CLIENT_SSL_TYPE_E;
  91. typedef struct{
  92. char filename[MAX_FILE_NAME_SIZE];//文件或目录名
  93. int type;//类型,0:未知;1:目录;2:文件
  94. int permissions;//权限
  95. int links;//链接数
  96. char owner[MAX_OWNER_SIZE];//所属用户
  97. char group[MAX_OWNER_SIZE];//所属用户组
  98. struct tm timestamp;//创建时间
  99. unsigned long size;//文件大小,字节
  100. }QL_FTP_CLIENT_FILE_INFO_T;
  101. /*****************************************************************
  102. * Function: QL_FTP_CLIENT_WRITE_CB
  103. *
  104. * Description:
  105. * 使用回调函数接收从FTP服务器获取的文件数据。
  106. *
  107. * Parameters:
  108. * ptr [in] 获取数据指针。可通过该指针将获得的数据写入用户所指定的存储位置。
  109. * size [in] 要被写入的每个元素的大小,以字节为单位。
  110. * nmemb [in] 元素的个数,每个元素的大小为size字节。
  111. * stream [in] 用户传入的callback function参数指针,可通过该指针指定参数ptr中数据存放的位置。
  112. * Return:
  113. * 如果成功,该函数需要返回size*nmemb大小的字节,否则会导致数据读错误,导致ftp异常结束。
  114. *
  115. *****************************************************************/
  116. typedef size_t (*QL_FTP_CLIENT_WRITE_CB_EX)(void *ptr, size_t size, size_t nmemb, void *stream);
  117. /*****************************************************************
  118. * Function: QL_FTP_CLIENT_READ_CB
  119. *
  120. * Description:
  121. * 使用回调函数发送数据到FTP服务器。
  122. *
  123. * Parameters:
  124. * ptr [out] 读取数据的指针。用户传入的数据可被该指读取,完成用户数据的记录。
  125. * size [in] 要被读取的每个元素的大小,以字节为单位。
  126. * nmemb [in] 元素的个数,每个元素的大小为size字节。
  127. * stream [in] 用户传入的callback function参数指针,可通过该指针向参数ptr传入数据。
  128. * Return:
  129. * 如果成功,该函数需要返回size*nmemb大小的字节,否则会导致数据读错误,导致ftp异常结束。
  130. *
  131. *****************************************************************/
  132. typedef size_t (*QL_FTP_CLIENT_READ_CB_EX)(void *ptr, size_t size, size_t nmemb, void *stream);
  133. /*****************************************************************
  134. * Function: ql_ftp_client_new
  135. *
  136. * Description:
  137. * 创建ftp client 句柄。
  138. *
  139. * Parameters:
  140. * 无
  141. *
  142. * Return:
  143. * 不为 NULL, ftp client 句柄。
  144. * NULL, 创建失败。
  145. *
  146. *****************************************************************/
  147. void *ql_ftp_client_new(void);
  148. /*****************************************************************
  149. * Function: ql_ftp_client_release
  150. *
  151. * Description:
  152. * 释放ftp client资源。
  153. *
  154. * Parameters:
  155. * client [in] ftp client 句柄。
  156. *
  157. * Return:
  158. * void。
  159. *
  160. *****************************************************************/
  161. void ql_ftp_client_release(void *client);
  162. /*****************************************************************
  163. * Function: ql_ftp_client_setopt
  164. *
  165. * Description:
  166. * 配置ftp client相关属性。
  167. *
  168. * Parameters:
  169. * client [in] ftp client 句柄。
  170. * tag [in] 属性标签,见QL_FTP_CLIENT_OPT_E。
  171. * ... [in] 属性参数。
  172. * tag为QL_FTP_CLIENT_OPT_PDP_CID是,此参数为int型,执行数据拨号操作时使用的CID值。
  173. * tag为QL_FTP_CLIENT_OPT_SSL_CTX是,此参数为指针,SSL 句柄。
  174. *
  175. * Return:
  176. * 0,成功。
  177. * 其他,错误码。
  178. *
  179. *****************************************************************/
  180. int ql_ftp_client_setopt(void *client, QL_FTP_CLIENT_OPT_E tag, ...);
  181. /*****************************************************************
  182. * Function: ql_ftp_client_open
  183. *
  184. * Description:
  185. * 连接ftp服务器。
  186. *
  187. * Parameters:
  188. * client [in] ftp client 句柄。
  189. * hostname [in] ftp 服务器地址。
  190. * username [in] 用户名。
  191. * password [in] 密码。
  192. *
  193. * Return:
  194. * 0,成功。
  195. * 其他,错误码。
  196. *
  197. *****************************************************************/
  198. int ql_ftp_client_open(void *client,char *hostname,char *username,char *password);
  199. /*****************************************************************
  200. * Function: ql_ftp_client_close
  201. *
  202. * Description:
  203. * 断开与ftp服务器的连接。
  204. *
  205. * Parameters:
  206. * client [in] ftp client 句柄。
  207. *
  208. * Return:
  209. * 0,成功。
  210. * 其他,错误码。
  211. *
  212. *****************************************************************/
  213. int ql_ftp_client_close(void *client);
  214. /*****************************************************************
  215. * Function: ql_ftp_client_get_ex
  216. *
  217. * Description:
  218. * 从ftp服务器下载文件。
  219. *
  220. * Parameters:
  221. * client [in] ftp client 句柄。
  222. * remotefile [in] 需要获取的ftp服务器上文件的文件名,可以包含相对或绝对路径。
  223. * localfile [in] 存储到本地的文件名,可以包含相对或绝对路径,如果为NULL,则和ftp服务器上文件同名,本地默认使用的目录为U:/。
  224. * write_cb [in] 使用回调函数接收从FTP服务器获取的文件数据。
  225. * user_data [in] 用户数据。
  226. *
  227. * Return:
  228. * 0,成功。
  229. * 其他,错误码。
  230. *
  231. *****************************************************************/
  232. int ql_ftp_client_get_ex(void *client,char *remotefile,char *localfile,QL_FTP_CLIENT_WRITE_CB_EX write_cb,void* user_data);
  233. /*****************************************************************
  234. * Function: ql_ftp_client_put_ex
  235. *
  236. * Description:
  237. * 上传本地文件到服务器。
  238. *
  239. * Parameters:
  240. * client [in] ftp client 句柄。
  241. * localfile [in] 需要上传的本地文件名,可以包含相对或绝对路径,本地默认使用的目录为U:/。
  242. * remotefile [in] 存储到ftp服务器上文件的文件名,可以包含相对或绝对路径,如果为NULL,则和本地文件同名,
  243. * read_cb [in] 使用回调函数发送数据到FTP服务器,如果设置了此回调函数,localfile参数无效,remotefile参数必须设置。
  244. * user_data [in] 用户数据。
  245. *
  246. * Return:
  247. * 0,成功。
  248. * 其他,错误码。
  249. *
  250. *****************************************************************/
  251. int ql_ftp_client_put_ex(void *client,char *localfile,char *remotefile,QL_FTP_CLIENT_READ_CB_EX read_cb,void* user_data);
  252. /*****************************************************************
  253. * Function: ql_ftp_client_delete
  254. *
  255. * Description:
  256. * 删除ftp服务器上文件。
  257. *
  258. * Parameters:
  259. * client [in] ftp client 句柄。
  260. * remotefile [in] 需要删除的ftp服务器上文件的文件名,可以包含相对或绝对路径,
  261. *
  262. * Return:
  263. * 0,成功。
  264. * 其他,错误码。
  265. *
  266. *****************************************************************/
  267. int ql_ftp_client_delete(void *client,char *remotefile);
  268. /*****************************************************************
  269. * Function: ql_ftp_client_cwd
  270. *
  271. * Description:
  272. * 更改ftp服务器当前使用的目录。
  273. *
  274. * Parameters:
  275. * client [in] ftp client 句柄。
  276. * path [in] ftp服务器目录,可以是相对或绝对路径,
  277. *
  278. * Return:
  279. * 0,成功。
  280. * 其他,错误码。
  281. *
  282. *****************************************************************/
  283. int ql_ftp_client_cwd(void *client, char *path);
  284. /*****************************************************************
  285. * Function: ql_ftp_client_lcwd
  286. *
  287. * Description:
  288. * 更改本地当前使用的目录。
  289. *
  290. * Parameters:
  291. * client [in] ftp client 句柄。
  292. * path [in] 本地目录,可以是相对或绝对路径,
  293. *
  294. * Return:
  295. * 0,成功。
  296. * 其他,错误码。
  297. *
  298. *****************************************************************/
  299. int ql_ftp_client_lcwd(void *client, char *path);
  300. /*****************************************************************
  301. * Function: ql_ftp_client_pwd
  302. *
  303. * Description:
  304. * 获取ftp服务器当前使用的目录。
  305. *
  306. * Parameters:
  307. * client [in] ftp client 句柄。
  308. * path [out] ftp服务器目录,绝对路径。
  309. * path_len [in] path的最大存储长度。
  310. *
  311. * Return:
  312. * 0,成功。
  313. * 其他,错误码。
  314. *
  315. *****************************************************************/
  316. int ql_ftp_client_pwd(void *client, char *path, int path_len);
  317. /*****************************************************************
  318. * Function: ql_ftp_client_lpwd
  319. *
  320. * Description:
  321. * 获取本地当前使用的目录。
  322. *
  323. * Parameters:
  324. * client [in] ftp client 句柄。
  325. * path [out] 本地目录,绝对路径。
  326. * path_len [in] path的最大存储长度。
  327. *
  328. * Return:
  329. * 0,成功。
  330. * 其他,错误码。
  331. *
  332. *****************************************************************/
  333. int ql_ftp_client_lpwd(void *client, char *path, int path_len);
  334. /*****************************************************************
  335. * Function: ql_ftp_client_mkdir
  336. *
  337. * Description:
  338. * 在ftp服务器上新建目录。
  339. *
  340. * Parameters:
  341. * client [in] ftp client 句柄。
  342. * path [in] 需要新建的ftp服务器目录,可以是相对或绝对路径。
  343. *
  344. * Return:
  345. * 0,成功。
  346. * 其他,错误码。
  347. *
  348. *****************************************************************/
  349. int ql_ftp_client_mkdir(void *client, char *path);
  350. /*****************************************************************
  351. * Function: ql_ftp_client_rmdir
  352. *
  353. * Description:
  354. * 删除ftp服务器上的目录。
  355. *
  356. * Parameters:
  357. * client [in] ftp client 句柄。
  358. * path [in] 需要删除的ftp服务器目录,可以是相对或绝对路径。
  359. *
  360. * Return:
  361. * 0,成功。
  362. * 其他,错误码。
  363. *
  364. *****************************************************************/
  365. int ql_ftp_client_rmdir(void *client, char *path);
  366. /*****************************************************************
  367. * Function: ql_ftp_client_list
  368. *
  369. * Description:
  370. * 获取指定ftp服务器上目录下文件和目录列表。
  371. *
  372. * Parameters:
  373. * client [in] ftp client 句柄。
  374. * path_or_file [in] ftp服务器上的目录或文件,可以是相对或绝对路径。
  375. * match [in] 只列出包含match字符的结果。
  376. * file_info_list [out] 获取到的文件和目录列表。
  377. * max_file_num [in] file_info_list可以存储结果的最大个数。
  378. *
  379. * Return:
  380. * 大于0,实际获取到的结果个数。
  381. * -1,失败。
  382. *
  383. *****************************************************************/
  384. int ql_ftp_client_list(void *client, char *path_or_file,char *match,QL_FTP_CLIENT_FILE_INFO_T *file_info_list, int max_file_num);
  385. /*****************************************************************
  386. * Function: ql_ftp_client_get_server_file_size
  387. *
  388. * Description:
  389. * 获取FTP服务器上指定路径下指定文件的大小。
  390. *
  391. * Parameters:
  392. * client [in] ftp client 句柄。
  393. * path_or_file [in] FTP服务器上的目录或文件,可以是相对路径或绝对路径。
  394. * nSize [out] 用于获取FTP服务器上所要查询指定文件的大小。
  395. *
  396. * Return:
  397. * 0,成功。
  398. * 其他,错误码。
  399. *
  400. *****************************************************************/
  401. int ql_ftp_client_size(void *client, const char *filename, double *nSize);
  402. /*****************************************************************
  403. * Function: ql_ftp_client_rename
  404. *
  405. * Description:
  406. * 对ftp服务器上的文件重命名。
  407. *
  408. * Parameters:
  409. * client [in] ftp client 句柄。
  410. * oldname [in] FTP服务器上要重命名的文件名。
  411. * newname [in] 重命名后的文件名。
  412. *
  413. * Return:
  414. * 0,成功。
  415. * 其他,错误码。
  416. *
  417. *****************************************************************/
  418. int ql_ftp_client_rename(void *client, const char *oldname, const char *newname);
  419. #ifdef __cplusplus
  420. }
  421. #endif
  422. #endif