diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-05-07 15:17:34 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-05-07 15:17:34 +0300 |
commit | 05a8bb0ca988f41f016420ffc7dde427e423c187 (patch) | |
tree | fff58297f073bec8148c2d5468a45d592eab0379 /mtasim | |
parent | 9f8f65324491b4186f4fd3c2580a8e0b14a248d9 (diff) | |
download | mailfromd-05a8bb0ca988f41f016420ffc7dde427e423c187.tar.gz mailfromd-05a8bb0ca988f41f016420ffc7dde427e423c187.tar.bz2 |
Implement v6 negotiation on the server side.
* gacopyz/stagenames.c: New file.
* gacopyz/Makefile.am (libgacopyz_a_SOURCES): Add stagenames.c.
* gacopyz/gacopyz.c (gacopyz_context_loop): Free req_macros.
(gacopyz_addrcpt_par): rename to gacopyz_add_rcpt_par.
* gacopyz/gacopyz.h (SM_LM_VRS_MAJOR, SM_LM_VRS_MAJOR)
(SM_LM_VRS_PLVL, GACOPYZ_SM_MKVER): New macros.
(macro_index): Rename to gacopyz_stage. All uses updated.
(smfi_version): New proto.
(gacopyz_addrcpt_par): rename to gacopyz_add_rcpt_par.
(gacopyz_stage_name): New declaration.
(gacopyz_srv_get_required_macros): New proto.
(gacopyz_srv_set_version, gacopyz_srv_set_protocol)
(gacopyz_srv_set_actions): 2nd argument is unsigned long.
* gacopyz/server.c (struct gacopyz_srv): New member req_macros.
(gacopyz_srv_get_required_macros): New function.
(gacopyz_srv_destroy): Free req_macros.
(gacopyz_srv_negotiate): Read macros.
* mfd/gram.y (milter_state_name): Removed. Use gacopyz_stage_name instead.
* mtasim/mtasim.c: New options: --gacopyz-log, --milter-proto, --milter-acts.
* doc/mtasim.texi, doc/mailfromd.texi: Update.
Diffstat (limited to 'mtasim')
-rw-r--r-- | mtasim/mtasim.c | 111 |
1 files changed, 90 insertions, 21 deletions
diff --git a/mtasim/mtasim.c b/mtasim/mtasim.c index 5c79ff7f..f9a85f53 100644 --- a/mtasim/mtasim.c +++ b/mtasim/mtasim.c @@ -102,7 +102,10 @@ int define_macro (char *arg); /* Milter-related options */ char *milter_port; size_t max_body_chunk = 65535; -int milter_version_option = 0; +unsigned long milter_version_option = 0; +unsigned long milter_proto_option = 0; +unsigned long milter_acts_option = 0; +int gacopyz_log_mask; struct timeval milter_timeouts[GACOPYZ_TO_COUNT] = { { GACOPYZ_WRITE_TIMEOUT, 0 }, { GACOPYZ_READ_TIMEOUT, 0 }, @@ -268,6 +271,7 @@ static char doc[] = N_("mtasim -- MTA simulator for mailfromd"); enum { OPTION_STDIO = 128, + OPTION_GACOPYZ_LOG, OPTION_DAEMON, OPTION_TLS_CERT, OPTION_TLS_CA, @@ -275,6 +279,8 @@ enum { OPTION_TRACE_FILE, OPTION_BODY_CHUNK, OPTION_MILTER_VERSION, + OPTION_MILTER_PROTO, + OPTION_MILTER_ACTS, OPTION_NO_INTERACTIVE, OPTION_PROMPT, OPTION_STATEDIR @@ -322,8 +328,12 @@ static struct argp_option options[] = { { "body-chunk", OPTION_BODY_CHUNK, N_("NUMBER"), 0, N_("Set the body chunk for xxfi_body calls"), GRP+1 }, - { "milter-version", OPTION_MILTER_VERSION, N_("NUMBER"), 0, + { "milter-version", OPTION_MILTER_VERSION, N_("VER"), 0, N_("Force using the given Milter protocol version number"), GRP+1 }, + { "milter-actions", OPTION_MILTER_ACTS, N_("BITMASK"), 0, + N_("Force the given Milter actions"), GRP+1 }, + { "milter-proto", OPTION_MILTER_PROTO, N_("BITMASK"), 0, + N_("Set Milter protocol capabilities"), GRP+1 }, #undef GRP #define GRP 20 @@ -343,6 +353,8 @@ static struct argp_option options[] = { { "verbose", 'v', NULL, 0, N_("Increase verbosity level"), GRP+1 }, + { "gacopyz-log", OPTION_GACOPYZ_LOG, N_("LEVEL"), 0, + N_("Set Gacopyz log level"), GRP+1 }, #undef GRP #define GRP 40 @@ -369,6 +381,31 @@ char *trace_name = NULL; int append; int statedir_option; +static unsigned long +parse_version (char *arg, struct argp_state *state) +{ + char *p; + unsigned long maj, min, pat; + + maj = strtoul (arg, &p, 0); + if (*p == 0) + return maj; + else if (*p == '.') + { + min = strtoul (p + 1, &p, 0); + if (*p == '.') + { + pat = strtoul (p + 1, &p, 0); + if (*p == 0) + return GACOPYZ_SM_MKVER (maj, min, pat); + } + else if (*p == 0) + return GACOPYZ_SM_MKVER (maj, min, 0); + } + argp_error (state, _("invalid version syntax (near %s)"), p); + return 0; +} + static error_t parse_opt (int key, char *arg, struct argp_state *state) { @@ -392,11 +429,19 @@ parse_opt (int key, char *arg, struct argp_state *state) break; default: - mu_error (_("unsupported mode")); - exit (EX_USAGE); + argp_error (state, _("unsupported mode")); } break; + case OPTION_GACOPYZ_LOG: + { + int lev = gacopyz_string_to_log_level(arg); + if (lev == -1) + argp_error(state, _("%s: invalid log level"), arg); + gacopyz_log_mask = SMI_LOG_FROM (lev); + } + break; + case OPTION_STDIO: mta_mode = mta_stdio; break; @@ -447,21 +492,25 @@ parse_opt (int key, char *arg, struct argp_state *state) case OPTION_BODY_CHUNK: max_body_chunk = strtoul (arg, &p, 0); if (*p) - { - mu_error (_("invalid number: %s"), arg); - exit (EX_USAGE); - } + argp_error (state, _("invalid number: %s"), arg); break; case OPTION_MILTER_VERSION: - milter_version_option = strtoul (arg, &p, 0); + milter_version_option = parse_version (arg, state); + break; + + case OPTION_MILTER_PROTO: + milter_proto_option = strtoul (arg, &p, 0); if (*p) - { - mu_error (_("invalid number: %s"), arg); - exit (EX_USAGE); - } + argp_error (state, _("invalid number: %s"), arg); break; + case OPTION_MILTER_ACTS: + milter_acts_option = strtoul (arg, &p, 0); + if (*p) + argp_error (state, _("invalid number: %s"), arg); + break; + #ifdef WITH_READLINE case OPTION_NO_INTERACTIVE: interactive = 0; @@ -766,20 +815,23 @@ main (int argc, char **argv) if (milter_port) { int rc; - int mask = SMI_DEFAULT_LOG_MASK; - - if (verbose) - mask |= SMI_LOG_MASK (SMI_LOG_DEBUG); + if (gacopyz_log_mask == 0) + { + gacopyz_log_mask = SMI_DEFAULT_LOG_MASK; + if (verbose) + gacopyz_log_mask |= SMI_LOG_MASK (SMI_LOG_DEBUG); + } + gacopyz_set_logger (gacopyz_stderr_log_printer); if (strcmp (milter_port, "auto") == 0) start_mailfromd (argc, argv); if (portspec_p (milter_port)) - rc = gacopyz_srv_create (&gsrv, "Test", milter_port, mask); + rc = gacopyz_srv_create (&gsrv, "Test", milter_port, gacopyz_log_mask); else - rc = gacopyz_srv_create_X (&gsrv, milter_port, mask); + rc = gacopyz_srv_create_X (&gsrv, milter_port, gacopyz_log_mask); if (rc != MI_SUCCESS) { @@ -788,8 +840,25 @@ main (int argc, char **argv) } if (milter_version_option) - gacopyz_srv_set_version (gsrv, milter_version_option); + { + unsigned long acts = SMFI_DEFAULT_ACTS, proto = SMFI_DEFAULT_PROT; + + if (milter_version_option == 2 || milter_version_option == 3) + { + acts = SMFI_V2_ACTS; + proto = SMFI_V2_PROT; + } + + gacopyz_srv_set_version (gsrv, milter_version_option); + gacopyz_srv_set_protocol (gsrv, proto); + gacopyz_srv_set_actions (gsrv, acts); + } + if (milter_proto_option) + gacopyz_srv_set_protocol (gsrv, milter_proto_option); + if (milter_acts_option) + gacopyz_srv_set_actions (gsrv, milter_acts_option); + gacopyz_srv_set_all_timeouts (gsrv, milter_timeouts); if (gacopyz_srv_connect (gsrv) != MI_SUCCESS) @@ -823,7 +892,7 @@ static void *in, *out; static const char * _def_strerror (int rc) { - return rc == -1 ? "end of file reached" : strerror (rc); + return rc == -1 ? _("end of file reached") : strerror (rc); } static int |