shell: return exit codes

tags/0.1.0
S.J.R. van Schaik 7 years ago
parent a7504ad99c
commit 2942340b21
  1. 12
      include/shell.h
  2. 2
      include/shell/echo.h
  3. 24
      include/shell/mufs.h
  4. 6
      include/shell/rtc.h
  5. 2
      include/shell/version.h
  6. 18
      source/shell/cmd.c
  7. 6
      source/shell/echo.c
  8. 66
      source/shell/flash.c
  9. 14
      source/shell/ftl.c
  10. 115
      source/shell/mufs.c
  11. 16
      source/shell/rtc.c
  12. 6
      source/shell/version.c

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -5,32 +5,36 @@
#include <console.h>
#include <shell.h>
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,

@ -4,12 +4,14 @@
#include <shell/echo.h>
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;
}

@ -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 <addr> <len>\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 <addr> <len>\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 <addr> <len>\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 <command>\n");
return;
return -1;
}
cmd_exec(flash_cmds, con, argc, argv);
return cmd_exec(flash_cmds, con, argc, argv);
}

@ -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 <command>\n");
return;
return -1;
}
cmd_exec(ftl_cmds, con, argc, argv);
return cmd_exec(ftl_cmds, con, argc, argv);
}

@ -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 <path>\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 <path>\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 <path>\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 <path>\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 <path>\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 <path> <line>\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 <old> <new>\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 <path>\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);
}

@ -6,7 +6,7 @@
#include <shell/rtc.h>
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 <format> <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;
}

@ -4,12 +4,14 @@
#include <shell/version.h>
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;
}

Loading…
Cancel
Save