/* * e_loop helper program * Copyright (c) 2015, Qualcomm Atheros, Inc. * All Rights Reserved. * Licensed under the Clear BSD license. See README for more details. */ #include #include #include #include #include #include char *e_loop_cmd_file = "/data/local/hs2/To_Phone/tag_file"; char *e_loop_log_file = "/data/local/hs2/To_Phone/Logs/e_loop.log"; static const char *log_file = NULL; static const char *tag_file = NULL; int main(int argc, char *argv[]) { char *buf = NULL; char *cmd = NULL; long pos; int c, ret; size_t len = 0; FILE *f, *f2 = NULL; /* Set the defaults */ log_file = e_loop_log_file; tag_file = e_loop_cmd_file; for (;;) { c = getopt(argc, argv, "l:t:"); if (c < 0) break; switch (c) { case 'l': log_file = optarg; break; case 't': tag_file = optarg; break; default: printf("usage: e_loop [-l] [-t]\n"); exit(0); break; } } /* Main command event loop */ while (1) { /* Wait for a tag_file with a command to process */ while (!(f = fopen(tag_file, "rb"))) sleep(1); len = 80; /* Figure out how long the file is */ if (fseek(f, 0, SEEK_END) < 0 || (pos = ftell(f)) < 0) { fclose(f); return -1; } len = pos; if (fseek(f, 0, SEEK_SET) < 0) { fclose(f); return -1; } buf = malloc(len); if (!buf) return -1; /* Read up the command line */ if (fread(buf, 1, len, f) != len) { fclose(f); free(buf); return -1; } fclose(f); buf[len - 1] = '\0'; if (log_file) { len = strlen(buf) + strlen(log_file) + 7; cmd = malloc(len); if (cmd == NULL) { free(buf); return -1; } ret = snprintf(cmd, len, "%s > %s", buf, log_file); if (ret < 0 || (size_t) ret >= len) { free(buf); free(cmd); return -1; } free(buf); buf = NULL; } else { cmd = buf; } cmd[len - 1] = '\0'; /* * This string "cmd" will contain the command passed in by * hs20-action.sh. And the name of the "logfile". Which can be * monitored for the result. */ ret = system(cmd); if (WIFEXITED(ret)) { ret = WEXITSTATUS(ret); } if ((f2 = fopen(log_file, "a")) == NULL) { free(cmd); return -1; } if (fprintf(f2,"\nELOOP_CMD : %s\n", cmd) <= 0) { fclose(f2); free(cmd); return -1; } if (fprintf(f2,"\nELOOP_CMD_STATUS : %d\n", ret) <= 0) { fclose(f2); free(cmd); return -1; } /* Only free the cmd buffer. It is all that is left allocated */ free(cmd); fclose(f2); /* Clean up */ unlink(tag_file); } return ret; }