+/*
+ * 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"
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);
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)
return 1;
}
+/**
+ * Print the list of commands with short descriptions.
+ */
void print_interactive_help(void)
{
struct interactive_command *c;
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];