diff options
Diffstat (limited to 'usr.bin/osh')
-rw-r--r-- | usr.bin/osh/osh.c | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/usr.bin/osh/osh.c b/usr.bin/osh/osh.c index f3a3a93..4064c12 100644 --- a/usr.bin/osh/osh.c +++ b/usr.bin/osh/osh.c @@ -55,6 +55,7 @@ "fetch - System information\n" \ "kfg - Start up kfgwm\n" \ "bell - Toggle backspace bell\n" \ + "time - Get the current time\n" \ "exit - Exit the shell" #define PROMPT "[root::osmora]~ " @@ -65,37 +66,36 @@ static int running; static int bell_fd; static bool bs_bell = true; /* Beep on backspace */ -struct command { +struct builtin_cmd { const char *name; - const char *path; void (*func)(int argc, char *argv[]); }; -void +static void cmd_help(int argc, char *argv[]) { puts(HELP); } -void +static void cmd_exit(int argc, char *argv[]) { running = 0; } -void +static void cmd_reboot(int argc, char *argv[]) { cpu_reboot(REBOOT_RESET); } -void +static void cmd_shutdown(int argc, char *argv[]) { cpu_reboot(REBOOT_POWEROFF | REBOOT_HALT); } -void +static void cmd_echo(int argc, char *argv[]) { for (i = 1; i < argc; i++) { @@ -105,7 +105,7 @@ cmd_echo(int argc, char *argv[]) putchar('\n'); } -void +static void cmd_bell(int argc, char *argv[]) { const char *usage_str = "usage: bell [on/off]"; @@ -126,7 +126,7 @@ cmd_bell(int argc, char *argv[]) } } -int +static int parse_args(char *input, char *argv[], int max_args) { int argc = 0; @@ -207,28 +207,35 @@ getstr(void) } static void -command_run(struct command *cmd, int argc, char *argv[]) +builtin_run(struct builtin_cmd *cmd, int argc, char *argv[]) { if (cmd->func != NULL) { cmd->func(argc, argv); return; } +} + +static int +cmd_run(const char *input, int argc, char *argv[]) +{ + char bin_path[256]; + int error; - if (cmd->path != NULL) { - spawn(cmd->path, SPAWN_WAIT); + snprintf(bin_path, sizeof(bin_path), "/usr/bin/%s", input); + if ((error = spawn(bin_path, SPAWN_WAIT)) < 0) { + return error; } + + return 0; } -struct command cmds[] = { - {"help", NULL, cmd_help}, - {"echo", NULL, cmd_echo}, - {"exit", NULL, cmd_exit}, - {"reboot", NULL, cmd_reboot}, - {"shutdown", NULL, cmd_shutdown}, - {"bell", NULL, cmd_bell}, - {"kmsg", "/usr/bin/kmsg", NULL}, - {"fetch", "/usr/bin/fetch", NULL}, - {"kfg", "/usr/bin/kfgwm", NULL}, +struct builtin_cmd cmds[] = { + {"help",cmd_help}, + {"echo",cmd_echo}, + {"exit",cmd_exit}, + {"reboot",cmd_reboot}, + {"shutdown", cmd_shutdown}, + {"bell", cmd_bell}, {NULL, NULL} }; @@ -260,14 +267,16 @@ main(void) for (i = 0; cmds[i].name != NULL; i++) { if (strcmp(input, cmds[i].name) == 0) { - command_run(&cmds[i], argc, argv); + builtin_run(&cmds[i], argc, argv); found = 1; break; } } if (found == 0) { - puts("Unrecognized command"); + if (cmd_run(input, argc, argv) < 0) { + puts("Unrecognized command"); + } } found = 0; |