93 lines
1.7 KiB
C
93 lines
1.7 KiB
C
|
#include "main.h"
|
||
|
|
||
|
int main() {
|
||
|
|
||
|
int status = 0;
|
||
|
size_t input_size = 2048;
|
||
|
size_t getline_len;
|
||
|
char* input = malloc(sizeof(char) * input_size);
|
||
|
|
||
|
while(1) {
|
||
|
printf(": ");
|
||
|
fflush(stdout);
|
||
|
getline_len = getline(&input, &input_size, stdin);
|
||
|
input[getline_len - 1] = '\0';
|
||
|
|
||
|
// Ignore whitespace or comments
|
||
|
if(input == NULL ||
|
||
|
input[0] == '#') {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
|
||
|
char*** array = malloc(sizeof(char**));
|
||
|
int num_strings = input_format(input, input_size, array);
|
||
|
|
||
|
char* first_array = (*array)[0];
|
||
|
|
||
|
// Built in shell commands
|
||
|
if(!strncmp(first_array, "exit", 4))
|
||
|
return 0;
|
||
|
else if(!strncmp(first_array, "cd", 2))
|
||
|
inbuilt_cd((*array)[1]);
|
||
|
else if (!strncmp(first_array, "status", 6))
|
||
|
printf("%d\n", status);
|
||
|
else
|
||
|
status = run_command(array, num_strings);
|
||
|
fflush(stdout);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int input_format(char* input, size_t input_size, char*** array) {
|
||
|
|
||
|
const int max_args = 512;
|
||
|
int num_strings = 0;
|
||
|
char* pch;
|
||
|
*array = malloc(sizeof(char*) * max_args);
|
||
|
|
||
|
pch = strtok (input," ");
|
||
|
while (pch != NULL)
|
||
|
{
|
||
|
(*array)[num_strings] = malloc(sizeof(char*) * (strlen(pch) + 1));
|
||
|
strcpy((*array)[num_strings], pch);
|
||
|
num_strings++;
|
||
|
|
||
|
pch = strtok (NULL, " ");
|
||
|
}
|
||
|
|
||
|
return num_strings;
|
||
|
}
|
||
|
|
||
|
void inbuilt_cd(char* args) {
|
||
|
|
||
|
if(args)
|
||
|
chdir(args);
|
||
|
else
|
||
|
chdir(getenv("HOME"));
|
||
|
|
||
|
}
|
||
|
|
||
|
int run_command(char*** array, int num_array) {
|
||
|
|
||
|
char* comb_string = malloc(sizeof(char) * 100);
|
||
|
sprintf(comb_string, "/usr/bin/");
|
||
|
strcat(comb_string, (*array)[0]);
|
||
|
int f = fork();
|
||
|
pid_t pid;
|
||
|
if(!f)
|
||
|
pid = execv(comb_string, (*array));
|
||
|
|
||
|
int status;
|
||
|
waitpid(pid, &status, 0);
|
||
|
|
||
|
free(comb_string);
|
||
|
|
||
|
return status;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|