diff options
Diffstat (limited to '02_exercise/process.c')
-rw-r--r-- | 02_exercise/process.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/02_exercise/process.c b/02_exercise/process.c index 5e0a1ae..fb55236 100644 --- a/02_exercise/process.c +++ b/02_exercise/process.c @@ -8,7 +8,7 @@ #include "process.h" // given a substring of a line tries to parse out as much information as possible -int parse_command(char const *line, char const *end, Process *p) { +int parse_command(char const *line, char const *end, process *p) { char *part; char **local_parts; if (arrayInit(part) != 0 || arrayInit(local_parts) != 0) { @@ -23,6 +23,7 @@ int parse_command(char const *line, char const *end, Process *p) { arrayPush(part) = c; break; case ' ': + case '\t': case '\0': if (arrayLen(part) == 0) continue; @@ -47,7 +48,7 @@ int parse_command(char const *line, char const *end, Process *p) { return 0; } -int parse_line(char const *const line, Process **processes) { +int parse_line(char const *const line, process **processes) { // splits the line at | and then parses the commands int ret_code; @@ -59,7 +60,7 @@ int parse_line(char const *const line, Process **processes) { bool done = false; char const *cursor = line; while (!done) { - Process p = {.in_fd = 0, .out_fd = 0, .pid = 0, .blocking = true}; + process p = {.argv = NULL, .argc = 0, .in_fd = 0, .out_fd = 0, .pid = 0, .blocking = true}; char const *end = strchr(cursor, '|'); if (end == NULL) { @@ -75,8 +76,8 @@ int parse_line(char const *const line, Process **processes) { cursor = end + 1; } - size_t p_len = arrayLen(*processes); - Process *last = *processes + (p_len - 1); + size_t p_len = arrayLen(*processes); + process *last = *processes + (p_len - 1); // linking up all processes as we currently only have pipes for multiple commands for (size_t i = 0; i < p_len - 1; ++i) { @@ -99,10 +100,11 @@ int parse_line(char const *const line, Process **processes) { (*processes)[i].blocking = false; } } + return ret_code; } -int exec_command(Process p) { +int exec_command(process p) { int status; if (!p.blocking) { @@ -116,12 +118,14 @@ int exec_command(Process p) { dup2(p.in_fd, 0); close(p.in_fd); } + if (p.out_fd != 0) { dup2(p.out_fd, 1); close(p.out_fd); } + execvp(p.argv[0], p.argv); - fprintf(stderr, "could not execute \"%s\"\n", p.argv[0]); + fprintf(stderr, "command not found: \"%s\"\n", p.argv[0]); fflush(stderr); exit(-1); } @@ -155,14 +159,16 @@ int exec_command(Process p) { return WEXITSTATUS(status); } -void free_processes(Process **pr) { - Process *processes = *pr; +void free_processes(process **pr) { + process *processes = *pr; while (!arrayIsEmpty(processes)) { - Process p = arrayPop(processes); + process p = arrayPop(processes); while (!arrayIsEmpty(p.argv)) { - char *tmp = arrayPop(p.argv); - if (tmp) + char *tmp = arrayTop(p.argv); + if (tmp) { arrayRelease(tmp); + } + arrayPop(p.argv) = NULL; } arrayRelease(p.argv); } |