X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=inline;f=src%2Fsrc%2Fexim.c;h=98174d61a2bfc444964d6da62339ec4ad4f7424e;hb=777cc7485cb3242eb627fbd9fa004b7a4e58ae92;hp=af4b525591c6140988e9773107d24bc404656c69;hpb=ccbb15c9d7d7cac10228311aa1c7e448343a345d;p=exim.git diff --git a/src/src/exim.c b/src/src/exim.c index af4b52559..98174d61a 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -110,7 +110,7 @@ if (use_malloc) pcre_free = function_store_free; } if (caseless) options |= PCRE_CASELESS; -yield = pcre_compile(CCS pattern, options, (const char **)&error, &offset, NULL); +yield = pcre_compile(CCS pattern, options, CCSS &error, &offset, NULL); pcre_malloc = function_store_get; pcre_free = function_dummy_free; if (yield == NULL) @@ -1265,9 +1265,9 @@ void *dlhandle; void *dlhandle_curses = dlopen("libcurses." DYNLIB_FN_EXT, RTLD_GLOBAL|RTLD_LAZY); dlhandle = dlopen("libreadline." DYNLIB_FN_EXT, RTLD_GLOBAL|RTLD_NOW); -if (dlhandle_curses != NULL) dlclose(dlhandle_curses); +if (dlhandle_curses) dlclose(dlhandle_curses); -if (dlhandle != NULL) +if (dlhandle) { /* Checked manual pages; at least in GNU Readline 6.1, the prototypes are: * char * readline (const char *prompt); @@ -1277,9 +1277,7 @@ if (dlhandle != NULL) *fn_addhist_ptr = (void(*)(const char*))dlsym(dlhandle, "add_history"); } else - { DEBUG(D_any) debug_printf("failed to load readline: %s\n", dlerror()); - } return dlhandle; } @@ -2041,7 +2039,7 @@ for (i = 1; i < argc; i++) ignore = TRUE; break; } - if (!ignore) { badarg = TRUE; break; } + if (!ignore) badarg = TRUE; } break; @@ -2049,283 +2047,291 @@ for (i = 1; i < argc; i++) so has no need of it. */ case 'B': - if (*argrest == 0) i++; /* Skip over the type */ + if (!*argrest) i++; /* Skip over the type */ break; case 'b': - receiving_message = FALSE; /* Reset TRUE for -bm, -bS, -bs below */ - - /* -bd: Run in daemon mode, awaiting SMTP connections. - -bdf: Ditto, but in the foreground. - */ - - if (*argrest == 'd') - { - f.daemon_listen = TRUE; - if (*(++argrest) == 'f') f.background_daemon = FALSE; - else if (*argrest != 0) { badarg = TRUE; break; } - } - - /* -be: Run in expansion test mode - -bem: Ditto, but read a message from a file first - */ - - else if (*argrest == 'e') - { - expansion_test = checking = TRUE; - if (argrest[1] == 'm') - { - if (++i >= argc) { badarg = TRUE; break; } - expansion_test_message = argv[i]; - argrest++; - } - if (argrest[1] != 0) { badarg = TRUE; break; } - } - - /* -bF: Run system filter test */ - - else if (*argrest == 'F') - { - filter_test |= checking = FTEST_SYSTEM; - if (*(++argrest) != 0) { badarg = TRUE; break; } - if (++i < argc) filter_test_sfile = argv[i]; else - exim_fail("exim: file name expected after %s\n", argv[i-1]); - } - - /* -bf: Run user filter test - -bfd: Set domain for filter testing - -bfl: Set local part for filter testing - -bfp: Set prefix for filter testing - -bfs: Set suffix for filter testing - */ - - else if (*argrest == 'f') - { - if (*(++argrest) == 0) - { - filter_test |= checking = FTEST_USER; - if (++i < argc) filter_test_ufile = argv[i]; else - exim_fail("exim: file name expected after %s\n", argv[i-1]); - } - else - { - if (++i >= argc) - exim_fail("exim: string expected after %s\n", arg); - if (Ustrcmp(argrest, "d") == 0) ftest_domain = argv[i]; - else if (Ustrcmp(argrest, "l") == 0) ftest_localpart = argv[i]; - else if (Ustrcmp(argrest, "p") == 0) ftest_prefix = argv[i]; - else if (Ustrcmp(argrest, "s") == 0) ftest_suffix = argv[i]; - else { badarg = TRUE; break; } - } - } - - /* -bh: Host checking - an IP address must follow. */ - - else if (Ustrcmp(argrest, "h") == 0 || Ustrcmp(argrest, "hc") == 0) - { - if (++i >= argc) { badarg = TRUE; break; } - sender_host_address = argv[i]; - host_checking = checking = f.log_testing_mode = TRUE; - f.host_checking_callout = argrest[1] == 'c'; - message_logs = FALSE; - } - - /* -bi: This option is used by sendmail to initialize *the* alias file, - though it has the -oA option to specify a different file. Exim has no - concept of *the* alias file, but since Sun's YP make script calls - sendmail this way, some support must be provided. */ - - else if (Ustrcmp(argrest, "i") == 0) bi_option = TRUE; - - /* -bI: provide information, of the type to follow after a colon. - This is an Exim flag. */ - - else if (argrest[0] == 'I' && Ustrlen(argrest) >= 2 && argrest[1] == ':') - { - uschar *p = &argrest[2]; - info_flag = CMDINFO_HELP; - if (Ustrlen(p)) - { - if (strcmpic(p, CUS"sieve") == 0) - { - info_flag = CMDINFO_SIEVE; - info_stdout = TRUE; - } - else if (strcmpic(p, CUS"dscp") == 0) - { - info_flag = CMDINFO_DSCP; - info_stdout = TRUE; - } - else if (strcmpic(p, CUS"help") == 0) - { - info_stdout = TRUE; - } - } - } - - /* -bm: Accept and deliver message - the default option. Reinstate - receiving_message, which got turned off for all -b options. */ - - else if (Ustrcmp(argrest, "m") == 0) receiving_message = TRUE; - - /* -bmalware: test the filename given for malware */ - - else if (Ustrcmp(argrest, "malware") == 0) - { - if (++i >= argc) { badarg = TRUE; break; } - checking = TRUE; - malware_test_file = argv[i]; - } - - /* -bnq: For locally originating messages, do not qualify unqualified - addresses. In the envelope, this causes errors; in header lines they - just get left. */ - - else if (Ustrcmp(argrest, "nq") == 0) - { - f.allow_unqualified_sender = FALSE; - f.allow_unqualified_recipient = FALSE; - } - - /* -bpxx: List the contents of the mail queue, in various forms. If - the option is -bpc, just a queue count is needed. Otherwise, if the - first letter after p is r, then order is random. */ - - else if (*argrest == 'p') { - if (*(++argrest) == 'c') - { - count_queue = TRUE; - if (*(++argrest) != 0) badarg = TRUE; - break; - } - - if (*argrest == 'r') - { - list_queue_option = 8; - argrest++; - } - else list_queue_option = 0; - - list_queue = TRUE; - - /* -bp: List the contents of the mail queue, top-level only */ - - if (*argrest == 0) {} - - /* -bpu: List the contents of the mail queue, top-level undelivered */ - - else if (Ustrcmp(argrest, "u") == 0) list_queue_option += 1; + receiving_message = FALSE; /* Reset TRUE for -bm, -bS, -bs below */ - /* -bpa: List the contents of the mail queue, including all delivered */ - - else if (Ustrcmp(argrest, "a") == 0) list_queue_option += 2; - - /* Unknown after -bp[r] */ - - else - { - badarg = TRUE; - break; - } - } - - - /* -bP: List the configuration variables given as the address list. - Force -v, so configuration errors get displayed. */ - - else if (Ustrcmp(argrest, "P") == 0) - { - /* -bP config: we need to setup here, because later, - * when list_options is checked, the config is read already */ - if (argv[i+1] && Ustrcmp(argv[i+1], "config") == 0) - { - list_config = TRUE; - readconf_save_config(version_string); - } - else - { - list_options = TRUE; - debug_selector |= D_v; - debug_file = stderr; - } - } - - /* -brt: Test retry configuration lookup */ - - else if (Ustrcmp(argrest, "rt") == 0) - { - checking = TRUE; - test_retry_arg = i + 1; - goto END_ARG; - } - - /* -brw: Test rewrite configuration */ + switch (*argrest++) + { + /* -bd: Run in daemon mode, awaiting SMTP connections. + -bdf: Ditto, but in the foreground. + */ + case 'd': + f.daemon_listen = TRUE; + if (*argrest == 'f') f.background_daemon = FALSE; + else if (*argrest) badarg = TRUE; + break; + + /* -be: Run in expansion test mode + -bem: Ditto, but read a message from a file first + */ + case 'e': + expansion_test = checking = TRUE; + if (*argrest == 'm') + { + if (++i >= argc) { badarg = TRUE; break; } + expansion_test_message = argv[i]; + argrest++; + } + if (*argrest) badarg = TRUE; + break; + + /* -bF: Run system filter test */ + case 'F': + filter_test |= checking = FTEST_SYSTEM; + if (*argrest) { badarg = TRUE; break; } + if (++i < argc) filter_test_sfile = argv[i]; else + exim_fail("exim: file name expected after %s\n", argv[i-1]); + break; + + /* -bf: Run user filter test + -bfd: Set domain for filter testing + -bfl: Set local part for filter testing + -bfp: Set prefix for filter testing + -bfs: Set suffix for filter testing + */ + case 'f': + if (!*argrest) + { + filter_test |= checking = FTEST_USER; + if (++i < argc) filter_test_ufile = argv[i]; + else exim_fail("exim: file name expected after %s\n", argv[i-1]); + } + else + { + if (++i >= argc) + exim_fail("exim: string expected after %s\n", arg); + if (Ustrcmp(argrest, "d") == 0) ftest_domain = argv[i]; + else if (Ustrcmp(argrest, "l") == 0) ftest_localpart = argv[i]; + else if (Ustrcmp(argrest, "p") == 0) ftest_prefix = argv[i]; + else if (Ustrcmp(argrest, "s") == 0) ftest_suffix = argv[i]; + else badarg = TRUE; + } + break; + + /* -bh: Host checking - an IP address must follow. */ + case 'h': + if (!*argrest || Ustrcmp(argrest, "c") == 0) + { + if (++i >= argc) { badarg = TRUE; break; } + sender_host_address = argv[i]; + host_checking = checking = f.log_testing_mode = TRUE; + f.host_checking_callout = *argrest == 'c'; + message_logs = FALSE; + } + else badarg = TRUE; + break; + + /* -bi: This option is used by sendmail to initialize *the* alias file, + though it has the -oA option to specify a different file. Exim has no + concept of *the* alias file, but since Sun's YP make script calls + sendmail this way, some support must be provided. */ + case 'i': + if (!*++argrest) bi_option = TRUE; + else badarg = TRUE; + break; + + /* -bI: provide information, of the type to follow after a colon. + This is an Exim flag. */ + case 'I': + if (Ustrlen(argrest) >= 1 && *argrest == ':') + { + uschar *p = argrest+1; + info_flag = CMDINFO_HELP; + if (Ustrlen(p)) + if (strcmpic(p, CUS"sieve") == 0) + { + info_flag = CMDINFO_SIEVE; + info_stdout = TRUE; + } + else if (strcmpic(p, CUS"dscp") == 0) + { + info_flag = CMDINFO_DSCP; + info_stdout = TRUE; + } + else if (strcmpic(p, CUS"help") == 0) + info_stdout = TRUE; + } + else badarg = TRUE; + break; + + /* -bm: Accept and deliver message - the default option. Reinstate + receiving_message, which got turned off for all -b options. + -bmalware: test the filename given for malware */ + case 'm': + if (!*argrest) receiving_message = TRUE; + else if (Ustrcmp(argrest, "alware") == 0) + { + if (++i >= argc) { badarg = TRUE; break; } + checking = TRUE; + malware_test_file = argv[i]; + } + else badarg = TRUE; + break; + + /* -bnq: For locally originating messages, do not qualify unqualified + addresses. In the envelope, this causes errors; in header lines they + just get left. */ + case 'n': + if (Ustrcmp(argrest, "q") == 0) + { + f.allow_unqualified_sender = FALSE; + f.allow_unqualified_recipient = FALSE; + } + else badarg = TRUE; + break; + + /* -bpxx: List the contents of the mail queue, in various forms. If + the option is -bpc, just a queue count is needed. Otherwise, if the + first letter after p is r, then order is random. */ + case 'p': + if (*argrest == 'c') + { + count_queue = TRUE; + if (*++argrest) badarg = TRUE; + break; + } - else if (Ustrcmp(argrest, "rw") == 0) - { - checking = TRUE; - test_rewrite_arg = i + 1; - goto END_ARG; - } + if (*argrest == 'r') + { + list_queue_option = 8; + argrest++; + } + else list_queue_option = 0; - /* -bS: Read SMTP commands on standard input, but produce no replies - - all errors are reported by sending messages. */ + list_queue = TRUE; - else if (Ustrcmp(argrest, "S") == 0) - smtp_input = smtp_batched_input = receiving_message = TRUE; + /* -bp: List the contents of the mail queue, top-level only */ - /* -bs: Read SMTP commands on standard input and produce SMTP replies - on standard output. */ + if (!*argrest) {} - else if (Ustrcmp(argrest, "s") == 0) smtp_input = receiving_message = TRUE; + /* -bpu: List the contents of the mail queue, top-level undelivered */ - /* -bt: address testing mode */ + else if (Ustrcmp(argrest, "u") == 0) list_queue_option += 1; - else if (Ustrcmp(argrest, "t") == 0) - f.address_test_mode = checking = f.log_testing_mode = TRUE; + /* -bpa: List the contents of the mail queue, including all delivered */ - /* -bv: verify addresses */ + else if (Ustrcmp(argrest, "a") == 0) list_queue_option += 2; - else if (Ustrcmp(argrest, "v") == 0) - verify_address_mode = checking = f.log_testing_mode = TRUE; + /* Unknown after -bp[r] */ - /* -bvs: verify sender addresses */ + else badarg = TRUE; + break; - else if (Ustrcmp(argrest, "vs") == 0) - { - verify_address_mode = checking = f.log_testing_mode = TRUE; - verify_as_sender = TRUE; - } - /* -bV: Print version string and support details */ + /* -bP: List the configuration variables given as the address list. + Force -v, so configuration errors get displayed. */ + case 'P': - else if (Ustrcmp(argrest, "V") == 0) - { - printf("Exim version %s #%s built %s\n", version_string, - version_cnumber, version_date); - printf("%s\n", CS version_copyright); - version_printed = TRUE; - show_whats_supported(stdout); - f.log_testing_mode = TRUE; - } + /* -bP config: we need to setup here, because later, + * when list_options is checked, the config is read already */ + if (*argrest) + badarg = TRUE; + else if (argv[i+1] && Ustrcmp(argv[i+1], "config") == 0) + { + list_config = TRUE; + readconf_save_config(version_string); + } + else + { + list_options = TRUE; + debug_selector |= D_v; + debug_file = stderr; + } + break; + + /* -brt: Test retry configuration lookup */ + case 'r': + if (Ustrcmp(argrest, "t") == 0) + { + checking = TRUE; + test_retry_arg = i + 1; + goto END_ARG; + } - /* -bw: inetd wait mode, accept a listening socket as stdin */ + /* -brw: Test rewrite configuration */ - else if (*argrest == 'w') - { - f.inetd_wait_mode = TRUE; - f.background_daemon = FALSE; - f.daemon_listen = TRUE; - if (*(++argrest) != '\0') - if ((inetd_wait_timeout = readconf_readtime(argrest, 0, FALSE)) <= 0) - exim_fail("exim: bad time value %s: abandoned\n", argv[i]); + else if (Ustrcmp(argrest, "w") == 0) + { + checking = TRUE; + test_rewrite_arg = i + 1; + goto END_ARG; + } + else badarg = TRUE; + break; + + /* -bS: Read SMTP commands on standard input, but produce no replies - + all errors are reported by sending messages. */ + case 'S': + if (!*argrest) + smtp_input = smtp_batched_input = receiving_message = TRUE; + else badarg = TRUE; + break; + + /* -bs: Read SMTP commands on standard input and produce SMTP replies + on standard output. */ + case 's': + if (!*argrest) smtp_input = receiving_message = TRUE; + else badarg = TRUE; + break; + + /* -bt: address testing mode */ + case 't': + if (!*argrest) + f.address_test_mode = checking = f.log_testing_mode = TRUE; + else badarg = TRUE; + break; + + /* -bv: verify addresses */ + case 'v': + if (!*argrest) + verify_address_mode = checking = f.log_testing_mode = TRUE; + + /* -bvs: verify sender addresses */ + + else if (Ustrcmp(argrest, "s") == 0) + { + verify_address_mode = checking = f.log_testing_mode = TRUE; + verify_as_sender = TRUE; + } + else badarg = TRUE; + break; + + /* -bV: Print version string and support details */ + case 'V': + if (!*argrest) + { + printf("Exim version %s #%s built %s\n", version_string, + version_cnumber, version_date); + printf("%s\n", CS version_copyright); + version_printed = TRUE; + show_whats_supported(stdout); + f.log_testing_mode = TRUE; + } + else badarg = TRUE; + break; + + /* -bw: inetd wait mode, accept a listening socket as stdin */ + case 'w': + f.inetd_wait_mode = TRUE; + f.background_daemon = FALSE; + f.daemon_listen = TRUE; + if (*argrest) + if ((inetd_wait_timeout = readconf_readtime(argrest, 0, FALSE)) <= 0) + exim_fail("exim: bad time value %s: abandoned\n", argv[i]); + break; + + default: + badarg = TRUE; + break; + } + break; } - else badarg = TRUE; - break; - /* -C: change configuration file list; ignore if it isn't really a change! Enforce a prefix check if required. */ @@ -2953,216 +2959,224 @@ for (i = 1; i < argc; i++) case 'O': if (*argrest == 0) - { if (++i >= argc) exim_fail("exim: string expected after -O\n"); - } break; case 'o': - - /* -oA: Set an argument for the bi command (sendmail's "alternate alias - file" option). */ - - if (*argrest == 'A') - { - alias_arg = argrest + 1; - if (alias_arg[0] == 0) - { - if (i+1 < argc) alias_arg = argv[++i]; else - exim_fail("exim: string expected after -oA\n"); - } - } - - /* -oB: Set a connection message max value for remote deliveries */ - - else if (*argrest == 'B') - { - uschar *p = argrest + 1; - if (p[0] == 0) - { - if (i+1 < argc && isdigit((argv[i+1][0]))) p = argv[++i]; else - { - connection_max_messages = 1; - p = NULL; - } - } - - if (p != NULL) - { - if (!isdigit(*p)) - exim_fail("exim: number expected after -oB\n"); - connection_max_messages = Uatoi(p); - } - } - - /* -odb: background delivery */ - - else if (Ustrcmp(argrest, "db") == 0) - { - f.synchronous_delivery = FALSE; - arg_queue_only = FALSE; - queue_only_set = TRUE; - } - - /* -odf: foreground delivery (smail-compatible option); same effect as - -odi: interactive (synchronous) delivery (sendmail-compatible option) - */ - - else if (Ustrcmp(argrest, "df") == 0 || Ustrcmp(argrest, "di") == 0) + switch (*argrest++) { - f.synchronous_delivery = TRUE; - arg_queue_only = FALSE; - queue_only_set = TRUE; - } - - /* -odq: queue only */ + /* -oA: Set an argument for the bi command (sendmail's "alternate alias + file" option). */ + case 'A': + if (!*(alias_arg = argrest)) + if (i+1 < argc) alias_arg = argv[++i]; + else exim_fail("exim: string expected after -oA\n"); + break; - else if (Ustrcmp(argrest, "dq") == 0) - { - f.synchronous_delivery = FALSE; - arg_queue_only = TRUE; - queue_only_set = TRUE; - } + /* -oB: Set a connection message max value for remote deliveries */ + case 'B': + { + uschar * p = argrest; + if (!*p) + if (i+1 < argc && isdigit((argv[i+1][0]))) + p = argv[++i]; + else + { + connection_max_messages = 1; + p = NULL; + } - /* -odqs: queue SMTP only - do local deliveries and remote routing, - but no remote delivery */ + if (p) + { + if (!isdigit(*p)) + exim_fail("exim: number expected after -oB\n"); + connection_max_messages = Uatoi(p); + } + } + break; - else if (Ustrcmp(argrest, "dqs") == 0) - { - f.queue_smtp = TRUE; - arg_queue_only = FALSE; - queue_only_set = TRUE; - } + /* -odb: background delivery */ + + case 'd': + if (Ustrcmp(argrest, "b") == 0) + { + f.synchronous_delivery = FALSE; + arg_queue_only = FALSE; + queue_only_set = TRUE; + } + + /* -odf: foreground delivery (smail-compatible option); same effect as + -odi: interactive (synchronous) delivery (sendmail-compatible option) + */ + + else if (Ustrcmp(argrest, "f") == 0 || Ustrcmp(argrest, "i") == 0) + { + f.synchronous_delivery = TRUE; + arg_queue_only = FALSE; + queue_only_set = TRUE; + } + + /* -odq: queue only */ + + else if (Ustrcmp(argrest, "q") == 0) + { + f.synchronous_delivery = FALSE; + arg_queue_only = TRUE; + queue_only_set = TRUE; + } + + /* -odqs: queue SMTP only - do local deliveries and remote routing, + but no remote delivery */ + + else if (Ustrcmp(argrest, "qs") == 0) + { + f.queue_smtp = TRUE; + arg_queue_only = FALSE; + queue_only_set = TRUE; + } + else badarg = TRUE; + break; - /* -oex: Sendmail error flags. As these are also accepted without the - leading -o prefix, for compatibility with vacation and other callers, - they are handled with -e above. */ + /* -oex: Sendmail error flags. As these are also accepted without the + leading -o prefix, for compatibility with vacation and other callers, + they are handled with -e above. */ - /* -oi: Set flag so dot doesn't end non-SMTP input (same as -i) - -oitrue: Another sendmail syntax for the same */ + /* -oi: Set flag so dot doesn't end non-SMTP input (same as -i) + -oitrue: Another sendmail syntax for the same */ - else if (Ustrcmp(argrest, "i") == 0 || - Ustrcmp(argrest, "itrue") == 0) - f.dot_ends = FALSE; + case 'i': + if (!*argrest || Ustrcmp(argrest, "true") == 0) + f.dot_ends = FALSE; + else badarg = TRUE; + break; /* -oM*: Set various characteristics for an incoming message; actually acted on for trusted callers only. */ - else if (*argrest == 'M') - { - if (i+1 >= argc) - exim_fail("exim: data expected after -o%s\n", argrest); + case 'M': + { + if (i+1 >= argc) + exim_fail("exim: data expected after -oM%s\n", argrest); - /* -oMa: Set sender host address */ + /* -oMa: Set sender host address */ - if (Ustrcmp(argrest, "Ma") == 0) sender_host_address = argv[++i]; + if (Ustrcmp(argrest, "a") == 0) sender_host_address = argv[++i]; - /* -oMaa: Set authenticator name */ + /* -oMaa: Set authenticator name */ - else if (Ustrcmp(argrest, "Maa") == 0) - sender_host_authenticated = argv[++i]; + else if (Ustrcmp(argrest, "aa") == 0) + sender_host_authenticated = argv[++i]; - /* -oMas: setting authenticated sender */ + /* -oMas: setting authenticated sender */ - else if (Ustrcmp(argrest, "Mas") == 0) - authenticated_sender = string_copy_taint(argv[++i], TRUE); + else if (Ustrcmp(argrest, "as") == 0) + authenticated_sender = string_copy_taint(argv[++i], TRUE); - /* -oMai: setting authenticated id */ + /* -oMai: setting authenticated id */ - else if (Ustrcmp(argrest, "Mai") == 0) - authenticated_id = string_copy_taint(argv[++i], TRUE); + else if (Ustrcmp(argrest, "ai") == 0) + authenticated_id = string_copy_taint(argv[++i], TRUE); - /* -oMi: Set incoming interface address */ + /* -oMi: Set incoming interface address */ - else if (Ustrcmp(argrest, "Mi") == 0) interface_address = argv[++i]; + else if (Ustrcmp(argrest, "i") == 0) interface_address = argv[++i]; - /* -oMm: Message reference */ + /* -oMm: Message reference */ - else if (Ustrcmp(argrest, "Mm") == 0) - { - if (!mac_ismsgid(argv[i+1])) - exim_fail("-oMm must be a valid message ID\n"); - if (!f.trusted_config) - exim_fail("-oMm must be called by a trusted user/config\n"); - message_reference = argv[++i]; - } + else if (Ustrcmp(argrest, "m") == 0) + { + if (!mac_ismsgid(argv[i+1])) + exim_fail("-oMm must be a valid message ID\n"); + if (!f.trusted_config) + exim_fail("-oMm must be called by a trusted user/config\n"); + message_reference = argv[++i]; + } - /* -oMr: Received protocol */ + /* -oMr: Received protocol */ - else if (Ustrcmp(argrest, "Mr") == 0) + else if (Ustrcmp(argrest, "r") == 0) - if (received_protocol) - exim_fail("received_protocol is set already\n"); - else - received_protocol = argv[++i]; - - /* -oMs: Set sender host name */ - - else if (Ustrcmp(argrest, "Ms") == 0) - sender_host_name = string_copy_taint(argv[++i], TRUE); + if (received_protocol) + exim_fail("received_protocol is set already\n"); + else + received_protocol = argv[++i]; - /* -oMt: Set sender ident */ + /* -oMs: Set sender host name */ - else if (Ustrcmp(argrest, "Mt") == 0) - { - sender_ident_set = TRUE; - sender_ident = argv[++i]; - } + else if (Ustrcmp(argrest, "s") == 0) + sender_host_name = string_copy_taint(argv[++i], TRUE); - /* Else a bad argument */ + /* -oMt: Set sender ident */ - else - { - badarg = TRUE; - break; - } - } + else if (Ustrcmp(argrest, "t") == 0) + { + sender_ident_set = TRUE; + sender_ident = argv[++i]; + } - /* -om: Me-too flag for aliases. Exim always does this. Some programs - seem to call this as -m (undocumented), so that is also accepted (see - above). */ + /* Else a bad argument */ - else if (Ustrcmp(argrest, "m") == 0) {} + else + badarg = TRUE; + } + break; - /* -oo: An ancient flag for old-style addresses which still seems to - crop up in some calls (see in SCO). */ + /* -om: Me-too flag for aliases. Exim always does this. Some programs + seem to call this as -m (undocumented), so that is also accepted (see + above). */ + /* -oo: An ancient flag for old-style addresses which still seems to + crop up in some calls (see in SCO). */ - else if (Ustrcmp(argrest, "o") == 0) {} + case 'm': + case 'o': + if (!*argrest) {} + else badarg = TRUE; + break; - /* -oP : set pid file path for daemon - -oPX: delete pid file of daemon */ + /* -oP : set pid file path for daemon + -oPX: delete pid file of daemon */ - else if (Ustrcmp(argrest, "P") == 0) - override_pid_file_path = argv[++i]; + case 'P': + if (!*argrest) override_pid_file_path = argv[++i]; + else if (Ustrcmp(argrest, "X") == 0) delete_pid_file(); + else badarg = TRUE; + break; - else if (Ustrcmp(argrest, "PX") == 0) - delete_pid_file(); - /* -or : set timeout for non-SMTP acceptance - -os : set timeout for SMTP acceptance */ + /* -or : set timeout for non-SMTP acceptance + -os : set timeout for SMTP acceptance */ - else if (*argrest == 'r' || *argrest == 's') - { - int *tp = (*argrest == 'r')? - &arg_receive_timeout : &arg_smtp_receive_timeout; - if (argrest[1] == 0) - { - if (i+1 < argc) *tp= readconf_readtime(argv[++i], 0, FALSE); - } - else *tp = readconf_readtime(argrest + 1, 0, FALSE); - if (*tp < 0) - exim_fail("exim: bad time value %s: abandoned\n", argv[i]); - } + case 'r': + case 's': + if (!*argrest) + { + int *tp = (*argrest == 'r')? + &arg_receive_timeout : &arg_smtp_receive_timeout; + if (argrest[1] == 0) + { + if (i+1 < argc) *tp= readconf_readtime(argv[++i], 0, FALSE); + } + else *tp = readconf_readtime(argrest + 1, 0, FALSE); + if (*tp < 0) + exim_fail("exim: bad time value %s: abandoned\n", argv[i]); + } + else badarg = TRUE; + break; - /* -oX : Override local_interfaces and/or default daemon ports */ + /* -oX : Override local_interfaces and/or default daemon ports */ - else if (Ustrcmp(argrest, "X") == 0) - override_local_interfaces = argv[++i]; + case 'X': + if (!*argrest) + override_local_interfaces = argv[++i]; + else badarg = TRUE; + break; - /* Unknown -o argument */ + /* Unknown -o argument */ - else badarg = TRUE; + default: + badarg = TRUE; + } break; @@ -4368,7 +4382,7 @@ if (msg_action_arg > 0 && msg_action != MSG_DELIVER && msg_action != MSG_LOAD) yield = EXIT_FAILURE; switch (msg_action) { - case MSG_REMOVE: MSG_DELETE: case MSG_FREEZE: case MSG_THAW: break; + case MSG_REMOVE: case MSG_FREEZE: case MSG_THAW: break; default: printf("\n"); break; } } @@ -5029,9 +5043,9 @@ if (host_checking) if (!sender_ident_set) { sender_ident = NULL; - if (f.running_in_test_harness && sender_host_port != 0 && - interface_address != NULL && interface_port != 0) - verify_get_ident(1413); + if (f.running_in_test_harness && sender_host_port + && interface_address && interface_port) + verify_get_ident(1223); /* note hardwired port number */ } /* In case the given address is a non-canonical IPv6 address, canonicalize