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