#include "syscall.h" #include #include #include #include const char* shell_prompt = "rocksh> "; char buf[256]; size_t buf_offset = 0; char path[256]; const char* bin_dir = "/bin/"; void parse_cmd() { if (strcmp(buf, "exit") == 0) { printf("bye!\n"); exit(0); } if (strcmp(buf, "motd") == 0) { printf("rockos is the best!\n"); return; } strcpy(path, bin_dir); strcat(path, buf); int pid = fork(); if (pid == 0) { if (!exec(path)) { printf("failed to execute %s\n", path); exit(0); } } int status; waitpid(pid, &status); printf("process exited with status %d\n", status); } void reset() { memset(buf, 0, 256); buf_offset = 0; } int main(int argc, char *argv[]) { (void)argc; (void)argv; printf(shell_prompt); while (1) { char c; int rd = read(0, &c, 1); if (rd > 0) { if (c == '\n') { parse_cmd(); reset(); printf(shell_prompt); continue; } buf[buf_offset++] = c; } } return 0; }