/*
- * Copyright (C) 2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2008 Andre Noll <maan@tuebingen.mpg.de>
*
* 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 "user.h"
#include "string.h"
+#include "cmdline.h"
#include "select.cmdline.h"
#include "select.h"
#include "error.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(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;
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;
- ret = parse_select_options(line, ¶ms, &admissible_uids, &fi);
- if (ret >= 0)
- return ret;
- return icom_reset(NULL);
+ return parse_select_options(line, ¶ms, &admissible_uids, &fi);
}
+/**
+ * Wrapper for isspace.
+ * NetBSD needs this.
+ */
+/*
+ * The values should be cast to an unsigned char first, then to int.
+ * Why? Because the isdigit (as do all other is/to functions/macros)
+ * expect a number from 0 upto and including 255 as their (int) argument.
+ * Because char is signed on most systems, casting it to int immediately
+ * gives the functions an argument between -128 and 127 (inclusive),
+ * which they will use as an array index, and which will thus fail
+ * horribly for characters which have their most significant bit set.
+ */
+#define adu_isspace(c) isspace((int)(unsigned char)(c))
+
static int exec_interactive_command(char *line)
{
const char const *delim = "\t\n\f\r\v ";
return 1;
len = strlen(line);
- while (len && isspace(line[len - 1])) {
+ while (len && adu_isspace(line[len - 1])) {
line[len - 1] = '\0';
len--;
}
return ret;
}
+/**
+ * The main function for interactive mode.
+ *
+ * \return Standard.
+ */
int com_interactive(void)
{
char line[255];
- int ret = 1;
+ int ret;
select_cmdline_parser_init(&select_conf);
ret = parse_select_options(NULL, NULL, &admissible_uids, &fi);
ret = exec_interactive_command(line);
if (ret < 0)
printf("%s\n", adu_strerror(-ret));
+ fflush(NULL);
}
return ret;
}