return -1 if fork(2) fails in execprog
[mmh] / sbr / execprog.c
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
8
9 int
10 execprog(char *cmd, char **arg)
11 {
12         pid_t pid;
13
14         fflush(stdout);
15         switch (pid = fork()) {
16         case -1:
17                 /* fork error */
18                 advise("fork", "unable to");
19                 return -1;
20
21         case 0:
22                 /* child */
23                 execvp(cmd, arg);
24                 fprintf(stderr, "unable to exec ");
25                 perror(cmd);
26                 _exit(-1);
27
28         default:
29                 /* parent */
30                 return pidXwait(pid, cmd);
31         }
32
33         return -1;  /* NOT REACHED */
34 }
35
36
37 int
38 execprogl(char *cmd, char *arg, ...)
39 {
40         va_list ap;
41         int argc = 0;
42         char *argv[MAXARGS];
43         char *cp;
44         int ret;
45
46         argv[argc++] = mhbasename(arg);
47         va_start(ap, arg);
48         while ((cp = va_arg(ap, char *))) {
49                 argv[argc++] = cp;
50         }
51         argv[argc] = NULL;
52         ret = execprog(cmd, argv);
53         va_end(ap);
54
55         return ret;
56 }