sh: Split a command into arguments and pass those on
This is a big achievement!!
This commit is contained in:
parent
a4e430d35e
commit
6892fd96d0
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user