diff options
Diffstat (limited to 'fake-lib.c')
-rw-r--r-- | fake-lib.c | 43 |
1 files changed, 28 insertions, 15 deletions
@@ -28,6 +28,25 @@ char *ascii(const char16_t *wstr, bool translate_slashes) | |||
28 | return ret; | 28 | return ret; |
29 | } | 29 | } |
30 | 30 | ||
31 | void system_argv_array(char **args) | ||
32 | { | ||
33 | pid_t pid = fork(); | ||
34 | if (pid < 0) | ||
35 | err(1, "fork"); | ||
36 | |||
37 | if (pid == 0) { | ||
38 | execvp(args[0], args); | ||
39 | warn("execvp"); | ||
40 | _exit(127); | ||
41 | } | ||
42 | |||
43 | int status; | ||
44 | if (waitpid(pid, &status, 0) != pid) | ||
45 | err(1, "waitpid"); | ||
46 | if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0)) | ||
47 | errx(1, "subcommand failed"); | ||
48 | } | ||
49 | |||
31 | void system_argv(const char *cmd, ...) | 50 | void system_argv(const char *cmd, ...) |
32 | { | 51 | { |
33 | int nargs, nchars; | 52 | int nargs, nchars; |
@@ -54,21 +73,7 @@ void system_argv(const char *cmd, ...) | |||
54 | va_end(ap); | 73 | va_end(ap); |
55 | *argp++ = NULL; | 74 | *argp++ = NULL; |
56 | 75 | ||
57 | pid_t pid = fork(); | 76 | system_argv_array(args); |
58 | if (pid < 0) | ||
59 | err(1, "fork"); | ||
60 | |||
61 | if (pid == 0) { | ||
62 | execvp(args[0], args); | ||
63 | warn("execvp"); | ||
64 | _exit(127); | ||
65 | } | ||
66 | |||
67 | int status; | ||
68 | if (waitpid(pid, &status, 0) != pid) | ||
69 | err(1, "waitpid"); | ||
70 | if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0)) | ||
71 | errx(1, "subcommand failed"); | ||
72 | } | 77 | } |
73 | 78 | ||
74 | void c16cpy(char16_t *out, uint32_t *outsize, char *s) | 79 | void c16cpy(char16_t *out, uint32_t *outsize, char *s) |
@@ -91,6 +96,14 @@ void *smalloc(size_t size) | |||
91 | return toret; | 96 | return toret; |
92 | } | 97 | } |
93 | 98 | ||
99 | void *srealloc(void *ptr, size_t size) | ||
100 | { | ||
101 | void *toret = realloc(ptr, size); | ||
102 | if (!toret) | ||
103 | errx(1, "out of memory"); | ||
104 | return toret; | ||
105 | } | ||
106 | |||
94 | char *dupcat(const char *str, ...) | 107 | char *dupcat(const char *str, ...) |
95 | { | 108 | { |
96 | va_list ap; | 109 | va_list ap; |