8eb602a171f96cab312c7e679f0ab9af46ca9714
[exim.git] / src / src / exim.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) The Exim Maintainers 2020 - 2024 */
6 /* Copyright (c) University of Cambridge 1995 - 2018 */
7 /* See the file NOTICE for conditions of use and distribution. */
8 /* SPDX-License-Identifier: GPL-2.0-or-later */
9
10
11 /* The main function: entry point, initialization, and high-level control.
12 Also a few functions that don't naturally fit elsewhere. */
13
14
15 #include "exim.h"
16
17 #if defined(__GLIBC__) && !defined(__UCLIBC__)
18 # include <gnu/libc-version.h>
19 #endif
20
21 #ifndef _TIME_H
22 # include <time.h>
23 #endif
24 #ifndef NO_EXECINFO
25 # include <execinfo.h>
26 #endif
27
28 #ifdef USE_GNUTLS
29 # include <gnutls/gnutls.h>
30 # if GNUTLS_VERSION_NUMBER < 0x030103 && !defined(DISABLE_OCSP)
31 #  define DISABLE_OCSP
32 # endif
33 #endif
34
35 extern void init_lookup_list(void);
36
37
38
39 /*************************************************
40 *      Function interface to store functions     *
41 *************************************************/
42
43 /* We need some real functions to pass to the PCRE regular expression library
44 for store allocation via Exim's store manager. The normal calls are actually
45 macros that pass over location information to make tracing easier. These
46 functions just interface to the standard macro calls. A good compiler will
47 optimize out the tail recursion and so not make them too expensive. */
48
49 static void *
50 function_store_malloc(PCRE2_SIZE size, void * tag)
51 {
52 if (size > INT_MAX)
53   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "excessive memory alloc request");
54 return store_malloc((int)size);
55 }
56
57 static void
58 function_store_free(void * block, void * tag)
59 {
60 /* At least some version of pcre2 pass a null pointer */
61 if (block) store_free(block);
62 }
63
64
65 static void *
66 function_store_get(PCRE2_SIZE size, void * tag)
67 {
68 if (size > INT_MAX)
69   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "excessive memory alloc request");
70 return store_get((int)size, GET_UNTAINTED);     /* loses track of taint */
71 }
72
73 static void
74 function_store_nullfree(void * block, void * tag)
75 {
76 /* We cannot free memory allocated using store_get() */
77 }
78
79
80
81
82 /*************************************************
83 *         Enums for cmdline interface            *
84 *************************************************/
85
86 enum commandline_info { CMDINFO_NONE=0,
87   CMDINFO_HELP, CMDINFO_SIEVE, CMDINFO_DSCP };
88
89
90
91
92 static void
93 pcre_init(void)
94 {
95 pcre_mlc_ctx = pcre2_general_context_create(function_store_malloc, function_store_free, NULL);
96 pcre_gen_ctx = pcre2_general_context_create(function_store_get, function_store_nullfree, NULL);
97
98 pcre_mlc_cmp_ctx = pcre2_compile_context_create(pcre_mlc_ctx);
99 pcre_gen_cmp_ctx = pcre2_compile_context_create(pcre_gen_ctx);
100
101 pcre_gen_mtc_ctx = pcre2_match_context_create(pcre_gen_ctx);
102 }
103
104
105
106
107 /*************************************************
108 *   Execute regular expression and set strings   *
109 *************************************************/
110
111 /* This function runs a regular expression match, and sets up the pointers to
112 the matched substrings.  The matched strings are copied so the lifetime of
113 the subject is not a problem.  Matched strings will have the same taint status
114 as the subject string (this is not a de-taint method, and must not be made so
115 given the support for wildcards in REs).
116
117 Arguments:
118   re          the compiled expression
119   subject     the subject string
120   options     additional PCRE options
121   setup       if < 0 do full setup
122               if >= 0 setup from setup+1 onwards,
123                 excluding the full matched string
124
125 Returns:      TRUE if matched, or FALSE
126 */
127
128 BOOL
129 regex_match_and_setup(const pcre2_code * re, const uschar * subject, int options, int setup)
130 {
131 pcre2_match_data * md = pcre2_match_data_create_from_pattern(re, pcre_gen_ctx);
132 int res = pcre2_match(re, (PCRE2_SPTR)subject, PCRE2_ZERO_TERMINATED, 0,
133                         PCRE_EOPT | options, md, pcre_gen_mtc_ctx);
134 BOOL yield;
135
136 if ((yield = (res >= 0)))
137   {
138   PCRE2_SIZE * ovec = pcre2_get_ovector_pointer(md);
139   res = pcre2_get_ovector_count(md);
140   expand_nmax = setup < 0 ? 0 : setup + 1;
141   for (int matchnum = setup < 0 ? 0 : 1; matchnum < res; matchnum++)
142     {
143     /* Although PCRE2 has a pcre2_substring_get_bynumber() conveneience, it
144     seems to return a bad pointer when a capture group had no data, eg. (.*)
145     matching zero letters.  So use the underlying ovec and hope (!) that the
146     offsets are sane (including that case).  Should we go further and range-
147     check each one vs. the subject string length? */
148     int off = matchnum * 2;
149     int len = ovec[off + 1] - ovec[off];
150     expand_nstring[expand_nmax] = string_copyn(subject + ovec[off], len);
151     expand_nlength[expand_nmax++] = len;
152     }
153   expand_nmax--;
154   }
155 else if (res != PCRE2_ERROR_NOMATCH) DEBUG(D_any)
156   {
157   uschar errbuf[128];
158   pcre2_get_error_message(res, errbuf, sizeof(errbuf));
159   debug_printf_indent("pcre2: %s\n", errbuf);
160   }
161 /* pcre2_match_data_free(md);   gen ctx needs no free */
162 return yield;
163 }
164
165
166 /* Check just for match with regex.  Uses the common memory-handling.
167
168 Arguments:
169         re      compiled regex
170         subject string to be checked
171         slen    length of subject; -1 for nul-terminated
172         rptr    pointer for matched string, copied, or NULL
173
174 Return: TRUE for a match.
175 */
176
177 BOOL
178 regex_match(const pcre2_code * re, const uschar * subject, int slen, uschar ** rptr)
179 {
180 pcre2_match_data * md = pcre2_match_data_create(1, pcre_gen_ctx);
181 int rc = pcre2_match(re, (PCRE2_SPTR)subject,
182                       slen >= 0 ? slen : PCRE2_ZERO_TERMINATED,
183                       0, PCRE_EOPT, md, pcre_gen_mtc_ctx);
184 PCRE2_SIZE * ovec = pcre2_get_ovector_pointer(md);
185 BOOL ret = FALSE;
186
187 if (rc >= 0)
188   {
189   if (rptr)
190     *rptr = string_copyn(subject + ovec[0], ovec[1] - ovec[0]);
191   ret = TRUE;
192   }
193 /* pcre2_match_data_free(md);   gen ctx needs no free */
194 return ret;
195 }
196
197
198
199 /*************************************************
200 *            Set up processing details           *
201 *************************************************/
202
203 /* Save a text string for dumping when SIGUSR1 is received.
204 Do checks for overruns.
205
206 Arguments: format and arguments, as for printf()
207 Returns:   nothing
208 */
209
210 void
211 set_process_info(const char * format, ...)
212 {
213 gstring gs = { .size = PROCESS_INFO_SIZE - 2, .ptr = 0, .s = process_info };
214 gstring * g;
215 int len;
216 uschar * s;
217 va_list ap;
218
219 g = string_fmt_append(&gs, "%5d ", (int)getpid());
220 len = gstring_length(g);
221 va_start(ap, format);
222 if (!string_vformat(g, 0, format, ap))
223   {
224   gs.ptr = len;
225   g = string_cat(&gs, US"**** string overflowed buffer ****");
226   }
227 g = string_catn(g, US"\n", 1);
228 process_info_len = len_string_from_gstring(g, &s);
229 DEBUG(D_process_info) debug_printf("set_process_info: %s", process_info);
230 va_end(ap);
231 }
232
233 /***********************************************
234 *            Handler for SIGTERM               *
235 ***********************************************/
236
237 static void
238 term_handler(int sig)
239 {
240 exim_exit(EXIT_FAILURE);
241 }
242
243
244 /***********************************************
245 *            Handler for SIGSEGV               *
246 ***********************************************/
247
248 #define STACKDUMP_MAX 24
249 void
250 stackdump(void)
251 {
252 #ifndef NO_EXECINFO
253 void * buf[STACKDUMP_MAX];
254 char ** ss;
255 int nptrs = backtrace(buf, STACKDUMP_MAX);
256
257 log_write(0, LOG_MAIN|LOG_PANIC, "backtrace");
258 log_write(0, LOG_MAIN|LOG_PANIC, "---");
259 if ((ss = backtrace_symbols(buf, nptrs)))
260   {
261   for (int i = 0; i < nptrs; i++)
262     log_write(0, LOG_MAIN|LOG_PANIC, "\t%s", ss[i]);
263   free(ss);
264   }
265 else
266   log_write(0, LOG_MAIN|LOG_PANIC, "backtrace_symbols: %s", strerror(errno));
267 log_write(0, LOG_MAIN|LOG_PANIC, "---");
268 #endif
269 }
270 #undef STACKDUMP_MAX
271
272
273 static void
274 #ifdef SA_SIGINFO
275 segv_handler(int sig, siginfo_t * info, void * uctx)
276 {
277 if (!panic_coredump)
278   {
279   log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (fault address: %p)", info->si_addr);
280   # if defined(SEGV_MAPERR) && defined(SEGV_ACCERR) && defined(SEGV_BNDERR) && defined(SEGV_PKUERR)
281   switch (info->si_code)
282     {
283     case SEGV_MAPERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_MAPERR"); break;
284     case SEGV_ACCERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_ACCERR"); break;
285     case SEGV_BNDERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_BNDERR"); break;
286     case SEGV_PKUERR: log_write(0, LOG_MAIN|LOG_PANIC, "SEGV_PKUERR"); break;
287     }
288   # endif
289   }
290 if (panic_coredump)
291   log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (deliberate trap)");
292 else if (US info->si_addr < US 4096)
293   log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (null pointer indirection)");
294 else
295   log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (maybe attempt to write to immutable memory)");
296 if (process_info_len > 0)
297   log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (%s: %.*s)",
298     process_purpose, process_info_len, process_info);
299 stackdump();
300 signal(SIGSEGV, SIG_DFL);
301 kill(getpid(), sig);
302 }
303
304 #else
305 segv_handler(int sig)
306 {
307 log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (maybe attempt to write to immutable memory)");
308 if (process_info_len > 0)
309   log_write(0, LOG_MAIN|LOG_PANIC, "SIGSEGV (%.*s)", process_info_len, process_info);
310 stackdump();
311 signal(SIGSEGV, SIG_DFL);
312 kill(getpid(), sig);
313 }
314 #endif
315
316
317 /*************************************************
318 *             Handler for SIGUSR1                *
319 *************************************************/
320
321 /* SIGUSR1 causes any exim process to write to the process log details of
322 what it is currently doing. It will only be used if the OS is capable of
323 setting up a handler that causes automatic restarting of any system call
324 that is in progress at the time.
325
326 This function takes care to be signal-safe.
327
328 Argument: the signal number (SIGUSR1)
329 Returns:  nothing
330 */
331
332 static void
333 usr1_handler(int sig)
334 {
335 int fd;
336
337 os_restarting_signal(sig, usr1_handler);
338
339 if (!process_log_path) return;
340 fd = log_open_as_exim(process_log_path);
341
342 /* If we are neither exim nor root, or if we failed to create the log file,
343 give up. There is not much useful we can do with errors, since we don't want
344 to disrupt whatever is going on outside the signal handler. */
345
346 if (fd < 0) return;
347
348 (void)write(fd, process_info, process_info_len);
349 (void)close(fd);
350 }
351
352
353
354 /*************************************************
355 *             Timeout handler                    *
356 *************************************************/
357
358 /* This handler is enabled most of the time that Exim is running. The handler
359 doesn't actually get used unless alarm() has been called to set a timer, to
360 place a time limit on a system call of some kind. When the handler is run, it
361 re-enables itself.
362
363 There are some other SIGALRM handlers that are used in special cases when more
364 than just a flag setting is required; for example, when reading a message's
365 input. These are normally set up in the code module that uses them, and the
366 SIGALRM handler is reset to this one afterwards.
367
368 Argument: the signal value (SIGALRM)
369 Returns:  nothing
370 */
371
372 void
373 sigalrm_handler(int sig)
374 {
375 sigalrm_seen = TRUE;
376 os_non_restarting_signal(SIGALRM, sigalrm_handler);
377 }
378
379
380
381 /*************************************************
382 *      Sleep for a fractional time interval      *
383 *************************************************/
384
385 /* This function is called by millisleep() and exim_wait_tick() to wait for a
386 period of time that may include a fraction of a second. The coding is somewhat
387 tedious. We do not expect setitimer() ever to fail, but if it does, the process
388 will wait for ever, so we panic in this instance. (There was a case of this
389 when a bug in a function that calls milliwait() caused it to pass invalid data.
390 That's when I added the check. :-)
391
392 We assume it to be not worth sleeping for under 50us; this value will
393 require revisiting as hardware advances.  This avoids the issue of
394 a zero-valued timer setting meaning "never fire".
395
396 Argument:  an itimerval structure containing the interval
397 Returns:   nothing
398 */
399
400 static void
401 milliwait(struct itimerval *itval)
402 {
403 sigset_t sigmask;
404 sigset_t old_sigmask;
405 int save_errno = errno;
406
407 if (itval->it_value.tv_usec < 50 && itval->it_value.tv_sec == 0)
408   return;
409 (void)sigemptyset(&sigmask);                           /* Empty mask */
410 (void)sigaddset(&sigmask, SIGALRM);                    /* Add SIGALRM */
411 (void)sigprocmask(SIG_BLOCK, &sigmask, &old_sigmask);  /* Block SIGALRM */
412 if (setitimer(ITIMER_REAL, itval, NULL) < 0)           /* Start timer */
413   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
414     "setitimer() failed: %s", strerror(errno));
415 (void)sigfillset(&sigmask);                            /* All signals */
416 (void)sigdelset(&sigmask, SIGALRM);                    /* Remove SIGALRM */
417 (void)sigsuspend(&sigmask);                            /* Until SIGALRM */
418 (void)sigprocmask(SIG_SETMASK, &old_sigmask, NULL);    /* Restore mask */
419 errno = save_errno;
420 sigalrm_seen = FALSE;
421 }
422
423
424
425
426 /*************************************************
427 *         Millisecond sleep function             *
428 *************************************************/
429
430 /* The basic sleep() function has a granularity of 1 second, which is too rough
431 in some cases - for example, when using an increasing delay to slow down
432 spammers.
433
434 Argument:    number of millseconds
435 Returns:     nothing
436 */
437
438 void
439 millisleep(int msec)
440 {
441 struct itimerval itval = {.it_interval = {.tv_sec = 0, .tv_usec = 0},
442                           .it_value = {.tv_sec = msec/1000,
443                                        .tv_usec = (msec % 1000) * 1000}};
444 milliwait(&itval);
445 }
446
447
448
449 /*************************************************
450 *         Compare microsecond times              *
451 *************************************************/
452
453 /*
454 Arguments:
455   tv1         the first time
456   tv2         the second time
457
458 Returns:      -1, 0, or +1
459 */
460
461 static int
462 exim_tvcmp(struct timeval *t1, struct timeval *t2)
463 {
464 if (t1->tv_sec > t2->tv_sec) return +1;
465 if (t1->tv_sec < t2->tv_sec) return -1;
466 if (t1->tv_usec > t2->tv_usec) return +1;
467 if (t1->tv_usec < t2->tv_usec) return -1;
468 return 0;
469 }
470
471
472
473
474 /*************************************************
475 *          Clock tick wait function              *
476 *************************************************/
477
478 #ifdef _POSIX_MONOTONIC_CLOCK
479 # ifdef CLOCK_BOOTTIME
480 #  define EXIM_CLOCKTYPE CLOCK_BOOTTIME
481 # else
482 #  define EXIM_CLOCKTYPE CLOCK_MONOTONIC
483 # endif
484
485 /* Amount EXIM_CLOCK is behind realtime, at startup. */
486 static struct timespec offset_ts;
487
488 static void
489 exim_clock_init(void)
490 {
491 struct timeval tv;
492 if (clock_gettime(EXIM_CLOCKTYPE, &offset_ts) != 0) return;
493 (void)gettimeofday(&tv, NULL);
494 offset_ts.tv_sec = tv.tv_sec - offset_ts.tv_sec;
495 offset_ts.tv_nsec = tv.tv_usec * 1000 - offset_ts.tv_nsec;
496 if (offset_ts.tv_nsec >= 0) return;
497 offset_ts.tv_sec--;
498 offset_ts.tv_nsec += 1000*1000*1000;
499 }
500 #endif
501
502
503 void
504 exim_gettime(struct timeval * tv)
505 {
506 #ifdef _POSIX_MONOTONIC_CLOCK
507 struct timespec now_ts;
508
509 if (clock_gettime(EXIM_CLOCKTYPE, &now_ts) == 0)
510   {
511   now_ts.tv_sec += offset_ts.tv_sec;
512   if ((now_ts.tv_nsec += offset_ts.tv_nsec) >= 1000*1000*1000)
513     {
514     now_ts.tv_sec++;
515     now_ts.tv_nsec -= 1000*1000*1000;
516     }
517   tv->tv_sec = now_ts.tv_sec;
518   tv->tv_usec = now_ts.tv_nsec / 1000;
519   }
520 else
521 #endif
522   (void)gettimeofday(tv, NULL);
523 }
524
525
526 /* Exim uses a time + a pid to generate a unique identifier in two places: its
527 message IDs, and in file names for maildir deliveries. Because some OS now
528 re-use pids within the same second, sub-second times are now being used.
529 However, for absolute certainty, we must ensure the clock has ticked before
530 allowing the relevant process to complete. At the time of implementation of
531 this code (February 2003), the speed of processors is such that the clock will
532 invariably have ticked already by the time a process has done its job. This
533 function prepares for the time when things are faster - and it also copes with
534 clocks that go backwards.
535
536 Arguments:
537   prev_tv      A timeval which was used to create uniqueness; its usec field
538                  has been rounded down to the value of the resolution.
539                  We want to be sure the current time is greater than this.
540                  On return, updated to current (rounded down).
541   resolution   The resolution that was used to divide the microseconds
542                  (1 for maildir, larger for message ids)
543
544 Returns:       nothing
545 */
546
547 void
548 exim_wait_tick(struct timeval * prev_tv, int resolution)
549 {
550 struct timeval now_tv;
551 long int now_true_usec;
552
553 exim_gettime(&now_tv);
554 now_true_usec = now_tv.tv_usec;
555 now_tv.tv_usec = (now_true_usec/resolution) * resolution;
556
557 while (exim_tvcmp(&now_tv, prev_tv) <= 0)
558   {
559   struct itimerval itval;
560   itval.it_interval.tv_sec = 0;
561   itval.it_interval.tv_usec = 0;
562   itval.it_value.tv_sec = prev_tv->tv_sec - now_tv.tv_sec;
563   itval.it_value.tv_usec = prev_tv->tv_usec + resolution - now_true_usec;
564
565   /* We know that, overall, "now" is less than or equal to "then". Therefore, a
566   negative value for the microseconds is possible only in the case when "now"
567   is more than a second less than "tgt". That means that itval.it_value.tv_sec
568   is greater than zero. The following correction is therefore safe. */
569
570   if (itval.it_value.tv_usec < 0)
571     {
572     itval.it_value.tv_usec += 1000000;
573     itval.it_value.tv_sec -= 1;
574     }
575
576   DEBUG(D_transport|D_receive)
577     {
578     if (!f.running_in_test_harness)
579       {
580       debug_printf("tick check: " TIME_T_FMT ".%06lu " TIME_T_FMT ".%06lu\n",
581         prev_tv->tv_sec, (long) prev_tv->tv_usec,
582         now_tv.tv_sec, (long) now_tv.tv_usec);
583       debug_printf("waiting " TIME_T_FMT ".%06lu sec\n",
584         itval.it_value.tv_sec, (long) itval.it_value.tv_usec);
585       }
586     }
587
588   milliwait(&itval);
589
590   /* Be prapared to go around if the kernel does not implement subtick
591   granularity (GNU Hurd) */
592
593   exim_gettime(&now_tv);
594   now_true_usec = now_tv.tv_usec;
595   now_tv.tv_usec = (now_true_usec/resolution) * resolution;
596   }
597 *prev_tv = now_tv;
598 }
599
600
601
602
603 /*************************************************
604 *   Call fopen() with umask 777 and adjust mode  *
605 *************************************************/
606
607 /* Exim runs with umask(0) so that files created with open() have the mode that
608 is specified in the open() call. However, there are some files, typically in
609 the spool directory, that are created with fopen(). They end up world-writeable
610 if no precautions are taken. Although the spool directory is not accessible to
611 the world, this is an untidiness. So this is a wrapper function for fopen()
612 that sorts out the mode of the created file.
613
614 Arguments:
615    filename       the file name
616    options        the fopen() options
617    mode           the required mode
618
619 Returns:          the fopened FILE or NULL
620 */
621
622 FILE *
623 modefopen(const uschar *filename, const char *options, mode_t mode)
624 {
625 mode_t saved_umask = umask(0777);
626 FILE *f = Ufopen(filename, options);
627 (void)umask(saved_umask);
628 if (f != NULL) (void)fchmod(fileno(f), mode);
629 return f;
630 }
631
632
633 /*************************************************
634 *   Ensure stdin, stdout, and stderr exist       *
635 *************************************************/
636
637 /* Some operating systems grumble if an exec() happens without a standard
638 input, output, and error (fds 0, 1, 2) being defined. The worry is that some
639 file will be opened and will use these fd values, and then some other bit of
640 code will assume, for example, that it can write error messages to stderr.
641 This function ensures that fds 0, 1, and 2 are open if they do not already
642 exist, by connecting them to /dev/null.
643
644 This function is also used to ensure that std{in,out,err} exist at all times,
645 so that if any library that Exim calls tries to use them, it doesn't crash.
646
647 Arguments:  None
648 Returns:    Nothing
649 */
650
651 void
652 exim_nullstd(void)
653 {
654 int devnull = -1;
655 struct stat statbuf;
656 for (int i = 0; i <= 2; i++)
657   {
658   if (fstat(i, &statbuf) < 0 && errno == EBADF)
659     {
660     if (devnull < 0) devnull = open("/dev/null", O_RDWR);
661     if (devnull < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
662       string_open_failed("/dev/null", NULL));
663     if (devnull != i) (void)dup2(devnull, i);
664     }
665   }
666 if (devnull > 2) (void)close(devnull);
667 }
668
669
670
671
672 /*************************************************
673 *   Close unwanted file descriptors for delivery *
674 *************************************************/
675
676 /* This function is called from a new process that has been forked to deliver
677 an incoming message, either directly, or using exec.
678
679 We want any smtp input streams to be closed in this new process. However, it
680 has been observed that using fclose() here causes trouble. When reading in -bS
681 input, duplicate copies of messages have been seen. The files will be sharing a
682 file pointer with the parent process, and it seems that fclose() (at least on
683 some systems - I saw this on Solaris 2.5.1) messes with that file pointer, at
684 least sometimes. Hence we go for closing the underlying file descriptors.
685
686 If TLS is active, we want to shut down the TLS library, but without molesting
687 the parent's SSL connection.
688
689 For delivery of a non-SMTP message, we want to close stdin and stdout (and
690 stderr unless debugging) because the calling process might have set them up as
691 pipes and be waiting for them to close before it waits for the submission
692 process to terminate. If they aren't closed, they hold up the calling process
693 until the initial delivery process finishes, which is not what we want.
694
695 Exception: We do want it for synchronous delivery!
696
697 And notwithstanding all the above, if D_resolver is set, implying resolver
698 debugging, leave stdout open, because that's where the resolver writes its
699 debugging output.
700
701 When we close stderr (which implies we've also closed stdout), we also get rid
702 of any controlling terminal.
703
704 Arguments:   None
705 Returns:     Nothing
706 */
707
708 static void
709 close_unwanted(void)
710 {
711 if (smtp_input)
712   {
713 #ifndef DISABLE_TLS
714   tls_close(NULL, TLS_NO_SHUTDOWN);      /* Shut down the TLS library */
715 #endif
716   (void)close(fileno(smtp_in));
717   (void)close(fileno(smtp_out));
718   smtp_in = NULL;
719   }
720 else
721   {
722   (void)close(0);                                          /* stdin */
723   if ((debug_selector & D_resolver) == 0) (void)close(1);  /* stdout */
724   if (debug_selector == 0)                                 /* stderr */
725     {
726     if (!f.synchronous_delivery)
727       {
728       (void)close(2);
729       log_stderr = NULL;
730       }
731     (void)setsid();
732     }
733   }
734 }
735
736
737
738
739 /*************************************************
740 *          Set uid and gid                       *
741 *************************************************/
742
743 /* This function sets a new uid and gid permanently, optionally calling
744 initgroups() to set auxiliary groups. There are some special cases when running
745 Exim in unprivileged modes. In these situations the effective uid will not be
746 root; if we already have the right effective uid/gid, and don't need to
747 initialize any groups, leave things as they are.
748
749 Arguments:
750   uid        the uid
751   gid        the gid
752   igflag     TRUE if initgroups() wanted
753   msg        text to use in debugging output and failure log
754
755 Returns:     nothing; bombs out on failure
756 */
757
758 void
759 exim_setugid(uid_t uid, gid_t gid, BOOL igflag, const uschar * msg)
760 {
761 uid_t euid = geteuid();
762 gid_t egid = getegid();
763
764 if (euid == root_uid || euid != uid || egid != gid || igflag)
765   {
766   /* At least one OS returns +1 for initgroups failure, so just check for
767   non-zero. */
768
769   if (igflag)
770     {
771     struct passwd *pw = getpwuid(uid);
772     if (!pw)
773       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "cannot run initgroups(): "
774         "no passwd entry for uid=%ld", (long int)uid);
775
776     if (initgroups(pw->pw_name, gid) != 0)
777       log_write(0,LOG_MAIN|LOG_PANIC_DIE,"initgroups failed for uid=%ld: %s",
778         (long int)uid, strerror(errno));
779     }
780
781   if (setgid(gid) < 0 || setuid(uid) < 0)
782     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "unable to set gid=%ld or uid=%ld "
783       "(euid=%ld): %s", (long int)gid, (long int)uid, (long int)euid, msg);
784   }
785
786 /* Debugging output included uid/gid and all groups */
787
788 DEBUG(D_uid)
789   {
790   int group_count, save_errno;
791   gid_t group_list[EXIM_GROUPLIST_SIZE];
792   debug_printf("changed uid/gid: %s\n  uid=%ld gid=%ld pid=%ld\n", msg,
793     (long int)geteuid(), (long int)getegid(), (long int)getpid());
794   group_count = getgroups(nelem(group_list), group_list);
795   save_errno = errno;
796   debug_printf("  auxiliary group list:");
797   if (group_count > 0)
798     for (int i = 0; i < group_count; i++) debug_printf(" %d", (int)group_list[i]);
799   else if (group_count < 0)
800     debug_printf(" <error: %s>", strerror(save_errno));
801   else debug_printf(" <none>");
802   debug_printf("\n");
803   }
804 }
805
806
807
808
809 /*************************************************
810 *               Exit point                       *
811 *************************************************/
812
813 /* Exim exits via this function so that it always clears up any open
814 databases.
815
816 Arguments:
817   rc         return code
818
819 Returns:     does not return
820 */
821
822 void
823 exim_exit(int rc)
824 {
825 search_tidyup();
826 store_exit();
827 DEBUG(D_any)
828   debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d (%s) terminating with rc=%d "
829     ">>>>>>>>>>>>>>>>\n",
830     (int)getpid(), process_purpose, rc);
831 exit(rc);
832 }
833
834
835 void
836 exim_underbar_exit(int rc)
837 {
838 store_exit();
839 DEBUG(D_any)
840   debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d (%s) terminating with rc=%d "
841     ">>>>>>>>>>>>>>>>\n",
842     (int)getpid(), process_purpose, rc);
843 _exit(rc);
844 }
845
846
847
848 /* Print error string, then die */
849 static void
850 exim_fail(const char * fmt, ...)
851 {
852 va_list ap;
853 va_start(ap, fmt);
854 vfprintf(stderr, fmt, ap);
855 va_end(ap);
856 exit(EXIT_FAILURE);
857 }
858
859 /* fail if a length is too long */
860 static inline void
861 exim_len_fail_toolong(int itemlen, int maxlen, const char * description)
862 {
863 if (itemlen <= maxlen)
864   return;
865 fprintf(stderr, "exim: length limit exceeded (%d > %d) for: %s\n",
866         itemlen, maxlen, description);
867 exit(EXIT_FAILURE);
868 }
869
870 /* only pass through the string item back to the caller if it's short enough */
871 static inline const uschar *
872 exim_str_fail_toolong(const uschar * item, int maxlen, const char * description)
873 {
874 if (!item)
875   exim_fail("exim: bad item for: %s\n", description);
876 exim_len_fail_toolong(Ustrlen(item), maxlen, description);
877 return item;
878 }
879
880 /* exim_chown_failure() called from exim_chown()/exim_fchown() on failure
881 of chown()/fchown().  See src/functions.h for more explanation */
882 int
883 exim_chown_failure(int fd, const uschar *name, uid_t owner, gid_t group)
884 {
885 int saved_errno = errno;  /* from the preceeding chown call */
886 #if 1
887 log_write(0, LOG_MAIN|LOG_PANIC,
888   __FILE__ ":%d: chown(%s, %d:%d) failed (%s)."
889   " Please contact the authors and refer to https://bugs.exim.org/show_bug.cgi?id=2391",
890   __LINE__, name?name:US"<unknown>", owner, group, strerror(errno));
891 #else
892 /* I leave this here, commented, in case the "bug"(?) comes up again.
893    It is not an Exim bug, but we can provide a workaround.
894    See Bug 2391
895    HS 2019-04-18 */
896
897 struct stat buf;
898
899 if (0 == (fd < 0 ? stat(name, &buf) : fstat(fd, &buf)))
900   {
901   if (buf.st_uid == owner && buf.st_gid == group) return 0;
902   log_write(0, LOG_MAIN|LOG_PANIC, "Wrong ownership on %s", name);
903   }
904 else log_write(0, LOG_MAIN|LOG_PANIC, "Stat failed on %s: %s", name, strerror(errno));
905
906 #endif
907 errno = saved_errno;
908 return -1;
909 }
910
911
912 /* Bump the index for argv, checking for overflow,
913 and return the argument. */
914
915 static const uschar *
916 next_argv(const uschar ** argv, int * pi, int argc, const uschar * where)
917 {
918 int i = *pi;
919 if (++i >= argc) exim_fail("exim: bad item for: %s\n", where);
920 return argv[*pi = i];
921 }
922
923
924 /*************************************************
925 *         Extract port from host address         *
926 *************************************************/
927
928 /* Called to extract the port from the values given to -oMa and -oMi.
929 It also checks the syntax of the address, and terminates it before the
930 port data when a port is extracted.
931
932 Argument:
933   address   the address, with possible port on the end
934
935 Returns:    the port, or zero if there isn't one
936             bombs out on a syntax error
937 */
938
939 static int
940 check_port(uschar *address)
941 {
942 int port = host_address_extract_port(address);
943 if (string_is_ip_address(address, NULL) == 0)
944   exim_fail("exim abandoned: \"%s\" is not an IP address\n", address);
945 return port;
946 }
947
948
949
950 /*************************************************
951 *              Test/verify an address            *
952 *************************************************/
953
954 /* This function is called by the -bv and -bt code. It extracts a working
955 address from a full RFC 822 address. This isn't really necessary per se, but it
956 has the effect of collapsing source routes.
957
958 Arguments:
959   s            the address string
960   flags        flag bits for verify_address()
961   exit_value   to be set for failures
962
963 Returns:       nothing
964 */
965
966 static void
967 test_address(uschar *s, int flags, int *exit_value)
968 {
969 int start, end, domain;
970 uschar *parse_error = NULL;
971 uschar *address = parse_extract_address(s, &parse_error, &start, &end, &domain,
972   FALSE);
973 if (!address)
974   {
975   fprintf(stdout, "syntax error: %s\n", parse_error);
976   *exit_value = 2;
977   }
978 else
979   {
980   int rc = verify_address(deliver_make_addr(address,TRUE), stdout, flags, -1,
981     -1, -1, NULL, NULL, NULL);
982   if (rc == FAIL) *exit_value = 2;
983   else if (rc == DEFER && *exit_value == 0) *exit_value = 1;
984   }
985 }
986
987
988
989 /*************************************************
990 *          Show supported features               *
991 *************************************************/
992
993 static void
994 show_string(BOOL is_stdout, gstring * g)
995 {
996 const uschar * s = string_from_gstring(g);
997 if (s)
998   if (is_stdout) fputs(CCS s, stdout);
999   else debug_printf("%s", s);
1000 }
1001
1002
1003 static gstring *
1004 show_db_version(gstring * g)
1005 {
1006 g = string_cat(g, US"Hints DB:\n");
1007 #ifdef DB_VERSION_STRING
1008 DEBUG(D_any)
1009   {
1010   g = string_fmt_append(g, " Library version: BDB: Compile: %s\n", DB_VERSION_STRING);
1011   g = string_fmt_append(g, "                       Runtime: %s\n",
1012     db_version(NULL, NULL, NULL));
1013   }
1014 else
1015   g = string_fmt_append(g, " Berkeley DB: %s\n", DB_VERSION_STRING);
1016
1017 #elif defined(BTREEVERSION) && defined(HASHVERSION)
1018 # ifdef USE_DB
1019   g = string_cat(g, US" Probably Berkeley DB version 1.8x (native mode)\n");
1020 # else
1021   g = string_cat(g, US" Probably Berkeley DB version 1.8x (compatibility mode)\n");
1022 # endif
1023
1024 #elif defined(_DBM_RDONLY) || defined(dbm_dirfno)
1025 g = string_cat(g, US" Probably ndbm\n");
1026 #elif defined(USE_SQLITE)
1027 g = string_cat(g, US" Using sqlite3\n");
1028 #elif defined(USE_TDB)
1029 g = string_cat(g, US" Using tdb\n");
1030 #else
1031 # ifdef USE_GDBM
1032 g = string_cat(g, US" Probably GDBM (native mode)\n");
1033 # else
1034 g = string_cat(g, US" Probably GDBM (compatibility mode)\n");
1035 # endif
1036 #endif
1037 return g;
1038 }
1039
1040
1041 static gstring *
1042 lookup_show_supported(gstring * g)
1043 {
1044 gstring * b = NULL, * d = NULL;
1045
1046 #if defined(LOOKUP_LSEARCH)
1047 # if LOOKUP_LSEARCH!=2
1048   b = string_cat(b, US" lsearch wildlsearch nwildlsearch iplsearch");
1049 # else
1050   d = string_cat(d, US" lsearch wildlsearch nwildlsearch iplsearch");
1051 # endif
1052 #endif
1053 #if defined(LOOKUP_CDB)
1054 # if LOOKUP_CDB!=2
1055   b = string_cat(b, US" cdb");
1056 # else
1057   d = string_cat(d, US" cdb");
1058 # endif
1059 #endif
1060 #if defined(LOOKUP_DBM)
1061 # if LOOKUP_DBM!=2
1062   b = string_cat(b, US" dbm dbmjz dbmnz");
1063 # else
1064   d = string_cat(d, US" dbm dbmjz dbmnz");
1065 # endif
1066 #endif
1067 #if defined(LOOKUP_DNSDB)
1068 # if LOOKUP_DNSDB!=2
1069   b = string_cat(b, US" dnsdb");
1070 # else
1071   d = string_cat(d, US" dnsdb");
1072 # endif
1073 #endif
1074 #if defined(LOOKUP_DSEARCH)
1075 # if LOOKUP_DSEARCH!=2
1076   b = string_cat(b, US" dsearch");
1077 # else
1078   d = string_cat(d, US" dsearch");
1079 # endif
1080 #endif
1081 #if defined(LOOKUP_IBASE)
1082 # if LOOKUP_IBASE!=2
1083   b = string_cat(b, US" ibase");
1084 # else
1085   d = string_cat(d, US" ibase");
1086 # endif
1087 #endif
1088 #if defined(LOOKUP_JSON)
1089 # if LOOKUP_JSON!=2
1090   b = string_cat(b, US" json");
1091 # else
1092   d = string_cat(d, US" json");
1093 # endif
1094 #endif
1095 #if defined(LOOKUP_LDAP)
1096 # if LOOKUP_LDAP!=2
1097   b = string_cat(b, US" ldap ldapdn ldapm");
1098 # else
1099   d = string_cat(d, US" ldap ldapdn ldapm");
1100 # endif
1101 #endif
1102 #ifdef LOOKUP_LMDB
1103   b = string_cat(b, US" lmdb");
1104 #endif
1105 #if defined(LOOKUP_MYSQL)
1106 # if LOOKUP_MYSQL!=2
1107   b = string_cat(b, US" mysql");
1108 # else
1109   d = string_cat(d, US" mysql");
1110 # endif
1111 #endif
1112 #if defined(LOOKUP_NIS)
1113 # if LOOKUP_NIS!=2
1114   b = string_cat(b, US" nis nis0");
1115 # else
1116   d = string_cat(d, US" nis nis0");
1117 # endif
1118 #endif
1119 #if defined(LOOKUP_NISPLUS)
1120 # if LOOKUP_NISPLUS!=2
1121   b = string_cat(b, US" nisplus");
1122 # else
1123   d = string_cat(d, US" nisplus");
1124 # endif
1125 #endif
1126 #if defined(LOOKUP_ORACLE)
1127 # if LOOKUP_ORACLE!=2
1128   b = string_cat(b, US" oracle");
1129 # else
1130   d = string_cat(d, US" oracle");
1131 # endif
1132 #endif
1133 #if defined(LOOKUP_PASSWD)
1134 # if LOOKUP_PASSWD!=2
1135   b = string_cat(b, US" passwd");
1136 # else
1137   d = string_cat(d, US" passwd");
1138 # endif
1139 #endif
1140 #if defined(LOOKUP_PGSQL)
1141 # if LOOKUP_PGSQL!=2
1142   b = string_cat(b, US" pgsql");
1143 # else
1144   d = string_cat(d, US" pgsql");
1145 # endif
1146 #endif
1147 #if defined(LOOKUP_REDIS)
1148 # if LOOKUP_REDIS!=2
1149   b = string_cat(b, US" redis");
1150 # else
1151   d = string_cat(d, US" redis");
1152 # endif
1153 #endif
1154 #if defined(LOOKUP_SQLITE)
1155 # if LOOKUP_SQLITE!=2
1156   b = string_cat(b, US" sqlite");
1157 # else
1158   d = string_cat(d, US" sqlite");
1159 # endif
1160 #endif
1161 #if defined(LOOKUP_TESTDB)
1162 # if LOOKUP_TESTDB!=2
1163   b = string_cat(b, US" testdb");
1164 # else
1165   d = string_cat(d, US" testdb");
1166 # endif
1167 #endif
1168 #if defined(LOOKUP_WHOSON)
1169 # if LOOKUP_WHOSON!=2
1170   b = string_cat(b, US" whoson");
1171 # else
1172   d = string_cat(d, US" whoson");
1173 # endif
1174 #endif
1175
1176 if (b) g = string_fmt_append(g, "Lookups (built-in):%Y\n", b);
1177 if (d) g = string_fmt_append(g, "Lookups (dynamic): %Y\n", d);
1178 return g;
1179 }
1180
1181
1182 /* This function is called for -bV/--version and for -d to output the optional
1183 features of the current Exim binary.
1184
1185 Arguments:  BOOL, true for stdout else debug channel
1186 Returns:    nothing
1187 */
1188
1189 static void
1190 show_whats_supported(BOOL is_stdout)
1191 {
1192 rmark reset_point = store_mark();
1193 gstring * g = NULL;
1194
1195 DEBUG(D_any) {} else g = show_db_version(g);
1196
1197 g = string_cat(g, US"Support for:");
1198 #ifdef WITH_CONTENT_SCAN
1199   g = string_cat(g, US" Content_Scanning");
1200 #endif
1201 #ifdef SUPPORT_CRYPTEQ
1202   g = string_cat(g, US" crypteq");
1203 #endif
1204 #ifdef EXPAND_DLFUNC
1205   g = string_cat(g, US" Expand_dlfunc");
1206 #endif
1207 #if HAVE_ICONV
1208   g = string_cat(g, US" iconv()");
1209 #endif
1210 #if HAVE_IPV6
1211   g = string_cat(g, US" IPv6");
1212 #endif
1213 #ifdef SUPPORT_PAM
1214   g = string_cat(g, US" PAM");
1215 #endif
1216 #ifdef EXIM_PERL
1217   g = string_cat(g, US" Perl");
1218 #endif
1219 #ifdef USE_GNUTLS
1220   g = string_cat(g, US" GnuTLS");
1221 #endif
1222 #ifdef SUPPORT_MOVE_FROZEN_MESSAGES
1223   g = string_cat(g, US" move_frozen_messages");
1224 #endif
1225 #ifdef USE_OPENSSL
1226   g = string_cat(g, US" OpenSSL");
1227 #endif
1228 #if defined(CYRUS_PWCHECK_SOCKET)
1229   g = string_cat(g, US" pwcheck");
1230 #endif
1231 #if defined(RADIUS_CONFIG_FILE)
1232   g = string_cat(g, US" radius");
1233 #endif
1234 #ifndef DISABLE_TLS_RESUME
1235   g = string_cat(g, US" TLS_resume");
1236 #endif
1237 #ifdef SUPPORT_TRANSLATE_IP_ADDRESS
1238   g = string_cat(g, US" translate_ip_address");
1239 #endif
1240 #ifdef USE_TCP_WRAPPERS
1241   g = string_cat(g, US" TCPwrappers");
1242 #endif
1243 #ifdef HAVE_SETCLASSRESOURCES
1244   g = string_cat(g, US" use_setclassresources");
1245 #endif
1246 #ifdef SUPPORT_DANE
1247   g = string_cat(g, US" DANE");
1248 #endif
1249 #ifndef DISABLE_DKIM
1250   g = string_cat(g, US" DKIM");
1251 #endif
1252 #ifdef SUPPORT_DMARC
1253   g = string_cat(g, US" DMARC");
1254 #endif
1255 #ifndef DISABLE_DNSSEC
1256   g = string_cat(g, US" DNSSEC");
1257 #endif
1258 #ifndef DISABLE_ESMTP_LIMITS
1259   g = string_cat(g, US" ESMTP_Limits");
1260 #endif
1261 #ifndef DISABLE_WELLKNOWN
1262   g = string_cat(g, US" ESMTP_Wellknown");
1263 #endif
1264 #ifndef DISABLE_EVENT
1265   g = string_cat(g, US" Event");
1266 #endif
1267 #ifdef SUPPORT_I18N
1268   g = string_cat(g, US" I18N");
1269 #endif
1270 #ifndef DISABLE_OCSP
1271   g = string_cat(g, US" OCSP");
1272 #endif
1273 #ifndef DISABLE_PIPE_CONNECT
1274   g = string_cat(g, US" PIPECONNECT");
1275 #endif
1276 #ifndef DISABLE_PRDR
1277   g = string_cat(g, US" PRDR");
1278 #endif
1279 #ifdef SUPPORT_PROXY
1280   g = string_cat(g, US" PROXY");
1281 #endif
1282 #ifndef DISABLE_QUEUE_RAMP
1283   g = string_cat(g, US" Queue_Ramp");
1284 #endif
1285 #ifdef SUPPORT_SOCKS
1286   g = string_cat(g, US" SOCKS");
1287 #endif
1288 #ifdef SUPPORT_SPF
1289   g = string_cat(g, US" SPF");
1290 #endif
1291 #if defined(SUPPORT_SRS)
1292   g = string_cat(g, US" SRS");
1293 #endif
1294 #ifdef TCP_FASTOPEN
1295   tcp_init();
1296   if (f.tcp_fastopen_ok) g = string_cat(g, US" TCP_Fast_Open");
1297 #endif
1298 #ifdef EXPERIMENTAL_ARC
1299   g = string_cat(g, US" Experimental_ARC");
1300 #endif
1301 #ifdef EXPERIMENTAL_BRIGHTMAIL
1302   g = string_cat(g, US" Experimental_Brightmail");
1303 #endif
1304 #ifdef EXPERIMENTAL_DCC
1305   g = string_cat(g, US" Experimental_DCC");
1306 #endif
1307 #ifdef EXPERIMENTAL_DSN_INFO
1308   g = string_cat(g, US" Experimental_DSN_info");
1309 #endif
1310 #ifdef EXPERIMENTAL_QUEUEFILE
1311   g = string_cat(g, US" Experimental_QUEUEFILE");
1312 #endif
1313 #ifdef EXPERIMENTAL_XCLIENT
1314   g = string_cat(g, US" Experimental_XCLIENT");
1315 #endif
1316 g = string_cat(g, US"\n");
1317
1318 g = lookup_show_supported(g);
1319 g = auth_show_supported(g);
1320 g = route_show_supported(g);
1321 g = transport_show_supported(g);
1322
1323 #ifdef WITH_CONTENT_SCAN
1324 g = malware_show_supported(g);
1325 #endif
1326 show_string(is_stdout, g); g = NULL;
1327
1328 if (fixed_never_users[0] > 0)
1329   {
1330   int i;
1331   g = string_cat(g, US"Fixed never_users: ");
1332   for (i = 1; i <= (int)fixed_never_users[0] - 1; i++)
1333     string_fmt_append(g, "%u:", (unsigned)fixed_never_users[i]);
1334   g = string_fmt_append(g, "%u\n", (unsigned)fixed_never_users[i]);
1335   }
1336
1337 g = string_fmt_append(g, "Configure owner: %d:%d\n", config_uid, config_gid);
1338
1339 g = string_fmt_append(g, "Size of off_t: " SIZE_T_FMT "\n", sizeof(off_t));
1340
1341 /* Everything else is details which are only worth reporting when debugging.
1342 Perhaps the tls_version_report should move into this too. */
1343 DEBUG(D_any)
1344   {
1345
1346 /* clang defines __GNUC__ (at least, for me) so test for it first */
1347 #if defined(__clang__)
1348   g = string_fmt_append(g, "Compiler: CLang [%s]\n", __clang_version__);
1349 #elif defined(__GNUC__)
1350 # ifdef __VERSION__
1351   g = string_fmt_append(g, "Compiler: GCC [%s]\n", __VERSION__);
1352 # else
1353   g = string_fmt_append(g, "Compiler: GCC [%s]\n", "? unknown version ?";
1354 # endif
1355 #else
1356   g = string_cat(g, US"Compiler: <unknown>\n");
1357 #endif
1358
1359 #if defined(__GLIBC__) && !defined(__UCLIBC__)
1360   g = string_fmt_append(g, "Library version: Glibc: Compile: %d.%d\n",
1361                 __GLIBC__, __GLIBC_MINOR__);
1362   if (__GLIBC_PREREQ(2, 1))
1363     g = string_fmt_append(g, "                        Runtime: %s\n",
1364                 gnu_get_libc_version());
1365 #endif
1366
1367 g = show_db_version(g);
1368
1369 #ifndef DISABLE_TLS
1370   g = tls_version_report(g);
1371 #endif
1372 #ifdef SUPPORT_I18N
1373   g = utf8_version_report(g);
1374 #endif
1375 #ifdef SUPPORT_DMARC
1376   g = dmarc_version_report(g);
1377 #endif
1378 #ifdef SUPPORT_SPF
1379   g = spf_lib_version_report(g);
1380 #endif
1381
1382 show_string(is_stdout, g);
1383 g = NULL;
1384
1385 //for (auth_info * ai= auths_available; *ai->drinfo.driver_name != '\0'; ai++)
1386 for (auth_info * ai = auths_available_newlist; ai; ai = (auth_info *)ai->drinfo.next)
1387   if (ai->version_report)
1388     g = (*ai->version_report)(g);
1389
1390   /* PCRE_PRERELEASE is either defined and empty or a bare sequence of
1391   characters; unless it's an ancient version of PCRE in which case it
1392   is not defined. */
1393 #ifndef PCRE_PRERELEASE
1394 # define PCRE_PRERELEASE
1395 #endif
1396 #define QUOTE(X) #X
1397 #define EXPAND_AND_QUOTE(X) QUOTE(X)
1398   {
1399   uschar buf[24];
1400   pcre2_config(PCRE2_CONFIG_VERSION, buf);
1401   g = string_fmt_append(g, "Library version: PCRE2: Compile: %d.%d%s\n"
1402               "                        Runtime: %s\n",
1403           PCRE2_MAJOR, PCRE2_MINOR,
1404           EXPAND_AND_QUOTE(PCRE2_PRERELEASE) "",
1405           buf);
1406   }
1407 #undef QUOTE
1408 #undef EXPAND_AND_QUOTE
1409
1410 show_string(is_stdout, g);
1411 g = NULL;
1412
1413 init_lookup_list();
1414 for (int i = 0; i < lookup_list_count; i++)
1415   if (lookup_list[i]->version_report)
1416     g = lookup_list[i]->version_report(g);
1417 show_string(is_stdout, g);
1418 g = NULL;
1419
1420 #ifdef WHITELIST_D_MACROS
1421   g = string_fmt_append(g, "WHITELIST_D_MACROS: \"%s\"\n", WHITELIST_D_MACROS);
1422 #else
1423   g = string_cat(g, US"WHITELIST_D_MACROS unset\n");
1424 #endif
1425 #ifdef TRUSTED_CONFIG_LIST
1426   g = string_fmt_append(g, "TRUSTED_CONFIG_LIST: \"%s\"\n", TRUSTED_CONFIG_LIST);
1427 #else
1428   g = string_cat(g, US"TRUSTED_CONFIG_LIST unset\n");
1429 #endif
1430   }
1431
1432 show_string(is_stdout, g);
1433 store_reset(reset_point);
1434 }
1435
1436
1437 /*************************************************
1438 *     Show auxiliary information about Exim      *
1439 *************************************************/
1440
1441 static void
1442 show_exim_information(enum commandline_info request, FILE *stream)
1443 {
1444 switch(request)
1445   {
1446   case CMDINFO_NONE:
1447     fprintf(stream, "Oops, something went wrong.\n");
1448     return;
1449   case CMDINFO_HELP:
1450     fprintf(stream,
1451 "The -bI: flag takes a string indicating which information to provide.\n"
1452 "If the string is not recognised, you'll get this help (on stderr).\n"
1453 "\n"
1454 "  exim -bI:help    this information\n"
1455 "  exim -bI:dscp    list of known dscp value keywords\n"
1456 "  exim -bI:sieve   list of supported sieve extensions\n"
1457 );
1458     return;
1459   case CMDINFO_SIEVE:
1460     for (const uschar ** pp = exim_sieve_extension_list; *pp; ++pp)
1461       fprintf(stream, "%s\n", *pp);
1462     return;
1463   case CMDINFO_DSCP:
1464     dscp_list_to_stream(stream);
1465     return;
1466   }
1467 }
1468
1469
1470 /*************************************************
1471 *               Quote a local part               *
1472 *************************************************/
1473
1474 /* This function is used when a sender address or a From: or Sender: header
1475 line is being created from the caller's login, or from an authenticated_id. It
1476 applies appropriate quoting rules for a local part.
1477
1478 Argument:    the local part
1479 Returns:     the local part, quoted if necessary
1480 */
1481
1482 const uschar *
1483 local_part_quote(const uschar * lpart)
1484 {
1485 BOOL needs_quote = FALSE;
1486 gstring * g;
1487
1488 for (const uschar * t = lpart; !needs_quote && *t; t++)
1489   needs_quote = !isalnum(*t) && strchr("!#$%&'*+-/=?^_`{|}~", *t) == NULL &&
1490     (*t != '.' || t == lpart || t[1] == 0);
1491
1492 if (!needs_quote) return lpart;
1493
1494 g = string_catn(NULL, US"\"", 1);
1495
1496 for (;;)
1497   {
1498   uschar * nq = US Ustrpbrk(lpart, "\\\"");
1499   if (!nq)
1500     {
1501     g = string_cat(g, lpart);
1502     break;
1503     }
1504   g = string_catn(g, lpart, nq - lpart);
1505   g = string_catn(g, US"\\", 1);
1506   g = string_catn(g, nq, 1);
1507   lpart = nq + 1;
1508   }
1509
1510 g = string_catn(g, US"\"", 1);
1511 return string_from_gstring(g);
1512 }
1513
1514
1515
1516 #ifdef USE_READLINE
1517 /*************************************************
1518 *         Load readline() functions              *
1519 *************************************************/
1520
1521 /* This function is called from testing executions that read data from stdin,
1522 but only when running as the calling user. Currently, only -be does this. The
1523 function loads the readline() function library and passes back the functions.
1524 On some systems, it needs the curses library, so load that too, but try without
1525 it if loading fails. All this functionality has to be requested at build time.
1526
1527 Arguments:
1528   fn_readline_ptr   pointer to where to put the readline pointer
1529   fn_addhist_ptr    pointer to where to put the addhistory function
1530
1531 Returns:            the dlopen handle or NULL on failure
1532 */
1533
1534 static void *
1535 set_readline(char * (**fn_readline_ptr)(const char *),
1536              void   (**fn_addhist_ptr)(const char *))
1537 {
1538 void *dlhandle;
1539 void *dlhandle_curses = dlopen("libcurses." DYNLIB_FN_EXT, RTLD_GLOBAL|RTLD_LAZY);
1540
1541 dlhandle = dlopen("libreadline." DYNLIB_FN_EXT, RTLD_GLOBAL|RTLD_NOW);
1542 if (dlhandle_curses) dlclose(dlhandle_curses);
1543
1544 if (dlhandle)
1545   {
1546   /* Checked manual pages; at least in GNU Readline 6.1, the prototypes are:
1547    *   char * readline (const char *prompt);
1548    *   void add_history (const char *string);
1549    */
1550   *fn_readline_ptr = (char *(*)(const char*))dlsym(dlhandle, "readline");
1551   *fn_addhist_ptr = (void(*)(const char*))dlsym(dlhandle, "add_history");
1552   }
1553 else
1554   DEBUG(D_any) debug_printf("failed to load readline: %s\n", dlerror());
1555
1556 return dlhandle;
1557 }
1558 #endif
1559
1560
1561
1562 /*************************************************
1563 *    Get a line from stdin for testing things    *
1564 *************************************************/
1565
1566 /* This function is called when running tests that can take a number of lines
1567 of input (for example, -be and -bt). It handles continuations and trailing
1568 spaces. And prompting and a blank line output on eof. If readline() is in use,
1569 the arguments are non-NULL and provide the relevant functions.
1570
1571 Arguments:
1572   fn_readline   readline function or NULL
1573   fn_addhist    addhist function or NULL
1574
1575 Returns:        pointer to dynamic memory, or NULL at end of file
1576 */
1577
1578 static uschar *
1579 get_stdinput(char *(*fn_readline)(const char *), void(*fn_addhist)(const char *))
1580 {
1581 gstring * g = NULL;
1582 BOOL had_input = FALSE;
1583
1584 if (!fn_readline) { printf("> "); fflush(stdout); }
1585
1586 for (int i = 0;; i++)
1587   {
1588   uschar buffer[1024];
1589   uschar * p, * ss;
1590
1591 #ifdef USE_READLINE
1592   char *readline_line = NULL;
1593   if (fn_readline)
1594     {
1595     if (!(readline_line = fn_readline((i > 0)? "":"> "))) break;
1596     if (*readline_line && fn_addhist) fn_addhist(readline_line);
1597     p = US readline_line;
1598     }
1599   else
1600 #endif
1601
1602   /* readline() not in use */
1603
1604     {
1605     if (Ufgets(buffer, sizeof(buffer), stdin) == NULL) break;   /*EOF*/
1606     p = buffer;
1607     }
1608
1609   /* Handle the line */
1610
1611   had_input = TRUE;
1612   ss = p + Ustrlen(p);
1613   while (ss > p && isspace(ss[-1])) ss--; /* strip trailing newline (and spaces) */
1614
1615   if (i > 0)
1616     while (p < ss && isspace(*p)) p++;   /* strip leading space after cont */
1617
1618   g = string_catn(g, p, ss - p);
1619
1620 #ifdef USE_READLINE
1621   if (fn_readline) free(readline_line);
1622 #endif
1623
1624   /* g can only be NULL if ss==p */
1625   if (ss == p || gstring_last_char(g) != '\\') /* not continuation; done */
1626     break;
1627
1628   gstring_trim(g, 1);                           /* drop the \ */
1629   }
1630
1631 if (had_input) return g ? string_from_gstring(g) : US"";
1632 printf("\n");
1633 return NULL;
1634 }
1635
1636
1637
1638 /*************************************************
1639 *    Output usage information for the program    *
1640 *************************************************/
1641
1642 /* This function is called when there are no recipients
1643    or a specific --help argument was added.
1644
1645 Arguments:
1646   progname      information on what name we were called by
1647
1648 Returns:        DOES NOT RETURN
1649 */
1650
1651 static void
1652 exim_usage(const uschar * progname)
1653 {
1654
1655 /* Handle specific program invocation variants */
1656 if (Ustrcmp(progname, US"-mailq") == 0)
1657   exim_fail(
1658     "mailq - list the contents of the mail queue\n\n"
1659     "For a list of options, see the Exim documentation.\n");
1660
1661 /* Generic usage - we output this whatever happens */
1662 exim_fail(
1663   "Exim is a Mail Transfer Agent. It is normally called by Mail User Agents,\n"
1664   "not directly from a shell command line. Options and/or arguments control\n"
1665   "what it does when called. For a list of options, see the Exim documentation.\n");
1666 }
1667
1668
1669
1670 /*************************************************
1671 *    Validate that the macros given are okay     *
1672 *************************************************/
1673
1674 /* Typically, Exim will drop privileges if macros are supplied.  In some
1675 cases, we want to not do so.
1676
1677 Arguments:    opt_D_used - true if the commandline had a "-D" option
1678 Returns:      true if trusted, false otherwise
1679 */
1680
1681 static BOOL
1682 macros_trusted(BOOL opt_D_used)
1683 {
1684 #ifdef WHITELIST_D_MACROS
1685 uschar *whitelisted, *end, *p, **whites;
1686 int white_count, i, n;
1687 size_t len;
1688 BOOL prev_char_item, found;
1689 #endif
1690
1691 if (!opt_D_used)
1692   return TRUE;
1693 #ifndef WHITELIST_D_MACROS
1694 return FALSE;
1695 #else
1696
1697 /* We only trust -D overrides for some invoking users:
1698 root, the exim run-time user, the optional config owner user.
1699 I don't know why config-owner would be needed, but since they can own the
1700 config files anyway, there's no security risk to letting them override -D. */
1701 if ( ! ((real_uid == root_uid)
1702      || (real_uid == exim_uid)
1703 #ifdef CONFIGURE_OWNER
1704      || (real_uid == config_uid)
1705 #endif
1706    ))
1707   {
1708   debug_printf("macros_trusted rejecting macros for uid %d\n", (int) real_uid);
1709   return FALSE;
1710   }
1711
1712 /* Get a list of macros which are whitelisted */
1713 whitelisted = string_copy_perm(US WHITELIST_D_MACROS, FALSE);
1714 prev_char_item = FALSE;
1715 white_count = 0;
1716 for (p = whitelisted; *p != '\0'; ++p)
1717   {
1718   if (*p == ':' || isspace(*p))
1719     {
1720     *p = '\0';
1721     if (prev_char_item)
1722       ++white_count;
1723     prev_char_item = FALSE;
1724     continue;
1725     }
1726   if (!prev_char_item)
1727     prev_char_item = TRUE;
1728   }
1729 end = p;
1730 if (prev_char_item)
1731   ++white_count;
1732 if (!white_count)
1733   return FALSE;
1734 whites = store_malloc(sizeof(uschar *) * (white_count+1));
1735 for (p = whitelisted, i = 0; (p != end) && (i < white_count); ++p)
1736   {
1737   if (*p != '\0')
1738     {
1739     whites[i++] = p;
1740     if (i == white_count)
1741       break;
1742     while (*p != '\0' && p < end)
1743       ++p;
1744     }
1745   }
1746 whites[i] = NULL;
1747
1748 /* The list of commandline macros should be very short.
1749 Accept the N*M complexity. */
1750 for (macro_item * m = macros_user; m; m = m->next) if (m->command_line)
1751   {
1752   found = FALSE;
1753   for (uschar ** w = whites; *w; ++w)
1754     if (Ustrcmp(*w, m->name) == 0)
1755       {
1756       found = TRUE;
1757       break;
1758       }
1759   if (!found)
1760     return FALSE;
1761   if (!m->replacement)
1762     continue;
1763   if ((len = m->replen) == 0)
1764     continue;
1765   if (!regex_match(regex_whitelisted_macro, m->replacement, len, NULL))
1766     return FALSE;
1767   }
1768 DEBUG(D_any) debug_printf("macros_trusted overridden to true by whitelisting\n");
1769 return TRUE;
1770 #endif
1771 }
1772
1773
1774 /*************************************************
1775 *          Expansion testing                     *
1776 *************************************************/
1777
1778 /* Expand and print one item, doing macro-processing.
1779
1780 Arguments:
1781   item          line for expansion
1782 */
1783
1784 static void
1785 expansion_test_line(const uschar * line)
1786 {
1787 int len;
1788 BOOL dummy_macexp;
1789 uschar * s;
1790
1791 Ustrncpy(big_buffer, line, big_buffer_size);
1792 big_buffer[big_buffer_size-1] = '\0';
1793 len = Ustrlen(big_buffer);
1794
1795 (void) macros_expand(0, &len, &dummy_macexp);
1796
1797 if (isupper(big_buffer[0]))
1798   {
1799   if (macro_read_assignment(big_buffer))
1800     printf("Defined macro '%s'\n", mlast->name);
1801   }
1802 else if (Ustrncmp(big_buffer, "set,t ", 6) == 0)
1803   printf("%s\n", acl_standalone_setvar(big_buffer+6, TRUE));
1804 else if (Ustrncmp(big_buffer, "set ", 4) == 0)
1805   printf("%s\n", acl_standalone_setvar(big_buffer+4, FALSE));
1806 else
1807   if ((s = expand_string(big_buffer))) printf("%s\n", CS s);
1808   else printf("Failed: %s\n", expand_string_message);
1809 }
1810
1811
1812
1813 /*************************************************
1814 *          Queue-runner operations               *
1815 *************************************************/
1816
1817 /* Prefix a new qrunner descriptor to the qrunners list */
1818
1819 static qrunner *
1820 alloc_qrunner(void)
1821 {
1822 qrunner * q = qrunners;
1823 qrunners = store_get(sizeof(qrunner), GET_UNTAINTED);
1824 memset(qrunners, 0, sizeof(qrunner));           /* default queue, zero interval */
1825 qrunners->next = q;
1826 qrunners->next_tick = time(NULL);               /* run right away */
1827 return qrunners;
1828 }
1829
1830 static qrunner *
1831 alloc_onetime_qrunner(void)
1832 {
1833 qrunners = store_get_perm(sizeof(qrunner), GET_UNTAINTED);
1834 memset(qrunners, 0, sizeof(qrunner));           /* default queue, zero interval */
1835 qrunners->next_tick = time(NULL);               /* run right away */
1836 qrunners->run_max = 1;
1837 return qrunners;
1838 }
1839
1840
1841 /*************************************************
1842 *          Entry point and high-level code       *
1843 *************************************************/
1844
1845 /* Entry point for the Exim mailer. Analyse the arguments and arrange to take
1846 the appropriate action. All the necessary functions are present in the one
1847 binary. I originally thought one should split it up, but it turns out that so
1848 much of the apparatus is needed in each chunk that one might as well just have
1849 it all available all the time, which then makes the coding easier as well.
1850
1851 Arguments:
1852   argc      count of entries in argv
1853   argv      argument strings, with argv[0] being the program name
1854
1855 Returns:    EXIT_SUCCESS if terminated successfully
1856             EXIT_FAILURE otherwise, except when a message has been sent
1857               to the sender, and -oee was given
1858 */
1859
1860 int
1861 main(int argc, char ** cargv)
1862 {
1863 const uschar ** argv = CUSS cargv;
1864 int  arg_receive_timeout = -1;
1865 int  arg_smtp_receive_timeout = -1;
1866 int  arg_error_handling = error_handling;
1867 int  filter_sfd = -1;
1868 int  filter_ufd = -1;
1869 int  group_count;
1870 int  i, rv;
1871 int  list_queue_option = QL_BASIC;
1872 int  msg_action = 0;
1873 int  msg_action_arg = -1;
1874 int  namelen = argv[0] ? Ustrlen(argv[0]) : 0;
1875 int  queue_only_reason = 0;
1876 #ifdef EXIM_PERL
1877 int  perl_start_option = 0;
1878 #endif
1879 int  recipients_arg = argc;
1880 int  sender_address_domain = 0;
1881 int  test_retry_arg = -1;
1882 int  test_rewrite_arg = -1;
1883 gid_t original_egid;
1884 BOOL arg_queue_only = FALSE;
1885 BOOL bi_option = FALSE;
1886 BOOL checking = FALSE;
1887 BOOL count_queue = FALSE;
1888 BOOL expansion_test = FALSE;
1889 BOOL extract_recipients = FALSE;
1890 BOOL flag_G = FALSE;
1891 BOOL flag_n = FALSE;
1892 BOOL forced_delivery = FALSE;
1893 BOOL f_end_dot = FALSE;
1894 BOOL deliver_give_up = FALSE;
1895 BOOL list_queue = FALSE;
1896 BOOL list_options = FALSE;
1897 BOOL list_config = FALSE;
1898 BOOL local_queue_only;
1899 BOOL one_msg_action = FALSE;
1900 BOOL opt_D_used = FALSE;
1901 BOOL queue_only_set = FALSE;
1902 BOOL receiving_message = TRUE;
1903 BOOL sender_ident_set = FALSE;
1904 BOOL session_local_queue_only;
1905 BOOL unprivileged;
1906 BOOL removed_privilege = FALSE;
1907 BOOL usage_wanted = FALSE;
1908 BOOL verify_address_mode = FALSE;
1909 BOOL verify_as_sender = FALSE;
1910 BOOL rcpt_verify_quota = FALSE;
1911 BOOL version_printed = FALSE;
1912 const uschar * alias_arg = NULL;
1913 const uschar * called_as = US"";
1914 const uschar * cmdline_syslog_name = NULL;
1915 const uschar * start_queue_run_id = NULL;
1916 const uschar * stop_queue_run_id = NULL;
1917 const uschar * expansion_test_message = NULL;
1918 const uschar * ftest_domain = NULL;
1919 const uschar * ftest_localpart = NULL;
1920 const uschar * ftest_prefix = NULL;
1921 const uschar * ftest_suffix = NULL;
1922 uschar * log_oneline = NULL;
1923 const uschar * malware_test_file = NULL;
1924 const uschar * real_sender_address;
1925 uschar * originator_home = US"/";
1926 size_t sz;
1927
1928 struct passwd *pw;
1929 struct stat statbuf;
1930 pid_t passed_qr_pid = (pid_t)0;
1931 int passed_qr_pipe = -1;
1932 gid_t group_list[EXIM_GROUPLIST_SIZE];
1933
1934 /* For the -bI: flag */
1935 enum commandline_info info_flag = CMDINFO_NONE;
1936 BOOL info_stdout = FALSE;
1937
1938 /* Possible options for -R and -S */
1939
1940 static uschar *rsopts[] = { US"f", US"ff", US"r", US"rf", US"rff" };
1941
1942 /* Need to define this in case we need to change the environment in order
1943 to get rid of a bogus time zone. We have to make it char rather than uschar
1944 because some OS define it in /usr/include/unistd.h. */
1945
1946 extern char **environ;
1947
1948 #ifdef MEASURE_TIMING
1949 (void)gettimeofday(&timestamp_startup, NULL);
1950 #endif
1951
1952 store_init();   /* Initialise the memory allocation susbsystem */
1953 pcre_init();    /* Set up memory handling for pcre */
1954
1955 /* If the Exim user and/or group and/or the configuration file owner/group were
1956 defined by ref:name at build time, we must now find the actual uid/gid values.
1957 This is a feature to make the lives of binary distributors easier. */
1958
1959 #ifdef EXIM_USERNAME
1960 if (route_finduser(US EXIM_USERNAME, &pw, &exim_uid))
1961   {
1962   if (exim_uid == 0)
1963     exim_fail("exim: refusing to run with uid 0 for \"%s\"\n", EXIM_USERNAME);
1964
1965   /* If ref:name uses a number as the name, route_finduser() returns
1966   TRUE with exim_uid set and pw coerced to NULL. */
1967   if (pw)
1968     exim_gid = pw->pw_gid;
1969 #ifndef EXIM_GROUPNAME
1970   else
1971     exim_fail(
1972         "exim: ref:name should specify a usercode, not a group.\n"
1973         "exim: can't let you get away with it unless you also specify a group.\n");
1974 #endif
1975   }
1976 else
1977   exim_fail("exim: failed to find uid for user name \"%s\"\n", EXIM_USERNAME);
1978 #endif
1979
1980 #ifdef EXIM_GROUPNAME
1981 if (!route_findgroup(US EXIM_GROUPNAME, &exim_gid))
1982   exim_fail("exim: failed to find gid for group name \"%s\"\n", EXIM_GROUPNAME);
1983 #endif
1984
1985 #ifdef CONFIGURE_OWNERNAME
1986 if (!route_finduser(US CONFIGURE_OWNERNAME, NULL, &config_uid))
1987   exim_fail("exim: failed to find uid for user name \"%s\"\n",
1988     CONFIGURE_OWNERNAME);
1989 #endif
1990
1991 /* We default the system_filter_user to be the Exim run-time user, as a
1992 sane non-root value. */
1993 system_filter_uid = exim_uid;
1994
1995 #ifdef CONFIGURE_GROUPNAME
1996 if (!route_findgroup(US CONFIGURE_GROUPNAME, &config_gid))
1997   exim_fail("exim: failed to find gid for group name \"%s\"\n",
1998     CONFIGURE_GROUPNAME);
1999 #endif
2000
2001 /* In the Cygwin environment, some initialization used to need doing.
2002 It was fudged in by means of this macro; now no longer but we'll leave
2003 it in case of others. */
2004
2005 #ifdef OS_INIT
2006 OS_INIT
2007 #endif
2008
2009 /* Check a field which is patched when we are running Exim within its
2010 testing harness; do a fast initial check, and then the whole thing. */
2011
2012 f.running_in_test_harness =
2013   *running_status == '<' && Ustrcmp(running_status, "<<<testing>>>") == 0;
2014 if (f.running_in_test_harness)
2015   debug_store = TRUE;
2016
2017 /* Protect against abusive argv[0] */
2018 if (!argv[0] || !argc) exim_fail("exim: executable name required\n");
2019 exim_str_fail_toolong(argv[0], PATH_MAX, "argv[0]");
2020
2021 /* The C standard says that the equivalent of setlocale(LC_ALL, "C") is obeyed
2022 at the start of a program; however, it seems that some environments do not
2023 follow this. A "strange" locale can affect the formatting of timestamps, so we
2024 make quite sure. */
2025
2026 setlocale(LC_ALL, "C");
2027
2028 /* Get the offset between CLOCK_MONOTONIC/CLOCK_BOOTTIME and wallclock */
2029
2030 #ifdef _POSIX_MONOTONIC_CLOCK
2031 exim_clock_init();
2032 #endif
2033
2034 /* Set up the default handler for timing using alarm(). */
2035
2036 os_non_restarting_signal(SIGALRM, sigalrm_handler);
2037
2038 /* Ensure we have a buffer for constructing log entries. Use malloc directly,
2039 because store_malloc writes a log entry on failure. */
2040
2041 if (!(log_buffer = US malloc(LOG_BUFFER_SIZE)))
2042   exim_fail("exim: failed to get store for log buffer\n");
2043
2044 /* Initialize the default log options. */
2045
2046 bits_set(log_selector, log_selector_size, log_default);
2047
2048 /* Set log_stderr to stderr, provided that stderr exists. This gets reset to
2049 NULL when the daemon is run and the file is closed. We have to use this
2050 indirection, because some systems don't allow writing to the variable "stderr".
2051 */
2052
2053 if (fstat(fileno(stderr), &statbuf) >= 0) log_stderr = stderr;
2054
2055 /* Ensure there is a big buffer for temporary use in several places. It is put
2056 in malloc store so that it can be freed for enlargement if necessary. */
2057
2058 big_buffer = store_malloc(big_buffer_size);
2059
2060 /* Set up the handler for the data request signal, and set the initial
2061 descriptive text. */
2062
2063 process_info = store_get(PROCESS_INFO_SIZE, GET_TAINTED);
2064 set_process_info("initializing");
2065 os_restarting_signal(SIGUSR1, usr1_handler);            /* exiwhat */
2066 #ifdef SA_SIGINFO
2067   {
2068   struct sigaction act = { .sa_sigaction = segv_handler, .sa_flags = SA_RESETHAND | SA_SIGINFO };
2069   sigaction(SIGSEGV, &act, NULL);
2070   }
2071 #else
2072 signal(SIGSEGV, segv_handler);                          /* log faults */
2073 #endif
2074
2075 /* If running in a dockerized environment, the TERM signal is only
2076 delegated to the PID 1 if we request it by setting an signal handler */
2077
2078 if (getpid() == 1) signal(SIGTERM, term_handler);
2079
2080 /* SIGHUP is used to get the daemon to reconfigure. It gets set as appropriate
2081 in the daemon code. For the rest of Exim's uses, we ignore it. */
2082
2083 signal(SIGHUP, SIG_IGN);
2084
2085 /* We don't want to die on pipe errors as the code is written to handle
2086 the write error instead. */
2087
2088 signal(SIGPIPE, SIG_IGN);
2089
2090 /* Under some circumstance on some OS, Exim can get called with SIGCHLD
2091 set to SIG_IGN. This causes subprocesses that complete before the parent
2092 process waits for them not to hang around, so when Exim calls wait(), nothing
2093 is there. The wait() code has been made robust against this, but let's ensure
2094 that SIGCHLD is set to SIG_DFL, because it's tidier to wait and get a process
2095 ending status. We use sigaction rather than plain signal() on those OS where
2096 SA_NOCLDWAIT exists, because we want to be sure it is turned off. (There was a
2097 problem on AIX with this.) */
2098
2099 #ifdef SA_NOCLDWAIT
2100   {
2101   struct sigaction act;
2102   act.sa_handler = SIG_DFL;
2103   sigemptyset(&(act.sa_mask));
2104   act.sa_flags = 0;
2105   sigaction(SIGCHLD, &act, NULL);
2106   }
2107 #else
2108 signal(SIGCHLD, SIG_DFL);
2109 #endif
2110
2111 /* Save the arguments for use if we re-exec exim as a daemon after receiving
2112 SIGHUP. */
2113
2114 sighup_argv = argv;
2115
2116 /* Set up the version number. Set up the leading 'E' for the external form of
2117 message ids, set the pointer to the internal form, and initialize it to
2118 indicate no message being processed. */
2119
2120 version_init();
2121 message_id_option[0] = '-';
2122 message_id_external = message_id_option + 1;
2123 message_id_external[0] = 'E';
2124 message_id = message_id_external + 1;
2125 message_id[0] = 0;
2126
2127 /* Set the umask to zero so that any files Exim creates using open() are
2128 created with the modes that it specifies. NOTE: Files created with fopen() have
2129 a problem, which was not recognized till rather late (February 2006). With this
2130 umask, such files will be world writeable. (They are all content scanning files
2131 in the spool directory, which isn't world-accessible, so this is not a
2132 disaster, but it's untidy.) I don't want to change this overall setting,
2133 however, because it will interact badly with the open() calls. Instead, there's
2134 now a function called modefopen() that fiddles with the umask while calling
2135 fopen(). */
2136
2137 (void)umask(0);
2138
2139 /* Precompile the regular expression for matching a message id. Keep this in
2140 step with the code that generates ids in the accept.c module. We need to do
2141 this here, because the -M options check their arguments for syntactic validity
2142 using mac_ismsgid, which uses this. */
2143
2144 regex_ismsgid =
2145   regex_must_compile(US"^(?:"
2146           "[^\\W_]{" str(MESSAGE_ID_TIME_LEN) "}"
2147           "-[^\\W_]{" str(MESSAGE_ID_PID_LEN) "}"
2148           "-[^\\W_]{" str(MESSAGE_ID_SUBTIME_LEN) "}"
2149         "|"
2150           "(?:[^\\W_]{6}-){2}[^\\W_]{2}"                /* old ID format */
2151         ")$",
2152     MCS_NOFLAGS, TRUE);
2153
2154 /* Precompile the regular expression that is used for matching an SMTP error
2155 code, possibly extended, at the start of an error message. Note that the
2156 terminating whitespace character is included. */
2157
2158 regex_smtp_code =
2159   regex_must_compile(US"^\\d\\d\\d\\s(?:\\d\\.\\d\\d?\\d?\\.\\d\\d?\\d?\\s)?",
2160     MCS_NOFLAGS, TRUE);
2161
2162 #ifdef WHITELIST_D_MACROS
2163 /* Precompile the regular expression used to filter the content of macros
2164 given to -D for permissibility. */
2165
2166 regex_whitelisted_macro =
2167   regex_must_compile(US"^[A-Za-z0-9_/.-]*$", MCS_NOFLAGS, TRUE);
2168 #endif
2169
2170 /* If the program is called as "mailq" treat it as equivalent to "exim -bp";
2171 this seems to be a generally accepted convention, since one finds symbolic
2172 links called "mailq" in standard OS configurations. */
2173
2174 if ((namelen == 5 && Ustrcmp(argv[0], "mailq") == 0) ||
2175     (namelen  > 5 && Ustrncmp(argv[0] + namelen - 6, "/mailq", 6) == 0))
2176   {
2177   list_queue = TRUE;
2178   receiving_message = FALSE;
2179   called_as = US"-mailq";
2180   }
2181
2182 /* If the program is called as "rmail" treat it as equivalent to
2183 "exim -i -oee", thus allowing UUCP messages to be input using non-SMTP mode,
2184 i.e. preventing a single dot on a line from terminating the message, and
2185 returning with zero return code, even in cases of error (provided an error
2186 message has been sent). */
2187
2188 if ((namelen == 5 && Ustrcmp(argv[0], "rmail") == 0) ||
2189     (namelen  > 5 && Ustrncmp(argv[0] + namelen - 6, "/rmail", 6) == 0))
2190   {
2191   f.dot_ends = FALSE;
2192   called_as = US"-rmail";
2193   errors_sender_rc = EXIT_SUCCESS;
2194   }
2195
2196 /* If the program is called as "rsmtp" treat it as equivalent to "exim -bS";
2197 this is a smail convention. */
2198
2199 if ((namelen == 5 && Ustrcmp(argv[0], "rsmtp") == 0) ||
2200     (namelen  > 5 && Ustrncmp(argv[0] + namelen - 6, "/rsmtp", 6) == 0))
2201   {
2202   smtp_input = smtp_batched_input = TRUE;
2203   called_as = US"-rsmtp";
2204   }
2205
2206 /* If the program is called as "runq" treat it as equivalent to "exim -q";
2207 this is a smail convention. */
2208
2209 if ((namelen == 4 && Ustrcmp(argv[0], "runq") == 0) ||
2210     (namelen  > 4 && Ustrncmp(argv[0] + namelen - 5, "/runq", 5) == 0))
2211   {
2212   alloc_onetime_qrunner();
2213   receiving_message = FALSE;
2214   called_as = US"-runq";
2215   }
2216
2217 /* If the program is called as "newaliases" treat it as equivalent to
2218 "exim -bi"; this is a sendmail convention. */
2219
2220 if ((namelen == 10 && Ustrcmp(argv[0], "newaliases") == 0) ||
2221     (namelen  > 10 && Ustrncmp(argv[0] + namelen - 11, "/newaliases", 11) == 0))
2222   {
2223   bi_option = TRUE;
2224   receiving_message = FALSE;
2225   called_as = US"-newaliases";
2226   }
2227
2228 /* Save the original effective uid for a couple of uses later. It should
2229 normally be root, but in some esoteric environments it may not be. */
2230
2231 original_euid = geteuid();
2232 original_egid = getegid();
2233
2234 /* Get the real uid and gid. If the caller is root, force the effective uid/gid
2235 to be the same as the real ones. This makes a difference only if Exim is setuid
2236 (or setgid) to something other than root, which could be the case in some
2237 special configurations. */
2238
2239 real_uid = getuid();
2240 real_gid = getgid();
2241
2242 if (real_uid == root_uid)
2243   {
2244   if ((rv = setgid(real_gid)))
2245     exim_fail("exim: setgid(%ld) failed: %s\n",
2246         (long int)real_gid, strerror(errno));
2247   if ((rv = setuid(real_uid)))
2248     exim_fail("exim: setuid(%ld) failed: %s\n",
2249         (long int)real_uid, strerror(errno));
2250   }
2251
2252 /* If neither the original real uid nor the original euid was root, Exim is
2253 running in an unprivileged state. */
2254
2255 unprivileged = (real_uid != root_uid && original_euid != root_uid);
2256
2257 /* For most of the args-parsing we need to use permanent pool memory */
2258  {
2259  int old_pool = store_pool;
2260  store_pool = POOL_PERM;
2261
2262 /* Scan the program's arguments. Some can be dealt with right away; others are
2263 simply recorded for checking and handling afterwards. Do a high-level switch
2264 on the second character (the one after '-'), to save some effort. */
2265
2266  for (i = 1; i < argc; i++)
2267   {
2268   BOOL badarg = FALSE;
2269   const uschar * arg = argv[i];
2270   const uschar * argrest;
2271   uschar switchchar;
2272
2273   /* An argument not starting with '-' is the start of a recipients list;
2274   break out of the options-scanning loop. */
2275
2276   if (arg[0] != '-')
2277     {
2278     recipients_arg = i;
2279     break;
2280     }
2281
2282   /* An option consisting of -- terminates the options */
2283
2284   if (Ustrcmp(arg, "--") == 0)
2285     {
2286     recipients_arg = i + 1;
2287     break;
2288     }
2289
2290   /* Handle flagged options */
2291
2292   switchchar = arg[1];
2293   argrest = arg+2;
2294
2295   /* Make all -ex options synonymous with -oex arguments, since that
2296   is assumed by various callers. Also make -qR options synonymous with -R
2297   options, as that seems to be required as well. Allow for -qqR too, and
2298   the same for -S options. */
2299
2300   if (Ustrncmp(arg+1, "oe", 2) == 0 ||
2301       Ustrncmp(arg+1, "qR", 2) == 0 ||
2302       Ustrncmp(arg+1, "qS", 2) == 0)
2303     {
2304     switchchar = arg[2];
2305     argrest++;
2306     }
2307   else if (Ustrncmp(arg+1, "qqR", 3) == 0 || Ustrncmp(arg+1, "qqS", 3) == 0)
2308     {
2309     switchchar = arg[3];
2310     argrest += 2;
2311     f.queue_2stage = TRUE;
2312     }
2313
2314   /* Make -r synonymous with -f, since it is a documented alias */
2315
2316   else if (arg[1] == 'r') switchchar = 'f';
2317
2318   /* Make -ov synonymous with -v */
2319
2320   else if (Ustrcmp(arg, "-ov") == 0)
2321     {
2322     switchchar = 'v';
2323     argrest++;
2324     }
2325
2326   /* deal with --option_aliases */
2327   else if (switchchar == '-')
2328     {
2329     if (Ustrcmp(argrest, "help") == 0)
2330       {
2331       usage_wanted = TRUE;
2332       break;
2333       }
2334     else if (Ustrcmp(argrest, "version") == 0)
2335       {
2336       switchchar = 'b';
2337       argrest = US"V";
2338       }
2339     }
2340
2341   /* High-level switch on active initial letter */
2342
2343   switch(switchchar)
2344     {
2345
2346     /* sendmail uses -Ac and -Am to control which .cf file is used;
2347     we ignore them. */
2348     case 'A':
2349     if (!*argrest) { badarg = TRUE; break; }
2350     else
2351       {
2352       BOOL ignore = FALSE;
2353       switch (*argrest)
2354         {
2355         case 'c':
2356         case 'm':
2357           if (*(argrest + 1) == '\0')
2358             ignore = TRUE;
2359           break;
2360         }
2361       if (!ignore) badarg = TRUE;
2362       }
2363     break;
2364
2365     /* -Btype is a sendmail option for 7bit/8bit setting. Exim is 8-bit clean
2366     so has no need of it. */
2367
2368     case 'B':
2369     if (!*argrest) i++;       /* Skip over the type */
2370     break;
2371
2372
2373     case 'b':
2374       {
2375       receiving_message = FALSE;    /* Reset TRUE for -bm, -bS, -bs below */
2376
2377       switch (*argrest++)
2378         {
2379         /* -bd:  Run in daemon mode, awaiting SMTP connections.
2380            -bdf: Ditto, but in the foreground.
2381         */
2382         case 'd':
2383           f.daemon_listen = f.daemon_scion = TRUE;
2384           if (*argrest == 'f') f.background_daemon = FALSE;
2385           else if (*argrest) badarg = TRUE;
2386           break;
2387
2388         /* -be:  Run in expansion test mode
2389            -bem: Ditto, but read a message from a file first
2390         */
2391         case 'e':
2392           expansion_test = checking = TRUE;
2393           if (*argrest == 'm')
2394             {
2395             if (++i >= argc) { badarg = TRUE; break; }
2396             expansion_test_message = argv[i];
2397             argrest++;
2398             }
2399           if (*argrest) badarg = TRUE;
2400           break;
2401
2402         /* -bF:  Run system filter test */
2403         case 'F':
2404           filter_test |= checking = FTEST_SYSTEM;
2405           if (*argrest) badarg = TRUE;
2406           else if (++i < argc) filter_test_sfile = argv[i];
2407           else exim_fail("exim: file name expected after %s\n", argv[i-1]);
2408           break;
2409
2410         /* -bf:  Run user filter test
2411            -bfd: Set domain for filter testing
2412            -bfl: Set local part for filter testing
2413            -bfp: Set prefix for filter testing
2414            -bfs: Set suffix for filter testing
2415         */
2416         case 'f':
2417           if (!*argrest)
2418             {
2419             filter_test |= checking = FTEST_USER;
2420             if (++i < argc) filter_test_ufile = argv[i];
2421             else exim_fail("exim: file name expected after %s\n", argv[i-1]);
2422             }
2423           else
2424             {
2425             if (++i >= argc)
2426               exim_fail("exim: string expected after %s\n", arg);
2427             if (Ustrcmp(argrest, "d") == 0) ftest_domain = exim_str_fail_toolong(argv[i], EXIM_DOMAINNAME_MAX, "-bfd");
2428             else if (Ustrcmp(argrest, "l") == 0) ftest_localpart = exim_str_fail_toolong(argv[i], EXIM_LOCALPART_MAX, "-bfl");
2429             else if (Ustrcmp(argrest, "p") == 0) ftest_prefix = exim_str_fail_toolong(argv[i], EXIM_LOCALPART_MAX, "-bfp");
2430             else if (Ustrcmp(argrest, "s") == 0) ftest_suffix = exim_str_fail_toolong(argv[i], EXIM_LOCALPART_MAX, "-bfs");
2431             else badarg = TRUE;
2432             }
2433           break;
2434
2435         /* -bh: Host checking - an IP address must follow. */
2436         case 'h':
2437           if (  (!*argrest || Ustrcmp(argrest, "c") == 0)
2438              && ++i < argc)
2439             {
2440             sender_host_address = string_copy_taint(
2441                   exim_str_fail_toolong(argv[i], EXIM_IPADDR_MAX, "-bh"),
2442                   GET_TAINTED);
2443             host_checking = checking = f.log_testing_mode = TRUE;
2444             f.host_checking_callout = *argrest == 'c';
2445             message_logs = FALSE;
2446             }
2447           else
2448             badarg = TRUE;
2449           break;
2450
2451         /* -bi: This option is used by sendmail to initialize *the* alias file,
2452         though it has the -oA option to specify a different file. Exim has no
2453         concept of *the* alias file, but since Sun's YP make script calls
2454         sendmail this way, some support must be provided. */
2455         case 'i':
2456           if (!*argrest) bi_option = TRUE;
2457           else badarg = TRUE;
2458           break;
2459
2460         /* -bI: provide information, of the type to follow after a colon.
2461         This is an Exim flag. */
2462         case 'I':
2463           if (Ustrlen(argrest) >= 1 && *argrest == ':')
2464             {
2465             const uschar * p = argrest+1;
2466             info_flag = CMDINFO_HELP;
2467             if (Ustrlen(p))
2468               if (strcmpic(p, CUS"sieve") == 0)
2469                 {
2470                 info_flag = CMDINFO_SIEVE;
2471                 info_stdout = TRUE;
2472                 }
2473               else if (strcmpic(p, CUS"dscp") == 0)
2474                 {
2475                 info_flag = CMDINFO_DSCP;
2476                 info_stdout = TRUE;
2477                 }
2478               else if (strcmpic(p, CUS"help") == 0)
2479                 info_stdout = TRUE;
2480             }
2481           else badarg = TRUE;
2482           break;
2483
2484         /* -bm: Accept and deliver message - the default option. Reinstate
2485         receiving_message, which got turned off for all -b options.
2486            -bmalware: test the filename given for malware */
2487         case 'm':
2488           if (!*argrest) receiving_message = TRUE;
2489           else if (Ustrcmp(argrest, "alware") == 0)
2490             {
2491             if (++i >= argc) { badarg = TRUE; break; }
2492             checking = TRUE;
2493             malware_test_file = argv[i];
2494             }
2495           else badarg = TRUE;
2496           break;
2497
2498         /* -bnq: For locally originating messages, do not qualify unqualified
2499         addresses. In the envelope, this causes errors; in header lines they
2500         just get left. */
2501         case 'n':
2502           if (Ustrcmp(argrest, "q") == 0)
2503             {
2504             f.allow_unqualified_sender = FALSE;
2505             f.allow_unqualified_recipient = FALSE;
2506             }
2507           else badarg = TRUE;
2508           break;
2509
2510         /* -bpxx: List the contents of the mail queue, in various forms. If
2511         the option is -bpc, just a queue count is needed. Otherwise, if the
2512         first letter after p is r, then order is random. */
2513         case 'p':
2514           if (*argrest == 'c')
2515             {
2516             count_queue = TRUE;
2517             if (*++argrest) badarg = TRUE;
2518             break;
2519             }
2520
2521           if (*argrest == 'r')
2522             list_queue_option = QL_UNSORTED, argrest++;
2523           else
2524             list_queue_option = QL_BASIC;
2525
2526           list_queue = TRUE;
2527
2528           /* -bp: List the contents of the mail queue, top-level only */
2529
2530           if (!*argrest) {}
2531
2532           /* -bpu: List the contents of the mail queue, top-level undelivered */
2533
2534           else if (Ustrcmp(argrest, "u") == 0) list_queue_option |= QL_UNDELIVERED_ONLY;
2535
2536           /* -bpa: List the contents of the mail queue, including all delivered */
2537
2538           else if (Ustrcmp(argrest, "a") == 0) list_queue_option |= QL_PLUS_GENERATED;
2539
2540           /* -bpi: List only message IDs */
2541
2542           else if (Ustrcmp(argrest, "i") == 0) list_queue_option |= QL_MSGID_ONLY;
2543
2544           /* Unknown after -bp[r] */
2545
2546           else badarg = TRUE;
2547           break;
2548
2549
2550         /* -bP: List the configuration variables given as the address list.
2551         Force -v, so configuration errors get displayed. */
2552         case 'P':
2553
2554           /* -bP config: we need to setup here, because later,
2555           when list_options is checked, the config is read already */
2556           if (*argrest)
2557             badarg = TRUE;
2558           else if (argv[i+1] && Ustrcmp(argv[i+1], "config") == 0)
2559             {
2560             list_config = TRUE;
2561             readconf_save_config(version_string);
2562             }
2563           else
2564             {
2565             list_options = TRUE;
2566             debug_selector |= D_v;
2567             debug_file = stderr;
2568             }
2569           break;
2570
2571         /* -brt: Test retry configuration lookup */
2572         case 'r':
2573           if (Ustrcmp(argrest, "t") == 0)
2574             {
2575             checking = TRUE;
2576             test_retry_arg = i + 1;
2577             goto END_ARG;
2578             }
2579
2580           /* -brw: Test rewrite configuration */
2581
2582           else if (Ustrcmp(argrest, "w") == 0)
2583             {
2584             checking = TRUE;
2585             test_rewrite_arg = i + 1;
2586             goto END_ARG;
2587             }
2588           else badarg = TRUE;
2589           break;
2590
2591         /* -bS: Read SMTP commands on standard input, but produce no replies -
2592         all errors are reported by sending messages. */
2593         case 'S':
2594           if (!*argrest)
2595             smtp_input = smtp_batched_input = receiving_message = TRUE;
2596           else badarg = TRUE;
2597           break;
2598
2599         /* -bs: Read SMTP commands on standard input and produce SMTP replies
2600         on standard output. */
2601         case 's':
2602           if (!*argrest) smtp_input = receiving_message = TRUE;
2603           else badarg = TRUE;
2604           break;
2605
2606         /* -bt: address testing mode */
2607         case 't':
2608           if (!*argrest)
2609             f.address_test_mode = checking = f.log_testing_mode = TRUE;
2610           else badarg = TRUE;
2611           break;
2612
2613         /* -bv: verify addresses */
2614         case 'v':
2615           if (!*argrest)
2616             verify_address_mode = checking = f.log_testing_mode = TRUE;
2617
2618         /* -bvs: verify sender addresses */
2619
2620           else if (Ustrcmp(argrest, "s") == 0)
2621             {
2622             verify_address_mode = checking = f.log_testing_mode = TRUE;
2623             verify_as_sender = TRUE;
2624             }
2625           else badarg = TRUE;
2626           break;
2627
2628         /* -bV: Print version string and support details */
2629         case 'V':
2630           if (!*argrest)
2631             {
2632             printf("Exim version %s #%s built %s\n", version_string,
2633               version_cnumber, version_date);
2634             printf("%s\n", CS version_copyright);
2635             version_printed = TRUE;
2636             show_whats_supported(TRUE);
2637             f.log_testing_mode = TRUE;
2638             }
2639           else badarg = TRUE;
2640           break;
2641
2642         /* -bw: inetd wait mode, accept a listening socket as stdin */
2643         case 'w':
2644           f.inetd_wait_mode = TRUE;
2645           f.background_daemon = FALSE;
2646           f.daemon_listen = f.daemon_scion = TRUE;
2647           if (*argrest)
2648             if ((inetd_wait_timeout = readconf_readtime(argrest, 0, FALSE)) <= 0)
2649               exim_fail("exim: bad time value %s: abandoned\n", argv[i]);
2650           break;
2651
2652         default:
2653           badarg = TRUE;
2654           break;
2655         }
2656       break;
2657       }
2658
2659
2660     /* -C: change configuration file list; ignore if it isn't really
2661     a change! Enforce a prefix check if required. */
2662
2663     case 'C':
2664     if (!*argrest)
2665       if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; }
2666     if (Ustrcmp(config_main_filelist, argrest) != 0)
2667       {
2668       #ifdef ALT_CONFIG_PREFIX
2669       int sep = 0;
2670       int len = Ustrlen(ALT_CONFIG_PREFIX);
2671       const uschar *list = argrest;
2672       uschar *filename;
2673       /* The argv is untainted, so big_buffer (also untainted) is ok to use */
2674       while((filename = string_nextinlist(&list, &sep, big_buffer,
2675              big_buffer_size)))
2676         if (  (  Ustrlen(filename) < len
2677               || Ustrncmp(filename, ALT_CONFIG_PREFIX, len) != 0
2678               || Ustrstr(filename, "/../") != NULL
2679               )
2680            && (Ustrcmp(filename, "/dev/null") != 0 || real_uid != root_uid)
2681            )
2682           exim_fail("-C Permission denied\n");
2683       #endif
2684       if (real_uid != root_uid)
2685         {
2686         #ifdef TRUSTED_CONFIG_LIST
2687
2688         if (real_uid != exim_uid
2689             #ifdef CONFIGURE_OWNER
2690             && real_uid != config_uid
2691             #endif
2692             )
2693           f.trusted_config = FALSE;
2694         else
2695           {
2696           FILE *trust_list = Ufopen(TRUSTED_CONFIG_LIST, "rb");
2697           if (trust_list)
2698             {
2699             struct stat statbuf;
2700
2701             if (fstat(fileno(trust_list), &statbuf) != 0 ||
2702                 (statbuf.st_uid != root_uid        /* owner not root */
2703                  #ifdef CONFIGURE_OWNER
2704                  && statbuf.st_uid != config_uid   /* owner not the special one */
2705                  #endif
2706                    ) ||                            /* or */
2707                 (statbuf.st_gid != root_gid        /* group not root */
2708                  #ifdef CONFIGURE_GROUP
2709                  && statbuf.st_gid != config_gid   /* group not the special one */
2710                  #endif
2711                  && (statbuf.st_mode & 020) != 0   /* group writeable */
2712                    ) ||                            /* or */
2713                 (statbuf.st_mode & 2) != 0)        /* world writeable */
2714               {
2715               f.trusted_config = FALSE;
2716               fclose(trust_list);
2717               }
2718             else
2719               {
2720               /* Well, the trust list at least is up to scratch... */
2721               rmark reset_point;
2722               uschar *trusted_configs[32];
2723               int nr_configs = 0;
2724               int i = 0;
2725               int old_pool = store_pool;
2726               store_pool = POOL_MAIN;
2727
2728               reset_point = store_mark();
2729               while (Ufgets(big_buffer, big_buffer_size, trust_list))
2730                 {
2731                 uschar * start = big_buffer, * nl;
2732                 if (Uskip_whitespace(&start) != '/')
2733                   continue;
2734                 if ((nl = Ustrchr(start, '\n')))
2735                   *nl = '\0';
2736                 trusted_configs[nr_configs++] = string_copy(start);
2737                 if (nr_configs == nelem(trusted_configs))
2738                   break;
2739                 }
2740               fclose(trust_list);
2741
2742               if (nr_configs)
2743                 {
2744                 int sep = 0;
2745                 const uschar *list = argrest;
2746                 uschar *filename;
2747                 while (f.trusted_config && (filename = string_nextinlist(&list,
2748                         &sep, big_buffer, big_buffer_size)))
2749                   {
2750                   for (i=0; i < nr_configs; i++)
2751                     if (Ustrcmp(filename, trusted_configs[i]) == 0)
2752                       break;
2753                   if (i == nr_configs)
2754                     {
2755                     f.trusted_config = FALSE;
2756                     break;
2757                     }
2758                   }
2759                 }
2760               else      /* No valid prefixes found in trust_list file. */
2761                 f.trusted_config = FALSE;
2762               store_reset(reset_point);
2763               store_pool = old_pool;
2764               }
2765             }
2766           else          /* Could not open trust_list file. */
2767             f.trusted_config = FALSE;
2768           }
2769       #else
2770         /* Not root; don't trust config */
2771         f.trusted_config = FALSE;
2772       #endif
2773         }
2774
2775       config_main_filelist = argrest;
2776       f.config_changed = TRUE;
2777       }
2778     break;
2779
2780
2781     /* -D: set up a macro definition */
2782
2783     case 'D':
2784 #ifdef DISABLE_D_OPTION
2785       exim_fail("exim: -D is not available in this Exim binary\n");
2786 #else
2787       {
2788       int ptr = 0;
2789       macro_item * m;
2790       uschar name[24];
2791       const uschar * s = argrest;
2792
2793       opt_D_used = TRUE;
2794       Uskip_whitespace(&s);
2795
2796       if (*s < 'A' || *s > 'Z')
2797         exim_fail("exim: macro name set by -D must start with "
2798           "an upper case letter\n");
2799
2800       while (isalnum(*s) || *s == '_')
2801         {
2802         if (ptr < sizeof(name)-1) name[ptr++] = *s;
2803         s++;
2804         }
2805       name[ptr] = 0;
2806       if (ptr == 0) { badarg = TRUE; break; }
2807       if (Uskip_whitespace(&s))
2808         {
2809         if (*s++ != '=') { badarg = TRUE; break; }
2810         Uskip_whitespace(&s);
2811         }
2812
2813       for (m = macros_user; m; m = m->next)
2814         if (Ustrcmp(m->name, name) == 0)
2815           exim_fail("exim: duplicated -D in command line\n");
2816
2817       m = macro_create(name, s, TRUE);
2818
2819       if (clmacro_count >= MAX_CLMACROS)
2820         exim_fail("exim: too many -D options on command line\n");
2821       clmacros[clmacro_count++] =
2822         string_sprintf("-D%s=%s", m->name, m->replacement);
2823       }
2824     #endif
2825     break;
2826
2827     case 'd':
2828
2829     /* -dropcr: Set this option.  Now a no-op, retained for compatibility only. */
2830
2831     if (Ustrcmp(argrest, "ropcr") == 0)
2832       {
2833       /* drop_cr = TRUE; */
2834       }
2835
2836     /* -dp: Set up a debug pretrigger buffer with given size. */
2837
2838     else if (Ustrcmp(argrest, "p") == 0)
2839       if (++i >= argc)
2840         badarg = TRUE;
2841       else
2842         debug_pretrigger_setup(argv[i]);
2843
2844     /* -dt: Set a debug trigger selector */
2845
2846     else if (Ustrncmp(argrest, "t=", 2) == 0)
2847       dtrigger_selector = (unsigned int) Ustrtol(argrest + 2, NULL, 0);
2848
2849     /* -d: Set debug level (see also -v below).
2850     If -dd is used, debugging subprocesses of the daemon is disabled. */
2851
2852     else
2853       {
2854       /* Use an intermediate variable so that we don't set debugging while
2855       decoding the debugging bits. */
2856
2857       unsigned int selector = D_default;
2858       debug_selector = 0;
2859       debug_file = NULL;
2860       if (*argrest == 'd')
2861         {
2862         f.debug_daemon = TRUE;
2863         argrest++;
2864         }
2865       if (*argrest)
2866         decode_bits(&selector, 1, debug_notall, argrest,
2867           debug_options, debug_options_count, US"debug", 0);
2868       debug_selector = selector;
2869       }
2870     break;
2871
2872
2873     /* -E: This is a local error message. This option is not intended for
2874     external use at all, but is not restricted to trusted callers because it
2875     does no harm (just suppresses certain error messages) and if Exim is run
2876     not setuid root it won't always be trusted when it generates error
2877     messages using this option. If there is a message id following -E, point
2878     message_reference at it, for logging. */
2879
2880     case 'E':
2881     f.local_error_message = TRUE;
2882     if (mac_ismsgid(argrest)) message_reference = argrest;
2883     break;
2884
2885
2886     /* -ex: The vacation program calls sendmail with the undocumented "-eq"
2887     option, so it looks as if historically the -oex options are also callable
2888     without the leading -o. So we have to accept them. Before the switch,
2889     anything starting -oe has been converted to -e. Exim does not support all
2890     of the sendmail error options. */
2891
2892     case 'e':
2893     if (Ustrcmp(argrest, "e") == 0)
2894       {
2895       arg_error_handling = ERRORS_SENDER;
2896       errors_sender_rc = EXIT_SUCCESS;
2897       }
2898     else if (Ustrcmp(argrest, "m") == 0) arg_error_handling = ERRORS_SENDER;
2899     else if (Ustrcmp(argrest, "p") == 0) arg_error_handling = ERRORS_STDERR;
2900     else if (Ustrcmp(argrest, "q") == 0) arg_error_handling = ERRORS_STDERR;
2901     else if (Ustrcmp(argrest, "w") == 0) arg_error_handling = ERRORS_SENDER;
2902     else badarg = TRUE;
2903     break;
2904
2905
2906     /* -F: Set sender's full name, used instead of the gecos entry from
2907     the password file. Since users can usually alter their gecos entries,
2908     there's no security involved in using this instead. The data can follow
2909     the -F or be in the next argument. */
2910
2911     case 'F':
2912     if (!*argrest)
2913       if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; }
2914     originator_name = string_copy_taint(
2915                   exim_str_fail_toolong(argrest, EXIM_HUMANNAME_MAX, "-F"),
2916                   GET_TAINTED);
2917     f.sender_name_forced = TRUE;
2918     break;
2919
2920
2921     /* -f: Set sender's address - this value is only actually used if Exim is
2922     run by a trusted user, or if untrusted_set_sender is set and matches the
2923     address, except that the null address can always be set by any user. The
2924     test for this happens later, when the value given here is ignored when not
2925     permitted. For an untrusted user, the actual sender is still put in Sender:
2926     if it doesn't match the From: header (unless no_local_from_check is set).
2927     The data can follow the -f or be in the next argument. The -r switch is an
2928     obsolete form of -f but since there appear to be programs out there that
2929     use anything that sendmail has ever supported, better accept it - the
2930     synonymizing is done before the switch above.
2931
2932     At this stage, we must allow domain literal addresses, because we don't
2933     know what the setting of allow_domain_literals is yet. Ditto for trailing
2934     dots and strip_trailing_dot. */
2935
2936     case 'f':
2937       {
2938       int dummy_start, dummy_end;
2939       uschar *errmess;
2940       if (!*argrest)
2941         if (i+1 < argc) argrest = argv[++i]; else { badarg = TRUE; break; }
2942       (void) exim_str_fail_toolong(argrest, EXIM_DISPLAYMAIL_MAX, "-f");
2943       if (!*argrest)
2944         {
2945         uschar * s = store_get(1, GET_UNTAINTED);       /* Ensure writeable memory */
2946         *s = '\0';
2947         sender_address = s;
2948         }
2949       else
2950         {
2951         const uschar * temp = argrest + Ustrlen(argrest) - 1;
2952         while (temp >= argrest && isspace(*temp)) temp--;
2953         if (temp >= argrest && *temp == '.') f_end_dot = TRUE;
2954         allow_domain_literals = TRUE;
2955         strip_trailing_dot = TRUE;
2956 #ifdef SUPPORT_I18N
2957         allow_utf8_domains = TRUE;
2958 #endif
2959         if (!(sender_address = parse_extract_address(argrest, &errmess,
2960                   &dummy_start, &dummy_end, &sender_address_domain, TRUE)))
2961           exim_fail("exim: bad -f address \"%s\": %s\n", argrest, errmess);
2962
2963         sender_address = string_copy_taint(sender_address, GET_TAINTED);
2964 #ifdef SUPPORT_I18N
2965         message_smtputf8 =  string_is_utf8(sender_address);
2966         allow_utf8_domains = FALSE;
2967 #endif
2968         allow_domain_literals = FALSE;
2969         strip_trailing_dot = FALSE;
2970         }
2971       f.sender_address_forced = TRUE;
2972       }
2973     break;
2974
2975     /* -G: sendmail invocation to specify that it's a gateway submission and
2976     sendmail may complain about problems instead of fixing them.
2977     We make it equivalent to an ACL "control = suppress_local_fixups" and do
2978     not at this time complain about problems. */
2979
2980     case 'G':
2981     flag_G = TRUE;
2982     break;
2983
2984     /* -h: Set the hop count for an incoming message. Exim does not currently
2985     support this; it always computes it by counting the Received: headers.
2986     To put it in will require a change to the spool header file format. */
2987
2988     case 'h':
2989     if (!*argrest)
2990       if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; }
2991     if (!isdigit(*argrest)) badarg = TRUE;
2992     break;
2993
2994
2995     /* -i: Set flag so dot doesn't end non-SMTP input (same as -oi, seems
2996     not to be documented for sendmail but mailx (at least) uses it) */
2997
2998     case 'i':
2999     if (!*argrest) f.dot_ends = FALSE; else badarg = TRUE;
3000     break;
3001
3002
3003     /* -L: set the identifier used for syslog; equivalent to setting
3004     syslog_processname in the config file, but needs to be an admin option. */
3005
3006     case 'L':
3007     if (!*argrest)
3008       if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; }
3009     if ((sz = Ustrlen(argrest)) > 32)
3010       exim_fail("exim: the -L syslog name is too long: \"%s\"\n", argrest);
3011     if (sz < 1)
3012       exim_fail("exim: the -L syslog name is too short\n");
3013     cmdline_syslog_name = string_copy_taint(argrest, GET_TAINTED);
3014     break;
3015
3016     case 'M':
3017     receiving_message = FALSE;
3018
3019     /* -MC:  continue delivery of another message via an existing open
3020     file descriptor. This option is used for an internal call by the
3021     smtp transport when there is a pending message waiting to go to an
3022     address to which it has got a connection. Five subsequent arguments are
3023     required: transport name, host name, IP address, sequence number, and
3024     message_id. Transports may decline to create new processes if the sequence
3025     number gets too big. The channel is stdin. This (-MC) must be the last
3026     argument. There's a subsequent check that the real-uid is privileged.
3027
3028     If we are running in the test harness. delay for a bit, to let the process
3029     that set this one up complete. This makes for repeatability of the logging,
3030     etc. output. */
3031
3032     if (Ustrcmp(argrest, "C") == 0)
3033       {
3034       union sockaddr_46 interface_sock;
3035       EXIM_SOCKLEN_T size = sizeof(interface_sock);
3036
3037       if (argc != i + 6)
3038         exim_fail("exim: too many or too few arguments after -MC\n");
3039
3040       if (msg_action_arg >= 0)
3041         exim_fail("exim: incompatible arguments\n");
3042
3043       continue_transport = string_copy_taint(
3044         exim_str_fail_toolong(argv[++i], EXIM_DRIVERNAME_MAX, "-C internal transport"),
3045         GET_TAINTED);
3046       continue_hostname = string_copy_taint(
3047         exim_str_fail_toolong(argv[++i], EXIM_HOSTNAME_MAX, "-C internal hostname"),
3048         GET_TAINTED);
3049       continue_host_address = string_copy_taint(
3050         exim_str_fail_toolong(argv[++i], EXIM_IPADDR_MAX, "-C internal hostaddr"),
3051         GET_TAINTED);
3052       continue_sequence = Uatoi(argv[++i]);
3053       msg_action = MSG_DELIVER;
3054       msg_action_arg = ++i;
3055       forced_delivery = TRUE;
3056       queue_run_pid = passed_qr_pid;
3057       queue_run_pipe = passed_qr_pipe;
3058
3059       if (!mac_ismsgid(argv[i]))
3060         exim_fail("exim: malformed message id %s after -MC option\n",
3061           argv[i]);
3062
3063       /* Set up $sending_ip_address and $sending_port, unless proxied */
3064
3065       if (!continue_proxy_cipher)
3066         if (getsockname(fileno(stdin), (struct sockaddr *)(&interface_sock),
3067             &size) == 0)
3068           sending_ip_address = host_ntoa(-1, &interface_sock, NULL,
3069             &sending_port);
3070         else
3071           exim_fail("exim: getsockname() failed after -MC option: %s\n",
3072             strerror(errno));
3073
3074       testharness_pause_ms(500);
3075       break;
3076       }
3077
3078     else if (*argrest == 'C' && argrest[1] && !argrest[2])
3079       {
3080       switch(argrest[1])
3081         {
3082     /* -MCA: set the smtp_authenticated flag; this is useful only when it
3083     precedes -MC (see above). The flag indicates that the host to which
3084     Exim is connected has accepted an AUTH sequence. */
3085
3086         case 'A': f.smtp_authenticated = TRUE; break;
3087
3088     /* -MCD: set the smtp_use_dsn flag; this indicates that the host
3089        that exim is connected to supports the esmtp extension DSN */
3090
3091         case 'D': smtp_peer_options |= OPTION_DSN; break;
3092
3093     /* -MCd: for debug, set a process-purpose string */
3094
3095         case 'd': if (++i < argc)
3096                     process_purpose = string_copy_taint(
3097                       exim_str_fail_toolong(argv[i], EXIM_DRIVERNAME_MAX, "-MCd"),
3098                       GET_TAINTED);
3099                   else badarg = TRUE;
3100                   break;
3101
3102     /* -MCG: set the queue name, to a non-default value. Arguably, anything
3103        from the commandline should be tainted - but we will need an untainted
3104        value for the spoolfile when doing a -odi delivery process. */
3105
3106         case 'G': if (++i < argc) queue_name = string_copy_taint(
3107                       exim_str_fail_toolong(argv[i], EXIM_DRIVERNAME_MAX, "-MCG"),
3108                       GET_UNTAINTED);
3109                   else badarg = TRUE;
3110                   break;
3111
3112     /* -MCK: the peer offered CHUNKING.  Must precede -MC */
3113
3114         case 'K': smtp_peer_options |= OPTION_CHUNKING; break;
3115
3116 #ifndef DISABLE_ESMTP_LIMITS
3117     /* -MCL: peer used LIMITS RCPTMAX and/or RCPTDOMAINMAX */
3118         case 'L': if (++i < argc) continue_limit_mail = Uatoi(argv[i]);
3119                   else badarg = TRUE;
3120                   if (++i < argc) continue_limit_rcpt = Uatoi(argv[i]);
3121                   else badarg = TRUE;
3122                   if (++i < argc) continue_limit_rcptdom = Uatoi(argv[i]);
3123                   else badarg = TRUE;
3124                   break;
3125 #endif
3126
3127     /* -MCP: set the smtp_use_pipelining flag; this is useful only when
3128     it preceded -MC (see above) */
3129
3130         case 'P': smtp_peer_options |= OPTION_PIPE; break;
3131
3132 #ifdef SUPPORT_SOCKS
3133     /* -MCp: Socks proxy in use; nearside IP, port, external IP, port */
3134         case 'p': proxy_session = TRUE;
3135                   if (++i < argc)
3136                     {
3137                     proxy_local_address = string_copy_taint(argv[i], GET_TAINTED);
3138                     if (++i < argc)
3139                       {
3140                       proxy_local_port = Uatoi(argv[i]);
3141                       if (++i < argc)
3142                         {
3143                         proxy_external_address = string_copy_taint(argv[i], GET_TAINTED);
3144                         if (++i < argc)
3145                           {
3146                           proxy_external_port = Uatoi(argv[i]);
3147                           break;
3148                     } } } }
3149                   badarg = TRUE;
3150                   break;
3151 #endif
3152     /* -MCQ: pass on the pid of the queue-running process that started
3153     this chain of deliveries and the fd of its synchronizing pipe; this
3154     is useful only when it precedes -MC (see above) */
3155
3156         case 'Q': if (++i < argc) passed_qr_pid = (pid_t)(Uatol(argv[i]));
3157                   else badarg = TRUE;
3158                   if (++i < argc) passed_qr_pipe = (int)(Uatol(argv[i]));
3159                   else badarg = TRUE;
3160                   break;
3161
3162     /* -MCq: do a quota check on the given recipient for the given size
3163     of message.  Separate from -MC. */
3164         case 'q': rcpt_verify_quota = TRUE;
3165                   if (++i < argc) message_size = Uatoi(argv[i]);
3166                   else badarg = TRUE;
3167                   break;
3168
3169     /* -MCS: set the smtp_use_size flag; this is useful only when it
3170     precedes -MC (see above) */
3171
3172         case 'S': smtp_peer_options |= OPTION_SIZE; break;
3173
3174 #ifndef DISABLE_TLS
3175     /* -MCs: used with -MCt; SNI was sent */
3176     /* -MCr: ditto, DANE */
3177
3178         case 'r':
3179         case 's': if (++i < argc)
3180                     {
3181                     continue_proxy_sni = string_copy_taint(
3182                       exim_str_fail_toolong(argv[i], EXIM_HOSTNAME_MAX, "-MCr/-MCs"),
3183                       GET_TAINTED);
3184                     if (argrest[1] == 'r') continue_proxy_dane = TRUE;
3185                     }
3186                   else badarg = TRUE;
3187                   break;
3188
3189     /* -MCt: similar to -MCT below but the connection is still open
3190     via a proxy process which handles the TLS context and coding.
3191     Require three arguments for the proxied local address and port,
3192     and the TLS cipher. */
3193
3194         case 't': if (++i < argc)
3195                     sending_ip_address = string_copy_taint(
3196                       exim_str_fail_toolong(argv[i], EXIM_IPADDR_MAX, "-MCt IP"),
3197                       GET_TAINTED);
3198                   else badarg = TRUE;
3199                   if (++i < argc)
3200                     sending_port = (int)(Uatol(argv[i]));
3201                   else badarg = TRUE;
3202                   if (++i < argc)
3203                     continue_proxy_cipher = string_copy_taint(
3204                       exim_str_fail_toolong(argv[i], EXIM_CIPHERNAME_MAX, "-MCt cipher"),
3205                       GET_TAINTED);
3206                   else badarg = TRUE;
3207                   /*FALLTHROUGH*/
3208
3209     /* -MCT: set the tls_offered flag; this is useful only when it
3210     precedes -MC (see above). The flag indicates that the host to which
3211     Exim is connected has offered TLS support. */
3212
3213         case 'T': smtp_peer_options |= OPTION_TLS; break;
3214 #endif
3215
3216         default:  badarg = TRUE; break;
3217         }
3218       break;
3219       }
3220
3221     /* -M[x]: various operations on the following list of message ids:
3222        -M    deliver the messages, ignoring next retry times and thawing
3223        -Mc   deliver the messages, checking next retry times, no thawing
3224        -Mf   freeze the messages
3225        -Mg   give up on the messages
3226        -Mt   thaw the messages
3227        -Mrm  remove the messages
3228     In the above cases, this must be the last option. There are also the
3229     following options which are followed by a single message id, and which
3230     act on that message. Some of them use the "recipient" addresses as well.
3231        -Mar  add recipient(s)
3232        -MG   move to a different queue
3233        -Mmad mark all recipients delivered
3234        -Mmd  mark recipients(s) delivered
3235        -Mes  edit sender
3236        -Mset load a message for use with -be
3237        -Mvb  show body
3238        -Mvc  show copy (of whole message, in RFC 2822 format)
3239        -Mvh  show header
3240        -Mvl  show log
3241     */
3242
3243     else if (!*argrest)
3244       {
3245       msg_action = MSG_DELIVER;
3246       forced_delivery = f.deliver_force_thaw = TRUE;
3247       }
3248     else if (Ustrcmp(argrest, "ar") == 0)
3249       {
3250       msg_action = MSG_ADD_RECIPIENT;
3251       one_msg_action = TRUE;
3252       }
3253     else if (Ustrcmp(argrest, "c") == 0)  msg_action = MSG_DELIVER;
3254     else if (Ustrcmp(argrest, "es") == 0)
3255       {
3256       msg_action = MSG_EDIT_SENDER;
3257       one_msg_action = TRUE;
3258       }
3259     else if (Ustrcmp(argrest, "f") == 0)  msg_action = MSG_FREEZE;
3260     else if (Ustrcmp(argrest, "g") == 0)
3261       {
3262       msg_action = MSG_DELIVER;
3263       deliver_give_up = TRUE;
3264       }
3265    else if (Ustrcmp(argrest, "G") == 0)
3266       {
3267       msg_action = MSG_SETQUEUE;
3268       queue_name_dest = string_copy_taint(
3269         exim_str_fail_toolong(next_argv(argv, &i, argc, arg),
3270                               EXIM_DRIVERNAME_MAX, "-MG"),
3271         GET_TAINTED);
3272       }
3273     else if (Ustrcmp(argrest, "mad") == 0) msg_action = MSG_MARK_ALL_DELIVERED;
3274     else if (Ustrcmp(argrest, "md") == 0)
3275       {
3276       msg_action = MSG_MARK_DELIVERED;
3277       one_msg_action = TRUE;
3278       }
3279     else if (Ustrcmp(argrest, "rm") == 0) msg_action = MSG_REMOVE;
3280     else if (Ustrcmp(argrest, "set") == 0)
3281       {
3282       msg_action = MSG_LOAD;
3283       one_msg_action = TRUE;
3284       }
3285     else if (Ustrcmp(argrest, "t") == 0)  msg_action = MSG_THAW;
3286     else if (Ustrcmp(argrest, "vb") == 0)
3287       {
3288       msg_action = MSG_SHOW_BODY;
3289       one_msg_action = TRUE;
3290       }
3291     else if (Ustrcmp(argrest, "vc") == 0)
3292       {
3293       msg_action = MSG_SHOW_COPY;
3294       one_msg_action = TRUE;
3295       }
3296     else if (Ustrcmp(argrest, "vh") == 0)
3297       {
3298       msg_action = MSG_SHOW_HEADER;
3299       one_msg_action = TRUE;
3300       }
3301     else if (Ustrcmp(argrest, "vl") == 0)
3302       {
3303       msg_action = MSG_SHOW_LOG;
3304       one_msg_action = TRUE;
3305       }
3306     else { badarg = TRUE; break; }
3307
3308     /* All the -Mxx options require at least one message id. */
3309
3310     msg_action_arg = i + 1;
3311     if (msg_action_arg >= argc)
3312       exim_fail("exim: no message ids given after %s option\n", arg);
3313
3314     /* Some require only message ids to follow */
3315
3316     if (!one_msg_action)
3317       {
3318       for (int j = msg_action_arg; j < argc; j++) if (!mac_ismsgid(argv[j]))
3319         exim_fail("exim: malformed message id %s after %s option\n",
3320           argv[j], arg);
3321       goto END_ARG;   /* Remaining args are ids */
3322       }
3323
3324     /* Others require only one message id, possibly followed by addresses,
3325     which will be handled as normal arguments. */
3326
3327     else
3328       {
3329       if (!mac_ismsgid(argv[msg_action_arg]))
3330         exim_fail("exim: malformed message id %s after %s option\n",
3331           argv[msg_action_arg], arg);
3332       i++;
3333       }
3334     break;
3335
3336
3337     /* Some programs seem to call the -om option without the leading o;
3338     for sendmail it askes for "me too". Exim always does this. */
3339
3340     case 'm':
3341     if (*argrest) badarg = TRUE;
3342     break;
3343
3344
3345     /* -N: don't do delivery - a debugging option that stops transports doing
3346     their thing. It implies debugging at the D_v level. */
3347
3348     case 'N':
3349     if (!*argrest)
3350       {
3351       f.dont_deliver = TRUE;
3352       debug_selector |= D_v;
3353       debug_file = stderr;
3354       }
3355     else badarg = TRUE;
3356     break;
3357
3358
3359     /* -n: This means "don't alias" in sendmail, apparently.
3360     For normal invocations, it has no effect.
3361     It may affect some other options. */
3362
3363     case 'n':
3364     flag_n = TRUE;
3365     break;
3366
3367     /* -O: Just ignore it. In sendmail, apparently -O option=value means set
3368     option to the specified value. This form uses long names. We need to handle
3369     -O option=value and -Ooption=value. */
3370
3371     case 'O':
3372     if (!*argrest)
3373       if (++i >= argc)
3374         exim_fail("exim: string expected after -O\n");
3375     break;
3376
3377     case 'o':
3378     switch (*argrest++)
3379       {
3380       /* -oA: Set an argument for the bi command (sendmail's "alternate alias
3381       file" option). */
3382       case 'A':
3383         if (!*(alias_arg = argrest))
3384           if (i+1 < argc) alias_arg = argv[++i];
3385           else exim_fail("exim: string expected after -oA\n");
3386         break;
3387
3388       /* -oB: Set a connection message max value for remote deliveries */
3389       case 'B':
3390         {
3391         const uschar * p = argrest;
3392         if (!*p)
3393           if (i+1 < argc && isdigit((argv[i+1][0])))
3394             p = argv[++i];
3395           else
3396             {
3397             connection_max_messages = 1;
3398             p = NULL;
3399             }
3400
3401         if (p)
3402           {
3403           if (!isdigit(*p))
3404             exim_fail("exim: number expected after -oB\n");
3405           connection_max_messages = Uatoi(p);
3406           }
3407         }
3408         break;
3409
3410       /* -odb: background delivery */
3411
3412       case 'd':
3413         if (Ustrcmp(argrest, "b") == 0)
3414           {
3415           f.synchronous_delivery = FALSE;
3416           arg_queue_only = FALSE;
3417           queue_only_set = TRUE;
3418           }
3419
3420       /* -odd: testsuite-only: add no inter-process delays */
3421
3422         else if (Ustrcmp(argrest, "d") == 0)
3423           f.testsuite_delays = FALSE;
3424
3425       /* -odf: foreground delivery (smail-compatible option); same effect as
3426          -odi: interactive (synchronous) delivery (sendmail-compatible option)
3427       */
3428
3429         else if (Ustrcmp(argrest, "f") == 0 || Ustrcmp(argrest, "i") == 0)
3430           {
3431           f.synchronous_delivery = TRUE;
3432           arg_queue_only = FALSE;
3433           queue_only_set = TRUE;
3434           }
3435
3436       /* -odq: queue only */
3437
3438         else if (Ustrcmp(argrest, "q") == 0)
3439           {
3440           f.synchronous_delivery = FALSE;
3441           arg_queue_only = TRUE;
3442           queue_only_set = TRUE;
3443           }
3444
3445       /* -odqs: queue SMTP only - do local deliveries and remote routing,
3446       but no remote delivery */
3447
3448         else if (Ustrcmp(argrest, "qs") == 0)
3449           {
3450           f.queue_smtp = TRUE;
3451           arg_queue_only = FALSE;
3452           queue_only_set = TRUE;
3453           }
3454         else badarg = TRUE;
3455         break;
3456
3457       /* -oex: Sendmail error flags. As these are also accepted without the
3458       leading -o prefix, for compatibility with vacation and other callers,
3459       they are handled with -e above. */
3460
3461       /* -oi:     Set flag so dot doesn't end non-SMTP input (same as -i)
3462          -oitrue: Another sendmail syntax for the same */
3463
3464       case 'i':
3465         if (!*argrest || Ustrcmp(argrest, "true") == 0)
3466           f.dot_ends = FALSE;
3467         else badarg = TRUE;
3468         break;
3469
3470     /* -oM*: Set various characteristics for an incoming message; actually
3471     acted on for trusted callers only. */
3472
3473       case 'M':
3474         {
3475         if (i+1 >= argc)
3476           exim_fail("exim: data expected after -oM%s\n", argrest);
3477
3478         /* -oMa: Set sender host address */
3479
3480         if (Ustrcmp(argrest, "a") == 0)
3481           sender_host_address = string_copy_taint(
3482             exim_str_fail_toolong(next_argv(argv, &i, argc, arg),
3483                                   EXIM_IPADDR_MAX, "-oMa"), GET_TAINTED);
3484
3485         /* -oMaa: Set authenticator name */
3486
3487         else if (Ustrcmp(argrest, "aa") == 0)
3488           sender_host_authenticated = string_copy_taint(
3489             exim_str_fail_toolong(next_argv(argv, &i, argc, arg),
3490                                   EXIM_DRIVERNAME_MAX, "-oMaa"), GET_TAINTED);
3491
3492         /* -oMas: setting authenticated sender */
3493
3494         else if (Ustrcmp(argrest, "as") == 0)
3495           authenticated_sender = string_copy_taint(
3496             exim_str_fail_toolong(next_argv(argv, &i, argc, arg),
3497                                   EXIM_EMAILADDR_MAX, "-oMas"), GET_TAINTED);
3498
3499         /* -oMai: setting authenticated id */
3500
3501         else if (Ustrcmp(argrest, "ai") == 0)
3502           authenticated_id = string_copy_taint(
3503             exim_str_fail_toolong(next_argv(argv, &i, argc, arg),
3504                                   EXIM_EMAILADDR_MAX, "-oMai"), GET_TAINTED);
3505
3506         /* -oMi: Set incoming interface address */
3507
3508         else if (Ustrcmp(argrest, "i") == 0)
3509           interface_address = string_copy_taint(
3510             exim_str_fail_toolong(next_argv(argv, &i, argc, arg),
3511                                   EXIM_IPADDR_MAX, "-oMi"), GET_TAINTED);
3512
3513         /* -oMm: Message reference */
3514
3515         else if (Ustrcmp(argrest, "m") == 0)
3516           {
3517           if (!mac_ismsgid(argv[i+1]))
3518               exim_fail("-oMm must be a valid message ID\n");
3519           if (!f.trusted_config)
3520               exim_fail("-oMm must be called by a trusted user/config\n");
3521             message_reference = next_argv(argv, &i, argc, arg);
3522           }
3523
3524         /* -oMr: Received protocol */
3525
3526         else if (Ustrcmp(argrest, "r") == 0)
3527
3528           if (received_protocol)
3529             exim_fail("received_protocol is set already\n");
3530           else
3531             if (++i >= argc) badarg = TRUE;
3532             else
3533               received_protocol = string_copy_taint(
3534                 exim_str_fail_toolong(argv[i], EXIM_DRIVERNAME_MAX, "-oMr"),
3535                 GET_TAINTED);
3536
3537         /* -oMs: Set sender host name */
3538
3539         else if (Ustrcmp(argrest, "s") == 0)
3540           if (++i >= argc) badarg = TRUE;
3541           else
3542             sender_host_name = string_copy_taint(
3543               exim_str_fail_toolong(argv[i], EXIM_HOSTNAME_MAX, "-oMs"),
3544               GET_TAINTED);
3545
3546         /* -oMt: Set sender ident */
3547
3548         else if (Ustrcmp(argrest, "t") == 0)
3549           if (++i >= argc) badarg = TRUE;
3550           else
3551             {
3552             sender_ident_set = TRUE;
3553             sender_ident = string_copy_taint(
3554               exim_str_fail_toolong(argv[i], EXIM_IDENTUSER_MAX, "-oMt"),
3555               GET_TAINTED);
3556             }
3557
3558         /* Else a bad argument */
3559
3560         else
3561           badarg = TRUE;
3562         }
3563         break;
3564
3565       /* -om: Me-too flag for aliases. Exim always does this. Some programs
3566       seem to call this as -m (undocumented), so that is also accepted (see
3567       above). */
3568       /* -oo: An ancient flag for old-style addresses which still seems to
3569       crop up in some calls (see in SCO). */
3570
3571       case 'm':
3572       case 'o':
3573         if (*argrest) badarg = TRUE;
3574         break;
3575
3576       /* -oP <name>: set pid file path for daemon
3577          -oPX:       delete pid file of daemon */
3578
3579       case 'P':
3580         if (!f.running_in_test_harness && real_uid != root_uid && real_uid != exim_uid)
3581           exim_fail("exim: only uid=%d or uid=%d can use -oP and -oPX "
3582                     "(uid=%d euid=%d | %d)\n",
3583                     root_uid, exim_uid, getuid(), geteuid(), real_uid);
3584         if (!*argrest)
3585           if (++i < argc) override_pid_file_path = argv[i];
3586           else badarg = TRUE;
3587         else if (Ustrcmp(argrest, "X") == 0) delete_pid_file();
3588         else badarg = TRUE;
3589         break;
3590
3591
3592       /* -or <n>: set timeout for non-SMTP acceptance
3593          -os <n>: set timeout for SMTP acceptance */
3594
3595       case 'r':
3596       case 's':
3597         {
3598         int * tp = argrest[-1] == 'r'
3599           ? &arg_receive_timeout : &arg_smtp_receive_timeout;
3600         if (*argrest)
3601           *tp = readconf_readtime(argrest, 0, FALSE);
3602         else if (i+1 < argc)
3603           *tp = readconf_readtime(argv[++i], 0, FALSE);
3604
3605         if (*tp < 0)
3606           exim_fail("exim: bad time value %s: abandoned\n", argv[i]);
3607         }
3608         break;
3609
3610       /* -oX <list>: Override local_interfaces and/or default daemon ports */
3611       /* Limits: Is there a real limit we want here?  1024 is very arbitrary. */
3612
3613       case 'X':
3614         if (*argrest || ++i >= argc) badarg = TRUE;
3615         else override_local_interfaces = string_copy_taint(
3616           exim_str_fail_toolong(argv[i], 1024, "-oX"), GET_TAINTED);
3617         break;
3618
3619       /* -oY: Override creation of daemon notifier socket */
3620
3621       case 'Y':
3622         if (*argrest) badarg = TRUE;
3623         else f.notifier_socket_en = FALSE;
3624         break;
3625
3626       /* Unknown -o argument */
3627
3628       default:
3629         badarg = TRUE;
3630       }
3631     break;
3632
3633
3634     /* -ps: force Perl startup; -pd force delayed Perl startup */
3635
3636     case 'p':
3637     #ifdef EXIM_PERL
3638     if (*argrest == 's' && argrest[1] == 0)
3639       {
3640       perl_start_option = 1;
3641       break;
3642       }
3643     if (*argrest == 'd' && argrest[1] == 0)
3644       {
3645       perl_start_option = -1;
3646       break;
3647       }
3648     #endif
3649
3650     /* -panythingelse is taken as the Sendmail-compatible argument -prval:sval,
3651     which sets the host protocol and host name */
3652
3653     if (!*argrest)
3654       argrest = next_argv(argv, &i, argc, arg);
3655
3656     if (*argrest)
3657       {
3658       uschar * hn = Ustrchr(argrest, ':');
3659
3660       if (received_protocol)
3661         exim_fail("received_protocol is set already\n");
3662
3663       if (!hn)
3664         received_protocol = string_copy_taint(
3665           exim_str_fail_toolong(argrest, EXIM_DRIVERNAME_MAX, "-p<protocol>"),
3666           GET_TAINTED);
3667       else
3668         {
3669         (void) exim_str_fail_toolong(argrest, (EXIM_DRIVERNAME_MAX+1+EXIM_HOSTNAME_MAX), "-p<protocol>:<host>");
3670         received_protocol = string_copyn_taint(argrest, hn - argrest, GET_TAINTED);
3671         sender_host_name = string_copy_taint(hn + 1, GET_TAINTED);
3672         }
3673       }
3674     break;
3675
3676     /* -q:  set up queue runs */
3677
3678     case 'q':
3679       {
3680       BOOL two_stage, first_del, force, thaw = FALSE, local;
3681
3682       receiving_message = FALSE;
3683
3684       /* -qq...: Do queue runs in a 2-stage manner */
3685
3686       if ((two_stage = *argrest == 'q'))
3687         argrest++;
3688
3689       /* -qi...: Do only first (initial) deliveries */
3690
3691       if ((first_del = *argrest == 'i'))
3692         argrest++;
3693
3694       /* -qf...: Run the queue, forcing deliveries
3695          -qff..: Ditto, forcing thawing as well */
3696
3697       if ((force = *argrest == 'f'))
3698         if ((thaw = *++argrest == 'f'))
3699           argrest++;
3700
3701       /* -q[f][f]l...: Run the queue only on local deliveries */
3702
3703       if ((local = *argrest == 'l'))
3704         argrest++;
3705
3706       /* -q[f][f][l][G<name>]... Work on the named queue */
3707
3708       if (*argrest == 'G')
3709         {
3710         int i;
3711         for (argrest++, i = 0; argrest[i] && argrest[i] != '/'; ) i++;
3712         exim_len_fail_toolong(i, EXIM_DRIVERNAME_MAX, "-q*G<name>");
3713         queue_name = string_copyn(argrest, i);
3714         argrest += i;
3715         if (*argrest == '/') argrest++;
3716         }
3717
3718       /* -q[f][f][l][G<name>]: Run the queue, optionally forced, optionally local
3719       only, optionally named, optionally starting from a given message id. */
3720
3721       if (!(list_queue || count_queue))
3722         {
3723         qrunner * q;
3724
3725         if (  !*argrest
3726            && (i + 1 >= argc || argv[i+1][0] == '-' || mac_ismsgid(argv[i+1])))
3727           {
3728           q = alloc_onetime_qrunner();
3729           if (i+1 < argc && mac_ismsgid(argv[i+1]))
3730             start_queue_run_id = string_copy_taint(argv[++i], GET_TAINTED);
3731           if (i+1 < argc && mac_ismsgid(argv[i+1]))
3732             stop_queue_run_id = string_copy_taint(argv[++i], GET_TAINTED);
3733           }
3734
3735       /* -q[f][f][l][G<name>/]<n>: Run the queue at regular intervals, optionally
3736       forced, optionally local only, optionally named. */
3737
3738         else
3739           {
3740           int intvl;
3741           const uschar * s;
3742
3743           if (*argrest) s = argrest;
3744           else if (++i < argc) { badarg = TRUE; break; }
3745           else s = argv[i];
3746
3747           if ((intvl = readconf_readtime(s, 0, FALSE)) <= 0)
3748             exim_fail("exim: bad time value %s: abandoned\n", argv[i]);
3749
3750           for (qrunner * qq = qrunners; qq; qq = qq->next)
3751             if (  queue_name && qq->name && Ustrcmp(queue_name, qq->name) == 0
3752                || !queue_name && !qq->name)
3753               exim_fail("exim: queue-runner specified more than once\n");
3754
3755           q = alloc_qrunner();
3756           q->interval = intvl;
3757           }
3758
3759         q->name = *queue_name ? queue_name : NULL;      /* will be NULL for the default queue */
3760         q->queue_run_force = force;
3761         q->deliver_force_thaw = thaw;
3762         q->queue_run_first_delivery = first_del;
3763         q->queue_run_local = local;
3764         q->queue_2stage = two_stage;
3765         }
3766
3767       break;
3768       }
3769
3770
3771     case 'R':   /* Synonymous with -qR... */
3772     case 'S':   /* Synonymous with -qS... */
3773       {
3774       const uschar * tainted_selectstr;
3775       uschar * s;
3776
3777       receiving_message = FALSE;
3778
3779     /* -Rf:   As -R (below) but force all deliveries,
3780        -Rff:  Ditto, but also thaw all frozen messages,
3781        -Rr:   String is regex
3782        -Rrf:  Regex and force
3783        -Rrff: Regex and force and thaw
3784
3785        -S...: Like -R but works on sender.
3786
3787     in all cases provided there are no further characters in this
3788     argument. */
3789
3790       if (!qrunners) alloc_onetime_qrunner();
3791       qrunners->queue_2stage = f.queue_2stage;
3792       if (*argrest)
3793         for (int i = 0; i < nelem(rsopts); i++)
3794           if (Ustrcmp(argrest, rsopts[i]) == 0)
3795             {
3796             if (i != 2) qrunners->queue_run_force = TRUE;
3797             if (i >= 2)
3798               if (switchchar == 'R')
3799                 f.deliver_selectstring_regex = TRUE;
3800               else
3801                 f.deliver_selectstring_sender_regex = TRUE;
3802             if (i == 1 || i == 4) qrunners->deliver_force_thaw = TRUE;
3803             argrest += Ustrlen(rsopts[i]);
3804             }
3805
3806     /* -R or -S: Set string to match in addresses for forced queue run to
3807     pick out particular messages. */
3808
3809       /* Avoid attacks from people providing very long strings, and do so before
3810       we make copies. */
3811       if (*argrest)
3812         tainted_selectstr = argrest;
3813       else if (i+1 < argc)
3814         tainted_selectstr = argv[++i];
3815       else
3816         exim_fail("exim: string expected after %s\n", switchchar == 'R' ? "-R" : "-S");
3817
3818       s = string_copy_taint(
3819         exim_str_fail_toolong(tainted_selectstr, EXIM_EMAILADDR_MAX, "-R"),
3820         GET_TAINTED);
3821
3822       if (switchchar == 'R')
3823         deliver_selectstring = s;
3824       else
3825         deliver_selectstring_sender = s;
3826       }
3827     break;
3828
3829
3830     /* -r: an obsolete synonym for -f (see above) */
3831
3832     /* -Tqt is an option that is exclusively for use by the testing suite.
3833     It is not recognized in other circumstances. It allows for the setting up
3834     of explicit "queue times" so that various warning/retry things can be
3835     tested. Otherwise variability of clock ticks etc. cause problems. */
3836
3837     case 'T':
3838     if (f.running_in_test_harness && Ustrcmp(argrest, "qt") == 0 && ++i < argc)
3839       fudged_queue_times = string_copy_taint(argv[i], GET_TAINTED);
3840     else badarg = TRUE;
3841     break;
3842
3843
3844     /* -t: Set flag to extract recipients from body of message. */
3845
3846     case 't':
3847     if (!*argrest) extract_recipients = TRUE;
3848
3849     /* -ti: Set flag to extract recipients from body of message, and also
3850     specify that dot does not end the message. */
3851
3852     else if (Ustrcmp(argrest, "i") == 0)
3853       {
3854       extract_recipients = TRUE;
3855       f.dot_ends = FALSE;
3856       }
3857
3858     /* -tls-on-connect: don't wait for STARTTLS (for old clients) */
3859
3860     #ifndef DISABLE_TLS
3861     else if (Ustrcmp(argrest, "ls-on-connect") == 0) tls_in.on_connect = TRUE;
3862     #endif
3863
3864     else badarg = TRUE;
3865     break;
3866
3867
3868     /* -U: This means "initial user submission" in sendmail, apparently. The
3869     doc claims that in future sendmail may refuse syntactically invalid
3870     messages instead of fixing them. For the moment, we just ignore it. */
3871
3872     case 'U':
3873     break;
3874
3875
3876     /* -v: verify things - this is a very low-level debugging */
3877
3878     case 'v':
3879     if (!*argrest)
3880       {
3881       debug_selector |= D_v;
3882       debug_file = stderr;
3883       }
3884     else badarg = TRUE;
3885     break;
3886
3887
3888     /* -x: AIX uses this to indicate some fancy 8-bit character stuff:
3889
3890       The -x flag tells the sendmail command that mail from a local
3891       mail program has National Language Support (NLS) extended characters
3892       in the body of the mail item. The sendmail command can send mail with
3893       extended NLS characters across networks that normally corrupts these
3894       8-bit characters.
3895
3896     As Exim is 8-bit clean, it just ignores this flag. */
3897
3898     case 'x':
3899     if (*argrest) badarg = TRUE;
3900     break;
3901
3902     /* -X: in sendmail: takes one parameter, logfile, and sends debugging
3903     logs to that file.  We swallow the parameter and otherwise ignore it. */
3904
3905     case 'X':
3906     if (!*argrest)
3907       if (++i >= argc)
3908         exim_fail("exim: string expected after -X\n");
3909     break;
3910
3911     /* -z: a line of text to log */
3912
3913     case 'z':
3914     if (!*argrest)
3915       if (++i < argc)
3916         log_oneline = string_copy_taint(
3917           exim_str_fail_toolong(argv[i], 2048, "-z logtext"),
3918           GET_TAINTED);
3919       else
3920         exim_fail("exim: file name expected after %s\n", argv[i-1]);
3921     break;
3922
3923     /* All other initial characters are errors */
3924
3925     default:
3926     badarg = TRUE;
3927     break;
3928     }         /* End of high-level switch statement */
3929
3930   /* Failed to recognize the option, or syntax error */
3931
3932   if (badarg)
3933     exim_fail("exim abandoned: unknown, malformed, or incomplete "
3934       "option %s\n", arg);
3935   }
3936
3937
3938 /* If -R or -S have been specified without -q, assume a single queue run. */
3939
3940  if ((deliver_selectstring || deliver_selectstring_sender) && !qrunners)
3941   alloc_onetime_qrunner();
3942
3943
3944 END_ARG:
3945  store_pool = old_pool;
3946  }
3947
3948 /* If usage_wanted is set we call the usage function - which never returns */
3949 if (usage_wanted) exim_usage(called_as);
3950
3951 /* Arguments have been processed. Check for incompatibilities. */
3952 if (  (  (smtp_input || extract_recipients || recipients_arg < argc)
3953       && (  f.daemon_listen || qrunners || bi_option
3954          || test_retry_arg >= 0 || test_rewrite_arg >= 0
3955          || filter_test != FTEST_NONE
3956          || msg_action_arg > 0 && !one_msg_action
3957       )  )
3958    || (  msg_action_arg > 0
3959       && (  f.daemon_listen || is_multiple_qrun() || list_options
3960          || checking && msg_action != MSG_LOAD
3961          || bi_option || test_retry_arg >= 0 || test_rewrite_arg >= 0
3962       )  )
3963    || (  (f.daemon_listen || is_multiple_qrun())
3964       && (  sender_address || list_options || list_queue || checking
3965          || bi_option
3966       )  )
3967    || f.daemon_listen && is_onetime_qrun()
3968    || f.inetd_wait_mode && qrunners
3969    || (  list_options
3970       && (  checking || smtp_input || extract_recipients
3971          || filter_test != FTEST_NONE || bi_option
3972       )  )
3973    || (  verify_address_mode
3974       && (  f.address_test_mode || smtp_input || extract_recipients
3975          || filter_test != FTEST_NONE || bi_option
3976       )  )
3977    || (  f.address_test_mode
3978       && (  smtp_input || extract_recipients || filter_test != FTEST_NONE
3979          || bi_option
3980       )  )
3981    || (  smtp_input
3982       && (sender_address || filter_test != FTEST_NONE || extract_recipients)
3983       )
3984    || deliver_selectstring && !qrunners
3985    || msg_action == MSG_LOAD && (!expansion_test || expansion_test_message)
3986    )
3987   exim_fail("exim: incompatible command-line options or arguments\n");
3988
3989 /* If debugging is set up, set the file and the file descriptor to pass on to
3990 child processes. It should, of course, be 2 for stderr. Also, force the daemon
3991 to run in the foreground. */
3992
3993 if (debug_selector != 0)
3994   {
3995   debug_file = stderr;
3996   debug_fd = fileno(debug_file);
3997   f.background_daemon = FALSE;
3998   testharness_pause_ms(100);   /* lets caller finish */
3999   if (debug_selector != D_v)    /* -v only doesn't show this */
4000     {
4001     debug_printf("Exim version %s uid=%ld gid=%ld pid=%d D=%x\n",
4002       version_string, (long int)real_uid, (long int)real_gid, (int)getpid(),
4003       debug_selector);
4004     if (!version_printed)
4005       show_whats_supported(FALSE);
4006     }
4007   }
4008
4009 /* When started with root privilege, ensure that the limits on the number of
4010 open files and the number of processes (where that is accessible) are
4011 sufficiently large, or are unset, in case Exim has been called from an
4012 environment where the limits are screwed down. Not all OS have the ability to
4013 change some of these limits. */
4014
4015 if (unprivileged)
4016   {
4017   DEBUG(D_any) debug_print_ids(US"Exim has no root privilege:");
4018   }
4019 else
4020   {
4021   struct rlimit rlp;
4022
4023 #ifdef RLIMIT_NOFILE
4024   if (getrlimit(RLIMIT_NOFILE, &rlp) < 0)
4025     {
4026     log_write(0, LOG_MAIN|LOG_PANIC, "getrlimit(RLIMIT_NOFILE) failed: %s",
4027       strerror(errno));
4028     rlp.rlim_cur = rlp.rlim_max = 0;
4029     }
4030
4031   /* I originally chose 1000 as a nice big number that was unlikely to
4032   be exceeded. It turns out that some older OS have a fixed upper limit of
4033   256. */
4034
4035   if (rlp.rlim_cur < 1000)
4036     {
4037     rlp.rlim_cur = rlp.rlim_max = 1000;
4038     if (setrlimit(RLIMIT_NOFILE, &rlp) < 0)
4039       {
4040       rlp.rlim_cur = rlp.rlim_max = 256;
4041       if (setrlimit(RLIMIT_NOFILE, &rlp) < 0)
4042         log_write(0, LOG_MAIN|LOG_PANIC, "setrlimit(RLIMIT_NOFILE) failed: %s",
4043           strerror(errno));
4044       }
4045     }
4046 #endif
4047
4048 #ifdef RLIMIT_NPROC
4049   if (getrlimit(RLIMIT_NPROC, &rlp) < 0)
4050     {
4051     log_write(0, LOG_MAIN|LOG_PANIC, "getrlimit(RLIMIT_NPROC) failed: %s",
4052       strerror(errno));
4053     rlp.rlim_cur = rlp.rlim_max = 0;
4054     }
4055
4056 # ifdef RLIM_INFINITY
4057   if (rlp.rlim_cur != RLIM_INFINITY && rlp.rlim_cur < 1000)
4058     {
4059     rlp.rlim_cur = rlp.rlim_max = RLIM_INFINITY;
4060 # else
4061   if (rlp.rlim_cur < 1000)
4062     {
4063     rlp.rlim_cur = rlp.rlim_max = 1000;
4064 # endif
4065     if (setrlimit(RLIMIT_NPROC, &rlp) < 0)
4066       log_write(0, LOG_MAIN|LOG_PANIC, "setrlimit(RLIMIT_NPROC) failed: %s",
4067         strerror(errno));
4068     }
4069 #endif
4070   }
4071
4072 /* Exim is normally entered as root (but some special configurations are
4073 possible that don't do this). However, it always spins off sub-processes that
4074 set their uid and gid as required for local delivery. We don't want to pass on
4075 any extra groups that root may belong to, so we want to get rid of them all at
4076 this point.
4077
4078 We need to obey setgroups() at this stage, before possibly giving up root
4079 privilege for a changed configuration file, but later on we might need to
4080 check on the additional groups for the admin user privilege - can't do that
4081 till after reading the config, which might specify the exim gid. Therefore,
4082 save the group list here first. */
4083
4084 if ((group_count = getgroups(nelem(group_list), group_list)) < 0)
4085   exim_fail("exim: getgroups() failed: %s\n", strerror(errno));
4086
4087 /* There is a fundamental difference in some BSD systems in the matter of
4088 groups. FreeBSD and BSDI are known to be different; NetBSD and OpenBSD are
4089 known not to be different. On the "different" systems there is a single group
4090 list, and the first entry in it is the current group. On all other versions of
4091 Unix there is a supplementary group list, which is in *addition* to the current
4092 group. Consequently, to get rid of all extraneous groups on a "standard" system
4093 you pass over 0 groups to setgroups(), while on a "different" system you pass
4094 over a single group - the current group, which is always the first group in the
4095 list. Calling setgroups() with zero groups on a "different" system results in
4096 an error return. The following code should cope with both types of system.
4097
4098  Unfortunately, recent MacOS, which should be a FreeBSD, "helpfully" succeeds
4099  the "setgroups() with zero groups" - and changes the egid.
4100  Thanks to that we had to stash the original_egid above, for use below
4101  in the call to exim_setugid().
4102
4103 However, if this process isn't running as root, setgroups() can't be used
4104 since you have to be root to run it, even if throwing away groups.
4105 Except, sigh, for Hurd - where you can.
4106 Not being root here happens only in some unusual configurations. */
4107
4108 if (  !unprivileged
4109 #ifndef OS_SETGROUPS_ZERO_DROPS_ALL
4110    && setgroups(0, NULL) != 0
4111 #endif
4112    && setgroups(1, group_list) != 0)
4113   exim_fail("exim: setgroups() failed: %s\n", strerror(errno));
4114
4115 /* If the configuration file name has been altered by an argument on the
4116 command line (either a new file name or a macro definition) and the caller is
4117 not root, or if this is a filter testing run, remove any setuid privilege the
4118 program has and run as the underlying user.
4119
4120 The exim user is locked out of this, which severely restricts the use of -C
4121 for some purposes.
4122
4123 Otherwise, set the real ids to the effective values (should be root unless run
4124 from inetd, which it can either be root or the exim uid, if one is configured).
4125
4126 There is a private mechanism for bypassing some of this, in order to make it
4127 possible to test lots of configurations automatically, without having either to
4128 recompile each time, or to patch in an actual configuration file name and other
4129 values (such as the path name). If running in the test harness, pretend that
4130 configuration file changes and macro definitions haven't happened. */
4131
4132 if ((                                            /* EITHER */
4133     (!f.trusted_config ||                          /* Config changed, or */
4134      !macros_trusted(opt_D_used)) &&             /*  impermissible macros and */
4135     real_uid != root_uid &&                      /* Not root, and */
4136     !f.running_in_test_harness                     /* Not fudged */
4137     ) ||                                         /*   OR   */
4138     expansion_test                               /* expansion testing */
4139     ||                                           /*   OR   */
4140     filter_test != FTEST_NONE)                   /* Filter testing */
4141   {
4142   setgroups(group_count, group_list);
4143   exim_setugid(real_uid, real_gid, FALSE,
4144     US"-C, -D, -be or -bf forces real uid");
4145   removed_privilege = TRUE;
4146
4147   /* In the normal case when Exim is called like this, stderr is available
4148   and should be used for any logging information because attempts to write
4149   to the log will usually fail. To arrange this, we unset really_exim. However,
4150   if no stderr is available there is no point - we might as well have a go
4151   at the log (if it fails, syslog will be written).
4152
4153   Note that if the invoker is Exim, the logs remain available. Messing with
4154   this causes unlogged successful deliveries.  */
4155
4156   if (log_stderr && real_uid != exim_uid)
4157     f.really_exim = FALSE;
4158   }
4159
4160 /* Privilege is to be retained for the moment. It may be dropped later,
4161 depending on the job that this Exim process has been asked to do. For now, set
4162 the real uid to the effective so that subsequent re-execs of Exim are done by a
4163 privileged user. */
4164
4165 else
4166   exim_setugid(geteuid(), original_egid, FALSE, US"forcing real = effective");
4167
4168 /* If testing a filter, open the file(s) now, before wasting time doing other
4169 setups and reading the message. */
4170
4171 if (filter_test & FTEST_SYSTEM)
4172   if ((filter_sfd = Uopen(filter_test_sfile, O_RDONLY, 0)) < 0)
4173     exim_fail("exim: failed to open %s: %s\n", filter_test_sfile,
4174       strerror(errno));
4175
4176 if (filter_test & FTEST_USER)
4177   if ((filter_ufd = Uopen(filter_test_ufile, O_RDONLY, 0)) < 0)
4178     exim_fail("exim: failed to open %s: %s\n", filter_test_ufile,
4179       strerror(errno));
4180
4181 /* Initialise lookup_list
4182 If debugging, already called above via version reporting.
4183 In either case, we initialise the list of available lookups while running
4184 as root.  All dynamically modules are loaded from a directory which is
4185 hard-coded into the binary and is code which, if not a module, would be
4186 part of Exim already.  Ability to modify the content of the directory
4187 is equivalent to the ability to modify a setuid binary!
4188
4189 This needs to happen before we read the main configuration. */
4190 init_lookup_list();
4191
4192 /*XXX this excrescence could move to the testsuite standard config setup file */
4193 #ifdef SUPPORT_I18N
4194 if (f.running_in_test_harness) smtputf8_advertise_hosts = NULL;
4195 #endif
4196
4197 /* Read the main runtime configuration data; this gives up if there
4198 is a failure. It leaves the configuration file open so that the subsequent
4199 configuration data for delivery can be read if needed.
4200
4201 NOTE: immediately after opening the configuration file we change the working
4202 directory to "/"! Later we change to $spool_directory. We do it there, because
4203 during readconf_main() some expansion takes place already. */
4204
4205 /* Store the initial cwd before we change directories.  Can be NULL if the
4206 dir has already been unlinked. */
4207 initial_cwd = os_getcwd(NULL, 0);
4208 if (!initial_cwd && errno)
4209   exim_fail("exim: getting initial cwd failed: %s\n", strerror(errno));
4210
4211 if (initial_cwd && (strlen(CCS initial_cwd) >= BIG_BUFFER_SIZE))
4212   exim_fail("exim: initial cwd is far too long (%d)\n", Ustrlen(CCS initial_cwd));
4213
4214 /* checking:
4215     -be[m] expansion test        -
4216     -b[fF] filter test           new
4217     -bh[c] host test             -
4218     -bmalware malware_test_file  new
4219     -brt   retry test            new
4220     -brw   rewrite test          new
4221     -bt    address test          -
4222     -bv[s] address verify        -
4223    list_options:
4224     -bP <option> (except -bP config, which sets list_config)
4225
4226 If any of these options is set, we suppress warnings about configuration
4227 issues (currently about tls_advertise_hosts and keep_environment not being
4228 defined) */
4229
4230   {
4231   int old_pool = store_pool;
4232 #ifdef MEASURE_TIMING
4233   struct timeval t0;
4234   (void)gettimeofday(&t0, NULL);
4235 #endif
4236
4237   store_pool = POOL_CONFIG;
4238   readconf_main(checking || list_options);
4239   store_pool = old_pool;
4240
4241 #ifdef MEASURE_TIMING
4242   report_time_since(&t0, US"readconf_main (delta)");
4243 #endif
4244   }
4245
4246 /* Now in directory "/" */
4247
4248 if (cleanup_environment() == FALSE)
4249   log_write(0, LOG_PANIC_DIE, "Can't cleanup environment");
4250
4251
4252 /* If an action on specific messages is requested, or if a daemon or queue
4253 runner is being started, we need to know if Exim was called by an admin user.
4254 This is the case if the real user is root or exim, or if the real group is
4255 exim, or if one of the supplementary groups is exim or a group listed in
4256 admin_groups. We don't fail all message actions immediately if not admin_user,
4257 since some actions can be performed by non-admin users. Instead, set admin_user
4258 for later interrogation. */
4259
4260 if (real_uid == root_uid || real_uid == exim_uid || real_gid == exim_gid)
4261   f.admin_user = TRUE;
4262 else
4263   for (int i = 0; i < group_count && !f.admin_user; i++)
4264     if (group_list[i] == exim_gid)
4265       f.admin_user = TRUE;
4266     else if (admin_groups)
4267       for (int j = 1; j <= (int)admin_groups[0] && !f.admin_user; j++)
4268         if (admin_groups[j] == group_list[i])
4269           f.admin_user = TRUE;
4270
4271 /* Another group of privileged users are the trusted users. These are root,
4272 exim, and any caller matching trusted_users or trusted_groups. Trusted callers
4273 are permitted to specify sender_addresses with -f on the command line, and
4274 other message parameters as well. */
4275
4276 if (real_uid == root_uid || real_uid == exim_uid)
4277   f.trusted_caller = TRUE;
4278 else
4279   {
4280   if (trusted_users)
4281     for (int i = 1; i <= (int)trusted_users[0] && !f.trusted_caller; i++)
4282       if (trusted_users[i] == real_uid)
4283         f.trusted_caller = TRUE;
4284
4285   if (trusted_groups)
4286     for (int i = 1; i <= (int)trusted_groups[0] && !f.trusted_caller; i++)
4287       if (trusted_groups[i] == real_gid)
4288         f.trusted_caller = TRUE;
4289       else for (int j = 0; j < group_count && !f.trusted_caller; j++)
4290         if (trusted_groups[i] == group_list[j])
4291           f.trusted_caller = TRUE;
4292   }
4293
4294 /* At this point, we know if the user is privileged and some command-line
4295 options become possibly impermissible, depending upon the configuration file. */
4296
4297 if (checking && commandline_checks_require_admin && !f.admin_user)
4298   exim_fail("exim: those command-line flags are set to require admin\n");
4299
4300 /* Handle the decoding of logging options. */
4301
4302 decode_bits(log_selector, log_selector_size, log_notall,
4303   log_selector_string, log_options, log_options_count, US"log", 0);
4304
4305 DEBUG(D_any)
4306   {
4307   debug_printf("configuration file is %s\n", config_main_filename);
4308   debug_printf("log selectors =");
4309   for (int i = 0; i < log_selector_size; i++)
4310     debug_printf(" %08x", log_selector[i]);
4311   debug_printf("\n");
4312   }
4313
4314 /* If domain literals are not allowed, check the sender address that was
4315 supplied with -f. Ditto for a stripped trailing dot. */
4316
4317 if (sender_address)
4318   {
4319   if (sender_address[sender_address_domain] == '[' && !allow_domain_literals)
4320     exim_fail("exim: bad -f address \"%s\": domain literals not "
4321       "allowed\n", sender_address);
4322   if (f_end_dot && !strip_trailing_dot)
4323     exim_fail("exim: bad -f address \"%s.\": domain is malformed "
4324       "(trailing dot not allowed)\n", sender_address);
4325   }
4326
4327 /* See if an admin user overrode our logging. */
4328
4329 if (cmdline_syslog_name)
4330   if (f.admin_user)
4331     {
4332     syslog_processname = cmdline_syslog_name;
4333     log_file_path = string_copy(CUS"syslog");
4334     }
4335   else
4336     /* not a panic, non-privileged users should not be able to spam paniclog */
4337     exim_fail(
4338         "exim: you lack sufficient privilege to specify syslog process name\n");
4339
4340 /* Paranoia check of maximum lengths of certain strings. There is a check
4341 on the length of the log file path in log.c, which will come into effect
4342 if there are any calls to write the log earlier than this. However, if we
4343 get this far but the string is very long, it is better to stop now than to
4344 carry on and (e.g.) receive a message and then have to collapse. The call to
4345 log_write() from here will cause the ultimate panic collapse if the complete
4346 file name exceeds the buffer length. */
4347
4348 if (Ustrlen(log_file_path) > 200)
4349   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
4350     "log_file_path is longer than 200 chars: aborting");
4351
4352 if (Ustrlen(pid_file_path) > 200)
4353   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
4354     "pid_file_path is longer than 200 chars: aborting");
4355
4356 if (Ustrlen(spool_directory) > 200)
4357   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
4358     "spool_directory is longer than 200 chars: aborting");
4359
4360 /* Length check on the process name given to syslog for its TAG field,
4361 which is only permitted to be 32 characters or less. See RFC 3164. */
4362
4363 if (Ustrlen(syslog_processname) > 32)
4364   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
4365     "syslog_processname is longer than 32 chars: aborting");
4366
4367 if (log_oneline)
4368   if (f.admin_user)
4369     {
4370     log_write(0, LOG_MAIN, "%s", log_oneline);
4371     return EXIT_SUCCESS;
4372     }
4373   else
4374     return EXIT_FAILURE;
4375
4376 /* In some operating systems, the environment variable TMPDIR controls where
4377 temporary files are created; Exim doesn't use these (apart from when delivering
4378 to MBX mailboxes), but called libraries such as DBM libraries may require them.
4379 If TMPDIR is found in the environment, reset it to the value defined in the
4380 EXIM_TMPDIR macro, if this macro is defined.  For backward compatibility this
4381 macro may be called TMPDIR in old "Local/Makefile"s. It's converted to
4382 EXIM_TMPDIR by the build scripts.
4383 */
4384
4385 #ifdef EXIM_TMPDIR
4386   if (environ) for (uschar ** p = USS environ; *p; p++)
4387     if (Ustrncmp(*p, "TMPDIR=", 7) == 0 && Ustrcmp(*p+7, EXIM_TMPDIR) != 0)
4388       {
4389       uschar * newp = store_malloc(Ustrlen(EXIM_TMPDIR) + 8);
4390       sprintf(CS newp, "TMPDIR=%s", EXIM_TMPDIR);
4391       *p = newp;
4392       DEBUG(D_any) debug_printf("reset TMPDIR=%s in environment\n", EXIM_TMPDIR);
4393       }
4394 #endif
4395
4396 /* Timezone handling. If timezone_string is "utc", set a flag to cause all
4397 timestamps to be in UTC (gmtime() is used instead of localtime()). Otherwise,
4398 we may need to get rid of a bogus timezone setting. This can arise when Exim is
4399 called by a user who has set the TZ variable. This then affects the timestamps
4400 in log files and in Received: headers, and any created Date: header lines. The
4401 required timezone is settable in the configuration file, so nothing can be done
4402 about this earlier - but hopefully nothing will normally be logged earlier than
4403 this. We have to make a new environment if TZ is wrong, but don't bother if
4404 timestamps_utc is set, because then all times are in UTC anyway. */
4405
4406 if (timezone_string && strcmpic(timezone_string, US"UTC") == 0)
4407   f.timestamps_utc = TRUE;
4408 else
4409   {
4410   uschar *envtz = US getenv("TZ");
4411   if (envtz
4412       ? !timezone_string || Ustrcmp(timezone_string, envtz) != 0
4413       : timezone_string != NULL
4414      )
4415     {
4416     uschar **p = USS environ;
4417     uschar **new;
4418     uschar **newp;
4419     int count = 0;
4420     if (environ) while (*p++) count++;
4421     if (!envtz) count++;
4422     newp = new = store_malloc(sizeof(uschar *) * (count + 1));
4423     if (environ) for (p = USS environ; *p; p++)
4424       if (Ustrncmp(*p, "TZ=", 3) != 0) *newp++ = *p;
4425     if (timezone_string)
4426       {
4427       *newp = store_malloc(Ustrlen(timezone_string) + 4);
4428       sprintf(CS *newp++, "TZ=%s", timezone_string);
4429       }
4430     *newp = NULL;
4431     environ = CSS new;
4432     tzset();
4433     DEBUG(D_any) debug_printf("Reset TZ to %s: time is %s\n", timezone_string,
4434       tod_stamp(tod_log));
4435     }
4436   }
4437
4438 /* Handle the case when we have removed the setuid privilege because of -C or
4439 -D. This means that the caller of Exim was not root.
4440
4441 There is a problem if we were running as the Exim user. The sysadmin may
4442 expect this case to retain privilege because "the binary was called by the
4443 Exim user", but it hasn't, because either the -D option set macros, or the
4444 -C option set a non-trusted configuration file. There are two possibilities:
4445
4446   (1) If deliver_drop_privilege is set, Exim is not going to re-exec in order
4447       to do message deliveries. Thus, the fact that it is running as a
4448       non-privileged user is plausible, and might be wanted in some special
4449       configurations. However, really_exim will have been set false when
4450       privilege was dropped, to stop Exim trying to write to its normal log
4451       files. Therefore, re-enable normal log processing, assuming the sysadmin
4452       has set up the log directory correctly.
4453
4454   (2) If deliver_drop_privilege is not set, the configuration won't work as
4455       apparently intended, and so we log a panic message. In order to retain
4456       root for -C or -D, the caller must either be root or be invoking a
4457       trusted configuration file (when deliver_drop_privilege is false). */
4458
4459 if (  removed_privilege
4460    && (!f.trusted_config || opt_D_used)
4461    && real_uid == exim_uid)
4462   if (deliver_drop_privilege)
4463     f.really_exim = TRUE; /* let logging work normally */
4464   else
4465     log_write(0, LOG_MAIN|LOG_PANIC,
4466       "exim user lost privilege for using %s option",
4467       f.trusted_config? "-D" : "-C");
4468
4469 /* Start up Perl interpreter if Perl support is configured and there is a
4470 perl_startup option, and the configuration or the command line specifies
4471 initializing starting. Note that the global variables are actually called
4472 opt_perl_xxx to avoid clashing with perl's namespace (perl_*). */
4473
4474 #ifdef EXIM_PERL
4475 if (perl_start_option != 0)
4476   opt_perl_at_start = (perl_start_option > 0);
4477 if (opt_perl_at_start && opt_perl_startup != NULL)
4478   {
4479   uschar *errstr;
4480   DEBUG(D_any) debug_printf("Starting Perl interpreter\n");
4481   if ((errstr = init_perl(opt_perl_startup)))
4482     exim_fail("exim: error in perl_startup code: %s\n", errstr);
4483   opt_perl_started = TRUE;
4484   }
4485 #endif /* EXIM_PERL */
4486
4487 /* Log the arguments of the call if the configuration file said so. This is
4488 a debugging feature for finding out what arguments certain MUAs actually use.
4489 Don't attempt it if logging is disabled, or if listing variables or if
4490 verifying/testing addresses or expansions. */
4491
4492 if (  (debug_selector & D_any  ||  LOGGING(arguments))
4493    && f.really_exim && !list_options && !checking)
4494   {
4495   uschar *p = big_buffer;
4496   Ustrcpy(p, US"cwd= (failed)");
4497
4498   if (!initial_cwd)
4499     p += 13;
4500   else
4501     {
4502     p += 4;
4503     snprintf(CS p, big_buffer_size - (p - big_buffer), "%s", CCS initial_cwd);
4504     p += Ustrlen(CCS p);
4505     }
4506
4507   (void)string_format(p, big_buffer_size - (p - big_buffer), " %d args:", argc);
4508   while (*p) p++;
4509   for (int i = 0; i < argc; i++)
4510     {
4511     int len = Ustrlen(argv[i]);
4512     const uschar *printing;
4513     uschar *quote;
4514     if (p + len + 8 >= big_buffer + big_buffer_size)
4515       {
4516       Ustrcpy(p, US" ...");
4517       log_write(0, LOG_MAIN, "%s", big_buffer);
4518       Ustrcpy(big_buffer, US"...");
4519       p = big_buffer + 3;
4520       }
4521     printing = string_printing(argv[i]);
4522     if (!*printing) quote = US"\"";
4523     else
4524       {
4525       const uschar *pp = printing;
4526       quote = US"";
4527       while (*pp) if (isspace(*pp++)) { quote = US"\""; break; }
4528       }
4529     p += sprintf(CS p, " %s%.*s%s", quote, (int)(big_buffer_size -
4530       (p - big_buffer) - 4), printing, quote);
4531     }
4532
4533   if (LOGGING(arguments))
4534     log_write(0, LOG_MAIN, "%s", big_buffer);
4535   else
4536     debug_printf("%s\n", big_buffer);
4537   }
4538
4539 /* Set the working directory to be the top-level spool directory. We don't rely
4540 on this in the code, which always uses fully qualified names, but it's useful
4541 for core dumps etc. Don't complain if it fails - the spool directory might not
4542 be generally accessible and calls with the -C option (and others) have lost
4543 privilege by now. Before the chdir, we try to ensure that the directory exists.
4544 */
4545
4546 if (Uchdir(spool_directory) != 0)
4547   {
4548   (void) directory_make(spool_directory, US"", SPOOL_DIRECTORY_MODE, FALSE);
4549   (void) Uchdir(spool_directory);
4550   }
4551
4552 /* Handle calls with the -bi option. This is a sendmail option to rebuild *the*
4553 alias file. Exim doesn't have such a concept, but this call is screwed into
4554 Sun's YP makefiles. Handle this by calling a configured script, as the real
4555 user who called Exim. The -oA option can be used to pass an argument to the
4556 script. */
4557
4558 if (bi_option)
4559   {
4560   (void) fclose(config_file);
4561   if (bi_command && *bi_command)
4562     {
4563     int i = 0;
4564     const uschar * argv[3];
4565     argv[i++] = bi_command;     /* nonexpanded option so assume untainted */
4566     if (alias_arg) argv[i++] = alias_arg;
4567     argv[i++] = NULL;
4568
4569     setgroups(group_count, group_list);
4570     exim_setugid(real_uid, real_gid, FALSE, US"running bi_command");
4571
4572     DEBUG(D_exec) debug_printf("exec '%.256s' %s%.256s%s\n", argv[0],
4573       argv[1] ? "'" : "", argv[1] ? argv[1] : US"", argv[1] ? "'" : "");
4574
4575     execv(CS argv[0], (char *const *)argv);
4576     exim_fail("exim: exec '%s' failed: %s\n", argv[0], strerror(errno));
4577     }
4578   else
4579     {
4580     DEBUG(D_any) debug_printf("-bi used but bi_command not set; exiting\n");
4581     exit(EXIT_SUCCESS);
4582     }
4583   }
4584
4585 /* We moved the admin/trusted check to be immediately after reading the
4586 configuration file.  We leave these prints here to ensure that syslog setup,
4587 logfile setup, and so on has already happened. */
4588
4589 if (f.trusted_caller) DEBUG(D_any) debug_printf("trusted user\n");
4590 if (f.admin_user) DEBUG(D_any) debug_printf("admin user\n");
4591
4592 /* Only an admin user may start the daemon or force a queue run in the default
4593 configuration, but the queue run restriction can be relaxed. Only an admin
4594 user may request that a message be returned to its sender forthwith. Only an
4595 admin user may specify a debug level greater than D_v (because it might show
4596 passwords, etc. in lookup queries). Only an admin user may request a queue
4597 count. Only an admin user can use the test interface to scan for email
4598 (because Exim will be in the spool dir and able to look at mails). */
4599
4600 if (!f.admin_user)
4601   {
4602   BOOL debugset = (debug_selector & ~D_v) != 0;
4603   if (  deliver_give_up || f.daemon_listen || malware_test_file
4604      || count_queue && queue_list_requires_admin
4605      || list_queue && queue_list_requires_admin
4606      || qrunners && prod_requires_admin
4607      || queue_name_dest && prod_requires_admin
4608      || debugset && !f.running_in_test_harness
4609      )
4610     exim_fail("exim:%s permission denied; not admin\n",
4611               debugset ? " debugging" : "");
4612   }
4613
4614 /* If the real user is not root or the exim uid, the argument for passing
4615 in an open TCP/IP connection for another message is not permitted, nor is
4616 running with the -N option for any delivery action, unless this call to exim is
4617 one that supplied an input message, or we are using a patched exim for
4618 regression testing. */
4619
4620 if (  real_uid != root_uid && real_uid != exim_uid
4621    && (  continue_hostname
4622       || (  f.dont_deliver
4623          && (qrunners || f.daemon_listen || msg_action_arg > 0)
4624       )  )
4625    && !f.running_in_test_harness
4626    )
4627   exim_fail("exim: Permission denied; not exim user or root\n");
4628
4629 /* If the caller is not trusted, certain arguments are ignored when running for
4630 real, but are permitted when checking things (-be, -bv, -bt, -bh, -bf, -bF).
4631 Note that authority for performing certain actions on messages is tested in the
4632 queue_action() function. */
4633
4634 if (!f.trusted_caller && !checking)
4635   {
4636   sender_host_name = sender_host_address = interface_address =
4637     sender_ident = received_protocol = NULL;
4638   sender_host_port = interface_port = 0;
4639   sender_host_authenticated = authenticated_sender = authenticated_id = NULL;
4640   }
4641
4642 /* If a sender host address is set, extract the optional port number off the
4643 end of it and check its syntax. Do the same thing for the interface address.
4644 Exim exits if the syntax is bad. */
4645
4646 else
4647   {
4648   if (sender_host_address)
4649     sender_host_port = check_port(sender_host_address);
4650   if (interface_address)
4651     interface_port = check_port(interface_address);
4652   }
4653
4654 /* If the caller is trusted, then they can use -G to suppress_local_fixups. */
4655 if (flag_G)
4656   {
4657   if (f.trusted_caller)
4658     {
4659     f.suppress_local_fixups = f.suppress_local_fixups_default = TRUE;
4660     DEBUG(D_acl) debug_printf("suppress_local_fixups forced on by -G\n");
4661     }
4662   else
4663     exim_fail("exim: permission denied (-G requires a trusted user)\n");
4664   }
4665
4666 /* If an SMTP message is being received check to see if the standard input is a
4667 TCP/IP socket. If it is, we assume that Exim was called from inetd if the
4668 caller is root or the Exim user, or if the port is a privileged one. Otherwise,
4669 barf. */
4670
4671 if (smtp_input)
4672   {
4673   union sockaddr_46 inetd_sock;
4674   EXIM_SOCKLEN_T size = sizeof(inetd_sock);
4675   if (getpeername(0, (struct sockaddr *)(&inetd_sock), &size) == 0)
4676     {
4677     int family = ((struct sockaddr *)(&inetd_sock))->sa_family;
4678     if (family == AF_INET || family == AF_INET6)
4679       {
4680       union sockaddr_46 interface_sock;
4681       size = sizeof(interface_sock);
4682
4683       if (getsockname(0, (struct sockaddr *)(&interface_sock), &size) == 0)
4684         interface_address = host_ntoa(-1, &interface_sock, NULL,
4685           &interface_port);
4686
4687       if (host_is_tls_on_connect_port(interface_port)) tls_in.on_connect = TRUE;
4688
4689       if (real_uid == root_uid || real_uid == exim_uid || interface_port < 1024)
4690         {
4691         f.is_inetd = TRUE;
4692         sender_host_address = host_ntoa(-1, (struct sockaddr *)(&inetd_sock),
4693           NULL, &sender_host_port);
4694         if (mua_wrapper) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Input from "
4695           "inetd is not supported when mua_wrapper is set");
4696         }
4697       else
4698         exim_fail(
4699           "exim: Permission denied (unprivileged user, unprivileged port)\n");
4700       }
4701     }
4702   }
4703
4704 /* If the load average is going to be needed while receiving a message, get it
4705 now for those OS that require the first call to os_getloadavg() to be done as
4706 root. There will be further calls later for each message received. */
4707
4708 #ifdef LOAD_AVG_NEEDS_ROOT
4709 if (  receiving_message
4710    && (queue_only_load >= 0 || (f.is_inetd && smtp_load_reserve >= 0)))
4711   load_average = OS_GETLOADAVG();
4712 #endif
4713
4714 /* The queue_only configuration option can be overridden by -odx on the command
4715 line, except that if queue_only_override is false, queue_only cannot be unset
4716 from the command line. */
4717
4718 if (queue_only_set && (queue_only_override || arg_queue_only))
4719   queue_only = arg_queue_only;
4720
4721 /* The receive_timeout and smtp_receive_timeout options can be overridden by
4722 -or and -os. */
4723
4724 if (arg_receive_timeout >= 0) receive_timeout = arg_receive_timeout;
4725 if (arg_smtp_receive_timeout >= 0)
4726   smtp_receive_timeout = arg_smtp_receive_timeout;
4727
4728 /* If Exim was started with root privilege, unless we have already removed the
4729 root privilege above as a result of -C, -D, -be, -bf or -bF, remove it now
4730 except when starting the daemon or doing some kind of delivery or address
4731 testing (-bt). These are the only cases when root need to be retained. We run
4732 as exim for -bv and -bh. However, if deliver_drop_privilege is set, root is
4733 retained only for starting the daemon. We always do the initgroups() in this
4734 situation (controlled by the TRUE below), in order to be as close as possible
4735 to the state Exim usually runs in. */
4736
4737 if (  !unprivileged                             /* originally had root AND */
4738    && !removed_privilege                        /* still got root AND      */
4739    && !f.daemon_listen                          /* not starting the daemon */
4740    && (!qrunners || is_onetime_qrun())          /* (either kind of daemon) */
4741    && (                                         /*    AND EITHER           */
4742          deliver_drop_privilege                 /* requested unprivileged  */
4743       || (                                      /*       OR                */
4744             !qrunners                           /* not running the queue   */
4745          && (  msg_action_arg < 0               /*       and               */
4746             || msg_action != MSG_DELIVER        /* not delivering          */
4747             )                                   /*       and               */
4748          && (!checking || !f.address_test_mode) /* not address checking    */
4749          && !rcpt_verify_quota                  /* and not quota checking  */
4750    )  )  )
4751   exim_setugid(exim_uid, exim_gid, TRUE, US"privilege not needed");
4752
4753 /* When we are retaining a privileged uid, we still change to the exim gid. */
4754
4755 else
4756   {
4757   int rv;
4758   DEBUG(D_any) debug_printf("dropping to exim gid; retaining priv uid\n");
4759   rv = setgid(exim_gid);
4760   /* Impact of failure is that some stuff might end up with an incorrect group.
4761   We track this for failures from root, since any attempt to change privilege
4762   by root should succeed and failures should be examined.  For non-root,
4763   there's no security risk.  For me, it's { exim -bV } on a just-built binary,
4764   no need to complain then. */
4765   if (rv == -1)
4766     if (!(unprivileged || removed_privilege))
4767       exim_fail("exim: changing group failed: %s\n", strerror(errno));
4768     else
4769       {
4770       DEBUG(D_any) debug_printf("changing group to %ld failed: %s\n",
4771           (long int)exim_gid, strerror(errno));
4772       }
4773   }
4774
4775 /* Handle a request to scan a file for malware */
4776 if (malware_test_file)
4777   {
4778 #ifdef WITH_CONTENT_SCAN
4779   int result;
4780   set_process_info("scanning file for malware");
4781   if ((result = malware_in_file(malware_test_file)) == FAIL)
4782     {
4783     printf("No malware found.\n");
4784     exim_exit(EXIT_SUCCESS);
4785     }
4786   if (result != OK)
4787     {
4788     printf("Malware lookup returned non-okay/fail: %d\n", result);
4789     exim_exit(EXIT_FAILURE);
4790     }
4791   if (malware_name)
4792     printf("Malware found: %s\n", malware_name);
4793   else
4794     printf("Malware scan detected malware of unknown name.\n");
4795 #else
4796   printf("Malware scanning not enabled at compile time.\n");
4797 #endif
4798   exim_exit(EXIT_FAILURE);
4799   }
4800
4801 /* Handle a request to list the delivery queue */
4802
4803 if (list_queue)
4804   {
4805   set_process_info("listing the queue");
4806   queue_list(list_queue_option, argv + recipients_arg, argc - recipients_arg);
4807   exim_exit(EXIT_SUCCESS);
4808   }
4809
4810 /* Handle a request to count the delivery queue */
4811
4812 if (count_queue)
4813   {
4814   set_process_info("counting the queue");
4815   fprintf(stdout, "%u\n", queue_count());
4816   exim_exit(EXIT_SUCCESS);
4817   }
4818
4819 /* Handle actions on specific messages, except for the force delivery and
4820 message load actions, which are done below. Some actions take a whole list of
4821 message ids, which are known to continue up to the end of the arguments. Others
4822 take a single message id and then operate on the recipients list. */
4823
4824 if (msg_action_arg > 0 && msg_action != MSG_DELIVER && msg_action != MSG_LOAD)
4825   {
4826   int yield = EXIT_SUCCESS;
4827   set_process_info("acting on specified messages");
4828
4829   /* ACL definitions may be needed when removing a message (-Mrm) because
4830   event_action gets expanded */
4831
4832   if (msg_action == MSG_REMOVE)
4833     {
4834     int old_pool = store_pool;
4835     store_pool = POOL_CONFIG;
4836     readconf_rest();
4837     store_pool = old_pool;
4838     store_writeprotect(POOL_CONFIG);
4839     }
4840
4841   if (!one_msg_action)
4842     {
4843     for (i = msg_action_arg; i < argc; i++)
4844       if (!queue_action(argv[i], msg_action, NULL, 0, 0))
4845         yield = EXIT_FAILURE;
4846     switch (msg_action)
4847       {
4848       case MSG_REMOVE: case MSG_FREEZE: case MSG_THAW: break;
4849       default: printf("\n"); break;
4850       }
4851     }
4852
4853   else if (!queue_action(argv[msg_action_arg], msg_action, argv, argc,
4854     recipients_arg)) yield = EXIT_FAILURE;
4855   exim_exit(yield);
4856   }
4857
4858 /* We used to set up here to skip reading the ACL section, on
4859  (msg_action_arg > 0 || (is_onetime_qrun() && !f.daemon_listen)
4860 Now, since the intro of the ${acl } expansion, ACL definitions may be
4861 needed in transports so we lost the optimisation. */
4862
4863   {
4864   int old_pool = store_pool;
4865 #ifdef MEASURE_TIMING
4866   struct timeval t0;
4867   (void)gettimeofday(&t0, NULL);
4868 #endif
4869
4870   store_pool = POOL_CONFIG;
4871   readconf_rest();
4872   store_pool = old_pool;
4873
4874   /* -be can add macro definitions, needing to link to the macro structure
4875   chain.  Otherwise, make the memory used for config data readonly. */
4876
4877   if (!expansion_test)
4878     store_writeprotect(POOL_CONFIG);
4879
4880 #ifdef MEASURE_TIMING
4881   report_time_since(&t0, US"readconf_rest (delta)");
4882 #endif
4883   }
4884
4885 /* Handle a request to check quota */
4886 if (rcpt_verify_quota)
4887   if (real_uid != root_uid && real_uid != exim_uid)
4888     exim_fail("exim: Permission denied\n");
4889   else if (recipients_arg >= argc)
4890     exim_fail("exim: missing recipient for quota check\n");
4891   else
4892     {
4893     verify_quota(US argv[recipients_arg]);      /*XXX we lose track of const here */
4894     exim_exit(EXIT_SUCCESS);
4895     }
4896
4897 /* Handle the -brt option. This is for checking out retry configurations.
4898 The next three arguments are a domain name or a complete address, and
4899 optionally two error numbers. All it does is to call the function that
4900 scans the retry configuration data. */
4901
4902 if (test_retry_arg >= 0)
4903   {
4904   retry_config *yield;
4905   int basic_errno = 0;
4906   int more_errno = 0;
4907   const uschar *s1, *s2;
4908
4909   if (test_retry_arg >= argc)
4910     {
4911     printf("-brt needs a domain or address argument\n");
4912     exim_exit(EXIT_FAILURE);
4913     }
4914   s1 = exim_str_fail_toolong(argv[test_retry_arg++], EXIM_EMAILADDR_MAX, "-brt");
4915   s2 = NULL;
4916
4917   /* If the first argument contains no @ and no . it might be a local user
4918   or it might be a single-component name. Treat as a domain. */
4919
4920   if (Ustrchr(s1, '@') == NULL && Ustrchr(s1, '.') == NULL)
4921     {
4922     printf("Warning: \"%s\" contains no '@' and no '.' characters. It is "
4923       "being \ntreated as a one-component domain, not as a local part.\n\n",
4924       s1);
4925     }
4926
4927   /* There may be an optional second domain arg. */
4928
4929   if (test_retry_arg < argc && Ustrchr(argv[test_retry_arg], '.') != NULL)
4930     s2 = exim_str_fail_toolong(argv[test_retry_arg++], EXIM_DOMAINNAME_MAX, "-brt 2nd");
4931
4932   /* The final arg is an error name */
4933
4934   if (test_retry_arg < argc)
4935     {
4936     const uschar *ss = exim_str_fail_toolong(argv[test_retry_arg], EXIM_DRIVERNAME_MAX, "-brt 3rd");
4937     uschar *error =
4938       readconf_retry_error(ss, ss + Ustrlen(ss), &basic_errno, &more_errno);
4939     if (error != NULL)
4940       {
4941       printf("%s\n", CS error);
4942       return EXIT_FAILURE;
4943       }
4944
4945     /* For the {MAIL,RCPT,DATA}_4xx errors, a value of 255 means "any", and a
4946     code > 100 as an error is for matching codes to the decade. Turn them into
4947     a real error code, off the decade. */
4948
4949     if (basic_errno == ERRNO_MAIL4XX ||
4950         basic_errno == ERRNO_RCPT4XX ||
4951         basic_errno == ERRNO_DATA4XX)
4952       {
4953       int code = (more_errno >> 8) & 255;
4954       if (code == 255)
4955         more_errno = (more_errno & 0xffff00ff) | (21 << 8);
4956       else if (code > 100)
4957         more_errno = (more_errno & 0xffff00ff) | ((code - 96) << 8);
4958       }
4959     }
4960
4961   if (!(yield = retry_find_config(s1, s2, basic_errno, more_errno)))
4962     printf("No retry information found\n");
4963   else
4964     {
4965     more_errno = yield->more_errno;
4966     printf("Retry rule: %s  ", yield->pattern);
4967
4968     if (yield->basic_errno == ERRNO_EXIMQUOTA)
4969       {
4970       printf("quota%s%s  ",
4971         (more_errno > 0)? "_" : "",
4972         (more_errno > 0)? readconf_printtime(more_errno) : US"");
4973       }
4974     else if (yield->basic_errno == ECONNREFUSED)
4975       {
4976       printf("refused%s%s  ",
4977         (more_errno > 0)? "_" : "",
4978         (more_errno == 'M')? "MX" :
4979         (more_errno == 'A')? "A" : "");
4980       }
4981     else if (yield->basic_errno == ETIMEDOUT)
4982       {
4983       printf("timeout");
4984       if ((more_errno & RTEF_CTOUT) != 0) printf("_connect");
4985       more_errno &= 255;
4986       if (more_errno != 0) printf("_%s",
4987         (more_errno == 'M')? "MX" : "A");
4988       printf("  ");
4989       }
4990     else if (yield->basic_errno == ERRNO_AUTHFAIL)
4991       printf("auth_failed  ");
4992     else printf("*  ");
4993
4994     for (retry_rule * r = yield->rules; r; r = r->next)
4995       {
4996       printf("%c,%s", r->rule, readconf_printtime(r->timeout)); /* Do not */
4997       printf(",%s", readconf_printtime(r->p1));                 /* amalgamate */
4998       if (r->rule == 'G')
4999         {
5000         int x = r->p2;
5001         int f = x % 1000;
5002         int d = 100;
5003         printf(",%d.", x/1000);
5004         do
5005           {
5006           printf("%d", f/d);
5007           f %= d;
5008           d /= 10;
5009           }
5010         while (f != 0);
5011         }
5012       printf("; ");
5013       }
5014
5015     printf("\n");
5016     }
5017   exim_exit(EXIT_SUCCESS);
5018   }
5019
5020 /* Handle a request to list one or more configuration options */
5021 /* If -n was set, we suppress some information */
5022
5023 if (list_options)
5024   {
5025   BOOL fail = FALSE;
5026   set_process_info("listing variables");
5027   if (recipients_arg >= argc)
5028     fail = !readconf_print(US"all", NULL, flag_n);
5029   else for (i = recipients_arg; i < argc; i++)
5030     {
5031     if (i < argc - 1 &&
5032         (Ustrcmp(argv[i], "router") == 0 ||
5033          Ustrcmp(argv[i], "transport") == 0 ||
5034          Ustrcmp(argv[i], "authenticator") == 0 ||
5035          Ustrcmp(argv[i], "macro") == 0 ||
5036          Ustrcmp(argv[i], "environment") == 0))
5037       {
5038       fail |= !readconf_print(exim_str_fail_toolong(argv[i+1], EXIM_DRIVERNAME_MAX, "-bP name"), argv[i], flag_n);
5039       i++;
5040       }
5041     else
5042       fail = !readconf_print(exim_str_fail_toolong(argv[i], EXIM_DRIVERNAME_MAX, "-bP item"), NULL, flag_n);
5043     }
5044   exim_exit(fail ? EXIT_FAILURE : EXIT_SUCCESS);
5045   }
5046
5047 if (list_config)
5048   {
5049   set_process_info("listing config");
5050   exim_exit(readconf_print(US"config", NULL, flag_n)
5051                 ? EXIT_SUCCESS : EXIT_FAILURE);
5052   }
5053
5054
5055 /* Initialise subsystems as required. */
5056
5057 tcp_init();
5058
5059 /* Handle a request to deliver one or more messages that are already on the
5060 queue. Values of msg_action other than MSG_DELIVER and MSG_LOAD are dealt with
5061 above. MSG_LOAD is handled with -be (which is the only time it applies) below.
5062
5063 Delivery of specific messages is typically used for a small number when
5064 prodding by hand (when the option forced_delivery will be set) or when
5065 re-execing to regain root privilege. Each message delivery must happen in a
5066 separate process, so we fork a process for each one, and run them sequentially
5067 so that debugging output doesn't get intertwined, and to avoid spawning too
5068 many processes if a long list is given. However, don't fork for the last one;
5069 this saves a process in the common case when Exim is called to deliver just one
5070 message. */
5071
5072 if (msg_action_arg > 0 && msg_action != MSG_LOAD)
5073   {
5074   if (prod_requires_admin && !f.admin_user)
5075     {
5076     fprintf(stderr, "exim: Permission denied\n");
5077     exim_exit(EXIT_FAILURE);
5078     }
5079   set_process_info("delivering specified messages");
5080   if (deliver_give_up) forced_delivery = f.deliver_force_thaw = TRUE;
5081   for (i = msg_action_arg; i < argc; i++)
5082     {
5083     int status;
5084     pid_t pid;
5085     /*XXX This use of argv[i] for msg_id should really be tainted, but doing
5086     that runs into a later copy into the untainted global message_id[] */
5087     /*XXX Do we need a length limit check here? */
5088     if (i == argc - 1)
5089       (void)deliver_message(argv[i], forced_delivery, deliver_give_up);
5090     else if ((pid = exim_fork(US"cmdline-delivery")) == 0)
5091       {
5092       (void)deliver_message(argv[i], forced_delivery, deliver_give_up);
5093       exim_underbar_exit(EXIT_SUCCESS);
5094       }
5095     else if (pid < 0)
5096       {
5097       fprintf(stderr, "failed to fork delivery process for %s: %s\n", argv[i],
5098         strerror(errno));
5099       exim_exit(EXIT_FAILURE);
5100       }
5101     else wait(&status);
5102     }
5103   exim_exit(EXIT_SUCCESS);
5104   }
5105
5106
5107 /* If only a single queue run is requested, without SMTP listening, we can just
5108 turn into a queue runner, with an optional starting message id. */
5109
5110 if (is_onetime_qrun() && !f.daemon_listen)
5111   {
5112   single_queue_run(qrunners, start_queue_run_id, stop_queue_run_id);
5113   exim_exit(EXIT_SUCCESS);
5114   }
5115
5116
5117 /* Find the login name of the real user running this process. This is always
5118 needed when receiving a message, because it is written into the spool file. It
5119 may also be used to construct a from: or a sender: header, and in this case we
5120 need the user's full name as well, so save a copy of it, checked for RFC822
5121 syntax and munged if necessary, if it hasn't previously been set by the -F
5122 argument. We may try to get the passwd entry more than once, in case NIS or
5123 other delays are in evidence. Save the home directory for use in filter testing
5124 (only). */
5125
5126 for (i = 0;;)
5127   {
5128   if ((pw = getpwuid(real_uid)) != NULL)
5129     {
5130     originator_login = string_copy(US pw->pw_name);
5131     originator_home = string_copy(US pw->pw_dir);
5132
5133     /* If user name has not been set by -F, set it from the passwd entry
5134     unless -f has been used to set the sender address by a trusted user. */
5135
5136     if (!originator_name)
5137       {
5138       if (!sender_address || (!f.trusted_caller && filter_test == FTEST_NONE))
5139         {
5140         uschar *name = US pw->pw_gecos;
5141         uschar *amp = Ustrchr(name, '&');
5142         uschar buffer[256];
5143
5144         /* Most Unix specify that a '&' character in the gecos field is
5145         replaced by a copy of the login name, and some even specify that
5146         the first character should be upper cased, so that's what we do. */
5147
5148         if (amp)
5149           {
5150           int loffset;
5151           string_format(buffer, sizeof(buffer), "%.*s%n%s%s",
5152             (int)(amp - name), name, &loffset, originator_login, amp + 1);
5153           buffer[loffset] = toupper(buffer[loffset]);
5154           name = buffer;
5155           }
5156
5157         /* If a pattern for matching the gecos field was supplied, apply
5158         it and then expand the name string. */
5159
5160         GET_OPTION("gecos_pattern");
5161         GET_OPTION("gecos_name");
5162         if (gecos_pattern && gecos_name)
5163           {
5164           const pcre2_code *re;
5165           re = regex_must_compile(gecos_pattern, MCS_NOFLAGS, TRUE); /* Use malloc */
5166
5167           if (regex_match_and_setup(re, name, 0, -1))
5168             {
5169             uschar *new_name = expand_string(gecos_name);
5170             expand_nmax = -1;
5171             if (new_name)
5172               {
5173               DEBUG(D_receive) debug_printf("user name \"%s\" extracted from "
5174                 "gecos field \"%s\"\n", new_name, name);
5175               name = new_name;
5176               }
5177             else DEBUG(D_receive) debug_printf("failed to expand gecos_name string "
5178               "\"%s\": %s\n", gecos_name, expand_string_message);
5179             }
5180           else DEBUG(D_receive) debug_printf("gecos_pattern \"%s\" did not match "
5181             "gecos field \"%s\"\n", gecos_pattern, name);
5182           store_free((void *)re);
5183           }
5184         originator_name = string_copy(name);
5185         }
5186
5187       /* A trusted caller has used -f but not -F */
5188
5189       else originator_name = US"";
5190       }
5191
5192     /* Break the retry loop */
5193
5194     break;
5195     }
5196
5197   if (++i > finduser_retries) break;
5198   sleep(1);
5199   }
5200
5201 /* If we cannot get a user login, log the incident and give up, unless the
5202 configuration specifies something to use. When running in the test harness,
5203 any setting of unknown_login overrides the actual name. */
5204
5205 if (!originator_login || f.running_in_test_harness)
5206   {
5207   GET_OPTION("unknown_login");
5208   if (unknown_login)
5209     {
5210     originator_login = expand_string(unknown_login);
5211     if (!originator_name && unknown_username)
5212       originator_name = expand_string(unknown_username);
5213     if (!originator_name) originator_name = US"";
5214     }
5215   if (!originator_login)
5216     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Failed to get user name for uid %d",
5217       (int)real_uid);
5218   }
5219
5220 /* Ensure that the user name is in a suitable form for use as a "phrase" in an
5221 RFC822 address.*/
5222
5223 originator_name = US parse_fix_phrase(originator_name, Ustrlen(originator_name));
5224
5225 /* If a message is created by this call of Exim, the uid/gid of its originator
5226 are those of the caller. These values are overridden if an existing message is
5227 read in from the spool. */
5228
5229 originator_uid = real_uid;
5230 originator_gid = real_gid;
5231
5232 DEBUG(D_receive) debug_printf("originator: uid=%d gid=%d login=%s name=%s\n",
5233   (int)originator_uid, (int)originator_gid, originator_login, originator_name);
5234
5235 /* Run in daemon and/or queue-running mode. The function daemon_go() never
5236 returns. We leave this till here so that the originator_ fields are available
5237 for incoming messages via the daemon. The daemon cannot be run in mua_wrapper
5238 mode. */
5239
5240 if (f.daemon_listen || f.inetd_wait_mode || is_multiple_qrun())
5241   {
5242   if (mua_wrapper)
5243     {
5244     fprintf(stderr, "Daemon cannot be run when mua_wrapper is set\n");
5245     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Daemon cannot be run when "
5246       "mua_wrapper is set");
5247     }
5248
5249 # ifndef DISABLE_TLS
5250   /* This also checks that the library linkage is working and we can call
5251   routines in it, so call even if tls_require_ciphers is unset */
5252     {
5253 # ifdef MEASURE_TIMING
5254     struct timeval t0;
5255     (void)gettimeofday(&t0, NULL);
5256 # endif
5257     if (!tls_dropprivs_validate_require_cipher(FALSE))
5258       exim_exit(EXIT_FAILURE);
5259 # ifdef MEASURE_TIMING
5260     report_time_since(&t0, US"validate_ciphers (delta)");
5261 # endif
5262     }
5263 #endif
5264
5265   daemon_go();
5266   }
5267
5268 /* If the sender ident has not been set (by a trusted caller) set it to
5269 the caller. This will get overwritten below for an inetd call. If a trusted
5270 caller has set it empty, unset it. */
5271
5272 if (!sender_ident) sender_ident = originator_login;
5273 else if (!*sender_ident) sender_ident = NULL;
5274
5275 /* Handle the -brw option, which is for checking out rewriting rules. Cause log
5276 writes (on errors) to go to stderr instead. Can't do this earlier, as want the
5277 originator_* variables set. */
5278
5279 if (test_rewrite_arg >= 0)
5280   {
5281   f.really_exim = FALSE;
5282   if (test_rewrite_arg >= argc)
5283     {
5284     printf("-brw needs an address argument\n");
5285     exim_exit(EXIT_FAILURE);
5286     }
5287   rewrite_test(exim_str_fail_toolong(argv[test_rewrite_arg], EXIM_EMAILADDR_MAX, "-brw"));
5288   exim_exit(EXIT_SUCCESS);
5289   }
5290
5291 /* A locally-supplied message is considered to be coming from a local user
5292 unless a trusted caller supplies a sender address with -f, or is passing in the
5293 message via SMTP (inetd invocation or otherwise). */
5294
5295 if (  !sender_address && !smtp_input
5296    || !f.trusted_caller && filter_test == FTEST_NONE)
5297   {
5298   f.sender_local = TRUE;
5299
5300   /* A trusted caller can supply authenticated_sender and authenticated_id
5301   via -oMas and -oMai and if so, they will already be set. Otherwise, force
5302   defaults except when host checking. */
5303
5304   if (!authenticated_sender && !host_checking)
5305     authenticated_sender = string_sprintf("%s@%s", originator_login,
5306       qualify_domain_sender);
5307   if (!authenticated_id && !host_checking)
5308     authenticated_id = originator_login;
5309   }
5310
5311 /* Trusted callers are always permitted to specify the sender address.
5312 Untrusted callers may specify it if it matches untrusted_set_sender, or if what
5313 is specified is the empty address. However, if a trusted caller does not
5314 specify a sender address for SMTP input, we leave sender_address unset. This
5315 causes the MAIL commands to be honoured. */
5316
5317 if (  !smtp_input && !sender_address
5318    || !receive_check_set_sender(sender_address))
5319   {
5320   /* Either the caller is not permitted to set a general sender, or this is
5321   non-SMTP input and the trusted caller has not set a sender. If there is no
5322   sender, or if a sender other than <> is set, override with the originator's
5323   login (which will get qualified below), except when checking things. */
5324
5325   if (  !sender_address                  /* No sender_address set */
5326      ||                                  /*         OR            */
5327        (sender_address[0] != 0 &&        /* Non-empty sender address, AND */
5328        !checking))                       /* Not running tests, including filter tests */
5329     {
5330     sender_address = originator_login;
5331     f.sender_address_forced = FALSE;
5332     sender_address_domain = 0;
5333     }
5334   }
5335
5336 /* Remember whether an untrusted caller set the sender address */
5337
5338 f.sender_set_untrusted = sender_address != originator_login && !f.trusted_caller;
5339
5340 /* Ensure that the sender address is fully qualified unless it is the empty
5341 address, which indicates an error message, or doesn't exist (root caller, smtp
5342 interface, no -f argument). */
5343
5344 if (sender_address && *sender_address && sender_address_domain == 0)
5345   sender_address = string_sprintf("%s@%s", local_part_quote(sender_address),
5346     qualify_domain_sender);
5347
5348 DEBUG(D_receive) debug_printf("sender address = %s\n", sender_address);
5349
5350 /* Handle a request to verify a list of addresses, or test them for delivery.
5351 This must follow the setting of the sender address, since routers can be
5352 predicated upon the sender. If no arguments are given, read addresses from
5353 stdin. Set debug_level to at least D_v to get full output for address testing.
5354 */
5355
5356 if (verify_address_mode || f.address_test_mode)
5357   {
5358   int exit_value = 0;
5359   int flags = vopt_qualify;
5360
5361   if (verify_address_mode)
5362     {
5363     if (!verify_as_sender) flags |= vopt_is_recipient;
5364     DEBUG(D_verify) debug_print_ids(US"Verifying:");
5365     }
5366
5367   else
5368     {
5369     flags |= vopt_is_recipient;
5370     debug_selector |= D_v;
5371     debug_file = stderr;
5372     debug_fd = fileno(debug_file);
5373     DEBUG(D_verify) debug_print_ids(US"Address testing:");
5374     }
5375
5376   if (recipients_arg < argc)
5377     while (recipients_arg < argc)
5378       {
5379       /* Supplied addresses are tainted since they come from a user */
5380       uschar * s = string_copy_taint(
5381         exim_str_fail_toolong(argv[recipients_arg++], EXIM_DISPLAYMAIL_MAX, "address verification"),
5382         GET_TAINTED);
5383       while (*s)
5384         {
5385         BOOL finished = FALSE;
5386         uschar *ss = parse_find_address_end(s, FALSE);
5387         if (*ss == ',') *ss = 0; else finished = TRUE;
5388         test_address(s, flags, &exit_value);
5389         s = ss;
5390         if (!finished)
5391           while (*++s == ',' || isspace(*s)) ;
5392         }
5393       }
5394
5395   else for (;;)
5396     {
5397     uschar * s = get_stdinput(NULL, NULL);
5398     if (!s) break;
5399     test_address(string_copy_taint(
5400         exim_str_fail_toolong(s, EXIM_DISPLAYMAIL_MAX, "address verification (stdin)"),
5401         GET_TAINTED),
5402       flags, &exit_value);
5403     }
5404
5405   route_tidyup();
5406   exim_exit(exit_value);
5407   }
5408
5409 /* Handle expansion checking. Either expand items on the command line, or read
5410 from stdin if there aren't any. If -Mset was specified, load the message so
5411 that its variables can be used, but restrict this facility to admin users.
5412 Otherwise, if -bem was used, read a message from stdin. */
5413
5414 if (expansion_test)
5415   {
5416   dns_init(FALSE, FALSE, FALSE);
5417   if (msg_action_arg > 0 && msg_action == MSG_LOAD)
5418     {
5419     uschar * spoolname;
5420     if (!f.admin_user)
5421       exim_fail("exim: permission denied\n");
5422     message_id = US exim_str_fail_toolong(argv[msg_action_arg], MESSAGE_ID_LENGTH, "message-id");
5423     /* Checking the length of the ID is sufficient to validate it.
5424     Get an untainted version so file opens can be done. */
5425     message_id = string_copy_taint(message_id, GET_UNTAINTED);
5426
5427     spoolname = string_sprintf("%s-H", message_id);
5428     if ((deliver_datafile = spool_open_datafile(message_id)) < 0)
5429       printf ("Failed to load message datafile %s\n", message_id);
5430     if (spool_read_header(spoolname, TRUE, FALSE) != spool_read_OK)
5431       printf ("Failed to load message %s\n", message_id);
5432     }
5433
5434   /* Read a test message from a file. We fudge it up to be on stdin, saving
5435   stdin itself for later reading of expansion strings. */
5436
5437   else if (expansion_test_message)
5438     {
5439     uschar * rme = expand_string(recipients_max);
5440     int save_stdin = dup(0);
5441     int fd = Uopen(expansion_test_message, O_RDONLY, 0);
5442     if (fd < 0)
5443       exim_fail("exim: failed to open %s: %s\n", expansion_test_message,
5444         strerror(errno));
5445     (void) dup2(fd, 0);
5446     filter_test = FTEST_USER;      /* Fudge to make it look like filter test */
5447     message_ended = END_NOTENDED;
5448     recipients_max_expanded = atoi(CCS rme);
5449     read_message_body(receive_msg(extract_recipients));
5450     message_linecount += body_linecount;
5451     (void)dup2(save_stdin, 0);
5452     (void)close(save_stdin);
5453     clearerr(stdin);               /* Required by Darwin */
5454     }
5455
5456   /* Only admin users may see config-file macros this way */
5457
5458   if (!f.admin_user) macros_user = macros = mlast = NULL;
5459
5460   /* Allow $recipients for this testing */
5461
5462   f.enable_dollar_recipients = TRUE;
5463
5464   /* Expand command line items */
5465
5466   if (recipients_arg < argc)
5467     while (recipients_arg < argc)
5468       expansion_test_line(exim_str_fail_toolong(argv[recipients_arg++], EXIM_EMAILADDR_MAX, "recipient"));
5469
5470   /* Read stdin */
5471
5472   else
5473     {
5474     char *(*fn_readline)(const char *) = NULL;
5475     void (*fn_addhist)(const char *) = NULL;
5476     uschar * s;
5477
5478 #ifdef USE_READLINE
5479     void *dlhandle = set_readline(&fn_readline, &fn_addhist);
5480 #endif
5481
5482     while (s = get_stdinput(fn_readline, fn_addhist))
5483       expansion_test_line(s);
5484
5485 #ifdef USE_READLINE
5486     if (dlhandle) dlclose(dlhandle);
5487 #endif
5488     }
5489
5490   /* The data file will be open after -Mset */
5491
5492   if (deliver_datafile >= 0)
5493     {
5494     (void)close(deliver_datafile);
5495     deliver_datafile = -1;
5496     }
5497
5498   exim_exit(EXIT_SUCCESS);
5499   }
5500
5501
5502 /* The active host name is normally the primary host name, but it can be varied
5503 for hosts that want to play several parts at once. We need to ensure that it is
5504 set for host checking, and for receiving messages. */
5505
5506 smtp_active_hostname = primary_hostname;
5507 GET_OPTION("smtp_active_hostname");
5508 if (raw_active_hostname)
5509   {
5510   uschar * nah = expand_string(raw_active_hostname);
5511   if (!nah)
5512     {
5513     if (!f.expand_string_forcedfail)
5514       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand \"%s\" "
5515         "(smtp_active_hostname): %s", raw_active_hostname,
5516         expand_string_message);
5517     }
5518   else if (nah[0]) smtp_active_hostname = nah;
5519   }
5520
5521 /* Handle host checking: this facility mocks up an incoming SMTP call from a
5522 given IP address so that the blocking and relay configuration can be tested.
5523 Unless a sender_ident was set by -oMt, we discard it (the default is the
5524 caller's login name). An RFC 1413 call is made only if we are running in the
5525 test harness and an incoming interface and both ports are specified, because
5526 there is no TCP/IP call to find the ident for. */
5527
5528 if (host_checking)
5529   {
5530   int x[4];
5531   int size;
5532
5533   if (!sender_ident_set)
5534     {
5535     sender_ident = NULL;
5536     if (f.running_in_test_harness && sender_host_port
5537        && interface_address && interface_port)
5538       verify_get_ident(1223);           /* note hardwired port number */
5539     }
5540
5541   /* In case the given address is a non-canonical IPv6 address, canonicalize
5542   it. Use the compressed form for IPv6. */
5543
5544   size = host_aton(sender_host_address, x);
5545   sender_host_address = store_get(48, GET_UNTAINTED);  /* large enough for full IPv6 */
5546   if (size == 1)
5547     (void) host_nmtoa(size, x, -1, sender_host_address, ':');
5548   else
5549     (void) ipv6_nmtoa(x, sender_host_address);
5550
5551   /* Now set up for testing */
5552
5553   host_build_sender_fullhost();
5554   smtp_input = TRUE;
5555   smtp_in = stdin;
5556   smtp_out = stdout;
5557   f.sender_local = FALSE;
5558   f.sender_host_notsocket = TRUE;
5559   debug_file = stderr;
5560   debug_fd = fileno(debug_file);
5561   fprintf(stdout, "\n**** SMTP testing session as if from host %s\n"
5562     "**** but without any ident (RFC 1413) callback.\n"
5563     "**** This is not for real!\n\n",
5564       sender_host_address);
5565
5566   set_connection_id();
5567   memset(sender_host_cache, 0, sizeof(sender_host_cache));
5568   if (verify_check_host(&hosts_connection_nolog) == OK)
5569     {
5570     BIT_CLEAR(log_selector, log_selector_size, Li_smtp_connection);
5571     BIT_CLEAR(log_selector, log_selector_size, Li_smtp_no_mail);
5572     }
5573   log_write(L_smtp_connection, LOG_MAIN, "%s", smtp_get_connection_info());
5574
5575   /* NOTE: We do *not* call smtp_log_no_mail() if smtp_start_session() fails,
5576   because a log line has already been written for all its failure exists
5577   (usually "connection refused: <reason>") and writing another one is
5578   unnecessary clutter. */
5579
5580   if (smtp_start_session())
5581     {
5582     rmark reset_point;
5583     for (; (reset_point = store_mark()); store_reset(reset_point))
5584       {
5585       if (smtp_setup_msg() <= 0) break;
5586       if (!receive_msg(FALSE)) break;
5587
5588       return_path = sender_address = NULL;
5589       dnslist_domain = dnslist_matched = NULL;
5590 #ifndef DISABLE_DKIM
5591       dkim_cur_signer = NULL;
5592 #endif
5593       acl_var_m = NULL;
5594       deliver_localpart_orig = NULL;
5595       deliver_domain_orig = NULL;
5596       callout_address = sending_ip_address = NULL;
5597       deliver_localpart_data = deliver_domain_data =
5598       recipient_data = sender_data = NULL;
5599       sender_rate = sender_rate_limit = sender_rate_period = NULL;
5600       }
5601     smtp_log_no_mail();
5602     }
5603   exim_exit(EXIT_SUCCESS);
5604   }
5605
5606
5607 /* Arrange for message reception if recipients or SMTP were specified;
5608 otherwise complain unless a version print (-bV) happened or this is a filter
5609 verification test or info dump.
5610 In the former case, show the configuration file name. */
5611
5612 if (recipients_arg >= argc && !extract_recipients && !smtp_input)
5613   {
5614   if (version_printed)
5615     {
5616     if (Ustrchr(config_main_filelist, ':'))
5617       printf("Configuration file search path is %s\n", config_main_filelist);
5618     printf("Configuration file is %s\n", config_main_filename);
5619     return EXIT_SUCCESS;
5620     }
5621
5622   if (info_flag != CMDINFO_NONE)
5623     {
5624     show_exim_information(info_flag, info_stdout ? stdout : stderr);
5625     return info_stdout ? EXIT_SUCCESS : EXIT_FAILURE;
5626     }
5627
5628   if (filter_test == FTEST_NONE)
5629     exim_usage(called_as);
5630   }
5631
5632
5633 /* If mua_wrapper is set, Exim is being used to turn an MUA that submits on the
5634 standard input into an MUA that submits to a smarthost over TCP/IP. We know
5635 that we are not called from inetd, because that is rejected above. The
5636 following configuration settings are forced here:
5637
5638   (1) Synchronous delivery (-odi)
5639   (2) Errors to stderr (-oep == -oeq)
5640   (3) No parallel remote delivery
5641   (4) Unprivileged delivery
5642
5643 We don't force overall queueing options because there are several of them;
5644 instead, queueing is avoided below when mua_wrapper is set. However, we do need
5645 to override any SMTP queueing. */
5646
5647 if (mua_wrapper)
5648   {
5649   f.synchronous_delivery = TRUE;
5650   arg_error_handling = ERRORS_STDERR;
5651   remote_max_parallel = 1;
5652   deliver_drop_privilege = TRUE;
5653   f.queue_smtp = FALSE;
5654   queue_smtp_domains = NULL;
5655 #ifdef SUPPORT_I18N
5656   message_utf8_downconvert = -1;        /* convert-if-needed */
5657 #endif
5658   }
5659
5660
5661 /* Prepare to accept one or more new messages on the standard input. When a
5662 message has been read, its id is returned in message_id[]. If doing immediate
5663 delivery, we fork a delivery process for each received message, except for the
5664 last one, where we can save a process switch.
5665
5666 It is only in non-smtp mode that error_handling is allowed to be changed from
5667 its default of ERRORS_SENDER by argument. (Idle thought: are any of the
5668 sendmail error modes other than -oem ever actually used? Later: yes.) */
5669
5670 if (!smtp_input) error_handling = arg_error_handling;
5671
5672 /* If this is an inetd call, ensure that stderr is closed to prevent panic
5673 logging being sent down the socket and make an identd call to get the
5674 sender_ident. */
5675
5676 else if (f.is_inetd)
5677   {
5678   (void)fclose(stderr);
5679   exim_nullstd();                       /* Re-open to /dev/null */
5680   verify_get_ident(IDENT_PORT);
5681   host_build_sender_fullhost();
5682   set_process_info("handling incoming connection from %s via inetd",
5683     sender_fullhost);
5684   }
5685
5686 /* If the sender host address has been set, build sender_fullhost if it hasn't
5687 already been done (which it will have been for inetd). This caters for the
5688 case when it is forced by -oMa. However, we must flag that it isn't a socket,
5689 so that the test for IP options is skipped for -bs input. */
5690
5691 if (sender_host_address && !sender_fullhost)
5692   {
5693   host_build_sender_fullhost();
5694   set_process_info("handling incoming connection from %s via -oMa",
5695     sender_fullhost);
5696   f.sender_host_notsocket = TRUE;
5697   }
5698
5699 /* Otherwise, set the sender host as unknown except for inetd calls. This
5700 prevents host checking in the case of -bs not from inetd and also for -bS. */
5701
5702 else if (!f.is_inetd) f.sender_host_unknown = TRUE;
5703
5704 /* If stdout does not exist, then dup stdin to stdout. This can happen
5705 if exim is started from inetd. In this case fd 0 will be set to the socket,
5706 but fd 1 will not be set. This also happens for passed SMTP channels. */
5707
5708 if (fstat(1, &statbuf) < 0) (void)dup2(0, 1);
5709
5710 /* Set up the incoming protocol name and the state of the program. Root is
5711 allowed to force received protocol via the -oMr option above. If we have come
5712 via inetd, the process info has already been set up. We don't set
5713 received_protocol here for smtp input, as it varies according to
5714 batch/HELO/EHLO/AUTH/TLS. */
5715
5716 if (smtp_input)
5717   {
5718   if (!f.is_inetd) set_process_info("accepting a local %sSMTP message from <%s>",
5719     smtp_batched_input? "batched " : "",
5720     sender_address ? sender_address : originator_login);
5721   }
5722 else
5723   {
5724   int old_pool = store_pool;
5725   store_pool = POOL_PERM;
5726   if (!received_protocol)
5727     received_protocol = string_sprintf("local%s", called_as);
5728   store_pool = old_pool;
5729   set_process_info("accepting a local non-SMTP message from <%s>",
5730     sender_address);
5731   }
5732
5733 /* Initialize the session_local_queue-only flag (this will be ignored if
5734 mua_wrapper is set) */
5735
5736 queue_check_only();
5737 session_local_queue_only = queue_only;
5738
5739 /* For non-SMTP and for batched SMTP input, check that there is enough space on
5740 the spool if so configured. On failure, we must not attempt to send an error
5741 message! (For interactive SMTP, the check happens at MAIL FROM and an SMTP
5742 error code is given.) */
5743
5744 if ((!smtp_input || smtp_batched_input) && !receive_check_fs(0))
5745   exim_fail("exim: insufficient disk space\n");
5746
5747 /* If this is smtp input of any kind, real or batched, handle the start of the
5748 SMTP session.
5749
5750 NOTE: We do *not* call smtp_log_no_mail() if smtp_start_session() fails,
5751 because a log line has already been written for all its failure exists
5752 (usually "connection refused: <reason>") and writing another one is
5753 unnecessary clutter. */
5754
5755 set_connection_id();
5756 if (smtp_input)
5757   {
5758   smtp_in = stdin;
5759   smtp_out = stdout;
5760   memset(sender_host_cache, 0, sizeof(sender_host_cache));
5761   if (verify_check_host(&hosts_connection_nolog) == OK)
5762     {
5763     BIT_CLEAR(log_selector, log_selector_size, Li_smtp_connection);
5764     BIT_CLEAR(log_selector, log_selector_size, Li_smtp_no_mail);
5765     }
5766   log_write(L_smtp_connection, LOG_MAIN, "%s", smtp_get_connection_info());
5767   if (!smtp_start_session())
5768     {
5769     mac_smtp_fflush();
5770     exim_exit(EXIT_SUCCESS);
5771     }
5772   }
5773
5774 /* Otherwise, set up the input size limit here and set no stdin stdio buffer
5775 (we handle buferring so as to have visibility of fill level). */
5776
5777 else
5778   {
5779   GET_OPTION("message_size_limit");
5780   thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
5781   if (expand_string_message)
5782     if (thismessage_size_limit == -1)
5783       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand "
5784         "message_size_limit: %s", expand_string_message);
5785     else
5786       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "invalid value for "
5787         "message_size_limit: %s", expand_string_message);
5788
5789   setvbuf(stdin, NULL, _IONBF, 0);
5790   }
5791
5792 /* Loop for several messages when reading SMTP input. If we fork any child
5793 processes, we don't want to wait for them unless synchronous delivery is
5794 requested, so set SIGCHLD to SIG_IGN in that case. This is not necessarily the
5795 same as SIG_DFL, despite the fact that documentation often lists the default as
5796 "ignore". This is a confusing area. This is what I know:
5797
5798 At least on some systems (e.g. Solaris), just setting SIG_IGN causes child
5799 processes that complete simply to go away without ever becoming defunct. You
5800 can't then wait for them - but we don't want to wait for them in the
5801 non-synchronous delivery case. However, this behaviour of SIG_IGN doesn't
5802 happen for all OS (e.g. *BSD is different).
5803
5804 But that's not the end of the story. Some (many? all?) systems have the
5805 SA_NOCLDWAIT option for sigaction(). This requests the behaviour that Solaris
5806 has by default, so it seems that the difference is merely one of default
5807 (compare restarting vs non-restarting signals).
5808
5809 To cover all cases, Exim sets SIG_IGN with SA_NOCLDWAIT here if it can. If not,
5810 it just sets SIG_IGN. To be on the safe side it also calls waitpid() at the end
5811 of the loop below. Paranoia rules.
5812
5813 February 2003: That's *still* not the end of the story. There are now versions
5814 of Linux (where SIG_IGN does work) that are picky. If, having set SIG_IGN, a
5815 process then calls waitpid(), a grumble is written to the system log, because
5816 this is logically inconsistent. In other words, it doesn't like the paranoia.
5817 As a consequence of this, the waitpid() below is now excluded if we are sure
5818 that SIG_IGN works. */
5819
5820 if (!f.synchronous_delivery)
5821   {
5822 #ifdef SA_NOCLDWAIT
5823   struct sigaction act;
5824   act.sa_handler = SIG_IGN;
5825   sigemptyset(&(act.sa_mask));
5826   act.sa_flags = SA_NOCLDWAIT;
5827   sigaction(SIGCHLD, &act, NULL);
5828 #else
5829   signal(SIGCHLD, SIG_IGN);
5830 #endif
5831   }
5832
5833 /* Save the current store pool point, for resetting at the start of
5834 each message, and save the real sender address, if any. */
5835
5836 real_sender_address = sender_address;
5837
5838 /* Loop to receive messages; receive_msg() returns TRUE if there are more
5839 messages to be read (SMTP input), or FALSE otherwise (not SMTP, or SMTP channel
5840 collapsed). */
5841
5842 for (BOOL more = TRUE; more; )
5843   {
5844   rmark reset_point = store_mark();
5845   message_id[0] = 0;
5846
5847   /* Handle the SMTP case; call smtp_setup_mst() to deal with the initial SMTP
5848   input and build the recipients list, before calling receive_msg() to read the
5849   message proper. Whatever sender address is given in the SMTP transaction is
5850   often ignored for local senders - we use the actual sender, which is normally
5851   either the underlying user running this process or a -f argument provided by
5852   a trusted caller. It is saved in real_sender_address. The test for whether to
5853   accept the SMTP sender is encapsulated in receive_check_set_sender(). */
5854
5855   if (smtp_input)
5856     {
5857     int rc;
5858     if ((rc = smtp_setup_msg()) > 0)
5859       {
5860       if (   real_sender_address
5861           && !receive_check_set_sender(sender_address))
5862         {
5863         sender_address = raw_sender = real_sender_address;
5864         sender_address_unrewritten = NULL;
5865         }
5866
5867       /* For batched SMTP, we have to run the acl_not_smtp_start ACL, since it
5868       isn't really SMTP, so no other ACL will run until the acl_not_smtp one at
5869       the very end. The result of the ACL is ignored (as for other non-SMTP
5870       messages). It is run for its potential side effects. */
5871
5872       if (smtp_batched_input)
5873         {
5874         GET_OPTION("acl_not_smtp_start");
5875         if (acl_not_smtp_start)
5876           {
5877           uschar * user_msg, * log_msg;
5878           f.enable_dollar_recipients = TRUE;
5879           (void)acl_check(ACL_WHERE_NOTSMTP_START, NULL, acl_not_smtp_start,
5880             &user_msg, &log_msg);
5881           f.enable_dollar_recipients = FALSE;
5882           }
5883         }
5884
5885       /* Now get the data for the message */
5886
5887       more = receive_msg(extract_recipients);
5888       if (!message_id[0])
5889         {
5890         cancel_cutthrough_connection(TRUE, US"receive dropped");
5891         if (more) goto MORELOOP;
5892         smtp_log_no_mail();               /* Log no mail if configured */
5893         exim_exit(EXIT_FAILURE);
5894         }
5895       }
5896     else
5897       {
5898       cancel_cutthrough_connection(TRUE, US"message setup dropped");
5899       smtp_log_no_mail();               /* Log no mail if configured */
5900       exim_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS);
5901       }
5902     }
5903
5904   /* In the non-SMTP case, we have all the information from the command
5905   line, but must process it in case it is in the more general RFC822
5906   format, and in any case, to detect syntax errors. Also, it appears that
5907   the use of comma-separated lists as single arguments is common, so we
5908   had better support them. */
5909
5910   else
5911     {
5912     uschar * rme = expand_string(recipients_max);
5913     int rcount = 0, count = argc - recipients_arg;
5914     const uschar ** list = argv + recipients_arg;
5915
5916     recipients_max_expanded = atoi(CCS rme);
5917
5918     /* These options cannot be changed dynamically for non-SMTP messages */
5919
5920     f.active_local_sender_retain = local_sender_retain;
5921     f.active_local_from_check = local_from_check;
5922
5923     /* Save before any rewriting */
5924
5925     raw_sender = string_copy(sender_address);
5926
5927     /* Loop for each argument (supplied by user hence tainted) */
5928
5929     for (int i = 0; i < count; i++)
5930       {
5931       int start, end, domain;
5932       uschar * errmess;
5933       /* There can be multiple addresses, so EXIM_DISPLAYMAIL_MAX (tuned for 1) is too short.
5934       We'll still want to cap it to something, just in case. */
5935       uschar * s = string_copy_taint(
5936         exim_str_fail_toolong(list[i], BIG_BUFFER_SIZE, "address argument"),
5937         GET_TAINTED);
5938
5939       /* Loop for each comma-separated address */
5940
5941       while (*s)
5942         {
5943         BOOL finished = FALSE;
5944         uschar * recipient;
5945         uschar * ss = parse_find_address_end(s, FALSE);
5946
5947         if (*ss == ',') *ss = 0; else finished = TRUE;
5948
5949         /* Check max recipients - if -t was used, these aren't recipients */
5950
5951         if (  recipients_max_expanded > 0 && ++rcount > recipients_max_expanded
5952            && !extract_recipients)
5953           {
5954           DEBUG(D_all) debug_printf("excess reipients (max %d)\n",
5955             recipients_max_expanded);
5956
5957           if (error_handling == ERRORS_STDERR)
5958             {
5959             fprintf(stderr, "exim: too many recipients\n");
5960             exim_exit(EXIT_FAILURE);
5961             }
5962           else
5963             return
5964               moan_to_sender(ERRMESS_TOOMANYRECIP, NULL, NULL, stdin, TRUE)?
5965                 errors_sender_rc : EXIT_FAILURE;
5966           }
5967
5968 #ifdef SUPPORT_I18N
5969         {
5970         BOOL b = allow_utf8_domains;
5971         allow_utf8_domains = TRUE;
5972 #endif
5973         recipient =
5974           parse_extract_address(s, &errmess, &start, &end, &domain, FALSE);
5975
5976 #ifdef SUPPORT_I18N
5977         if (recipient)
5978           if (string_is_utf8(recipient)) message_smtputf8 = TRUE;
5979           else allow_utf8_domains = b;
5980         }
5981 #else
5982         ;
5983 #endif
5984         if (domain == 0 && !f.allow_unqualified_recipient)
5985           {
5986           recipient = NULL;
5987           errmess = US"unqualified recipient address not allowed";
5988           }
5989
5990         if (!recipient)
5991           {
5992           DEBUG(D_all) debug_printf("bad recipient address \"%s\": %s\n",
5993             string_printing(list[i]), errmess);
5994
5995           if (error_handling == ERRORS_STDERR)
5996             {
5997             fprintf(stderr, "exim: bad recipient address \"%s\": %s\n",
5998               string_printing(list[i]), errmess);
5999             exim_exit(EXIT_FAILURE);
6000             }
6001           else
6002             {
6003             error_block eblock;
6004             eblock.next = NULL;
6005             eblock.text1 = string_printing(list[i]);
6006             eblock.text2 = errmess;
6007             return
6008               moan_to_sender(ERRMESS_BADARGADDRESS, &eblock, NULL, stdin, TRUE)?
6009                 errors_sender_rc : EXIT_FAILURE;
6010             }
6011           }
6012
6013         receive_add_recipient(string_copy_taint(recipient, GET_TAINTED), -1);
6014         s = ss;
6015         if (!finished)
6016           while (*++s && (*s == ',' || isspace(*s)));
6017         }
6018       }
6019
6020     /* Show the recipients when debugging */
6021
6022     DEBUG(D_receive)
6023       {
6024       if (sender_address) debug_printf("Sender: %s\n", sender_address);
6025       if (recipients_list)
6026         {
6027         debug_printf("Recipients:\n");
6028         for (int i = 0; i < recipients_count; i++)
6029           debug_printf("  %s\n", recipients_list[i].address);
6030         }
6031       }
6032
6033     /* Run the acl_not_smtp_start ACL if required. The result of the ACL is
6034     ignored; rejecting here would just add complication, and it can just as
6035     well be done later. Allow $recipients to be visible in the ACL. */
6036
6037     GET_OPTION("acl_not_smtp_start");
6038     if (acl_not_smtp_start)
6039       {
6040       uschar * user_msg, * log_msg;
6041       f.enable_dollar_recipients = TRUE;
6042       (void)acl_check(ACL_WHERE_NOTSMTP_START, NULL, acl_not_smtp_start,
6043         &user_msg, &log_msg);
6044       f.enable_dollar_recipients = FALSE;
6045       }
6046
6047     /* Pause for a while waiting for input.  If none received in that time,
6048     close the logfile, if we had one open; then if we wait for a long-running
6049     datasource (months, in one use-case) log rotation will not leave us holding
6050     the file copy. */
6051
6052     if (!receive_timeout)
6053       if (poll_one_fd(0, POLLIN, 30*60*1000) == 0)      /* 30 minutes */
6054         mainlog_close();
6055
6056     /* Read the data for the message. If filter_test is not FTEST_NONE, this
6057     will just read the headers for the message, and not write anything onto the
6058     spool. */
6059
6060     message_ended = END_NOTENDED;
6061     more = receive_msg(extract_recipients);
6062
6063     /* more is always FALSE here (not SMTP message) when reading a message
6064     for real; when reading the headers of a message for filter testing,
6065     it is TRUE if the headers were terminated by '.' and FALSE otherwise. */
6066
6067     if (!message_id[0]) exim_exit(EXIT_FAILURE);
6068     }  /* Non-SMTP message reception */
6069
6070   /* If this is a filter testing run, there are headers in store, but
6071   no message on the spool. Run the filtering code in testing mode, setting
6072   the domain to the qualify domain and the local part to the current user,
6073   unless they have been set by options. The prefix and suffix are left unset
6074   unless specified. The the return path is set to to the sender unless it has
6075   already been set from a return-path header in the message. */
6076
6077   if (filter_test != FTEST_NONE)
6078     {
6079     deliver_domain = ftest_domain ? ftest_domain : qualify_domain_recipient;
6080     deliver_domain_orig = deliver_domain;
6081     deliver_localpart = ftest_localpart ? US ftest_localpart : originator_login;
6082     deliver_localpart_orig = deliver_localpart;
6083     deliver_localpart_prefix = US ftest_prefix;
6084     deliver_localpart_suffix = US ftest_suffix;
6085     deliver_home = originator_home;
6086
6087     if (!return_path)
6088       {
6089       printf("Return-path copied from sender\n");
6090       return_path = string_copy(sender_address);
6091       }
6092     else
6093       printf("Return-path = %s\n", (return_path[0] == 0)? US"<>" : return_path);
6094     printf("Sender      = %s\n", (sender_address[0] == 0)? US"<>" : sender_address);
6095
6096     receive_add_recipient(
6097       string_sprintf("%s%s%s@%s",
6098         ftest_prefix ? ftest_prefix : US"",
6099         deliver_localpart,
6100         ftest_suffix ? ftest_suffix : US"",
6101         deliver_domain), -1);
6102
6103     printf("Recipient   = %s\n", recipients_list[0].address);
6104     if (ftest_prefix) printf("Prefix    = %s\n", ftest_prefix);
6105     if (ftest_suffix) printf("Suffix    = %s\n", ftest_suffix);
6106
6107     if (chdir("/"))   /* Get away from wherever the user is running this from */
6108       {
6109       DEBUG(D_receive) debug_printf("chdir(\"/\") failed\n");
6110       exim_exit(EXIT_FAILURE);
6111       }
6112
6113     /* Now we run either a system filter test, or a user filter test, or both.
6114     In the latter case, headers added by the system filter will persist and be
6115     available to the user filter. We need to copy the filter variables
6116     explicitly. */
6117
6118     if (filter_test & FTEST_SYSTEM)
6119       if (!filter_runtest(filter_sfd, filter_test_sfile, TRUE, more))
6120         exim_exit(EXIT_FAILURE);
6121
6122     memcpy(filter_sn, filter_n, sizeof(filter_sn));
6123
6124     if (filter_test & FTEST_USER)
6125       if (!filter_runtest(filter_ufd, filter_test_ufile, FALSE, more))
6126         exim_exit(EXIT_FAILURE);
6127
6128     exim_exit(EXIT_SUCCESS);
6129     }
6130
6131   /* Else act on the result of message reception. We should not get here unless
6132   message_id[0] is non-zero. If queue_only is set, session_local_queue_only
6133   will be TRUE. If it is not, check on the number of messages received in this
6134   connection. */
6135
6136   if (  !session_local_queue_only
6137      && smtp_accept_queue_per_connection > 0
6138      && receive_messagecount > smtp_accept_queue_per_connection)
6139     {
6140     session_local_queue_only = TRUE;
6141     queue_only_reason = 2;
6142     }
6143
6144   /* Initialize local_queue_only from session_local_queue_only. If it is false,
6145   and queue_only_load is set, check that the load average is below it. If it is
6146   not, set local_queue_only TRUE. If queue_only_load_latch is true (the
6147   default), we put the whole session into queue_only mode. It then remains this
6148   way for any subsequent messages on the same SMTP connection. This is a
6149   deliberate choice; even though the load average may fall, it doesn't seem
6150   right to deliver later messages on the same call when not delivering earlier
6151   ones. However, there are odd cases where this is not wanted, so this can be
6152   changed by setting queue_only_load_latch false. */
6153
6154   if (!(local_queue_only = session_local_queue_only) && queue_only_load >= 0)
6155     if ((local_queue_only = (load_average = OS_GETLOADAVG()) > queue_only_load))
6156       {
6157       queue_only_reason = 3;
6158       if (queue_only_load_latch) session_local_queue_only = TRUE;
6159       }
6160
6161   /* If running as an MUA wrapper, all queueing options and freezing options
6162   are ignored. */
6163
6164   if (mua_wrapper)
6165     local_queue_only = f.queue_only_policy = f.deliver_freeze = FALSE;
6166
6167   /* Log the queueing here, when it will get a message id attached, but
6168   not if queue_only is set (case 0). Case 1 doesn't happen here (too many
6169   connections). */
6170
6171   if (local_queue_only)
6172     {
6173     cancel_cutthrough_connection(TRUE, US"no delivery; queueing");
6174     switch(queue_only_reason)
6175       {
6176       case 2:
6177         log_write(L_delay_delivery,
6178                 LOG_MAIN, "no immediate delivery: more than %d messages "
6179           "received in one connection", smtp_accept_queue_per_connection);
6180         break;
6181
6182       case 3:
6183         log_write(L_delay_delivery,
6184                 LOG_MAIN, "no immediate delivery: load average %.2f",
6185                 (double)load_average/1000.0);
6186       break;
6187       }
6188     }
6189
6190   else if (f.queue_only_policy || f.deliver_freeze)
6191     cancel_cutthrough_connection(TRUE, US"no delivery; queueing");
6192
6193   /* Else do the delivery unless the ACL or local_scan() called for queue only
6194   or froze the message. Always deliver in a separate process. A fork failure is
6195   not a disaster, as the delivery will eventually happen on a subsequent queue
6196   run. The search cache must be tidied before the fork, as the parent will
6197   do it before exiting. The child will trigger a lookup failure and
6198   thereby defer the delivery if it tries to use (for example) a cached ldap
6199   connection that the parent has called unbind on. */
6200
6201   else
6202     {
6203     pid_t pid;
6204     search_tidyup();
6205
6206     if ((pid = exim_fork(US"local-accept-delivery")) == 0)
6207       {
6208       int rc;
6209       close_unwanted();      /* Close unwanted file descriptors and TLS */
6210       exim_nullstd();        /* Ensure std{in,out,err} exist */
6211
6212       /* Re-exec Exim if we need to regain privilege (note: in mua_wrapper
6213       mode, deliver_drop_privilege is forced TRUE). */
6214
6215       if (geteuid() != root_uid && !deliver_drop_privilege && !unprivileged)
6216         {
6217         delivery_re_exec(CEE_EXEC_EXIT);
6218         /* Control does not return here. */
6219         }
6220
6221       /* No need to re-exec */
6222
6223       rc = deliver_message(message_id, FALSE, FALSE);
6224       search_tidyup();
6225       exim_underbar_exit(!mua_wrapper || rc == DELIVER_MUA_SUCCEEDED
6226         ? EXIT_SUCCESS : EXIT_FAILURE);
6227       }
6228
6229     if (pid < 0)
6230       {
6231       cancel_cutthrough_connection(TRUE, US"delivery fork failed");
6232       log_write(0, LOG_MAIN|LOG_PANIC, "failed to fork automatic delivery "
6233         "process: %s", strerror(errno));
6234       }
6235     else
6236       {
6237       release_cutthrough_connection(US"msg passed for delivery");
6238
6239       /* In the parent, wait if synchronous delivery is required. This will
6240       always be the case in MUA wrapper mode. */
6241
6242       if (f.synchronous_delivery)
6243         {
6244         int status;
6245         while (wait(&status) != pid);
6246         if ((status & 0x00ff) != 0)
6247           log_write(0, LOG_MAIN|LOG_PANIC,
6248             "process %d crashed with signal %d while delivering %s",
6249             (int)pid, status & 0x00ff, message_id);
6250         if (mua_wrapper && (status & 0xffff) != 0) exim_exit(EXIT_FAILURE);
6251         }
6252       }
6253     }
6254
6255   /* The loop will repeat if more is TRUE. If we do not know know that the OS
6256   automatically reaps children (see comments above the loop), clear away any
6257   finished subprocesses here, in case there are lots of messages coming in
6258   from the same source. */
6259
6260 #ifndef SIG_IGN_WORKS
6261   while (waitpid(-1, NULL, WNOHANG) > 0);
6262 #endif
6263
6264 MORELOOP:
6265   return_path = sender_address = NULL;
6266   authenticated_sender = NULL;
6267   deliver_localpart_orig = NULL;
6268   deliver_domain_orig = NULL;
6269   deliver_host = deliver_host_address = NULL;
6270   dnslist_domain = dnslist_matched = NULL;
6271 #ifdef WITH_CONTENT_SCAN
6272   malware_name = NULL;
6273   regex_vars_clear();
6274 #endif
6275   callout_address = NULL;
6276   sending_ip_address = NULL;
6277   deliver_localpart_data = deliver_domain_data =
6278   recipient_data = sender_data = NULL;
6279   acl_var_m = NULL;
6280   lookup_value = NULL;                            /* Can be set by ACL */
6281
6282   store_reset(reset_point);
6283   }
6284
6285 exim_exit(EXIT_SUCCESS);   /* Never returns */
6286 return 0;                  /* To stop compiler warning */
6287 }
6288
6289
6290 /* End of exim.c */
6291 /* vi: aw ai sw=2
6292 */