+ }
+ }
+}
+
+wterm(p)
+ register struct tab *p;
+{
+ if (p->wpid != 0) {
+ kill(p->wpid, SIGKILL);
+ }
+ p->wpid = 0;
+}
+
+wstart(p)
+ register struct tab *p;
+{
+ register pid;
+ time_t t;
+ int dowait = 0;
+
+ time(&t);
+ p->windcnt++;
+ if ((t - p->windtime) >= 60) {
+ p->windtime = t;
+ p->windcnt = 1;
+ } else if (p->windcnt >= 5) {
+ dowait = 1;
+ p->windtime = t;
+ p->windcnt = 1;
+ }
+
+ pid = fork();
+
+ if (pid == 0) {
+ signal(SIGTERM, SIG_DFL);
+ signal(SIGHUP, SIG_IGN);
+ sigsetmask(0); /* since can be called from masked code */
+ if (dowait) {
+ syslog(LOG_ERR, "'%s %s' failing, sleeping", p->wcmd, p->line);
+ closelog();
+ sleep(30);
+ }
+ execit(p->wcmd, p->line);
+ exit(0);
+ }
+ p->wpid = pid;
+}
+
+#define NARGS 20 /* must be at least 4 */
+#define ARGLEN 512 /* total size for all the argument strings */
+
+execit(s, arg)
+ char *s;
+ char *arg; /* last argument on line */
+{
+ char *argv[NARGS], args[ARGLEN], *envp[1];
+ register char *sp = s;
+ register char *ap = args;
+ register char c;
+ register int i;
+
+ /*
+ * First we have to set up the argument vector.
+ * "prog arg1 arg2" maps to exec("prog", "-", "arg1", "arg2").
+ */
+ for (i = 1; i < NARGS - 2; i++) {
+ argv[i] = ap;
+ for (EVER) {
+ if ((c = *sp++) == '\0' || ap >= &args[ARGLEN-1]) {
+ *ap = '\0';
+ goto done;
+ }
+ if (c == ' ') {
+ *ap++ = '\0';
+ while (*sp == ' ')
+ sp++;
+ if (*sp == '\0')
+ goto done;
+ break;
+ }
+ *ap++ = c;
+ }