1 /*
2 ** execprog.c -- invoke an external command synchronously
3 ** This is a safer alternative to system(3)
4 */
5
6 #include <h/mh.h>
7 #include <unistd.h>
8 #include <stdarg.h>
9 #include <sysexits.h>
10
11
12 int
execprog(char * cmd,char ** arg)13 execprog(char *cmd, char **arg)
14 {
15 pid_t pid;
16
17 fflush(stdout);
18 switch (pid = fork()) {
19 case -1:
20 /* fork error */
21 advise("fork", "unable to");
22 return -1;
23
24 case 0:
25 /* child */
26 execvp(cmd, arg);
27 fprintf(stderr, "unable to exec ");
28 perror(cmd);
29 _exit(EX_OSERR);
30
31 default:
32 /* parent */
33 return pidXwait(pid, cmd);
34 }
35
36 return -1; /* NOT REACHED */
37 }
38
39
40 int
execprogl(char * cmd,char * arg,...)41 execprogl(char *cmd, char *arg, ...)
42 {
43 va_list ap;
44 int argc = 0;
45 char *argv[MAXARGS];
46 char *cp;
47 int ret;
48
49 argv[argc++] = mhbasename(arg);
50 va_start(ap, arg);
51 while ((cp = va_arg(ap, char *))) {
52 argv[argc++] = cp;
53 }
54 argv[argc] = NULL;
55 ret = execprog(cmd, argv);
56 va_end(ap);
57
58 return ret;
59 }
60