Added execprog() and execprogl(), which are safer alternatives to system(3)
[mmh] / sbr / execprog.c
diff --git a/sbr/execprog.c b/sbr/execprog.c
new file mode 100644 (file)
index 0000000..6a4a912
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+** execprog.c -- invoke an external command synchronously
+**               This is a safer alternative to system(3)
+*/
+
+#include <h/mh.h>
+
+
+int
+execprog(char *cmd, char **arg)
+{
+       pid_t pid;
+
+       context_save();
+       fflush(stdout);
+
+       switch (pid = fork()) {
+       case -1:
+               /* fork error */
+               advise("fork", "unable to");
+               return 1;
+
+       case 0:
+               /* child */
+               execvp(cmd, arg);
+               fprintf(stderr, "unable to exec ");
+               perror(cmd);
+               _exit(-1);
+
+       default:
+               /* parent */
+               return (pidwait(pid, -1) & 0377 ? 1 : 0);
+       }
+
+       return 1;  /* NOT REACHED */
+}
+
+
+int
+execprogl(char *cmd, char *arg, ...)
+{
+       va_list ap;
+       int argc = 0;
+       char *argv[MAXARGS];
+       char *cp;
+       int ret;
+
+       argv[argc++] = mhbasename(arg);
+       va_start(ap, arg);
+       while ((cp = va_arg(ap, char *))) {
+               argv[argc++] = cp;
+       }
+       argv[argc] = NULL;
+       ret = execprog(cmd, argv);
+       va_end(ap);
+
+       return ret;
+}