OS1/smallsh/main.c

92 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;
}