diff options
Diffstat (limited to 'piper.c')
-rw-r--r-- | piper.c | 48 |
1 files changed, 40 insertions, 8 deletions
@@ -68,28 +68,46 @@ failx(int exit, const char *msg, ...) } void +grow_argv(char ***argv, size_t *len) +{ +#define GROW_SIZE 32 + + char **ret = realloc(*argv, sizeof(char *) * (*len + GROW_SIZE)); + if (ret == NULL) + err(1, "realloc"); + + *argv = ret; + *len += GROW_SIZE; + +#undef GROW_SIZE +} + +void gen_argv(struct proc *proc) { - int i; char *saveptr, *tmp, *cmd; - char **argv, **head; + char **argv = NULL, **head; + + size_t len = 0, used = 0; - // XXX: Check for overflow in argv - argv = malloc(sizeof(char*) * 1024); - if (argv == NULL) - err(1, "malloc"); cmd = strdup(proc->cmd); if (cmd == NULL) err(1, "strdup"); + grow_argv(&argv, &len); head = argv; - for (i = 0; i < 1024; i++) - argv[i] = NULL; tmp = strtok_r(cmd, " \t", &saveptr); while (tmp != NULL) { *(head++) = strdup(tmp); + used++; + + if (used >= len) { + grow_argv(&argv, &len); + head = argv + used; + } + tmp = strtok_r(NULL, " \t", &saveptr); } *head = NULL; @@ -219,6 +237,20 @@ start_missing_procs() } } +void +print_argv() +{ + int i; + for (i = 0; i < NUM_PROCS; i++) { + char **tmp = procs[i].argv; + + while (*tmp) + printf("%s ", *tmp++); + + printf("\n"); + } +} + int main(int argc, char **argv) { |