diff --git a/apps/src/sh.c b/apps/src/sh.c index b4b9d306..cdf85167 100644 --- a/apps/src/sh.c +++ b/apps/src/sh.c @@ -16,6 +16,33 @@ typedef struct size_t capacity; } command; +char** split_command_into_argv(const char* cmd) +{ + size_t argc = 1; + char* ptr = strdup(cmd); + char* endptr; + char** arr = calloc(sizeof(char*), argc); + for (;;) + { + endptr = strchr(ptr, ' '); + arr[argc - 1] = ptr; + if (endptr == NULL) break; + *endptr = 0; + ptr = endptr + 1; + if (*ptr) + { + argc++; + arr = realloc(arr, sizeof(char*) * argc); + } + else + break; + } + argc++; + arr = realloc(arr, sizeof(char*) * argc); + arr[argc - 1] = NULL; + return arr; +} + char* shell_concat_path(const char* dirname, const char* basename) { char* buf = malloc(strlen(basename) + strlen(dirname) + 6); @@ -137,9 +164,9 @@ void command_execute(command* cmd) } if (child == 0) { - char* argv[] = {cmd->buffer, NULL}; + char** argv = split_command_into_argv(cmd->buffer); shell_execvp(argv[0], argv); - perror(cmd->buffer); + perror(argv[0]); exit(127); } pid_t result;