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