+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;
+ }
+ }
+done:
+ argv[0] = argv[1];
+ argv[1] = "-";
+ argv[i+1] = arg;
+ argv[i+2] = 0;
+ envp[0] = 0;
+ execve(argv[0], &argv[1], envp);
+ /* report failure of exec */
+ syslog(LOG_ERR, "%s: %m", argv[0]);
+ closelog();
+ sleep(10); /* prevent failures from eating machine */
+}