diff options
Diffstat (limited to 'mtasim/mtasim.c')
-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); | |||
102 | /* Milter-related options */ | 102 | /* Milter-related options */ |
103 | char *milter_port; | 103 | char *milter_port; |
104 | size_t max_body_chunk = 65535; | 104 | size_t max_body_chunk = 65535; |
105 | int milter_version_option = 0; | 105 | unsigned long milter_version_option = 0; |
106 | unsigned long milter_proto_option = 0; | ||
107 | unsigned long milter_acts_option = 0; | ||
108 | int gacopyz_log_mask; | ||
106 | struct timeval milter_timeouts[GACOPYZ_TO_COUNT] = { | 109 | struct 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 | ||
269 | enum { | 272 | enum { |
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; | |||
369 | int append; | 381 | int append; |
370 | int statedir_option; | 382 | int statedir_option; |
371 | 383 | ||
384 | static unsigned long | ||
385 | parse_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 | |||
372 | static error_t | 409 | static error_t |
373 | parse_opt (int key, char *arg, struct argp_state *state) | 410 | parse_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; | |||
823 | static const char * | 892 | static 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 | } |