struct interactive_command {
const char *name;
int (*handler)(char *);
+ const char *desc;
};
#define INTERACTIVE_COMMANDS \
- INTERACTIVE_COMMAND(dump) \
- INTERACTIVE_COMMAND(set) \
- INTERACTIVE_COMMAND(def) \
+ INTERACTIVE_COMMAND(dump, "dump the current configuration") \
+ INTERACTIVE_COMMAND(set, "change the current configuration") \
+ INTERACTIVE_COMMAND(reset, "reset configuration to defaults") \
+ INTERACTIVE_COMMAND(help, "show list of commands and one-line descriptions") \
-#define INTERACTIVE_COMMAND(name) \
+
+#define INTERACTIVE_COMMAND(name, desc) \
static int icom_ ## name (char *line);
INTERACTIVE_COMMANDS
#undef INTERACTIVE_COMMAND
-#define INTERACTIVE_COMMAND(_name) \
+#define INTERACTIVE_COMMAND(_name, _desc) \
{ \
.name = #_name, \
- .handler = icom_ ## _name \
+ .handler = icom_ ## _name, \
+ .desc = _desc \
},
struct interactive_command icmds[] = {
{.name = NULL}
};
+#define FOR_EACH_COMMAND(c) for (c = icmds; c->name; c++)
+
static int read_input_line(char *line, size_t size)
{
return fgets(line, size, stdin)? 1 : -1;
}
-static int icom_def(__a_unused char *line)
+static int icom_help(__a_unused char *line)
+{
+ struct interactive_command *c;
+
+ FOR_EACH_COMMAND(c)
+ fprintf(stdout, "%s\t%s\n", c->name, c->desc);
+ return 1;
+}
+
+static int icom_reset(__a_unused char *line)
{
select_cmdline_parser_init(&select_conf);
return 1;
}
+static struct uid_range *admissible_uids;
+
static int icom_set(char *line)
{
struct select_cmdline_parser_params params = {
.check_ambiguity = 0,
.print_errors = 1
};
- return select_cmdline_parser_string_ext(line, &select_conf, "select",
- ¶ms)?
- -E_SYNTAX : 1;
+ if (select_cmdline_parser_string_ext(line, &select_conf, "select",
+ ¶ms))
+ return -E_SYNTAX;
+ return parse_uid_arg(select_conf.uid_arg, &admissible_uids);
}
static int icom_dump(__a_unused char *line)