xref: /OK3568_Linux_fs/external/rk_pcba_test/echo_pcbatest_server.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  pcbatest_server.c  --  pcba test application
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  Copyright (c) 2017 Rockchip Electronics Co. Ltd.
5*4882a593Smuzhiyun  *  Author: Bin Yang <yangbin@rock-chips.com>
6*4882a593Smuzhiyun  *  Modified by Panzhenzhuan Wang <randy.wang@rock-chips.com> for rk3036-echo
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
9*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
10*4882a593Smuzhiyun  * You may obtain a copy of the License at
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *   http://www.apache.org/licenses/LICENSE-2.0
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
15*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
16*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
18*4882a593Smuzhiyun  * limitations under the License.
19*4882a593Smuzhiyun  */
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <assert.h>
22*4882a593Smuzhiyun #include <stdio.h>
23*4882a593Smuzhiyun #include <stdlib.h>
24*4882a593Smuzhiyun #include <stdbool.h>
25*4882a593Smuzhiyun #include <string.h>
26*4882a593Smuzhiyun #include <fcntl.h>
27*4882a593Smuzhiyun #include <sys/socket.h>
28*4882a593Smuzhiyun #include <sys/types.h>
29*4882a593Smuzhiyun #include <sys/wait.h>
30*4882a593Smuzhiyun #include <sys/stat.h>
31*4882a593Smuzhiyun #include <errno.h>
32*4882a593Smuzhiyun #include <signal.h>
33*4882a593Smuzhiyun #include <dirent.h>
34*4882a593Smuzhiyun #include <linux/watchdog.h>
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #include <sys/ioctl.h>
37*4882a593Smuzhiyun #include <net/if.h>
38*4882a593Smuzhiyun #include <netinet/in.h>
39*4882a593Smuzhiyun #include <arpa/inet.h>
40*4882a593Smuzhiyun #include <unistd.h>
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define LOG_TAG "pcbatest_server"
43*4882a593Smuzhiyun #include "common.h"
44*4882a593Smuzhiyun #include "pcbatest_server.h"
45*4882a593Smuzhiyun #include "cJSON/cJSON.h"
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define PARENT_EXIT 0
48*4882a593Smuzhiyun #define CHILD_EXIT 1
49*4882a593Smuzhiyun #define FORK_FAIL -1
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #ifdef PCBA_PX3SE
52*4882a593Smuzhiyun #define SN_NODE     "/sys/devices/2005a000.i2c/i2c-2/2-0054/snread"
53*4882a593Smuzhiyun #else
54*4882a593Smuzhiyun #define SN_NODE     ""
55*4882a593Smuzhiyun #endif
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #ifdef PCBA_PX3SE
58*4882a593Smuzhiyun #warning  "---------------------define PCBA_PX3SE-----------------------"
59*4882a593Smuzhiyun #elif (defined PCBA_3308)
60*4882a593Smuzhiyun #warning  "---------------------define PCBA_3308------------------------"
61*4882a593Smuzhiyun #elif (defined PCBA_3229GVA)
62*4882a593Smuzhiyun #warning  "---------------------define PCBA_3229GVA---------------------"
63*4882a593Smuzhiyun #elif (defined PCBA_1808)
64*4882a593Smuzhiyun #warning  "---------------------define PCBA_1808------------------------"
65*4882a593Smuzhiyun #elif (defined PCBA_3326)
66*4882a593Smuzhiyun #warning  "---------------------define PCBA_3266------------------------"
67*4882a593Smuzhiyun #elif (defined PCBA_PX30)
68*4882a593Smuzhiyun #warning  "---------------------define PCBA_PX30------------------------"
69*4882a593Smuzhiyun #elif (defined PCBA_3288)
70*4882a593Smuzhiyun #warning  "---------------------define PCBA_3288------------------------"
71*4882a593Smuzhiyun #elif (defined PCBA_3328)
72*4882a593Smuzhiyun #warning  "---------------------define PCBA_3328------------------------"
73*4882a593Smuzhiyun #elif (defined PCBA_3399)
74*4882a593Smuzhiyun #warning  "---------------------define PCBA_3399------------------------"
75*4882a593Smuzhiyun #elif (defined PCBA_3399PRO)
76*4882a593Smuzhiyun #warning  "---------------------define PCBA_3399PRO---------------------"
77*4882a593Smuzhiyun #elif (defined PCBA_1126_1109)
78*4882a593Smuzhiyun #warning  "---------------------define PCBA_1126_1109------------------------"
79*4882a593Smuzhiyun #elif (defined PCBA_356X)
80*4882a593Smuzhiyun #warning  "---------------------define PCBA_356X---------------------"
81*4882a593Smuzhiyun #elif (defined PCBA_3588)
82*4882a593Smuzhiyun #warning  "---------------------define PCBA_3588---------------------"
83*4882a593Smuzhiyun #else
84*4882a593Smuzhiyun #error "====================not define any platform pcba macro here,pls check it======================"
85*4882a593Smuzhiyun #endif
86*4882a593Smuzhiyun 
sig_child_handle(int sig)87*4882a593Smuzhiyun static void sig_child_handle(int sig)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun     int status = 0;
90*4882a593Smuzhiyun     pid_t pid;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun     if (sig == SIGCHLD)
93*4882a593Smuzhiyun         while((pid = waitpid(-1, &status, WNOHANG)) > 0);
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
disable_wdt(void)96*4882a593Smuzhiyun static int disable_wdt(void)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun     int fd = 0;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     fd = open(DEV_WDT_NAME, O_WRONLY, 0777);
101*4882a593Smuzhiyun     if (fd == -1) {
102*4882a593Smuzhiyun         log_err ("%s open error\n", DEV_WDT_NAME);
103*4882a593Smuzhiyun     } else {
104*4882a593Smuzhiyun         write(fd , "V", 1);
105*4882a593Smuzhiyun         close(fd);
106*4882a593Smuzhiyun     }
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     return 0;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun 
run_cmd_to_shell(char * cmd)111*4882a593Smuzhiyun static int run_cmd_to_shell(char* cmd)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun     int ret = 0;
114*4882a593Smuzhiyun     int read_len = 0;
115*4882a593Smuzhiyun     FILE* read_fp;
116*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE] = {0};
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun     read_fp = popen(cmd, "r");
119*4882a593Smuzhiyun     if (read_fp != NULL) {
120*4882a593Smuzhiyun         read_len = fread(buf, sizeof(char), sizeof(buf), read_fp);
121*4882a593Smuzhiyun         if (read_len > 0)
122*4882a593Smuzhiyun             ret = 0;
123*4882a593Smuzhiyun         else
124*4882a593Smuzhiyun             ret = -1;
125*4882a593Smuzhiyun         pclose(read_fp);
126*4882a593Smuzhiyun     } else {
127*4882a593Smuzhiyun         ret = -1;
128*4882a593Smuzhiyun     }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun     return ret;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun 
run_cmd_to_shell_duplex(char * cmd,char * w_buf,char * r_buf,char * match_str)133*4882a593Smuzhiyun static int run_cmd_to_shell_duplex(char *cmd, char *w_buf, char *r_buf, char *match_str)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun     int ret = 0, t;
136*4882a593Smuzhiyun     int read_len = 0;
137*4882a593Smuzhiyun     FILE *fp;
138*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE] = {0};
139*4882a593Smuzhiyun     char cmd_msg[COMMAND_VALUESIZE] = {0};
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun     snprintf(cmd_msg, sizeof(cmd_msg),"%s  %s", cmd, w_buf);
142*4882a593Smuzhiyun     log_info("========cmd_msg is : %s\n",cmd_msg);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun     fp = popen(cmd_msg, "r");
145*4882a593Smuzhiyun     if (fp == NULL) {
146*4882a593Smuzhiyun         log_err("run_cmd_to_shell_duplex dpopen fail, errno=%d\n", errno);
147*4882a593Smuzhiyun         return -1;
148*4882a593Smuzhiyun     }
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun     if(match_str == NULL){
151*4882a593Smuzhiyun         read_len = fread(buf, sizeof(char), sizeof(buf), fp);
152*4882a593Smuzhiyun         if (read_len <= 0)
153*4882a593Smuzhiyun             ret = -1;
154*4882a593Smuzhiyun     } else {
155*4882a593Smuzhiyun         while (fgets(buf, sizeof(buf) - 1, fp)) {
156*4882a593Smuzhiyun             if (strstr(buf, match_str)) {
157*4882a593Smuzhiyun                 log_info("====================================\n");
158*4882a593Smuzhiyun                 log_info("strstr(buf, match_str) is : %s\n",buf);
159*4882a593Smuzhiyun                 strcpy(r_buf, buf);
160*4882a593Smuzhiyun                 break;
161*4882a593Smuzhiyun             } else {
162*4882a593Smuzhiyun                 puts(buf);
163*4882a593Smuzhiyun             }
164*4882a593Smuzhiyun         }
165*4882a593Smuzhiyun     }
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun EXIT:
168*4882a593Smuzhiyun     t = pclose(fp);
169*4882a593Smuzhiyun     if (WIFEXITED(t))
170*4882a593Smuzhiyun         log_info("exit status:%d\n", WEXITSTATUS(t));
171*4882a593Smuzhiyun     return ret;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
process_is_exists(char * process_name)174*4882a593Smuzhiyun static int process_is_exists(char *process_name)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun     FILE *fp;
177*4882a593Smuzhiyun     char cmd[COMMAND_VALUESIZE] = {0};
178*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE] = {0};
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun     snprintf(cmd, sizeof(cmd), "ps | grep %s | grep -v grep", process_name);
181*4882a593Smuzhiyun     fp = popen(cmd, "r");
182*4882a593Smuzhiyun     if (!fp) {
183*4882a593Smuzhiyun         log_err("popen ps | grep %s fail\n", process_name);
184*4882a593Smuzhiyun         return -1;
185*4882a593Smuzhiyun     }
186*4882a593Smuzhiyun     while (fgets(buf, sizeof(buf), fp)) {
187*4882a593Smuzhiyun         if (strstr(buf, process_name)) {
188*4882a593Smuzhiyun             fclose(fp);
189*4882a593Smuzhiyun             return 1;
190*4882a593Smuzhiyun         }
191*4882a593Smuzhiyun     }
192*4882a593Smuzhiyun     fclose(fp);
193*4882a593Smuzhiyun     return 0;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun 
pcba_test_result_rw(PCBA_SINGLE_PARA * recv_paras,char * w_buf,char * r_buf,bool rw)196*4882a593Smuzhiyun static int pcba_test_result_rw(PCBA_SINGLE_PARA *recv_paras, char *w_buf, char *r_buf, bool rw)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun     int ret = 0;
199*4882a593Smuzhiyun     int fd = -1;
200*4882a593Smuzhiyun     char pcbatest_result_filename[COMMAND_VALUESIZE] = {0};
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun     snprintf(pcbatest_result_filename, sizeof(pcbatest_result_filename),
203*4882a593Smuzhiyun         "%s/%s_result", TEST_RESULT_SAVE_PATH,
204*4882a593Smuzhiyun         recv_paras[INDEX_TEST_ITEM].valuestr);
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun     if (rw) {
207*4882a593Smuzhiyun         log_info("=================function: %s================\n",__func__);
208*4882a593Smuzhiyun         log_info("write result ** pcbatest_result_filename is :%s\n",pcbatest_result_filename);
209*4882a593Smuzhiyun         if(w_buf[0]!='\0'){
210*4882a593Smuzhiyun             fd = open(pcbatest_result_filename, O_CREAT | O_WRONLY  | O_TRUNC, 0777);
211*4882a593Smuzhiyun             if (fd < 0) {
212*4882a593Smuzhiyun                 log_err("open %s fail, errno = %d\n", pcbatest_result_filename, errno);
213*4882a593Smuzhiyun                 return errno;
214*4882a593Smuzhiyun             }
215*4882a593Smuzhiyun             assert(strlen(w_buf) < COMMAND_VALUESIZE);
216*4882a593Smuzhiyun             int w_len = write(fd, w_buf, strlen(w_buf));
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun             if (w_len <= 0) {
219*4882a593Smuzhiyun                 log_err("Write %s fail, errno = %d\n", pcbatest_result_filename, errno);
220*4882a593Smuzhiyun                 ret = errno;
221*4882a593Smuzhiyun             }
222*4882a593Smuzhiyun         } else {
223*4882a593Smuzhiyun             log_info("w_buf is NUll, do nothing\n");
224*4882a593Smuzhiyun         }
225*4882a593Smuzhiyun     } else {
226*4882a593Smuzhiyun         fd = open(pcbatest_result_filename, O_RDWR, 0777);
227*4882a593Smuzhiyun         if (fd < 0) {
228*4882a593Smuzhiyun             log_info("can't open %s, errno = %d\n", pcbatest_result_filename, errno);
229*4882a593Smuzhiyun             return 1;
230*4882a593Smuzhiyun         }
231*4882a593Smuzhiyun         int r_len = read(fd, r_buf, COMMAND_VALUESIZE);
232*4882a593Smuzhiyun         if (r_len <= 0) {
233*4882a593Smuzhiyun             log_err("read %s fail, errno = %d\n", pcbatest_result_filename, errno);
234*4882a593Smuzhiyun             ret = errno;
235*4882a593Smuzhiyun         }
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun         log_dbg("%s Result File:%s, Result is: %s\n",
238*4882a593Smuzhiyun                 __func__, pcbatest_result_filename, r_buf);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun         if (strstr(r_buf, TESTITEM_SEND_HEAD) == NULL) {
241*4882a593Smuzhiyun             //means this key press info. need to clear file content.
242*4882a593Smuzhiyun             close(fd);
243*4882a593Smuzhiyun             remove(pcbatest_result_filename);
244*4882a593Smuzhiyun             log_info(" XXXXXXXXXX delete file: %s XXXXXXXXXXXXXXX\n", pcbatest_result_filename);
245*4882a593Smuzhiyun             return ret;
246*4882a593Smuzhiyun         }
247*4882a593Smuzhiyun         log_info("**********Read file: %s; Result is: %s**********\n", pcbatest_result_filename, r_buf);
248*4882a593Smuzhiyun     }
249*4882a593Smuzhiyun     close(fd);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun     return ret;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun 
pcba_stop_process(char * process,char * str)254*4882a593Smuzhiyun static int pcba_stop_process(char *process, char *str)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun     int count = 0;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun     while (process_is_exists(process) > 0) {
259*4882a593Smuzhiyun         log_info("stop %s... \n", process);
260*4882a593Smuzhiyun         system(str);
261*4882a593Smuzhiyun         sleep(1);
262*4882a593Smuzhiyun         count++;
263*4882a593Smuzhiyun         if (count > 3)
264*4882a593Smuzhiyun             return -1;
265*4882a593Smuzhiyun     }
266*4882a593Smuzhiyun     return 0;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
pcba_start_process(char * process,char * str)269*4882a593Smuzhiyun static int pcba_start_process(char *process, char *str)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun     if (process_is_exists(process) > 0) {
272*4882a593Smuzhiyun         log_err("process %s already exists \n", process);
273*4882a593Smuzhiyun         return -1;
274*4882a593Smuzhiyun     }
275*4882a593Smuzhiyun     system(str);
276*4882a593Smuzhiyun     return 0;
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun 
sn_load(char * sn_buff)279*4882a593Smuzhiyun static int sn_load(char* sn_buff)
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun     int i, ret = 0;
282*4882a593Smuzhiyun     FILE *fp=NULL;
283*4882a593Smuzhiyun     char buff[512];
284*4882a593Smuzhiyun     char cmd[COMMAND_VALUESIZE] = {0};
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun     memset(buff,0,sizeof(buff));
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun     if(sn_buff == NULL)
289*4882a593Smuzhiyun         return -1;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun     snprintf(cmd, sizeof(cmd), "cat %s", SN_NODE);
292*4882a593Smuzhiyun     if(NULL ==(fp = popen(cmd,"r")))
293*4882a593Smuzhiyun     {
294*4882a593Smuzhiyun         fprintf(stderr,"execute command failed: %s",strerror(errno));
295*4882a593Smuzhiyun         return -1;
296*4882a593Smuzhiyun     }
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun     while (fgets(buff, sizeof(buff), fp)) {
299*4882a593Smuzhiyun         char* pstr;
300*4882a593Smuzhiyun         pstr = strstr(buff, "sn:");
301*4882a593Smuzhiyun         if (pstr) {
302*4882a593Smuzhiyun             pstr += strlen("sn:");
303*4882a593Smuzhiyun             memcpy(sn_buff, pstr, strlen(buff) - strlen("sn:"));
304*4882a593Smuzhiyun             fclose(fp);
305*4882a593Smuzhiyun             log_info("xx--------->>>>> SN = %s \n", sn_buff);
306*4882a593Smuzhiyun             return 0;
307*4882a593Smuzhiyun         }
308*4882a593Smuzhiyun     }
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun     fclose(fp);
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun     log_info("--------->>>>> SN = %s \n", sn_buff);
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun     return ret;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
enter_pcba_test_mode(char * msg,char * test_flag)317*4882a593Smuzhiyun static int enter_pcba_test_mode(char *msg, char *test_flag)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun     struct ifreq ifr;
320*4882a593Smuzhiyun     char local_mac[18] = {0};
321*4882a593Smuzhiyun     char local_sn[32] = {0};
322*4882a593Smuzhiyun     int len = 0;
323*4882a593Smuzhiyun     char *start = NULL;
324*4882a593Smuzhiyun     int sockfd = -1;
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun     log_info("enter pcba test mode ...\n");
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun     /*Kill wakeWordAgent process before pcba test*/
329*4882a593Smuzhiyun     //new added
330*4882a593Smuzhiyun     //system(" kill `ps | grep wakeWordAgent| grep -v grep | awk '{print $1}'`");
331*4882a593Smuzhiyun     *test_flag = 1;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
334*4882a593Smuzhiyun     if (sockfd < 0)
335*4882a593Smuzhiyun         log_err("socket creat failed!(UDP)\n");
336*4882a593Smuzhiyun     else {
337*4882a593Smuzhiyun         strcpy(ifr.ifr_name, "wlan0");
338*4882a593Smuzhiyun         while (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {
339*4882a593Smuzhiyun             usleep(200000); /* 200 ms */
340*4882a593Smuzhiyun         }
341*4882a593Smuzhiyun         snprintf(local_mac, 18, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
342*4882a593Smuzhiyun                  (unsigned char)ifr.ifr_hwaddr.sa_data[0],
343*4882a593Smuzhiyun                  (unsigned char)ifr.ifr_hwaddr.sa_data[1],
344*4882a593Smuzhiyun                  (unsigned char)ifr.ifr_hwaddr.sa_data[2],
345*4882a593Smuzhiyun                  (unsigned char)ifr.ifr_hwaddr.sa_data[3],
346*4882a593Smuzhiyun                  (unsigned char)ifr.ifr_hwaddr.sa_data[4],
347*4882a593Smuzhiyun                  (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
348*4882a593Smuzhiyun     }
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun #ifdef PCBA_PX3SE
351*4882a593Smuzhiyun     int ret = sn_load(local_sn);
352*4882a593Smuzhiyun #endif
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun     start = msg;
355*4882a593Smuzhiyun     len = strlen(PCBA_TEST_PLATFORM";");
356*4882a593Smuzhiyun     memcpy(start, PCBA_TEST_PLATFORM";", len);
357*4882a593Smuzhiyun     start += len;
358*4882a593Smuzhiyun     len = strlen(local_mac);
359*4882a593Smuzhiyun     memcpy(start, local_mac, len);
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun #ifdef PCBA_PX3SE
362*4882a593Smuzhiyun     if (!ret) {
363*4882a593Smuzhiyun         start += len;
364*4882a593Smuzhiyun         *start++ = ';';
365*4882a593Smuzhiyun         len = strlen(local_sn);
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun         if (len >= 32) {
368*4882a593Smuzhiyun             local_sn[31] = '0';
369*4882a593Smuzhiyun             len = 32;
370*4882a593Smuzhiyun         }
371*4882a593Smuzhiyun         strcat(start, local_sn);
372*4882a593Smuzhiyun     }
373*4882a593Smuzhiyun #endif
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun     return 0;
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun 
exit_pcba_test_mode(PCBA_SINGLE_PARA * recv_paras,char * test_flag)378*4882a593Smuzhiyun static int exit_pcba_test_mode(PCBA_SINGLE_PARA *recv_paras, char *test_flag)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun     DIR *dir = NULL;
381*4882a593Smuzhiyun     struct dirent *dir_ptr = NULL;
382*4882a593Smuzhiyun     char result_filename[COMMAND_VALUESIZE] = {0};
383*4882a593Smuzhiyun     int ret = 0;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun     if ((dir = opendir(TEST_RESULT_SAVE_PATH)) == NULL) {
386*4882a593Smuzhiyun         log_err("exit test mode opendir fail\n");
387*4882a593Smuzhiyun         ret = EXIT_TEST_ERR;
388*4882a593Smuzhiyun     }
389*4882a593Smuzhiyun     while ((dir_ptr = readdir(dir)) != NULL) {
390*4882a593Smuzhiyun         if (strstr(dir_ptr->d_name, "_result")) {
391*4882a593Smuzhiyun             snprintf(result_filename, COMMAND_VALUESIZE, "%s/%s",
392*4882a593Smuzhiyun                 TEST_RESULT_SAVE_PATH, dir_ptr->d_name);
393*4882a593Smuzhiyun             remove(result_filename);
394*4882a593Smuzhiyun         }
395*4882a593Smuzhiyun     }
396*4882a593Smuzhiyun     closedir(dir);
397*4882a593Smuzhiyun     *test_flag = 0;
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun     if (*recv_paras[INDEX_MSG].valuestr == '1') {
400*4882a593Smuzhiyun         log_info("##########################################################\n");
401*4882a593Smuzhiyun         log_info("############# recive exit cmd, will reboot!!! ############\n");
402*4882a593Smuzhiyun         log_info("##########################################################\n");
403*4882a593Smuzhiyun     }
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun #if PCBA_3229GVA
406*4882a593Smuzhiyun     /* If the EXIT type command has a "1" message, indicating
407*4882a593Smuzhiyun      * that the test is complete, the system will be switched.
408*4882a593Smuzhiyun      * If it carries a "0" message, it indicates that the current
409*4882a593Smuzhiyun      * test has failed entries.
410*4882a593Smuzhiyun      *
411*4882a593Smuzhiyun      * Set current system(slot A) unbootable, then reboot.
412*4882a593Smuzhiyun      * system in slot B will boot up.
413*4882a593Smuzhiyun      */
414*4882a593Smuzhiyun     if (*recv_paras[INDEX_MSG].valuestr == '1') {
415*4882a593Smuzhiyun         log_info("Set current system unbootable!\n");
416*4882a593Smuzhiyun         setSlotAsUnbootable(0);
417*4882a593Smuzhiyun         system("busybox reboot");
418*4882a593Smuzhiyun     }
419*4882a593Smuzhiyun #endif
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun     return ret;
422*4882a593Smuzhiyun }
423*4882a593Smuzhiyun 
pcba_test_item_process(PCBA_SINGLE_PARA * recv_paras)424*4882a593Smuzhiyun static int pcba_test_item_process(PCBA_SINGLE_PARA *recv_paras)
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun     int ret;
427*4882a593Smuzhiyun     int fd;
428*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE] = {0};
429*4882a593Smuzhiyun     char pcba_test_filename[COMMAND_VALUESIZE] = {0};
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun     strcpy(pcba_test_filename,recv_paras[INDEX_TEST_ITEM].valuestr);
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun     chmod(pcba_test_filename, S_IRUSR|S_IWUSR|S_IXUSR);
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun     ret = run_cmd_to_shell_duplex(pcba_test_filename,
436*4882a593Smuzhiyun                                   recv_paras[INDEX_MSG].valuestr,
437*4882a593Smuzhiyun                                   buf,
438*4882a593Smuzhiyun                                   TESTITEM_SEND_HEAD);
439*4882a593Smuzhiyun     if (ret) {
440*4882a593Smuzhiyun         log_err("run_cmd_to_shell_duplex fail, ret=%d \n", ret);
441*4882a593Smuzhiyun         return TEST_FORK_ERR;
442*4882a593Smuzhiyun     }
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun     log_info("pcba_test_result_rw buf is : %s\n",buf);
445*4882a593Smuzhiyun     ret = pcba_test_result_rw(recv_paras, buf, NULL, 1);
446*4882a593Smuzhiyun     if (ret)
447*4882a593Smuzhiyun         return SAVE_RESULE_ERR;
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun     return ret;
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun 
start_pcba_test_proccess(PCBA_SINGLE_PARA * recv_paras,int * err_code)452*4882a593Smuzhiyun static int start_pcba_test_proccess(PCBA_SINGLE_PARA *recv_paras, int *err_code)
453*4882a593Smuzhiyun {
454*4882a593Smuzhiyun     int ret = 0;
455*4882a593Smuzhiyun     pid_t pid;
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun     pid = fork();
458*4882a593Smuzhiyun     if (pid < 0) {
459*4882a593Smuzhiyun         log_err("fork send_command error\n");
460*4882a593Smuzhiyun         return FORK_FAIL;
461*4882a593Smuzhiyun     } else if (0 == pid) {
462*4882a593Smuzhiyun         if (ret = pcba_test_item_process(recv_paras))
463*4882a593Smuzhiyun             log_err("test item process fail, ret=%d\n", ret);
464*4882a593Smuzhiyun         *err_code = ret;
465*4882a593Smuzhiyun         return CHILD_EXIT;
466*4882a593Smuzhiyun     }
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun     return PARENT_EXIT;
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun 
start_pcba_test_preproccess(PCBA_SINGLE_PARA * recv_paras,int test_flag)471*4882a593Smuzhiyun static int start_pcba_test_preproccess(PCBA_SINGLE_PARA *recv_paras, int test_flag)
472*4882a593Smuzhiyun {
473*4882a593Smuzhiyun     int ret = 0;
474*4882a593Smuzhiyun     char result_filename[COMMAND_VALUESIZE] = {0};
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun     if (!test_flag) {
477*4882a593Smuzhiyun         log_err("not enter pcba test mode \n");
478*4882a593Smuzhiyun         ret = TEST_MODE_ERR;
479*4882a593Smuzhiyun     }
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun     snprintf(result_filename, sizeof(result_filename),
482*4882a593Smuzhiyun         "%s/%s_result", TEST_RESULT_SAVE_PATH,
483*4882a593Smuzhiyun         recv_paras[INDEX_TEST_ITEM].valuestr);
484*4882a593Smuzhiyun     if (access(result_filename, F_OK) == 0)
485*4882a593Smuzhiyun         return TEST_RESULT_EXIST;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun     if (process_is_exists(recv_paras[INDEX_TEST_ITEM].valuestr)) {
488*4882a593Smuzhiyun         log_err("start test fail, test item %s already exists\n",
489*4882a593Smuzhiyun             recv_paras[INDEX_TEST_ITEM].valuestr);
490*4882a593Smuzhiyun         ret = TEST_ITEM_BUSY;
491*4882a593Smuzhiyun     }
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun     return ret;
494*4882a593Smuzhiyun }
495*4882a593Smuzhiyun 
stop_pcba_test(PCBA_SINGLE_PARA * recv_paras)496*4882a593Smuzhiyun static int stop_pcba_test(PCBA_SINGLE_PARA *recv_paras)
497*4882a593Smuzhiyun {
498*4882a593Smuzhiyun     int count = 0;
499*4882a593Smuzhiyun     char result_filename[COMMAND_VALUESIZE] = {0};
500*4882a593Smuzhiyun     char test_item_process[COMMAND_VALUESIZE] = {0};
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun     snprintf(result_filename, sizeof(result_filename),
503*4882a593Smuzhiyun         "%s/%s_result", TEST_RESULT_SAVE_PATH,
504*4882a593Smuzhiyun         recv_paras[INDEX_TEST_ITEM].valuestr);
505*4882a593Smuzhiyun     if (access(result_filename, F_OK) == 0)
506*4882a593Smuzhiyun         remove(result_filename);
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun     if (*recv_paras[INDEX_MSG].valuestr == '1') {
509*4882a593Smuzhiyun        int fd = -1;
510*4882a593Smuzhiyun        char buf[2];
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun        log_info("stop_pcba_test: msg = %s\n", recv_paras[INDEX_MSG].valuestr);
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun        memset(result_filename, 0,sizeof(result_filename));
515*4882a593Smuzhiyun        snprintf(result_filename, sizeof(result_filename),
516*4882a593Smuzhiyun              "%s/stop_result", TEST_RESULT_SAVE_PATH);
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun        strncpy(buf,recv_paras[INDEX_MSG].valuestr,sizeof(buf));
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun        fd = open(result_filename, O_CREAT | O_WRONLY | O_TRUNC, 0777);
521*4882a593Smuzhiyun        if (fd < 0) {
522*4882a593Smuzhiyun            log_err("open %s fail, errno = %d\n", result_filename, errno);
523*4882a593Smuzhiyun            //ret = errno;
524*4882a593Smuzhiyun        }
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun        int w_len = write(fd, buf, strlen(buf)); //write to buf '1'
527*4882a593Smuzhiyun        if (w_len <= 0) {
528*4882a593Smuzhiyun            log_err("Write %s fail, errno = %d\n", result_filename, errno);
529*4882a593Smuzhiyun        }
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun        close(fd);
532*4882a593Smuzhiyun        sleep(2);
533*4882a593Smuzhiyun     }
534*4882a593Smuzhiyun     while (process_is_exists(recv_paras[INDEX_TEST_ITEM].valuestr) > 0) {
535*4882a593Smuzhiyun         log_info("kill %s ...\n", recv_paras[INDEX_TEST_ITEM].valuestr);
536*4882a593Smuzhiyun         snprintf(test_item_process, sizeof(test_item_process),
537*4882a593Smuzhiyun             "busybox killall %s", recv_paras[INDEX_TEST_ITEM].valuestr);
538*4882a593Smuzhiyun         run_cmd_to_shell(test_item_process);
539*4882a593Smuzhiyun         sleep(1);
540*4882a593Smuzhiyun         count++;
541*4882a593Smuzhiyun         if (count > 3)
542*4882a593Smuzhiyun             return STOP_TEST_ERR;
543*4882a593Smuzhiyun     }
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun     return 0;
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun 
query_test_result(PCBA_SINGLE_PARA * recv_paras,char * msg,char * result,int * err_code)548*4882a593Smuzhiyun static int query_test_result(PCBA_SINGLE_PARA *recv_paras, char *msg, char *result, int *err_code)
549*4882a593Smuzhiyun {
550*4882a593Smuzhiyun     int ret = 0;
551*4882a593Smuzhiyun     int fd;
552*4882a593Smuzhiyun     int err = 0;
553*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE];
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun     *err_code =  0;
556*4882a593Smuzhiyun     ret = pcba_test_result_rw(recv_paras, NULL, buf, 0);
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun     //ret = 1;
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun     if (ret == 1) {
561*4882a593Smuzhiyun         strcpy(result, RESULT_TESTING);
562*4882a593Smuzhiyun         return 0;
563*4882a593Smuzhiyun     } else if (ret == -1) {
564*4882a593Smuzhiyun         log_info("==========function :\t %s==line :\t%d====\n",__func__,__LINE__);
565*4882a593Smuzhiyun         return QUERY_RESULT_ERR;
566*4882a593Smuzhiyun     }
567*4882a593Smuzhiyun     ret = sscanf(buf, TESTITEM_SEND_PARSE, msg, result, &err);
568*4882a593Smuzhiyun     log_info("@@@ buf :%s. ret = %d @@@\n", buf, ret);
569*4882a593Smuzhiyun     log_info("@@@ msg :%s @@@\n", msg);
570*4882a593Smuzhiyun     log_info("@@@ result :%s @@@\n", result);
571*4882a593Smuzhiyun     log_info("@@@ err :%d @@@\n", err);
572*4882a593Smuzhiyun     log_info("***************ret = : %d\n", ret);
573*4882a593Smuzhiyun     assert(strlen(buf) < COMMAND_VALUESIZE);
574*4882a593Smuzhiyun     assert(strlen(msg) < COMMAND_VALUESIZE);
575*4882a593Smuzhiyun     if (ret != 3) {
576*4882a593Smuzhiyun         ret = sscanf(buf, TESTITEM_SEND_PARSE_NOMSG, result, &err);
577*4882a593Smuzhiyun         if (ret != 2) {
578*4882a593Smuzhiyun             log_err("pcbatest result query fail, msg:%s, result:%s, err_code:%d, ret=%d\n",
579*4882a593Smuzhiyun                 msg, result, err, ret);
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun             return QUERY_RESULT_ERR;
582*4882a593Smuzhiyun         }
583*4882a593Smuzhiyun     }
584*4882a593Smuzhiyun     *err_code =  err;
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun     return 0;
587*4882a593Smuzhiyun }
588*4882a593Smuzhiyun 
tcp_command_check(PCBA_COMMAND_FORMAT index,char * str)589*4882a593Smuzhiyun static int tcp_command_check(PCBA_COMMAND_FORMAT index, char *str)
590*4882a593Smuzhiyun {
591*4882a593Smuzhiyun     int num = 0;
592*4882a593Smuzhiyun     char pcba_test_filename[COMMAND_VALUESIZE] = {0};
593*4882a593Smuzhiyun     struct stat file_stat;
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun     switch (index) {
596*4882a593Smuzhiyun     case INDEX_TYPE:
597*4882a593Smuzhiyun         if (strcmp(str, RECV_TYPE_NAME)) {
598*4882a593Smuzhiyun             log_err("not found type (%s) is error type\n", str);
599*4882a593Smuzhiyun             return CMD_TYPE_ERR;
600*4882a593Smuzhiyun         }
601*4882a593Smuzhiyun         break;
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun     case INDEX_TEST_ITEM:
604*4882a593Smuzhiyun         snprintf(pcba_test_filename, sizeof(pcba_test_filename),
605*4882a593Smuzhiyun             "%s%s", PCBA_TEST_PATH, str);
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun         if (access(pcba_test_filename, F_OK)) {
609*4882a593Smuzhiyun             log_err("not found test item(%s), test not support!\n", pcba_test_filename);
610*4882a593Smuzhiyun             return TEST_ITEM_ERR;
611*4882a593Smuzhiyun             }
612*4882a593Smuzhiyun         break;
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun     case INDEX_CMD:
615*4882a593Smuzhiyun         for (num = 0; num < RECV_CMD_NUM; num++ ) {
616*4882a593Smuzhiyun             if (!strcmp(str, recv_cmd_type[num].name))
617*4882a593Smuzhiyun                 break;
618*4882a593Smuzhiyun         }
619*4882a593Smuzhiyun         if (num == RECV_CMD_NUM) {
620*4882a593Smuzhiyun             log_err("not found command (%s) is error command.\n", str);
621*4882a593Smuzhiyun             return CMD_ERR;
622*4882a593Smuzhiyun         }
623*4882a593Smuzhiyun         break;
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun     case INDEX_MSG:
626*4882a593Smuzhiyun         break;
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun     default:
629*4882a593Smuzhiyun         return RECV_FORMAT_ERR;
630*4882a593Smuzhiyun     }
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun     return CMD_CHK_OK;
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun 
tcp_command_fill(PCBA_COMMAND_PARA * cmd_paras,char * status,char * msg,char * result,int err_code)635*4882a593Smuzhiyun static void tcp_command_fill(PCBA_COMMAND_PARA *cmd_paras, char *status, char *msg,
636*4882a593Smuzhiyun     char *result, int err_code)
637*4882a593Smuzhiyun {
638*4882a593Smuzhiyun     int num = 0;
639*4882a593Smuzhiyun     char str_err_code[20];
640*4882a593Smuzhiyun     bool *opt;
641*4882a593Smuzhiyun     bool send_para_optional[SEND_COMMAND_PARANUM];
642*4882a593Smuzhiyun     PCBA_SINGLE_PARA *recv_paras = cmd_paras->recv_paras;
643*4882a593Smuzhiyun     PCBA_SINGLE_PARA *send_paras = cmd_paras->send_paras;
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun     for (num = 0; num < SEND_COMMAND_PARANUM; num++)
646*4882a593Smuzhiyun         send_para_optional[num] = false;
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun     if ((!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[ENTER_CMD].name)) || \
649*4882a593Smuzhiyun         (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[EXIT_CMD].name))) {
650*4882a593Smuzhiyun         send_paras[INDEX_TEST_ITEM].opt = true;
651*4882a593Smuzhiyun         send_paras[INDEX_RESULT].opt = true;
652*4882a593Smuzhiyun     } else if ((!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[START_CMD].name)) || \
653*4882a593Smuzhiyun         (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[STOP_CMD].name))) {
654*4882a593Smuzhiyun         send_paras[INDEX_RESULT].opt = true;
655*4882a593Smuzhiyun     }
656*4882a593Smuzhiyun     if (!strcmp(status, NAK_STA))
657*4882a593Smuzhiyun         send_paras[INDEX_RESULT].opt = true;
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun     if ((!send_paras[INDEX_TYPE].opt) && send_paras[INDEX_RES].name)
660*4882a593Smuzhiyun         strcpy(send_paras[INDEX_TYPE].valuestr, send_paras[INDEX_RES].name);
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun     if ((!send_paras[INDEX_TEST_ITEM].opt) && recv_paras[INDEX_TEST_ITEM].valuestr)
663*4882a593Smuzhiyun         strcpy(send_paras[INDEX_TEST_ITEM].valuestr, recv_paras[INDEX_TEST_ITEM].valuestr);
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun     if ((!send_paras[INDEX_RES].opt) && recv_paras[INDEX_CMD].valuestr)
666*4882a593Smuzhiyun         strcpy(send_paras[INDEX_RES].valuestr, recv_paras[INDEX_CMD].valuestr);
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun     if ((!send_paras[INDEX_MSG].opt) && msg)
669*4882a593Smuzhiyun         strcpy(send_paras[INDEX_MSG].valuestr, msg);
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun     if ((!send_paras[INDEX_STATUS].opt) && status)
672*4882a593Smuzhiyun         strcpy(send_paras[INDEX_STATUS].valuestr, status);
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun     if ((!send_paras[INDEX_RESULT].opt) && result)
675*4882a593Smuzhiyun         strcpy(send_paras[INDEX_RESULT].valuestr, result);
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun     if (!send_paras[INDEX_ERRCODE].opt) {
678*4882a593Smuzhiyun         snprintf(str_err_code, sizeof(str_err_code), "%d", err_code);
679*4882a593Smuzhiyun         strcpy(send_paras[INDEX_ERRCODE].valuestr, str_err_code);
680*4882a593Smuzhiyun     }
681*4882a593Smuzhiyun }
682*4882a593Smuzhiyun 
tcp_command_creat(char * send_buf,int send_size,PCBA_SINGLE_PARA * send_paras)683*4882a593Smuzhiyun static int tcp_command_creat(char *send_buf, int send_size, PCBA_SINGLE_PARA *send_paras)
684*4882a593Smuzhiyun {
685*4882a593Smuzhiyun     int ret = 0;
686*4882a593Smuzhiyun     int num = 0;
687*4882a593Smuzhiyun     char * out;
688*4882a593Smuzhiyun     cJSON *sendJSON;
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun     sendJSON = cJSON_CreateObject();
691*4882a593Smuzhiyun     if (sendJSON == NULL) {
692*4882a593Smuzhiyun         log_err("cJSON_CreateObject error (%s)\n", cJSON_GetErrorPtr());
693*4882a593Smuzhiyun         return SEND_FORMAT_ERR;
694*4882a593Smuzhiyun     }
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun     for(num = 0; num < SEND_COMMAND_PARANUM; num++) {
697*4882a593Smuzhiyun         if(send_paras[num].opt)
698*4882a593Smuzhiyun             continue;
699*4882a593Smuzhiyun         cJSON_AddStringToObject(sendJSON, send_paras[num].name, send_paras[num].valuestr);
700*4882a593Smuzhiyun     }
701*4882a593Smuzhiyun     out = cJSON_Print(sendJSON);
702*4882a593Smuzhiyun     if (NULL == out) {
703*4882a593Smuzhiyun         log_err("send command cJSON_Print error\n");
704*4882a593Smuzhiyun         cJSON_Delete(sendJSON);
705*4882a593Smuzhiyun         return SEND_FORMAT_ERR;
706*4882a593Smuzhiyun     }
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun     if (strlen(out) > send_size) {
709*4882a593Smuzhiyun         log_err("send command size is %d exceed %d \n", strlen(out), send_size);
710*4882a593Smuzhiyun         ret = SEND_FORMAT_ERR;
711*4882a593Smuzhiyun         goto EXIT;
712*4882a593Smuzhiyun     }
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun     strcpy(send_buf, out);
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun EXIT:
717*4882a593Smuzhiyun     cJSON_Delete(sendJSON);
718*4882a593Smuzhiyun     free(out);
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun     return ret;
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun 
tcp_command_send(int stock_fd,PCBA_COMMAND_PARA * cmd_paras,char * status,char * msg,char * result,int err_code)723*4882a593Smuzhiyun static int tcp_command_send(int stock_fd, PCBA_COMMAND_PARA *cmd_paras, char *status,
724*4882a593Smuzhiyun     char *msg, char *result, int err_code)
725*4882a593Smuzhiyun {
726*4882a593Smuzhiyun     int ret = 0;
727*4882a593Smuzhiyun     int send_num = 0;
728*4882a593Smuzhiyun     char send_buf[SEND_BUFFER_SIZE];
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun     tcp_command_fill(cmd_paras, status, msg, result, err_code);
731*4882a593Smuzhiyun     ret = tcp_command_creat(send_buf, sizeof(send_buf), cmd_paras->send_paras);
732*4882a593Smuzhiyun     if (ret) {
733*4882a593Smuzhiyun         log_err("send command creat fail, ret=%d\n", ret);
734*4882a593Smuzhiyun         return ret;
735*4882a593Smuzhiyun     }
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun     send_num = send(stock_fd, send_buf, sizeof(send_buf), 0);
738*4882a593Smuzhiyun     log_info("send_buf is :%s \n",send_buf);
739*4882a593Smuzhiyun     if (send_num < 0) {
740*4882a593Smuzhiyun         log_err("command tcp send fail, send_num=%d\n", send_num);
741*4882a593Smuzhiyun         return TCP_SEND_ERR;
742*4882a593Smuzhiyun     }
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun     return 0;
745*4882a593Smuzhiyun }
746*4882a593Smuzhiyun 
tcp_command_para_init(PCBA_COMMAND_PARA * cmd_paras)747*4882a593Smuzhiyun static void tcp_command_para_init(PCBA_COMMAND_PARA *cmd_paras)
748*4882a593Smuzhiyun {
749*4882a593Smuzhiyun     int num = 0;
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun     memset(cmd_paras, 0, sizeof(PCBA_COMMAND_PARA));
752*4882a593Smuzhiyun     for (num = 0; num < RECV_COMMAND_PARANUM; num++) {
753*4882a593Smuzhiyun         strcpy(cmd_paras->recv_paras[num].name, recv_cmd_target[num].name);
754*4882a593Smuzhiyun         cmd_paras->recv_paras[num].opt = recv_cmd_target[num].opt;
755*4882a593Smuzhiyun     }
756*4882a593Smuzhiyun     for (num = 0; num < SEND_COMMAND_PARANUM; num++)
757*4882a593Smuzhiyun         strcpy(cmd_paras->send_paras[num].name, send_cmd_target[num].name);
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun 
tcp_command_parse(char * recv_buf,PCBA_SINGLE_PARA * recv_paras)760*4882a593Smuzhiyun static int tcp_command_parse(char *recv_buf, PCBA_SINGLE_PARA *recv_paras)
761*4882a593Smuzhiyun {
762*4882a593Smuzhiyun     int num = 0;
763*4882a593Smuzhiyun     int ret = 0;
764*4882a593Smuzhiyun     int err_code = 0;
765*4882a593Smuzhiyun     cJSON *recvJSON;
766*4882a593Smuzhiyun     cJSON *sub_JSON;
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun     recvJSON = cJSON_Parse(recv_buf);
769*4882a593Smuzhiyun     if (recvJSON == NULL) {
770*4882a593Smuzhiyun         log_err("command JSON parse error (%s)\n", cJSON_GetErrorPtr());
771*4882a593Smuzhiyun         return RECV_FORMAT_ERR;
772*4882a593Smuzhiyun     } else {
773*4882a593Smuzhiyun         for (num = 0; num < RECV_COMMAND_PARANUM; num++) {
774*4882a593Smuzhiyun             sub_JSON = cJSON_GetObjectItem(recvJSON , recv_paras[num].name);
775*4882a593Smuzhiyun             if (sub_JSON) {
776*4882a593Smuzhiyun                 if ((sub_JSON->type != cJSON_String) || (sub_JSON->valuestring == NULL)) {
777*4882a593Smuzhiyun                     log_err("parse json type error(%d) or null string \n", sub_JSON->type);
778*4882a593Smuzhiyun                     ret = RECV_FORMAT_ERR;
779*4882a593Smuzhiyun                     goto ERR_EXIT;
780*4882a593Smuzhiyun                 }
781*4882a593Smuzhiyun                 if (strlen(sub_JSON->valuestring) > sizeof(recv_paras[num].valuestr)) {
782*4882a593Smuzhiyun                     log_err("recv string length is %d exceed %d \n",
783*4882a593Smuzhiyun                             strlen(sub_JSON->valuestring),
784*4882a593Smuzhiyun                             sizeof(recv_paras[num].valuestr));
785*4882a593Smuzhiyun                     ret = CMD_OVERLONG;
786*4882a593Smuzhiyun                     goto ERR_EXIT;
787*4882a593Smuzhiyun                 }
788*4882a593Smuzhiyun                 strcpy(recv_paras[num].valuestr, sub_JSON->valuestring);
789*4882a593Smuzhiyun                 if (!err_code) {
790*4882a593Smuzhiyun                     err_code = tcp_command_check(num, sub_JSON->valuestring);
791*4882a593Smuzhiyun                     if (err_code) {
792*4882a593Smuzhiyun                         ret = err_code;
793*4882a593Smuzhiyun                         log_err("check command %s error\n", recv_paras[num].name);
794*4882a593Smuzhiyun                     }
795*4882a593Smuzhiyun                 }
796*4882a593Smuzhiyun             } else if (recv_paras[num].opt == false) {
797*4882a593Smuzhiyun                  log_err("not receive (%s)\n", recv_paras[num].name);
798*4882a593Smuzhiyun                  ret = RECV_FORMAT_ERR;
799*4882a593Smuzhiyun                  goto ERR_EXIT;
800*4882a593Smuzhiyun             }
801*4882a593Smuzhiyun         }
802*4882a593Smuzhiyun     }
803*4882a593Smuzhiyun 
804*4882a593Smuzhiyun ERR_EXIT:
805*4882a593Smuzhiyun     cJSON_Delete(recvJSON);
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun     return ret;
808*4882a593Smuzhiyun }
809*4882a593Smuzhiyun 
tcp_command_process(int stock_fd,int err_code,PCBA_COMMAND_PARA * cmd_paras)810*4882a593Smuzhiyun static int tcp_command_process(int stock_fd, int err_code, PCBA_COMMAND_PARA *cmd_paras)
811*4882a593Smuzhiyun {
812*4882a593Smuzhiyun     int ret = -1;
813*4882a593Smuzhiyun     int fork_status = PARENT_EXIT;
814*4882a593Smuzhiyun     int item_busy_or_result_exist = 0;
815*4882a593Smuzhiyun     static char test_flag = 0;
816*4882a593Smuzhiyun     char status[COMMAND_VALUESIZE] = NAK_STA;
817*4882a593Smuzhiyun     char msg[COMMAND_VALUESIZE] = {0};
818*4882a593Smuzhiyun     char result[COMMAND_VALUESIZE] = RESULT_TESTING;
819*4882a593Smuzhiyun     PCBA_SINGLE_PARA *recv_paras = cmd_paras->recv_paras;
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun     log_info("recv_paras[INDEX_TEST_ITEM].valuestr is :%s---------\n",recv_paras[INDEX_TEST_ITEM].valuestr);
822*4882a593Smuzhiyun     if (err_code)
823*4882a593Smuzhiyun         goto SEND_CMD;
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun     if (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[ENTER_CMD].name)) {
826*4882a593Smuzhiyun         err_code = enter_pcba_test_mode(msg, &test_flag);
827*4882a593Smuzhiyun     } else if (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[EXIT_CMD].name)) {
828*4882a593Smuzhiyun         usleep(2000);  //sleep 2 ms to let PC have time to read result
829*4882a593Smuzhiyun         err_code = exit_pcba_test_mode(recv_paras, &test_flag);
830*4882a593Smuzhiyun     } else if (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[START_CMD].name) ||
831*4882a593Smuzhiyun                !strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[CAPTURE_CMD].name)) {
832*4882a593Smuzhiyun         log_info("[dragon] %s \n", recv_paras[INDEX_CMD].valuestr);
833*4882a593Smuzhiyun         err_code = start_pcba_test_preproccess(recv_paras, test_flag);
834*4882a593Smuzhiyun         if ((!err_code) && !strcmp(recv_paras[INDEX_TEST_ITEM].valuestr, STORAGE_TESTITEM)) {
835*4882a593Smuzhiyun             fork_status = start_pcba_test_proccess(recv_paras, &err_code);
836*4882a593Smuzhiyun             if (fork_status != CHILD_EXIT)
837*4882a593Smuzhiyun                 goto EXIT;
838*4882a593Smuzhiyun             if (!err_code) {
839*4882a593Smuzhiyun                 ret = query_test_result(recv_paras, msg, result, &err_code);
840*4882a593Smuzhiyun                 if (ret)
841*4882a593Smuzhiyun                     err_code = ret;
842*4882a593Smuzhiyun             }
843*4882a593Smuzhiyun         } else if (err_code == TEST_ITEM_BUSY) {
844*4882a593Smuzhiyun             item_busy_or_result_exist = 1;
845*4882a593Smuzhiyun             err_code = 0;
846*4882a593Smuzhiyun             strcpy(result, RESULT_TESTING);
847*4882a593Smuzhiyun         } else if (err_code == TEST_RESULT_EXIST) {
848*4882a593Smuzhiyun             item_busy_or_result_exist = 1;
849*4882a593Smuzhiyun             err_code = 0;
850*4882a593Smuzhiyun         }
851*4882a593Smuzhiyun     } else if (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[STOP_CMD].name)) {
852*4882a593Smuzhiyun         err_code = stop_pcba_test(recv_paras);
853*4882a593Smuzhiyun     } else if (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[QUERY_CMD].name)) {
854*4882a593Smuzhiyun         if (ret = query_test_result(recv_paras, msg, result, &err_code))
855*4882a593Smuzhiyun             err_code = ret;
856*4882a593Smuzhiyun     } else {
857*4882a593Smuzhiyun         err_code = CMD_ERR;
858*4882a593Smuzhiyun     }
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun SEND_CMD:
861*4882a593Smuzhiyun     if (err_code & ret)
862*4882a593Smuzhiyun         strcpy(status, NAK_STA);
863*4882a593Smuzhiyun     else
864*4882a593Smuzhiyun         strcpy(status, ACK_STA);
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun     ret = tcp_command_send(stock_fd, cmd_paras, status, msg, result, err_code);
867*4882a593Smuzhiyun     if (ret) {
868*4882a593Smuzhiyun         log_err("command send fail, err=%d\n", ret);
869*4882a593Smuzhiyun         goto EXIT;
870*4882a593Smuzhiyun     }
871*4882a593Smuzhiyun     if (err_code) {
872*4882a593Smuzhiyun         log_err("command process fail, err_code=%d\n", err_code);
873*4882a593Smuzhiyun         goto EXIT;
874*4882a593Smuzhiyun     }
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun     if (!item_busy_or_result_exist &&
877*4882a593Smuzhiyun         (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[START_CMD].name) ||
878*4882a593Smuzhiyun          !strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[CAPTURE_CMD].name)) &&
879*4882a593Smuzhiyun         strcmp(recv_paras[INDEX_TEST_ITEM].valuestr, STORAGE_TESTITEM)) {
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun         if (!strcmp(recv_paras[INDEX_CMD].valuestr, recv_cmd_type[CAPTURE_CMD].name))
882*4882a593Smuzhiyun             log_info("[dragon] camera capture cmd run.....\n" , recv_paras[INDEX_CMD].valuestr);
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun         fork_status = start_pcba_test_proccess(recv_paras, &err_code);
885*4882a593Smuzhiyun     }
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun EXIT:
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun     return fork_status;
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun 
tcp_client_process(int stock_fd)892*4882a593Smuzhiyun static void tcp_client_process(int stock_fd)
893*4882a593Smuzhiyun {
894*4882a593Smuzhiyun     PCBA_COMMAND_PARA cmd_paras_set;
895*4882a593Smuzhiyun     PCBA_COMMAND_PARA *cmd_paras = &cmd_paras_set;
896*4882a593Smuzhiyun     int recv_num = 0;
897*4882a593Smuzhiyun     int parse_ret = 0;
898*4882a593Smuzhiyun     int proc_ret = 0;
899*4882a593Smuzhiyun     char recv_buf[RECV_BUFFER_SIZE] = {0};
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun     while(1) {
902*4882a593Smuzhiyun         log_info("waiting for client...\n");
903*4882a593Smuzhiyun         recv_num = recv(stock_fd, recv_buf, sizeof(recv_buf), 0);
904*4882a593Smuzhiyun         log_info("recv_buf is :%s \n",recv_buf);
905*4882a593Smuzhiyun         if (recv_num <= 0) {
906*4882a593Smuzhiyun             log_err("recv error:%s.  goto exit\n", strerror(errno));
907*4882a593Smuzhiyun             goto ERR_EXIT;
908*4882a593Smuzhiyun             //goto EXIT;  //chad.ma modified, recv_num < 0 means host disconnect socket
909*4882a593Smuzhiyun                           //here we exit normal.
910*4882a593Smuzhiyun         }
911*4882a593Smuzhiyun         recv_buf[recv_num]='\0';
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun         tcp_command_para_init(cmd_paras);
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun         parse_ret = tcp_command_parse(recv_buf, cmd_paras->recv_paras);
916*4882a593Smuzhiyun         if (parse_ret == RECV_FORMAT_ERR)
917*4882a593Smuzhiyun             continue;
918*4882a593Smuzhiyun 
919*4882a593Smuzhiyun         proc_ret = tcp_command_process(stock_fd, parse_ret, cmd_paras);
920*4882a593Smuzhiyun         if (proc_ret == FORK_FAIL){
921*4882a593Smuzhiyun             goto ERR_EXIT;
922*4882a593Smuzhiyun         }
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun         else if (proc_ret == CHILD_EXIT)
925*4882a593Smuzhiyun             goto EXIT;
926*4882a593Smuzhiyun     }
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun     //free(cmd_paras);
929*4882a593Smuzhiyun ERR_EXIT:
930*4882a593Smuzhiyun     close(stock_fd);
931*4882a593Smuzhiyun     log_info("-------- exit pcbatest server--------\n");
932*4882a593Smuzhiyun     exit(-1);
933*4882a593Smuzhiyun EXIT:
934*4882a593Smuzhiyun     //free(cmd_paras);
935*4882a593Smuzhiyun     log_info("-------- quit pcbatest server--------\n");
936*4882a593Smuzhiyun     exit(0);
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun 
init_tcp(void)939*4882a593Smuzhiyun static int init_tcp(void)
940*4882a593Smuzhiyun {
941*4882a593Smuzhiyun     int val = 1;
942*4882a593Smuzhiyun     int server_sockfd;
943*4882a593Smuzhiyun     struct sockaddr_in server_addr;
944*4882a593Smuzhiyun     int ret;
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun     /* create a socket */
947*4882a593Smuzhiyun     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
948*4882a593Smuzhiyun     if (server_sockfd < 0) {
949*4882a593Smuzhiyun         log_err("socket error:%s\n", strerror(errno));
950*4882a593Smuzhiyun         return -1;
951*4882a593Smuzhiyun     }
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun     ret = setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&val, sizeof(int));
954*4882a593Smuzhiyun     if (ret == -1) {
955*4882a593Smuzhiyun         log_err("setsockopt error:%s\n", strerror(errno));
956*4882a593Smuzhiyun         return -1;
957*4882a593Smuzhiyun     }
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun     /*  initialize server address */
960*4882a593Smuzhiyun     bzero(&server_addr, sizeof(server_addr));
961*4882a593Smuzhiyun     server_addr.sin_family = AF_INET;
962*4882a593Smuzhiyun     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
963*4882a593Smuzhiyun     server_addr.sin_port = htons(SOURCE_PORT);
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun     /* bind with the local file */
966*4882a593Smuzhiyun     ret = bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
967*4882a593Smuzhiyun     if (ret) {
968*4882a593Smuzhiyun         log_err("bind error:%s\n", strerror(errno));
969*4882a593Smuzhiyun         close(server_sockfd);
970*4882a593Smuzhiyun         return -1;
971*4882a593Smuzhiyun     }
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun     /* listen */
974*4882a593Smuzhiyun     ret = listen(server_sockfd, TCP_QUEUE_LINE);
975*4882a593Smuzhiyun     if (ret) {
976*4882a593Smuzhiyun         log_err("listen error:%s\n", strerror(errno));
977*4882a593Smuzhiyun         close(server_sockfd);
978*4882a593Smuzhiyun         return -1;
979*4882a593Smuzhiyun     }
980*4882a593Smuzhiyun     log_info("tcp server is ready ... \n");
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun     return server_sockfd;
983*4882a593Smuzhiyun }
984*4882a593Smuzhiyun 
main(int argc,char ** argv)985*4882a593Smuzhiyun int main(int argc, char **argv)
986*4882a593Smuzhiyun {
987*4882a593Smuzhiyun     int server_sockfd;
988*4882a593Smuzhiyun     int client_sockfd;
989*4882a593Smuzhiyun     struct sockaddr_in client_addr;
990*4882a593Smuzhiyun     socklen_t client_addr_len = sizeof(client_addr);
991*4882a593Smuzhiyun     pid_t pid;
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun     signal(SIGCHLD, sig_child_handle);
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun     server_sockfd = init_tcp();
996*4882a593Smuzhiyun     if (server_sockfd < 0)
997*4882a593Smuzhiyun     {
998*4882a593Smuzhiyun         log_err("tcp server init fail\n");
999*4882a593Smuzhiyun         return -1;
1000*4882a593Smuzhiyun     }
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun     log_info("*****************************************\n");
1003*4882a593Smuzhiyun     log_info("***         pcba test start           ***\n");
1004*4882a593Smuzhiyun     log_info("***         Rockchip.Co.Ld.           ***\n");
1005*4882a593Smuzhiyun     log_info("*****************************************\n");
1006*4882a593Smuzhiyun     log_info("pcba test version: v%s\n", PCBA_VERSION);
1007*4882a593Smuzhiyun     log_info("pcba test git version: %s\n", BUILD_LOG_VERSION);
1008*4882a593Smuzhiyun     log_info("pcba test build date: %s\n", BUILD_DATE);
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun     while(1) {
1011*4882a593Smuzhiyun     //{
1012*4882a593Smuzhiyun         /* accept a connection */
1013*4882a593Smuzhiyun         client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
1014*4882a593Smuzhiyun         if (client_sockfd < 0) {
1015*4882a593Smuzhiyun             log_err("accept error:%s\n", strerror(errno));
1016*4882a593Smuzhiyun             close(server_sockfd);
1017*4882a593Smuzhiyun             return -1;
1018*4882a593Smuzhiyun         }
1019*4882a593Smuzhiyun 
1020*4882a593Smuzhiyun         log_info("accept a new client, ip:%s, port:%d\n",
1021*4882a593Smuzhiyun              inet_ntoa(client_addr.sin_addr),
1022*4882a593Smuzhiyun              ntohs(client_addr.sin_port));
1023*4882a593Smuzhiyun 
1024*4882a593Smuzhiyun         pid = fork();
1025*4882a593Smuzhiyun         if (pid < 0) {
1026*4882a593Smuzhiyun             log_err("fork tcp_client_process error\n");
1027*4882a593Smuzhiyun             close(server_sockfd);
1028*4882a593Smuzhiyun             return -1;
1029*4882a593Smuzhiyun         } else if (0 == pid) {
1030*4882a593Smuzhiyun             close(server_sockfd);
1031*4882a593Smuzhiyun             tcp_client_process(client_sockfd);
1032*4882a593Smuzhiyun         } else if (pid > 0) {
1033*4882a593Smuzhiyun             close(client_sockfd);
1034*4882a593Smuzhiyun         }
1035*4882a593Smuzhiyun     }
1036*4882a593Smuzhiyun     close(server_sockfd);
1037*4882a593Smuzhiyun 
1038*4882a593Smuzhiyun #if 0
1039*4882a593Smuzhiyun     int status;
1040*4882a593Smuzhiyun     waitpid(pid, &status, 0);
1041*4882a593Smuzhiyun     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
1042*4882a593Smuzhiyun         log_err("Error in (Status %d)\n", WEXITSTATUS(status));
1043*4882a593Smuzhiyun         return -1;
1044*4882a593Smuzhiyun     }
1045*4882a593Smuzhiyun #endif
1046*4882a593Smuzhiyun     log_info("======Will exit pcba test server & end test ======\n");
1047*4882a593Smuzhiyun     return 0;
1048*4882a593Smuzhiyun }
1049