#include #include #include #include #include #include #include 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); } }