aboutsummaryrefslogtreecommitdiff
path: root/subproc.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2017-05-18 07:09:40 +0100
committerSimon Tatham <anakin@pobox.com>2017-05-18 07:10:17 +0100
commit3b3a5fd6bf7a3542ab8e8701c93c3d0f505c722f (patch)
tree5d8299dec3ce144bb5765382b6268fb39a856542 /subproc.c
parent48919caa7b9fb99ba8196098c0ca2e1b3dae5160 (diff)
downloadwix-on-linux-3b3a5fd6bf7a3542ab8e8701c93c3d0f505c722f.tar.gz
wix-on-linux-3b3a5fd6bf7a3542ab8e8701c93c3d0f505c722f.tar.bz2
wix-on-linux-3b3a5fd6bf7a3542ab8e8701c93c3d0f505c722f.zip
Move system_argv_* into their own file.
Diffstat (limited to 'subproc.c')
-rw-r--r--subproc.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/subproc.c b/subproc.c
new file mode 100644
index 0000000..ae4991f
--- /dev/null
+++ b/subproc.c
@@ -0,0 +1,59 @@
1#include <stddef.h>
2#include <stdarg.h>
3#include <string.h>
4#include <err.h>
5
6#include <sys/types.h>
7#include <sys/wait.h>
8#include <unistd.h>
9
10#include "subproc.h"
11
12void system_argv_array(char **args)
13{
14 pid_t pid = fork();
15 if (pid < 0)
16 err(1, "fork");
17
18 if (pid == 0) {
19 execvp(args[0], args);
20 warn("execvp");
21 _exit(127);
22 }
23
24 int status;
25 if (waitpid(pid, &status, 0) != pid)
26 err(1, "waitpid");
27 if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0))
28 errx(1, "subcommand failed");
29}
30
31void system_argv(const char *cmd, ...)
32{
33 int nargs, nchars;
34 const char *word;
35 va_list ap;
36
37 va_start(ap, cmd);
38 nargs = 1; /* terminating NULL */
39 nchars = 0;
40 for (word = cmd; word; word = va_arg(ap, const char *)) {
41 nargs++;
42 nchars += 1 + strlen(word);
43 }
44 va_end(ap);
45
46 char *args[nargs], chars[nchars];
47 char **argp = args, *charp = chars;
48 va_start(ap, cmd);
49 for (word = cmd; word; word = va_arg(ap, const char *)) {
50 *argp++ = charp;
51 strcpy(charp, word);
52 charp += 1 + strlen(word);
53 }
54 va_end(ap);
55 *argp++ = NULL;
56
57 system_argv_array(args);
58}
59