55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
#include<stdio.h>
|
|
#include<stdlib.h>
|
|
#include<sys/wait.h>
|
|
#include<unistd.h>
|
|
#include<string.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() {
|
|
char line[1024];
|
|
while(1) {
|
|
char *user = getenv("USER");
|
|
char dir[1024];
|
|
getcwd(dir, sizeof(dir));
|
|
char host[1024];
|
|
gethostname(host, sizeof(host));
|
|
printf("%s@%s %s$", user, host, dir);
|
|
fflush(stdout);
|
|
char *result = fgets(line, sizeof(line), stdin);
|
|
if(result == NULL) return 0;
|
|
char **parsed = parse(line);
|
|
if(parsed[0] == NULL) { free(parsed); continue; }
|
|
if(handleBuiltins(parsed)) { 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);
|
|
}
|
|
}
|
|
|