1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
/*
** execprog.c -- invoke an external command synchronously
** This is a safer alternative to system(3)
*/
#include <h/mh.h>
#include <unistd.h>
#include <stdarg.h>
#include <sysexits.h>
int
execprog(char *cmd, char **arg)
{
pid_t pid;
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(EX_OSERR);
default:
/* parent */
return pidXwait(pid, cmd);
}
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;
}
|