X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftests%2Fuserprog%2Fshell.c;h=cfff4e37ea329f5fc1cef3eb0c7b2ca82b77c5c3;hb=ca5e8cf5caf2dadcd0e36ad1ecd5e1dd67088392;hp=7cf5c607d7d431df8d6ad7cc517a27be910c3fcc;hpb=202cb2ab659c2ff94a3cf58ae86400095e767fc3;p=pintos-anon diff --git a/src/tests/userprog/shell.c b/src/tests/userprog/shell.c index 7cf5c60..cfff4e3 100644 --- a/src/tests/userprog/shell.c +++ b/src/tests/userprog/shell.c @@ -1,9 +1,11 @@ #include +#include #include int main (void) { + printf ("Shell starting...\n"); for (;;) { char command[80], *cp; @@ -12,23 +14,59 @@ main (void) printf ("--"); /* Read and echo command. */ - for (cp = command; cp < command + sizeof command - 1; cp++) + cp = command; + for (;;) { - read (STDIN_FILENO, cp, 1); - putchar (*cp); - if (*cp == '\n') - break; + char c; + read (STDIN_FILENO, &c, 1); + + switch (c) + { + case '\n': + /* Done. */ + goto got_cmd; + + case '\b': + /* Back up cursor, overwrite character, back up again. */ + printf ("\b \b"); + break; + + case 27: /* Escape. */ + case ('U' - 'A') + 1: /* Ctrl+U. */ + /* Clear entire line. */ + printf ("\n--"); + cp = command; + break; + + default: + /* Add character to line. */ + *cp++ = c; + if (cp >= command + sizeof command - 1) + goto got_cmd; + break; + } } + got_cmd: *cp = '\0'; + putchar ('\n'); /* Execute command. */ - if (cp > command) + if (!strcmp (command, "exit")) + break; + else if (cp == command) + { + /* Empty command. */ + } + else { pid_t pid = exec (command); if (pid != PID_ERROR) - wait (pid); + printf ("\"%s\": exit code %d\n", command, wait (pid)); else printf ("exec failed\n"); } } + + printf ("Shell exiting."); + return 0; }