Commit aac8beae aac8beae014b6345bc3682c6d0f5b544b2a84956 by Sergey Poznyakoff

Use mu_c_type_t throughout the code. Get rid of mu_cfg_param_data_type.

* include/mailutils/cfg.h (mu_cfg_param_data_type): Remove.
(mu_cfg_param_type): New enum.
(mu_cfg_param) <type>: Change type to int.
(mu_cfg_cidr): Remove.
(mu_cfg_parse_boolean): Remove.  All uses updated.
* include/mailutils/util.h (mu_c_void): New constant.
(mu_c_type_str): New extern/
* libmailutils/string/str_to_c.c (mu_c_type_str): New global.
* libmailutils/cfg/format.c (mu_cfg_data_type_string): Rename
to mu_c_type_string; change argument type.
All uses updated.
* libmailutils/cfg/parser.y: Use mu_str_to_c for value
conversion.

* libmailutils/tests/.gitignore: Update.
* libmailutils/tests/Makefile.am: Add strtoc.at; build strtoc
* libmailutils/tests/strtoc.at: New file.
* libmailutils/tests/strtoc.c: New file.
* libmailutils/tests/testsuite.at: Include strtoc.at

* comsat/comsat.c: Use mu_c_type_t types.
* dotlock/dotlock.c: Likewise.
* imap4d/imap4d.c: Likewise.
* lib/manlock.c: Likewise.
* lib/tcpwrap.c: Likewise.
* libmailutils/server/msrv.c: Likewise.
* libmu_argp/muinit.c: Likewise.
* libmu_cfg/common.c: Likewise.
* libmu_cfg/gsasl.c: Likewise.
* libmu_cfg/ldap.c: Likewise.
* libmu_cfg/pam.c: Likewise.
* libmu_cfg/radius.c: Likewise.
* libmu_cfg/sieve.c: Likewise.
* libmu_cfg/sql.c: Likewise.
* libmu_cfg/tls.c: Likewise.
* libmu_cfg/virtdomain.c: Likewise.
* maidag/maidag.c: Likewise.
* mimeview/mimeview.c: Likewise.
* movemail/movemail.c: Likewise.
* pop3d/pop3d.c: Likewise.
* readmsg/readmsg.c: Likewise.
* sieve/sieve.c: Likewise.
1 parent 87ef8884
...@@ -128,7 +128,7 @@ biffrc_error_ctl (mu_config_value_t *val, int flag) ...@@ -128,7 +128,7 @@ biffrc_error_ctl (mu_config_value_t *val, int flag)
128 128
129 if (mu_cfg_assert_value_type (val, MU_CFG_STRING)) 129 if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
130 return 1; 130 return 1;
131 if (mu_cfg_parse_boolean (val->v.string, &res)) 131 if (mu_str_to_c (val->v.string, mu_c_bool, &res, NULL))
132 mu_diag_output (MU_LOG_ERROR, _("not a boolean")); 132 mu_diag_output (MU_LOG_ERROR, _("not a boolean"));
133 else if (res) 133 else if (res)
134 biffrc_errors |= flag; 134 biffrc_errors |= flag;
...@@ -150,9 +150,9 @@ cb_biffrc_errors_to_err (void *data, mu_config_value_t *val) ...@@ -150,9 +150,9 @@ cb_biffrc_errors_to_err (void *data, mu_config_value_t *val)
150 } 150 }
151 151
152 struct mu_cfg_param comsat_cfg_param[] = { 152 struct mu_cfg_param comsat_cfg_param[] = {
153 { "allow-biffrc", mu_cfg_bool, &allow_biffrc, 0, NULL, 153 { "allow-biffrc", mu_c_bool, &allow_biffrc, 0, NULL,
154 N_("Read .biffrc file from the user home directory.") }, 154 N_("Read .biffrc file from the user home directory.") },
155 { "require-tty", mu_cfg_bool, &require_tty, 0, NULL, 155 { "require-tty", mu_c_bool, &require_tty, 0, NULL,
156 N_("Notify only if the user is logged on one of the ttys.") }, 156 N_("Notify only if the user is logged on one of the ttys.") },
157 { "biffrc-errors-to-tty", mu_cfg_callback, NULL, 0, cb_biffrc_errors_to_tty, 157 { "biffrc-errors-to-tty", mu_cfg_callback, NULL, 0, cb_biffrc_errors_to_tty,
158 N_("Send biffrc errors to user's tty."), 158 N_("Send biffrc errors to user's tty."),
...@@ -160,17 +160,17 @@ struct mu_cfg_param comsat_cfg_param[] = { ...@@ -160,17 +160,17 @@ struct mu_cfg_param comsat_cfg_param[] = {
160 { "biffrc-errors-to-err", mu_cfg_callback, NULL, 0, cb_biffrc_errors_to_err, 160 { "biffrc-errors-to-err", mu_cfg_callback, NULL, 0, cb_biffrc_errors_to_err,
161 N_("Send biffrc errors to Mailutils error output."), 161 N_("Send biffrc errors to Mailutils error output."),
162 N_("arg: bool") }, 162 N_("arg: bool") },
163 { "max-lines", mu_cfg_int, &maxlines, 0, NULL, 163 { "max-lines", mu_c_int, &maxlines, 0, NULL,
164 N_("Maximum number of message body lines to be output.") }, 164 N_("Maximum number of message body lines to be output.") },
165 { "max-requests", mu_cfg_uint, &maxrequests, 0, NULL, 165 { "max-requests", mu_c_uint, &maxrequests, 0, NULL,
166 N_("Maximum number of incoming requests per request control interval.") }, 166 N_("Maximum number of incoming requests per request control interval.") },
167 { "request-control-interval", mu_cfg_time, &request_control_interval, 167 { "request-control-interval", mu_c_time, &request_control_interval,
168 0, NULL, 168 0, NULL,
169 N_("Set control interval.") }, 169 N_("Set control interval.") },
170 { "overflow-control-interval", mu_cfg_time, &overflow_control_interval, 170 { "overflow-control-interval", mu_c_time, &overflow_control_interval,
171 0, NULL, 171 0, NULL,
172 N_("Set overflow control interval.") }, 172 N_("Set overflow control interval.") },
173 { "overflow-delay-time", mu_cfg_time, &overflow_delay_time, 173 { "overflow-delay-time", mu_c_time, &overflow_delay_time,
174 0, NULL, 174 0, NULL,
175 N_("Time to sleep after the first overflow occurs.") }, 175 N_("Time to sleep after the first overflow occurs.") },
176 { ".server", mu_cfg_section, NULL, 0, NULL, 176 { ".server", mu_cfg_section, NULL, 0, NULL,
......
...@@ -122,11 +122,11 @@ parse_opt (int key, char *arg, struct argp_state *state) ...@@ -122,11 +122,11 @@ parse_opt (int key, char *arg, struct argp_state *state)
122 122
123 123
124 struct mu_cfg_param dotlock_cfg_param[] = { 124 struct mu_cfg_param dotlock_cfg_param[] = {
125 { "force", mu_cfg_time, &force, 0, NULL, 125 { "force", mu_c_time, &force, 0, NULL,
126 N_("Forcibly break an existing lock older than the specified time.") }, 126 N_("Forcibly break an existing lock older than the specified time.") },
127 { "retry", mu_cfg_int, &retries, 0, NULL, 127 { "retry", mu_c_int, &retries, 0, NULL,
128 N_("Number of times to retry acquiring the lock.") }, 128 N_("Number of times to retry acquiring the lock.") },
129 { "debug", mu_cfg_bool, &debug, 0, NULL, 129 { "debug", mu_c_bool, &debug, 0, NULL,
130 N_("Print details of failure reasons to stderr.") }, 130 N_("Print details of failure reasons to stderr.") },
131 { NULL } 131 { NULL }
132 }; 132 };
......
...@@ -321,7 +321,7 @@ cb_tls_required (void *data, mu_config_value_t *val) ...@@ -321,7 +321,7 @@ cb_tls_required (void *data, mu_config_value_t *val)
321 321
322 if (mu_cfg_assert_value_type (val, MU_CFG_STRING)) 322 if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
323 return 1; 323 return 1;
324 if (mu_cfg_parse_boolean (val->v.string, &bv)) 324 if (mu_str_to_c (val->v.string, mu_c_bool, &bv, NULL))
325 mu_error (_("Not a boolean value")); 325 mu_error (_("Not a boolean value"));
326 else if (bv) 326 else if (bv)
327 { 327 {
...@@ -384,28 +384,28 @@ static struct mu_cfg_param imap4d_srv_param[] = { ...@@ -384,28 +384,28 @@ static struct mu_cfg_param imap4d_srv_param[] = {
384 }; 384 };
385 385
386 static struct mu_cfg_param imap4d_cfg_param[] = { 386 static struct mu_cfg_param imap4d_cfg_param[] = {
387 { "allow-users", MU_CFG_LIST_OF(mu_cfg_string), &auth_allow_user_list, 387 { "allow-users", MU_CFG_LIST_OF(mu_c_string), &auth_allow_user_list,
388 0, NULL, 388 0, NULL,
389 N_("Allow access to users from this list.") }, 389 N_("Allow access to users from this list.") },
390 { "deny-users", MU_CFG_LIST_OF(mu_cfg_string), &auth_deny_user_list, 390 { "deny-users", MU_CFG_LIST_OF(mu_c_string), &auth_deny_user_list,
391 0, NULL, 391 0, NULL,
392 N_("Deny access to users from this list.") }, 392 N_("Deny access to users from this list.") },
393 { "allow-groups", MU_CFG_LIST_OF(mu_cfg_string), &auth_allow_group_list, 393 { "allow-groups", MU_CFG_LIST_OF(mu_c_string), &auth_allow_group_list,
394 0, NULL, 394 0, NULL,
395 N_("Allow access if the user group is in this list.") }, 395 N_("Allow access if the user group is in this list.") },
396 { "deny-groups", MU_CFG_LIST_OF(mu_cfg_string), &auth_deny_group_list, 396 { "deny-groups", MU_CFG_LIST_OF(mu_c_string), &auth_deny_group_list,
397 0, NULL, 397 0, NULL,
398 N_("Deny access if the user group is in this list.") }, 398 N_("Deny access if the user group is in this list.") },
399 399
400 { "homedir", mu_cfg_string, &modify_homedir, 0, NULL, 400 { "homedir", mu_c_string, &modify_homedir, 0, NULL,
401 N_("Modify home directory.") }, 401 N_("Modify home directory.") },
402 { "personal-namespace", MU_CFG_LIST_OF(mu_cfg_string), &namespace[NS_PRIVATE], 402 { "personal-namespace", MU_CFG_LIST_OF(mu_c_string), &namespace[NS_PRIVATE],
403 0, NULL, 403 0, NULL,
404 N_("Set personal namespace.") }, 404 N_("Set personal namespace.") },
405 { "other-namespace", MU_CFG_LIST_OF(mu_cfg_string), &namespace[NS_OTHER], 405 { "other-namespace", MU_CFG_LIST_OF(mu_c_string), &namespace[NS_OTHER],
406 0, NULL, 406 0, NULL,
407 N_("Set other users' namespace.") }, 407 N_("Set other users' namespace.") },
408 { "shared-namespace", MU_CFG_LIST_OF(mu_cfg_string), &namespace[NS_SHARED], 408 { "shared-namespace", MU_CFG_LIST_OF(mu_c_string), &namespace[NS_SHARED],
409 0, NULL, 409 0, NULL,
410 N_("Set shared namespace.") }, 410 N_("Set shared namespace.") },
411 { "other-mailbox-mode", mu_cfg_callback, &mailbox_mode[NS_OTHER], 0, 411 { "other-mailbox-mode", mu_cfg_callback, &mailbox_mode[NS_OTHER], 0,
...@@ -414,9 +414,9 @@ static struct mu_cfg_param imap4d_cfg_param[] = { ...@@ -414,9 +414,9 @@ static struct mu_cfg_param imap4d_cfg_param[] = {
414 { "shared-mailbox-mode", mu_cfg_callback, &mailbox_mode[NS_SHARED], 0, 414 { "shared-mailbox-mode", mu_cfg_callback, &mailbox_mode[NS_SHARED], 0,
415 cb_mailbox_mode, 415 cb_mailbox_mode,
416 N_("File mode for mailboxes in shared namespace.") }, 416 N_("File mode for mailboxes in shared namespace.") },
417 { "login-disabled", mu_cfg_bool, &login_disabled, 0, NULL, 417 { "login-disabled", mu_c_bool, &login_disabled, 0, NULL,
418 N_("Disable LOGIN command.") }, 418 N_("Disable LOGIN command.") },
419 { "create-home-dir", mu_cfg_bool, &create_home_dir, 0, NULL, 419 { "create-home-dir", mu_c_bool, &create_home_dir, 0, NULL,
420 N_("If true, create non-existing user home directories.") }, 420 N_("If true, create non-existing user home directories.") },
421 { "home-dir-mode", mu_cfg_callback, NULL, 0, cb_mode, 421 { "home-dir-mode", mu_cfg_callback, NULL, 0, cb_mode,
422 N_("File mode for creating user home directories (octal)."), 422 N_("File mode for creating user home directories (octal)."),
...@@ -437,19 +437,19 @@ static struct mu_cfg_param imap4d_cfg_param[] = { ...@@ -437,19 +437,19 @@ static struct mu_cfg_param imap4d_cfg_param[] = {
437 " ident[://:<port: string-or-number>]\n" 437 " ident[://:<port: string-or-number>]\n"
438 " stdio"), 438 " stdio"),
439 N_("mode") }, 439 N_("mode") },
440 { "preauth-only", mu_cfg_bool, &preauth_only, 0, NULL, 440 { "preauth-only", mu_c_bool, &preauth_only, 0, NULL,
441 N_("Use only preauth mode. If unable to setup it, disconnect " 441 N_("Use only preauth mode. If unable to setup it, disconnect "
442 "immediately.") }, 442 "immediately.") },
443 { "ident-keyfile", mu_cfg_string, &ident_keyfile, 0, NULL, 443 { "ident-keyfile", mu_c_string, &ident_keyfile, 0, NULL,
444 N_("Name of DES keyfile for decoding encrypted ident responses.") }, 444 N_("Name of DES keyfile for decoding encrypted ident responses.") },
445 { "ident-encrypt-only", mu_cfg_bool, &ident_encrypt_only, 0, NULL, 445 { "ident-encrypt-only", mu_c_bool, &ident_encrypt_only, 0, NULL,
446 N_("Use only encrypted ident responses.") }, 446 N_("Use only encrypted ident responses.") },
447 { "id-fields", MU_CFG_LIST_OF(mu_cfg_string), &imap4d_id_list, 0, NULL, 447 { "id-fields", MU_CFG_LIST_OF(mu_c_string), &imap4d_id_list, 0, NULL,
448 N_("List of fields to return in response to ID command.") }, 448 N_("List of fields to return in response to ID command.") },
449 { "mandatory-locking", mu_cfg_section }, 449 { "mandatory-locking", mu_cfg_section },
450 { ".server", mu_cfg_section, NULL, 0, NULL, 450 { ".server", mu_cfg_section, NULL, 0, NULL,
451 N_("Server configuration.") }, 451 N_("Server configuration.") },
452 { "transcript", mu_cfg_bool, &imap4d_transcript, 0, NULL, 452 { "transcript", mu_c_bool, &imap4d_transcript, 0, NULL,
453 N_("Set global transcript mode.") }, 453 N_("Set global transcript mode.") },
454 TCP_WRAPPERS_CONFIG 454 TCP_WRAPPERS_CONFIG
455 { NULL } 455 { NULL }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
22 #include <mailutils/list.h> 22 #include <mailutils/list.h>
23 #include <mailutils/debug.h> 23 #include <mailutils/debug.h>
24 #include <mailutils/opool.h> 24 #include <mailutils/opool.h>
25 #include <mailutils/util.h>
25 #include <sys/socket.h> 26 #include <sys/socket.h>
26 #include <netinet/in.h> 27 #include <netinet/in.h>
27 #include <arpa/inet.h> 28 #include <arpa/inet.h>
...@@ -113,27 +114,6 @@ void mu_cfg_destroy_tree (mu_cfg_tree_t **tree); ...@@ -113,27 +114,6 @@ void mu_cfg_destroy_tree (mu_cfg_tree_t **tree);
113 int mu_cfg_preorder (mu_list_t nodelist, struct mu_cfg_iter_closure *); 114 int mu_cfg_preorder (mu_list_t nodelist, struct mu_cfg_iter_closure *);
114 115
115 116
116 /* Table-driven parsing */
117 enum mu_cfg_param_data_type
118 {
119 mu_cfg_string,
120 mu_cfg_short,
121 mu_cfg_ushort,
122 mu_cfg_int,
123 mu_cfg_uint,
124 mu_cfg_long,
125 mu_cfg_ulong,
126 mu_cfg_size,
127 mu_cfg_off,
128 mu_cfg_time,
129 mu_cfg_bool,
130 mu_cfg_ipv4,
131 mu_cfg_cidr,
132 mu_cfg_host,
133 mu_cfg_callback,
134 mu_cfg_section
135 };
136
137 #define MU_CFG_LIST_MASK 0x8000 117 #define MU_CFG_LIST_MASK 0x8000
138 #define MU_CFG_LIST_OF(t) ((t) | MU_CFG_LIST_MASK) 118 #define MU_CFG_LIST_OF(t) ((t) | MU_CFG_LIST_MASK)
139 #define MU_CFG_TYPE(t) ((t) & ~MU_CFG_LIST_MASK) 119 #define MU_CFG_TYPE(t) ((t) & ~MU_CFG_LIST_MASK)
...@@ -141,10 +121,16 @@ enum mu_cfg_param_data_type ...@@ -141,10 +121,16 @@ enum mu_cfg_param_data_type
141 121
142 typedef int (*mu_cfg_callback_t) (void *, mu_config_value_t *); 122 typedef int (*mu_cfg_callback_t) (void *, mu_config_value_t *);
143 123
124 enum mu_cfg_param_type
125 {
126 mu_cfg_section = mu_c_void + 1,
127 mu_cfg_callback
128 };
129
144 struct mu_cfg_param 130 struct mu_cfg_param
145 { 131 {
146 const char *ident; 132 const char *ident;
147 enum mu_cfg_param_data_type type; 133 int type; /* One of enum mu_c_type or mu_cfg_param_type values */
148 void *data; 134 void *data;
149 size_t offset; 135 size_t offset;
150 mu_cfg_callback_t callback; 136 mu_cfg_callback_t callback;
...@@ -197,14 +183,6 @@ struct mu_cfg_cont ...@@ -197,14 +183,6 @@ struct mu_cfg_cont
197 } v; 183 } v;
198 }; 184 };
199 185
200 typedef struct mu_cfg_cidr mu_cfg_cidr_t;
201
202 struct mu_cfg_cidr
203 {
204 struct in_addr addr;
205 unsigned long mask;
206 };
207
208 #define MU_CFG_PATH_DELIM '.' 186 #define MU_CFG_PATH_DELIM '.'
209 #define MU_CFG_PATH_DELIM_STR "." 187 #define MU_CFG_PATH_DELIM_STR "."
210 188
...@@ -271,8 +249,6 @@ int mu_parse_config (const char *file, const char *progname, ...@@ -271,8 +249,6 @@ int mu_parse_config (const char *file, const char *progname,
271 struct mu_cfg_param *progparam, int flags, 249 struct mu_cfg_param *progparam, int flags,
272 void *target_ptr) MU_CFG_DEPRECATED; 250 void *target_ptr) MU_CFG_DEPRECATED;
273 251
274 int mu_cfg_parse_boolean (const char *str, int *res);
275
276 extern int mu_cfg_parser_verbose; 252 extern int mu_cfg_parser_verbose;
277 extern size_t mu_cfg_error_count; 253 extern size_t mu_cfg_error_count;
278 254
......
...@@ -173,10 +173,11 @@ enum mu_c_type ...@@ -173,10 +173,11 @@ enum mu_c_type
173 mu_c_host, 173 mu_c_host,
174 mu_c_incr, /* C int value, incremented each time mu_str_to_c is 174 mu_c_incr, /* C int value, incremented each time mu_str_to_c is
175 invoked */ 175 invoked */
176 mu_c_void /* No type. Keep it the last */
176 }; 177 };
177 178
178 typedef enum mu_c_type mu_c_type_t; 179 typedef enum mu_c_type mu_c_type_t;
179 180 extern char const *mu_c_type_str[];
180 int mu_str_to_c (char const *string, mu_c_type_t type, void *tgt, 181 int mu_str_to_c (char const *string, mu_c_type_t type, void *tgt,
181 char **errmsg); 182 char **errmsg);
182 183
......
...@@ -185,9 +185,9 @@ manlock_open_mailbox (mu_mailbox_t *pmbox, const char *mailbox_name, int def, ...@@ -185,9 +185,9 @@ manlock_open_mailbox (mu_mailbox_t *pmbox, const char *mailbox_name, int def,
185 185
186 186
187 struct mu_cfg_param manlock_param[] = { 187 struct mu_cfg_param manlock_param[] = {
188 { "enable", mu_cfg_bool, &manlock_mandatory_locking, 0, NULL, 188 { "enable", mu_c_bool, &manlock_mandatory_locking, 0, NULL,
189 N_("Enable mandatory locking.") }, 189 N_("Enable mandatory locking.") },
190 { "lock-directory", mu_cfg_string, &manlock_lock_dir, 0, NULL, 190 { "lock-directory", mu_c_string, &manlock_lock_dir, 0, NULL,
191 N_("Set directory for mandatory lock files.") }, 191 N_("Set directory for mandatory lock files.") },
192 { NULL } 192 { NULL }
193 }; 193 };
......
...@@ -53,17 +53,17 @@ mu_tcpwrapper_access (int fd) ...@@ -53,17 +53,17 @@ mu_tcpwrapper_access (int fd)
53 } 53 }
54 54
55 struct mu_cfg_param tcpwrapper_param[] = { 55 struct mu_cfg_param tcpwrapper_param[] = {
56 { "enable", mu_cfg_bool, &mu_tcp_wrapper_enable, 0, NULL, 56 { "enable", mu_c_bool, &mu_tcp_wrapper_enable, 0, NULL,
57 N_("Enable TCP wrapper access control. Default is \"yes\".") }, 57 N_("Enable TCP wrapper access control. Default is \"yes\".") },
58 { "daemon", mu_cfg_string, &mu_tcp_wrapper_daemon, 0, NULL, 58 { "daemon", mu_c_string, &mu_tcp_wrapper_daemon, 0, NULL,
59 N_("Set daemon name for TCP wrapper lookups. Default is program name."), 59 N_("Set daemon name for TCP wrapper lookups. Default is program name."),
60 N_("name") }, 60 N_("name") },
61 { "allow-table", mu_cfg_string, &hosts_allow_table, 61 { "allow-table", mu_c_string, &hosts_allow_table,
62 0, NULL, 62 0, NULL,
63 N_("Use file for positive client address access control " 63 N_("Use file for positive client address access control "
64 "(default: /etc/hosts.allow)."), 64 "(default: /etc/hosts.allow)."),
65 N_("file") }, 65 N_("file") },
66 { "deny-table", mu_cfg_string, &hosts_deny_table, 66 { "deny-table", mu_c_string, &hosts_deny_table,
67 0, NULL, 67 0, NULL,
68 N_("Use file for negative client address access control " 68 N_("Use file for negative client address access control "
69 "(default: /etc/hosts.deny)."), 69 "(default: /etc/hosts.deny)."),
......
...@@ -263,35 +263,38 @@ mu_cfg_format_node (mu_stream_t stream, const mu_cfg_node_t *node, int flags) ...@@ -263,35 +263,38 @@ mu_cfg_format_node (mu_stream_t stream, const mu_cfg_node_t *node, int flags)
263 263
264 264
265 const char * 265 const char *
266 mu_cfg_data_type_string (enum mu_cfg_param_data_type type) 266 mu_c_type_string (int type)
267 { 267 {
268 switch (type) 268 switch (type)
269 { 269 {
270 case mu_cfg_string: 270 case mu_c_string:
271 return N_("string"); 271 return N_("string");
272 case mu_cfg_short: 272 case mu_c_short:
273 case mu_cfg_ushort: 273 case mu_c_ushort:
274 case mu_cfg_int: 274 case mu_c_int:
275 case mu_cfg_uint: 275 case mu_c_uint:
276 case mu_cfg_long: 276 case mu_c_long:
277 case mu_cfg_ulong: 277 case mu_c_ulong:
278 case mu_cfg_size: 278 case mu_c_size:
279 case mu_cfg_off: 279 case mu_c_off:
280 case mu_c_incr:
280 return N_("number"); 281 return N_("number");
281 case mu_cfg_time: 282 case mu_c_time:
282 return N_("time"); 283 return N_("time");
283 case mu_cfg_bool: 284 case mu_c_bool:
284 return N_("boolean"); 285 return N_("boolean");
285 case mu_cfg_ipv4: 286 case mu_c_ipv4:
286 return N_("ipv4"); 287 return N_("ipv4");
287 case mu_cfg_cidr: 288 case mu_c_cidr:
288 return N_("cidr"); 289 return N_("cidr");
289 case mu_cfg_host: 290 case mu_c_host:
290 return N_("host"); 291 return N_("host");
291 case mu_cfg_callback:
292 return N_("string");
293 case mu_cfg_section: 292 case mu_cfg_section:
294 return N_("section"); 293 return N_("section");
294 case mu_cfg_callback:
295 return N_("callback");
296 default:
297 break;
295 } 298 }
296 return N_("unknown"); 299 return N_("unknown");
297 } 300 }
...@@ -361,13 +364,13 @@ format_param (mu_stream_t stream, struct mu_cfg_param *param, int level) ...@@ -361,13 +364,13 @@ format_param (mu_stream_t stream, struct mu_cfg_param *param, int level)
361 param->ident, 364 param->ident,
362 gettext (param->argname ? 365 gettext (param->argname ?
363 param->argname : N_("arg")), 366 param->argname : N_("arg")),
364 gettext (mu_cfg_data_type_string (MU_CFG_TYPE (param->type)))); 367 gettext (mu_c_type_string (MU_CFG_TYPE (param->type))));
365 else 368 else
366 mu_stream_printf (stream, "%s <%s: %s>;\n", 369 mu_stream_printf (stream, "%s <%s: %s>;\n",
367 param->ident, 370 param->ident,
368 gettext (param->argname ? 371 gettext (param->argname ?
369 param->argname : N_("arg")), 372 param->argname : N_("arg")),
370 gettext (mu_cfg_data_type_string (param->type))); 373 gettext (mu_c_type_string (param->type)));
371 } 374 }
372 375
373 static void format_container (mu_stream_t stream, struct mu_cfg_cont *cont, 376 static void format_container (mu_stream_t stream, struct mu_cfg_cont *cont,
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
40 #include <mailutils/cctype.h> 40 #include <mailutils/cctype.h>
41 #include <mailutils/stream.h> 41 #include <mailutils/stream.h>
42 #include <mailutils/stdstream.h> 42 #include <mailutils/stdstream.h>
43 #include <mailutils/cidr.h>
43 44
44 int mu_cfg_parser_verbose; 45 int mu_cfg_parser_verbose;
45 static mu_list_t /* of mu_cfg_node_t */ parse_node_list; 46 static mu_list_t /* of mu_cfg_node_t */ parse_node_list;
...@@ -781,385 +782,52 @@ pop_section (struct scan_tree_data *dat) ...@@ -781,385 +782,52 @@ pop_section (struct scan_tree_data *dat)
781 return sec; 782 return sec;
782 } 783 }
783 784
784 #define STRTONUM(s, type, base, res, limit, loc) \
785 { \
786 type sum = 0; \
787 \
788 for (; *s; s++) \
789 { \
790 type x; \
791 \
792 if ('0' <= *s && *s <= '9') \
793 x = sum * base + *s - '0'; \
794 else if (base == 16 && 'a' <= *s && *s <= 'f') \
795 x = sum * base + *s - 'a'; \
796 else if (base == 16 && 'A' <= *s && *s <= 'F') \
797 x = sum * base + *s - 'A'; \
798 else \
799 break; \
800 if (x <= sum) \
801 { \
802 mu_diag_at_locus (MU_LOG_ERROR, loc, \
803 _("numeric overflow")); \
804 mu_cfg_error_count++; \
805 return 1; \
806 } \
807 else if (limit && x > limit) \
808 { \
809 mu_diag_at_locus (MU_LOG_ERROR, loc, \
810 _("value out of allowed range")); \
811 mu_cfg_error_count++; \
812 return 1; \
813 } \
814 sum = x; \
815 } \
816 res = sum; \
817 }
818
819 #define STRxTONUM(s, type, res, limit, loc) \
820 { \
821 int base; \
822 if (*s == '0') \
823 { \
824 s++; \
825 if (*s == 0) \
826 base = 10; \
827 else if (*s == 'x' || *s == 'X') \
828 { \
829 s++; \
830 base = 16; \
831 } \
832 else \
833 base = 8; \
834 } else \
835 base = 10; \
836 STRTONUM (s, type, base, res, limit, loc); \
837 }
838
839 #define GETUNUM(str, type, res, loc) \
840 { \
841 type tmpres; \
842 const char *s = str; \
843 STRxTONUM (s, type, tmpres, 0, loc); \
844 if (*s) \
845 { \
846 mu_diag_at_locus (MU_LOG_ERROR, loc, \
847 _("not a number (stopped near `%s')"), \
848 s); \
849 mu_cfg_error_count++; \
850 return 1; \
851 } \
852 res = tmpres; \
853 }
854
855 #define GETSNUM(str, type, res, loc) \
856 { \
857 unsigned type tmpres; \
858 const char *s = str; \
859 int sign; \
860 unsigned type limit; \
861 \
862 if (*s == '-') \
863 { \
864 sign = 1; \
865 s++; \
866 limit = TYPE_MINIMUM (type); \
867 limit = - limit; \
868 } \
869 else \
870 { \
871 sign = 0; \
872 limit = TYPE_MAXIMUM (type); \
873 } \
874 \
875 STRxTONUM (s, unsigned type, tmpres, limit, loc); \
876 if (*s) \
877 { \
878 mu_diag_at_locus (MU_LOG_ERROR, loc, \
879 _("not a number (stopped near `%s')"), \
880 s); \
881 mu_cfg_error_count++; \
882 return 1; \
883 } \
884 res = sign ? - tmpres : tmpres; \
885 }
886
887 static int
888 parse_ipv4 (struct scan_tree_data *sdata, const struct mu_locus *locus,
889 const char *str, struct in_addr *res)
890 {
891 struct in_addr addr;
892 if (inet_aton (str, &addr) == 0)
893 {
894 mu_diag_at_locus (MU_LOG_ERROR, &mu_cfg_locus, _("not an IPv4"));
895 mu_cfg_error_count++;
896 return 1;
897 }
898 addr.s_addr = ntohl (addr.s_addr);
899 *res = addr;
900 return 0;
901 }
902
903 static int
904 parse_host (struct scan_tree_data *sdata, const struct mu_locus *locus,
905 const char *str, struct in_addr *res)
906 {
907 struct in_addr addr;
908 struct hostent *hp = gethostbyname (str);
909 if (hp)
910 {
911 addr.s_addr = *(unsigned long *)hp->h_addr;
912 }
913 else if (inet_aton (str, &addr) == 0)
914 {
915 mu_diag_at_locus (MU_LOG_ERROR, &mu_cfg_locus,
916 _("cannot resolve hostname `%s'"),
917 str);
918 mu_cfg_error_count++;
919 return 1;
920 }
921 addr.s_addr = ntohl (addr.s_addr);
922 *res = addr;
923 return 0;
924 }
925
926 static int 785 static int
927 parse_cidr (struct scan_tree_data *sdata, const struct mu_locus *locus, 786 valcvt (const struct mu_locus *locus,
928 const char *str, mu_cfg_cidr_t *res) 787 void *tgt, mu_c_type_t type, mu_config_value_t *val)
929 { 788 {
930 struct in_addr addr; 789 int rc;
931 unsigned long mask; 790 char *errmsg;
932 char astr[16];
933 const char *p, *s;
934
935 p = strchr (str, '/');
936 if (p)
937 {
938 int len = p - str;
939 if (len > sizeof astr - 1)
940 {
941 mu_diag_at_locus (MU_LOG_ERROR, &mu_cfg_locus,
942 _("not a valid IPv4 address in CIDR"));
943 mu_cfg_error_count++;
944 return 1;
945 }
946 memcpy (astr, str, len);
947 astr[len] = 0;
948 if (inet_aton (astr, &addr) == 0)
949 {
950 mu_diag_at_locus (MU_LOG_ERROR, &mu_cfg_locus,
951 _("not a valid IPv4 address in CIDR"));
952 mu_cfg_error_count++;
953 return 1;
954 }
955 addr.s_addr = ntohl (addr.s_addr);
956
957 p++;
958 s = p;
959 STRxTONUM (s, unsigned long, mask, 0, locus);
960 if (*s == '.')
961 {
962 struct in_addr a;
963 if (inet_aton (p, &a) == 0)
964 {
965 mu_diag_at_locus (MU_LOG_ERROR, &mu_cfg_locus,
966 _("not a valid network in CIDR"));
967 mu_cfg_error_count++;
968 return 1;
969 }
970 a.s_addr = ntohl (a.s_addr);
971 for (mask = 0; (a.s_addr & 1) == 0 && mask < 32; )
972 {
973 mask++;
974 a.s_addr >>= 1;
975 }
976 mask = 32 - mask;
977 }
978 else if (mask > 32)
979 {
980 mu_diag_at_locus (MU_LOG_ERROR, &mu_cfg_locus,
981 _("not a valid network mask in CIDR"));
982 mu_cfg_error_count++;
983 return 1;
984 }
985 }
986 else
987 {
988 int i;
989 unsigned short x;
990 addr.s_addr = 0;
991
992 p = str;
993 for (i = 0; i < 3; i++)
994 {
995 STRxTONUM (p, unsigned short, x, 255, locus);
996 if (*p != '.')
997 break;
998 addr.s_addr = (addr.s_addr << 8) + x;
999 }
1000
1001 if (*p)
1002 {
1003 mu_diag_at_locus (MU_LOG_ERROR, &mu_cfg_locus,
1004 _("not a CIDR (stopped near `%s')"),
1005 p);
1006 mu_cfg_error_count++;
1007 return 1;
1008 }
1009
1010 mask = i * 8;
1011
1012 addr.s_addr <<= (4 - i) * 8;
1013 }
1014 791
1015 res->addr = addr;
1016 res->mask = mask;
1017 return 0;
1018 }
1019
1020 int
1021 mu_cfg_parse_boolean (const char *str, int *res)
1022 {
1023 if (strcmp (str, "yes") == 0
1024 || strcmp (str, "on") == 0
1025 || strcmp (str, "t") == 0
1026 || strcmp (str, "true") == 0
1027 || strcmp (str, "1") == 0)
1028 *res = 1;
1029 else if (strcmp (str, "no") == 0
1030 || strcmp (str, "off") == 0
1031 || strcmp (str, "nil") == 0
1032 || strcmp (str, "false") == 0
1033 || strcmp (str, "0") == 0)
1034 *res = 0;
1035 else
1036 return 1;
1037 return 0;
1038 }
1039
1040 static int
1041 parse_bool (struct scan_tree_data *sdata, const struct mu_locus *locus,
1042 const char *str, int *res)
1043 {
1044 if (mu_cfg_parse_boolean (str, res))
1045 {
1046 mu_diag_at_locus (MU_LOG_ERROR, locus, _("not a boolean"));
1047 mu_cfg_error_count++;
1048 return 1;
1049 }
1050 return 0;
1051 }
1052
1053 static int
1054 valcvt (struct scan_tree_data *sdata, const struct mu_locus *locus,
1055 void *tgt,
1056 enum mu_cfg_param_data_type type, mu_config_value_t *val)
1057 {
1058 if (val->type != MU_CFG_STRING) 792 if (val->type != MU_CFG_STRING)
1059 { 793 {
1060 mu_diag_at_locus (MU_LOG_ERROR, locus, _("expected string value")); 794 mu_diag_at_locus (MU_LOG_ERROR, locus, _("expected string value"));
1061 mu_cfg_error_count++; 795 mu_cfg_error_count++;
1062 return 1; 796 return 1;
1063 } 797 }
1064 switch (type) 798
799 rc = mu_str_to_c (val->v.string, type, tgt, &errmsg);
800 if (rc)
1065 { 801 {
1066 case mu_cfg_string: 802 mu_diag_at_locus (MU_LOG_ERROR, locus, "%s",
1067 { 803 errmsg ? errmsg : mu_strerror (rc));
1068 char *s = mu_strdup (val->v.string); 804 free (errmsg);
1069 /* FIXME: free tgt? */
1070 *(char**)tgt = s;
1071 break;
1072 }
1073
1074 case mu_cfg_short:
1075 GETUNUM (val->v.string, short, *(short*)tgt, locus);
1076 break;
1077
1078 case mu_cfg_ushort:
1079 GETUNUM (val->v.string, unsigned short, *(unsigned short*)tgt, locus);
1080 break;
1081
1082 case mu_cfg_int:
1083 GETSNUM (val->v.string, int, *(int*)tgt, locus);
1084 break;
1085
1086 case mu_cfg_uint:
1087 GETUNUM (val->v.string, unsigned int, *(unsigned int*)tgt, locus);
1088 break;
1089
1090 case mu_cfg_long:
1091 GETSNUM (val->v.string, long, *(long*)tgt, locus);
1092 break;
1093
1094 case mu_cfg_ulong:
1095 GETUNUM (val->v.string, unsigned long, *(unsigned long*)tgt, locus);
1096 break;
1097
1098 case mu_cfg_size:
1099 GETUNUM (val->v.string, size_t, *(size_t*)tgt, locus);
1100 break;
1101
1102 case mu_cfg_off:
1103 mu_diag_at_locus (MU_LOG_ERROR, locus, _("not implemented yet"));
1104 mu_cfg_error_count++;
1105 /* GETSNUM(node->tag_label, off_t, *(off_t*)tgt); */
1106 return 1;
1107
1108 case mu_cfg_time:
1109 GETUNUM (val->v.string, time_t, *(time_t*)tgt, locus);
1110 break;
1111
1112 case mu_cfg_bool:
1113 if (parse_bool (sdata, locus, val->v.string, (int*) tgt))
1114 return 1;
1115 break;
1116
1117 case mu_cfg_ipv4:
1118 if (parse_ipv4 (sdata, locus, val->v.string, (struct in_addr *)tgt))
1119 return 1;
1120 break;
1121
1122 case mu_cfg_cidr:
1123 if (parse_cidr (sdata, locus, val->v.string, (mu_cfg_cidr_t *)tgt))
1124 return 1;
1125 break;
1126
1127 case mu_cfg_host:
1128 if (parse_host (sdata, locus, val->v.string, (struct in_addr *)tgt))
1129 return 1;
1130 break;
1131
1132 default:
1133 return 1;
1134 } 805 }
1135 return 0; 806 return rc;
1136 } 807 }
1137 808
1138 struct set_closure 809 struct set_closure
1139 { 810 {
1140 mu_list_t list; 811 mu_list_t list;
1141 enum mu_cfg_param_data_type type; 812 int type;
1142 struct scan_tree_data *sdata; 813 struct scan_tree_data *sdata;
1143 const struct mu_locus *locus; 814 const struct mu_locus *locus;
1144 }; 815 };
1145 816
1146 static size_t config_type_size[] = { 817 static size_t config_type_size[] = {
1147 sizeof (char*), /* mu_cfg_string */ 818 [mu_c_string] = sizeof (char*),
1148 sizeof (short), /* mu_cfg_short */ 819 [mu_c_short] = sizeof (short),
1149 sizeof (unsigned short), /* mu_cfg_ushort */ 820 [mu_c_ushort] = sizeof (unsigned short),
1150 sizeof (int), /* mu_cfg_int */ 821 [mu_c_int] = sizeof (int),
1151 sizeof (unsigned), /* mu_cfg_uint */ 822 [mu_c_uint] = sizeof (unsigned),
1152 sizeof (long), /* mu_cfg_long */ 823 [mu_c_long] = sizeof (long),
1153 sizeof (unsigned long), /* mu_cfg_ulong */ 824 [mu_c_ulong] = sizeof (unsigned long),
1154 sizeof (size_t), /* mu_cfg_size */ 825 [mu_c_size] = sizeof (size_t),
1155 sizeof (mu_off_t), /* mu_cfg_off */ 826 [mu_c_time] = sizeof (time_t),
1156 sizeof (time_t), /* mu_cfg_time */ 827 [mu_c_bool] = sizeof (int),
1157 sizeof (int), /* mu_cfg_bool */ 828 [mu_c_ipv4] = sizeof (struct in_addr),
1158 sizeof (struct in_addr), /* mu_cfg_ipv4 */ 829 [mu_c_cidr] = sizeof (struct mu_cidr),
1159 sizeof (mu_cfg_cidr_t), /* mu_cfg_cidr */ 830 [mu_c_host] = sizeof (struct in_addr),
1160 sizeof (struct in_addr), /* mu_cfg_host */
1161 0, /* mu_cfg_callback */
1162 0, /* mu_cfg_section */
1163 }; 831 };
1164 832
1165 static int 833 static int
...@@ -1188,7 +856,7 @@ _set_fun (void *item, void *data) ...@@ -1188,7 +856,7 @@ _set_fun (void *item, void *data)
1188 return 1; 856 return 1;
1189 } 857 }
1190 858
1191 if (valcvt (clos->sdata, clos->locus, &tgt, clos->type, val) == 0) 859 if (valcvt (clos->locus, &tgt, clos->type, val) == 0)
1192 mu_list_append (clos->list, tgt); 860 mu_list_append (clos->list, tgt);
1193 return 0; 861 return 0;
1194 } 862 }
...@@ -1274,7 +942,7 @@ parse_param (struct scan_tree_data *sdata, const mu_cfg_node_t *node) ...@@ -1274,7 +942,7 @@ parse_param (struct scan_tree_data *sdata, const mu_cfg_node_t *node)
1274 return 1; 942 return 1;
1275 } 943 }
1276 else 944 else
1277 return valcvt (sdata, &node->locus, tgt, clos.type, node->label); 945 return valcvt (&node->locus, tgt, clos.type, node->label);
1278 946
1279 return 0; 947 return 0;
1280 } 948 }
......
...@@ -890,24 +890,24 @@ _cb_port (void *data, mu_config_value_t *val) ...@@ -890,24 +890,24 @@ _cb_port (void *data, mu_config_value_t *val)
890 } 890 }
891 891
892 static struct mu_cfg_param dot_server_cfg_param[] = { 892 static struct mu_cfg_param dot_server_cfg_param[] = {
893 { "max-children", mu_cfg_size, 893 { "max-children", mu_c_size,
894 NULL, mu_offsetof (struct _mu_m_server,max_children), NULL, 894 NULL, mu_offsetof (struct _mu_m_server,max_children), NULL,
895 N_("Maximum number of children processes to run simultaneously.") }, 895 N_("Maximum number of children processes to run simultaneously.") },
896 { "mode", mu_cfg_callback, 896 { "mode", mu_cfg_callback,
897 NULL, mu_offsetof (struct _mu_m_server,mode), _cb_daemon_mode, 897 NULL, mu_offsetof (struct _mu_m_server,mode), _cb_daemon_mode,
898 N_("Set daemon mode (either inetd (or interactive) or daemon)."), 898 N_("Set daemon mode (either inetd (or interactive) or daemon)."),
899 N_("mode") }, 899 N_("mode") },
900 { "foreground", mu_cfg_bool, 900 { "foreground", mu_c_bool,
901 NULL, mu_offsetof (struct _mu_m_server, foreground), NULL, 901 NULL, mu_offsetof (struct _mu_m_server, foreground), NULL,
902 N_("Run in foreground.") }, 902 N_("Run in foreground.") },
903 { "pidfile", mu_cfg_string, 903 { "pidfile", mu_c_string,
904 NULL, mu_offsetof (struct _mu_m_server,pidfile), NULL, 904 NULL, mu_offsetof (struct _mu_m_server,pidfile), NULL,
905 N_("Store PID of the master process in this file."), 905 N_("Store PID of the master process in this file."),
906 N_("file") }, 906 N_("file") },
907 { "port", mu_cfg_callback, 907 { "port", mu_cfg_callback,
908 NULL, mu_offsetof (struct _mu_m_server, hints), _cb_port, 908 NULL, mu_offsetof (struct _mu_m_server, hints), _cb_port,
909 N_("Default port number.") }, 909 N_("Default port number.") },
910 { "timeout", mu_cfg_time, 910 { "timeout", mu_c_time,
911 NULL, mu_offsetof (struct _mu_m_server,timeout), NULL, 911 NULL, mu_offsetof (struct _mu_m_server,timeout), NULL,
912 N_("Set idle timeout.") }, 912 N_("Set idle timeout.") },
913 { "server", mu_cfg_section, NULL, 0, NULL, 913 { "server", mu_cfg_section, NULL, 0, NULL,
...@@ -918,13 +918,13 @@ static struct mu_cfg_param dot_server_cfg_param[] = { ...@@ -918,13 +918,13 @@ static struct mu_cfg_param dot_server_cfg_param[] = {
918 }; 918 };
919 919
920 static struct mu_cfg_param server_cfg_param[] = { 920 static struct mu_cfg_param server_cfg_param[] = {
921 { "single-process", mu_cfg_bool, 921 { "single-process", mu_c_bool,
922 NULL, mu_offsetof (struct mu_srv_config, single_process), NULL, 922 NULL, mu_offsetof (struct mu_srv_config, single_process), NULL,
923 N_("Do not spawn sub-process to handle requests in this server.") }, 923 N_("Do not spawn sub-process to handle requests in this server.") },
924 { "transcript", mu_cfg_bool, 924 { "transcript", mu_c_bool,
925 NULL, mu_offsetof (struct mu_srv_config, transcript), NULL, 925 NULL, mu_offsetof (struct mu_srv_config, transcript), NULL,
926 N_("Log the session transcript.") }, 926 N_("Log the session transcript.") },
927 { "timeout", mu_cfg_time, 927 { "timeout", mu_c_time,
928 NULL, mu_offsetof (struct mu_srv_config, timeout), NULL, 928 NULL, mu_offsetof (struct mu_srv_config, timeout), NULL,
929 N_("Set idle timeout.") }, 929 N_("Set idle timeout.") },
930 { "acl", mu_cfg_section, 930 { "acl", mu_cfg_section,
......
...@@ -179,7 +179,8 @@ to_time_t (void *tgt, char const *string, char **errmsg) ...@@ -179,7 +179,8 @@ to_time_t (void *tgt, char const *string, char **errmsg)
179 179
180 if (rc) 180 if (rc)
181 { 181 {
182 mu_asprintf (errmsg, _("invalid time specification near %s"), string); 182 if (errmsg)
183 mu_asprintf (errmsg, _("invalid time specification near %s"), string);
183 return EINVAL; 184 return EINVAL;
184 } 185 }
185 186
...@@ -262,10 +263,30 @@ static str_to_c_t str_to_c[] = { ...@@ -262,10 +263,30 @@ static str_to_c_t str_to_c[] = {
262 [mu_c_incr] = to_incr 263 [mu_c_incr] = to_incr
263 }; 264 };
264 265
266 char const *mu_c_type_str[] = {
267 [mu_c_string] = "mu_c_string",
268 [mu_c_short] = "mu_c_short",
269 [mu_c_ushort] = "mu_c_ushort",
270 [mu_c_int] = "mu_c_int",
271 [mu_c_uint] = "mu_c_uint",
272 [mu_c_long] = "mu_c_long",
273 [mu_c_ulong] = "mu_c_ulong",
274 [mu_c_size] = "mu_c_size",
275 [mu_c_off] = "mu_c_off",
276 [mu_c_time] = "mu_c_time",
277 [mu_c_bool] = "mu_c_bool",
278 [mu_c_ipv4] = "mu_c_ipv4",
279 [mu_c_cidr] = "mu_c_cidr",
280 [mu_c_host] = "mu_c_host",
281 [mu_c_incr] = "mu_c_incr",
282 [mu_c_void] = "mu_c_void"
283 };
284
265 int 285 int
266 mu_str_to_c (char const *string, enum mu_c_type type, void *tgt, char **errmsg) 286 mu_str_to_c (char const *string, enum mu_c_type type, void *tgt, char **errmsg)
267 { 287 {
268 *errmsg = NULL; 288 if (errmsg)
289 *errmsg = NULL;
269 if ((size_t)type >= sizeof (str_to_c) / sizeof (str_to_c[0])) 290 if ((size_t)type >= sizeof (str_to_c) / sizeof (str_to_c[0]))
270 return EINVAL; 291 return EINVAL;
271 if (!str_to_c[type]) 292 if (!str_to_c[type])
......
...@@ -26,6 +26,7 @@ scantime ...@@ -26,6 +26,7 @@ scantime
26 strftime 26 strftime
27 strin 27 strin
28 strout 28 strout
29 strtoc
29 tempfile 30 tempfile
30 url-comp 31 url-comp
31 url-parse 32 url-parse
......
...@@ -62,6 +62,7 @@ noinst_PROGRAMS = \ ...@@ -62,6 +62,7 @@ noinst_PROGRAMS = \
62 strftime\ 62 strftime\
63 strin\ 63 strin\
64 strout\ 64 strout\
65 strtoc\
65 tempfile\ 66 tempfile\
66 url-comp\ 67 url-comp\
67 url-parse\ 68 url-parse\
...@@ -109,6 +110,7 @@ TESTSUITE_AT = \ ...@@ -109,6 +110,7 @@ TESTSUITE_AT = \
109 strerr.at\ 110 strerr.at\
110 strin.at\ 111 strin.at\
111 strout.at\ 112 strout.at\
113 strtoc.at\
112 testsuite.at\ 114 testsuite.at\
113 url.at\ 115 url.at\
114 url-comp.at\ 116 url-comp.at\
......
1 # This file is part of GNU Mailutils. -*- Autotest -*-
2 # Copyright (C) 2016 Free Software Foundation, Inc.
3 #
4 # GNU Mailutils is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License as
6 # published by the Free Software Foundation; either version 3, or (at
7 # your option) any later version.
8 #
9 # GNU Mailutils is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>.
16
17 AT_SETUP([mu_str_to_c])
18
19 AT_CHECK([strtoc])
20
21 AT_CLEANUP
1 /* GNU Mailutils -- a suite of utilities for electronic mail
2 Copyright (C) 2016 Free Software Foundation, Inc.
3
4 GNU Mailutils is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
7 any later version.
8
9 GNU Mailutils is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <mailutils/mailutils.h>
18
19 union value
20 {
21 char *v_string;
22 signed short v_short;
23 unsigned short v_ushort;
24 int v_int;
25 unsigned v_uint;
26 long v_long;
27 unsigned long v_ulong;
28 size_t v_size;
29 time_t v_time;
30 struct mu_cidr v_cidr;
31 };
32
33 struct value_handler
34 {
35 void (*format) (union value *, FILE *);
36 int (*compare) (union value *, union value *);
37 };
38
39 static void
40 v_string_format (union value *val, FILE *fp)
41 {
42 char *p;
43
44 fputc ('"', fp);
45 for (p = val->v_string; *p; p++)
46 {
47 if (*p == '\\' || *p == '"')
48 fputc ('\\', fp);
49 fputc (*p, fp);
50 }
51 fputc ('"', fp);
52 }
53
54 static int
55 v_string_compare (union value *a, union value *b)
56 {
57 return strcmp (a->v_string, b->v_string);
58 }
59
60 static void
61 v_short_format (union value *val, FILE *fp)
62 {
63 fprintf (fp, "%hd", val->v_short);
64 }
65
66 static int
67 v_short_compare (union value *a, union value *b)
68 {
69 return a->v_short != b->v_short;
70 }
71
72 static void
73 v_ushort_format (union value *val, FILE *fp)
74 {
75 fprintf (fp, "%hu", val->v_short);
76 }
77
78 static int
79 v_ushort_compare (union value *a, union value *b)
80 {
81 return a->v_ushort != b->v_ushort;
82 }
83
84 static void
85 v_int_format (union value *val, FILE *fp)
86 {
87 fprintf (fp, "%d", val->v_int);
88 }
89
90 static int
91 v_int_compare (union value *a, union value *b)
92 {
93 return a->v_int != b->v_int;
94 }
95
96 static void
97 v_uint_format (union value *val, FILE *fp)
98 {
99 fprintf (fp, "%u", val->v_uint);
100 }
101
102 static int
103 v_uint_compare (union value *a, union value *b)
104 {
105 return a->v_uint != b->v_uint;
106 }
107
108 static void
109 v_long_format (union value *val, FILE *fp)
110 {
111 fprintf (fp, "%ld", val->v_long);
112 }
113
114 static int
115 v_long_compare (union value *a, union value *b)
116 {
117 return a->v_long != b->v_long;
118 }
119
120 static void
121 v_ulong_format (union value *val, FILE *fp)
122 {
123 fprintf (fp, "%lu", val->v_long);
124 }
125
126 static int
127 v_ulong_compare (union value *a, union value *b)
128 {
129 return a->v_ulong != b->v_ulong;
130 }
131
132 static void
133 v_size_format (union value *val, FILE *fp)
134 {
135 size_t v = val->v_size;
136 char buf[80];
137 size_t buflen = 80;
138 char *p = buf + buflen;
139 *--p = 0;
140 do
141 {
142 int n = v % 10;
143 *--p = n + '0';
144 v /= 10;
145 }
146 while (v && p > buf);
147
148 if (v)
149 fputs ("[overflow]", fp);
150 else
151 fputs (p, fp);
152 }
153
154 static int
155 v_size_compare (union value *a, union value *b)
156 {
157 return a->v_size != b->v_size;
158 }
159
160 static void
161 v_cidr_format (union value *val, FILE *fp)
162 {
163 char *buf;
164
165 mu_cidr_format (&val->v_cidr, 0, &buf);
166 fprintf (fp, "%s", buf);
167 free (buf);
168 }
169
170 static int
171 v_cidr_compare (union value *a, union value *b)
172 {
173 if (a->v_cidr.family != b->v_cidr.family)
174 return 1;
175 if (a->v_cidr.len != b->v_cidr.len)
176 return 1;
177 if (memcmp (a->v_cidr.address, b->v_cidr.address, a->v_cidr.len))
178 return 1;
179 if (memcmp (a->v_cidr.netmask, b->v_cidr.netmask, a->v_cidr.len))
180 return 1;
181 return 0;
182 }
183
184 struct value_handler value_handler[] = {
185 [mu_c_string] = { v_string_format, v_string_compare },
186 [mu_c_short] = { v_short_format, v_short_compare },
187 [mu_c_ushort] = { v_ushort_format, v_ushort_compare },
188 [mu_c_int] = { v_int_format, v_int_compare },
189 [mu_c_uint] = { v_uint_format, v_uint_compare },
190 [mu_c_long] = { v_long_format, v_long_compare },
191 [mu_c_ulong] = { v_ulong_format, v_ulong_compare },
192 [mu_c_size] = { v_size_format, v_size_compare },
193 #if 0
194 mu_c_time,
195 #endif
196 [mu_c_bool] = { v_int_format, v_int_compare },
197 [mu_c_cidr] = { v_cidr_format, v_cidr_compare },
198 [mu_c_incr] = { v_int_format, v_int_compare },
199 };
200
201 int
202 valcmp (mu_c_type_t type, union value *a, union value *b)
203 {
204 if ((size_t)type < sizeof (value_handler) / sizeof (value_handler[0])
205 && value_handler[type].compare)
206 return value_handler[type].compare (a, b);
207 else
208 {
209 fprintf (stderr, "unsupported value type: %d\n", type);
210 abort ();
211 }
212 }
213
214 void
215 valprint (FILE *fp, mu_c_type_t type, union value *val)
216 {
217 if ((size_t)type < sizeof (value_handler) / sizeof (value_handler[0])
218 && value_handler[type].format)
219 value_handler[type].format (val, fp);
220 else
221 {
222 fprintf (stderr, "unsupported value type: %d\n", type);
223 abort ();
224 }
225 }
226
227 struct testdata
228 {
229 mu_c_type_t type;
230 char const *input;
231 int err;
232 union value val;
233 };
234
235 struct testdata tests[] = {
236 { mu_c_string, "now is the time", 0, { .v_string = "now is the time" } },
237 { mu_c_short, "115", 0, { .v_short = 115 } },
238 { mu_c_short, "-400", 0, { .v_short = -400 } },
239 { mu_c_short, "1a", EINVAL, },
240
241 { mu_c_ushort, "110", 0, { .v_ushort = 110 } },
242 { mu_c_ushort, "-110", ERANGE },
243
244 { mu_c_int, "10568", 0, { .v_int = 10568 } },
245 { mu_c_int, "-10568", 0, { .v_int = -10568 } },
246
247 { mu_c_uint, "10568", 0, { .v_uint = 10568 } },
248
249 { mu_c_long, "10568", 0, { .v_long = 10568 } },
250 { mu_c_long, "-10568", 0, { .v_long = -10568 } },
251
252 { mu_c_ulong, "10568", 0, { .v_ulong = 10568 } },
253
254 { mu_c_bool, "true", 0, { .v_int = 1 } },
255 { mu_c_bool, "false", 0, { .v_int = 0 } },
256
257 { mu_c_cidr, "127.0.0.0/8", 0, { .v_cidr = {
258 .family = 2,
259 .len = 4,
260 .address = { 127, 0, 0, 0 },
261 .netmask = { 255 } } } },
262 { mu_c_cidr, "fe80::4a5b:39ff:fe09:97f0/64", 0, { .v_cidr = {
263 .family = 10,
264 .len = 16,
265 .address = { 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
266 0x4a, 0x5b, 0x39, 0xff, 0xfe, 0x9, 0x97, 0xf0 },
267 .netmask = { 255, 255, 255, 255, 255, 255, 255, 255,
268 0, 0, 0, 0, 0, 0, 0, 0 } } } },
269
270 { mu_c_incr, NULL, 0, { .v_int = 1 } },
271 { mu_c_void }
272 };
273
274 void
275 print_test_id (int i, FILE *fp)
276 {
277 fprintf (fp, "%d: %s:%s: ", i, mu_c_type_str[tests[i].type],
278 tests[i].input ? tests[i].input : "NULL");
279 }
280
281 void
282 usage (int code, FILE *fp, char const *argv0)
283 {
284 fprintf (fp, "usage: %s [-v]", argv0);
285 exit (code);
286 }
287
288 int
289 main (int argc, char **argv)
290 {
291 union value val;
292 char *errmsg;
293 int i;
294 unsigned failures = 0;
295 int verbose = 0;
296
297 for (i = 1; i < argc; i++) {
298 if (strcmp (argv[i], "-v") == 0)
299 verbose = 1;
300 else if (strcmp (argv[i], "-h") == 0)
301 usage (0, stdout, argv[0]);
302 else
303 usage (1, stderr, argv[0]);
304 }
305
306 if (i != argc)
307 usage (1, stderr, argv[0]);
308
309 for (i = 0; tests[i].type != mu_c_void; i++)
310 {
311 int rc;
312
313 memset (&val, 0, sizeof (val));
314 rc = mu_str_to_c (tests[i].input, tests[i].type, &val, &errmsg);
315 if (rc)
316 {
317 if (tests[i].err == rc)
318 {
319 if (verbose)
320 {
321 print_test_id (i, stdout);
322 fprintf (stdout, "XFAIL\n");
323 }
324 }
325 else
326 {
327 print_test_id (i, stderr);
328 fprintf (stderr, "FAIL: error %s", mu_strerror (rc));
329 if (errmsg)
330 fprintf (stderr, ": %s", errmsg);
331 fputc ('\n', stderr);
332 free (errmsg);
333 ++failures;
334 }
335 }
336 else if (valcmp (tests[i].type, &tests[i].val, &val))
337 {
338 fprintf (stderr, "%d: FAIL: %s value differ: ",
339 i, mu_c_type_str[tests[i].type]);
340 fprintf (stderr, "expected: ");
341 valprint (stderr, tests[i].type, &tests[i].val);
342 fprintf (stderr, ", but got: ");
343 valprint (stderr, tests[i].type, &val);
344 fputc ('\n', stderr);
345 ++failures;
346 }
347 else if (verbose)
348 {
349 print_test_id (i, stdout);
350 fprintf (stdout, "OK\n");
351 }
352 }
353 exit (!!failures);
354 }
...@@ -53,6 +53,9 @@ AT_CLEANUP ...@@ -53,6 +53,9 @@ AT_CLEANUP
53 53
54 AT_INIT 54 AT_INIT
55 55
56 AT_BANNER([Conversions])
57 m4_include([strtoc.at])
58
56 AT_BANNER([Standard streams]) 59 AT_BANNER([Standard streams])
57 m4_include([strin.at]) 60 m4_include([strin.at])
58 m4_include([strout.at]) 61 m4_include([strout.at])
......
...@@ -138,7 +138,7 @@ mu_app_init (struct argp *myargp, const char **capa, ...@@ -138,7 +138,7 @@ mu_app_init (struct argp *myargp, const char **capa,
138 mu_stream_t stream; 138 mu_stream_t stream;
139 struct mu_cfg_cont *cont; 139 struct mu_cfg_cont *cont;
140 static struct mu_cfg_param dummy_include_param[] = { 140 static struct mu_cfg_param dummy_include_param[] = {
141 { "include", mu_cfg_string, NULL, 0, NULL, 141 { "include", mu_c_string, NULL, 0, NULL,
142 N_("Include contents of the given file. If a directory is given, " 142 N_("Include contents of the given file. If a directory is given, "
143 "include contents of the file <file>/<program>, where " 143 "include contents of the file <file>/<program>, where "
144 "<program> is the name of the program. This latter form is " 144 "<program> is the name of the program. This latter form is "
......
...@@ -49,14 +49,14 @@ _cb_folder (void *data, mu_config_value_t *val) ...@@ -49,14 +49,14 @@ _cb_folder (void *data, mu_config_value_t *val)
49 } 49 }
50 50
51 static struct mu_cfg_param mu_mailbox_param[] = { 51 static struct mu_cfg_param mu_mailbox_param[] = {
52 { "mail-spool", mu_cfg_string, &mailbox_settings.mail_spool, 0, NULL, 52 { "mail-spool", mu_c_string, &mailbox_settings.mail_spool, 0, NULL,
53 N_("Use specified URL as a mailspool directory."), 53 N_("Use specified URL as a mailspool directory."),
54 N_("url") }, 54 N_("url") },
55 { "mailbox-pattern", mu_cfg_string, &mailbox_settings.mailbox_pattern, 55 { "mailbox-pattern", mu_c_string, &mailbox_settings.mailbox_pattern,
56 0, NULL, 56 0, NULL,
57 N_("Create mailbox URL using <pattern>."), 57 N_("Create mailbox URL using <pattern>."),
58 N_("pattern") }, 58 N_("pattern") },
59 { "mailbox-type", mu_cfg_string, &mailbox_settings.mailbox_type, 0, NULL, 59 { "mailbox-type", mu_c_string, &mailbox_settings.mailbox_type, 0, NULL,
60 N_("Default mailbox type."), N_("protocol") }, 60 N_("Default mailbox type."), N_("protocol") },
61 { "folder", mu_cfg_callback, NULL, 0, _cb_folder, 61 { "folder", mu_cfg_callback, NULL, 0, _cb_folder,
62 N_("Default user mail folder"), 62 N_("Default user mail folder"),
...@@ -73,17 +73,17 @@ DCL_CFG_CAPA (mailbox); ...@@ -73,17 +73,17 @@ DCL_CFG_CAPA (mailbox);
73 73
74 static struct mu_cfg_param mu_locking_param[] = { 74 static struct mu_cfg_param mu_locking_param[] = {
75 /* FIXME: Flags are superfluous. */ 75 /* FIXME: Flags are superfluous. */
76 { "flags", mu_cfg_string, &locking_settings.lock_flags, 0, NULL, 76 { "flags", mu_c_string, &locking_settings.lock_flags, 0, NULL,
77 N_("Default locker flags (E=external, R=retry, T=time, P=pid).") }, 77 N_("Default locker flags (E=external, R=retry, T=time, P=pid).") },
78 { "retry-timeout", mu_cfg_ulong, &locking_settings.lock_retry_timeout, 78 { "retry-timeout", mu_c_ulong, &locking_settings.lock_retry_timeout,
79 0, NULL, 79 0, NULL,
80 N_("Set timeout for acquiring the lock.") }, 80 N_("Set timeout for acquiring the lock.") },
81 { "retry-count", mu_cfg_ulong, &locking_settings.lock_retry_count, 0, NULL, 81 { "retry-count", mu_c_ulong, &locking_settings.lock_retry_count, 0, NULL,
82 N_("Set the maximum number of times to retry acquiring the lock.") }, 82 N_("Set the maximum number of times to retry acquiring the lock.") },
83 { "expire-timeout", mu_cfg_ulong, &locking_settings.lock_expire_timeout, 83 { "expire-timeout", mu_c_ulong, &locking_settings.lock_expire_timeout,
84 0, NULL, 84 0, NULL,
85 N_("Expire locks older than this amount of time.") }, 85 N_("Expire locks older than this amount of time.") },
86 { "external-locker", mu_cfg_string, &locking_settings.external_locker, 86 { "external-locker", mu_c_string, &locking_settings.external_locker,
87 0, NULL, 87 0, NULL,
88 N_("Use external locker program."), 88 N_("Use external locker program."),
89 N_("prog") }, 89 N_("prog") },
...@@ -98,11 +98,11 @@ DCL_CFG_CAPA (locking); ...@@ -98,11 +98,11 @@ DCL_CFG_CAPA (locking);
98 /* ************************************************************************* */ 98 /* ************************************************************************* */
99 99
100 static struct mu_cfg_param mu_address_param[] = { 100 static struct mu_cfg_param mu_address_param[] = {
101 { "email-addr", mu_cfg_string, &address_settings.address, 0, NULL, 101 { "email-addr", mu_c_string, &address_settings.address, 0, NULL,
102 N_("Set the current user email address (default is " 102 N_("Set the current user email address (default is "
103 "loginname@defaultdomain)."), 103 "loginname@defaultdomain)."),
104 N_("email") }, 104 N_("email") },
105 { "email-domain", mu_cfg_string, &address_settings.domain, 0, NULL, 105 { "email-domain", mu_c_string, &address_settings.domain, 0, NULL,
106 N_("Set e-mail domain for unqualified user names (default is this host)"), 106 N_("Set e-mail domain for unqualified user names (default is this host)"),
107 N_("domain") }, 107 N_("domain") },
108 { NULL } 108 { NULL }
...@@ -116,7 +116,7 @@ DCL_CFG_CAPA (address); ...@@ -116,7 +116,7 @@ DCL_CFG_CAPA (address);
116 /* ************************************************************************* */ 116 /* ************************************************************************* */
117 117
118 static struct mu_cfg_param mu_mailer_param[] = { 118 static struct mu_cfg_param mu_mailer_param[] = {
119 { "url", mu_cfg_string, &mailer_settings.mailer, 0, NULL, 119 { "url", mu_c_string, &mailer_settings.mailer, 0, NULL,
120 N_("Use this URL as the default mailer"), 120 N_("Use this URL as the default mailer"),
121 N_("url") }, 121 N_("url") },
122 { NULL } 122 { NULL }
...@@ -160,9 +160,9 @@ cb_severity (void *data, mu_config_value_t *val) ...@@ -160,9 +160,9 @@ cb_severity (void *data, mu_config_value_t *val)
160 } 160 }
161 161
162 static struct mu_cfg_param mu_logging_param[] = { 162 static struct mu_cfg_param mu_logging_param[] = {
163 { "syslog", mu_cfg_bool, &mu_log_syslog, 0, NULL, 163 { "syslog", mu_c_bool, &mu_log_syslog, 0, NULL,
164 N_("Send diagnostics to syslog.") }, 164 N_("Send diagnostics to syslog.") },
165 { "print-severity", mu_cfg_bool, &mu_log_print_severity, 0, NULL, 165 { "print-severity", mu_c_bool, &mu_log_print_severity, 0, NULL,
166 N_("Print message severity levels.") }, 166 N_("Print message severity levels.") },
167 { "severity", mu_cfg_callback, NULL, 0, cb_severity, 167 { "severity", mu_cfg_callback, NULL, 0, cb_severity,
168 N_("Output only messages with a severity equal to or greater than " 168 N_("Output only messages with a severity equal to or greater than "
...@@ -171,9 +171,9 @@ static struct mu_cfg_param mu_logging_param[] = { ...@@ -171,9 +171,9 @@ static struct mu_cfg_param mu_logging_param[] = {
171 N_("Set syslog facility. Arg is one of the following: user, daemon, " 171 N_("Set syslog facility. Arg is one of the following: user, daemon, "
172 "auth, authpriv, mail, cron, local0 through local7 (case-insensitive), " 172 "auth, authpriv, mail, cron, local0 through local7 (case-insensitive), "
173 "or a facility number.") }, 173 "or a facility number.") },
174 { "session-id", mu_cfg_bool, &mu_log_session_id, 0, NULL, 174 { "session-id", mu_c_bool, &mu_log_session_id, 0, NULL,
175 N_("Log session ID") }, 175 N_("Log session ID") },
176 { "tag", mu_cfg_string, &mu_log_tag, 0, NULL, 176 { "tag", mu_c_string, &mu_log_tag, 0, NULL,
177 N_("Tag syslog messages with this string.") }, 177 N_("Tag syslog messages with this string.") },
178 { NULL } 178 { NULL }
179 }; 179 };
...@@ -204,7 +204,7 @@ static struct mu_cfg_param mu_debug_param[] = { ...@@ -204,7 +204,7 @@ static struct mu_cfg_param mu_debug_param[] = {
204 N_("Set Mailutils debugging level. Argument is a colon-separated list " 204 N_("Set Mailutils debugging level. Argument is a colon-separated list "
205 "of debugging specifications in the form:\n" 205 "of debugging specifications in the form:\n"
206 " <object: string>[[:]=<level: number>].") }, 206 " <object: string>[[:]=<level: number>].") },
207 { "line-info", mu_cfg_bool, &debug_settings.line_info, 0, NULL, 207 { "line-info", mu_c_bool, &debug_settings.line_info, 0, NULL,
208 N_("Prefix debug messages with Mailutils source locations.") }, 208 N_("Prefix debug messages with Mailutils source locations.") },
209 { NULL } 209 { NULL }
210 }; 210 };
......
...@@ -26,21 +26,21 @@ ...@@ -26,21 +26,21 @@
26 static struct mu_gsasl_module_data gsasl_settings; 26 static struct mu_gsasl_module_data gsasl_settings;
27 27
28 static struct mu_cfg_param mu_gsasl_param[] = { 28 static struct mu_cfg_param mu_gsasl_param[] = {
29 { "enable", mu_cfg_bool, &gsasl_settings.enable, 0, NULL, 29 { "enable", mu_c_bool, &gsasl_settings.enable, 0, NULL,
30 N_("Enable GSASL (default)") }, 30 N_("Enable GSASL (default)") },
31 { "cram-passwd", mu_cfg_string, &gsasl_settings.cram_md5_pwd, 0, NULL, 31 { "cram-passwd", mu_c_string, &gsasl_settings.cram_md5_pwd, 0, NULL,
32 N_("Name of GSASL password file."), 32 N_("Name of GSASL password file."),
33 N_("file") }, 33 N_("file") },
34 { "service", mu_cfg_string, &gsasl_settings.service, 0, NULL, 34 { "service", mu_c_string, &gsasl_settings.service, 0, NULL,
35 N_("SASL service name."), 35 N_("SASL service name."),
36 N_("name") }, 36 N_("name") },
37 { "realm", mu_cfg_string, &gsasl_settings.realm, 0, NULL, 37 { "realm", mu_c_string, &gsasl_settings.realm, 0, NULL,
38 N_("SASL realm name."), 38 N_("SASL realm name."),
39 N_("name") }, 39 N_("name") },
40 { "hostname", mu_cfg_string, &gsasl_settings.hostname, 0, NULL, 40 { "hostname", mu_c_string, &gsasl_settings.hostname, 0, NULL,
41 N_("SASL host name."), 41 N_("SASL host name."),
42 N_("name") }, 42 N_("name") },
43 { "anonymous-user", mu_cfg_string, &gsasl_settings.anon_user, 0, NULL, 43 { "anonymous-user", mu_c_string, &gsasl_settings.anon_user, 0, NULL,
44 N_("Anonymous user name."), 44 N_("Anonymous user name."),
45 N_("name") }, 45 N_("name") },
46 46
......
...@@ -43,22 +43,22 @@ cb_field_map (void *data, mu_config_value_t *val) ...@@ -43,22 +43,22 @@ cb_field_map (void *data, mu_config_value_t *val)
43 } 43 }
44 44
45 static struct mu_cfg_param mu_ldap_param[] = { 45 static struct mu_cfg_param mu_ldap_param[] = {
46 { "enable", mu_cfg_bool, &ldap_settings.enable, 0, NULL, 46 { "enable", mu_c_bool, &ldap_settings.enable, 0, NULL,
47 N_("Enable LDAP lookups.") }, 47 N_("Enable LDAP lookups.") },
48 { "url", mu_cfg_string, &ldap_settings.url, 0, NULL, 48 { "url", mu_c_string, &ldap_settings.url, 0, NULL,
49 N_("Set URL of the LDAP server."), 49 N_("Set URL of the LDAP server."),
50 N_("url") }, 50 N_("url") },
51 { "base", mu_cfg_string, &ldap_settings.base, 0, NULL, 51 { "base", mu_c_string, &ldap_settings.base, 0, NULL,
52 N_("Base DN for LDAP lookups."), 52 N_("Base DN for LDAP lookups."),
53 N_("dn") }, 53 N_("dn") },
54 { "binddn", mu_cfg_string, &ldap_settings.binddn, 0, NULL, 54 { "binddn", mu_c_string, &ldap_settings.binddn, 0, NULL,
55 N_("DN for accessing LDAP database."), 55 N_("DN for accessing LDAP database."),
56 N_("dn") }, 56 N_("dn") },
57 { "passwd", mu_cfg_string, &ldap_settings.passwd, 0, NULL, 57 { "passwd", mu_c_string, &ldap_settings.passwd, 0, NULL,
58 N_("Password for use with binddn.") }, 58 N_("Password for use with binddn.") },
59 { "tls", mu_cfg_bool, &ldap_settings.tls, 0, NULL, 59 { "tls", mu_c_bool, &ldap_settings.tls, 0, NULL,
60 N_("Use TLS encryption.") }, 60 N_("Use TLS encryption.") },
61 { "debug", mu_cfg_int, &ldap_settings.debug, 0, NULL, 61 { "debug", mu_c_int, &ldap_settings.debug, 0, NULL,
62 N_("Set LDAP debugging level.") }, 62 N_("Set LDAP debugging level.") },
63 { "field-map", mu_cfg_callback, NULL, 0, cb_field_map, 63 { "field-map", mu_cfg_callback, NULL, 0, cb_field_map,
64 N_("Set a field-map for parsing LDAP replies. The map is a " 64 N_("Set a field-map for parsing LDAP replies. The map is a "
...@@ -69,10 +69,10 @@ static struct mu_cfg_param mu_ldap_param[] = { ...@@ -69,10 +69,10 @@ static struct mu_cfg_param mu_ldap_param[] = {
69 "gecos, dir, shell, mailbox, quota, and <attr> is the name of " 69 "gecos, dir, shell, mailbox, quota, and <attr> is the name of "
70 "the corresponding LDAP attribute."), 70 "the corresponding LDAP attribute."),
71 N_("map") }, 71 N_("map") },
72 { "getpwnam", mu_cfg_string, &ldap_settings.getpwnam_filter, 0, NULL, 72 { "getpwnam", mu_c_string, &ldap_settings.getpwnam_filter, 0, NULL,
73 N_("LDAP filter to use for getpwnam requests."), 73 N_("LDAP filter to use for getpwnam requests."),
74 N_("filter") }, 74 N_("filter") },
75 { "getpwuid", mu_cfg_string, &ldap_settings.getpwuid_filter, 0, NULL, 75 { "getpwuid", mu_c_string, &ldap_settings.getpwuid_filter, 0, NULL,
76 N_("LDAP filter to use for getpwuid requests."), 76 N_("LDAP filter to use for getpwuid requests."),
77 N_("filter") }, 77 N_("filter") },
78 { NULL } 78 { NULL }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
25 static char *pam_settings; 25 static char *pam_settings;
26 26
27 static struct mu_cfg_param mu_pam_param[] = { 27 static struct mu_cfg_param mu_pam_param[] = {
28 { "service", mu_cfg_string, &pam_settings, 0, NULL, 28 { "service", mu_c_string, &pam_settings, 0, NULL,
29 N_("Set PAM service name."), 29 N_("Set PAM service name."),
30 N_("name") }, 30 N_("name") },
31 { NULL } 31 { NULL }
......
...@@ -26,16 +26,16 @@ ...@@ -26,16 +26,16 @@
26 static struct mu_radius_module_data radius_settings; 26 static struct mu_radius_module_data radius_settings;
27 27
28 static struct mu_cfg_param mu_radius_param[] = { 28 static struct mu_cfg_param mu_radius_param[] = {
29 { "auth", mu_cfg_string, &radius_settings.auth_request, 0, NULL, 29 { "auth", mu_c_string, &radius_settings.auth_request, 0, NULL,
30 N_("Radius request for authorization."), 30 N_("Radius request for authorization."),
31 N_("request") }, 31 N_("request") },
32 { "getpwnam", mu_cfg_string, &radius_settings.getpwnam_request, 0, NULL, 32 { "getpwnam", mu_c_string, &radius_settings.getpwnam_request, 0, NULL,
33 N_("Radius request for getpwnam."), 33 N_("Radius request for getpwnam."),
34 N_("request") }, 34 N_("request") },
35 { "getpwuid", mu_cfg_string, &radius_settings.getpwuid_request, 0, NULL, 35 { "getpwuid", mu_c_string, &radius_settings.getpwuid_request, 0, NULL,
36 N_("Radius request for getpwuid."), 36 N_("Radius request for getpwuid."),
37 N_("request") }, 37 N_("request") },
38 { "directory", mu_cfg_string, &radius_settings.config_dir, 0, NULL, 38 { "directory", mu_c_string, &radius_settings.config_dir, 0, NULL,
39 N_("Set radius configuration directory.") }, 39 N_("Set radius configuration directory.") },
40 { NULL } 40 { NULL }
41 }; 41 };
......
...@@ -32,7 +32,7 @@ cb_clear_library_path (void *data, mu_config_value_t *val) ...@@ -32,7 +32,7 @@ cb_clear_library_path (void *data, mu_config_value_t *val)
32 32
33 if (mu_cfg_assert_value_type (val, MU_CFG_STRING)) 33 if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
34 return 1; 34 return 1;
35 if (mu_cfg_parse_boolean (val->v.string, &flag)) 35 if (mu_str_to_c (val->v.string, mu_c_bool, &flag, NULL))
36 { 36 {
37 mu_error (_("not a boolean")); 37 mu_error (_("not a boolean"));
38 return 1; 38 return 1;
...@@ -49,7 +49,7 @@ cb_clear_include_path (void *data, mu_config_value_t *val) ...@@ -49,7 +49,7 @@ cb_clear_include_path (void *data, mu_config_value_t *val)
49 49
50 if (mu_cfg_assert_value_type (val, MU_CFG_STRING)) 50 if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
51 return 1; 51 return 1;
52 if (mu_cfg_parse_boolean (val->v.string, &flag)) 52 if (mu_str_to_c (val->v.string, mu_c_bool, &flag, NULL))
53 { 53 {
54 mu_error (_("not a boolean")); 54 mu_error (_("not a boolean"));
55 return 1; 55 return 1;
......
...@@ -57,31 +57,31 @@ cb_field_map (void *data, mu_config_value_t *val) ...@@ -57,31 +57,31 @@ cb_field_map (void *data, mu_config_value_t *val)
57 } 57 }
58 58
59 static struct mu_cfg_param mu_sql_param[] = { 59 static struct mu_cfg_param mu_sql_param[] = {
60 { "interface", mu_cfg_string, &sql_settings.interface, 0, NULL, 60 { "interface", mu_c_string, &sql_settings.interface, 0, NULL,
61 N_("Set SQL interface to use (one of: mysql, odbc, or postgres).") }, 61 N_("Set SQL interface to use (one of: mysql, odbc, or postgres).") },
62 { "getpwnam", mu_cfg_string, &sql_settings.getpwnam_query, 0, NULL, 62 { "getpwnam", mu_c_string, &sql_settings.getpwnam_query, 0, NULL,
63 N_("SQL query to use for getpwnam requests."), 63 N_("SQL query to use for getpwnam requests."),
64 N_("query") }, 64 N_("query") },
65 { "getpwuid", mu_cfg_string, &sql_settings.getpwuid_query, 0, NULL, 65 { "getpwuid", mu_c_string, &sql_settings.getpwuid_query, 0, NULL,
66 N_("SQL query to use for getpwuid requests."), 66 N_("SQL query to use for getpwuid requests."),
67 N_("query") }, 67 N_("query") },
68 { "getpass", mu_cfg_string, &sql_settings.getpass_query, 0, NULL, 68 { "getpass", mu_c_string, &sql_settings.getpass_query, 0, NULL,
69 N_("SQL query returning the user's password."), 69 N_("SQL query returning the user's password."),
70 N_("query") }, 70 N_("query") },
71 { "host", mu_cfg_string, &sql_settings.host, 0, NULL, 71 { "host", mu_c_string, &sql_settings.host, 0, NULL,
72 N_("SQL server host name.") }, 72 N_("SQL server host name.") },
73 { "user", mu_cfg_string, &sql_settings.user, 0, NULL, 73 { "user", mu_c_string, &sql_settings.user, 0, NULL,
74 N_("SQL user name.") }, 74 N_("SQL user name.") },
75 { "passwd", mu_cfg_string, &sql_settings.passwd, 0, NULL, 75 { "passwd", mu_c_string, &sql_settings.passwd, 0, NULL,
76 N_("Password for the SQL user.") }, 76 N_("Password for the SQL user.") },
77 { "port", mu_cfg_int, &sql_settings.port, 0, NULL, 77 { "port", mu_c_int, &sql_settings.port, 0, NULL,
78 N_("SQL server port.") }, 78 N_("SQL server port.") },
79 { "db", mu_cfg_string, &sql_settings.db, 0, NULL, 79 { "db", mu_c_string, &sql_settings.db, 0, NULL,
80 N_("Database name.") }, 80 N_("Database name.") },
81 { "password-type", mu_cfg_callback, NULL, 0, cb_password_type, 81 { "password-type", mu_cfg_callback, NULL, 0, cb_password_type,
82 N_("Type of password returned by getpass query (one of: plain, hash, " 82 N_("Type of password returned by getpass query (one of: plain, hash, "
83 "scrambled).") }, 83 "scrambled).") },
84 { "positional", mu_cfg_bool, &sql_settings.positional, 0, NULL, 84 { "positional", mu_c_bool, &sql_settings.positional, 0, NULL,
85 N_("Use positional (v1.0 compatible) field interface.") }, 85 N_("Use positional (v1.0 compatible) field interface.") },
86 { "field-map", mu_cfg_callback, NULL, 0, cb_field_map, 86 { "field-map", mu_cfg_callback, NULL, 0, cb_field_map,
87 N_("Set a field-map for parsing SQL replies. The map is a " 87 N_("Set a field-map for parsing SQL replies. The map is a "
......
...@@ -77,18 +77,18 @@ cb_safety_checks (void *data, mu_config_value_t *arg) ...@@ -77,18 +77,18 @@ cb_safety_checks (void *data, mu_config_value_t *arg)
77 } 77 }
78 78
79 static struct mu_cfg_param mu_tls_param[] = { 79 static struct mu_cfg_param mu_tls_param[] = {
80 { "enable", mu_cfg_bool, &tls_settings.enable, 0, NULL, 80 { "enable", mu_c_bool, &tls_settings.enable, 0, NULL,
81 N_("Enable TLS encryption.") }, 81 N_("Enable TLS encryption.") },
82 { "ssl-cert", mu_cfg_string, &tls_settings.ssl_cert, 0, NULL, 82 { "ssl-cert", mu_c_string, &tls_settings.ssl_cert, 0, NULL,
83 N_("Specify SSL certificate file."), 83 N_("Specify SSL certificate file."),
84 N_("file") }, 84 N_("file") },
85 { "ssl-key", mu_cfg_string, &tls_settings.ssl_key, 0, NULL, 85 { "ssl-key", mu_c_string, &tls_settings.ssl_key, 0, NULL,
86 N_("Specify SSL certificate key file."), 86 N_("Specify SSL certificate key file."),
87 N_("file") }, 87 N_("file") },
88 { "ssl-cafile", mu_cfg_string, &tls_settings.ssl_cafile, 0, NULL, 88 { "ssl-cafile", mu_c_string, &tls_settings.ssl_cafile, 0, NULL,
89 N_("Specify trusted CAs file."), 89 N_("Specify trusted CAs file."),
90 N_("file") }, 90 N_("file") },
91 { "ssl-priorities", mu_cfg_string, &tls_settings.priorities, 0, NULL, 91 { "ssl-priorities", mu_c_string, &tls_settings.priorities, 0, NULL,
92 N_("Set the priorities to use on the ciphers, key exchange methods, " 92 N_("Set the priorities to use on the ciphers, key exchange methods, "
93 "macs and compression methods."), 93 "macs and compression methods."),
94 NULL }, 94 NULL },
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
25 static struct mu_gocs_virtual virtdomain_settings; 25 static struct mu_gocs_virtual virtdomain_settings;
26 26
27 static struct mu_cfg_param mu_virtdomain_param[] = { 27 static struct mu_cfg_param mu_virtdomain_param[] = {
28 { "passwd-dir", mu_cfg_string, &virtdomain_settings, 0, NULL, 28 { "passwd-dir", mu_c_string, &virtdomain_settings, 0, NULL,
29 N_("Name of the directory where virtual domain password files are " 29 N_("Name of the directory where virtual domain password files are "
30 "located."), 30 "located."),
31 N_("dir") }, 31 N_("dir") },
......
...@@ -284,7 +284,7 @@ cb_stderr (void *data, mu_config_value_t *val) ...@@ -284,7 +284,7 @@ cb_stderr (void *data, mu_config_value_t *val)
284 284
285 if (mu_cfg_assert_value_type (val, MU_CFG_STRING)) 285 if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
286 return 1; 286 return 1;
287 if (mu_cfg_parse_boolean (val->v.string, &res)) 287 if (mu_str_to_c (val->v.string, mu_c_bool, &res, NULL))
288 mu_error (_("not a boolean")); 288 mu_error (_("not a boolean"));
289 else 289 else
290 mu_log_syslog = !res; 290 mu_log_syslog = !res;
...@@ -415,24 +415,24 @@ struct mu_cfg_param maidag_cfg_param[] = { ...@@ -415,24 +415,24 @@ struct mu_cfg_param maidag_cfg_param[] = {
415 { "delivery-mode", mu_cfg_callback, NULL, 0, cb_delivery_mode, 415 { "delivery-mode", mu_cfg_callback, NULL, 0, cb_delivery_mode,
416 N_("Set delivery mode"), 416 N_("Set delivery mode"),
417 N_("mode: {mda | url | lmtp}") }, 417 N_("mode: {mda | url | lmtp}") },
418 { "exit-multiple-delivery-success", mu_cfg_bool, &multiple_delivery, 0, NULL, 418 { "exit-multiple-delivery-success", mu_c_bool, &multiple_delivery, 0, NULL,
419 N_("In case of multiple delivery, exit with code 0 if at least one " 419 N_("In case of multiple delivery, exit with code 0 if at least one "
420 "delivery succeeded.") }, 420 "delivery succeeded.") },
421 { "exit-quota-tempfail", mu_cfg_bool, &ex_quota_tempfail, 0, NULL, 421 { "exit-quota-tempfail", mu_c_bool, &ex_quota_tempfail, 0, NULL,
422 N_("Indicate temporary failure if the recipient is over his mail quota.") 422 N_("Indicate temporary failure if the recipient is over his mail quota.")
423 }, 423 },
424 #ifdef ENABLE_DBM 424 #ifdef ENABLE_DBM
425 { "quota-db", mu_cfg_string, &quotadbname, 0, NULL, 425 { "quota-db", mu_c_string, &quotadbname, 0, NULL,
426 N_("Name of DBM quota database file."), 426 N_("Name of DBM quota database file."),
427 N_("file") }, 427 N_("file") },
428 #endif 428 #endif
429 #ifdef USE_SQL 429 #ifdef USE_SQL
430 { "quota-query", mu_cfg_string, &quota_query, 0, NULL, 430 { "quota-query", mu_c_string, &quota_query, 0, NULL,
431 N_("SQL query to retrieve mailbox quota. This is deprecated, use " 431 N_("SQL query to retrieve mailbox quota. This is deprecated, use "
432 "sql { ... } instead."), 432 "sql { ... } instead."),
433 N_("query") }, 433 N_("query") },
434 #endif 434 #endif
435 { "message-id-header", mu_cfg_string, &message_id_header, 0, NULL, 435 { "message-id-header", mu_c_string, &message_id_header, 0, NULL,
436 N_("When logging Sieve actions, identify messages by the value of " 436 N_("When logging Sieve actions, identify messages by the value of "
437 "this header."), 437 "this header."),
438 N_("name") }, 438 N_("name") },
...@@ -445,12 +445,12 @@ struct mu_cfg_param maidag_cfg_param[] = { ...@@ -445,12 +445,12 @@ struct mu_cfg_param maidag_cfg_param[] = {
445 " l - sieve action logs\n") }, 445 " l - sieve action logs\n") },
446 { "stderr", mu_cfg_callback, NULL, 0, cb_stderr, 446 { "stderr", mu_cfg_callback, NULL, 0, cb_stderr,
447 N_("Log to stderr instead of syslog.") }, 447 N_("Log to stderr instead of syslog.") },
448 { "forward-file", mu_cfg_string, &forward_file, 0, NULL, 448 { "forward-file", mu_c_string, &forward_file, 0, NULL,
449 N_("Process forward file.") }, 449 N_("Process forward file.") },
450 { "forward-file-checks", mu_cfg_callback, NULL, 0, cb_forward_file_checks, 450 { "forward-file-checks", mu_cfg_callback, NULL, 0, cb_forward_file_checks,
451 N_("Configure safety checks for the forward file."), 451 N_("Configure safety checks for the forward file."),
452 N_("arg: list") }, 452 N_("arg: list") },
453 { "domain", mu_cfg_string, &default_domain, 0, NULL, 453 { "domain", mu_c_string, &default_domain, 0, NULL,
454 N_("Default email domain") }, 454 N_("Default email domain") },
455 /* LMTP support */ 455 /* LMTP support */
456 { "group", mu_cfg_callback, &lmtp_groups, 0, cb_group, 456 { "group", mu_cfg_callback, &lmtp_groups, 0, cb_group,
...@@ -463,7 +463,7 @@ struct mu_cfg_param maidag_cfg_param[] = { ...@@ -463,7 +463,7 @@ struct mu_cfg_param maidag_cfg_param[] = {
463 " file://<socket-file-name>\n" 463 " file://<socket-file-name>\n"
464 "or socket://<socket-file-name>"), 464 "or socket://<socket-file-name>"),
465 N_("url") }, 465 N_("url") },
466 { "reuse-address", mu_cfg_bool, &reuse_lmtp_address, 0, NULL, 466 { "reuse-address", mu_c_bool, &reuse_lmtp_address, 0, NULL,
467 N_("Reuse existing address (LMTP mode). Default is \"yes\".") }, 467 N_("Reuse existing address (LMTP mode). Default is \"yes\".") },
468 { "filter", mu_cfg_section, NULL, 0, NULL, 468 { "filter", mu_cfg_section, NULL, 0, NULL,
469 N_("Add a message filter") }, 469 N_("Add a message filter") },
......
...@@ -164,10 +164,10 @@ struct mu_cfg_param mimeview_cfg_param[] = { ...@@ -164,10 +164,10 @@ struct mu_cfg_param mimeview_cfg_param[] = {
164 { "debug", mu_cfg_callback, NULL, 0, cb_debug, 164 { "debug", mu_cfg_callback, NULL, 0, cb_debug,
165 N_("Set debug verbosity level."), 165 N_("Set debug verbosity level."),
166 N_("flags") }, 166 N_("flags") },
167 { "mimetypes", mu_cfg_string, &mimetypes_config, 0, NULL, 167 { "mimetypes", mu_c_string, &mimetypes_config, 0, NULL,
168 N_("Use this mime.types file."), 168 N_("Use this mime.types file."),
169 N_("file") }, 169 N_("file") },
170 { "metamail", mu_cfg_string, &metamail, 0, NULL, 170 { "metamail", mu_c_string, &metamail, 0, NULL,
171 N_("Use this program to display files."), 171 N_("Use this program to display files."),
172 N_("prog") }, 172 N_("prog") },
173 { NULL } 173 { NULL }
......
...@@ -371,17 +371,17 @@ cb_onerror (void *data, mu_config_value_t *val) ...@@ -371,17 +371,17 @@ cb_onerror (void *data, mu_config_value_t *val)
371 } 371 }
372 372
373 struct mu_cfg_param movemail_cfg_param[] = { 373 struct mu_cfg_param movemail_cfg_param[] = {
374 { "preserve", mu_cfg_bool, &preserve_mail, 0, NULL, 374 { "preserve", mu_c_bool, &preserve_mail, 0, NULL,
375 N_("Do not remove messages from the source mailbox.") }, 375 N_("Do not remove messages from the source mailbox.") },
376 { "reverse", mu_cfg_bool, &reverse_order, 0, NULL, 376 { "reverse", mu_c_bool, &reverse_order, 0, NULL,
377 N_("Reverse message sorting order.") }, 377 N_("Reverse message sorting order.") },
378 { "emacs", mu_cfg_bool, &emacs_mode, 0, NULL, 378 { "emacs", mu_c_bool, &emacs_mode, 0, NULL,
379 N_("Output information used by Emacs rmail interface.") }, 379 N_("Output information used by Emacs rmail interface.") },
380 { "uidl", mu_cfg_bool, &uidl_option, 0, NULL, 380 { "uidl", mu_c_bool, &uidl_option, 0, NULL,
381 N_("Use UIDLs to avoid downloading the same message twice.") }, 381 N_("Use UIDLs to avoid downloading the same message twice.") },
382 { "verbose", mu_cfg_int, &verbose_option, 0, NULL, 382 { "verbose", mu_c_int, &verbose_option, 0, NULL,
383 N_("Set verbosity level.") }, 383 N_("Set verbosity level.") },
384 { "program-id", mu_cfg_string, &program_id_option, 0, NULL, 384 { "program-id", mu_c_string, &program_id_option, 0, NULL,
385 N_("Set program identifier string (default: program name)") }, 385 N_("Set program identifier string (default: program name)") },
386 { "mailbox-ownership", mu_cfg_callback, NULL, 0, 386 { "mailbox-ownership", mu_cfg_callback, NULL, 0,
387 cb_mailbox_ownership, 387 cb_mailbox_ownership,
...@@ -392,10 +392,10 @@ struct mu_cfg_param movemail_cfg_param[] = { ...@@ -392,10 +392,10 @@ struct mu_cfg_param movemail_cfg_param[] = {
392 " set-id=UID[:GID] set supplied UID and GID\n" 392 " set-id=UID[:GID] set supplied UID and GID\n"
393 " set-name=USER make destination mailbox owned by USER"), 393 " set-name=USER make destination mailbox owned by USER"),
394 N_("methods: list") }, 394 N_("methods: list") },
395 { "max-messages", mu_cfg_size, &max_messages_option, 0, NULL, 395 { "max-messages", mu_c_size, &max_messages_option, 0, NULL,
396 N_("Copy at most <count> messages."), 396 N_("Copy at most <count> messages."),
397 N_("count") }, 397 N_("count") },
398 { "ignore-errors", mu_cfg_bool, &ignore_errors, 0, NULL, 398 { "ignore-errors", mu_c_bool, &ignore_errors, 0, NULL,
399 N_("Continue after an error.") }, 399 N_("Continue after an error.") },
400 { "onerror", mu_cfg_callback, NULL, 0, cb_onerror, 400 { "onerror", mu_cfg_callback, NULL, 0, cb_onerror,
401 N_("What to do after an error. Argument is a comma-separated list of:\n" 401 N_("What to do after an error. Argument is a comma-separated list of:\n"
......
...@@ -182,7 +182,7 @@ cb_tls_required (void *data, mu_config_value_t *val) ...@@ -182,7 +182,7 @@ cb_tls_required (void *data, mu_config_value_t *val)
182 182
183 if (mu_cfg_assert_value_type (val, MU_CFG_STRING)) 183 if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
184 return 1; 184 return 1;
185 if (mu_cfg_parse_boolean (val->v.string, &bv)) 185 if (mu_str_to_c (val->v.string, mu_c_bool, &bv, NULL))
186 mu_error (_("Not a boolean value")); 186 mu_error (_("Not a boolean value"));
187 else if (bv) 187 else if (bv)
188 { 188 {
...@@ -210,16 +210,16 @@ static struct mu_cfg_param pop3d_srv_param[] = { ...@@ -210,16 +210,16 @@ static struct mu_cfg_param pop3d_srv_param[] = {
210 }; 210 };
211 211
212 static struct mu_cfg_param pop3d_cfg_param[] = { 212 static struct mu_cfg_param pop3d_cfg_param[] = {
213 { "undelete", mu_cfg_bool, &undelete_on_startup, 0, NULL, 213 { "undelete", mu_c_bool, &undelete_on_startup, 0, NULL,
214 N_("On startup, clear deletion marks from all the messages.") }, 214 N_("On startup, clear deletion marks from all the messages.") },
215 { "expire", mu_cfg_uint, &expire, 0, NULL, 215 { "expire", mu_c_uint, &expire, 0, NULL,
216 N_("Automatically expire read messages after the given number of days."), 216 N_("Automatically expire read messages after the given number of days."),
217 N_("days") }, 217 N_("days") },
218 { "delete-expired", mu_cfg_bool, &expire_on_exit, 0, NULL, 218 { "delete-expired", mu_c_bool, &expire_on_exit, 0, NULL,
219 N_("Delete expired messages upon closing the mailbox.") }, 219 N_("Delete expired messages upon closing the mailbox.") },
220 { "scan-lines", mu_cfg_bool, &pop3d_xlines, 0, NULL, 220 { "scan-lines", mu_c_bool, &pop3d_xlines, 0, NULL,
221 N_("Output the number of lines in the message in its scan listing.") }, 221 N_("Output the number of lines in the message in its scan listing.") },
222 { "apop-database-file", mu_cfg_string, &apop_database_name, 0, NULL, 222 { "apop-database-file", mu_c_string, &apop_database_name, 0, NULL,
223 N_("set APOP database file name or URL") }, 223 N_("set APOP database file name or URL") },
224 { "apop-database-owner", mu_cfg_callback, NULL, 0, cb_apop_database_owner, 224 { "apop-database-owner", mu_cfg_callback, NULL, 0, cb_apop_database_owner,
225 N_("Name or UID of the APOP database owner") }, 225 N_("Name or UID of the APOP database owner") },
...@@ -247,9 +247,9 @@ static struct mu_cfg_param pop3d_cfg_param[] = { ...@@ -247,9 +247,9 @@ static struct mu_cfg_param pop3d_cfg_param[] = {
247 "Deprecated, use \"tls required\" instead.") }, 247 "Deprecated, use \"tls required\" instead.") },
248 #endif 248 #endif
249 #ifdef ENABLE_LOGIN_DELAY 249 #ifdef ENABLE_LOGIN_DELAY
250 { "login-delay", mu_cfg_time, &login_delay, 0, NULL, 250 { "login-delay", mu_c_time, &login_delay, 0, NULL,
251 N_("Set the minimal allowed delay between two successive logins.") }, 251 N_("Set the minimal allowed delay between two successive logins.") },
252 { "stat-file", mu_cfg_string, &login_stat_file, 0, NULL, 252 { "stat-file", mu_c_string, &login_stat_file, 0, NULL,
253 N_("Set the name of login statistics file (for login-delay).") }, 253 N_("Set the name of login statistics file (for login-delay).") },
254 #endif 254 #endif
255 { "bulletin-source", mu_cfg_callback, NULL, 0, cb_bulletin_source, 255 { "bulletin-source", mu_cfg_callback, NULL, 0, cb_bulletin_source,
...@@ -260,12 +260,12 @@ static struct mu_cfg_param pop3d_cfg_param[] = { ...@@ -260,12 +260,12 @@ static struct mu_cfg_param pop3d_cfg_param[] = {
260 N_("Set the bulletin database file name."), 260 N_("Set the bulletin database file name."),
261 N_("file") }, 261 N_("file") },
262 #endif 262 #endif
263 { "output-buffer-size", mu_cfg_size, &pop3d_output_bufsize, 0, NULL, 263 { "output-buffer-size", mu_c_size, &pop3d_output_bufsize, 0, NULL,
264 N_("Size of the output buffer.") }, 264 N_("Size of the output buffer.") },
265 { "mandatory-locking", mu_cfg_section }, 265 { "mandatory-locking", mu_cfg_section },
266 { ".server", mu_cfg_section, NULL, 0, NULL, 266 { ".server", mu_cfg_section, NULL, 0, NULL,
267 N_("Server configuration.") }, 267 N_("Server configuration.") },
268 { "transcript", mu_cfg_bool, &pop3d_transcript, 0, NULL, 268 { "transcript", mu_c_bool, &pop3d_transcript, 0, NULL,
269 N_("Set global transcript mode.") }, 269 N_("Set global transcript mode.") },
270 TCP_WRAPPERS_CONFIG 270 TCP_WRAPPERS_CONFIG
271 { NULL } 271 { NULL }
......
...@@ -126,21 +126,21 @@ readmsg_parse_opt (int key, char *arg, struct argp_state *astate) ...@@ -126,21 +126,21 @@ readmsg_parse_opt (int key, char *arg, struct argp_state *astate)
126 126
127 127
128 struct mu_cfg_param readmsg_cfg_param[] = { 128 struct mu_cfg_param readmsg_cfg_param[] = {
129 { "debug", mu_cfg_int, &dbug, 0, NULL, 129 { "debug", mu_c_int, &dbug, 0, NULL,
130 N_("Set debug verbosity level.") }, 130 N_("Set debug verbosity level.") },
131 { "header", mu_cfg_bool, &all_header, 0, NULL, 131 { "header", mu_c_bool, &all_header, 0, NULL,
132 N_("Display entire headers.") }, 132 N_("Display entire headers.") },
133 { "weedlist", mu_cfg_string, &weedlist, 0, NULL, 133 { "weedlist", mu_c_string, &weedlist, 0, NULL,
134 N_("Display only headers from this list. Argument is a list of header " 134 N_("Display only headers from this list. Argument is a list of header "
135 "names separated by whitespace or commas."), 135 "names separated by whitespace or commas."),
136 N_("list") }, 136 N_("list") },
137 { "folder", mu_cfg_string, &mailbox_name, 0, NULL, 137 { "folder", mu_c_string, &mailbox_name, 0, NULL,
138 N_("Read messages from this folder.") }, 138 N_("Read messages from this folder.") },
139 { "no-header", mu_cfg_bool, &no_header, 0, NULL, 139 { "no-header", mu_c_bool, &no_header, 0, NULL,
140 N_("Exclude all headers.") }, 140 N_("Exclude all headers.") },
141 { "form-feeds", mu_cfg_bool, &form_feed, 0, NULL, 141 { "form-feeds", mu_c_bool, &form_feed, 0, NULL,
142 N_("Output formfeed character between messages.") }, 142 N_("Output formfeed character between messages.") },
143 { "show-all-match", mu_cfg_bool, &show_all, 0, NULL, 143 { "show-all-match", mu_c_bool, &show_all, 0, NULL,
144 N_("Print all messages matching pattern, not only the first.") }, 144 N_("Print all messages matching pattern, not only the first.") },
145 { NULL } 145 { NULL }
146 }; 146 };
......
...@@ -281,12 +281,12 @@ cb_email (void *data, mu_config_value_t *val) ...@@ -281,12 +281,12 @@ cb_email (void *data, mu_config_value_t *val)
281 } 281 }
282 282
283 static struct mu_cfg_param sieve_cfg_param[] = { 283 static struct mu_cfg_param sieve_cfg_param[] = {
284 { "keep-going", mu_cfg_bool, &keep_going, 0, NULL, 284 { "keep-going", mu_c_bool, &keep_going, 0, NULL,
285 N_("Do not abort if execution fails on a message.") }, 285 N_("Do not abort if execution fails on a message.") },
286 { "mbox-url", mu_cfg_string, &mbox_url, 0, NULL, 286 { "mbox-url", mu_c_string, &mbox_url, 0, NULL,
287 N_("Mailbox to sieve (defaults to user's mail spool)."), 287 N_("Mailbox to sieve (defaults to user's mail spool)."),
288 N_("url") }, 288 N_("url") },
289 { "ticket", mu_cfg_string, &mu_ticket_file, 0, NULL, 289 { "ticket", mu_c_string, &mu_ticket_file, 0, NULL,
290 N_("Ticket file for user authentication."), 290 N_("Ticket file for user authentication."),
291 N_("ticket") }, 291 N_("ticket") },
292 { "debug", mu_cfg_callback, NULL, 0, cb_debug, 292 { "debug", mu_cfg_callback, NULL, 0, cb_debug,
...@@ -297,9 +297,9 @@ static struct mu_cfg_param sieve_cfg_param[] = { ...@@ -297,9 +297,9 @@ static struct mu_cfg_param sieve_cfg_param[] = {
297 " P - network protocols (sieve.prot)\n" 297 " P - network protocols (sieve.prot)\n"
298 " t - sieve trace (MU_SIEVE_DEBUG_TRACE)\n" 298 " t - sieve trace (MU_SIEVE_DEBUG_TRACE)\n"
299 " i - sieve instructions trace (MU_SIEVE_DEBUG_INSTR).") }, 299 " i - sieve instructions trace (MU_SIEVE_DEBUG_INSTR).") },
300 { "verbose", mu_cfg_bool, &verbose, 0, NULL, 300 { "verbose", mu_c_bool, &verbose, 0, NULL,
301 N_("Log all executed actions.") }, 301 N_("Log all executed actions.") },
302 { "line-info", mu_cfg_bool, &sieve_print_locus, 0, NULL, 302 { "line-info", mu_c_bool, &sieve_print_locus, 0, NULL,
303 N_("Print source locations along with action logs (default).") }, 303 N_("Print source locations along with action logs (default).") },
304 { "email", mu_cfg_callback, NULL, 0, cb_email, 304 { "email", mu_cfg_callback, NULL, 0, cb_email,
305 N_("Set user email address.") }, 305 N_("Set user email address.") },
......