aboutsummaryrefslogtreecommitdiff
path: root/mtasim/mtasim.c
diff options
context:
space:
mode:
Diffstat (limited to 'mtasim/mtasim.c')
-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);
102/* Milter-related options */ 102/* Milter-related options */
103char *milter_port; 103char *milter_port;
104size_t max_body_chunk = 65535; 104size_t max_body_chunk = 65535;
105int milter_version_option = 0; 105unsigned long milter_version_option = 0;
106unsigned long milter_proto_option = 0;
107unsigned long milter_acts_option = 0;
108int gacopyz_log_mask;
106struct timeval milter_timeouts[GACOPYZ_TO_COUNT] = { 109struct timeval milter_timeouts[GACOPYZ_TO_COUNT] = {
107 { GACOPYZ_WRITE_TIMEOUT, 0 }, 110 { GACOPYZ_WRITE_TIMEOUT, 0 },
108 { GACOPYZ_READ_TIMEOUT, 0 }, 111 { GACOPYZ_READ_TIMEOUT, 0 },
@@ -268,6 +271,7 @@ static char doc[] = N_("mtasim -- MTA simulator for mailfromd");
268 271
269enum { 272enum {
270 OPTION_STDIO = 128, 273 OPTION_STDIO = 128,
274 OPTION_GACOPYZ_LOG,
271 OPTION_DAEMON, 275 OPTION_DAEMON,
272 OPTION_TLS_CERT, 276 OPTION_TLS_CERT,
273 OPTION_TLS_CA, 277 OPTION_TLS_CA,
@@ -275,6 +279,8 @@ enum {
275 OPTION_TRACE_FILE, 279 OPTION_TRACE_FILE,
276 OPTION_BODY_CHUNK, 280 OPTION_BODY_CHUNK,
277 OPTION_MILTER_VERSION, 281 OPTION_MILTER_VERSION,
282 OPTION_MILTER_PROTO,
283 OPTION_MILTER_ACTS,
278 OPTION_NO_INTERACTIVE, 284 OPTION_NO_INTERACTIVE,
279 OPTION_PROMPT, 285 OPTION_PROMPT,
280 OPTION_STATEDIR 286 OPTION_STATEDIR
@@ -322,8 +328,12 @@ static struct argp_option options[] = {
322 { "body-chunk", OPTION_BODY_CHUNK, N_("NUMBER"), 0, 328 { "body-chunk", OPTION_BODY_CHUNK, N_("NUMBER"), 0,
323 N_("Set the body chunk for xxfi_body calls"), 329 N_("Set the body chunk for xxfi_body calls"),
324 GRP+1 }, 330 GRP+1 },
325 { "milter-version", OPTION_MILTER_VERSION, N_("NUMBER"), 0, 331 { "milter-version", OPTION_MILTER_VERSION, N_("VER"), 0,
326 N_("Force using the given Milter protocol version number"), GRP+1 }, 332 N_("Force using the given Milter protocol version number"), GRP+1 },
333 { "milter-actions", OPTION_MILTER_ACTS, N_("BITMASK"), 0,
334 N_("Force the given Milter actions"), GRP+1 },
335 { "milter-proto", OPTION_MILTER_PROTO, N_("BITMASK"), 0,
336 N_("Set Milter protocol capabilities"), GRP+1 },
327#undef GRP 337#undef GRP
328 338
329#define GRP 20 339#define GRP 20
@@ -343,6 +353,8 @@ static struct argp_option options[] = {
343 { "verbose", 'v', NULL, 0, 353 { "verbose", 'v', NULL, 0,
344 N_("Increase verbosity level"), 354 N_("Increase verbosity level"),
345 GRP+1 }, 355 GRP+1 },
356 { "gacopyz-log", OPTION_GACOPYZ_LOG, N_("LEVEL"), 0,
357 N_("Set Gacopyz log level"), GRP+1 },
346#undef GRP 358#undef GRP
347 359
348#define GRP 40 360#define GRP 40
@@ -369,6 +381,31 @@ char *trace_name = NULL;
369int append; 381int append;
370int statedir_option; 382int statedir_option;
371 383
384static unsigned long
385parse_version (char *arg, struct argp_state *state)
386{
387 char *p;
388 unsigned long maj, min, pat;
389
390 maj = strtoul (arg, &p, 0);
391 if (*p == 0)
392 return maj;
393 else if (*p == '.')
394 {
395 min = strtoul (p + 1, &p, 0);
396 if (*p == '.')
397 {
398 pat = strtoul (p + 1, &p, 0);
399 if (*p == 0)
400 return GACOPYZ_SM_MKVER (maj, min, pat);
401 }
402 else if (*p == 0)
403 return GACOPYZ_SM_MKVER (maj, min, 0);
404 }
405 argp_error (state, _("invalid version syntax (near %s)"), p);
406 return 0;
407}
408
372static error_t 409static error_t
373parse_opt (int key, char *arg, struct argp_state *state) 410parse_opt (int key, char *arg, struct argp_state *state)
374{ 411{
@@ -392,11 +429,19 @@ parse_opt (int key, char *arg, struct argp_state *state)
392 break; 429 break;
393 430
394 default: 431 default:
395 mu_error (_("unsupported mode")); 432 argp_error (state, _("unsupported mode"));
396 exit (EX_USAGE);
397 } 433 }
398 break; 434 break;
399 435
436 case OPTION_GACOPYZ_LOG:
437 {
438 int lev = gacopyz_string_to_log_level(arg);
439 if (lev == -1)
440 argp_error(state, _("%s: invalid log level"), arg);
441 gacopyz_log_mask = SMI_LOG_FROM (lev);
442 }
443 break;
444
400 case OPTION_STDIO: 445 case OPTION_STDIO:
401 mta_mode = mta_stdio; 446 mta_mode = mta_stdio;
402 break; 447 break;
@@ -447,21 +492,25 @@ parse_opt (int key, char *arg, struct argp_state *state)
447 case OPTION_BODY_CHUNK: 492 case OPTION_BODY_CHUNK:
448 max_body_chunk = strtoul (arg, &p, 0); 493 max_body_chunk = strtoul (arg, &p, 0);
449 if (*p) 494 if (*p)
450 { 495 argp_error (state, _("invalid number: %s"), arg);
451 mu_error (_("invalid number: %s"), arg);
452 exit (EX_USAGE);
453 }
454 break; 496 break;
455 497
456 case OPTION_MILTER_VERSION: 498 case OPTION_MILTER_VERSION:
457 milter_version_option = strtoul (arg, &p, 0); 499 milter_version_option = parse_version (arg, state);
500 break;
501
502 case OPTION_MILTER_PROTO:
503 milter_proto_option = strtoul (arg, &p, 0);
458 if (*p) 504 if (*p)
459 { 505 argp_error (state, _("invalid number: %s"), arg);
460 mu_error (_("invalid number: %s"), arg);
461 exit (EX_USAGE);
462 }
463 break; 506 break;
464 507
508 case OPTION_MILTER_ACTS:
509 milter_acts_option = strtoul (arg, &p, 0);
510 if (*p)
511 argp_error (state, _("invalid number: %s"), arg);
512 break;
513
465#ifdef WITH_READLINE 514#ifdef WITH_READLINE
466 case OPTION_NO_INTERACTIVE: 515 case OPTION_NO_INTERACTIVE:
467 interactive = 0; 516 interactive = 0;
@@ -766,20 +815,23 @@ main (int argc, char **argv)
766 if (milter_port) 815 if (milter_port)
767 { 816 {
768 int rc; 817 int rc;
769 int mask = SMI_DEFAULT_LOG_MASK;
770
771 if (verbose)
772 mask |= SMI_LOG_MASK (SMI_LOG_DEBUG);
773 818
819 if (gacopyz_log_mask == 0)
820 {
821 gacopyz_log_mask = SMI_DEFAULT_LOG_MASK;
822 if (verbose)
823 gacopyz_log_mask |= SMI_LOG_MASK (SMI_LOG_DEBUG);
824 }
825
774 gacopyz_set_logger (gacopyz_stderr_log_printer); 826 gacopyz_set_logger (gacopyz_stderr_log_printer);
775 827
776 if (strcmp (milter_port, "auto") == 0) 828 if (strcmp (milter_port, "auto") == 0)
777 start_mailfromd (argc, argv); 829 start_mailfromd (argc, argv);
778 830
779 if (portspec_p (milter_port)) 831 if (portspec_p (milter_port))
780 rc = gacopyz_srv_create (&gsrv, "Test", milter_port, mask); 832 rc = gacopyz_srv_create (&gsrv, "Test", milter_port, gacopyz_log_mask);
781 else 833 else
782 rc = gacopyz_srv_create_X (&gsrv, milter_port, mask); 834 rc = gacopyz_srv_create_X (&gsrv, milter_port, gacopyz_log_mask);
783 835
784 if (rc != MI_SUCCESS) 836 if (rc != MI_SUCCESS)
785 { 837 {
@@ -788,8 +840,25 @@ main (int argc, char **argv)
788 } 840 }
789 841
790 if (milter_version_option) 842 if (milter_version_option)
791 gacopyz_srv_set_version (gsrv, milter_version_option); 843 {
844 unsigned long acts = SMFI_DEFAULT_ACTS, proto = SMFI_DEFAULT_PROT;
845
846 if (milter_version_option == 2 || milter_version_option == 3)
847 {
848 acts = SMFI_V2_ACTS;
849 proto = SMFI_V2_PROT;
850 }
851
852 gacopyz_srv_set_version (gsrv, milter_version_option);
853 gacopyz_srv_set_protocol (gsrv, proto);
854 gacopyz_srv_set_actions (gsrv, acts);
855 }
792 856
857 if (milter_proto_option)
858 gacopyz_srv_set_protocol (gsrv, milter_proto_option);
859 if (milter_acts_option)
860 gacopyz_srv_set_actions (gsrv, milter_acts_option);
861
793 gacopyz_srv_set_all_timeouts (gsrv, milter_timeouts); 862 gacopyz_srv_set_all_timeouts (gsrv, milter_timeouts);
794 863
795 if (gacopyz_srv_connect (gsrv) != MI_SUCCESS) 864 if (gacopyz_srv_connect (gsrv) != MI_SUCCESS)
@@ -823,7 +892,7 @@ static void *in, *out;
823static const char * 892static const char *
824_def_strerror (int rc) 893_def_strerror (int rc)
825{ 894{
826 return rc == -1 ? "end of file reached" : strerror (rc); 895 return rc == -1 ? _("end of file reached") : strerror (rc);
827}