blob: 756e7317384ac091700848f2537d7bb4dcfa751f [file] [log] [blame]
/*
* 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 <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
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<log_filename>] [-t<tag_filename>]\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) {
fclose(f);
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;
}