X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=interactive.c;h=3cfb3a2f5ee284c0f757d21e71f4058c21601daa;hb=d5d8bd8399bd7f3b90a39faa43412db2b54b7616;hp=b3254157d6785403573252876624c026ed912ed4;hpb=9e41a10fbee567866d78903b11646d341cfd9882;p=adu.git diff --git a/interactive.c b/interactive.c index b325415..3cfb3a2 100644 --- a/interactive.c +++ b/interactive.c @@ -2,10 +2,11 @@ #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. @@ -29,7 +30,8 @@ static struct format_info *fi; 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) \ @@ -81,16 +83,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 +111,10 @@ static int icom_set(char *line) 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) @@ -141,7 +148,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 +165,25 @@ 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; +} + int com_interactive(void) { char line[255]; @@ -165,6 +191,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)