[Feature][ZXW-65]merged P49 base code

Change-Id: I3e09c0c3d47483bc645f02310380ecb7fc6f4041
diff --git a/ap/app/zte_comm/nvserver/nvserver_rpc.c b/ap/app/zte_comm/nvserver/nvserver_rpc.c
index eb1efee..c5e6c5e 100755
--- a/ap/app/zte_comm/nvserver/nvserver_rpc.c
+++ b/ap/app/zte_comm/nvserver/nvserver_rpc.c
@@ -82,59 +82,74 @@
 * ·µ »Ø Öµ:     0±íʾ³É¹¦
 * ÆäËü˵Ã÷:     void
 *******************************************************************************/
-static void analyMsg(T_NV_MSG_INFO *msgrecv, T_NV_MSG_RESULT *msgsnd, T_sc_rpc_header *rpc_data, T_sc_rpc_header *rpc_data2)
+static void analyMsg(T_NV_MSG_INFO *msgrecv, T_NV_MSG_RESULT *msgsnd, T_sc_rpc_msg *rpc_data, T_sc_rpc_msg *rpc_data2)
 {
     unsigned int timeout = 10;
-    int try_cnt = 0;
+    int send_once_flag   = 0;
+    int ret;
 
-    memset(rpc_data, 0, sizeof(T_sc_rpc_header));
-    memset(rpc_data2, 0, sizeof(T_sc_rpc_header));
-
-    rpc_data->msg_type = RPC_MSG_TYPE_REQUEST;
-    rpc_data->func_id = RPC_FUNC_ID_NV;
-    rpc_data->data_len = sizeof(T_NV_MSG_INFO);
-    memcpy(rpc_data->data, msgrecv, sizeof(T_NV_MSG_INFO));
+    rpc_data->header.msg_type  = RPC_MSG_TYPE_REQUEST;
+    rpc_data->header.func_id   = RPC_FUNC_ID_NV;
+    rpc_data->header.data_len  = sizeof(T_NV_MSG_INFO) - NV_MAX_FILE_LEN - NV_MAX_KEY_LEN - NV_MAX_VAL_LEN;
+    rpc_data->header.file_len  = strlen(msgrecv->file) + 1;
+    rpc_data->header.data_len  += rpc_data->header.file_len;
+    memcpy(rpc_data->data, msgrecv, rpc_data->header.data_len);
+    rpc_data->header.key_len   = strlen(msgrecv->key) + 1;
+    memcpy(rpc_data->data+rpc_data->header.data_len, msgrecv->key, rpc_data->header.key_len);
+    rpc_data->header.data_len  += rpc_data->header.key_len;
+    rpc_data->header.value_len = strlen(msgrecv->value);
+    if (rpc_data->header.value_len > 0)
+    {
+        rpc_data->header.value_len +=  1;
+        memcpy(rpc_data->data+rpc_data->header.data_len, msgrecv->value, rpc_data->header.value_len);
+        rpc_data->header.data_len  += rpc_data->header.value_len;
+    }
 
     do
     {
-        if (try_cnt > 0)
+        if (send_once_flag == 0)
         {
-            sc_rpc_clear(g_rpc_fd);
+            ret = sc_rpc_send(g_rpc_fd, rpc_data, 0);
+            if (ret == 0)
+            {
+                send_once_flag = 1; // send success
+            }
+            else
+            {
+                assert(0); // send fail
+            }
         }
-        sc_rpc_send(g_rpc_fd, rpc_data, 0);
-        try_cnt++;
-        //sleep(1);
-        //continue;
-    } while (0 != sc_rpc_recv(g_rpc_fd, rpc_data2, timeout)); //µÈ´ýÍê³É
-    if (rpc_data2->msg_type != RPC_MSG_TYPE_REPLY)
+
+        ret = sc_rpc_recv(g_rpc_fd, rpc_data2, timeout);
+        if (ret == 0)
+        {
+            break; // recv success and break
+        }
+   
+    } while (1); //µÈ´ýÍê³É
+
+    if (rpc_data2->header.msg_type != RPC_MSG_TYPE_REPLY)
         assert(0);
 
-    memcpy(msgsnd, rpc_data2->data, sizeof(T_NV_MSG_RESULT));
+    memcpy(msgsnd, rpc_data2->data, rpc_data2->header.data_len);
 }
 
 static int nv_rpc_wait_ready(int fd)
 {
     T_sc_rpc_header *rpc_data;
-    unsigned int timeout = 200; // ms
-    int write_flag = 1;
+    unsigned int timeout = 100; // ms
 
     rpc_data = malloc(sizeof(T_sc_rpc_header));
     if (rpc_data == NULL)
         return -1;
+    
     while(1)
     {
         rpc_data->msg_type = RPC_MSG_TYPE_READY;
-        if (write_flag)
-        {
-            if (write(fd, rpc_data, sizeof(T_sc_rpc_header)) != 0)
-                write_flag = 0; // write ok and write sonly once
-        }
-        if (read(fd, rpc_data, sizeof(T_sc_rpc_header)) == 0)
-        {
+        if (write(fd, rpc_data, sizeof(T_sc_rpc_header)) == sizeof(T_sc_rpc_header))
+            break;            
+        else    
             usleep(timeout * 1000);
-            continue;
-        }
-        break; /* read some data mean channel ok */
     }
 
     free(rpc_data);
@@ -159,11 +174,11 @@
     T_NV_MSG_INFO rcvBuf;
     T_NV_MSG_RESULT sndBuf;
     struct msqid_ds msgInfo;
-    T_sc_rpc_header *rpc_data;
-    T_sc_rpc_header *rpc_data2;
+    T_sc_rpc_msg *rpc_data;
+    T_sc_rpc_msg *rpc_data2;
     long pid_backup;       /*  app-libnvram pid backup */
 
-    prctl(PR_SET_NAME, "nvserver", 0, 0, 0);
+    prctl(PR_SET_NAME, "nvserver_rpc", 0, 0, 0);
 
     memset(&msgInfo, 0, sizeof(msgInfo));
 
@@ -185,13 +200,13 @@
         }
     }
 
-    rpc_data = malloc(sizeof(T_sc_rpc_header));
+    rpc_data = malloc(sizeof(T_sc_rpc_msg));
     if (rpc_data == NULL)
     {
         perror("[error]nvrpc malloc error\n");
         return -2;
     }
-    rpc_data2 = malloc(sizeof(T_sc_rpc_header));
+    rpc_data2 = malloc(sizeof(T_sc_rpc_msg));
     if (rpc_data2 == NULL)
     {
         perror("[error]nvrpc malloc2 error\n");
@@ -201,7 +216,7 @@
 
     if (nv_rpc_wait_ready(g_rpc_fd) < 0)
     {
-       assert(0);
+        assert(0);
     }
     sc_rpc_clear(g_rpc_fd);
     printf("apnv and nv-rpc-daemon are ready both.");