summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2004-09-17 08:38:53 +0000
committerpjd <pjd@FreeBSD.org>2004-09-17 08:38:53 +0000
commit35d4149856e768518efabd29e3e073f903f8000b (patch)
tree3215bbba65ba0c81e5a9a11897ab0189fc1ec66f /sbin
parent8277fd356bead7503f782a5d068126bd0fa80872 (diff)
downloadFreeBSD-src-35d4149856e768518efabd29e3e073f903f8000b.zip
FreeBSD-src-35d4149856e768518efabd29e3e073f903f8000b.tar.gz
- Show all commands in usage, even if those commands are not available.
- When command is not available, just say it, instead of says, that command is unknown. Old behaviour seems to be too confusing.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/geom/core/geom.c51
1 files changed, 32 insertions, 19 deletions
diff --git a/sbin/geom/core/geom.c b/sbin/geom/core/geom.c
index a77af7e..95b8a99 100644
--- a/sbin/geom/core/geom.c
+++ b/sbin/geom/core/geom.c
@@ -58,7 +58,9 @@ static int verbose = 0;
static struct g_command *class_commands = NULL;
static void (*usage)(const char *name);
-static struct g_command *find_command(const char *cmdstr, int all);
+#define GEOM_CLASS_CMDS 0x01
+#define GEOM_STD_CMDS 0x02
+static struct g_command *find_command(const char *cmdstr, int flags);
static int std_available(const char *name);
static void std_help(struct gctl_req *req, unsigned flags);
@@ -131,9 +133,12 @@ geom_usage(void)
cmd = &std_commands[i];
if (cmd->gc_name == NULL)
break;
- if (find_command(cmd->gc_name, 0) != NULL)
- continue;
- if (!std_available(cmd->gc_name))
+ /*
+ * If class defines command, which has the same name as
+ * standard command, skip it, because it was already
+ * shown on usage().
+ */
+ if (find_command(cmd->gc_name, GEOM_CLASS_CMDS) != NULL)
continue;
fprintf(stderr, "%s %s %s", prefix, comm, cmd->gc_name);
if ((cmd->gc_flags & G_FLAG_VERBOSE) != 0)
@@ -336,7 +341,7 @@ parse_arguments(struct g_command *cmd, struct gctl_req *req, int *argc,
* Find given command in commands available for given class.
*/
static struct g_command *
-find_command(const char *cmdstr, int all)
+find_command(const char *cmdstr, int flags)
{
struct g_command *cmd;
unsigned i;
@@ -344,7 +349,7 @@ find_command(const char *cmdstr, int all)
/*
* First try to find command defined by loaded library.
*/
- if (class_commands != NULL) {
+ if ((flags & GEOM_CLASS_CMDS) != 0 && class_commands != NULL) {
for (i = 0; ; i++) {
cmd = &class_commands[i];
if (cmd->gc_name == NULL)
@@ -353,19 +358,17 @@ find_command(const char *cmdstr, int all)
return (cmd);
}
}
- if (!all)
- return (NULL);
/*
* Now try to find in standard commands.
*/
- for (i = 0; ; i++) {
- cmd = &std_commands[i];
- if (cmd->gc_name == NULL)
- break;
- if (!std_available(cmd->gc_name))
- continue;
- if (strcmp(cmd->gc_name, cmdstr) == 0)
- return (cmd);
+ if ((flags & GEOM_STD_CMDS) != 0) {
+ for (i = 0; ; i++) {
+ cmd = &std_commands[i];
+ if (cmd->gc_name == NULL)
+ break;
+ if (strcmp(cmd->gc_name, cmdstr) == 0)
+ return (cmd);
+ }
}
return (NULL);
}
@@ -392,10 +395,20 @@ run_command(int argc, char *argv[])
const char *errstr;
char buf[4096];
- cmd = find_command(argv[0], 1);
+ /* First try to find a command defined by a class. */
+ cmd = find_command(argv[0], GEOM_CLASS_CMDS);
if (cmd == NULL) {
- fprintf(stderr, "Unknown command: %s\n", argv[0]);
- geom_usage();
+ /* Now, try to find a standard command. */
+ cmd = find_command(argv[0], GEOM_STD_CMDS);
+ if (cmd == NULL) {
+ fprintf(stderr, "Unknown command: %s\n", argv[0]);
+ geom_usage();
+ }
+ if (!std_available(cmd->gc_name)) {
+ fprintf(stderr, "Command '%s' not available.\n",
+ argv[0]);
+ exit(EXIT_FAILURE);
+ }
}
if ((cmd->gc_flags & G_FLAG_LOADKLD) != 0)
load_module();
OpenPOWER on IntegriCloud