- 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
- {
- fprintf(stderr, "exim: file name expected after %s\n", argv[i-1]);
- exit(EXIT_FAILURE);
- }
- }
-
- /* -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
- {
- fprintf(stderr, "exim: file name expected after %s\n", argv[i-1]);
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- if (++i >= argc)
- {
- fprintf(stderr, "exim: string expected after %s\n", arg);
- exit(EXIT_FAILURE);
- }
- 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;
-
- /* -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 = f.daemon_scion = 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;
+ else 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 = exim_str_fail_toolong(argv[i], EXIM_DOMAINNAME_MAX, "-bfd");
+ else if (Ustrcmp(argrest, "l") == 0) ftest_localpart = exim_str_fail_toolong(argv[i], EXIM_LOCALPART_MAX, "-bfl");
+ else if (Ustrcmp(argrest, "p") == 0) ftest_prefix = exim_str_fail_toolong(argv[i], EXIM_LOCALPART_MAX, "-bfp");
+ else if (Ustrcmp(argrest, "s") == 0) ftest_suffix = exim_str_fail_toolong(argv[i], EXIM_LOCALPART_MAX, "-bfs");
+ 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 = string_copy_taint(
+ exim_str_fail_toolong(argv[i], EXIM_IPADDR_MAX, "-bh"),
+ GET_TAINTED);
+ 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;
+ }