From 9a649545a3263f2a6f85d724e8bcfbd6aeedcdaf Mon Sep 17 00:00:00 2001 From: Brett Holman <bholman.devel@gmail.com> Date: Sun, 31 Oct 2021 22:30:13 -0600 Subject: [PATCH] Add more specific subcommand usage messages The device, data, fs, and subvolume subcommands currently print out a generic usage message. Make these more specific. Signed-off-by: Brett Holman <bholman.devel@gmail.com> --- bcachefs.c | 62 ++++++++++++++++++++++++++++--------------------- cmd_data.c | 13 +++++++++++ cmd_device.c | 19 +++++++++++++++ cmd_fs.c | 12 ++++++++++ cmd_subvolume.c | 14 +++++++++++ cmds.h | 4 ++++ 6 files changed, 97 insertions(+), 27 deletions(-) diff --git a/bcachefs.c b/bcachefs.c index 2b004a01..12eb253d 100644 --- a/bcachefs.c +++ b/bcachefs.c @@ -92,14 +92,9 @@ static char *full_cmd; static char *pop_cmd(int *argc, char *argv[]) { - if (*argc < 2) { - printf("%s: missing command\n", argv[0]); - usage(); - exit(EXIT_FAILURE); - } - char *cmd = argv[1]; - memmove(&argv[1], &argv[2], *argc * sizeof(argv[0])); + if (!(*argc < 2)) + memmove(&argv[1], &argv[2], *argc * sizeof(argv[0])); (*argc)--; full_cmd = mprintf("%s %s", full_cmd, cmd); @@ -110,10 +105,11 @@ static int fs_cmds(int argc, char *argv[]) { char *cmd = pop_cmd(&argc, argv); + if (argc < 2) + return fs_usage(); if (!strcmp(cmd, "usage")) return cmd_fs_usage(argc, argv); - usage(); return 0; } @@ -121,6 +117,8 @@ static int device_cmds(int argc, char *argv[]) { char *cmd = pop_cmd(&argc, argv); + if (argc < 2) + return device_usage(); if (!strcmp(cmd, "add")) return cmd_device_add(argc, argv); if (!strcmp(cmd, "remove")) @@ -138,7 +136,6 @@ static int device_cmds(int argc, char *argv[]) if (!strcmp(cmd, "resize-journal")) return cmd_device_resize_journal(argc, argv); - usage(); return 0; } @@ -146,19 +143,21 @@ static int data_cmds(int argc, char *argv[]) { char *cmd = pop_cmd(&argc, argv); + if (argc < 2) + return data_usage(); if (!strcmp(cmd, "rereplicate")) return cmd_data_rereplicate(argc, argv); if (!strcmp(cmd, "job")) return cmd_data_job(argc, argv); - usage(); return 0; } static int subvolume_cmds(int argc, char *argv[]) { char *cmd = pop_cmd(&argc, argv); - + if (argc < 2) + return subvolume_usage(); if (!strcmp(cmd, "create")) return cmd_subvolume_create(argc, argv); if (!strcmp(cmd, "delete")) @@ -166,7 +165,6 @@ static int subvolume_cmds(int argc, char *argv[]) if (!strcmp(cmd, "snapshot")) return cmd_subvolume_snapshot(argc, argv); - usage(); return 0; } @@ -179,16 +177,36 @@ int main(int argc, char *argv[]) setvbuf(stdout, NULL, _IOLBF, 0); char *cmd = pop_cmd(&argc, argv); + if (argc < 1) { + puts("missing command\n"); + goto usage; + } + + /* these subcommands display usage when argc < 2 */ + if (!strcmp(cmd, "device")) + return device_cmds(argc, argv); + if (!strcmp(cmd, "fs")) + return fs_cmds(argc, argv); + if (!strcmp(cmd, "data")) + return data_cmds(argc, argv); + if (!strcmp(cmd, "subvolume")) + return subvolume_cmds(argc, argv); + if (!strcmp(cmd, "format")) + return cmd_format(argc, argv); + if (!strcmp(cmd, "fsck")) + return cmd_fsck(argc, argv); + + if (argc < 2) { + printf("%s: missing command\n", argv[0]); + usage(); + exit(EXIT_FAILURE); + } if (!strcmp(cmd, "version")) return cmd_version(argc, argv); - if (!strcmp(cmd, "format")) - return cmd_format(argc, argv); if (!strcmp(cmd, "show-super")) return cmd_show_super(argc, argv); - if (!strcmp(cmd, "fsck")) - return cmd_fsck(argc, argv); #if 0 if (!strcmp(cmd, "assemble")) @@ -201,17 +219,6 @@ int main(int argc, char *argv[]) return cmd_stop(argc, argv); #endif - if (!strcmp(cmd, "fs")) - return fs_cmds(argc, argv); - - if (!strcmp(cmd, "device")) - return device_cmds(argc, argv); - - if (!strcmp(cmd, "data")) - return data_cmds(argc, argv); - if (!strcmp(cmd, "subvolume")) - return subvolume_cmds(argc, argv); - if (!strcmp(cmd, "unlock")) return cmd_unlock(argc, argv); if (!strcmp(cmd, "set-passphrase")) @@ -245,6 +252,7 @@ int main(int argc, char *argv[]) } printf("Unknown command %s\n", cmd); +usage: usage(); exit(EXIT_FAILURE); } diff --git a/cmd_data.c b/cmd_data.c index 25a2dcb2..d78598d5 100644 --- a/cmd_data.c +++ b/cmd_data.c @@ -9,6 +9,19 @@ #include "cmds.h" #include "libbcachefs.h" +int data_usage(void) +{ + puts("bcachefs data - manage filesystem data\n" + "Usage: bcachefs data <CMD> [OPTIONS]\n" + "\n" + "Commands:\n" + " rereplicate Rereplicate degraded data\n" + " job Kick off low level data jobs\n" + "\n" + "Report bugs to <linux-bcache@vger.kernel.org>"); + return 0; +} + static void data_rereplicate_usage(void) { puts("bcachefs data rereplicate\n" diff --git a/cmd_device.c b/cmd_device.c index 87d85074..1d91ecdd 100644 --- a/cmd_device.c +++ b/cmd_device.c @@ -21,6 +21,25 @@ #include "libbcachefs/opts.h" #include "tools-util.h" +int device_usage(void) +{ + puts("bcachefs device - manage devices within a running filesystem\n" + "Usage: bcachefs device <CMD> [OPTION]\n" + "\n" + "Commands:\n" + " add add a new device to an existing filesystem\n" + " remove remove a device from an existing filesystem\n" + " online re-add an existing member to a filesystem\n" + " offline take a device offline, without removing it\n" + " evacuate migrate data off a specific device\n" + " set-state mark a device as failed\n" + " resize resize filesystem on a device\n" + " resize-journal resize journal on a device\n" + "\n" + "Report bugs to <linux-bcachefs@vger.kernel.org>"); + return 0; +} + static void device_add_usage(void) { puts("bcachefs device add - add a device to an existing filesystem\n" diff --git a/cmd_fs.c b/cmd_fs.c index 8b9d91b8..f8c46429 100644 --- a/cmd_fs.c +++ b/cmd_fs.c @@ -195,6 +195,18 @@ static void print_fs_usage(const char *path, enum units units) bcache_fs_close(fs); } +int fs_usage(void) +{ + puts("bcachefs fs - manage a running filesystem\n" + "Usage: bcachefs fs <CMD> [OPTION]... path\n" + "\n" + "Commands:\n" + " usage show disk usage\n" + "\n" + "Report bugs to <linux-bcachefs@vger.kernel.org>"); + return 0; +} + int cmd_fs_usage(int argc, char *argv[]) { enum units units = BYTES; diff --git a/cmd_subvolume.c b/cmd_subvolume.c index ee4eb750..99a302b8 100644 --- a/cmd_subvolume.c +++ b/cmd_subvolume.c @@ -19,6 +19,20 @@ #include "libbcachefs/opts.h" #include "tools-util.h" +int subvolume_usage(void) +{ + puts("bcachefs subvolume - manage subvolumes and snapshots\n" + "Usage: bcachefs subvolume <CMD> [OPTION]\n" + "\n" + "Commands:\n" + " create create a subvolume\n" + " delete delete a subvolume\n" + " snapshot create a snapshot\n" + "\n" + "Report bugs to <linux-bcachefs@vger.kernel.org>"); + return 0; +} + static void subvolume_create_usage(void) { puts("bcachefs subvolume create - create a new subvolume\n" diff --git a/cmds.h b/cmds.h index 0e27d6d7..52db63f3 100644 --- a/cmds.h +++ b/cmds.h @@ -19,8 +19,10 @@ int cmd_run(int argc, char *argv[]); int cmd_stop(int argc, char *argv[]); #endif +int fs_usage(void); int cmd_fs_usage(int argc, char *argv[]); +int device_usage(void); int cmd_device_add(int argc, char *argv[]); int cmd_device_remove(int argc, char *argv[]); int cmd_device_online(int argc, char *argv[]); @@ -30,6 +32,7 @@ int cmd_device_set_state(int argc, char *argv[]); int cmd_device_resize(int argc, char *argv[]); int cmd_device_resize_journal(int argc, char *argv[]); +int data_usage(void); int cmd_data_rereplicate(int argc, char *argv[]); int cmd_data_job(int argc, char *argv[]); @@ -50,6 +53,7 @@ int cmd_version(int argc, char *argv[]); int cmd_setattr(int argc, char *argv[]); +int subvolume_usage(void); int cmd_subvolume_create(int argc, char *argv[]); int cmd_subvolume_delete(int argc, char *argv[]); int cmd_subvolume_snapshot(int argc, char *argv[]);