From d327ae4f04c98337ee63bbcb727d1d6ac87b3734 Mon Sep 17 00:00:00 2001 From: Marius Halden Date: Thu, 29 Oct 2015 00:19:38 +0100 Subject: Add more error checking --- piper.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 10 deletions(-) (limited to 'piper.c') diff --git a/piper.c b/piper.c index af35e6e..6eb8ad8 100644 --- a/piper.c +++ b/piper.c @@ -1,5 +1,7 @@ +#include #include #include +#include #include #include #include @@ -23,28 +25,73 @@ int fds[2]; volatile sig_atomic_t terminate = 0; volatile sig_atomic_t sendsignal = 0; +void +reap_all() +{ + int i; + for (i = 0; i < NUM_PROCS; i++) { + if (procs[i].pid != -1) + kill(procs[i].pid, SIGTERM); + } + + sleep(5); + + for (i = 0; i < NUM_PROCS; i++) { + if (procs[i].pid != -1) + kill(procs[i].pid, SIGKILL); + } +} + +void +fail(int exit, const char *msg, ...) +{ + reap_all(); + + va_list args; + va_start(args, msg); + verr(exit, msg, args); + va_end(args); // Not reached? +} + +void +failx(int exit, const char *msg, ...) +{ + reap_all(); + + va_list args; + va_start(args, msg); + verrx(exit, msg, args); + va_end(args); // Not reached? +} + void gen_argv(struct proc *proc) { int i; - char *saveptr, *tmp; - char **argv = malloc(sizeof(char*) * 1024); - char **head = argv; - char *cmd2 = strdup(proc->cmd); - // XXX: Check malloc/strdup return - // XXX: Check for overflow in tmp - + char *saveptr, *tmp, *cmd; + char **argv, **head; + + // XXX: Check for overflow in argv + argv = malloc(sizeof(char*) * 1024); + if (argv == NULL) + fail(1, "malloc"); + + cmd = strdup(proc->cmd); + if (cmd == NULL) + fail(1, "strdup"); + + head = argv; for (i = 0; i < 1024; i++) argv[i] = NULL; - tmp = strtok_r(cmd2, " \t", &saveptr); + tmp = strtok_r(cmd, " \t", &saveptr); while (tmp != NULL) { *(head++) = strdup(tmp); tmp = strtok_r(NULL, " \t", &saveptr); } *head = NULL; - free(cmd2); + free(cmd); proc->argv = argv; } @@ -72,7 +119,7 @@ run_cmd(struct proc *proc) close(fds[1]); execvp(proc->argv[0], proc->argv); - perror("execvp"); + fail(1, "execvp"); } else if (cpid == -1) { // error D: return -1; -- cgit v1.2.3