[Bugfix][MD310/R307/R306][bug-view-1170][fota] Pressing the reset button during FOTA upgrade leads to upgrade failure, and disabling the reset button during wefota and web upgrade

Change-Id: I1bf6ffc635c8e70af2c6de4caaa1bb28be12f57d
diff --git a/lynq/CPE_COMMON/ap/app/cgi/cgi.c b/lynq/CPE_COMMON/ap/app/cgi/cgi.c
index 5f56ca5..a7c86f3 100755
--- a/lynq/CPE_COMMON/ap/app/cgi/cgi.c
+++ b/lynq/CPE_COMMON/ap/app/cgi/cgi.c
@@ -4,6 +4,7 @@
 #include <unistd.h>

 #include <fcntl.h>

 #include <errno.h>

+#include "cfg_api.h"

 

 #define BUFFER_SIZE (1024 * 20) // Define the buffer size for each read

 #define FIND_STR_LEN 128 // Define the length of the string to find

@@ -291,10 +292,12 @@
     result = fota_get_update_status(&upgradeStatus);

     if(result < 0)

     {

+        cfg_set("fota_update_flag", "0");

         print_json_response(0, "Fail to read update file");

     }

     else if(upgradeStatus != 0)

     {

+        cfg_set("fota_update_flag", "0");

         print_json_response(0, "Verify update file failed");

     }

     else

@@ -331,12 +334,13 @@
         print_json_response(0, "Invalid CONTENT_LENGTH");

         return 1;

     }

-

+    cfg_set("fota_update_flag", "1");

     // Call the file upload handling function

     if (handle_file_upload(source_filename, target_filename, content_length) != 0)

     {

         system("rm -rf /tmp/firmware_tmp_file");

         print_json_response(0, "File upload failed");

+        cfg_set("fota_update_flag", "0");

         return 1;

     }

 

diff --git a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c
index b294271..0736e32 100755
--- a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c
+++ b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c
@@ -76,6 +76,12 @@
     return 0;

 }

 

+int set_wefota_upgrade_flag_cfg(const char *state)

+{

+    cfg_set("fota_update_flag", state);

+

+    return 0;

+}

 int get_last_work_time(int *time, int *interval)

 {

     if (time == NULL || interval == NULL) {

@@ -99,7 +105,7 @@
     return 0;

 }

 

-static int fota_is_file_exist(const char* path)

+int fota_is_file_exist(const char* path)

 {

 	if ( (path == NULL) || (*path == '\0') )

 		return 0;

@@ -109,7 +115,7 @@
 	return 1;

 }

 

-static int fota_read_file(const char*path, char*buf, size_t sz)

+int fota_read_file(const char*path, char*buf, size_t sz)

 {

 	int fd = -1;

 	size_t cnt;

@@ -140,7 +146,7 @@
 	return cnt;

 }

 

-static int fota_read_file_int(const char* path, int *val)

+int fota_read_file_int(const char* path, int *val)

 {

 	char buf[32];

 	char *end;

@@ -162,21 +168,24 @@
 	return 0;

 }

 

-static int fota_get_update_status(int *fota_status)

+int fota_get_update_status(int *fota_status)

 {

 

 	int status = 0;

 	int ret = 0;

 	if(!fota_is_file_exist(FOTA_UPDATE_STATUS_FILE))

 	{

+		printf("fota_get_update_status file not exist\n");

 		*fota_status = -1;

 		return -1;

 	}

 	ret = fota_read_file_int(FOTA_UPDATE_STATUS_FILE, &status);

 	if(ret < 0) {

+		printf("fota_get_update_status read update_status error\n");

 		*fota_status = -1;

 		return -1;

 	}

+	printf("fota_get_update_status read status:%d\n", status);

 	*fota_status = status;

 	return 0;

 }

@@ -207,6 +216,13 @@
     return 0;

 }

 

+void wefota_upgrade_without_verify(void)

+{

+    system("fota_upi -u recovery");

+

+    return;

+}

+

 int wait_fota_conditions(void)

 {

     // wait for data connected

diff --git a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h
index d374db0..8fc5d63 100755
--- a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h
+++ b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h
@@ -7,6 +7,7 @@
 #define FOTA_INTERVAL_RANDOM (3600 * 2)

 #define FOTA_DOWNLOAD_FILEPATH "/cache/zte_fota/delta.package"

 #define FOTA_UPDATE_STATUS_FILE "/cache/zte_fota/update_status"

+#define FOTA_NEED_CONTINUE_PREVIOUS_UPGRADE 2

 

 int get_iccid(char *iccid);

 int get_imei(char *imei);

@@ -18,5 +19,11 @@
 int set_last_work_time(int time, int interval);

 int start_wefota_install(void);

 int wait_fota_conditions(void);

+int set_wefota_upgrade_flag_cfg(const char *state);

+int fota_is_file_exist(const char* path);

+int fota_read_file(const char*path, char*buf, size_t sz);

+int fota_read_file_int(const char* path, int *val);

+int fota_get_update_status(int *fota_status);

+void wefota_upgrade_without_verify(void);

 

 #endif
\ No newline at end of file
diff --git a/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c b/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c
index d04be2a..099c073 100755
--- a/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c
+++ b/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c
@@ -2,6 +2,7 @@
 #include <string.h>

 #include <stdlib.h>

 #include <unistd.h>

+#include <fcntl.h>

 #include "wefota_main.h"

 #include "wefota_socket.h"

 #include "wefota_device.h"

@@ -122,7 +123,7 @@
 				if (hdr->code == s_wefota_msg_table[s_status].resp_code && hdr->count == s_pack_date_count)

 				{

 					DiffPackDataResp * data = (DiffPackDataResp *)(s_resp + WEFOTA_HEADER_SIZE);

-					printf("proc_get_diff_pack_data recv [data->offset %d offset:%d][data->length %d length:%d]\n", 

+					printf("proc_get_diff_pack_data recv [data->offset %u offset:%u][data->length %u length:%u]\n", 

 					       data->offset, s_diffpack_data_req.offset, data->length, s_diffpack_data_req.length);

 					if (data->offset == s_diffpack_data_req.offset || data->length == s_diffpack_data_req.length) {

 						return received;

@@ -320,7 +321,7 @@
     }

 

     FotaTask * data = (FotaTask *)(s_resp + WEFOTA_HEADER_SIZE);

-	printf("proc_check_task recv:[flag:%d][interval:%d][delay:%d][destVersion:%s]\n", data->flag, data->interval, data->delay, data->destVersion);

+	printf("proc_check_task recv:[flag:%d][interval:%u][delay:%u][destVersion:%s]\n", data->flag, data->interval, data->delay, data->destVersion);

     if (data->flag == 1) {

         strncpy(s_destVersion, data->destVersion, sizeof(s_destVersion));

         printf("exist fota task\n");

@@ -379,7 +380,7 @@
 

     DiffPackInfo * data = (DiffPackInfo *)(s_resp + WEFOTA_HEADER_SIZE);

     s_diffpack_info = *data;

-	printf("proc_get_diff_pack_id [diffPackID:%s][MD5:%s][size:%d]\n", s_diffpack_info.diffPackID, s_diffpack_info.MD5, s_diffpack_info.size);

+	printf("proc_get_diff_pack_id [diffPackID:%s][MD5:%s][size:%u]\n", s_diffpack_info.diffPackID, s_diffpack_info.MD5, s_diffpack_info.size);

     if (s_diffpack_info.size == 0) {

         printf("diff pack size==0\n");

         return ret;

@@ -387,6 +388,7 @@
     return 0;

 }

 

+#if 0

 int proc_get_diff_pack_data(int sock) {

     set_fota_status(FOTA_STATUS_GET_DIFF_PACK_DATA);

 

@@ -445,6 +447,193 @@
     s_costTime = time(NULL) - startTime;

     return 0;

 }

+#endif

+

+static void send_request(int sockfd, struct sockaddr_in *server_addr, int offset)

+{

+    char request[16];

+    snprintf(request, sizeof(request), "%d", offset);

+    sendto(sockfd, request, strlen(request), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));

+}

+

+static int receive_data(int sockfd, int filefd, struct sockaddr_in *server_addr, socklen_t addr_len, int *received)

+{

+    ssize_t bytes_received;

+    struct sockaddr_in from_addr;

+    socklen_t from_len = sizeof(from_addr);

+

+    bytes_received = recvfrom(sockfd, s_resp, WEFOTA_RESP_MAX_LEN, 0, (struct sockaddr *)&from_addr, &from_len);

+    if (bytes_received < 0)

+	{

+		printf("receive_data received < 0\n");

+        perror("recvfrom failed");

+        return -1;

+    }

+

+    DiffPackDataResp * data = (DiffPackDataResp *)(s_resp + WEFOTA_HEADER_SIZE);

+    int offset = data->offset / 1024;

+

+	printf("receive_data received offset:%u\n", data->offset);

+

+    if (received[offset])

+	{

+        return 0;

+    }

+

+	usleep(10000);

+    if (lseek(filefd, offset * 1024, SEEK_SET) < 0)

+	{

+		printf("receive_data lseek error\n");

+        perror("lseek failed");

+        return -1;

+    }

+    if (write(filefd, data->data, bytes_received - WEFOTA_HEADER_SIZE - 39) < 0)

+	{

+		printf("receive_data write error\n");

+        perror("write failed");

+        return -1;

+    }

+

+    received[offset] = 1;

+    printf("write packet %d,%u\n", offset, data->offset);

+

+    return 0;

+}

+

+int proc_get_diff_pack_data(int sock)

+{

+    set_fota_status(FOTA_STATUS_GET_DIFF_PACK_DATA);

+

+    unsigned int startTime = time(NULL);

+    int ret = -1;

+	int i = 0;

+	int recv_packet_retry = 0;

+    int upgradeStatus = -1;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+    int count = wefota_header_init(hdr);

+    printf("proc_get_diff_pack_data send code=%d, count=%d)\n", hdr->code, count);

+

+    fota_get_update_status(&upgradeStatus);

+    printf("proc_get_diff_pack_data fota_get_update_status upgradeStatus=%d\n", upgradeStatus);

+    if (upgradeStatus == 0)

+    {

+        if(fota_is_file_exist(FOTA_DOWNLOAD_FILEPATH))

+        {

+            printf("proc_get_diff_pack_data upgradeStatus=0, Continue upgrading!!\n");

+            return FOTA_NEED_CONTINUE_PREVIOUS_UPGRADE;

+        }

+    }

+	

+    system("rm -rf /cache/zte_fota");

+    system("mkdir /cache/zte_fota");

+

+    int filefd = open(FOTA_DOWNLOAD_FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644);

+    if (filefd < 0)

+	{

+		printf("proc_get_diff_pack_data open failed\n");

+        perror("file open failed");

+        return ret;

+    }

+

+    unsigned int size = s_diffpack_info.size;

+	int total_packets = size / 1024;

+	if (size % 1024 != 0)

+	{

+		total_packets += 1;

+	}

+	int received[total_packets];

+	fd_set read_fds;

+	int max_fd;

+	struct timeval timeout;

+	int select_result = 0;

+	int max_retry_count = 0;

+

+	memset(received, 0, sizeof(received));

+    while (size > 0)

+	{

+        unsigned int len = size > WEFOTA_DIFF_PACK_DATA_MAX_LEN ? WEFOTA_DIFF_PACK_DATA_MAX_LEN : size;

+		s_pack_date_count = len + 39;

+        unsigned int offset = s_diffpack_info.size - size;

+        DiffPackDataReq req = {0};

+        memcpy(req.diffPackID, s_diffpack_info.diffPackID, sizeof(req.diffPackID));

+		req.length = len;

+        req.offset = offset;

+		printf("proc_get_diff_pack_data send request [offset %u][req.diffPackID %s][len %u][s_pack_date_count:%u][offset %u]\n",

+				offset, req.diffPackID, len, s_pack_date_count, offset);

+        memcpy(s_req + WEFOTA_HEADER_SIZE, &req, sizeof(req));

+		s_diffpack_data_req = req;

+		send_message(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr);

+        size -= len;

+    }

+

+	while (1)

+	{

+        FD_ZERO(&read_fds);

+        FD_SET(sock, &read_fds);

+        max_fd = sock;

+		while (1)

+		{

+			timeout.tv_sec = 3;

+			timeout.tv_usec = 0;

+	        select_result = select(max_fd + 1, &read_fds, NULL, NULL, &timeout);

+	        if (select_result < 0)

+			{

+				printf("proc_get_diff_pack_data select failed\n");

+	            perror("select failed");

+	            break;

+	        }

+			else if (select_result == 0)

+			{

+				printf("proc_get_diff_pack_data No data to read, or timeout\n");

+				break;

+			}

+	        if (FD_ISSET(sock, &read_fds))

+			{

+	            if (receive_data(sock, filefd, &s_server2_addr, sizeof(s_server2_addr), received) < 0)

+				{

+	                break;

+	            }

+	        }

+		}

+

+		if (max_retry_count++ > WEFOTA_MAX_RETRY_COUNT)

+		{

+			printf("proc_get_diff_pack_data reach the maximum retry count, break!!!\n");

+			break;

+		}

+

+        int all_received = 1;

+        for (i = 0; i < total_packets; i++)

+		{

+            if (!received[i])

+			{

+				all_received = 0;

+		        unsigned int len = s_diffpack_info.size - i * 1024 > WEFOTA_DIFF_PACK_DATA_MAX_LEN ? WEFOTA_DIFF_PACK_DATA_MAX_LEN : s_diffpack_info.size - i * 1024;

+				s_pack_date_count = len + 39;

+		        unsigned int offset = i * 1024;

+		        DiffPackDataReq req = {0};

+		        memcpy(req.diffPackID, s_diffpack_info.diffPackID, sizeof(req.diffPackID));

+				req.length = len;

+		        req.offset = offset;

+				printf("Re request, send request [offset %u]\n", offset);

+		        memcpy(s_req + WEFOTA_HEADER_SIZE, &req, sizeof(req));

+				s_diffpack_data_req = req;

+				send_message(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr);

+            }

+        }

+

+        if (all_received)

+		{

+            printf("All packets received successfully.\n");

+            break;

+        }

+    }

+

+    close(filefd);

+    s_costTime = time(NULL) - startTime;

+    return 0;

+}

+

 

 int proc_get_diff_pack_end(int sock) {

     set_fota_status(FOTA_STATUS_GET_DIFF_PACK_END);

@@ -531,6 +720,7 @@
 	printf("**********wefota_proc\n");

     int ret = -1;

     int sock = -1;

+	set_wefota_upgrade_flag_cfg("1");

     do {

         sock = create_udp_socket();

         if (sock < 0) {

@@ -579,6 +769,14 @@
 			printf("**********proc_get_diff_pack_data error \n");

             break;

         }

+        else if (ret == FOTA_NEED_CONTINUE_PREVIOUS_UPGRADE)

+        {

+            printf("**********wefota_proc,The last upgrade was not completed, continue upgrading \n");

+            close_udp_socket(sock);

+            sock = -1;

+            wefota_upgrade_without_verify();

+            break;

+        }

 

         ret = proc_get_diff_pack_end(sock);

 

@@ -587,7 +785,8 @@
 

         ret = proc_install_diff_pack();

     }while(0);

-    

+

+    set_wefota_upgrade_flag_cfg("0");

     if (sock >= 0) {

         close_udp_socket(sock);

     }

diff --git a/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c b/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
index 57944da..bc1a809 100755
--- a/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
+++ b/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
@@ -1664,6 +1664,7 @@
 

     cfg_set(LOCK_CELL_STATE_FLAG, "0");

     cfg_set("ussd_cancel_flag","no");//ussd

+    cfg_set("fota_update_flag", "");

 	

 }