aboutsummaryrefslogtreecommitdiff
path: root/mtasim
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-05-07 15:17:34 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2009-05-07 15:17:34 +0300
commit05a8bb0ca988f41f016420ffc7dde427e423c187 (patch)
treefff58297f073bec8148c2d5468a45d592eab0379 /mtasim
parent9f8f65324491b4186f4fd3c2580a8e0b14a248d9 (diff)
downloadmailfromd-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.c111
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

Return to:

Send suggestions and report system problems to the System administrator.