From 8b4e3d8b5b9e3cb65b244fec55d93608d1a1e319 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Fri, 3 Feb 2012 21:00:17 +0200 Subject: Btrfs-progs: implement new subcommand parser This completely replaces the existing subcommand infrastructure, which is not flexible enough to accomodate our needs. Instead of a global command table we now have per-level tables and command group handlers, which allows command-group-specific handling of options and subcommands. The new parser exports a clear interface and gets out of the way - all control over how matching is done is passed to commands and command group handlers. One side effect of this is that command implementors have to check the number of arguments themselves - patch to fix up all existing commands follows. Signed-off-by: Ilya Dryomov --- btrfs.c | 574 +++++++++++++++++++++------------------------------------------- 1 file changed, 190 insertions(+), 384 deletions(-) (limited to 'btrfs.c') diff --git a/btrfs.c b/btrfs.c index 1def3542..7cff30bd 100644 --- a/btrfs.c +++ b/btrfs.c @@ -19,444 +19,250 @@ #include #include -#include "kerncompat.h" -#include "btrfs_cmds.h" +#include "commands.h" #include "version.h" -#define BASIC_HELP 0 -#define ADVANCED_HELP 1 - -typedef int (*CommandFunction)(int argc, char **argv); - -struct Command { - CommandFunction func; /* function which implements the command */ - int nargs; /* if == 999, any number of arguments - if >= 0, number of arguments, - if < 0, _minimum_ number of arguments */ - char *verb; /* verb */ - char *help; /* help lines; from the 2nd line onward they - are automatically indented */ - char *adv_help; /* advanced help message; from the 2nd line - onward they are automatically indented */ - - /* the following fields are run-time filled by the program */ - char **cmds; /* array of subcommands */ - int ncmds; /* number of subcommand */ -}; +static const char btrfs_cmd_group_usage[] = + "btrfs [--help] [--version] [...] []"; -static struct Command commands[] = { +static const char btrfs_cmd_group_info[] = + "Use --help as an argument for information on a specific group or command."; - /* - avoid short commands different for the case only - */ - { do_clone, -2, - "subvolume snapshot", "[-r] [/]\n" - "Create a writable/readonly snapshot of the subvolume with\n" - "the name in the directory.", - NULL - }, - { do_delete_subvolume, 1, - "subvolume delete", "\n" - "Delete the subvolume .", - NULL - }, - { do_create_subvol, 1, - "subvolume create", "[/]\n" - "Create a subvolume in (or the current directory if\n" - "not passed).", - NULL - }, - { do_subvol_list, -1, "subvolume list", "[-p] \n" - "List the snapshot/subvolume of a filesystem.", - "[-p] \n" - "List the snapshot/subvolume of a filesystem.\n" - "-p print parent ID" - }, - { do_set_default_subvol, 2, - "subvolume set-default", " \n" - "Set the subvolume of the filesystem which will be mounted\n" - "as default.", - NULL - }, - { do_find_newer, 2, "subvolume find-new", " \n" - "List the recently modified files in a filesystem.", - NULL - }, - { do_defrag, -1, - "filesystem defragment", "[-vf] [-c[zlib,lzo]] [-s start] [-l len] [-t size] | [|...]\n" - "Defragment a file or a directory.", - "[-vcf] [-s start] [-l len] [-t size] | [|...]\n" - "Defragment file data or directory metadata.\n" - "-v be verbose\n" - "-c compress the file while defragmenting\n" - "-f flush data to disk immediately after defragmenting\n" - "-s start defragment only from byte onward\n" - "-l len defragment only up to len bytes\n" - "-t size minimal size of file to be considered for defragmenting\n" - }, - { do_get_default_subvol, 1, "subvolume get-default", "\n" - "Get the default subvolume of a filesystem." - }, - { do_fssync, 1, - "filesystem sync", "\n" - "Force a sync on the filesystem .", - NULL - }, - { do_resize, 2, - "filesystem resize", "[+/-][gkm]|max \n" - "Resize the file system. If 'max' is passed, the filesystem\n" - "will occupe all available space on the device.", - NULL - }, - { do_show_filesystem, 999, - "filesystem show", "[--all-devices][|