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