xref: /wlan-dirver/utils/sigma-dut/e_loop.c (revision 673d85c678abfcee9b7c2a5f6940c24dcf9e2863)
1cd4e3c3eSJouni Malinen /*
2cd4e3c3eSJouni Malinen  * e_loop helper program
3cd4e3c3eSJouni Malinen  * Copyright (c) 2015, Qualcomm Atheros, Inc.
4cd4e3c3eSJouni Malinen  * All Rights Reserved.
5cd4e3c3eSJouni Malinen  * Licensed under the Clear BSD license. See README for more details.
6cd4e3c3eSJouni Malinen  */
7cd4e3c3eSJouni Malinen 
8cd4e3c3eSJouni Malinen #include <stdlib.h>
9cd4e3c3eSJouni Malinen #include <stdio.h>
10cd4e3c3eSJouni Malinen #include <stdarg.h>
11cd4e3c3eSJouni Malinen #include <string.h>
12cd4e3c3eSJouni Malinen #include <unistd.h>
13cd4e3c3eSJouni Malinen #include <sys/wait.h>
14cd4e3c3eSJouni Malinen 
15cd4e3c3eSJouni Malinen 
16cd4e3c3eSJouni Malinen char *e_loop_cmd_file = "/data/local/hs2/To_Phone/tag_file";
17cd4e3c3eSJouni Malinen char *e_loop_log_file = "/data/local/hs2/To_Phone/Logs/e_loop.log";
18cd4e3c3eSJouni Malinen static const char *log_file = NULL;
19cd4e3c3eSJouni Malinen static const char *tag_file = NULL;
20cd4e3c3eSJouni Malinen 
21cd4e3c3eSJouni Malinen 
main(int argc,char * argv[])22cd4e3c3eSJouni Malinen int main(int argc, char *argv[])
23cd4e3c3eSJouni Malinen {
24cd4e3c3eSJouni Malinen 	char *buf = NULL;
25cd4e3c3eSJouni Malinen 	char *cmd = NULL;
26cd4e3c3eSJouni Malinen 	long pos;
27cd4e3c3eSJouni Malinen 	int c, ret;
28cd4e3c3eSJouni Malinen 	size_t len = 0;
29cd4e3c3eSJouni Malinen 	FILE *f, *f2 = NULL;
30cd4e3c3eSJouni Malinen 
31cd4e3c3eSJouni Malinen 	/* Set the defaults */
32cd4e3c3eSJouni Malinen 	log_file = e_loop_log_file;
33cd4e3c3eSJouni Malinen 	tag_file = e_loop_cmd_file;
34cd4e3c3eSJouni Malinen 
35cd4e3c3eSJouni Malinen 	for (;;) {
36cd4e3c3eSJouni Malinen 		c = getopt(argc, argv, "l:t:");
37cd4e3c3eSJouni Malinen 		if (c < 0)
38cd4e3c3eSJouni Malinen 			break;
39cd4e3c3eSJouni Malinen 		switch (c) {
40cd4e3c3eSJouni Malinen 		case 'l':
41cd4e3c3eSJouni Malinen 			log_file = optarg;
42cd4e3c3eSJouni Malinen 			break;
43cd4e3c3eSJouni Malinen 		case 't':
44cd4e3c3eSJouni Malinen 			tag_file = optarg;
45cd4e3c3eSJouni Malinen 			break;
46cd4e3c3eSJouni Malinen 		default:
47cd4e3c3eSJouni Malinen 			printf("usage: e_loop [-l<log_filename>] [-t<tag_filename>]\n");
48cd4e3c3eSJouni Malinen 			exit(0);
49cd4e3c3eSJouni Malinen 			break;
50cd4e3c3eSJouni Malinen 		}
51cd4e3c3eSJouni Malinen 	}
52cd4e3c3eSJouni Malinen 
53cd4e3c3eSJouni Malinen 	/* Main command event loop */
54cd4e3c3eSJouni Malinen 	while (1) {
55cd4e3c3eSJouni Malinen 		/* Wait for a tag_file with a command to process */
56cd4e3c3eSJouni Malinen 		while (!(f = fopen(tag_file, "rb")))
57cd4e3c3eSJouni Malinen 			sleep(1);
58cd4e3c3eSJouni Malinen 
59cd4e3c3eSJouni Malinen 		len = 80;
60cd4e3c3eSJouni Malinen 		/* Figure out how long the file is */
61cd4e3c3eSJouni Malinen 		if (fseek(f, 0, SEEK_END) < 0 || (pos = ftell(f)) < 0) {
62cd4e3c3eSJouni Malinen 			fclose(f);
63cd4e3c3eSJouni Malinen 			return -1;
64cd4e3c3eSJouni Malinen 		}
65cd4e3c3eSJouni Malinen 		len = pos;
66cd4e3c3eSJouni Malinen 		if (fseek(f, 0, SEEK_SET) < 0) {
67cd4e3c3eSJouni Malinen 			fclose(f);
68cd4e3c3eSJouni Malinen 			return -1;
69cd4e3c3eSJouni Malinen 		}
70cd4e3c3eSJouni Malinen 		buf = malloc(len);
71*673d85c6SPradeep Reddy POTTETI 		if (!buf) {
72*673d85c6SPradeep Reddy POTTETI 			fclose(f);
73cd4e3c3eSJouni Malinen 			return -1;
74*673d85c6SPradeep Reddy POTTETI 		}
75cd4e3c3eSJouni Malinen 		/* Read up the command line */
76cd4e3c3eSJouni Malinen 		if (fread(buf, 1, len, f) != len) {
77cd4e3c3eSJouni Malinen 			fclose(f);
78cd4e3c3eSJouni Malinen 			free(buf);
79cd4e3c3eSJouni Malinen 			return -1;
80cd4e3c3eSJouni Malinen 		}
81cd4e3c3eSJouni Malinen 		fclose(f);
82cd4e3c3eSJouni Malinen 
83cd4e3c3eSJouni Malinen 		buf[len - 1] = '\0';
84cd4e3c3eSJouni Malinen 
85cd4e3c3eSJouni Malinen 		if (log_file) {
86cd4e3c3eSJouni Malinen 			len = strlen(buf) + strlen(log_file) + 7;
87cd4e3c3eSJouni Malinen 			cmd = malloc(len);
88cd4e3c3eSJouni Malinen 			if (cmd == NULL) {
89cd4e3c3eSJouni Malinen 				free(buf);
90cd4e3c3eSJouni Malinen 				return -1;
91cd4e3c3eSJouni Malinen 			}
92cd4e3c3eSJouni Malinen 			ret = snprintf(cmd, len, "%s > %s", buf, log_file);
93cd4e3c3eSJouni Malinen 			if (ret < 0 || (size_t) ret >= len) {
94cd4e3c3eSJouni Malinen 				free(buf);
95cd4e3c3eSJouni Malinen 				free(cmd);
96cd4e3c3eSJouni Malinen 				return -1;
97cd4e3c3eSJouni Malinen 			}
98cd4e3c3eSJouni Malinen 			free(buf);
99cd4e3c3eSJouni Malinen 			buf = NULL;
100cd4e3c3eSJouni Malinen 		} else {
101cd4e3c3eSJouni Malinen 			cmd = buf;
102cd4e3c3eSJouni Malinen 		}
103cd4e3c3eSJouni Malinen 
104cd4e3c3eSJouni Malinen 		cmd[len - 1] = '\0';
105cd4e3c3eSJouni Malinen 
106cd4e3c3eSJouni Malinen 		/*
107cd4e3c3eSJouni Malinen 		 * This string "cmd" will contain the command passed in by
108cd4e3c3eSJouni Malinen 		 * hs20-action.sh. And the name of the "logfile". Which can be
109cd4e3c3eSJouni Malinen 		 * monitored for the result.
110cd4e3c3eSJouni Malinen 		 */
111cd4e3c3eSJouni Malinen 		ret = system(cmd);
112cd4e3c3eSJouni Malinen 
113cd4e3c3eSJouni Malinen 		if (WIFEXITED(ret)) {
114cd4e3c3eSJouni Malinen 			ret = WEXITSTATUS(ret);
115cd4e3c3eSJouni Malinen 		}
116cd4e3c3eSJouni Malinen 
117cd4e3c3eSJouni Malinen 		if ((f2 = fopen(log_file, "a")) == NULL) {
118cd4e3c3eSJouni Malinen 			free(cmd);
119cd4e3c3eSJouni Malinen 			return -1;
120cd4e3c3eSJouni Malinen 		}
121cd4e3c3eSJouni Malinen 
122cd4e3c3eSJouni Malinen 		if (fprintf(f2,"\nELOOP_CMD : %s\n", cmd) <= 0) {
123cd4e3c3eSJouni Malinen 			fclose(f2);
124cd4e3c3eSJouni Malinen 			free(cmd);
125cd4e3c3eSJouni Malinen 			return -1;
126cd4e3c3eSJouni Malinen 		}
127cd4e3c3eSJouni Malinen 
128cd4e3c3eSJouni Malinen 		if (fprintf(f2,"\nELOOP_CMD_STATUS : %d\n", ret) <= 0) {
129cd4e3c3eSJouni Malinen 			fclose(f2);
130cd4e3c3eSJouni Malinen 			free(cmd);
131cd4e3c3eSJouni Malinen 			return -1;
132cd4e3c3eSJouni Malinen 		}
133cd4e3c3eSJouni Malinen 
134cd4e3c3eSJouni Malinen 		/* Only free the cmd buffer. It is all that is left allocated */
135cd4e3c3eSJouni Malinen 		free(cmd);
136cd4e3c3eSJouni Malinen 
137cd4e3c3eSJouni Malinen 		fclose(f2);
138cd4e3c3eSJouni Malinen 
139cd4e3c3eSJouni Malinen 		/* Clean up */
140cd4e3c3eSJouni Malinen 		unlink(tag_file);
141cd4e3c3eSJouni Malinen 	}
142cd4e3c3eSJouni Malinen 
143cd4e3c3eSJouni Malinen 	return ret;
144cd4e3c3eSJouni Malinen }
145