print_complete_help_and_die() does not return.
[adu.git] / interactive.c
index b3254157d6785403573252876624c026ed912ed4..7327ee168eaf264c6830a1ed54052972ff244ce5 100644 (file)
@@ -1,11 +1,20 @@
+/*
+ * Copyright (C) 2008 Andre Noll <maan@systemlinux.org>
+ *
+ * Licensed under the GPL v2. For licencing details see COPYING.
+ */
+
+/** \file interactive.c \brief Commands for interactive mode. */
+
 #include <ctype.h> /* isspace() */
 
 #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.
@@ -25,13 +34,16 @@ struct interactive_command {
 static struct uid_range *admissible_uids;
 static struct format_info *fi;
 
+/** The set of supported interactive commands. */
 #define INTERACTIVE_COMMANDS \
        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") \
-       INTERACTIVE_COMMAND(run, "start the query according to the current configuration")
+       INTERACTIVE_COMMAND(run, "start the query according to the current configuration") \
+       INTERACTIVE_COMMAND(source, "read and execute interactive commands from a file")
 
 
+/** \cond doxygen is not smart enough for this */
 #define INTERACTIVE_COMMAND(name, desc) \
        static int icom_ ## name (char *line);
 
@@ -50,7 +62,9 @@ struct interactive_command icmds[] = {
        INTERACTIVE_COMMANDS
        {.name  = NULL}
 };
+/** \endcond */
 
+/** Iterate over the list of all interactive commands. */
 #define FOR_EACH_COMMAND(c) for (c = icmds; c->name; c++)
 
 static int read_input_line(char *line, size_t size)
@@ -72,6 +86,9 @@ static int icom_help(__a_unused char *line)
        return 1;
 }
 
+/**
+ * Print the list of commands with short descriptions.
+ */
 void print_interactive_help(void)
 {
        struct interactive_command *c;
@@ -81,16 +98,18 @@ void print_interactive_help(void)
 
 static int icom_reset(__a_unused char *line)
 {
+       NOTICE_LOG("resetting configuration to default\n");
        free_format_info(fi);
        fi = NULL;
        free(admissible_uids);
        admissible_uids = NULL;
        select_cmdline_parser_init(&select_conf);
-       return 1;
+       return parse_select_options(NULL, NULL, &admissible_uids, &fi);
 }
 
 static int icom_set(char *line)
 {
+       int ret;
        struct select_cmdline_parser_params params = {
                .override = 1,
                .initialize = 0,
@@ -107,7 +126,10 @@ static int icom_set(char *line)
        fi = NULL;
        free(admissible_uids);
        admissible_uids = NULL;
-       return parse_select_options(line, &params, &admissible_uids, &fi);
+       ret = parse_select_options(line, &params, &admissible_uids, &fi);
+       if (ret >= 0)
+               return ret;
+       return icom_reset(NULL);
 }
 
 static int exec_interactive_command(char *line)
@@ -141,7 +163,7 @@ static int exec_interactive_command(char *line)
        else {
                *args = '\0';
                args++;
-               /* let p point to the next non-whitespace char */
+               /* let args point to the next non-whitespace char */
                args += strspn(args, delim);
                if (!*args)
                        args = NULL;
@@ -158,6 +180,30 @@ static int exec_interactive_command(char *line)
        return ret;
 }
 
+static int icom_source(char *args)
+{
+       char line[255];
+       FILE *src = fopen(args, "r");
+       int ret;
+
+       if (!src)
+               return -ERRNO_TO_ERROR(errno);
+       while (fgets(line, sizeof(line), src)) {
+               ret = exec_interactive_command(line);
+               if (ret < 0)
+                       goto out;
+       }
+       ret = 1;
+out:
+       fclose(src);
+       return ret;
+}
+
+/**
+ * The main function for interactive mode.
+ *
+ * \return Standard.
+ */
 int com_interactive(void)
 {
        char line[255];
@@ -165,6 +211,11 @@ int com_interactive(void)
 
        select_cmdline_parser_init(&select_conf);
        ret = parse_select_options(NULL, NULL, &admissible_uids, &fi);
+       if (ret< 0)
+               return ret;
+       ret = read_uid_file();
+       if (ret < 0)
+               return ret;
        while (read_input_line(line, sizeof(line)) >= 0) {
                ret = exec_interactive_command(line);
                if (ret < 0)