summaryrefslogtreecommitdiffstats
path: root/02_exercise/process.c
diff options
context:
space:
mode:
Diffstat (limited to '02_exercise/process.c')
-rw-r--r--02_exercise/process.c30
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);
}