| /** |
| * @file ext_ftp_func.c |
| * @brief zte_ftpÏà¹ØÀ©Õ¹at×¢²á¼°´¦ÀíʵÏÖ |
| * |
| * Copyright (C) 2017 Sanechips Technology Co., Ltd. |
| * @author |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| */ |
| |
| #ifndef CONFIG_MIN_8M_VERSION |
| /******************************************************************************* |
| * Include header files * |
| ******************************************************************************/ |
| #include "ext_regist.h" |
| #include "at_utils.h" |
| #include "softap_api.h" |
| #include "ext_ftp_func.h" |
| |
| /******************************************************************************* |
| * Macro definitions * |
| ******************************************************************************/ |
| |
| /******************************************************************************* |
| * Type definitions * |
| ******************************************************************************/ |
| /******************************************************************************* |
| * Local function declarations * |
| ******************************************************************************/ |
| /******************************************************************************* |
| * Local variable definitions * |
| ******************************************************************************/ |
| /* |
| $MYFTPOPEN=<channel>,<destination_ip/url>,<username>,<password>,<mode>,<Tout>,<FTPtype> |
| */ |
| static int ext_ftpopen_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| struct zteftp_open_reqmsg *reqmsg = malloc(sizeof(struct zteftp_open_reqmsg)); |
| assert(reqmsg); |
| char *p[7] = { |
| &reqmsg->channel, |
| reqmsg->destination, |
| reqmsg->username, |
| reqmsg->password, |
| &reqmsg->mode, |
| &reqmsg->tout, |
| &reqmsg->ftptype |
| }; |
| memset(reqmsg, 0x00, sizeof(struct zteftp_open_reqmsg)); |
| parse_param2("%d,%s,%s,%s,%d,%d,%d", at_paras, p); |
| at_print(AT_NORMAL, "ext_ftpopen_req %d,%s,%s,%s,%d,%d,%d\n", reqmsg->channel, |
| reqmsg->destination, |
| reqmsg->username, |
| reqmsg->password, |
| reqmsg->mode, |
| reqmsg->tout, |
| reqmsg->ftptype); |
| *res_msg = reqmsg; |
| *res_msglen = sizeof(struct zteftp_open_reqmsg); |
| return AT_CONTINUE; |
| } |
| /* |
| <CR><LF>OK<CR><LF> |
| <CR><LF>ERROR:<err><CR><LF> |
| */ |
| static int ext_ftpopen_rsp(void *rsp_msg, void**ret, int *retlen) |
| { |
| struct zteftp_open_rspmsg *rspmsg = (struct zteftp_open_rspmsg*)rsp_msg; |
| char *at_str = malloc(32); |
| assert(at_str); |
| memset(at_str, 0x00, 32); |
| |
| at_print(AT_NORMAL, "result %d\n", rspmsg->result); |
| if (rspmsg->result < 0) { |
| sprintf(at_str, "\r\nERROR: %d\r\n", rspmsg->err); |
| } else { |
| sprintf(at_str, "\r\nOK\r\n"); |
| } |
| *ret = at_str; |
| *retlen = strlen(at_str); |
| return AT_END; |
| } |
| /* |
| at$MYFTPOPEN? |
| */ |
| static int ext_ftpstate_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| return AT_CONTINUE; |
| } |
| /* |
| <CR><LF>$MYFTPOPEN:<connect_status> |
| <CR><LF>OK<CR><LF> |
| */ |
| static int ext_ftpstate_rsp(void *rsp_msg, void**ret, int *retlen) |
| { |
| struct zteftp_query_rspmsg *rspmsg = (struct zteftp_query_rspmsg*)rsp_msg; |
| char *at_str = malloc(32); |
| assert(at_str); |
| memset(at_str, 0x00, 32); |
| |
| sprintf(at_str, "\r\n$MYFTPOPEN: %d\r\nOK\r\n", rspmsg->connect_status); |
| |
| *ret = at_str; |
| *retlen = strlen(at_str); |
| return AT_END; |
| } |
| |
| /* |
| at$MYFTPOPEN=? |
| |
| <CR><LF>OK<CR><LF> |
| */ |
| static int ext_ftpstate_confirm(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| char *at_str = malloc(32); |
| assert(at_str); |
| memset(at_str, 0x00, 32); |
| |
| sprintf(at_str, "\r\nOK\r\n"); |
| |
| *res_msg = at_str; |
| *res_msglen = strlen(at_str); |
| return AT_END; |
| } |
| |
| /* |
| at$MYFTPCLOSE |
| */ |
| static int ext_ftpclose_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| return AT_CONTINUE; |
| } |
| /* |
| <CR><LF>OK<CR><LF> |
| <CR><LF>ERROR:<err><CR><LF> |
| */ |
| static int ext_ftpclose_rsp(void *rsp_msg, void**ret, int *retlen) |
| { |
| struct zteftp_close_rspmsg *rspmsg = (struct zteftp_close_rspmsg*)rsp_msg; |
| char *at_str = malloc(32); |
| assert(at_str); |
| memset(at_str, 0x00, 32); |
| |
| if (rspmsg->result < 0) { |
| sprintf(at_str, "\r\nERROR\r\n"); |
| } else { |
| sprintf(at_str, "\r\nOK\r\n"); |
| } |
| |
| *ret = at_str; |
| *retlen = strlen(at_str); |
| return AT_END; |
| } |
| |
| /* |
| at$MYFTPSIZE=<File_Name> |
| */ |
| static int ext_ftpsize_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| struct zteftp_size_reqmsg *reqmsg = malloc(sizeof(struct zteftp_size_reqmsg)); |
| assert(reqmsg); |
| char *p[5] = {reqmsg->file_name}; |
| memset(reqmsg, 0x00, sizeof(struct zteftp_size_reqmsg)); |
| parse_param2("%s", at_paras, p); |
| at_print(AT_NORMAL, "ext_ftpsize_req %s", reqmsg->file_name); |
| *res_msg = reqmsg; |
| *res_msglen = sizeof(struct zteftp_size_reqmsg); |
| return AT_CONTINUE; |
| } |
| /* |
| <CR><LF>$MYFTPSIZE:<file_lenth> |
| <CR><LF>OK<CR><LF> |
| |
| <CR><LF>ERROR:<err><CR><LF> |
| |
| <CR><LF>$MYURLFTP:<status><CR><LF> |
| */ |
| static int ext_ftpsize_rsp(void *rsp_msg, void**ret, int *retlen) |
| { |
| struct zteftp_size_rspmsg *rspmsg = (struct zteftp_size_rspmsg*)rsp_msg; |
| int offset = 0; |
| char *at_str = malloc(64); |
| assert(at_str); |
| memset(at_str, 0x00, 64); |
| |
| if (rspmsg->file_lenth < 0) { |
| offset += sprintf(at_str, "\r\nERROR\r\n"); |
| } else { |
| offset += sprintf(at_str, "\r\n$MYFTPSIZE: %d\r\nOK\r\n", rspmsg->file_lenth); |
| #if 0 |
| offset += sprintf(at_str + offset, "\r\n$MYURCFTP:1\r\n");/*Êý¾ÝÁ¬½Ó¶Ï¿ª*/ |
| #endif |
| } |
| |
| *ret = at_str; |
| *retlen = strlen(at_str); |
| return AT_END; |
| } |
| |
| /* |
| at$MYFTPSIZE=<File_Name>[,<data_offset>,<data_lenth>] |
| */ |
| static int ext_ftpget_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| struct zteftp_get_reqmsg *reqmsg = malloc(sizeof(struct zteftp_get_reqmsg)); |
| assert(reqmsg); |
| char *p[5] = {reqmsg->file_name, &reqmsg->data_offset, &reqmsg->data_lenth}; |
| memset(reqmsg, 0x00, sizeof(struct zteftp_get_reqmsg)); |
| parse_param2("%s,%d,%d", at_paras, p); |
| at_print(AT_NORMAL, "ext_ftpget_req %s,%d,%d", reqmsg->file_name, reqmsg->data_offset, reqmsg->data_lenth); |
| *res_msg = reqmsg; |
| *res_msglen = sizeof(struct zteftp_get_reqmsg); |
| return AT_CONTINUE; |
| } |
| /* |
| <CR><LF>CONNECT<CR><LF> |
| <CR><LF><file_content> |
| <CR><LF>OK<CR><LF> |
| |
| <CR><LF>ERROR<CR><LF> |
| |
| <CR><LF>CONNECT<CR><LF> |
| <CR><LF><file_content> |
| <CR><LF>ERROR<CR><LF> |
| */ |
| static int ext_ftpget_rsp(void *rsp_msg, void**ret, int *retlen) |
| { |
| struct zteftp_get_rspmsg *rspmsg = (struct zteftp_get_rspmsg*)rsp_msg; |
| char *at_str = NULL; |
| int offset = 0; |
| |
| if (rspmsg->result < 0) { |
| at_str = malloc(64); |
| assert(at_str); |
| memset(at_str, 0x00, 64); |
| offset += sprintf(at_str, "\r\nERROR\r\n"); |
| } else { |
| at_str = malloc(64 + rspmsg->data_lenth); |
| assert(at_str); |
| memset(at_str, 0x00, 64 + rspmsg->data_lenth); |
| #if 1 |
| offset += sprintf(at_str, "\r\nCONNECT"); |
| #else |
| offset += sprintf(at_str, "\r\nCONNECT\r\n"); |
| /*Êý¾Ýͨ¹ýpassthrough·¢ËÍ*/ |
| //offset += sprintf(at_str+offset, "%s",rspmsg->file_content); |
| memcpy(at_str + offset, rspmsg->file_content, rspmsg->data_lenth); |
| offset += rspmsg->data_lenth; |
| offset += sprintf(at_str + offset, "\r\nOK\r\n"); |
| #endif |
| } |
| |
| *ret = at_str; |
| *retlen = offset;//strlen(at_str); |
| |
| return AT_END; |
| } |
| /* |
| at$MYFTPSIZE=<File_Name>,<data_lenth>,<EOF> |
| */ |
| static int ext_ftpput_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| struct zteftp_put_reqmsg *reqmsg = malloc(sizeof(struct zteftp_put_reqmsg)); |
| assert(reqmsg); |
| char *p[5] = {reqmsg->file_name, &reqmsg->data_lenth, &reqmsg->eof}; |
| memset(reqmsg, 0x00, sizeof(struct zteftp_put_reqmsg)); |
| parse_param2("%s,%d,%d", at_paras, p); |
| at_print(AT_NORMAL, "ext_ftpput_req %s,%d,%d\n", reqmsg->file_name, reqmsg->data_lenth, reqmsg->eof); |
| *res_msg = reqmsg; |
| *res_msglen = sizeof(struct zteftp_put_reqmsg); |
| return AT_CONTINUE; |
| } |
| /* |
| <CR><LF>CONNECT<CR><LF> |
| <CR><LF><file_content> |
| <CR><LF>OK<CR><LF> |
| |
| <CR><LF>ERROR<CR><LF> |
| */ |
| static int ext_ftpput_rsp(void *rsp_msg, void**ret, int *retlen) |
| { |
| struct zteftp_put_rspmsg *rspmsg = (struct zteftp_put_rspmsg*)rsp_msg; |
| char *at_str = malloc(32); |
| assert(at_str); |
| |
| memset(at_str, 0x00, 32); |
| if (rspmsg->ret < 0) { |
| sprintf(at_str, "\r\nERROR\r\n"); |
| } else if (rspmsg->ret == 0) { |
| sprintf(at_str, "\r\nCONNECT\r\n"); |
| } else if (rspmsg->ret == 1) { |
| sprintf(at_str, "\r\nOK\r\n"); |
| } |
| |
| *ret = at_str; |
| *retlen = strlen(at_str); |
| |
| return AT_END; |
| } |
| |
| /* |
| at+FTPFOTA |
| */ |
| static int ext_ftpfota_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen) |
| { |
| struct zteftp_fota_reqmsg *reqmsg = malloc(sizeof(struct zteftp_fota_reqmsg)); |
| assert(reqmsg); |
| char *p[7] = { |
| &reqmsg->channel, |
| reqmsg->destination, |
| reqmsg->file_name, |
| reqmsg->username, |
| reqmsg->password |
| }; |
| memset(reqmsg, 0x00, sizeof(struct zteftp_fota_reqmsg)); |
| parse_param2("%d,%s,%s,%s,%s", at_paras, p); |
| at_print(AT_NORMAL, "zteftp_fota_reqmsg %d,%s,%s,%s,%s\n", reqmsg->channel, |
| reqmsg->destination, |
| reqmsg->file_name, |
| reqmsg->username, |
| reqmsg->password |
| ); |
| *res_msg = reqmsg; |
| *res_msglen = sizeof(struct zteftp_fota_reqmsg); |
| return AT_CONTINUE; |
| } |
| /* |
| <CR><LF>OK<CR><LF> |
| <CR><LF>ERROR<CR><LF> |
| */ |
| static int ext_ftpfota_rsp(void *rsp_msg, void**ret, int *retlen) |
| { |
| struct zteftp_fota_rspmsg *rspmsg = (struct zteftp_fota_rspmsg*)rsp_msg; |
| char *at_str = malloc(32); |
| assert(at_str); |
| memset(at_str, 0x00, 32); |
| |
| if (rspmsg->result < 0) { |
| sprintf(at_str, "\r\nERROR\r\n"); |
| } else { |
| sprintf(at_str, "\r\nOK\r\n"); |
| } |
| |
| *ret = at_str; |
| *retlen = strlen(at_str); |
| return AT_END; |
| } |
| /******************************************************************************* |
| * Global variable definitions * |
| ******************************************************************************/ |
| /** |
| * @brief ×¢²áftpÏà¹ØÀ©Õ¹at |
| * @param |
| * @return |
| * @retval |
| */ |
| int ext_ftp_regist(void) |
| { |
| //#ifdef GUODIAN |
| if (g_customer_type == CUSTOMER_GUODIAN) { |
| register_serv_func2("MYFTPOPEN=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPOPEN_REQ, MSG_CMD_FTPOPEN_RSP, ext_ftpopen_req, ext_ftpopen_rsp); |
| register_serv_func2("MYFTPOPEN?", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSTATE_REQ, MSG_CMD_FTPSTATE_RSP, ext_ftpstate_req, ext_ftpstate_rsp); |
| register_serv_func2("MYFTPOPEN=?", MODULE_ID_SOCKET_PROXY, 0, 0, ext_ftpstate_confirm, NULL); |
| register_serv_func2("MYFTPCLOSE", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPCLOSE_REQ, MSG_CMD_FTPCLOSE_RSP, ext_ftpclose_req, ext_ftpclose_rsp); |
| register_serv_func2("MYFTPSIZE=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSIZE_REQ, MSG_CMD_FTPSIZE_RSP, ext_ftpsize_req, ext_ftpsize_rsp); |
| register_serv_func2("MYFTPGET=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPGET_REQ, MSG_CMD_FTPGET_RSP, ext_ftpget_req, ext_ftpget_rsp); |
| register_serv_func2("MYFTPPUT=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPPUT_REQ, MSG_CMD_FTPPUT_RSP, ext_ftpput_req, ext_ftpput_rsp); |
| |
| register_serv_func2("FOTAFTP=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPFOTA_REQ, MSG_CMD_FTPFOTA_RSP, ext_ftpfota_req, ext_ftpfota_rsp); |
| } else if (g_customer_type == CUSTOMER_NANDIAN) { |
| |
| register_serv_func2("MYFTPOPEN=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPOPEN_REQ, MSG_CMD_FTPOPEN_RSP, ext_ftpopen_req, ext_ftpopen_rsp); |
| register_serv_func2("MYFTPOPEN?", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSTATE_REQ, MSG_CMD_FTPSTATE_RSP, ext_ftpstate_req, ext_ftpstate_rsp); |
| register_serv_func2("MYFTPOPEN=?", MODULE_ID_SOCKET_PROXY, 0, 0, ext_ftpstate_confirm, NULL); |
| register_serv_func2("MYFTPCLOSE", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPCLOSE_REQ, MSG_CMD_FTPCLOSE_RSP, ext_ftpclose_req, ext_ftpclose_rsp); |
| register_serv_func2("MYFTPSIZE=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSIZE_REQ, MSG_CMD_FTPSIZE_RSP, ext_ftpsize_req, ext_ftpsize_rsp); |
| register_serv_func2("MYFTPGET=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPGET_REQ, MSG_CMD_FTPGET_RSP, ext_ftpget_req, ext_ftpget_rsp); |
| register_serv_func2("MYFTPPUT=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPPUT_REQ, MSG_CMD_FTPPUT_RSP, ext_ftpput_req, ext_ftpput_rsp); |
| } |
| //#endif |
| return 0; |
| |
| } |
| #endif |