sh: Split a command into arguments and pass those on

This is a big achievement!!
This commit is contained in:
apio 2022-10-26 20:06:21 +02:00
parent a4e430d35e
commit 6892fd96d0

View File

@ -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;