Files
tinysh/main.c
T

58 lines
1.3 KiB
C

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
#include<string.h>
#include<readline/readline.h>
#include<readline/history.h>
int handleBuiltins(char **args) {
if(strcmp(args[0], "cd") == 0) {
chdir(args[1] == NULL ? getenv("HOME") : args[1]);
return 1;
}
else if(strcmp(args[0], "exit") == 0) {
exit(0);
} else { return 0;}
}
char **parse(char *line) {
char **args= malloc(64 * sizeof(char *));
int i = 0;
char *token = strtok(line, " \t\n");
while(token !=NULL) {
args[i] = token;
i++;
token = strtok(NULL, " \t\n");
}
args[i] = NULL;
return args;
}
int main() {
while(1) {
char *user = getenv("USER");
char dir[1024];
getcwd(dir, sizeof(dir));
char host[1024];
gethostname(host, sizeof(host));
char prompt[2048];
snprintf(prompt, sizeof(prompt), "%s@%s %s$ ", user, host, dir);
char *line = readline(prompt);
if(line == NULL) return 0;
if(line && *line) add_history(line);
char **parsed = parse(line);
if(parsed[0] == NULL) { free(parsed); free(line); continue; }
if(handleBuiltins(parsed)) { free(line); free(parsed); continue; }
pid_t pid = fork();
if(pid == 0) {
if(execvp(parsed[0], parsed) == -1 ) {
perror("tinysh");
exit(1);
}
} else if(pid > 0) {
wait(NULL);
}
free(parsed);
free(line);
}
}