[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/goahead/interface5.0/zte_web_httpshare.c b/ap/app/goahead/interface5.0/zte_web_httpshare.c
new file mode 100644
index 0000000..e77e0db
--- /dev/null
+++ b/ap/app/goahead/interface5.0/zte_web_httpshare.c
@@ -0,0 +1,2690 @@
+#include "zte_web_interface.h"
+#include "zte_web_httpshare.h"
+#include "../server/webs.h"
+#include "sqlite3.h"
+#include <sys/wait.h>
+#include "cfg_api.h"
+
+USER_COMMON_INFOR  pp_header;
+
+static char file_buf_memory[FILE_BUFFER_LEN] = {0};
+static char *file_buf_memory_ptr = NULL;
+static int tcard_file_size = 0;
+static BOOL file_end = FALSE;
+char download_file[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1] = {0};
+
+void zte_httpshare_check_upload_file();
+
+static char* neutralize(char *path);
+
+int  zte_httpshare_call_system(char * cmd)
+{
+	if (NULL == cmd) {
+		slog(MISC_PRINT,SLOG_DEBUG,"[httpshare]zte_httpshare_call_system: NULL-------------------------------\n");
+		return -1;
+	}
+	slog(MISC_PRINT,SLOG_NORMAL,"[httpshare]zte_httpshare_call_system: [%s] \n", cmd);
+#if 0
+	return system(cmd);
+#else
+    return  zxic_system(cmd);
+#endif
+}
+
+static int  zte_httpshare_call_system_echo(char * cmd)
+{
+	if (NULL == cmd) {
+		slog(MISC_PRINT,SLOG_DEBUG,"[httpshare]zte_httpshare_call_system_echo: NULL-------------------------------\n");
+		return -1;
+	}
+	slog(MISC_PRINT,SLOG_NORMAL,"[httpshare]zte_httpshare_call_system_echo: [%s] \n", cmd);
+
+	return soft_system(cmd);
+}
+
+
+int zte_system(char *cmd[])
+{
+	pid_t pid;
+	int status;
+	pid_t ret;
+	char *newenviron[] = { NULL };
+
+	// cmd array's size is unknown
+//	slog(MISC_PRINT,SLOG_NORMAL,"[httpshare]zte_httpshare_call_zte_system: [%s %s %s] \n", cmd[0],cmd[1],cmd[2]);
+
+	pid = fork();
+	if (pid == -1) {
+		return -1;
+	} else if (pid == 0) {
+		/*child process */
+		execve(cmd[0], cmd, newenviron);
+		/* for kw
+		if (execve(cmd[0], cmd, newenviron) == -1)
+			_exit(127);*/
+	} else {
+		/*father process */
+		while ((ret = waitpid(pid, &status, 0)) == -1) {
+			if (errno != EINTR)
+				break;
+		}
+
+		if (ret != -1 && WIFEXITED(status))
+			return WEXITSTATUS(status);
+	}
+
+	return -1;
+}
+
+zte_httpshare_db_result_e_type zte_httpshare_db_open(sqlite3**db)
+{
+	sqlite3* tmp_db;
+	int rc = 0;
+
+	if (NULL == db) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_db_open:invalide inputs.\n");
+		return ZTE_HTTPSHARE_DB_ERROR_INVAILD_PTR;
+	}
+
+	rc = sqlite3_open(ZTE_HTTPSHARE_DB_PATH, &tmp_db);
+
+	if (rc) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_db_open:can not open db,sqlite3_errmsg:%s\n", sqlite3_errmsg(tmp_db));
+		(void)sqlite3_close(tmp_db);
+		return ZTE_HTTPSHARE_DB_ERROR_NOT_OPEN_DB;
+	}
+	*db = tmp_db;
+	return ZTE_HTTPSHARE_DB_OK;
+}
+
+zte_httpshare_db_result_e_type zte_httpshare_db_close(sqlite3*db)
+{
+	int rc = 0;
+
+	if (NULL == db) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_db_close:invalide inputs.\n");
+		return ZTE_HTTPSHARE_DB_ERROR_INVAILD_PTR;
+	}
+	rc = sqlite3_close(db);
+	if (rc) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_db_close:can not close db.\n");
+		return ZTE_HTTPSHARE_DB_ERROR;
+	}
+	return ZTE_HTTPSHARE_DB_OK;
+}
+zte_httpshare_db_result_e_type zte_httpshare_db_exec_sql(const char *sql, sqlite3_callback callback, void *fvarg)
+{
+	sqlite3* db;
+	int rc = 0;
+
+	if (NULL == sql) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_db_exec_sql:invalide inputs.\n");
+		return ZTE_HTTPSHARE_DB_ERROR_INVAILD_PTR;
+	}
+	if (0 != zte_httpshare_db_open(&db)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_db_exec_sql:open httpshare.db failed.\n");
+		return ZTE_HTTPSHARE_DB_ERROR_NOT_OPEN_DB;
+	}
+	rc = sqlite3_exec(db, sql, callback, fvarg, NULL);
+
+	slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]zte_httpshare_db_exec_sql:%s rc=%d\n", sql, rc);
+	if (rc) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_db_exec_sql:can not exec sql,sqlite3_errmsg:%s.\n", sqlite3_errmsg(db));
+		(void)zte_httpshare_db_close(db);
+		return ZTE_HTTPSHARE_DB_ERROR;
+	}
+	(void)zte_httpshare_db_close(db);
+
+	return ZTE_HTTPSHARE_DB_OK;
+}
+
+
+int zte_insert_download_file(char *path)
+{
+	memset(download_file, 0, sizeof(download_file));
+	strncpy(download_file, path, sizeof(download_file)-1);
+	slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]download_file->%s\n", download_file);
+	return 1;
+}
+
+int zte_del_download_file()
+{
+	slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]del download_file->%s\n", download_file);
+	memset(download_file, 0, sizeof(download_file));
+	return 1;
+}
+
+
+int zte_check_download_file(char *path)//0: ²»´æÔڼǼ  1:¼Ç¼´æÔÚ
+{
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_check_download_file:path->%s\n", path);
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_check_download_file:download_file->%s\n", download_file);
+
+	if (!strncmp(path, download_file, strlen(path))) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_check_download_file:find used file->%s\n", path);
+		return 1;
+	} else {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_check_download_file:not find file->%s\n", path);
+		return 0;
+	}
+}
+
+int zte_check_downloading_file()//0: ²»´æÔڼǼ  1:¼Ç¼´æÔÚ
+{
+	slog(MISC_PRINT, SLOG_DEBUG,"[zyl]strlen(download_file)->%d\n", strlen(download_file));
+	return strlen(download_file);
+}
+
+void zte_change_rootpath_time()
+{
+	struct utimbuf times = {0};
+	utime(SD_CARD_PATH, &times); //timesΪ¿Õʱ£¬utime ½«·ÃÎÊʱ¼äºÍÐÞ¸Äʱ¼äÉèÖÃΪµ±Ç°Ê±¼ä
+	return;
+}
+
+void   zte_init_user_list()
+{
+	memset(&pp_header, 0, sizeof(USER_COMMON_INFOR));
+	memset(&download_file, 0, sizeof(download_file));
+}
+
+int zte_del_file(char *path)
+{
+	//char *cmd = NULL;
+
+	if (!path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_del_file  null\n");
+		return 0;
+	}
+	/*
+	cmd = (char *)malloc(strlen(path) + 10);
+	//char cmd[4*ZTE_HTTPSHARE_FILE_NAME_MAX_LEN+1] = {0};
+	if (NULL == cmd) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_del_file malloc error!\n");
+		return 0;
+	}
+	snprintf(cmd, strlen(path) + 10, "rm -rf \"%s\"", path);
+
+	zte_httpshare_call_system(cmd);
+	*/
+	char *cmd[] = { "/bin/rm", "-rf", path, NULL };
+	zte_system(cmd);
+	if (access(path, F_OK) == 0) {
+		if(remove(path) < 0){
+            slog(MISC_PRINT, SLOG_ERR,"[httpshare]remove file %s fail!\n", path); 
+			return 0;
+		}
+		if (access(path, F_OK) == 0) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]delfile %s fail!\n", path);
+			//free(cmd);
+			return 0;
+		}
+	}
+	//free(cmd);
+	slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]delfile %s OK!\n", path);
+	return 1;
+
+}
+
+int zte_umount_dev()
+{
+	char cmd[ZTE_HTTPSHARE_DEFAULT_LEN] = {0};
+	char sd_path[20] = {0};
+	char *mount_path = "/bin/umount";
+	
+	sc_cfg_get ("cur_tcard_blk", sd_path, sizeof(sd_path));
+	if (strlen(sd_path) != 0) {
+		snprintf(cmd, sizeof(cmd), "%s %s", mount_path, sd_path);
+	}
+	else {
+		snprintf(cmd,  sizeof(cmd), "%s %s", mount_path, USB_DEV_SDCARD_PATH);
+	}
+	zte_httpshare_call_system(cmd);
+
+	memset(cmd, 0, sizeof(cmd));
+	snprintf(cmd,  sizeof(cmd), "%s %s", mount_path, USB_DEV_SDCARD_PATH_BACK);
+	zte_httpshare_call_system(cmd);
+
+	memset(cmd, 0, sizeof(cmd));
+	snprintf(cmd,  sizeof(cmd), "%s %s", mount_path, SD_CARD_PATH);
+	zte_httpshare_call_system(cmd);
+
+	return 0;
+}
+
+/*¶ÁдÎļþÏà¹Ø²Ù×÷begin*/
+static int filelength(FILE *fp)
+{
+    int num;
+    fseek(fp,0,SEEK_END);
+    num=ftell(fp);
+    fseek(fp,0,SEEK_SET);
+    return num;
+}
+
+static int readfile(char *path, char* buf, unsigned len)
+{
+    FILE *fp;
+    unsigned int length;
+	size_t read_len = 0;
+	
+    if((fp=fopen(path,"r"))==NULL)
+    {
+        slog(USBCFGMNG_PRINT,SLOG_ERR, "[usbCfgMng] open file %s error.\n",path);
+        return -1;
+    }
+    length=filelength(fp);
+    length = length > len? len: length;
+    //ch=(char *)malloc(length+1);
+    read_len = fread(buf,length,1,fp);
+	if(read_len != 1)
+	{
+	    slog(USBCFGMNG_PRINT,SLOG_ERR, "read len:%d.\n",read_len);
+	}
+	
+    fclose(fp);
+    *(buf+length)='\0';
+    return (int)length;
+}
+int zte_get_cdrom()
+{
+	char cdrom0[8] = {0};
+	char cdrom1[8] = {0};
+	int rtv = 0;
+	int cdrom_state0 = -1;
+	int cdrom_state1 = -1;
+	rtv = readfile("/sys/devices/platform/zx29_hsotg.0/gadget/lun0/cdrom", cdrom0, 8);
+	cdrom_state0 = atoi(cdrom0);
+	rtv = readfile("/sys/devices/platform/zx29_hsotg.0/gadget/lun1/cdrom", cdrom1, 8);
+	cdrom_state1 = atoi(cdrom1);
+	if(cdrom_state0 == 0)	//lun0ΪuÅÌ
+	{
+		return 0;	
+	}
+
+	if(cdrom_state1 == 0)	//lun1ΪuÅÌ
+	{
+		return 1;	
+	}
+
+	return -1;
+
+}
+
+void zte_mount_usb()
+{
+	int cdrom = -1;
+	cdrom = zte_get_cdrom();
+	
+	if(cdrom == 0)
+	{
+		zte_umount_dev();
+		zte_httpshare_call_system_echo("/bin/echo /dev/mmcblk0 > /sys/devices/platform/zx29_hsotg.0/gadget/lun0/file");
+	}
+	else if(cdrom == 1)
+	{
+		zte_umount_dev();
+		zte_httpshare_call_system_echo("/bin/echo /dev/mmcblk0 > /sys/devices/platform/zx29_hsotg.0/gadget/lun1/file");
+	}
+}
+
+
+
+int zte_httpshare_mount_sd()
+{
+	char *cmd[] = { "/bin/mount", "-t", "vfat",USB_DEV_SDCARD_PATH,SD_CARD_PATH, NULL };
+	char *cmd1[] = { "/bin/mount", "-t", "vfat",USB_DEV_SDCARD_PATH_BACK,SD_CARD_PATH, NULL };
+
+	char sd_path[20] = {0};
+	int i = 0;
+	
+	zte_umount_dev();
+//ÂÖѯ·ÖÇø1-10
+	for (i = 1; i <= 10; i++) {
+		memset(sd_path, 0, sizeof(sd_path));
+		snprintf(sd_path, sizeof(sd_path), "/dev/mmcblk0p%d", i);
+		cmd[3] = sd_path;
+		if (0 == zte_system(cmd)) {
+			sc_cfg_set("cur_tcard_blk", sd_path);
+			sleep(2);
+			return 1;
+		}
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_mount_sd %s error!\n", sd_path);
+	}
+	
+	if (0 != zte_system(cmd1)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_mount_sd %s error!\n", USB_DEV_SDCARD_PATH_BACK);
+		return 0;
+	}
+	sleep(2);
+	return 1;
+}
+
+int  zte_mount_httpshare()
+{
+	char cmd[ZTE_HTTPSHARE_DEFAULT_LEN] = {0};
+
+	int cdrom = -1;
+
+	cdrom = zte_get_cdrom();
+    slog(MISC_PRINT, SLOG_ERR,"zte_mount_httpshare:cdrom=%d\n",cdrom);
+	if(cdrom == 0)
+	{
+		memset(cmd, 0, sizeof(cmd));
+		zte_httpshare_call_system_echo("/bin/echo NULL > /sys/devices/platform/zx29_hsotg.0/gadget/lun0/file");
+		if (-1 == access(SD_CARD_PATH, F_OK)) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_mount_httpshare mmc2 no exist!\n");
+			if(mkdir(SD_CARD_PATH, 0777) < 0)
+			{
+			    slog(MISC_PRINT, SLOG_ERR,"[httpshare]mkdir(%s) fail!\n", SD_CARD_PATH);
+			}
+			return zte_httpshare_mount_sd();
+		} else {
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_mount_httpshare %s exist\n", SD_CARD_PATH);
+			return zte_httpshare_mount_sd();
+		}
+	}
+	else if(cdrom == 1)
+	{
+		memset(cmd, 0, sizeof(cmd));
+		zte_httpshare_call_system_echo("/bin/echo NULL > /sys/devices/platform/zx29_hsotg.0/gadget/lun1/file");
+		if (-1 == access(SD_CARD_PATH, F_OK)) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_mount_httpshare mmc2 no exist!\n");
+			if(mkdir(SD_CARD_PATH, 0777) < 0){
+               slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]mkdir fail %s exist\n", SD_CARD_PATH);
+			}
+			return zte_httpshare_mount_sd();
+		} else {
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_mount_httpshare %s exist\n", SD_CARD_PATH);
+			return zte_httpshare_mount_sd();
+		}
+	}
+	else
+		return 0;
+
+}
+
+
+void zte_write_auth_to_web(webs_t wp)
+{
+
+	if ((NULL == wp)) {
+		return;
+	}
+	char HTTP_SHARE_WR_AUTH[10] = {0};
+	char HTTP_SHARE_FILE[1024] = {0};
+
+	(void)zte_web_read(NV_HTTPSHARE_WR_AUTH, HTTP_SHARE_WR_AUTH);
+	(void)zte_web_read(NV_HTTPSHARE_FILE, HTTP_SHARE_FILE);
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_write_auth_to_web: value is [%s]\n", HTTP_SHARE_WR_AUTH);
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_write_auth_to_web: value is [%s]\n", HTTP_SHARE_FILE);
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"HTTP_SHARE_WR_AUTH\":\"%s\",\"HTTP_SHARE_FILE\":\"%s\"}"),
+	                HTTP_SHARE_WR_AUTH, HTTP_SHARE_FILE);
+}
+void zte_write_tcard_name_to_web(webs_t wp)
+{
+	if ((NULL == wp)) {
+		return;
+	}
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"sd_card_name\":\"%s\"}"), "MicroSD Card");
+}
+
+
+void write_sd_card_total_size(uint32  total_size)
+{
+	char sd_card_total_size[NV_ITEM_VALUE_STRING_LEN] = {0};
+
+	snprintf(sd_card_total_size, sizeof(sd_card_total_size), "%lu", total_size);
+	(void)zte_web_write("sd_card_total_size", sd_card_total_size);
+}
+
+void write_sd_card_avi_space_to_nv(uint32  free_size)
+{
+	char sd_card_avi_space[NV_ITEM_VALUE_STRING_LEN] = {0};
+	snprintf(sd_card_avi_space, sizeof(sd_card_avi_space), "%lu", free_size);
+	(void)zte_web_write("sd_card_avi_space", sd_card_avi_space);
+}
+
+
+void get_used_space_size()
+{
+
+	struct statvfs file_stat;
+	uint32 total_size = 0;
+	uint32 b_used = 0 ;
+	if (zte_check_file_exist(SD_CARD_PATH)) {
+		(void)statvfs(SD_CARD_PATH, &file_stat);
+		total_size = file_stat.f_blocks * (file_stat.f_bsize / 512) / 64;
+		b_used = file_stat.f_bfree * (file_stat.f_bsize / 512) / 64;
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]get_used_space_size dirsize = %ld, %ld\n", total_size, b_used);
+		if (total_size / 1024 / 1024 > 32) {
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]get_used_space_size total size abnormal >1024G !!!!\n");
+			total_size = total_size / 1024;
+		}
+		if (b_used / 1024 / 1024 > 32) {
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]get_used_space_size b_used size abnormal >1024G !!!!\n");
+			b_used = b_used / 1024;
+		}
+		if (total_size < b_used) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]get_used_space_size sdcard size abnormal : total_size<b_used !!!!\n");
+		}
+		write_sd_card_total_size(total_size);
+		write_sd_card_avi_space_to_nv(b_used);
+	}
+
+}
+
+
+
+void zte_write_space_info_to_web(webs_t wp)
+{
+	if ((NULL == wp)) {
+		return;
+	}
+	char sd_card_total_size[NV_ITEM_VALUE_STRING_LEN] = {0};
+	char sd_card_avi_space[NV_ITEM_VALUE_STRING_LEN] = {0};
+
+	(void)zte_web_read("sd_card_total_size", sd_card_total_size);
+	(void)zte_web_read("sd_card_avi_space", sd_card_avi_space);
+
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"sd_card_total_size\":\"%s\",\"sd_card_avi_space\":\"%s\"}"),
+	                sd_card_total_size, sd_card_avi_space);
+}
+
+
+/**** *****/
+//check whether the  dir exist or not
+zte_httpshare_return_e_type zte_httpshare_check_and_creat_dir(char *path)
+{
+	if (!path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_check_and_creat_dir: check dir path null.\n");
+		return ZTE_HTTPSHARE_FAILURE;
+	}
+	if (-1 == access(path, F_OK)) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpshare_check_and_creat_dir:%s does not exist,socreate it.\n", ZTE_HTTPSHARE_DB_DIR);
+		if (-1 == mkdir(path, 0777)) {  		/*lint !e1055*/
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_check_and_creat_dir:failed to create db dir.\n");
+			return ZTE_HTTPSHARE_FAILURE;
+		}
+	}
+	return ZTE_HTTPSHARE_SUCCESS;
+}
+
+zte_httpshare_db_result_e_type zte_httpshare_create_table()
+{
+	zte_httpshare_db_result_e_type result = ZTE_HTTPSHARE_DB_OK;
+
+	//create httpshare table
+	result = zte_httpshare_db_exec_sql(ZTE_CREATE_TABLE_HTTPSHARE_SQL, NULL, NULL);
+
+	if (ZTE_HTTPSHARE_DB_OK != result) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_create_table:create httpshare table result is %d\n", result);
+		return result;
+	}
+	return result;
+}
+
+//based path,check the file wether in Tcard
+int zte_check_file_exist(char * path)
+{
+
+	if (!path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_check_file_exist:file path null.\n");
+		return 0;
+	}
+
+	if (-1 == access(path, F_OK)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_check_file_exist path=%s  (file not exist)\n", path);
+		return 0;
+
+	} else {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_check_file_exist path=%s  (file exist)\n", path);
+		return 1;
+	}
+}
+
+
+int zte_check_sdcard_exist()
+{
+	int ret = 0;
+
+	FILE *fd = NULL;
+
+	char size_sd[ZTE_HTTPSHARE_LEN_12] = {0};
+
+	//system("echo /dev/mmcblk0>/proc/proc_sd/file");
+
+    if(access("/sys/kernel/debug/mmc1/present", R_OK) != 0)
+    {
+		slog(MISC_PRINT, SLOG_ERR, "[httpshare] zte_check_sdcard_exist file not exist!\n");
+        return ret;	
+    }	
+
+	//fd = popen("cat /proc/proc_sd/size","r");
+	fd = popen("cat /sys/kernel/debug/mmc1/present", "r");
+	//printf("[httpshare]zte_check_sdcard_exist cat /sys/kernel/debug/mmc1/present\n");
+
+	if (fd == NULL) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_check_sdcard_exist popen file = NULL\n");
+		return ret;
+	}
+	if (!feof(fd) && fgets(size_sd, sizeof(size_sd), fd) != NULL) {
+		ret = atoi(size_sd);
+	}
+
+	pclose(fd);
+
+	//printf("[httpshare]zte_check_sdcard_exist :get size data = %d\n",ret);
+
+	return ret;
+}
+
+
+// Get current mode from nv
+zte_httpshare_current_mode_type zte_httpshare_get_current_mode()
+{
+	char nv_item[ZTE_HTTPSHARE_DEFAULT_LEN] = {0};
+	(void)zte_web_read(STR_SDCARD_MODE_OPT, nv_item);
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]sdcard_mode_option:%s\n", nv_item);
+
+	if (0 == strcmp("1", nv_item)) {
+		return  ZTE_HTTPSHARE_HTTPSHARE;
+	} else {
+		return ZTE_HTTPSHARE_USB;
+	}
+
+}
+int zte_httpshare_change_current_mode(zte_httpshare_current_mode_type mode)
+{
+	char cmd[ZTE_HTTPSHARE_DEFAULT_LEN] = {0};
+	int cdrom = -1;
+
+	if (ZTE_HTTPSHARE_HTTPSHARE == mode) {
+		if (!zte_mount_httpshare()) { //½«dev½Úµã¹ÒÔØÎª/mnt/jffs2/mmc2
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]change to %d mode faile\n", mode);
+			(void)zte_web_write(STR_SDCARD_MODE_OPT, "0");
+
+                    cdrom = zte_get_cdrom();
+                    slog(MISC_PRINT, SLOG_ERR,"zte_mount_httpshare:cdrom=%d\n",cdrom);
+                    if(cdrom == 0)
+                        zte_httpshare_call_system_echo("/bin/echo dev/mmcblk0 > /sys/devices/platform/zx29_hsotg.0/gadget/lun0/file");
+                    else if(cdrom == 1)
+			    zte_httpshare_call_system_echo("/bin/echo dev/mmcblk0 > /sys/devices/platform/zx29_hsotg.0/gadget/lun1/file");
+			return ZTE_CHANGE_MODE_ERROR;
+		}
+		slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]change to %d mode suc.\n", mode);
+		(void)zte_web_write(STR_SDCARD_MODE_OPT, "1");
+	} else {
+		zte_httpshare_check_upload_file();
+
+		zte_mount_usb();
+		slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]change to %d mode suc.\n", mode);
+
+		(void)zte_web_write(STR_SDCARD_MODE_OPT, "0");
+	}
+	return ZTE_CHANGE_MODE_OK;
+
+}
+
+int  zte_init_sdcard_mode()
+{
+	if (zte_check_sdcard_exist() > 0) {
+		(void)zte_web_write(NV_SD_CARD_STATE, "1");
+
+		if (ZTE_HTTPSHARE_USB == zte_httpshare_get_current_mode()) {
+			return zte_httpshare_change_current_mode(ZTE_HTTPSHARE_USB);
+		} else {
+			return zte_httpshare_change_current_mode(ZTE_HTTPSHARE_HTTPSHARE);
+		}
+	} else {
+		(void)zte_web_write(NV_SD_CARD_STATE, "0");
+		zte_del_file(SD_CARD_PATH);
+		return ZTE_CHANGE_MODE_ERROR;
+	}
+}
+
+void zte_httpshare_init()
+{
+
+	//zte_init_user_list(&pp_header);				//creat user nod
+	zte_init_user_list();
+	(void)zte_del_file(ZTE_HTTPSHARE_DB_PATH);
+
+	if (ZTE_HTTPSHARE_SUCCESS != zte_httpshare_check_and_creat_dir(ZTE_HTTPSHARE_DB_DIR)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_init:zte_httpshare_check_and_creat_dir ZTE_HTTPSHARE_DB_DIR fail!\n");
+		return;
+	}
+	if (ZTE_HTTPSHARE_DB_OK != zte_httpshare_create_table()) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_init:zte_httpshare_create_table fail!\n");
+		return;
+	}
+
+	zte_init_sdcard_mode();
+}
+
+
+int sd_card_isExist()
+{
+	char sdcard_state[ZTE_HTTPSHARE_DEFAULT_LEN] = {0};
+	(void)zte_web_read(NV_SD_CARD_STATE, sdcard_state);
+	if (0 == strcmp("0", sdcard_state)) {
+		printf("[httpshare]sd_card_isExist:sdcard no exist.\n");
+		return 0;
+	} else if (0 == strcmp("1", sdcard_state)) {
+		return 1;
+	} else {
+		printf("[httpshare]sd_card_isExist:sdcard state error.\n");
+		return 0;
+	}
+
+}
+
+boolean zte_httpshare_check_patch_inlegal(const char *path_source)
+{
+	char *token = NULL;
+
+	if (0 == strncmp(path_source, HTTPSHARE_PATH_INLEGAL, 8)) {
+		if (path_source[8] == '/' || path_source[8] == '\0') {
+			return TRUE;
+		}
+	}
+
+	if ((token = strchr(path_source, 39)) != NULL) {  // 39 means '
+		while (*token++ == 32); // 32 means (space)
+
+		switch (*token) {
+		case 59:          // 59 means ;
+		case 124:        // 124 means |
+			return TRUE;
+		case 38:         // 38 means &
+			if (*(++token) == 38)
+				return TRUE;
+		default:
+			return FALSE;
+		}
+	}
+
+	return FALSE;
+}
+
+int zte_httpshare_db_id_cb(void *fvarg, int line, char **zresult, char **lname)
+{
+	if (1 > line) {
+		printf("[httpshare]zte_httpshare_db_id_cb:record no data.\n");
+		return -1;
+	}
+	*(int*)fvarg = atoi(zresult[0]);
+
+	return 0;
+}
+
+int  zte_httpshare_check_record(char *ip)
+{
+	if (!ip) {
+		printf("[httpshare]zte_httpshare_check_record:para null.\n");
+		return -1;
+	}
+
+	int id = 0;
+	zte_httpshare_db_result_e_type result = ZTE_HTTPSHARE_DB_OK;
+
+	char sql[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 40] = {0};
+
+	snprintf(sql, sizeof(sql), "select id from %s where ip = '%s' ", ZTE_HTTPSHARE_DB_NAME, ip);
+
+	result = zte_httpshare_db_exec_sql(sql, zte_httpshare_db_id_cb, &id);
+	(void)sleep(2);
+	if (ZTE_HTTPSHARE_DB_OK != result) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_check_record:result %d\n", result);
+	}
+
+	return id;
+
+}
+
+
+zte_httpshare_db_result_e_type  zte_httpshare_update_record(char *ip, char *path)
+{
+
+	if ((!ip) || (!path)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_update_record:para null.\n");
+		return ZTE_HTTPSHARE_DB_ERROR;
+	}
+
+	zte_httpshare_db_result_e_type result = ZTE_HTTPSHARE_DB_OK;
+
+	char sql[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 40] = {0};
+	snprintf(sql, sizeof(sql), "update %s set path =\"%s\"  where ip = \"%s\" ", ZTE_HTTPSHARE_DB_NAME, path, ip);
+
+	result = zte_httpshare_db_exec_sql(sql, NULL, NULL);
+	if (ZTE_HTTPSHARE_DB_OK != result) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_update_record:update record result %d\n", result);
+		return result;
+	}
+
+	return result;
+}
+
+int zte_httpshare_getpath_cb(void *fvarg, int line, char **zresult, char **lname)
+{
+	if (1 > line) return -1;
+	memcpy(fvarg, zresult[0], strlen(zresult[0]));
+	return 0;
+}
+
+zte_httpshare_db_result_e_type  zte_httpshare_get_record(char *ip, char *path)
+{
+	if ((!ip) || (!path)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_get_record:para null.\n");
+		return ZTE_HTTPSHARE_DB_ERROR;
+	}
+	zte_httpshare_db_result_e_type result = ZTE_HTTPSHARE_DB_OK;
+
+	char sql[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 40] = {0};
+	snprintf(sql, sizeof(sql), "select path from %s where ip = '%s' ", ZTE_HTTPSHARE_DB_NAME, ip);
+
+	result = zte_httpshare_db_exec_sql(sql, zte_httpshare_getpath_cb, path);
+	(void)sleep(1);
+	if (ZTE_HTTPSHARE_DB_OK != result) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_get_record:update record result %d\n", result);
+		return result;
+	}
+
+	return result;
+}
+
+
+zte_httpshare_db_result_e_type  zte_httpshare_insert_path_to_db(char * ip, char *path)
+{
+
+	if ((!ip) || (!path)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_insert_path_to_db:para null.\n");
+		return ZTE_HTTPSHARE_DB_ERROR;
+	}
+
+	zte_httpshare_db_result_e_type result = ZTE_HTTPSHARE_DB_OK;
+
+	char sql[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 40] = {0};
+	snprintf(sql, sizeof(sql), "insert into %s (ip,path) values (\"%s\",\"%s\")", ZTE_HTTPSHARE_DB_NAME, ip, path);
+
+	result = zte_httpshare_db_exec_sql(sql, NULL, NULL);
+
+	if (ZTE_HTTPSHARE_DB_OK != result) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_insert_path_to_db:result %d\n", result);
+		return result;
+	}
+	return result;
+
+}
+
+
+void zte_change_file_time(char *path_source, char*new_time)
+{
+	char *ptr = NULL;
+	int i = 0;
+	struct utimbuf times;
+	if ((!new_time) || (!path_source)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_change_file_time src==NULL\n");
+
+		return;
+	}
+
+	if ((!strlen(path_source)) || (!strlen(new_time))) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_change_file_time src==empty\n");
+
+		return;
+	}
+
+	if (0 == atoi(new_time)) {
+		times.modtime = 1378807200;    //1378807200   2013-09-10 10:00:00
+		times.actime = 1378807200;     //1631268000   2021-09-10 10:00:00
+	} else {
+		times.modtime = atoi(new_time);
+		times.actime = atoi(new_time);
+	}
+	utime(path_source, &times);
+
+	ptr = path_source + strlen(path_source) - 1;
+	for (i = strlen(path_source); i > 0; i--) {
+		if (*ptr == '/')
+			break;
+		ptr--;
+	}
+	*ptr = '\0';
+	utime(path_source, &times);
+
+	return;
+}
+static void zte_write_file_record_pro(webs_t wp)
+{
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"result\":"));
+	(void)websWrite(wp, T("{\"fileInfo\":["));
+
+}
+
+/*
+struct dirent
+{
+	long d_ino; // inode number Ë÷Òý½ÚµãºÅ
+	off_t d_off; // offset to this dirent ÔÚĿ¼ÎļþÖÐµÄÆ«ÒÆ
+	unsigned short d_reclen; // length of this d_name ÎļþÃû³¤
+	unsigned char d_type; // the type of d_name ÎļþÀàÐÍ
+	char d_name [NAME_MAX+1]; /* file name (null-terminated) ÎļþÃû£¬×256×Ö·û
+}
+*/
+
+int zte_write_filerecord_alphasort(webs_t wp, char*path)
+{
+	struct dirent **namelist;
+	int n = 0;
+	int file_count = 0;
+	n = scandir(path, &namelist, 0, alphasort);
+	zte_write_file_record_pro(wp);
+	if (n < 3) {
+		(void)websWrite(wp, T("],\"totalRecord\":\"%d\"}}"), file_count);
+		if (n <= 0) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_write_filerecord_alphasort: scandir n=%d.\n", n);
+			free(namelist);
+			return 1;
+		}
+		while (n--) {
+
+			free(namelist[n]);
+		}
+		free(namelist);
+		return 1;
+	}
+	char *file_path = NULL;
+	file_path = (char*)malloc(ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1);
+	if (!file_path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_write_filerecord_alphasort, malloc error!\n");
+		(void)websWrite(wp, T("],\"totalRecord\":\"%d\"}}"), file_count);
+		while (n--) {
+			slog(MISC_PRINT, SLOG_DEBUG,"namelist[%d]:%s\n", n, namelist[n]->d_name);
+			free(namelist[n]);
+		}
+		free(namelist);
+		return 1;
+	}
+	int i = 0;
+	zte_file_record_s_type     record_ptr;
+	struct stat 	fileinfo;
+	for (i = 0; i < n; i++) {
+		if (!strcmp(namelist[i]->d_name, ".") || !strcmp(namelist[i]->d_name, "..")) {
+			continue;
+		}
+		memset(file_path, 0, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1);
+		snprintf(file_path, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1, "%s/%s", path, namelist[i]->d_name);
+
+		errno = 0;
+		if (stat(file_path, &fileinfo) < 0) {
+			//printf("[httpshare]zte_write_filerecord_alphasort stat < 0\n");
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_write_filerecord_alphasort stat : %s[%s]\n", strerror(errno),file_path);
+			continue;
+		}
+		file_count++;
+		memset(&record_ptr, 0, sizeof(record_ptr));
+		snprintf(record_ptr.fileName, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1, "%s", namelist[i]->d_name);
+		snprintf(record_ptr.lastUpdateTime, ZTE_HTTPSHARE_DEFAULT_LEN, "%lu", fileinfo.st_mtime);
+		if (S_ISDIR(fileinfo.st_mode)) {
+			snprintf(record_ptr.attribute, ZTE_HTTPSHARE_DEFAULT_LEN, "%s", ZTE_FOLDER_STR);
+		} else {
+			snprintf(record_ptr.attribute, ZTE_HTTPSHARE_DEFAULT_LEN, "%s", ZTE_FILE_STR);
+			record_ptr.size = fileinfo.st_size;
+		}
+
+		if (file_count == 1) {
+			(void)websWrite(wp, T("{\"fileName\":\"%s\",\"attribute\":\"%s\",\"size\":\"%u\",\"lastUpdateTime\":\"%s\"}"),
+			                record_ptr.fileName, record_ptr.attribute, record_ptr.size, record_ptr.lastUpdateTime);
+		} else {
+			(void)websWrite(wp, T(",{\"fileName\":\"%s\",\"attribute\":\"%s\",\"size\":\"%u\",\"lastUpdateTime\":\"%s\"}"),
+			                record_ptr.fileName, record_ptr.attribute, record_ptr.size, record_ptr.lastUpdateTime);
+		}
+	}
+	(void)websWrite(wp, T("],\"totalRecord\":\"%d\"}}"), file_count);
+	free(file_path);
+	file_path = NULL;
+	while (n--) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_write_filerecord_alphasort:namelist[%d]->%s\n", n, namelist[n]->d_name);
+		free(namelist[n]);
+	}
+	free(namelist);
+	namelist = NULL;
+	return 0;
+
+}
+
+
+int zte_write_filerecord_alphasort_page(webs_t wp, char*path, int page_index)
+{
+	struct dirent **namelist;
+	int n = 0;
+	int file_count = 0;
+
+	int i = 0;
+	zte_file_record_s_type     record_ptr;
+	struct stat 	fileinfo;
+	char *file_path = NULL;
+	int begin_index = (page_index - 1) * ZTE_HTTPSHARE_MAX_NUM_SHOW_RECORD;
+	int end_index = page_index * ZTE_HTTPSHARE_MAX_NUM_SHOW_RECORD - 1;
+
+	n = scandir(path, &namelist, 0, alphasort);
+
+	zte_write_file_record_pro(wp);
+	if (n < 3) {
+		(void)websWrite(wp, T("],\"totalRecord\":\"%d\"}}"), file_count);
+
+		if (n <= 0) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_write_filerecord_alphasort_page scandir n=%d.\n", n);
+			free(namelist);
+			return 1;
+		}
+		while (n--) {
+			//printf("%s\n",namelist[n]->d_name);
+			free(namelist[n]);
+		}
+		free(namelist);
+		return 1;
+	}
+	file_path = (char*)malloc(ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1);
+	if (!file_path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_write_filerecord_alphasort_page:list file memory fail!\n");
+		(void)websWrite(wp, T("],\"totalRecord\":\"%d\"}}"), file_count);
+		while (n--) free(namelist[n]);
+		free(namelist);
+		return 1;
+	}
+
+	for (i = 0; i < n; i++) {
+		if (!strcmp(namelist[i]->d_name, ".") || !strcmp(namelist[i]->d_name, "..")) {
+			if (i <= begin_index) {
+				begin_index += 1;
+				end_index += 1;
+			} else {
+				end_index += 1;
+			}
+			continue;
+		}
+
+		if ((i < begin_index))continue;
+
+		if (i > end_index)break;
+
+		memset(file_path, 0, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1);
+		snprintf(file_path, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1, "%s/%s", path, namelist[i]->d_name);
+		if (stat(file_path, &fileinfo) < 0) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_write_filerecord_alphasort_page stat %s[%s]\n", strerror(errno),file_path);
+			continue;
+		}
+
+		file_count++;
+		memset(&record_ptr, 0, sizeof(record_ptr));
+		snprintf(record_ptr.fileName, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1, "%s", namelist[i]->d_name);
+		snprintf(record_ptr.lastUpdateTime, ZTE_HTTPSHARE_DEFAULT_LEN, "%lu", fileinfo.st_mtime);
+		if (S_ISDIR(fileinfo.st_mode)) {
+			snprintf(record_ptr.attribute, ZTE_HTTPSHARE_DEFAULT_LEN, "%s", ZTE_FOLDER_STR);
+		} else {
+			snprintf(record_ptr.attribute, ZTE_HTTPSHARE_DEFAULT_LEN, "%s", ZTE_FILE_STR);
+			record_ptr.size = fileinfo.st_size;
+		}
+		if (file_count == 1) {
+			(void)websWrite(wp, T("{\"fileName\":\"%s\",\"attribute\":\"%s\",\"size\":\"%u\",\"lastUpdateTime\":\"%s\"}"),
+			                record_ptr.fileName, record_ptr.attribute, record_ptr.size, record_ptr.lastUpdateTime);
+		} else {
+			(void)websWrite(wp, T(",{\"fileName\":\"%s\",\"attribute\":\"%s\",\"size\":\"%u\",\"lastUpdateTime\":\"%s\"}"),
+			                record_ptr.fileName, record_ptr.attribute, record_ptr.size, record_ptr.lastUpdateTime);
+		}
+	}
+	(void)websWrite(wp, T("],\"totalRecord\":\"%d\"}}"), n - 2);
+	free(file_path);
+	file_path = NULL;
+	while (n--) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_write_filerecord_alphasort_page:namelist[%d]->%s\n", n, namelist[n]->d_name);
+		free(namelist[n]);
+	}
+	free(namelist);
+	namelist = NULL;
+	return 0;
+}
+
+
+
+// creat a new document
+int zte_create_document(char* path)
+{
+	if (!path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_create_document:path is null\n");
+		return 0;
+	}
+	slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]zte_create_document:create new folder->%s\n", path);
+
+	if (-1 == mkdir(path, 0777)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_create_documentcreate new folder->%s failed\n", path);
+
+		return 0;
+	}
+	(void)zte_httpshare_call_system("/bin/sync");
+
+	return 1;
+
+}
+
+
+int  zte_del_multi_file_record(char* path, char* path1) //0ʧ°Ü£¬1 ³É¹¦£¬2ÓÐÏÂÔØ¼Ç¼
+{
+	int del_res = 1;
+	char *p = path1;
+	int i = 0;
+	char *absolute_path = NULL;
+	char *name = NULL;
+	absolute_path = (char*)malloc(ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1);
+	if (!absolute_path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_del_multi_file_record:multi del abusolute path malloc fail.\n");
+		return 0;
+	}
+	name = (char*)malloc(strlen(path1) + 1);
+	if (!name) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_del_multi_file_record:multi del name  malloc fail.\n");
+		free(absolute_path);
+		absolute_path = NULL;
+		return 0;
+	}
+
+	memset(absolute_path, 0, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1);
+	memset(name, 0, strlen(path1) + 1);
+
+	for (p = path1; *p != '\0'; p++) {
+		if (*p != '*') {
+			name[i] = *p;
+			i++;
+		} else {
+			//·¾¶Ãû³Æ³¤¶È<4096  ;  ÎļþÃû³¤¶È<255
+			if ((strlen(name) > 255) || ((strlen(name) + strlen(path)) > 4095)) {
+				slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_del_multi_file_record:filename/path too long\n");
+
+				free(name);
+				free(absolute_path);
+				name = absolute_path =  NULL;
+				return 0;
+			}
+
+			snprintf(absolute_path, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1, "%s/%s", path, name);
+
+// added by fenglei for security   begin   20141029
+			if (zte_httpshare_check_patch_inlegal(absolute_path)) {
+				slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_del_multi_file_record:check del path is legal or not %s\n", absolute_path);
+				free(name);
+				free(absolute_path);
+				name = absolute_path =  NULL;
+				return 0;
+			}
+// added by fenglei for security   end   20141029
+			int check_result = -1;
+			if (0 == (check_result = zte_check_download_file(absolute_path))) { //ÎÞÏÂÔØ¼Ç¼
+				(void)zte_del_file(absolute_path);
+			}
+
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_del_multi_file_record:check result->%d.\n", check_result);
+
+			if (access(absolute_path, F_OK) == 0) {
+				slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_del_multi_file_record:del file fail.\n");
+				if (0 == check_result) { //²»´æÔڼǼ£¬É¾³ýʧ°Ü£¬·µ»ØÊ§°Ü
+					del_res = 0;
+				} else {
+					del_res = 2; //´æÔڼǼ£¬É¾³ýʧ°Ü£¬·µ»Øprocessing
+				}
+				free(name);
+				free(absolute_path);
+				name = absolute_path =  NULL;
+				return del_res;
+			} else {
+				zte_httpshare_call_system("/bin/sync"); //remove file from sdcard on time
+			}
+			memset(absolute_path, 0, ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1);
+			memset(name, 0, strlen(path1) + 1);
+			i = 0;
+		}
+	}
+
+	free(name);
+	free(absolute_path);
+	name = absolute_path =  NULL;
+	return del_res;
+}
+
+
+
+/*******************
+
+		GOFORM ÒµÎñÏà¹Ø start
+
+ *******************/
+
+
+void zte_httpShare_auth_get(webs_t wp)
+{
+	int status = 0;
+	status = sd_card_isExist();
+
+	if (0 == status) {
+		zte_write_result_to_web(wp, NO_SDCARD);
+		return;
+	}
+	zte_write_auth_to_web(wp);
+}
+
+void zte_httpShare_getcard_name(webs_t wp)
+{
+	int status = 0;
+	status = sd_card_isExist();
+	if (0 == status) {
+		zte_write_result_to_web(wp, NO_SDCARD);
+		return;
+	}
+	zte_write_tcard_name_to_web(wp);
+
+}
+void zte_httpShare_getcard_value(webs_t wp)
+{
+	if (!sd_card_isExist()) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_getcard_value  no sdcard.\n");
+		zte_write_result_to_web(wp, NO_SDCARD);
+		return;
+	}
+	get_used_space_size();
+
+	zte_write_space_info_to_web(wp);
+}
+
+
+int zte_httpShare_chage_to_mode(webs_t wp, char* mode)
+{
+	int set_mode = -1;
+	if (!strcmp("http_share_mode", mode)) {
+		set_mode = ZTE_HTTPSHARE_HTTPSHARE;
+	} else {
+		set_mode = ZTE_HTTPSHARE_USB;
+	}
+	if (set_mode == zte_httpshare_get_current_mode()) {
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		if (zte_httpshare_change_current_mode(set_mode)) {
+			zte_write_result_to_web(wp, SUCCESS);
+		} else {
+			zte_write_result_to_web(wp, FAILURE);
+		}
+	}
+	return 1;
+}
+
+
+
+/**********************************************************************
+* Function:         zte_httpShare_modeset
+* Description:
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/12   V1.0
+**********************************************************************/
+void zte_httpShare_modeset(webs_t wp)
+{
+	char *mode = websGetVar(wp, "mode_set", T(""));
+
+	//printf("[httpshare]zte_httpShare_modeset:set to mode->%s\n", mode);
+
+	if (!sd_card_isExist()) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_modeset:no sdcard.\n");
+		zte_write_result_to_web(wp, NO_SDCARD);
+		return;
+	}
+	//printf("[httpshare]zte_httpShare_modeset:sdcard exist.\n");
+	if ((0 != strcmp("http_share_mode", mode)) && (0 != strcmp("usb_mode", mode))) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (zte_check_downloading_file() > 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]downloading file,try later.\n");
+		zte_write_result_to_web(wp, PROCESSING);
+		return;
+	}
+	zte_httpShare_chage_to_mode(wp, mode);
+
+	return;
+}
+
+
+/**********************************************************************
+* Function:         zte_httpShare_enterFold
+* Description:
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/12   V1.0
+**********************************************************************/
+void zte_httpShare_enterFold(webs_t wp)
+{
+	char *path_source =  NULL;
+	char *path_web_tmp = websGetVar(wp, "path_SD_CARD", T(""));
+
+	int path_source_len = 0;
+
+	char *path_web = neutralize(path_web_tmp);
+	if(path_web == NULL){
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_enterFold fail %s.\n", path_web_tmp);
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	path_source_len = strlen(path_web) + 30;
+
+//    path_source = (char *)malloc(strlen(path_web)+5);
+	path_source = (char *)malloc(path_source_len); //²âÊÔ:SD_CARD_PATH_PR=/mnt/jffs2
+
+	if (!path_source) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_enterFold malloc fail\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	int page_index = 0;
+	char* index_page = websGetVar(wp, "indexPage", T(""));
+
+	page_index = atoi(index_page);
+	if(page_index < 0 || page_index >  INT_MAX-1)
+	{
+	    page_index = 1;  
+	}
+
+	
+	char * ip = websGetRequestIpaddr(wp);
+	memset(path_source, 0, path_source_len);
+	snprintf(path_source, path_source_len, "%s%s", SD_CARD_PATH_PR, path_web);
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpShare_enterFold: path->%s, page_index->%d, ip->%s.\n", path_source, page_index, ip);
+
+	if (!sd_card_isExist()) {
+		zte_write_result_to_web(wp, NO_SDCARD);
+		goto end;
+	}
+
+	if (!zte_check_file_exist(path_source)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_enterFold path inexist\n");
+		zte_write_result_to_web(wp, FAILURE);
+		goto end;
+		//return;
+	}
+//added by fenglei for security begin    20141029
+	if (zte_httpshare_check_patch_inlegal(path_source)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_enterFold path %s inlegal\n", path_source);
+		zte_write_result_to_web(wp, FAILURE);
+		goto end;
+	}
+	//added by fenglei for security end    20141029
+	if (zte_httpshare_check_record(ip)) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]db have record \n");
+		(void)zte_httpshare_update_record(ip, path_source);
+	} else {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]it is a new user update httpshare db \n");
+		(void)zte_httpshare_insert_path_to_db(ip, path_source);
+	}
+
+	zte_httpshare_check_upload_file();
+
+	if ('\0' == (*index_page)) { //ÎļþСÓÚ10¸ö£¬ÔÚÒ»Ò³ÖÐÏÔʾ
+		(void)zte_write_filerecord_alphasort(wp, path_source);
+	} else { //Îļþ½Ï¶à£¬·ÖÒ³ÏÔʾ£¬Ã¿Ò³×î¶à10¸ö
+		(void)zte_write_filerecord_alphasort_page(wp, path_source, page_index);
+	}
+
+end:
+	free(path_source);
+	path_source = NULL;
+	return;
+}
+
+
+/**********************************************************************
+* Function:         zte_httpShare_new
+* Description:
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/12   V1.0
+**********************************************************************/
+
+void zte_httpShare_new(webs_t wp)
+{
+
+	int new_ret = 0;
+	char *path_web_tmp = websGetVar(wp, "path_SD_CARD", T(""));
+	char *new_time = websGetVar(wp, ZTE_HTTPSHARE_TIME, T(""));
+	char *path_source =  NULL;
+	char *path_web = neutralize(path_web_tmp);
+	if(path_web == NULL){
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_new fail %s.\n", path_web_tmp);
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	int path_source_len = strlen(path_web) + 30;
+
+//	path_source = (char *)malloc(strlen(path_web)+5);
+	path_source = (char *)malloc(path_source_len);
+
+	if (!path_source) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpShare_new malloc fail\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	memset(path_source, 0, path_source_len);
+	snprintf(path_source, path_source_len, "%s%s", SD_CARD_PATH_PR, path_web);
+	if (!sd_card_isExist()) {
+		zte_write_result_to_web(wp, NO_SDCARD);
+		goto end;
+	}
+	//added by fenglei for security begin	 20141029
+	if (zte_httpshare_check_patch_inlegal(path_source) ||
+	    zte_httpshare_check_patch_inlegal(new_time)) {
+		zte_write_result_to_web(wp, FAILURE);
+		goto end;
+	}
+	//added by fenglei for security end    20141029
+	if (zte_check_file_exist(path_source)) {
+		zte_write_result_to_web(wp, EXIST);
+		goto end;
+	}
+	new_ret = zte_create_document(path_source);
+
+	if (!new_ret) {
+		zte_write_result_to_web(wp, FAILURE);
+	} else {
+		zte_change_file_time(path_source, new_time);
+		zte_httpshare_call_system("/bin/sync");
+		zte_write_result_to_web(wp, SUCCESS);
+	}
+
+end:
+	free(path_source);
+	path_source = NULL;
+	return;
+
+}
+
+
+
+
+/**********************************************************************
+* Function:         zte_httpShare_del
+* Description:
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/12   V1.0
+**********************************************************************/
+
+void zte_httpShare_del(webs_t wp)
+{
+	char *root_web_tmp = websGetVar(wp, "path_SD_CARD", T(""));
+	char *del_path = websGetVar(wp, "name_SD_CARD", T(""));
+	char *root_path =  NULL;
+
+	char *root_web = neutralize(root_web_tmp);
+	if(root_web == NULL){
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_del fail %s.\n", root_web_tmp);
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	int root_path_len = strlen(root_web) + 30;
+	
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpShare_del:dele_path->%s, name->%s.\n", root_web, del_path);
+		
+//    root_path = (char *)malloc(strlen(root_web)+5);
+	root_path = (char *)malloc(root_path_len);
+	if (!root_path) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_del malloc fail.\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	memset(root_path, 0, root_path_len);
+	snprintf(root_path, root_path_len, "%s%s", SD_CARD_PATH_PR, root_web);
+	if (!sd_card_isExist()) {
+		zte_write_result_to_web(wp, NO_SDCARD);
+		goto end;
+	}
+//added by fenglei for security begin    20141029
+	if (zte_httpshare_check_patch_inlegal(del_path)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_del path is inlegal %s\n", del_path);
+		zte_write_result_to_web(wp, FAILURE);
+		goto end;
+	}
+//added by fenglei for security end    20141029
+	switch (zte_del_multi_file_record(root_path, del_path)) {
+	case 0://ʧ°Ü
+		zte_write_result_to_web(wp, FAILURE);
+		break;
+	case 1://³É¹¦
+		zte_write_result_to_web(wp, SUCCESS);
+		break;
+	case 2://ÓÐÏÂÔØ¼Ç¼
+		zte_write_result_to_web(wp, PROCESSING);
+		break;
+	default:
+		break;
+	}
+
+end:
+	free(root_path);
+	root_path = NULL;
+	return;
+}
+
+
+/**********************************************************************
+* Function:         zte_httpShare_auth_set
+* Description:
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/12   V1.0
+**********************************************************************/
+
+void zte_httpShare_auth_set(webs_t wp)
+{
+	char *rw_auth = websGetVar(wp, "HTTP_SHARE_WR_AUTH", T(""));
+	char *file_name = websGetVar(wp, "HTTP_SHARE_FILE", T(""));
+	char  *httpshare_status = websGetVar(wp, NV_HTTPSHARE_STATUS, T(""));
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpShare_auth_set:HTTP_SHARE_STATUS->%s, HTTP_SHARE_WR_AUTH->%s, HTTP_SHARE_FILE->%s\n", httpshare_status, rw_auth, file_name);
+
+	if (!strcmp(httpshare_status, "Disabled")) {
+		(void)zte_web_write(NV_HTTPSHARE_STATUS, httpshare_status);
+	} else {
+		(void)zte_web_write(NV_HTTPSHARE_WR_AUTH, rw_auth);
+		(void)zte_web_write(NV_HTTPSHARE_FILE, file_name);
+		(void)zte_web_write(NV_HTTPSHARE_STATUS, httpshare_status);
+	}
+
+	zte_write_result_to_web(wp, SUCCESS);
+	return;
+}
+
+
+/**********************************************************************
+* Function:         zte_httpShare_rename
+* Description:
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/12   V1.0
+**********************************************************************/
+
+void zte_httpShare_rename(webs_t wp)
+{
+
+	char *old_file_name = NULL;
+	char *new_file_name = NULL;
+	char *old_file_web_tmp = websGetVar(wp, "OLD_NAME_SD_CARD", T(""));
+	char *new_file_web_tmp = websGetVar(wp, "NEW_NAME_SD_CARD", T(""));
+	
+	char *old_file_web = neutralize(old_file_web_tmp);
+	char *new_file_web = neutralize(new_file_web_tmp);
+
+    int check_result = -1;
+	int fd = -1;
+	
+	if(old_file_web == NULL || new_file_web == NULL){
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_rename fail %s  %s.\n", old_file_web_tmp, new_file_web_tmp);
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpShare_rename:old name->%s\n", old_file_web);
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpShare_rename:new name->%s\n", new_file_web);
+//	old_file_name= (char *)malloc(strlen(old_file_web)+5);
+	old_file_name = (char *)malloc(strlen(old_file_web) + 30);
+
+	if (!old_file_name) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_rename malloc fail\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	new_file_name = (char *)malloc(strlen(new_file_web) + 30);
+	if (!new_file_name) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_rename malloc fail\n");
+		zte_write_result_to_web(wp, FAILURE);
+		goto end2;
+	}
+	memset(old_file_name, 0, strlen(old_file_web) + 30);
+	memset(new_file_name, 0, strlen(new_file_web) + 30);
+	snprintf(old_file_name, strlen(old_file_web) + 30, "%s%s", SD_CARD_PATH_PR, old_file_web);
+	snprintf(new_file_name, strlen(new_file_web) + 30, "%s%s", SD_CARD_PATH_PR, new_file_web);
+//added by fenglei for security begin	 20141029
+	if (zte_httpshare_check_patch_inlegal(old_file_name) ||
+	    zte_httpshare_check_patch_inlegal(new_file_name)) {
+		zte_write_result_to_web(wp, FAILURE);
+		goto end;
+	}
+	if (access(old_file_name, F_OK) != 0) {
+		zte_write_result_to_web(wp, NOEXIST);
+		goto end;
+	}
+
+	
+	if ((check_result = zte_check_download_file(old_file_name))) { //ÎÞÏÂÔØ¼Ç¼
+		zte_write_result_to_web(wp, PROCESSING);
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_rename:path is using\n");
+		goto end;
+	}
+//added by fenglei for security end    20141029
+	fd = rename(old_file_name, new_file_name);
+
+	if (fd < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_rename:rename fail fd->%d\n", fd);
+		zte_write_result_to_web(wp, FAILURE);
+	} else {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_rename:rename success, fd->%d\n", fd);
+		zte_httpshare_call_system("/bin/sync"); //write new file from momeroy to sdcard on time
+		zte_write_result_to_web(wp, SUCCESS);
+	}
+
+end:
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_httpShare_rename:end2\n");
+	free(new_file_name);
+	new_file_name = NULL;
+
+end2:
+	free(old_file_name);
+	old_file_name = NULL;
+
+	return;
+}
+
+
+/**********************************************************************
+* Function:         zte_httpShare_enterFold
+* Description:
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/12   V1.0
+**********************************************************************/
+
+void zte_httpShare_check_file(webs_t wp)
+{
+	char *path_web_tmp = websGetVar(wp, "path_SD_CARD", T(""));
+	char *path_source = NULL;
+	char *path_web = neutralize(path_web_tmp);
+	if(path_web == NULL){
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_check_file fail %s.\n", path_web_tmp);
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	int path_source_len = strlen(path_web) + 30;
+
+	if (!sd_card_isExist()) {
+		zte_write_result_to_web(wp, NO_SDCARD);
+		return;
+	}
+	path_source = (char *)malloc(path_source_len);
+	if (!path_source) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpShare_check_file malloc fail\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	memset(path_source, 0, path_source_len);
+	snprintf(path_source, path_source_len, "%s%s", SD_CARD_PATH_PR, path_web);
+
+	if (zte_check_file_exist(path_source)) {
+		zte_write_result_to_web(wp, EXIST); //ÎļþÒÑ´æÔÚ
+	} else { //Îļþ²»´æÔÚ
+		if (zte_check_downloading_file() > 0) {
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]downloading file,try later.\n");
+			zte_write_result_to_web(wp, PROCESSING);
+		} else {
+			zte_write_result_to_web(wp, NOEXIST);
+		}
+	}
+
+	free(path_source);
+	path_source = NULL;
+
+	return;
+}
+
+
+#if 0
+USER_COMMON_INFOR* zte_user_list_insert()
+{
+	USER_COMMON_INFOR* ptr = NULL;
+	USER_COMMON_INFOR* index_ptr = NULL;
+	index_ptr = &pp_header;
+
+	if (!ptr) {
+		ptr = (USER_COMMON_INFOR*)malloc(sizeof(USER_COMMON_INFOR));
+	}
+
+	if (!ptr) {
+		printf("[httpshare]creat user node fail.\n");
+
+		return NULL;
+	} else {
+		while ((index_ptr->next) != NULL) {
+			index_ptr = index_ptr->next;
+		}
+		index_ptr->next = ptr;
+		ptr->next = NULL;
+		pp_header.cnt++;
+		return ptr;
+	}
+}
+
+
+
+USER_COMMON_INFOR* zte_get_new_user(webs_t wp)
+{
+
+	USER_COMMON_INFOR* pp_current = NULL;
+	pp_current = zte_user_list_insert();
+
+	if (NULL != pp_current) {
+		printf("[httpshare]creat new user node.\n");
+		memset(pp_current, 0, sizeof(USER_COMMON_INFOR));
+		return pp_current;
+	} else {
+		printf("[httpshare]creat new user node faile.\n");
+		return NULL;
+	}
+}
+
+
+
+USER_COMMON_INFOR* zte_get_user_position(webs_t wp)
+{
+	USER_COMMON_INFOR *pp_current = NULL;
+	pp_current = pp_header.next;
+
+	a_assert(pp_current->address);
+	a_assert(websGetRequestIpaddr(wp));
+
+	while ((pp_current != NULL) && (pp_current->address != NULL) && (websGetRequestIpaddr(wp) != NULL)) {
+		if ((0 == strcmp((char *)websGetRequestIpaddr(wp), (char *)pp_current->address)) && (pp_current->requst_sid == (void*)websGetSid(wp))) {
+			return pp_current;
+		} else {
+			pp_current = pp_current->next;
+		}
+	}
+	return NULL;
+}
+
+USER_COMMON_INFOR* zte_process_user_auth(webs_t wp)
+{
+
+	USER_COMMON_INFOR*  ptr = NULL;
+	ptr = zte_get_user_position(wp);
+	if (NULL == ptr) {
+		ptr = zte_get_new_user(wp);
+		return ptr;
+	} else {
+		return ptr;
+	}
+}
+#endif
+int  zte_malloc_cgi_buff()
+{
+	file_buf_memory_ptr = file_buf_memory;
+	return 1;
+}
+
+int  zte_path_check(webs_t wp)//¼ì²éÉÏ´«ÎļþURLÊÇ·ñºÏ·¨
+{
+	char path_temp[ZTE_HTTPSHARE_FILE_NAME_MAX_LEN] = {0};
+	char *ptr = NULL;
+
+	if (wp->url == NULL) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_path_check error1\n");
+		return 0;
+	}
+
+	if (strlen(wp->url) == 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_path_check error2\n");
+		return 0;
+	}
+	snprintf(path_temp, ZTE_HTTPSHARE_FILE_NAME_MAX_LEN, "%s", wp->url);
+
+	ptr = strstr(path_temp, "/cgi-bin/httpshare");
+	ptr += strlen("/cgi-bin/httpshare")+1;//ptrÖ¸ÏòÃû³ÆÊ××Öĸ
+
+	if (strstr(ptr, "/") != NULL) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_path_check error\n");
+		return 0;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_path_check upload name:%s\n", ptr);
+	return 1;
+}
+
+
+/**³õʼ»¯ÉÏ´«ÎļþÐÅÏ¢**/
+void zte_init_up_infor(USER_COMMON_INFOR*pp_co_info)
+{
+
+	memset(pp_co_info->infor.file_tail_pool, 0, ZTE_PARSE_CGI_TAIL_LEN);
+	pp_co_info->infor.file_head = ZTE_CGI_PARSE_FILE_HEAD_BEGIN;
+	pp_co_info->infor.file_tail = ZTE_CGI_PARSE_FILE_TAIL_BEGIN;
+	pp_co_info->infor.file_tail_pool_len = 0;
+	pp_co_info->infor.file_head_len = 0;
+	pp_co_info->infor.file_tail_len = 0;
+	pp_co_info->infor.data_no = ZTE_CGI_WRITE_THE_FIRST_DATA;
+	pp_co_info->infor.file_tail_addres = ZTE_CGI_PARSE_FILE_TAIL_ADD_BEGIN;
+	pp_co_info->infor.file_raw_size = 0;
+}
+
+/****³õʼ»¯Óû§ÐÅÏ¢*****/
+int  zte_init_user_infor(USER_COMMON_INFOR* pp_co_info, webs_t wp)
+{
+	pp_co_info->requst_sid = websGetSid(wp);
+	pp_co_info->card_full = 0;
+	memset(pp_co_info->address, 0, ZTE_IP_ADDRESS_LENGTH);
+	memset(pp_co_info->UnixYMDTime, 0, ZTE_IP_ADDRESS_LENGTH);
+	memset(pp_co_info->file_name, 0, ZTE_HTTPSHARE_FILE_NAME_MAX_LEN);
+	memset(pp_co_info->path, 0, ZTE_HTTPSHARE_FILE_NAME_MAX_LEN);
+	memcpy((void*)pp_co_info->address, (void*)websGetRequestIpaddr(wp), ZTE_IP_ADDRESS_LENGTH);
+	(void)zte_httpshare_get_record(pp_co_info->address, pp_co_info->path);
+	zte_init_up_infor(pp_co_info);
+	return 1;
+}
+
+int zte_reset_cgi_state(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_reset_cgi_state.\n");
+#if 0 // kw 3
+	if (!zte_malloc_cgi_buff()) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]malloc failed.\n");
+		return 0;
+	}
+#else
+    zte_malloc_cgi_buff();
+#endif
+	if (!zte_path_check(wp)) {
+		return 0;
+	}
+	zte_init_user_infor(&pp_header, wp);
+	file_end = FALSE;
+	memset(file_buf_memory, 0, FILE_BUFFER_LEN);
+	return 1;
+}
+
+uint32 zte_get_sd_free_size(uint32 b_free)
+{
+	struct statvfs file_stat;
+	(void)statvfs(SD_CARD_PATH, &file_stat);
+	b_free = (file_stat.f_bfree) * (file_stat.f_bsize / 512) / 8;
+	return b_free;
+}
+
+int zte_str_index(char* s, char* t) //text    filename=
+{
+	int i = 0;
+	int j = 0;
+	int strindex = 0;
+	int stateindex = 0;
+	if (NULL == s || NULL == t) {
+		return -1;
+	}
+	int len = strlen(t);
+	stateindex = strlen(s) - strlen(t);
+	while ((strindex <= stateindex) && (j < len)) {
+		if (s[i] == t[j]) {
+			i = i + 1;
+			j = j + 1;
+		} else {
+			i = i - j + 1;
+			strindex = i;
+			j = 0;
+		}
+	}
+	if (j == len) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare] file name index->%d.\n", i - len);
+		return (i - len); // filename=  µÄÆðʼϱê
+	} else {
+		return (-1);
+	}
+}
+
+
+int read_upload_info_from_file(const char *file, char *name)
+{
+
+	int fd_tcard_upload;
+	ssize_t read_len  = 0;
+
+	if (NULL == name) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]name == NULL\n");
+		return -1;
+	}
+
+	if (-1 == access(TCARD_UPLOAD_FILE, F_OK)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]file is not exist\n");
+		return -1;
+	}
+
+	errno = 0;
+	if ((fd_tcard_upload = open(TCARD_UPLOAD_FILE, O_RDONLY)) < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]open file failed : %s\n", strerror(errno));
+		return -1;
+	}
+
+	errno = 0;
+
+    read_len = read(fd_tcard_upload, name, HTTPSHARE_BUF_NORMAL_LEN_MAX + 1);
+	if (read_len < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]read file failed : %s\n", strerror(errno));
+	} else {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]read file ,upload name : %s\n", name);
+	}
+
+	close(fd_tcard_upload);
+
+	return 0;
+}
+
+int save_upload_info_to_file(const char *file, char *name)
+{
+	int fd_upload = -1;
+
+	if (name == NULL) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]save_upload_info_to_file error,name == NULL.\n");
+		return 0;
+	}
+
+	if (strlen(name) == 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]save_upload_info_to_file error,name == empty.\n");
+		return 0;
+	}
+
+	errno = 0;
+	fd_upload = open(TCARD_UPLOAD_FILE, O_CREAT | O_WRONLY, 0666);
+	if (-1 == fd_upload) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]save_upload_info_to_file open file failed:%s\n", strerror(errno));
+		return -1;
+	}
+
+	errno = 0;
+	if (write(fd_upload, name, strlen(name)) < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]save_upload_info_to_file write file failed:%s\n", strerror(errno));
+	}
+
+	close(fd_upload);
+	slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]save_upload_info_to_file  save up info.\n");
+	return 0;
+}
+
+static char* neutralize(char *path)
+{
+	if(path == NULL)
+	{
+		return NULL;
+	}
+	/* Ïà¶Ô·¾¶·À»¤ */
+	if (strstr(path, "../"))
+	{
+		return NULL;
+	}
+	
+	/* ϵͳ·¾¶·À»¤ */
+	if (strncmp(path, "/etc/", 5) == 0)
+	{
+		return NULL;
+	}
+	
+	/* null ·ûºÅ·À»¤*/
+	if (strstr(path, "%00"))
+	{
+		return NULL;
+	}
+
+	return path;
+}
+
+void zte_httpshare_check_upload_file()
+{
+	char cname[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1] = {0};
+	char *name = NULL;
+
+	if (0 == read_upload_info_from_file(TCARD_UPLOAD_FILE, cname)) {
+		cname[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN] = 0;
+		name = neutralize(cname);
+		if(name){
+			name[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN] = 0;
+		zte_del_file(name);
+		zte_del_file(TCARD_UPLOAD_FILE);
+		if ((access(name, F_OK) == 0) || (access(TCARD_UPLOAD_FILE, F_OK) == 0)) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_check_upload_file del upload file fail!\n");
+		}
+		memset(file_buf_memory, 0, FILE_BUFFER_LEN);
+		memset(&pp_header, 0, sizeof(USER_COMMON_INFOR));
+		memset(download_file, 0, sizeof(download_file));
+		file_buf_memory_ptr = NULL;
+		tcard_file_size = 0;
+		file_end = FALSE;
+		}
+	}
+}
+
+int zte_get_upload_filename(webs_t wp, USER_COMMON_INFOR * pp_current)
+{
+	char *temp_name = NULL;
+	char URL[ZTE_HTTPSHARE_PATH_NAME_MAX_LEN + 1] = {0};
+
+	//snprintf(URL,sizeof(URL),"%s",wp->url);
+	//printf("[iphone]zte_get_upload_filename URL:%s\n",URL);
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[iphone]zte_get_upload_filename url:%s\n", wp->url);
+	slog(MISC_PRINT, SLOG_DEBUG,"[iphone]zte_get_upload_filename path:%s\n", wp->path);
+
+	if ((wp->path == NULL) || (wp->url == NULL)) {
+		return -1;
+	}
+
+	websDecodeUrl(URL, wp->url, gstrlen(wp->url));
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[iphone]zte_get_upload_filename URL:%s\n", URL);
+
+	if (strlen(URL) <= 0) {
+		return -1;
+	}
+
+	temp_name = strstr(URL, "cgi-bin/httpshare");
+
+	if (temp_name == NULL) {
+		slog(MISC_PRINT, SLOG_ERR,"[iphone]zte_get_upload_filename url  strstr cgi == NULL\n");
+		return -1;
+	}
+	temp_name += strlen("cgi-bin/httpshare")+1;
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[iphone]zte_get_upload_filename temp:%s\n", temp_name);
+
+//	if (temp_name != NULL) {
+		if (strlen(temp_name) == 0) {
+			slog(MISC_PRINT, SLOG_ERR,"[iphone]zte_get_upload_filename url name == NULL,get name from file header\n");
+			return 0;
+		}
+		if (strstr(temp_name, "#") != NULL) {
+			slog(MISC_PRINT, SLOG_ERR,"[iphone]zte_get_upload_filename url name have #,get name from file header\n");
+			return 0;
+		}
+//	}else {
+//		slog(MISC_PRINT, SLOG_ERR,"[iphone]zte_get_upload_filename temp == NULL\n");
+//		return -1;
+//	}
+
+
+    memset(pp_current->file_name, 0, sizeof(pp_current->file_name));
+
+	snprintf(pp_current->file_name, ZTE_HTTPSHARE_FILE_NAME_MAX_LEN, "%s", temp_name);
+	slog(MISC_PRINT, SLOG_DEBUG,"[iphone]zte_get_upload_filename url:%s, temp:%s, pp_header:%s\n", URL, temp_name, pp_current->file_name);
+
+	return 1;
+}
+
+char * zte_get_cgi_filename(webs_t wp, const char* text, USER_COMMON_INFOR * pp_current)
+{
+	char  * head_index = NULL;
+	char *sp_name = NULL;
+	char *time_ptr = NULL;
+	int i = 0 ;
+	int j = 0;
+	int k = 0;
+	int name_head ;
+	sp_name = "filename=";
+	if (NULL == text) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_get_cgi_filename text is null.\n");
+		return NULL;
+	}
+	if (!strlen(pp_current->UnixYMDTime)) {
+		time_ptr = strstr(text, ZTE_HTTPSHARE_TIME);
+		if (time_ptr) {
+			time_ptr = time_ptr + strlen(ZTE_HTTPSHARE_TIME) + 5;
+			while (*time_ptr != 13) {     // \r\n
+				pp_current->UnixYMDTime[k++] = *time_ptr;
+				time_ptr++;
+			}
+			pp_current->UnixYMDTime[k] = '\0';
+		}
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_get_cgi_filename UnixYMDTime is %s.\n", pp_current->UnixYMDTime);
+	}
+
+	name_head = zte_str_index(text, sp_name); //find        'filename='
+	//printf("[httpshare]zte_get_cgi_filename head is %d.\n",name_head);
+	if (name_head > 0) {
+		for (i = name_head; * (text + i) != '\0'; i++) { //ÕÒµ½filename="test.doc"µÄµÚÒ»¸öÒýºÅλÖÃ
+			if (*(text + i) == '"') {
+				name_head = i + 1;//ÉÏ´«ÎļþÃû³ÆÆðʼϱê
+				break;
+			}
+		}
+
+		for (i = name_head; * (text + i) != '"'; i++) {
+			if (*(text + i) == '\\') {
+				name_head = i + 1;
+			}
+		}
+
+		for (i = name_head, j = 0; * (text + i) != '"'; i++, j++) {
+			pp_current->file_name[j] = *(text + i);
+		}
+		pp_current->infor.file_head_len += i;
+
+		head_index = text + i;//head_index Ö¸Ïòfilename= "   "   ÒýºÅ
+		pp_current->file_name[j] = '\0';
+		if(strlen(pp_current->path) == 0){
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]get path NULL\n");
+			return NULL;
+		}
+			
+		if (pp_current->path[strlen(pp_current->path) - 1] != '/')
+			strcat(pp_current->path, "/");
+
+		if (zte_get_upload_filename(wp, pp_current) == -1) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]get filename error\n");
+			return NULL;
+		}
+
+		strcat(pp_current->path, pp_current->file_name);
+
+		save_upload_info_to_file(TCARD_UPLOAD_FILE, pp_current->path);
+	}
+	return head_index;
+}
+
+
+
+char *zte_cgi_parse_file_head(char * buf, USER_COMMON_INFOR*user)
+{
+	char *fdindex = NULL;
+	if (!buf) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_cgi_parse_file_head file head is null\n");
+		return NULL;
+	}
+
+	boolean foud_head_first = FALSE;
+
+	fdindex = buf;
+#if 1
+	while (*fdindex) {
+		if (user->infor.file_head == ZTE_CGI_PARSE_FILE_HEAD_BEGIN) {
+			if ((*fdindex) == 13) { //»Ø³µ
+				user->infor.file_head = ZTE_CGI_PARSE_FINDE_HEAD_FIRST;
+				user->infor.file_head_len++;
+				fdindex++;
+			} else {
+				user->infor.file_head = ZTE_CGI_PARSE_FILE_HEAD_BEGIN;
+				user->infor.file_head_len++;
+				fdindex++;
+			}
+		} else if (user->infor.file_head == ZTE_CGI_PARSE_FINDE_HEAD_FIRST) {
+			if ((*fdindex) == 10) { //»»ÐÐ
+				user->infor.file_head = ZTE_CGI_PARSE_FINDE_HEAD_SEC;
+
+				user->infor.file_head_len++;
+				fdindex++;
+			} else {
+				user->infor.file_head = ZTE_CGI_PARSE_FILE_HEAD_BEGIN;
+			}
+		} else if (user->infor.file_head == ZTE_CGI_PARSE_FINDE_HEAD_SEC) {
+			if ((*fdindex) == 13) {
+				user->infor.file_head = ZTE_CGI_PARSE_FINDE_HEAD_THIRD;
+
+				user->infor.file_head_len++;
+				fdindex++;
+			} else {
+				user->infor.file_head = ZTE_CGI_PARSE_FILE_HEAD_BEGIN;
+			}
+		} else if (user->infor.file_head == ZTE_CGI_PARSE_FINDE_HEAD_THIRD) {
+			if ((*fdindex) == 10) {
+				user->infor.file_head = ZTE_CGI_PARSE_FINDE_FILE_HEAD;
+				user->infor.file_head_len++;
+				fdindex++;
+				slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_cgi_parse_file_head file_head_len %d.\n", user->infor.file_head_len);
+				return fdindex;//Êý¾ÝÆðʼ
+			} else {
+				user->infor.file_head = ZTE_CGI_PARSE_FILE_HEAD_BEGIN;
+			}
+		}
+	}
+#endif
+	return NULL;
+}
+
+
+
+char *zte_cgi_parse_file_tail_address(char *buf, USER_COMMON_INFOR*user)
+{
+	char *fdindex = NULL;
+	if (!buf) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_cgi_parse_file_tail_address file tail is null\n");
+		return NULL;
+	}
+
+	fdindex = buf + ZTE_PARSE_CGI_TAIL_LEN - 1;
+	while ((*fdindex) && (user->infor.file_tail_len < ZTE_PARSE_CGI_TAIL_LEN)) {
+
+		if (user->infor.file_tail_addres == ZTE_CGI_PARSE_FILE_TAIL_ADD_BEGIN) {
+			if ((*fdindex) == 45) { //'-'
+				user->infor.file_tail_addres = ZTE_CGI_PARSE_FINDE_TAIL_ADD_FIRST;
+				user->infor.file_tail_len++;
+				fdindex--;
+			} else {
+				user->infor.file_tail_addres = ZTE_CGI_PARSE_FILE_TAIL_ADD_BEGIN;
+				user->infor.file_tail_len++;
+				fdindex--;
+			}
+		} else if (user->infor.file_tail_addres == ZTE_CGI_PARSE_FINDE_TAIL_ADD_FIRST) {
+			if ((*fdindex) == 10) {
+				user->infor.file_tail_addres = ZTE_CGI_PARSE_FINDE_TAIL_ADD_SEC;
+				user->infor.file_tail_len++;
+				fdindex--;
+			} else {
+				user->infor.file_tail_addres = ZTE_CGI_PARSE_FILE_TAIL_ADD_BEGIN;
+			}
+		} else if (user->infor.file_tail_addres == ZTE_CGI_PARSE_FINDE_TAIL_ADD_SEC) {
+			if ((*fdindex) == 13) {
+				user->infor.file_tail_addres = ZTE_CGI_PARSE_FINDE_FILE_TAIL_ADD;
+				user->infor.file_tail_len++;
+				slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_cgi_parse_file_tail_address found file tail,file_tail_len->%d.\n", user->infor.file_tail_len);
+				return fdindex;//file_tail start
+			} else {
+				user->infor.file_tail_addres = ZTE_CGI_PARSE_FILE_TAIL_ADD_BEGIN;
+			}
+		}
+	}
+	return NULL;
+}
+
+
+char *zte_cgi_parse_file_tail(USER_COMMON_INFOR*pp_current, int left_file_size, char*text, int nbytes)
+{
+	char *fdindex = NULL;
+	char *file_tail = NULL;
+	int  tail_record_size = 0;
+
+	if (!text) {
+		return NULL;
+	}
+
+	if (left_file_size == 0) {
+		if (nbytes >= ZTE_PARSE_CGI_TAIL_LEN) {
+			fdindex = text + (nbytes - ZTE_PARSE_CGI_TAIL_LEN);
+
+			file_tail = zte_cgi_parse_file_tail_address(fdindex, pp_current);
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]file info: tail len->%d.\n", pp_current->infor.file_tail_len);
+			if (file_tail) {
+				pp_current->infor.file_tail_len = strlen(file_tail);
+				slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_cgi_parse_file_tail file tail len is %d\n", pp_current->infor.file_tail_len);
+				slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]file info: tail->%s.\n", file_tail);
+				pp_current->infor.file_tail = ZTE_CGI_PARSE_FINDE_TAIL_IN_FILE;
+				return file_tail;
+			} else {
+				slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_cgi_parse_file_tail file_tail not found\n");
+				return NULL;
+			}
+		} else {
+			fdindex = text;
+			memcpy((pp_current->infor.file_tail_pool + pp_current->infor.file_tail_pool_len), fdindex, nbytes);
+			pp_current->infor.file_tail_pool_len = pp_current->infor.file_tail_pool_len + nbytes;
+			fdindex = pp_current->infor.file_tail_pool;
+			file_tail = zte_cgi_parse_file_tail_address(fdindex, pp_current);
+			if (file_tail) {
+				pp_current->infor.file_tail = ZTE_CGI_PARSE_FINDE_TAIL_IN_POOL;
+				return file_tail;
+			} else {
+				return NULL;
+			}
+		}
+	} else {
+		if ((nbytes + left_file_size) >= ZTE_PARSE_CGI_TAIL_LEN) {
+			tail_record_size = ZTE_PARSE_CGI_TAIL_LEN - left_file_size;
+			fdindex = text + (nbytes - tail_record_size);
+			memcpy((pp_current->infor.file_tail_pool + pp_current->infor.file_tail_pool_len), fdindex, tail_record_size);
+			pp_current->infor.file_tail_pool_len =	tail_record_size + pp_current->infor.file_tail_pool_len;
+			pp_current->infor.file_tail = ZTE_CGI_PARSE_FINDE_TAIL_IN_FILE;
+			return fdindex;
+		} else {
+			fdindex = text;
+			memcpy((pp_current->infor.file_tail_pool + pp_current->infor.file_tail_pool_len), fdindex, nbytes);
+			pp_current->infor.file_tail_pool_len =	nbytes + pp_current->infor.file_tail_pool_len;
+			pp_current->infor.file_tail = ZTE_CGI_PARSE_FINDE_TAIL_PROCESS;
+			return NULL;
+
+		}
+
+	}
+
+}
+
+
+boolean  zte_bufer_combination(char *buf, int size)
+{
+	if ((tcard_file_size + size) < FILE_BUFFER_LEN - WEBS_SOCKET_BUFSIZ) {
+		//printf("[httpshare]zte_bufer_combination tcard_file_size->%d,size->%d.\n",tcard_file_size,size);
+		//printf("[httpshare]zte_bufer_combination FILE_BUFFER_LEN->%d,WEBS_SOCKET_BUFSIZ->%d.\n",FILE_BUFFER_LEN,WEBS_SOCKET_BUFSIZ);
+		memcpy(file_buf_memory_ptr, buf, size);
+		file_buf_memory_ptr = file_buf_memory_ptr + size;
+		tcard_file_size = tcard_file_size + size;
+		//printf("[httpshare]zte_bufer_combination tcard_file_size->%d,size->%d.\n",tcard_file_size,size);
+		return FALSE;
+	} else {
+		//printf("[httpshare]zte_bufer_combination begin to write file \n");
+		memcpy(file_buf_memory_ptr, buf, size);
+
+		file_buf_memory_ptr = file_buf_memory_ptr + size;
+		tcard_file_size = tcard_file_size + size;
+		return TRUE;
+	}
+}
+
+
+int zte_httpshare_write(webs_t wp, USER_COMMON_INFOR*pp_current) // 1 OK;-1 0 error
+{
+	int file_close = -1;
+	int file_handler = -1;
+	//USER_COMMON_INFOR *pp_current = NULL;
+	//if(0 == tcard_file_size)
+	//{
+	//    return -1;
+	//}
+
+	if (NULL == pp_current) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_write:zte_get_user_position failed\n");
+		return -1;
+	}
+	if (1 != zte_check_sdcard_exist()) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_write:zte_get_user_position failed\n");
+		return -1;
+	}
+	file_handler = open(pp_current->path, O_CREAT | O_WRONLY | O_APPEND, 0666);
+
+	if (file_handler < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_write zte write file open file failed\n");
+		return -1;
+	} else {
+		(void)write(file_handler, file_buf_memory, tcard_file_size);
+		file_buf_memory_ptr = file_buf_memory;
+		memset(file_buf_memory, 0, FILE_BUFFER_LEN);
+		tcard_file_size = 0;
+		file_close = close(file_handler);
+		if (file_close < 0) {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_httpshare_write zte write file close file failed\n");
+
+			return -1;
+		}
+		file_handler = -1;
+	}
+	return 1;
+}
+
+int zte_write_file(webs_t wp, char*buf, int file_size, USER_COMMON_INFOR*pp_current) // 1 OK;-1 0 error
+{
+	int result = 0;
+	result = zte_bufer_combination(buf, file_size);
+	if (result == 1) {
+		return zte_httpshare_write(wp, pp_current);
+		//return 1;
+	} else {
+		if (file_end) {
+			return zte_httpshare_write(wp, pp_current);
+			//return 1;
+		} else
+			return 1;
+	}
+}
+
+
+#if 0
+int   zte_process_cgi_write(webs_t wp, char *file_head, uint32 zte_clen, char * text, int nbytes, USER_COMMON_INFOR*pp_current)
+{
+	char *file_tail = NULL;
+	uint32 left_size = 0;
+	int file_close = -1;
+	if ((!text) && (!file_head)) {
+		return -1;
+	}
+	left_size = zte_clen - nbytes;
+
+	if (left_size < ZTE_PARSE_CGI_TAIL_LEN) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_process_cgi_write left_size->%d.nbytes->%d\n", left_size, nbytes);
+		file_tail = zte_cgi_parse_file_tail(pp_current, left_size, text, nbytes); //ÕÒµ½tail  λÖÃ
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]file_tail->%-*.*s.\n", pp_current->infor.file_tail_len, pp_current->infor.file_tail_len, file_tail);
+	}
+
+	if (file_tail) {
+		if (pp_current->infor.data_no == ZTE_CGI_WRITE_THE_FIRST_DATA) {
+			pp_current->infor.file_raw_size = zte_clen; /*get all the data size*/
+			pp_current->infor.data_no = ZTE_CGI_WRITE_THE_SEC_DATA;
+		}
+
+		if (pp_current->infor.file_tail == ZTE_CGI_PARSE_FINDE_TAIL_IN_FILE) {
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_process_cgi_write ZTE_CGI_PARSE_FINDE_TAIL_IN_FILE.\n");
+
+			if (file_tail == file_head) {
+				slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_process_cgi_write it is a null file\n");
+				file_close = close(open(pp_current->path, O_CREAT, 0666));
+				if (file_close < 0) {
+					slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_process_cgi_write zte write file close file failed\n");
+				}
+				return -1;
+
+			}
+			if (file_tail - file_head < 0) {
+				slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_process_cgi_write file_tail-file_head = %d < 0\n", file_tail - file_head);
+				return -1;
+			}
+			slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]file_tail-file_head->%d.\n", file_tail - file_head);
+			(void)zte_write_file(wp, file_head, (file_tail - file_head));
+		} else if (pp_current->infor.file_tail == ZTE_CGI_PARSE_FINDE_TAIL_IN_POOL) {
+			(void)zte_write_file(wp, pp_current->infor.file_tail_pool, (file_tail - pp_current->infor.file_tail_pool));
+		} else {
+			slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_process_cgi_write some erro happened\n");
+		}
+
+	} else {
+		if (pp_current->infor.file_tail != ZTE_CGI_PARSE_FINDE_TAIL_PROCESS) {
+			if (pp_current->infor.data_no == ZTE_CGI_WRITE_THE_FIRST_DATA) {
+				pp_current->infor.file_raw_size = zte_clen; /*get all the data size*/
+
+				(void)zte_write_file(wp, file_head, nbytes - pp_current->infor.file_head_len);
+
+				pp_current->infor.data_no = ZTE_CGI_WRITE_THE_SEC_DATA;
+
+				printf("[httpshare]zte_process_cgi_write file head len-> %d\n", pp_current->infor.file_head_len);
+			} else {
+				(void)zte_write_file(wp, file_head, nbytes);
+			}
+		}
+	}
+	return 0;
+}
+
+#endif
+
+
+// 1 OK;-1 0 error
+int   zte_process_cgi_write(webs_t wp, char *file_head, uint32 zte_clen, char * text, int nbytes, USER_COMMON_INFOR*pp_current)
+{
+	char *file_tail = NULL;
+	uint32 left_size = 0;
+	int file_close = -1;
+	int ret = -1;
+	if ((!text) && (!file_head)) {
+		return -1;
+	}
+	left_size = zte_clen - nbytes;
+
+	if (left_size < ZTE_PARSE_CGI_TAIL_LEN) {
+		file_tail = zte_cgi_parse_file_tail(pp_current, left_size, text, nbytes); //ÕÒµ½tail  λÖÃ
+	}
+
+	if (file_tail) {
+		if (pp_current->infor.data_no == ZTE_CGI_WRITE_THE_FIRST_DATA) {
+			pp_current->infor.file_raw_size = zte_clen; /*get all the data size*/
+			pp_current->infor.data_no = ZTE_CGI_WRITE_THE_SEC_DATA;
+		}
+
+		if (pp_current->infor.file_tail == ZTE_CGI_PARSE_FINDE_TAIL_IN_FILE) {
+			printf("[httpshare]zte_process_cgi_write ZTE_CGI_PARSE_FINDE_TAIL_IN_FILE.\n");
+
+			//if(file_tail==file_head)
+			//{
+			//   	printf("[httpshare]zte_process_cgi_write it is a null file\n");
+			//    file_close=close(open(pp_current->path, O_CREAT,0666 ));
+			//    if(file_close<0)
+			//    {
+			//        printf("[httpshare]zte_process_cgi_write zte write file close file failed\n");
+			//		return -1;
+			//	}
+			//}
+			if (file_tail - file_head < 0) {
+				printf("[httpshare]zte_process_cgi_write file_tail-file_head = %d < 0\n", file_tail - file_head);
+				return -1;
+			}
+
+			file_end = TRUE;
+			ret = zte_write_file(wp, file_head, (file_tail - file_head), pp_current);
+		} else if (pp_current->infor.file_tail == ZTE_CGI_PARSE_FINDE_TAIL_IN_POOL) {
+			file_end = TRUE;
+			ret = zte_write_file(wp, pp_current->infor.file_tail_pool, (file_tail - pp_current->infor.file_tail_pool), pp_current);
+		} else {
+			printf("[httpshare]zte_process_cgi_write some erro happened\n");
+			ret = 0;
+		}
+
+	} else {
+		if (pp_current->infor.file_tail != ZTE_CGI_PARSE_FINDE_TAIL_PROCESS) {
+			if (pp_current->infor.data_no == ZTE_CGI_WRITE_THE_FIRST_DATA) {
+				pp_current->infor.file_raw_size = zte_clen; /*get all the data size*/
+
+				ret = zte_write_file(wp, file_head, nbytes - pp_current->infor.file_head_len, pp_current);
+
+				pp_current->infor.data_no = ZTE_CGI_WRITE_THE_SEC_DATA;
+			} else {
+				ret = zte_write_file(wp, file_head, nbytes, pp_current);
+			}
+		}
+	}
+	//printf("[zyl]zte_process_cgi_write:ret->%d\n",ret);
+	return ret;
+}
+
+
+
+
+/*¿ªÊ¼½ÓÊÕÎļþÊý¾Ý*/
+int zte_process_cgi_recv(webs_t wp, uint32 zte_clen, char *text, int nbytes)//-1,0 error; 1 OK
+{
+	uint32 b_free = 0;
+	char *file_head = NULL;
+	uint32 clen = zte_clen - 200;
+	USER_COMMON_INFOR *pp_current = &pp_header;
+	//pp_current = zte_process_user_auth(wp);//¶ÁÈ¡zte_reset_cgi_stateÖÐ×¢²áµÄpp_currentÐÅÏ¢
+	//pp_current = zte_get_user_position(wp);
+//	if (NULL == pp_current || NULL == text) { // kw 3 pp_current point to pp_aheader's address, can not be NULL
+	if (NULL == text) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_process_cgi_begin recv failed.\n");
+		return -1;
+	}
+	if (pp_current->card_full) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]T card full %d \n", pp_current->card_full);
+		return 0;
+	}
+
+#if 0
+	b_free = zte_get_sd_free_size(b_free);
+	if (b_free >= 524288) {          //2*1024*1024*1024/512/8       sd card bfree more than 2G
+		printf("[httpshare]T card available size: %d  \n", b_free * 512 * 8 / 1024 / 1024); //ÉÏ´«Îļþ±ØÐëҪСÓÚ2G
+	} else if ((((int)clen) > (b_free * 512 * 8)) && ((int)clen > 0)) { //Ê£Óà¿Õ¼äСÓÚ2G£¬Ôò±È½ÏÉÏ´«Îļþ´óС
+		pp_current->card_full = 1;
+		printf("[httpshare]upload file too larg.\n");//ÈçºÎ֪ͨwebUI
+		return 1;
+	}
+#endif
+	//printf("[httpshare]file info: zte_clen->%d.\n",zte_clen);
+
+	if (pp_current->infor.file_head != ZTE_CGI_PARSE_FINDE_FILE_HEAD) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte upload to fild head.\n");
+
+		file_head = zte_cgi_parse_file_head(zte_get_cgi_filename(wp, text, pp_current), pp_current);
+		//ÕÒµ½Êý¾ÝÆðʼλfile_head
+		if (pp_current->infor.file_head == ZTE_CGI_PARSE_FINDE_FILE_HEAD && file_head) {
+			return zte_process_cgi_write(wp, file_head, zte_clen, text, nbytes, pp_current); // 1 OK;-1 0 error
+		}
+
+		return 1;
+	} else {
+		file_head = text;
+		return zte_process_cgi_write(wp, file_head, zte_clen, text, nbytes, pp_current);
+	}
+}
+
+
+
+void zte_write_httpShare_upload_result_to_web(webs_t wp, char_t *result, char_t*reason)
+{
+	if ((NULL == wp) || (NULL == result)) {
+		return;
+	}
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"result\":\"%s\",\"reason\":\"%s\"}"),
+	                result, reason);
+}
+
+
+
+int zte_check_file_complete(char *temp_file_name, USER_COMMON_INFOR*user)
+{
+
+	int file_should_size = 0;
+	//int ret = 0;
+	struct stat statbuf;
+
+	if (!temp_file_name) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_check_file_complete:path NULL\n");
+
+		return 0;
+	}
+
+	if (!strlen(temp_file_name)) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_check_file_complete:strlen(path)==0\n");
+
+		return 0;
+	}
+
+
+	memset((void*)&statbuf, 0, sizeof(statbuf));
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]path file name is = %s, len is %d\n", temp_file_name, strlen(temp_file_name));
+
+	//ret = stat(temp_file_name, &statbuf);
+
+	//slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]ret is %d\n", ret);
+	if (stat(temp_file_name, &statbuf) < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_check_file_complete stat : %s[%s]\n", strerror(errno),temp_file_name);
+		return 0;
+	}
+	file_should_size = user->infor.file_raw_size - user->infor.file_head_len - user->infor.file_tail_len;
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]the file size shoud is %d,  actul is %d\n",  file_should_size, statbuf.st_size);
+	if (statbuf.st_size  != file_should_size) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]file transfer failed:the file size shoud is %d,  actul is %d \n", file_should_size, statbuf.st_size);
+		return 0;
+	} else {
+		return 1;
+	}
+
+}
+
+
+void zte_release_user(USER_COMMON_INFOR* current)
+{
+	if (!current) return;
+
+	pp_header.cnt--;
+
+	if (pp_header.cnt == 0) {
+		file_buf_memory_ptr = NULL;
+#if 0
+		if (file_buf_memory) {
+			free(file_buf_memory);
+			file_buf_memory = file_buf_memory_ptr = NULL;
+			printf("[httpshare]release memory\n");
+		}
+#endif
+	}
+	free(current);
+	current = NULL;
+}
+
+void   zte_remove_user()
+{
+	zte_del_file(TCARD_UPLOAD_FILE);
+	memset(&pp_header, 0, sizeof(pp_header));
+	memset(file_buf_memory, 0, FILE_BUFFER_LEN);
+	memset(download_file, 0, sizeof(download_file));
+	file_buf_memory_ptr = NULL;
+	tcard_file_size = 0;
+	file_end = FALSE;
+}
+
+int zte_httpshare_proc_end(webs_t wp)
+{
+	websDone(wp, 200);
+	sleep(1);
+	slog(MISC_PRINT, SLOG_NORMAL,"[httpshare]zte_process_cgi_end websDone\n");
+	zte_remove_user();
+	return 1;
+}
+
+void zte_pre_process_cgi_end(webs_t wp)
+{
+	USER_COMMON_INFOR *pp_current  = &pp_header;
+#if 0   // kw 3 pp_current points to pp_haader' address, can not be null
+	if (NULL == pp_current) {
+		slog(MISC_PRINT, SLOG_ERR,"[httpshare]zte_process_cgi_end pp_current NULL.\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+#endif
+	slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_process_cgi_end path =%s\n", pp_current->path);
+	if (pp_current->card_full) {
+		unlink(pp_current->path);
+		zte_write_httpShare_upload_result_to_web(wp, FAILURE, "space_not_enough");
+		return;
+	}
+
+	if (!zte_check_file_complete(pp_current->path, pp_current)) {
+		unlink(pp_current->path);
+		zte_write_httpShare_upload_result_to_web(wp, FAILURE, "data_lost");
+		slog(MISC_PRINT, SLOG_DEBUG,"[httpshare]zte_process_cgi_end data_lost.\n");
+		return;
+	} else {
+		(void)zte_httpshare_call_system("/bin/sync");  //write new file from momeroy to sdcard on time
+		zte_change_file_time(pp_current->path, pp_current->UnixYMDTime);
+		zte_write_result_to_web(wp, SUCCESS);
+		return;
+	}
+
+}
+
+
+int zte_process_cgi_end(webs_t wp)
+{
+	zte_pre_process_cgi_end(wp);
+	zte_httpshare_proc_end(wp);
+	return 1;
+}
+
+