From 2942340b21558624437558839fdeaabfa9c57ea9 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Thu, 27 Jul 2017 11:54:31 +0200 Subject: [PATCH] shell: return exit codes --- include/shell.h | 12 ++--- include/shell/echo.h | 2 +- include/shell/mufs.h | 24 +++++----- include/shell/rtc.h | 6 +-- include/shell/version.h | 2 +- source/shell/cmd.c | 18 +++++--- source/shell/echo.c | 6 ++- source/shell/flash.c | 66 +++++++++++++++------------ source/shell/ftl.c | 14 +++--- source/shell/mufs.c | 115 +++++++++++++++++++++++++++++------------------- source/shell/rtc.c | 16 ++++--- source/shell/version.c | 6 ++- 12 files changed, 169 insertions(+), 118 deletions(-) diff --git a/include/shell.h b/include/shell.h index 030b896..a146ca0 100644 --- a/include/shell.h +++ b/include/shell.h @@ -5,7 +5,7 @@ struct console; struct cmd { const char *cmd; const char *desc; - void (* exec)(struct console *con, size_t argc, const char **argv); + int (* exec)(struct console *con, size_t argc, const char **argv); }; struct shell { @@ -18,14 +18,14 @@ struct shell { size_t count_args(const char *line); char **parse_args(const char *line, size_t *argc); -void cmd_exec(struct cmd *cmds, struct console *con, size_t argc, +int cmd_exec(struct cmd *cmds, struct console *con, size_t argc, const char **argv); -void cmd_parse(struct cmd *cmds, struct console *con, const char *line); +int cmd_parse(struct cmd *cmds, struct console *con, const char *line); int shell_init(struct shell *shell, struct cmd *cmds, struct console *con, const char *prompt); int shell_parse(struct shell *shell); -void do_flash_cmd(struct console *con, size_t argc, const char **argv); -void do_ftl_cmd(struct console *con, size_t argc, const char **argv); -void do_mufs_cmd(struct console *con, size_t argc, const char **argv); +int do_flash_cmd(struct console *con, size_t argc, const char **argv); +int do_ftl_cmd(struct console *con, size_t argc, const char **argv); +int do_mufs_cmd(struct console *con, size_t argc, const char **argv); diff --git a/include/shell/echo.h b/include/shell/echo.h index beaa44c..39fe902 100644 --- a/include/shell/echo.h +++ b/include/shell/echo.h @@ -1,3 +1,3 @@ #pragma once -void shell_echo(struct console *con, size_t argc, const char **argv); +int shell_echo(struct console *con, size_t argc, const char **argv); diff --git a/include/shell/mufs.h b/include/shell/mufs.h index a1149ed..1ff3572 100644 --- a/include/shell/mufs.h +++ b/include/shell/mufs.h @@ -1,14 +1,14 @@ #pragma once -void shell_mount(struct console *con, size_t argc, const char **argv); -void shell_unmount(struct console *con, size_t argc, const char **argv); -void shell_format(struct console *con, size_t argc, const char **argv); -void shell_mkdir(struct console *con, size_t argc, const char **argv); -void shell_rmdir(struct console *con, size_t argc, const char **argv); -void shell_stat(struct console *con, size_t argc, const char **argv); -void shell_cat(struct console *con, size_t argc, const char **argv); -void shell_write(struct console *con, size_t argc, const char **argv); -void shell_append(struct console *con, size_t argc, const char **argv); -void shell_mv(struct console *con, size_t argc, const char **argv); -void shell_rm(struct console *con, size_t argc, const char **argv); -void shell_ls(struct console *con, size_t argc, const char **argv); +int shell_mount(struct console *con, size_t argc, const char **argv); +int shell_unmount(struct console *con, size_t argc, const char **argv); +int shell_format(struct console *con, size_t argc, const char **argv); +int shell_mkdir(struct console *con, size_t argc, const char **argv); +int shell_rmdir(struct console *con, size_t argc, const char **argv); +int shell_stat(struct console *con, size_t argc, const char **argv); +int shell_cat(struct console *con, size_t argc, const char **argv); +int shell_write(struct console *con, size_t argc, const char **argv); +int shell_append(struct console *con, size_t argc, const char **argv); +int shell_mv(struct console *con, size_t argc, const char **argv); +int shell_rm(struct console *con, size_t argc, const char **argv); +int shell_ls(struct console *con, size_t argc, const char **argv); diff --git a/include/shell/rtc.h b/include/shell/rtc.h index 23e2b92..8363347 100644 --- a/include/shell/rtc.h +++ b/include/shell/rtc.h @@ -2,6 +2,6 @@ struct console; -void shell_date(struct console *con, size_t argc, const char **argv); -void shell_time(struct console *con, size_t argc, const char **argv); -void shell_set_date(struct console *con, size_t argc, const char **argv); +int shell_date(struct console *con, size_t argc, const char **argv); +int shell_time(struct console *con, size_t argc, const char **argv); +int shell_set_date(struct console *con, size_t argc, const char **argv); diff --git a/include/shell/version.h b/include/shell/version.h index fdb8589..32c958e 100644 --- a/include/shell/version.h +++ b/include/shell/version.h @@ -1,3 +1,3 @@ #pragma once -void shell_version(struct console *con, size_t argc, const char **argv); +int shell_version(struct console *con, size_t argc, const char **argv); diff --git a/source/shell/cmd.c b/source/shell/cmd.c index 1b94d4c..652239e 100644 --- a/source/shell/cmd.c +++ b/source/shell/cmd.c @@ -5,32 +5,36 @@ #include #include -void cmd_exec(struct cmd *cmds, struct console *con, size_t argc, +int cmd_exec(struct cmd *cmds, struct console *con, size_t argc, const char **argv) { struct cmd *cmd; if (argc < 1) - return; + return -1; for (cmd = cmds; cmd->cmd; ++cmd) { if (strcmp(cmd->cmd, argv[0]) == 0) { - cmd->exec(con, argc - 1, argv + 1); - break; + return cmd->exec(con, argc - 1, argv + 1); } } + + return -1; } -void cmd_parse(struct cmd *cmds, struct console *con, const char *line) +int cmd_parse(struct cmd *cmds, struct console *con, const char *line) { char **argv; size_t argc; + int ret; if (!(argv = parse_args(line, &argc))) - return; + return -1; - cmd_exec(cmds, con, argc, (const char **)argv); + ret = cmd_exec(cmds, con, argc, (const char **)argv); free(argv); + + return ret; } int shell_init(struct shell *shell, struct cmd *cmds, diff --git a/source/shell/echo.c b/source/shell/echo.c index f8e254f..103e5ba 100644 --- a/source/shell/echo.c +++ b/source/shell/echo.c @@ -4,12 +4,14 @@ #include -void shell_echo(struct console *con, size_t argc, const char **argv) +int shell_echo(struct console *con, size_t argc, const char **argv) { if (argc < 1) - return; + return -1; fprintf(con->fp, "%s\n", argv[0]); + + return 0; } diff --git a/source/shell/flash.c b/source/shell/flash.c index 0c36248..55b4eca 100644 --- a/source/shell/flash.c +++ b/source/shell/flash.c @@ -59,7 +59,7 @@ static void print_hex_ascii(FILE *fp, uint32_t offset, const char *buf, size_t l } } -static void do_flash_probe(struct console *con, size_t argc, const char **argv) +static int do_flash_probe(struct console *con, size_t argc, const char **argv) { (void)argv; (void)argc; @@ -71,25 +71,29 @@ static void do_flash_probe(struct console *con, size_t argc, const char **argv) if (!(flash = flash_probe())) { fprintf(con->fp, "error: unable to probe the flash device.\n"); - return; + return -1; } + + return 0; } -static void do_flash_release(struct console *con, size_t argc, const char **argv) +static int do_flash_release(struct console *con, size_t argc, const char **argv) { (void)argv; (void)argc; if (!flash) { fprintf(con->fp, "no flash device currently active.\n"); - return; + return -1; } flash_release(flash); flash = NULL; + + return 0; } -static void do_flash_info(struct console *con, size_t argc, const char **argv) +static int do_flash_info(struct console *con, size_t argc, const char **argv) { size_t size, capacity; @@ -98,7 +102,7 @@ static void do_flash_info(struct console *con, size_t argc, const char **argv) if (!flash) { fprintf(con->fp, "error: no flash device probed.\n"); - return; + return -1; } size = flash_get_size(flash); @@ -106,39 +110,41 @@ static void do_flash_info(struct console *con, size_t argc, const char **argv) fprintf(con->fp, " size: %" PRSZu "/%" PRSZu " bytes (%" PRSZu "%% usage)\n", size, capacity, 100 * size / capacity); + + return 0; } -static void do_flash_read(struct console *con, size_t argc, const char **argv) +static int do_flash_read(struct console *con, size_t argc, const char **argv) { char buf[256]; size_t addr, len, nbytes; if (argc < 2) { fprintf(con->fp, "usage: flash read \n"); - return; + return -1; } if (!flash) { fprintf(con->fp, "error: no flash device probed.\n"); - return; + return -1; } addr = strtoull(argv[0], NULL, 16); if (errno == EINVAL || errno == ERANGE) { fprintf(con->fp, "error: expected hexadecimal value for addr\n"); - return; + return -1; } len = strtoull(argv[1], NULL, 16); if (errno == EINVAL || errno == ERANGE) { fprintf(con->fp, "error: expected hexadecimal value for len\n"); - return; + return -1; } if (!len) - return; + return 0; while (len) { nbytes = min(len, 256); @@ -148,39 +154,41 @@ static void do_flash_read(struct console *con, size_t argc, const char **argv) addr += nbytes; len -= nbytes; } + + return 0; } -static void do_flash_write(struct console *con, size_t argc, const char **argv) +static int do_flash_write(struct console *con, size_t argc, const char **argv) { char buf[256]; size_t addr, len, nbytes; if (argc < 2) { fprintf(con->fp, "usage: flash write \n"); - return; + return -1; } if (!flash) { fprintf(con->fp, "error: no flash device probed.\n"); - return; + return -1; } addr = strtoull(argv[0], NULL, 16); if (errno == EINVAL || errno == ERANGE) { fprintf(con->fp, "error: expected hexadecimal value for addr\n"); - return; + return -1; } len = strtoull(argv[1], NULL, 16); if (errno == EINVAL || errno == ERANGE) { fprintf(con->fp, "error: expected hexadecimal value for len\n"); - return; + return -1; } if (!len) - return; + return 0; while (len) { nbytes = min(len, 256); @@ -195,40 +203,44 @@ static void do_flash_write(struct console *con, size_t argc, const char **argv) } flash_sync(flash); + + return 0; } -static void do_flash_erase(struct console *con, size_t argc, const char **argv) +static int do_flash_erase(struct console *con, size_t argc, const char **argv) { size_t addr, len; if (argc < 2) { fprintf(con->fp, "usage: flash erase \n"); - return; + return -1; } if (!flash) { fprintf(con->fp, "error: no flash device probed.\n"); - return; + return -1; } addr = strtoull(argv[0], NULL, 16); if (errno == EINVAL || errno == ERANGE) { fprintf(con->fp, "error: expected hexadecimal value for addr\n"); - return; + return -1; } len = strtoull(argv[1], NULL, 16); if (errno == EINVAL || errno == ERANGE) { fprintf(con->fp, "error: expected hexadecimal value for len\n"); - return; + return -1; } if (!len) - return; + return 0; flash_erase(flash, addr, len); + + return 0; } static struct cmd flash_cmds[] = { @@ -241,12 +253,12 @@ static struct cmd flash_cmds[] = { { NULL, NULL, NULL }, }; -void do_flash_cmd(struct console *con, size_t argc, const char **argv) +int do_flash_cmd(struct console *con, size_t argc, const char **argv) { if (argc < 1) { fprintf(con->fp, "usage: flash \n"); - return; + return -1; } - cmd_exec(flash_cmds, con, argc, argv); + return cmd_exec(flash_cmds, con, argc, argv); } diff --git a/source/shell/ftl.c b/source/shell/ftl.c index fa18d97..110eb65 100644 --- a/source/shell/ftl.c +++ b/source/shell/ftl.c @@ -15,7 +15,7 @@ extern struct flash_dev *flash; -static void do_ftl_probe(struct console *con, size_t argc, const char **argv) +static int do_ftl_probe(struct console *con, size_t argc, const char **argv) { (void)argv; (void)argc; @@ -27,13 +27,15 @@ static void do_ftl_probe(struct console *con, size_t argc, const char **argv) if (!(flash = flash_probe())) { fprintf(con->fp, "error: unable to probe the flash device.\n"); - return; + return -1; } if (!(flash = ftl_mount(flash))) { fprintf(con->fp, "error: unable to mount the flash translation layer.\n"); - return; + return -1; } + + return 0; } static struct cmd ftl_cmds[] = { @@ -41,12 +43,12 @@ static struct cmd ftl_cmds[] = { { NULL, NULL, NULL }, }; -void do_ftl_cmd(struct console *con, size_t argc, const char **argv) +int do_ftl_cmd(struct console *con, size_t argc, const char **argv) { if (argc < 1) { fprintf(con->fp, "usage: flash \n"); - return; + return -1; } - cmd_exec(ftl_cmds, con, argc, argv); + return cmd_exec(ftl_cmds, con, argc, argv); } diff --git a/source/shell/mufs.c b/source/shell/mufs.c index 9217bdc..b17b5ad 100644 --- a/source/shell/mufs.c +++ b/source/shell/mufs.c @@ -20,14 +20,14 @@ extern struct flash_dev *flash; struct mufs *mufs = NULL; -void shell_mount(struct console *con, size_t argc, const char **argv) +int shell_mount(struct console *con, size_t argc, const char **argv) { (void)argc; (void)argv; if (!flash) { fprintf(con->fp, "error: no flash device probed.\n"); - return; + return -1; } if (mufs) { @@ -37,20 +37,22 @@ void shell_mount(struct console *con, size_t argc, const char **argv) if (!(mufs = mufs_mount(flash))) { fprintf(con->fp, "error: unable to mount the filesystem.\n"); - return; + return -1; } flash = NULL; + + return 0; } -void shell_unmount(struct console *con, size_t argc, const char **argv) +int shell_unmount(struct console *con, size_t argc, const char **argv) { (void)argc; (void)argv; if (!mufs) { fprintf(con->fp, "no mufs filesystem currently active\n"); - return; + return -1; } if (flash) @@ -61,106 +63,116 @@ void shell_unmount(struct console *con, size_t argc, const char **argv) mufs_unmount(mufs); mufs = NULL; + + return 0; } -void shell_format(struct console *con, size_t argc, const char **argv) +int shell_format(struct console *con, size_t argc, const char **argv) { (void)argc; (void)argv; if (!flash) { fprintf(con->fp, "error: no flash device probed.\n"); - return; + return -1; } if (mufs_format(flash) < 0) { fprintf(con->fp, "error: unable to format the flash device.\n"); - return; + return -1; } + + return 0; } -void shell_mkdir(struct console *con, size_t argc, const char **argv) +int shell_mkdir(struct console *con, size_t argc, const char **argv) { if (argc < 1) { fprintf(con->fp, "usage: mufs mkdir \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (mufs_mkdir(mufs, argv[0]) < 0) { fprintf(con->fp, "error: unable to create the directory\n"); - return; + return -1; } + + return 0; } -void shell_rmdir(struct console *con, size_t argc, const char **argv) +int shell_rmdir(struct console *con, size_t argc, const char **argv) { if (argc < 1) { fprintf(con->fp, "usage: mufs rmdir \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (mufs_rmdir(mufs, argv[0]) < 0) { fprintf(con->fp, "error: unable to remove the directory\n"); - return; + return -1; } + + return 0; } -void shell_stat(struct console *con, size_t argc, const char **argv) +int shell_stat(struct console *con, size_t argc, const char **argv) { struct mufs_stat stat; if (argc < 1) { fprintf(con->fp, "usage: mufs stat \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (mufs_stat(mufs, argv[0], &stat) < 0) { fprintf(con->fp, "error: unable to stat the file\n"); - return; + return -1; } switch (stat.type) { case MUFS_DIR: printf(" type: directory\n"); break; case MUFS_FILE: printf(" type: file\n"); break; - default: return; + default: return -1; } printf(" file size: %" PRIu32 " bytes\n", stat.file_size); + + return 0; } -void shell_cat(struct console *con, size_t argc, const char **argv) +int shell_cat(struct console *con, size_t argc, const char **argv) { char data[256]; struct mufs_file *file; if (argc < 1) { fprintf(con->fp, "usage: mufs cat \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (!(file = mufs_open(mufs, argv[0], MUFS_READ))) { fprintf(con->fp, "error: unable to open the file\n"); - return; + return -1; } while (mufs_read(file, data, sizeof data) != 0) { @@ -168,9 +180,11 @@ void shell_cat(struct console *con, size_t argc, const char **argv) } mufs_close(file); + + return 0; } -void shell_write(struct console *con, size_t argc, const char **argv) +int shell_write(struct console *con, size_t argc, const char **argv) { char data[256]; struct mufs_file *file; @@ -178,17 +192,17 @@ void shell_write(struct console *con, size_t argc, const char **argv) if (argc < 1) { fprintf(con->fp, "usage: mufs write \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (!(file = mufs_open(mufs, argv[0], MUFS_WRITE))) { fprintf(con->fp, "error: unable to open the file\n"); - return; + return -1; } fprintf(con->fp, "> "); @@ -199,9 +213,11 @@ void shell_write(struct console *con, size_t argc, const char **argv) } mufs_close(file); + + return 0; } -void shell_append(struct console *con, size_t argc, const char **argv) +int shell_append(struct console *con, size_t argc, const char **argv) { struct mufs_file *file; char data[256]; @@ -209,17 +225,17 @@ void shell_append(struct console *con, size_t argc, const char **argv) if (argc < 2) { fprintf(con->fp, "usage: mufs append \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (!(file = mufs_open(mufs, argv[0], MUFS_WRITE | MUFS_APPEND))) { fprintf(con->fp, "error: unable to open the file\n"); - return; + return -1; } n = strlen(argv[1]); @@ -230,45 +246,51 @@ void shell_append(struct console *con, size_t argc, const char **argv) mufs_write(file, data, n + 1); mufs_close(file); + + return 0; } -void shell_mv(struct console *con, size_t argc, const char **argv) +int shell_mv(struct console *con, size_t argc, const char **argv) { if (argc < 2) { fprintf(con->fp, "usage: mufs mv \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (mufs_rename(mufs, argv[0], argv[1]) < 0) { fprintf(con->fp, "error: unable to move the file\n"); - return; + return -1; } + + return 0; } -void shell_rm(struct console *con, size_t argc, const char **argv) +int shell_rm(struct console *con, size_t argc, const char **argv) { if (argc < 1) { fprintf(con->fp, "usage: mufs rm \n"); - return; + return -1; } if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (mufs_unlink(mufs, argv[0]) < 0) { fprintf(con->fp, "error: unable to remove the file\n"); - return; + return -1; } + + return 0; } -void shell_ls(struct console *con, size_t argc, const char **argv) +int shell_ls(struct console *con, size_t argc, const char **argv) { struct mufs_dirent ent; struct mufs_dir *dir; @@ -280,12 +302,12 @@ void shell_ls(struct console *con, size_t argc, const char **argv) if (!mufs) { fprintf(con->fp, "error: no file system mounted.\n"); - return; + return -1; } if (!(dir = mufs_opendir(mufs, path))) { fprintf(con->fp, "error: unable to open the directory\n"); - return; + return -1; } while (mufs_readdir(dir, &ent) == 0) { @@ -293,6 +315,7 @@ void shell_ls(struct console *con, size_t argc, const char **argv) } mufs_closedir(dir); + return 0; } static struct cmd mufs_cmds[] = { @@ -311,7 +334,7 @@ static struct cmd mufs_cmds[] = { { NULL, NULL, NULL }, }; -void do_mufs_cmd(struct console *con, size_t argc, const char **argv) +int do_mufs_cmd(struct console *con, size_t argc, const char **argv) { - cmd_exec(mufs_cmds, con, argc, argv); + return cmd_exec(mufs_cmds, con, argc, argv); } diff --git a/source/shell/rtc.c b/source/shell/rtc.c index 193c70f..20b3362 100644 --- a/source/shell/rtc.c +++ b/source/shell/rtc.c @@ -6,7 +6,7 @@ #include -void shell_date(struct console *con, size_t argc, const char **argv) +int shell_date(struct console *con, size_t argc, const char **argv) { struct tm now; @@ -18,9 +18,11 @@ void shell_date(struct console *con, size_t argc, const char **argv) fprintf(con->fp, "%02d:%02d:%02d %02d-%02d-%d\n", now.tm_hour, now.tm_min, now.tm_sec, now.tm_mday, now.tm_mon + 1, now.tm_year + 1900); + + return 0; } -void shell_time(struct console *con, size_t argc, const char **argv) +int shell_time(struct console *con, size_t argc, const char **argv) { struct tm now; @@ -30,22 +32,24 @@ void shell_time(struct console *con, size_t argc, const char **argv) rtc_get_time(&now); fprintf(con->fp, "%ld\n", mktime(&now)); + + return 0; } -void shell_set_date(struct console *con, size_t argc, const char **argv) +int shell_set_date(struct console *con, size_t argc, const char **argv) { struct tm now; if (argc < 2) { fprintf(con->fp, "usage: set-date \n"); - return; + return -1; } rtc_get_time(&now); if (!strptime(argv[1], argv[0], &now)) { fprintf(con->fp, "error\n"); - return; + return -1; } rtc_init(&now); @@ -53,4 +57,6 @@ void shell_set_date(struct console *con, size_t argc, const char **argv) fprintf(con->fp, "%02d:%02d:%02d %02d-%02d-%d\n", now.tm_hour, now.tm_min, now.tm_sec, now.tm_mday, now.tm_mon + 1, now.tm_year + 1900); + + return 0; } diff --git a/source/shell/version.c b/source/shell/version.c index 31c827e..5ce3d41 100644 --- a/source/shell/version.c +++ b/source/shell/version.c @@ -4,12 +4,14 @@ #include -void shell_version(struct console *con, size_t argc, const char **argv) +int shell_version(struct console *con, size_t argc, const char **argv) { (void)argv; if (argc < 1) - return; + return -1; fprintf(con->fp, "hello,%s\n", TBM_VERSION); + + return 0; }