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;
|
size_t capacity;
|
||||||
} command;
|
} 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* shell_concat_path(const char* dirname, const char* basename)
|
||||||
{
|
{
|
||||||
char* buf = malloc(strlen(basename) + strlen(dirname) + 6);
|
char* buf = malloc(strlen(basename) + strlen(dirname) + 6);
|
||||||
@ -137,9 +164,9 @@ void command_execute(command* cmd)
|
|||||||
}
|
}
|
||||||
if (child == 0)
|
if (child == 0)
|
||||||
{
|
{
|
||||||
char* argv[] = {cmd->buffer, NULL};
|
char** argv = split_command_into_argv(cmd->buffer);
|
||||||
shell_execvp(argv[0], argv);
|
shell_execvp(argv[0], argv);
|
||||||
perror(cmd->buffer);
|
perror(argv[0]);
|
||||||
exit(127);
|
exit(127);
|
||||||
}
|
}
|
||||||
pid_t result;
|
pid_t result;
|
||||||
|
Loading…
Reference in New Issue
Block a user