aboutsummaryrefslogtreecommitdiffstats
path: root/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c89
1 files changed, 74 insertions, 15 deletions
diff --git a/exec.c b/exec.c
index 2617206..3c7c8de 100644
--- a/exec.c
+++ b/exec.c
@@ -1,4 +1,4 @@
-/* $Id: exec.c,v 1.2 2001/03/08 08:39:54 reinelt Exp $
+/* $Id: exec.c,v 1.3 2001/03/08 15:25:38 ltoetsch Exp $
*
* exec ('x*') functions
*
@@ -20,6 +20,9 @@
*
*
* $Log: exec.c,v $
+ * Revision 1.3 2001/03/08 15:25:38 ltoetsch
+ * improved exec
+ *
* Revision 1.2 2001/03/08 08:39:54 reinelt
*
* fixed two typos
@@ -28,43 +31,99 @@
* added e(x)ec commands
*
*
+ * This implements the x1 .. x9 commands
+ * config options:
+ * x1 .. x9 command to execute
+ * Tick_x1 ... 9 delay in ticks
+ * Delay_x1 .. 9 delay in seconds
+ * Scale_x1 .. 9 scale for bars
*/
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <time.h>
+#include <ctype.h>
+#include <errno.h>
+#define IN_EXEC
#include "exec.h"
#include "debug.h"
#include "cfg.h"
-int Exec(int index, char buff[EXEC_TXT_LEN])
+int Exec(int index, char buff[EXEC_TXT_LEN], double *val)
{
- static time_t now = 0;
- char *command;
- char xn[4];
+ static time_t now[EXECS+1];
+ static int errs[EXECS+1];
+ static int ticks[EXECS+1];
+ char *command, *p;
+ char xn[20];
+ char env[EXEC_TXT_LEN];
FILE *pipe;
+ size_t len;
+ int i;
+
+ if (index < 1 || index > EXECS)
+ return -1;
+ if (errs[index])
+ return -1;
- if (time(NULL) <= now+EXEC_WAIT)
- return 0;
- time(&now);
+ /* first time ? */
+ if (now[index] != 0) {
+ /* delay in Ticks ? */
+ sprintf(xn, "Tick_x%d", index);
+ p = cfg_get(xn);
+ if (p && *p) {
+ if (ticks[index]++ % atoi(p) != 0)
+ return 0;
+ }
+ else {
+ sprintf(xn, "Delay_x%d", index);
+ /* delay in Delay_x* sec ? */
+ if (time(NULL) <= now[index] + atoi(cfg_get(xn)?:"1"))
+ return 0;
+ }
+ }
+ time(&now[index]);
+ *val = -1;
sprintf(xn, "x%d", index);
command = cfg_get(xn);
- debug("command%d = %s:%s",index,xn,command);
+ debug("%s:'%s'",xn,command);
- if (!*command) {
+ if (!command || !*command) {
error("Empty command for 'x%d'", index);
+ errs[index]++;
return -1;
}
-
+ for (i = 1; i < index; i++) {
+ sprintf(env, "X%d=%.*s", i, EXEC_TXT_LEN-10, exec[i].s);
+ putenv(env);
+ }
+ putenv("PATH=/usr/local/bin:/usr/bin:/bin");
pipe = popen(command, "r");
if (pipe == NULL) {
- error("Couln't run pipe '%s'", command);
+ error("Couldn't run pipe '%s':\n%s", command, strerror(errno));
+ errs[index]++;
+ return -1;
+ }
+ len = fread(buff, 1, EXEC_TXT_LEN-1, pipe);
+ if (len <= 0) {
+ pclose(pipe);
+ error("Couldn't fread from pipe '%s', len=%d", command, len);
+ errs[index]++;
+ *buff = '\0';
return -1;
}
- fread(buff, EXEC_TXT_LEN, 1, pipe);
- fclose(pipe);
- buff[EXEC_TXT_LEN-1] = '\0';
+ pclose(pipe);
+ buff[len] = '\0';
+ for (p = buff ; *p && isspace(*p); p++)
+ ;
+ if (isdigit(*p)) {
+ *val = atof(p);
+ sprintf(xn, "Scale_x%d", index);
+ *val /= atoi(cfg_get(xn)?:"100")?:100;
+ }
return 0;
}