+/*
+ * Copyright (C) 2008 Andre Noll <maan@systemlinux.org>
+ *
+ * Licensed under the GPL v2. For licencing details see COPYING.
+ */
+
#include <ctype.h> /* isspace() */
#include "adu.h"
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")
#define INTERACTIVE_COMMAND(name, desc) \
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,
fi = NULL;
free(admissible_uids);
admissible_uids = NULL;
- return parse_select_options(line, ¶ms, &admissible_uids, &fi);
+ ret = parse_select_options(line, ¶ms, &admissible_uids, &fi);
+ if (ret >= 0)
+ return ret;
+ return icom_reset(NULL);
}
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;
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;
+}
+
int com_interactive(void)
{
char line[255];
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)