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