/* * Shell for OS-161 * Usage: Testing system calls for Assignment-2 */ #ifdef HOST #include "hostcompat.h" #endif #include #include #include #include #define MAX_LINE_LENGTH 255 #define MAX_ARGS 255 int get_line(char *line) { int pos; int ch; pos = 0; while (1) { ch = getchar(); if (ch == EOF) break; putchar(ch); if (ch == '\n') { break; } line[pos++] = ch; if (pos == MAX_LINE_LENGTH - 1) { putchar('\n'); break; } } line[pos] = '\0'; return 0; } int main(int argc, char *argv[]) { #ifdef HOST hostcompat_init(argc, argv); #endif (void)argc; (void)argv; char line[MAX_LINE_LENGTH]; int result; pid_t child_pid; int status; char *tokens[MAX_ARGS+1]; while (1) { printf("os161-sh$ "); result = get_line(line); if (strcmp(line, "exit") == 0) break; if (strlen(line) == 0) continue; tokens[0] = (char *)line; int count = 0; char *ptr; for (ptr = line; *ptr != (char)NULL; ptr++) { if (*ptr == ' ') { *ptr = (char)NULL; tokens[++count] = ptr + 1; } } tokens[count+1] = NULL; child_pid = fork(); if (child_pid == 0) { execv(line, tokens); printf("%s: execv failed\n", tokens[0]); exit(1); // TODO } else { waitpid(child_pid, &status, 0); } } exit(0); }