#include #include #include #include #include char *HOME; char *HOSTNAME; char *USER; char PROMPT[50]; void do_exec (char *argv[]) { switch (fork ()) { case -1: perror ("fork()"); break; case 0: execvp (argv[0], argv); perror ("execvp()"); exit (1); break; default: wait (NULL); break; } } int is_special_command (char *argv[]) { if (!strcmp (argv[0], "exit")) { exit (0); } if (!strcmp (argv[0], "cd")) { if (!argv[1]) { chdir (HOME); return 1; } if (strchr (argv[1], '~')) { char aux[1024] = {}; strcat (aux, HOME); strcat (aux, argv[1] + 1); chdir (aux); } chdir (argv[1]); return 1; } return 0; } void parse_command (char *command) { char *argv[255]; unsigned char idx = 1; argv[0] = strtok (command, " \t\n"); while (argv[idx++] = strtok (NULL, " \t\n")) ; if (!is_special_command (argv)) { do_exec (argv); } } char *get_command () { char command[1024]; char c; int idx = 0; printf ("%s ", PROMPT); while ((c = getchar ()) != '\n') { switch (c) { case '\b': idx--; break; default: command[idx++] = c; break; } } command[idx] = '\0'; return command; } void setup () { HOME = getenv ("HOME"); HOSTNAME = getenv ("HOSTNAME"); USER = getenv ("USER"); strcpy (PROMPT, USER); strcat (PROMPT, "@"); strcat (PROMPT, HOSTNAME); strcat (PROMPT, "$ "); } int main (int argc, char *argv[]) { char *command; setup (); while (1) parse_command (get_command ()); return 0; }