Enhance shell.
[pintos-anon] / src / tests / userprog / shell.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <syscall.h>
4
5 int
6 main (void)
7 {
8   printf ("Shell starting...\n");
9   for (;;) 
10     {
11       char command[80], *cp;
12
13       /* Prompt. */
14       printf ("--");
15
16       /* Read and echo command. */
17       cp = command;
18       for (;;)
19         {
20           char c;
21           read (STDIN_FILENO, &c, 1);
22
23           switch (c) 
24             {
25             case '\n':
26               /* Done. */
27               goto got_cmd;
28
29             case '\b':
30               /* Back up cursor, overwrite character, back up again. */
31               printf ("\b \b");
32               break;
33
34             case 27:                    /* Escape. */
35             case ('U' - 'A') + 1:       /* Ctrl+U. */
36               /* Clear entire line. */
37               printf ("\n--");
38               cp = command;
39               break;
40
41             default:
42               /* Add character to line. */
43               *cp++ = c;
44               if (cp >= command + sizeof command - 1)
45                 goto got_cmd;
46               break;
47             }
48         }
49     got_cmd:
50       *cp = '\0';
51       putchar ('\n');
52       
53       /* Execute command. */
54       if (!strcmp (command, "exit"))
55         break;
56       else if (cp == command) 
57         {
58           /* Empty command. */
59         }
60       else
61         {
62           pid_t pid = exec (command);
63           if (pid != PID_ERROR)
64             printf ("\"%s\": exit code %d\n", command, wait (pid));
65           else
66             printf ("exec failed\n");
67         }
68     }
69
70   printf ("Shell exiting.");
71   return 0;
72 }