summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2007-12-03 20:43:04 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2007-12-03 20:43:04 +0000
commitc57171ac85329c8baad86a7e4221ebeef2df0804 (patch)
tree28c9f41649987cd286c76a55bed27aa77f783b97
parent0112e3c07a2b8fcfb642ace4b880575f86fcf933 (diff)
downloadmailutils-c57171ac85329c8baad86a7e4221ebeef2df0804.tar.gz
mailutils-c57171ac85329c8baad86a7e4221ebeef2df0804.tar.bz2
* auth/virtual.c (site_virtual_pwddir): Replace with global
struct mu_gocs_virtual mu_virtual_module_config * include/mailutils/cfg.h (MU_PARSE_CONFIG_GLOBAL) (MU_PARSE_CONFIG_VERBOSE, MU_PARSE_CONFIG_DUMP): New defines. (mu_cfg_tree_create,mu_cfg_tree_set_debug,mu_cfg_tree_set_alloc) (mu_cfg_tree_alloc,mu_cfg_tree_free) (mu_cfg_tree_create_node,mu_cfg_tree_add_node): New functions. * include/mailutils/gocs.h (struct mu_gocs_virtual): New data type. * include/mailutils/libargp.h (struct mu_argp_node_list): New data type. (mu_argp_node_list_init, mu_argp_node_list_add) (mu_argp_node_list_new, mu_argp_node_list_finish): New functions. * libargp/cmdline.h: New header. * libargp/Makefile.am (libmuargp_a_SOURCES): Add cmdline.h. * dotlock/dotlock.c, imap4d/imap4d.c, libargp/auth.c, libargp/cmdline.c, libargp/common.c, libargp/compat.c, libargp/gsasl.c, libargp/mu_argp.c, libargp/muinit.c, libargp/pam.c, libargp/radius.c, libargp/sieve.c, libargp/sql.c, libargp/tls.c, libargp/virtdomain.c, libcfg/common.c, libcfg/init.c, libcfg/virtdomain.c, maidag/maidag.c, mail.local/main.c, mail.remote/mail.remote.c, mimeview/mimeview.c, movemail/movemail.c, pop3d/pop3d.c, readmsg/readmsg.c, sieve/sieve.c: Change option parsing, usig mu_cfg_tree_ functions. * mailbox/argcv.c: Fix a typo in comment. * mailbox/cfg_lexer.c (mu_parse_config_tree): New function. (_mu_parse_config): Rewrite using mu_parse_config_tree. * mailbox/cfg_parser.y (mu_cfg_format_error,_mu_cfg_vperror) (debug_print_node): Use default diag debug_t object, if the passed one is NULL. Reset locus after formatting. (mu_cfg_postorder): Return immediately if node == NULL. (mu_cfg_tree_create,mu_cfg_tree_set_debug,mu_cfg_tree_set_alloc) (mu_cfg_tree_alloc,mu_cfg_tree_free,mu_cfg_tree_create_node) (mu_cfg_tree_add_node): New functions. * mailbox/gocs.c (mu_gocs_store): Make sure no capa/data tuple gets registered twice.
-rw-r--r--ChangeLog44
-rw-r--r--auth/virtual.c12
-rw-r--r--dotlock/dotlock.c29
-rw-r--r--imap4d/imap4d.c33
-rw-r--r--include/mailutils/cfg.h20
-rw-r--r--include/mailutils/gocs.h5
-rw-r--r--include/mailutils/libargp.h12
-rw-r--r--libargp/Makefile.am1
-rw-r--r--libargp/auth.c19
-rw-r--r--libargp/cmdline.c54
-rw-r--r--libargp/cmdline.h23
-rw-r--r--libargp/common.c142
-rw-r--r--libargp/gsasl.c16
-rw-r--r--libargp/mu_argp.c4
-rw-r--r--libargp/muinit.c20
-rw-r--r--libargp/pam.c14
-rw-r--r--libargp/radius.c21
-rw-r--r--libargp/sieve.c33
-rw-r--r--libargp/sql.c54
-rw-r--r--libargp/tls.c24
-rw-r--r--libargp/virtdomain.c14
-rw-r--r--libcfg/common.c28
-rw-r--r--libcfg/init.c14
-rw-r--r--libcfg/virtdomain.c2
-rw-r--r--maidag/maidag.c34
-rw-r--r--mail.local/main.c28
-rw-r--r--mail.remote/mail.remote.c19
-rw-r--r--mailbox/argcv.c2
-rw-r--r--mailbox/cfg_lexer.c135
-rw-r--r--mailbox/cfg_parser.y106
-rw-r--r--mailbox/gocs.c13
-rw-r--r--mimeview/mimeview.c12
-rw-r--r--movemail/movemail.c17
-rw-r--r--pop3d/pop3d.c42
-rw-r--r--readmsg/readmsg.c24
-rw-r--r--sieve/sieve.c31
36 files changed, 709 insertions, 392 deletions
diff --git a/ChangeLog b/ChangeLog
index d57d533e1..b9fe23ef6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,45 @@
2007-12-03 Sergey Poznyakoff <gray@gnu.org.ua>
+ * auth/virtual.c (site_virtual_pwddir): Replace with global
+ struct mu_gocs_virtual mu_virtual_module_config
+
+ * include/mailutils/cfg.h (MU_PARSE_CONFIG_GLOBAL)
+ (MU_PARSE_CONFIG_VERBOSE, MU_PARSE_CONFIG_DUMP): New defines.
+ (mu_cfg_tree_create,mu_cfg_tree_set_debug,mu_cfg_tree_set_alloc)
+ (mu_cfg_tree_alloc,mu_cfg_tree_free)
+ (mu_cfg_tree_create_node,mu_cfg_tree_add_node): New functions.
+ * include/mailutils/gocs.h (struct mu_gocs_virtual): New data
+ type.
+ * include/mailutils/libargp.h (struct mu_argp_node_list): New data
+ type.
+ (mu_argp_node_list_init, mu_argp_node_list_add)
+ (mu_argp_node_list_new, mu_argp_node_list_finish): New functions.
+ * libargp/cmdline.h: New header.
+ * libargp/Makefile.am (libmuargp_a_SOURCES): Add cmdline.h.
+
+ * dotlock/dotlock.c, imap4d/imap4d.c, libargp/auth.c,
+ libargp/cmdline.c, libargp/common.c, libargp/compat.c,
+ libargp/gsasl.c, libargp/mu_argp.c, libargp/muinit.c,
+ libargp/pam.c, libargp/radius.c, libargp/sieve.c, libargp/sql.c,
+ libargp/tls.c, libargp/virtdomain.c, libcfg/common.c,
+ libcfg/init.c, libcfg/virtdomain.c, maidag/maidag.c,
+ mail.local/main.c, mail.remote/mail.remote.c, mimeview/mimeview.c,
+ movemail/movemail.c, pop3d/pop3d.c, readmsg/readmsg.c,
+ sieve/sieve.c: Change option parsing, usig mu_cfg_tree_ functions.
+
+ * mailbox/argcv.c: Fix a typo in comment.
+ * mailbox/cfg_lexer.c (mu_parse_config_tree): New function.
+ (_mu_parse_config): Rewrite using mu_parse_config_tree.
+ * mailbox/cfg_parser.y (mu_cfg_format_error,_mu_cfg_vperror)
+ (debug_print_node): Use default diag debug_t object, if the passed
+ one is NULL. Reset locus after formatting.
+ (mu_cfg_postorder): Return immediately if node == NULL.
+ (mu_cfg_tree_create,mu_cfg_tree_set_debug,mu_cfg_tree_set_alloc)
+ (mu_cfg_tree_alloc,mu_cfg_tree_free,mu_cfg_tree_create_node)
+ (mu_cfg_tree_add_node): New functions.
+ * mailbox/gocs.c (mu_gocs_store): Make sure no capa/data tuple
+ gets registered twice.
+
* NEWS: Update.
* gnulib.modules: Add des. Sort lines.
* imap4d/Makefile.am (imap4d_SOURCES): Add preauth.c
@@ -7,13 +47,13 @@
* imap4d/authenticate.c (imap4d_authenticate): Use
imap4d_session_setup.
* imap4d/imap4d.c (imap4d_session_setup)
- (imap4d_session_setup.0): New functions.
+ (imap4d_session_setup0): New functions.
(imap4d_mainloop): Implement PREAUTH mode.
* imap4d/imap4d.h (RESP_PREAUTH): New define.
(enum imap4d_preauth): New data type.
(preauth_mode,preauth_program,preauth_only,ident_port): New
globals.
- (imap4d_session_setup,imap4d_session_setup.0): New functions.
+ (imap4d_session_setup,imap4d_session_setup0): New functions.
* imap4d/login.c (imap4d_login): Use imap4d_session_setup0.
* imap4d/util.c (sc2string): Handle RESP_PREAUTH
diff --git a/auth/virtual.c b/auth/virtual.c
index 53719862e..9a6756b2c 100644
--- a/auth/virtual.c
+++ b/auth/virtual.c
@@ -55,17 +55,15 @@
#ifdef ENABLE_VIRTUAL_DOMAINS
-/* FIXME: Make global, prefix with mu_ */
-static char *site_virtual_pwddir = SITE_VIRTUAL_PWDDIR;
+struct mu_gocs_virtual mu_virtual_module_config = { SITE_VIRTUAL_PWDDIR };
int
mu_virtual_module_init (void *data)
{
if (data)
{
- site_virtual_pwddir = strdup (data);
- if (!site_virtual_pwddir)
- return 1;
+ struct mu_gocs_virtual *p = data;
+ mu_virtual_module_config = *p;
}
return 0;
}
@@ -91,12 +89,12 @@ getpwnam_virtual (const char *u)
if (delim == 0)
return NULL;
- filename = malloc (strlen (site_virtual_pwddir) +
+ filename = malloc (strlen (mu_virtual_module_config.pwddir) +
strlen (&u[delim + 1]) + 2 /* slash and null byte */);
if (filename == NULL)
return NULL;
- sprintf (filename, "%s/%s", site_virtual_pwddir, &u[delim + 1]);
+ sprintf (filename, "%s/%s", mu_virtual_module_config.pwddir, &u[delim + 1]);
pfile = fopen (filename, "r");
free (filename);
diff --git a/dotlock/dotlock.c b/dotlock/dotlock.c
index b6abf2efb..c38282f57 100644
--- a/dotlock/dotlock.c
+++ b/dotlock/dotlock.c
@@ -77,10 +77,12 @@ static int debug;
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
case 'd':
- debug = 1;
+ mu_argp_node_list_new (&lst, "debug", "yes");
break;
case 'u':
@@ -89,21 +91,11 @@ parse_opt (int key, char *arg, struct argp_state *state)
case 'r':
if (arg)
- {
- retries = atoi (arg);
- if (retries <= 0)
- argp_error (state, _("RETRIES must be greater than 0"));
- }
- flags |= MU_LOCKER_RETRY;
+ mu_argp_node_list_new (&lst, "retry", arg);
break;
case 'f':
- if (arg)
- {
- force = atoi (arg);
- if (force <= 0)
- argp_error (state, _("MINUTES must be greater than 0"));
- }
+ mu_argp_node_list_new (&lst, "force", arg ? arg : "0");
break;
case ARGP_KEY_ARG:
@@ -115,6 +107,14 @@ parse_opt (int key, char *arg, struct argp_state *state)
case ARGP_KEY_NO_ARGS:
argp_error (state, _("FILE must be specified"));
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
+ break;
+
+ case ARGP_KEY_FINI:
+ mu_argp_node_list_finish (&lst, NULL, NULL);
+ break;
+
default:
return ARGP_ERR_UNKNOWN;
}
@@ -166,6 +166,9 @@ main (int argc, char *argv[])
force *= 60;
flags |= MU_LOCKER_TIME;
}
+
+ if (retries != 0)
+ flags |= MU_LOCKER_RETRY;
if ((err = mu_locker_create (&locker, file, flags)))
{
diff --git a/imap4d/imap4d.c b/imap4d/imap4d.c
index 186e2fc8d..05918b39f 100644
--- a/imap4d/imap4d.c
+++ b/imap4d/imap4d.c
@@ -110,40 +110,41 @@ static int imap4d_mainloop (int, FILE *, FILE *);
static error_t
imap4d_parse_opt (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
- case ARGP_KEY_INIT:
- state->child_inputs[0] = state->input;
- break;
-
case 'O':
- set_namespace (NS_OTHER, arg);
+ mu_argp_node_list_new (&lst, "other-namespace", arg);
break;
case 'S':
- set_namespace (NS_SHARED, arg);
+ mu_argp_node_list_new (&lst, "shared-namespace", arg);
break;
case ARG_LOGIN_DISABLED:
- login_disabled = 1;
+ mu_argp_node_list_new (&lst, "login-disabled", "yes");
break;
case ARG_CREATE_HOME_DIR:
- create_home_dir = 1;
+ mu_argp_node_list_new (&lst, "create-home-dir", "yes");
if (arg)
- {
- char *p;
- home_dir_mode = strtoul (arg, &p, 8);
- if (p || (home_dir_mode & 0777))
- argp_error (state, _("Invalid mode specification: %s"), arg);
- }
+ mu_argp_node_list_new (&lst, "home-dir-mode", arg);
break;
#ifdef WITH_TLS
case ARG_TLS_REQUIRED:
- tls_required = 1;
+ mu_argp_node_list_new (&lst, "tls-required", "yes");
break;
#endif
+
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
+ break;
+
+ case ARGP_KEY_FINI:
+ mu_argp_node_list_finish (&lst, NULL, NULL);
+ break;
default:
return ARGP_ERR_UNKNOWN;
@@ -170,7 +171,7 @@ cb_mode (mu_debug_t debug, void *data, char *arg)
{
char *p;
home_dir_mode = strtoul (arg, &p, 8);
- if (p || (home_dir_mode & 0777))
+ if (p[0] || (home_dir_mode & ~0777))
mu_cfg_format_error (debug, MU_DEBUG_ERROR,
_("Invalid mode specification: %s"), arg);
return 0;
diff --git a/include/mailutils/cfg.h b/include/mailutils/cfg.h
index 5436d4962..aa986e4be 100644
--- a/include/mailutils/cfg.h
+++ b/include/mailutils/cfg.h
@@ -198,14 +198,30 @@ int mu_config_register_plain_section (const char *parent_path,
const char *ident,
struct mu_cfg_param *params);
+#define MU_PARSE_CONFIG_GLOBAL 0x1
+#define MU_PARSE_CONFIG_VERBOSE 0x2
+#define MU_PARSE_CONFIG_DUMP 0x4
+
int mu_parse_config (const char *file, const char *progname,
- struct mu_cfg_param *progparam, int global);
+ struct mu_cfg_param *progparam, int flags);
int mu_cfg_parse_boolean (const char *str, int *res);
extern int mu_cfg_parser_verbose;
-void mu_cfg_format_tree (mu_stream_t stream, mu_cfg_tree_t *tree);
+void mu_cfg_format_tree (mu_stream_t stream, struct mu_cfg_tree *tree);
+
+int mu_cfg_tree_create (struct mu_cfg_tree **ptree);
+void mu_cfg_tree_set_debug (struct mu_cfg_tree *tree, mu_debug_t debug);
+void mu_cfg_tree_set_alloc (struct mu_cfg_tree *tree,
+ mu_cfg_alloc_t alloc, mu_cfg_free_t free);
+void *mu_cfg_tree_alloc (struct mu_cfg_tree *tree, size_t size);
+void mu_cfg_tree_free (struct mu_cfg_tree *tree, void *mem);
+mu_cfg_node_t *mu_cfg_tree_create_node
+ (struct mu_cfg_tree *tree, enum mu_cfg_node_type type,
+ mu_cfg_locus_t *loc, char *tag, char *label,
+ mu_cfg_node_t *node);
+void mu_cfg_tree_add_node (mu_cfg_tree_t *tree, mu_cfg_node_t *node);
#ifdef __cplusplus
}
diff --git a/include/mailutils/gocs.h b/include/mailutils/gocs.h
index da7ebe929..e5ca15781 100644
--- a/include/mailutils/gocs.h
+++ b/include/mailutils/gocs.h
@@ -80,6 +80,11 @@ struct mu_gocs_pam
char *service;
};
+struct mu_gocs_virtual
+{
+ char *pwddir;
+};
+
/* Auxiliary variables for use by libargp/libcfg */
extern int mu_load_user_rcfile;
extern int mu_load_site_rcfile;
diff --git a/include/mailutils/libargp.h b/include/mailutils/libargp.h
index 56f761748..642b4d997 100644
--- a/include/mailutils/libargp.h
+++ b/include/mailutils/libargp.h
@@ -79,6 +79,18 @@ error_t mu_argp_parse (const struct argp *myargp,
const char *capa[],
int *arg_index,
void *input) __attribute__ ((deprecated));
+
+struct mu_argp_node_list
+{
+ int count;
+ mu_cfg_node_t *head, *tail;
+};
+
+void mu_argp_node_list_init (struct mu_argp_node_list *);
+void mu_argp_node_list_add (struct mu_argp_node_list *, mu_cfg_node_t *);
+void mu_argp_node_list_new (struct mu_argp_node_list *,
+ char *, char *);
+void mu_argp_node_list_finish (struct mu_argp_node_list *, char *, char *);
#ifdef __cplusplus
}
diff --git a/libargp/Makefile.am b/libargp/Makefile.am
index fad3d319e..141c10c0d 100644
--- a/libargp/Makefile.am
+++ b/libargp/Makefile.am
@@ -27,6 +27,7 @@ lib_LIBRARIES = libmuargp.a
libmuargp_a_SOURCES =\
auth.c\
cmdline.c\
+ cmdline.h\
common.c\
compat.c\
gsasl.c\
diff --git a/libargp/auth.c b/libargp/auth.c
index 783248667..32be741ab 100644
--- a/libargp/auth.c
+++ b/libargp/auth.c
@@ -19,7 +19,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
-#include "mailutils/libargp.h"
+#include "cmdline.h"
#include "mailutils/mu_auth.h"
@@ -80,27 +80,32 @@ auth_set_debug ()
static error_t
mu_auth_argp_parser (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
+ break;
+
case ARGP_KEY_FINI:
- mu_auth_finish_setup ();
+ mu_argp_node_list_finish (&lst, "auth", NULL);
break;
- /* authentication */
case OPT_AUTHORIZATION:
- mu_authorization_add_module_list (arg);
+ mu_argp_node_list_new (&lst, "authorization", arg);
break;
case OPT_AUTHENTICATION:
- mu_authentication_add_module_list (arg);
+ mu_argp_node_list_new (&lst, "authentication", arg);
break;
case OPT_CLEAR_AUTHENTICATION:
- mu_authentication_clear_list ();
+ mu_argp_node_list_new (&lst, "authentication", "clear");
break;
case OPT_CLEAR_AUTHORIZATION:
- mu_authorization_clear_list ();
+ mu_argp_node_list_new (&lst, "authorization", "clear");
break;
case OPT_DEBUG_AUTH:
diff --git a/libargp/cmdline.c b/libargp/cmdline.c
index f90b94055..397746dc0 100644
--- a/libargp/cmdline.c
+++ b/libargp/cmdline.c
@@ -19,7 +19,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
-#include "mailutils/libargp.h"
+#include "cmdline.h"
static struct mu_cmdline_capa *all_cmdline_capa[] = {
&mu_common_cmdline,
@@ -63,5 +63,53 @@ mu_libargp_init ()
}
}
-
-
+void
+mu_argp_node_list_init (struct mu_argp_node_list *lst)
+{
+ lst->count = 0;
+ lst->head = lst->tail = NULL;
+}
+
+void
+mu_argp_node_list_add (struct mu_argp_node_list *lst, mu_cfg_node_t *node)
+{
+ lst->count++;
+ if (lst->tail)
+ lst->tail->next = node;
+ else
+ lst->head = node;
+ lst->tail = node;
+}
+
+void
+mu_argp_node_list_new (struct mu_argp_node_list *lst,
+ char *tag, char *label)
+{
+ mu_cfg_node_t *node;
+ mu_cfg_locus_t loc = { "command line", 0 };
+
+ loc.line = lst->count;
+ node = mu_cfg_tree_create_node (mu_argp_tree, mu_cfg_node_param,
+ &loc, tag, label, NULL);
+ mu_argp_node_list_add (lst, node);
+}
+
+void
+mu_argp_node_list_finish (struct mu_argp_node_list *lst, char *tag,
+ char *label)
+{
+ mu_cfg_node_t *node;
+
+ if (!lst->head)
+ return;
+ if (tag)
+ node = mu_cfg_tree_create_node (mu_argp_tree,
+ mu_cfg_node_tag,
+ NULL,
+ tag, label,
+ lst->head);
+ else
+ node = lst->head;
+ mu_cfg_tree_add_node (mu_argp_tree, node);
+ mu_argp_node_list_init (lst);
+}
diff --git a/libargp/cmdline.h b/libargp/cmdline.h
new file mode 100644
index 000000000..0020d8019
--- /dev/null
+++ b/libargp/cmdline.h
@@ -0,0 +1,23 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 2007 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General
+ Public License along with this library; if not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301 USA */
+
+#include "mailutils/libcfg.h"
+#include "mailutils/libargp.h"
+
+extern struct mu_cfg_tree *mu_argp_tree;
+
diff --git a/libargp/common.c b/libargp/common.c
index 3c9c1b07e..608667aef 100644
--- a/libargp/common.c
+++ b/libargp/common.c
@@ -19,45 +19,11 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
-#include "mailutils/libargp.h"
+#include "cmdline.h"
#include <string.h>
#include <mailutils/syslog.h>
#include <mailutils/daemon.h>
-static struct mu_gocs_daemon daemon_settings;
-static struct mu_gocs_locking locking_settings;
-static struct mu_gocs_logging logging_settings;
-static struct mu_gocs_mailbox mailbox_settings;
-static struct mu_gocs_source_email source_email_settings;
-static struct mu_gocs_mailer mailer_settings;
-static struct mu_gocs_debug debug_settings;
-
-
-void
-assign_string (char **pstr, char *val)
-{
- if (!val)
- {
- if (*pstr)
- {
- free (*pstr);
- *pstr = NULL;
- }
- }
- else
- {
- size_t size = strlen (val);
- char *p = realloc (*pstr, size + 1);
- if (!p)
- {
- mu_error ("%s", mu_strerror (ENOMEM));
- exit (1);
- }
- strcpy (p, val);
- *pstr = p;
- }
-}
-
/* ************************************************************************* */
/* Common */
@@ -158,17 +124,21 @@ static struct argp_option mu_logging_argp_option[] = {
static error_t
mu_logging_argp_parser (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
/* log */
case OPT_LOG_FACILITY:
- if (mu_string_to_syslog_facility (arg, &logging_settings.facility))
- mu_error (_("Unknown syslog facility `%s'"), arg);
- /* FIXME: error reporting */
+ mu_argp_node_list_new (&lst, "facility", arg);
break;
-
+
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
+ break;
+
case ARGP_KEY_FINI:
- mu_gocs_store ("logging", &logging_settings);
+ mu_argp_node_list_finish (&lst, "logging", NULL);
break;
default:
@@ -253,19 +223,25 @@ static struct argp_option mu_mailbox_argp_option[] = {
static error_t
mu_mailbox_argp_parser (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
/* mailbox */
case 'm':
- assign_string (&mailbox_settings.mail_spool, arg);
+ mu_argp_node_list_new (&lst, "mail-spool", arg);
break;
case OPT_MAILBOX_TYPE:
- assign_string (&mailbox_settings.mailbox_type, arg);
+ mu_argp_node_list_new (&lst, "mailbox-type", arg);
break;
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
+ break;
+
case ARGP_KEY_FINI:
- mu_gocs_store ("mailbox", &mailbox_settings);
+ mu_argp_node_list_finish (&lst, "mailbox", NULL);
break;
default:
@@ -314,30 +290,36 @@ static struct argp_option mu_locking_argp_option[] = {
static error_t
mu_locking_argp_parser (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
case OPT_LOCK_FLAGS:
- assign_string (&locking_settings.lock_flags, arg);
+ mu_argp_node_list_new (&lst, "flags", arg);
break;
case OPT_LOCK_RETRY_COUNT:
- locking_settings.lock_retry_count = strtoul (arg, NULL, 0);
+ mu_argp_node_list_new (&lst, "retry-count", arg);
break;
case OPT_LOCK_RETRY_TIMEOUT:
- locking_settings.lock_retry_timeout = strtoul (arg, NULL, 0);
+ mu_argp_node_list_new (&lst, "retry-timeout", arg);
break;
case OPT_LOCK_EXPIRE_TIMEOUT:
- locking_settings.lock_expire_timeout = strtoul (arg, NULL, 0);
+ mu_argp_node_list_new (&lst, "expire-timeout", arg);
break;
case OPT_LOCK_EXTERNAL_PROGRAM:
- assign_string (&locking_settings.external_locker, arg);
+ mu_argp_node_list_new (&lst, "external-locker", arg);
+ break;
+
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
break;
case ARGP_KEY_FINI:
- mu_gocs_store ("locking", &locking_settings);
+ mu_argp_node_list_finish (&lst, "locking", NULL);
break;
default:
@@ -379,18 +361,24 @@ static struct argp_option mu_address_argp_option[] = {
static error_t
mu_address_argp_parser (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
case 'E':
- assign_string (&source_email_settings.address, arg);
+ mu_argp_node_list_new (&lst, "email-addr", arg);
break;
case 'D':
- assign_string (&source_email_settings.domain, arg);
+ mu_argp_node_list_new (&lst, "email-domain", arg);
break;
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
+ break;
+
case ARGP_KEY_FINI:
- mu_gocs_store ("address", &source_email_settings);
+ mu_argp_node_list_finish (&lst, "address", NULL);
break;
default:
@@ -430,15 +418,21 @@ static struct argp_option mu_mailer_argp_option[] = {
static error_t
mu_mailer_argp_parser (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
/* mailer */
case 'M':
- assign_string (&mailer_settings.mailer, arg);
+ mu_argp_node_list_new (&lst, "url", arg);
+ break;
+
+ case ARGP_KEY_INIT:
+ mu_argp_node_list_init (&lst);
break;
case ARGP_KEY_FINI:
- mu_gocs_store ("mailer", &mailer_settings);
+ mu_argp_node_list_finish (&lst, "mailer", NULL);
break;
default:
@@ -488,51 +482,40 @@ static struct argp_option mu_daemon_argp_option[] = {
static error_t
mu_daemon_argp_parser (int key, char *arg, struct argp_state *state)
{
- static int options_given = 0;
+ static struct mu_argp_node_list lst;
switch (key)
{
case 'd':
- options_given = 1;
- daemon_settings.mode = MODE_DAEMON;
- if (arg)
- daemon_settings.maxchildren = strtoul (arg, NULL, 10);
+ mu_argp_node_list_new (&lst, "mode", arg);
break;
case 'i':
- options_given = 1;
- daemon_settings.mode = MODE_INTERACTIVE;
+ mu_argp_node_list_new (&lst, "mode", "inetd");
break;
case 'p':
- options_given = 1;
- daemon_settings.mode = MODE_DAEMON;
- daemon_settings.port = strtoul (arg, NULL, 10); /*FIXME: overflow */
+ mu_argp_node_list_new (&lst, "port", arg);
break;
case 'P':
- options_given = 1;
- assign_string (&daemon_settings.pidfile, arg);
+ mu_argp_node_list_new (&lst, "pidfile", arg);
break;
case 't':
- options_given = 1;
- daemon_settings.timeout = strtoul (arg, NULL, 10);
+ mu_argp_node_list_new (&lst, "timeout", arg);
break;
case 'x':
- options_given = 1;
- daemon_settings.transcript = 1;
+ mu_argp_node_list_new (&lst, "transcript", "yes");
break;
case ARGP_KEY_INIT:
- options_given = 0;
- daemon_settings = mu_gocs_daemon;
+ mu_argp_node_list_init (&lst);
break;
case ARGP_KEY_FINI:
- if (options_given)
- mu_gocs_store ("daemon", &daemon_settings);
+ mu_argp_node_list_finish (&lst, "daemon", NULL);
break;
default:
@@ -570,23 +553,24 @@ static struct argp_option mu_debug_argp_options[] =
static error_t
mu_debug_argp_parser (int key, char *arg, struct argp_state *state)
{
+ static struct mu_argp_node_list lst;
+
switch (key)
{
case OPT_DEBUG_LEVEL:
- debug_settings.string = arg;
- debug_settings.errpfx = strdup ("command line");
+ mu_argp_node_list_new (&lst, "level", arg);
break;
case OPT_LINE_INFO:
- debug_settings.line_info = 1;
+ mu_argp_node_list_new (&lst, "line-info", "yes");
break;
case ARGP_KEY_INIT:
- debug_settings.line_info = -1;
+ mu_argp_node_list_init (&lst);
break;
case ARGP_KEY_FINI:
- mu_gocs_store ("debug", &debug_settings);
+ mu_argp_node_list_finish (&lst, "debug", NULL);
break;
default:
diff --git a/libargp/gsasl.c b/libargp/gsasl.c
index f3e65ab45..598b6ce1b 100644
--- a/libargp/gsasl.c
+++ b/libargp/gsasl.c
@@ -19,7 +19,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
-#include "mai