User handling improvments.
[adu.git] / interactive.c
index 8c5575fe800078dc1d815c5c8879f054cd29c499..9460877e344e8f8452b0f0d20f1d6ceef83dd39e 100644 (file)
@@ -2,14 +2,24 @@
 
 #include "adu.h"
 #include "format.h"
-#include "select.h"
+#include "user.h"
 #include "string.h"
+#include "select.cmdline.h"
+#include "select.h"
 #include "error.h"
-#include "cmdline.h"
 
+/**
+ * Describes one valid command for interactive mode.
+ *
+ * When invoked in interactive mode, adu reads commands from stdin. There's a
+ * static array of all such commands.
+ */
 struct interactive_command {
+       /** The name of the command. */
        const char *name;
+       /** Pointer to The function that is being executed. */
        int (*handler)(char *);
+       /** Help text. */
        const char *desc;
 };
 
@@ -65,11 +75,17 @@ static int icom_help(__a_unused char *line)
 
 void print_interactive_help(void)
 {
-       icom_help(NULL);
+       struct interactive_command *c;
+       FOR_EACH_COMMAND(c)
+               fprintf(stdout, "\t%s\t%s\n", c->name, c->desc);
 }
 
 static int icom_reset(__a_unused char *line)
 {
+       free_format_info(fi);
+       fi = NULL;
+       free(admissible_uids);
+       admissible_uids = NULL;
        select_cmdline_parser_init(&select_conf);
        return 1;
 }
@@ -89,6 +105,9 @@ static int icom_set(char *line)
        }
 
        free_format_info(fi);
+       fi = NULL;
+       free(admissible_uids);
+       admissible_uids = NULL;
        return parse_select_options(line, &params, &admissible_uids, &fi);
 }
 
@@ -114,6 +133,8 @@ static int exec_interactive_command(char *line)
        if (!*line)
                return 1;
        /* OK, we have a non-empty line */
+       if (*line == '#')
+               return 1;
        cmd = adu_strdup(line);
        args = cmd + strcspn(cmd, delim);
        if (!*args)