Merge tag 'exim-4.94.1' into exim-4.94+fixes+taintwarn
[exim.git] / src / src / log.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2018 */
6 /* Copyright (c) The Exim Maintainers 2020 */
7 /* See the file NOTICE for conditions of use and distribution. */
8
9 /* Functions for writing log files. The code for maintaining datestamped
10 log files was originally contributed by Tony Sheen. */
11
12
13 #include "exim.h"
14
15 #define LOG_NAME_SIZE 256
16 #define MAX_SYSLOG_LEN 870
17
18 #define LOG_MODE_FILE   1
19 #define LOG_MODE_SYSLOG 2
20
21 enum { lt_main, lt_reject, lt_panic, lt_debug };
22
23 static uschar *log_names[] = { US"main", US"reject", US"panic", US"debug" };
24
25
26
27 /*************************************************
28 *           Local static variables               *
29 *************************************************/
30
31 static uschar mainlog_name[LOG_NAME_SIZE];
32 static uschar rejectlog_name[LOG_NAME_SIZE];
33 static uschar debuglog_name[LOG_NAME_SIZE];
34
35 static uschar *mainlog_datestamp = NULL;
36 static uschar *rejectlog_datestamp = NULL;
37
38 static int    mainlogfd = -1;
39 static int    rejectlogfd = -1;
40 static ino_t  mainlog_inode = 0;
41 static ino_t  rejectlog_inode = 0;
42
43 static uschar *panic_save_buffer = NULL;
44 static BOOL   panic_recurseflag = FALSE;
45
46 static BOOL   syslog_open = FALSE;
47 static BOOL   path_inspected = FALSE;
48 static int    logging_mode = LOG_MODE_FILE;
49 static uschar *file_path = US"";
50
51 static size_t pid_position[2];
52
53
54 /* These should be kept in-step with the private delivery error
55 number definitions in macros.h */
56
57 static const uschar * exim_errstrings[] = {
58   US"",
59   US"unknown error",
60   US"user slash",
61   US"exist race",
62   US"not regular",
63   US"not directory",
64   US"bad ugid",
65   US"bad mode",
66   US"inode changed",
67   US"lock failed",
68   US"bad address2",
69   US"forbid pipe",
70   US"forbid file",
71   US"forbid reply",
72   US"missing pipe",
73   US"missing file",
74   US"missing reply",
75   US"bad redirect",
76   US"smtp closed",
77   US"smtp format",
78   US"spool format",
79   US"not absolute",
80   US"Exim-imposed quota",
81   US"held",
82   US"Delivery filter process failure",
83   US"Delivery add/remove header failure",
84   US"Delivery write incomplete error",
85   US"Some expansion failed",
86   US"Failed to get gid",
87   US"Failed to get uid",
88   US"Unset or non-existent transport",
89   US"MBX length mismatch",
90   US"Lookup failed routing or in smtp tpt",
91   US"Can't match format in appendfile",
92   US"Creation outside home in appendfile",
93   US"Can't check a list; lookup defer",
94   US"DNS lookup defer",
95   US"Failed to start TLS session",
96   US"Mandatory TLS session not started",
97   US"Failed to chown a file",
98   US"Failed to create a pipe",
99   US"When verifying",
100   US"When required by client",
101   US"Used internally in smtp transport",
102   US"RCPT gave 4xx error",
103   US"MAIL gave 4xx error",
104   US"DATA gave 4xx error",
105   US"Negotiation failed for proxy configured host",
106   US"Authenticator 'other' failure",
107   US"target not supporting SMTPUTF8",
108   US"",
109
110   US"Not time for routing",
111   US"Not time for local delivery",
112   US"Not time for any remote host",
113   US"Local-only delivery",
114   US"Domain in queue_domains",
115   US"Transport concurrency limit",
116   US"Event requests alternate response",
117 };
118
119
120 /************************************************/
121 const uschar *
122 exim_errstr(int err)
123 {
124 return err < 0 ? exim_errstrings[-err] : CUS strerror(err);
125 }
126
127 /*************************************************
128 *              Write to syslog                   *
129 *************************************************/
130
131 /* The given string is split into sections according to length, or at embedded
132 newlines, and syslogged as a numbered sequence if it is overlong or if there is
133 more than one line. However, if we are running in the test harness, do not do
134 anything. (The test harness doesn't use syslog - for obvious reasons - but we
135 can get here if there is a failure to open the panic log.)
136
137 Arguments:
138   priority       syslog priority
139   s              the string to be written
140
141 Returns:         nothing
142 */
143
144 static void
145 write_syslog(int priority, const uschar *s)
146 {
147 int len;
148 int linecount = 0;
149
150 if (!syslog_pid && LOGGING(pid))
151   s = string_sprintf("%.*s%s", (int)pid_position[0], s, s + pid_position[1]);
152 if (!syslog_timestamp)
153   {
154   len = log_timezone ? 26 : 20;
155   if (LOGGING(millisec)) len += 4;
156   s += len;
157   }
158
159 len = Ustrlen(s);
160
161 #ifndef NO_OPENLOG
162 if (!syslog_open && !f.running_in_test_harness)
163   {
164 # ifdef SYSLOG_LOG_PID
165   openlog(CS syslog_processname, LOG_PID|LOG_CONS, syslog_facility);
166 # else
167   openlog(CS syslog_processname, LOG_CONS, syslog_facility);
168 # endif
169   syslog_open = TRUE;
170   }
171 #endif
172
173 /* First do a scan through the message in order to determine how many lines
174 it is going to end up as. Then rescan to output it. */
175
176 for (int pass = 0; pass < 2; pass++)
177   {
178   const uschar * ss = s;
179   for (int i = 1, tlen = len; tlen > 0; i++)
180     {
181     int plen = tlen;
182     uschar *nlptr = Ustrchr(ss, '\n');
183     if (nlptr != NULL) plen = nlptr - ss;
184 #ifndef SYSLOG_LONG_LINES
185     if (plen > MAX_SYSLOG_LEN) plen = MAX_SYSLOG_LEN;
186 #endif
187     tlen -= plen;
188     if (ss[plen] == '\n') tlen--;    /* chars left */
189
190     if (pass == 0)
191       linecount++;
192     else if (f.running_in_test_harness)
193       if (linecount == 1)
194         fprintf(stderr, "SYSLOG: '%.*s'\n", plen, ss);
195       else
196         fprintf(stderr, "SYSLOG: '[%d%c%d] %.*s'\n", i,
197           ss[plen] == '\n' && tlen != 0 ? '\\' : '/',
198           linecount, plen, ss);
199     else
200       if (linecount == 1)
201         syslog(priority, "%.*s", plen, ss);
202       else
203         syslog(priority, "[%d%c%d] %.*s", i,
204           ss[plen] == '\n' && tlen != 0 ? '\\' : '/',
205           linecount, plen, ss);
206
207     ss += plen;
208     if (*ss == '\n') ss++;
209     }
210   }
211 }
212
213
214
215 /*************************************************
216 *             Die tidily                         *
217 *************************************************/
218
219 /* This is called when Exim is dying as a result of something going wrong in
220 the logging, or after a log call with LOG_PANIC_DIE set. Optionally write a
221 message to debug_file or a stderr file, if they exist. Then, if in the middle
222 of accepting a message, throw it away tidily by calling receive_bomb_out();
223 this will attempt to send an SMTP response if appropriate. Passing NULL as the
224 first argument stops it trying to run the NOTQUIT ACL (which might try further
225 logging and thus cause problems). Otherwise, try to close down an outstanding
226 SMTP call tidily.
227
228 Arguments:
229   s1         Error message to write to debug_file and/or stderr and syslog
230   s2         Error message for any SMTP call that is in progress
231 Returns:     The function does not return
232 */
233
234 static void
235 die(uschar *s1, uschar *s2)
236 {
237 if (s1)
238   {
239   write_syslog(LOG_CRIT, s1);
240   if (debug_file) debug_printf("%s\n", s1);
241   if (log_stderr && log_stderr != debug_file)
242     fprintf(log_stderr, "%s\n", s1);
243   }
244 if (f.receive_call_bombout) receive_bomb_out(NULL, s2);  /* does not return */
245 if (smtp_input) smtp_closedown(s2);
246 exim_exit(EXIT_FAILURE);
247 }
248
249
250
251 /*************************************************
252 *             Create a log file                  *
253 *************************************************/
254
255 /* This function is called to create and open a log file. It may be called in a
256 subprocess when the original process is root.
257
258 Arguments:
259   name         the file name
260
261 The file name has been build in a working buffer, so it is permissible to
262 overwrite it temporarily if it is necessary to create the directory.
263
264 Returns:       a file descriptor, or < 0 on failure (errno set)
265 */
266
267 static int
268 log_open_already_exim(uschar * const name)
269 {
270 int fd = -1;
271 const int flags = O_WRONLY | O_APPEND | O_CREAT | O_NONBLOCK;
272
273 if (geteuid() != exim_uid)
274   {
275   errno = EACCES;
276   return -1;
277   }
278
279 fd = Uopen(name, flags, LOG_MODE);
280
281 /* If creation failed, attempt to build a log directory in case that is the
282 problem. */
283
284 if (fd < 0 && errno == ENOENT)
285   {
286   BOOL created;
287   uschar *lastslash = Ustrrchr(name, '/');
288   *lastslash = 0;
289   created = directory_make(NULL, name, LOG_DIRECTORY_MODE, FALSE);
290   DEBUG(D_any) debug_printf("%s log directory %s\n",
291     created ? "created" : "failed to create", name);
292   *lastslash = '/';
293   if (created) fd = Uopen(name, flags, LOG_MODE);
294   }
295
296 return fd;
297 }
298
299
300
301 /* Inspired by OpenSSH's mm_send_fd(). Thanks! */
302
303 static int
304 log_send_fd(const int sock, const int fd)
305 {
306 struct msghdr msg;
307 union {
308   struct cmsghdr hdr;
309   char buf[CMSG_SPACE(sizeof(int))];
310 } cmsgbuf;
311 struct cmsghdr *cmsg;
312 struct iovec vec;
313 char ch = 'A';
314 ssize_t n;
315
316 memset(&msg, 0, sizeof(msg));
317 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
318 msg.msg_control = &cmsgbuf.buf;
319 msg.msg_controllen = sizeof(cmsgbuf.buf);
320
321 cmsg = CMSG_FIRSTHDR(&msg);
322 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
323 cmsg->cmsg_level = SOL_SOCKET;
324 cmsg->cmsg_type = SCM_RIGHTS;
325 *(int *)CMSG_DATA(cmsg) = fd;
326
327 vec.iov_base = &ch;
328 vec.iov_len = 1;
329 msg.msg_iov = &vec;
330 msg.msg_iovlen = 1;
331
332 while ((n = sendmsg(sock, &msg, 0)) == -1 && errno == EINTR);
333 if (n != 1) return -1;
334 return 0;
335 }
336
337 /* Inspired by OpenSSH's mm_receive_fd(). Thanks! */
338
339 static int
340 log_recv_fd(const int sock)
341 {
342 struct msghdr msg;
343 union {
344   struct cmsghdr hdr;
345   char buf[CMSG_SPACE(sizeof(int))];
346 } cmsgbuf;
347 struct cmsghdr *cmsg;
348 struct iovec vec;
349 ssize_t n;
350 char ch = '\0';
351 int fd = -1;
352
353 memset(&msg, 0, sizeof(msg));
354 vec.iov_base = &ch;
355 vec.iov_len = 1;
356 msg.msg_iov = &vec;
357 msg.msg_iovlen = 1;
358
359 memset(&cmsgbuf, 0, sizeof(cmsgbuf));
360 msg.msg_control = &cmsgbuf.buf;
361 msg.msg_controllen = sizeof(cmsgbuf.buf);
362
363 while ((n = recvmsg(sock, &msg, 0)) == -1 && errno == EINTR);
364 if (n != 1 || ch != 'A') return -1;
365
366 cmsg = CMSG_FIRSTHDR(&msg);
367 if (cmsg == NULL) return -1;
368 if (cmsg->cmsg_type != SCM_RIGHTS) return -1;
369 fd = *(const int *)CMSG_DATA(cmsg);
370 if (fd < 0) return -1;
371 return fd;
372 }
373
374
375
376 /*************************************************
377 *     Create a log file as the exim user         *
378 *************************************************/
379
380 /* This function is called when we are root to spawn an exim:exim subprocess
381 in which we can create a log file. It must be signal-safe since it is called
382 by the usr1_handler().
383
384 Arguments:
385   name         the file name
386
387 Returns:       a file descriptor, or < 0 on failure (errno set)
388 */
389
390 int
391 log_open_as_exim(uschar * const name)
392 {
393 int fd = -1;
394 const uid_t euid = geteuid();
395
396 if (euid == exim_uid)
397   {
398   fd = log_open_already_exim(name);
399   }
400 else if (euid == root_uid)
401   {
402   int sock[2];
403   if (socketpair(AF_UNIX, SOCK_STREAM, 0, sock) == 0)
404     {
405     const pid_t pid = exim_fork(US"logfile-open");
406     if (pid == 0)
407       {
408       (void)close(sock[0]);
409       if (setgroups(1, &exim_gid) != 0) _exit(EXIT_FAILURE);
410       if (setgid(exim_gid) != 0) _exit(EXIT_FAILURE);
411       if (setuid(exim_uid) != 0) _exit(EXIT_FAILURE);
412
413       if (getuid() != exim_uid || geteuid() != exim_uid) _exit(EXIT_FAILURE);
414       if (getgid() != exim_gid || getegid() != exim_gid) _exit(EXIT_FAILURE);
415
416       fd = log_open_already_exim(name);
417       if (fd < 0) _exit(EXIT_FAILURE);
418       if (log_send_fd(sock[1], fd) != 0) _exit(EXIT_FAILURE);
419       (void)close(sock[1]);
420       _exit(EXIT_SUCCESS);
421       }
422
423     (void)close(sock[1]);
424     if (pid > 0)
425       {
426       fd = log_recv_fd(sock[0]);
427       while (waitpid(pid, NULL, 0) == -1 && errno == EINTR);
428       }
429     (void)close(sock[0]);
430     }
431   }
432
433 if (fd >= 0)
434   {
435   int flags;
436   flags = fcntl(fd, F_GETFD);
437   if (flags != -1) (void)fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
438   flags = fcntl(fd, F_GETFL);
439   if (flags != -1) (void)fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
440   }
441 else
442   {
443   errno = EACCES;
444   }
445
446 return fd;
447 }
448
449
450
451
452 /*************************************************
453 *                Open a log file                 *
454 *************************************************/
455
456 /* This function opens one of a number of logs, creating the log directory if
457 it does not exist. This may be called recursively on failure, in order to open
458 the panic log.
459
460 The directory is in the static variable file_path. This is static so that it
461 the work of sorting out the path is done just once per Exim process.
462
463 Exim is normally configured to avoid running as root wherever possible, the log
464 files must be owned by the non-privileged exim user. To ensure this, first try
465 an open without O_CREAT - most of the time this will succeed. If it fails, try
466 to create the file; if running as root, this must be done in a subprocess to
467 avoid races.
468
469 Arguments:
470   fd         where to return the resulting file descriptor
471   type       lt_main, lt_reject, lt_panic, or lt_debug
472   tag        optional tag to include in the name (only hooked up for debug)
473
474 Returns:   nothing
475 */
476
477 static void
478 open_log(int *fd, int type, uschar *tag)
479 {
480 uid_t euid;
481 BOOL ok, ok2;
482 uschar buffer[LOG_NAME_SIZE];
483
484 /* The names of the log files are controlled by file_path. The panic log is
485 written to the same directory as the main and reject logs, but its name does
486 not have a datestamp. The use of datestamps is indicated by %D/%M in file_path.
487 When opening the panic log, if %D or %M is present, we remove the datestamp
488 from the generated name; if it is at the start, remove a following
489 non-alphanumeric character as well; otherwise, remove a preceding
490 non-alphanumeric character. This is definitely kludgy, but it sort of does what
491 people want, I hope. */
492
493 ok = string_format(buffer, sizeof(buffer), CS file_path, log_names[type]);
494
495 switch (type)
496   {
497   case lt_main:
498     /* Save the name of the mainlog for rollover processing. Without a datestamp,
499     it gets statted to see if it has been cycled. With a datestamp, the datestamp
500     will be compared. The static slot for saving it is the same size as buffer,
501     and the text has been checked above to fit, so this use of strcpy() is OK. */
502     Ustrcpy(mainlog_name, buffer);
503     if (string_datestamp_offset > 0)
504       mainlog_datestamp = mainlog_name + string_datestamp_offset;
505   case lt_reject:
506     /* Ditto for the reject log */
507     Ustrcpy(rejectlog_name, buffer);
508     if (string_datestamp_offset > 0)
509       rejectlog_datestamp = rejectlog_name + string_datestamp_offset;
510   case lt_debug:
511     /* and deal with the debug log (which keeps the datestamp, but does not
512     update it) */
513     Ustrcpy(debuglog_name, buffer);
514     if (tag)
515       {
516       /* this won't change the offset of the datestamp */
517       ok2 = string_format(buffer, sizeof(buffer), "%s%s",
518         debuglog_name, tag);
519       if (ok2)
520         Ustrcpy(debuglog_name, buffer);
521       }
522   default:
523     /* Remove any datestamp if this is the panic log. This is rare, so there's no
524   need to optimize getting the datestamp length. We remove one non-alphanumeric
525   char afterwards if at the start, otherwise one before. */
526     if (string_datestamp_offset >= 0)
527       {
528       uschar * from = buffer + string_datestamp_offset;
529       uschar * to = from + string_datestamp_length;
530
531       if (from == buffer || from[-1] == '/')
532         {
533         if (!isalnum(*to)) to++;
534         }
535       else
536         if (!isalnum(from[-1])) from--;
537
538       /* This copy is ok, because we know that to is a substring of from. But
539       due to overlap we must use memmove() not Ustrcpy(). */
540       memmove(from, to, Ustrlen(to)+1);
541       }
542   }
543
544 /* If the file name is too long, it is an unrecoverable disaster */
545
546 if (!ok)
547   die(US"exim: log file path too long: aborting",
548       US"Logging failure; please try later");
549
550 /* We now have the file name. After a successful open, return. */
551
552 *fd = log_open_as_exim(buffer);
553
554 if (*fd >= 0)
555   {
556   return;
557   }
558
559 euid = geteuid();
560
561 /* Creation failed. There are some circumstances in which we get here when
562 the effective uid is not root or exim, which is the problem. (For example, a
563 non-setuid binary with log_arguments set, called in certain ways.) Rather than
564 just bombing out, force the log to stderr and carry on if stderr is available.
565 */
566
567 if (euid != root_uid && euid != exim_uid && log_stderr)
568   {
569   *fd = fileno(log_stderr);
570   return;
571   }
572
573 /* Otherwise this is a disaster. This call is deliberately ONLY to the panic
574 log. If possible, save a copy of the original line that was being logged. If we
575 are recursing (can't open the panic log either), the pointer will already be
576 set.  Also, when we had to use a subprocess for the create we didn't retrieve
577 errno from it, so get the error from the open attempt above (which is often
578 meaningful enough, so leave it). */
579
580 if (!panic_save_buffer)
581   if ((panic_save_buffer = US malloc(LOG_BUFFER_SIZE)))
582     memcpy(panic_save_buffer, log_buffer, LOG_BUFFER_SIZE);
583
584 log_write(0, LOG_PANIC_DIE, "Cannot open %s log file \"%s\": %s: "
585   "euid=%d egid=%d", log_names[type], buffer, strerror(errno), euid, getegid());
586 /* Never returns */
587 }
588
589
590 static void
591 unlink_log(int type)
592 {
593 if (type == lt_debug) unlink(CS debuglog_name);
594 }
595
596
597
598 /*************************************************
599 *     Add configuration file info to log line    *
600 *************************************************/
601
602 /* This is put in a function because it's needed twice (once for debugging,
603 once for real).
604
605 Arguments:
606   ptr         pointer to the end of the line we are building
607   flags       log flags
608
609 Returns:      updated pointer
610 */
611
612 static gstring *
613 log_config_info(gstring * g, int flags)
614 {
615 g = string_cat(g, US"Exim configuration error");
616
617 if (flags & (LOG_CONFIG_FOR & ~LOG_CONFIG))
618   return string_cat(g, US" for ");
619
620 if (flags & (LOG_CONFIG_IN & ~LOG_CONFIG))
621   g = string_fmt_append(g, " in line %d of %s", config_lineno, config_filename);
622
623 return string_catn(g, US":\n  ", 4);
624 }
625
626
627 /*************************************************
628 *           A write() operation failed           *
629 *************************************************/
630
631 /* This function is called when write() fails on anything other than the panic
632 log, which can happen if a disk gets full or a file gets too large or whatever.
633 We try to save the relevant message in the panic_save buffer before crashing
634 out.
635
636 The potential invoker should probably not call us for EINTR -1 writes.  But
637 otherwise, short writes are bad as we don't do non-blocking writes to fds
638 subject to flow control.  (If we do, that's new and the logic of this should
639 be reconsidered).
640
641 Arguments:
642   name      the name of the log being written
643   length    the string length being written
644   rc        the return value from write()
645
646 Returns:    does not return
647 */
648
649 static void
650 log_write_failed(uschar *name, int length, int rc)
651 {
652 int save_errno = errno;
653
654 if (!panic_save_buffer)
655   if ((panic_save_buffer = US malloc(LOG_BUFFER_SIZE)))
656     memcpy(panic_save_buffer, log_buffer, LOG_BUFFER_SIZE);
657
658 log_write(0, LOG_PANIC_DIE, "failed to write to %s: length=%d result=%d "
659   "errno=%d (%s)", name, length, rc, save_errno,
660   (save_errno == 0)? "write incomplete" : strerror(save_errno));
661 /* Never returns */
662 }
663
664
665
666 /*************************************************
667 *     Write to an fd, retrying after signals     *
668 *************************************************/
669
670 /* Basic write to fd for logs, handling EINTR.
671
672 Arguments:
673   fd        the fd to write to
674   buf       the string to write
675   length    the string length being written
676
677 Returns:
678   length actually written, persisting an errno from write()
679 */
680 ssize_t
681 write_to_fd_buf(int fd, const uschar *buf, size_t length)
682 {
683 ssize_t wrote;
684 size_t total_written = 0;
685 const uschar *p = buf;
686 size_t left = length;
687
688 while (1)
689   {
690   wrote = write(fd, p, left);
691   if (wrote == (ssize_t)-1)
692     {
693     if (errno == EINTR) continue;
694     return wrote;
695     }
696   total_written += wrote;
697   if (wrote == left)
698     break;
699   else
700     {
701     p += wrote;
702     left -= wrote;
703     }
704   }
705 return total_written;
706 }
707
708
709 void
710 set_file_path(BOOL *multiple)
711 {
712 uschar *s;
713 int sep = ':';              /* Fixed separator - outside use */
714 const uschar *ss = *log_file_path ? log_file_path : US LOG_FILE_PATH;
715
716 logging_mode = 0;
717 while ((s = string_nextinlist(&ss, &sep, log_buffer, LOG_BUFFER_SIZE)))
718   {
719   if (Ustrcmp(s, "syslog") == 0)
720     logging_mode |= LOG_MODE_SYSLOG;
721   else if (logging_mode & LOG_MODE_FILE)  /* we know a file already */
722     {
723     if (multiple) *multiple = TRUE;
724     }
725   else
726     {
727     logging_mode |= LOG_MODE_FILE;
728
729     /* If a non-empty path is given, use it */
730
731     if (*s)
732       file_path = string_copy(s);
733
734     /* If the path is empty, we want to use the first non-empty, non-
735     syslog item in LOG_FILE_PATH, if there is one, since the value of
736     log_file_path may have been set at runtime. If there is no such item,
737     use the ultimate default in the spool directory. */
738     }
739   }
740 }
741
742
743 void
744 mainlog_close(void)
745 {
746 /* avoid closing it if it is closed already or if we do not see a chance
747 to open the file mainlog later again */
748 if (mainlogfd < 0 /* already closed */
749    || !(geteuid() == 0 || geteuid() == exim_uid))
750   return;
751 (void)close(mainlogfd);
752 mainlogfd = -1;
753 mainlog_inode = 0;
754 }
755
756 /*************************************************
757 *            Write message to log file           *
758 *************************************************/
759
760 /* Exim can be configured to log to local files, or use syslog, or both. This
761 is controlled by the setting of log_file_path. The following cases are
762 recognized:
763
764   log_file_path = ""               write files in the spool/log directory
765   log_file_path = "xxx"            write files in the xxx directory
766   log_file_path = "syslog"         write to syslog
767   log_file_path = "syslog : xxx"   write to syslog and to files (any order)
768
769 The message always gets '\n' added on the end of it, since more than one
770 process may be writing to the log at once and we don't want intermingling to
771 happen in the middle of lines. To be absolutely sure of this we write the data
772 into a private buffer and then put it out in a single write() call.
773
774 The flags determine which log(s) the message is written to, or for syslogging,
775 which priority to use, and in the case of the panic log, whether the process
776 should die afterwards.
777
778 The variable really_exim is TRUE only when exim is running in privileged state
779 (i.e. not with a changed configuration or with testing options such as -brw).
780 If it is not, don't try to write to the log because permission will probably be
781 denied.
782
783 Avoid actually writing to the logs when exim is called with -bv or -bt to
784 test an address, but take other actions, such as panicking.
785
786 In Exim proper, the buffer for building the message is got at start-up, so that
787 nothing gets done if it can't be got. However, some functions that are also
788 used in utilities occasionally obey log_write calls in error situations, and it
789 is simplest to put a single malloc() here rather than put one in each utility.
790 Malloc is used directly because the store functions may call log_write().
791
792 If a message_id exists, we include it after the timestamp.
793
794 Arguments:
795   selector  write to main log or LOG_INFO only if this value is zero, or if
796               its bit is set in log_selector[0]
797   flags     each bit indicates some independent action:
798               LOG_SENDER      add raw sender to the message
799               LOG_RECIPIENTS  add raw recipients list to message
800               LOG_CONFIG      add "Exim configuration error"
801               LOG_CONFIG_FOR  add " for " instead of ":\n  "
802               LOG_CONFIG_IN   add " in line x[ of file y]"
803               LOG_MAIN        write to main log or syslog LOG_INFO
804               LOG_REJECT      write to reject log or syslog LOG_NOTICE
805               LOG_PANIC       write to panic log or syslog LOG_ALERT
806               LOG_PANIC_DIE   write to panic log or LOG_ALERT and then crash
807   format    a printf() format
808   ...       arguments for format
809
810 Returns:    nothing
811 */
812
813 void
814 log_write(unsigned int selector, int flags, const char *format, ...)
815 {
816 int paniclogfd;
817 ssize_t written_len;
818 gstring gs = { .size = LOG_BUFFER_SIZE-1, .ptr = 0, .s = log_buffer };
819 gstring * g;
820 va_list ap;
821
822 /* If panic_recurseflag is set, we have failed to open the panic log. This is
823 the ultimate disaster. First try to write the message to a debug file and/or
824 stderr and also to syslog. If panic_save_buffer is not NULL, it contains the
825 original log line that caused the problem. Afterwards, expire. */
826
827 if (panic_recurseflag)
828   {
829   uschar *extra = panic_save_buffer ? panic_save_buffer : US"";
830   if (debug_file) debug_printf("%s%s", extra, log_buffer);
831   if (log_stderr && log_stderr != debug_file)
832     fprintf(log_stderr, "%s%s", extra, log_buffer);
833   if (*extra) write_syslog(LOG_CRIT, extra);
834   write_syslog(LOG_CRIT, log_buffer);
835   die(US"exim: could not open panic log - aborting: see message(s) above",
836     US"Unexpected log failure, please try later");
837   }
838
839 /* Ensure we have a buffer (see comment above); this should never be obeyed
840 when running Exim proper, only when running utilities. */
841
842 if (!log_buffer)
843   if (!(log_buffer = US malloc(LOG_BUFFER_SIZE)))
844     {
845     fprintf(stderr, "exim: failed to get store for log buffer\n");
846     exim_exit(EXIT_FAILURE);
847     }
848
849 /* If we haven't already done so, inspect the setting of log_file_path to
850 determine whether to log to files and/or to syslog. Bits in logging_mode
851 control this, and for file logging, the path must end up in file_path. This
852 variable must be in permanent store because it may be required again later in
853 the process. */
854
855 if (!path_inspected)
856   {
857   BOOL multiple = FALSE;
858   int old_pool = store_pool;
859
860   store_pool = POOL_PERM;
861
862   /* If nothing has been set, don't waste effort... the default values for the
863   statics are file_path="" and logging_mode = LOG_MODE_FILE. */
864
865   if (*log_file_path) set_file_path(&multiple);
866
867   /* If no modes have been selected, it is a major disaster */
868
869   if (logging_mode == 0)
870     die(US"Neither syslog nor file logging set in log_file_path",
871         US"Unexpected logging failure");
872
873   /* Set up the ultimate default if necessary. Then revert to the old store
874   pool, and record that we've sorted out the path. */
875
876   if (logging_mode & LOG_MODE_FILE  &&  !file_path[0])
877     file_path = string_sprintf("%s/log/%%slog", spool_directory);
878   store_pool = old_pool;
879   path_inspected = TRUE;
880
881   /* If more than one file path was given, log a complaint. This recursive call
882   should work since we have now set up the routing. */
883
884   if (multiple)
885     log_write(0, LOG_MAIN|LOG_PANIC,
886       "More than one path given in log_file_path: using %s", file_path);
887   }
888
889 /* If debugging, show all log entries, but don't show headers. Do it all
890 in one go so that it doesn't get split when multi-processing. */
891
892 DEBUG(D_any|D_v)
893   {
894   int i;
895
896   g = string_catn(&gs, US"LOG:", 4);
897
898   /* Show the selector that was passed into the call. */
899
900   for (i = 0; i < log_options_count; i++)
901     {
902     unsigned int bitnum = log_options[i].bit;
903     if (bitnum < BITWORDSIZE && selector == BIT(bitnum))
904       g = string_fmt_append(g, " %s", log_options[i].name);
905     }
906
907   g = string_fmt_append(g, "%s%s%s%s\n  ",
908     flags & LOG_MAIN ?    " MAIN"   : "",
909     flags & LOG_PANIC ?   " PANIC"  : "",
910     (flags & LOG_PANIC_DIE) == LOG_PANIC_DIE ? " DIE" : "",
911     flags & LOG_REJECT ?  " REJECT" : "");
912
913   if (flags & LOG_CONFIG) g = log_config_info(g, flags);
914
915   /* We want to be able to log tainted info, but log_buffer is directly
916   malloc'd.  So use deliberately taint-nonchecking routines to build into
917   it, trusting that we will never expand the results. */
918
919   va_start(ap, format);
920   i = g->ptr;
921   if (!string_vformat(g, SVFMT_TAINT_NOCHK, format, ap))
922     {
923     g->ptr = i;
924     g = string_cat(g, US"**** log string overflowed log buffer ****");
925     }
926   va_end(ap);
927
928   g->size = LOG_BUFFER_SIZE;
929   g = string_catn(g, US"\n", 1);
930   debug_printf("%s", string_from_gstring(g));
931
932   gs.size = LOG_BUFFER_SIZE-1;  /* Having used the buffer for debug output, */
933   gs.ptr = 0;                   /* reset it for the real use. */
934   gs.s = log_buffer;
935   }
936 /* If no log file is specified, we are in a mess. */
937
938 if (!(flags & (LOG_MAIN|LOG_PANIC|LOG_REJECT)))
939   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "log_write called with no log "
940     "flags set");
941
942 /* There are some weird circumstances in which logging is disabled. */
943
944 if (f.disable_logging)
945   {
946   DEBUG(D_any) debug_printf("log writing disabled\n");
947   if ((flags & LOG_PANIC_DIE) == LOG_PANIC_DIE) exim_exit(EXIT_FAILURE);
948   return;
949   }
950
951 /* Handle disabled reject log */
952
953 if (!write_rejectlog) flags &= ~LOG_REJECT;
954
955 /* Create the main message in the log buffer. Do not include the message id
956 when called by a utility. */
957
958 g = string_fmt_append(&gs, "%s ", tod_stamp(tod_log));
959
960 if (LOGGING(pid))
961   {
962   if (!syslog_pid) pid_position[0] = g->ptr;            /* remember begin â€¦ */
963   g = string_fmt_append(g, "[%d] ", (int)getpid());
964   if (!syslog_pid) pid_position[1] = g->ptr;            /*  â€¦ and end+1 of the PID */
965   }
966
967 if (f.really_exim && message_id[0] != 0)
968   g = string_fmt_append(g, "%s ", message_id);
969
970 if (flags & LOG_CONFIG)
971   g = log_config_info(g, flags);
972
973 va_start(ap, format);
974   {
975   int i = g->ptr;
976
977   /* We want to be able to log tainted info, but log_buffer is directly
978   malloc'd.  So use deliberately taint-nonchecking routines to build into
979   it, trusting that we will never expand the results. */
980
981   if (!string_vformat(g, SVFMT_TAINT_NOCHK, format, ap))
982     {
983     g->ptr = i;
984     g = string_cat(g, US"**** log string overflowed log buffer ****\n");
985     }
986   }
987 va_end(ap);
988
989 /* Add the raw, unrewritten, sender to the message if required. This is done
990 this way because it kind of fits with LOG_RECIPIENTS. */
991
992 if (   flags & LOG_SENDER
993    && g->ptr < LOG_BUFFER_SIZE - 10 - Ustrlen(raw_sender))
994   g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " from <%s>", raw_sender);
995
996 /* Add list of recipients to the message if required; the raw list,
997 before rewriting, was saved in raw_recipients. There may be none, if an ACL
998 discarded them all. */
999
1000 if (  flags & LOG_RECIPIENTS
1001    && g->ptr < LOG_BUFFER_SIZE - 6
1002    && raw_recipients_count > 0)
1003   {
1004   int i;
1005   g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " for", NULL);
1006   for (i = 0; i < raw_recipients_count; i++)
1007     {
1008     uschar * s = raw_recipients[i];
1009     if (LOG_BUFFER_SIZE - g->ptr < Ustrlen(s) + 3) break;
1010     g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " %s", s);
1011     }
1012   }
1013
1014 g = string_catn(g, US"\n", 1);
1015 string_from_gstring(g);
1016
1017 /* Handle loggable errors when running a utility, or when address testing.
1018 Write to log_stderr unless debugging (when it will already have been written),
1019 or unless there is no log_stderr (expn called from daemon, for example). */
1020
1021 if (!f.really_exim || f.log_testing_mode)
1022   {
1023   if (  !debug_selector
1024      && log_stderr
1025      && (selector == 0 || (selector & log_selector[0]) != 0)
1026     )
1027     if (host_checking)
1028       fprintf(log_stderr, "LOG: %s", CS(log_buffer + 20));  /* no timestamp */
1029     else
1030       fprintf(log_stderr, "%s", CS log_buffer);
1031
1032   if ((flags & LOG_PANIC_DIE) == LOG_PANIC_DIE) exim_exit(EXIT_FAILURE);
1033   return;
1034   }
1035
1036 /* Handle the main log. We know that either syslog or file logging (or both) is
1037 set up. A real file gets left open during reception or delivery once it has
1038 been opened, but we don't want to keep on writing to it for too long after it
1039 has been renamed. Therefore, do a stat() and see if the inode has changed, and
1040 if so, re-open. */
1041
1042 if (  flags & LOG_MAIN
1043    && (!selector ||  selector & log_selector[0]))
1044   {
1045   if (  logging_mode & LOG_MODE_SYSLOG
1046      && (syslog_duplication || !(flags & (LOG_REJECT|LOG_PANIC))))
1047     write_syslog(LOG_INFO, log_buffer);
1048
1049   if (logging_mode & LOG_MODE_FILE)
1050     {
1051     struct stat statbuf;
1052
1053     /* Check for a change to the mainlog file name when datestamping is in
1054     operation. This happens at midnight, at which point we want to roll over
1055     the file. Closing it has the desired effect. */
1056
1057     if (mainlog_datestamp)
1058       {
1059       uschar *nowstamp = tod_stamp(string_datestamp_type);
1060       if (Ustrncmp (mainlog_datestamp, nowstamp, Ustrlen(nowstamp)) != 0)
1061         {
1062         (void)close(mainlogfd);       /* Close the file */
1063         mainlogfd = -1;               /* Clear the file descriptor */
1064         mainlog_inode = 0;            /* Unset the inode */
1065         mainlog_datestamp = NULL;     /* Clear the datestamp */
1066         }
1067       }
1068
1069     /* Otherwise, we want to check whether the file has been renamed by a
1070     cycling script. This could be "if else", but for safety's sake, leave it as
1071     "if" so that renaming the log starts a new file even when datestamping is
1072     happening. */
1073
1074     if (mainlogfd >= 0)
1075       if (Ustat(mainlog_name, &statbuf) < 0 || statbuf.st_ino != mainlog_inode)
1076         mainlog_close();
1077
1078     /* If the log is closed, open it. Then write the line. */
1079
1080     if (mainlogfd < 0)
1081       {
1082       open_log(&mainlogfd, lt_main, NULL);     /* No return on error */
1083       if (fstat(mainlogfd, &statbuf) >= 0) mainlog_inode = statbuf.st_ino;
1084       }
1085
1086     /* Failing to write to the log is disastrous */
1087
1088     written_len = write_to_fd_buf(mainlogfd, g->s, g->ptr);
1089     if (written_len != g->ptr)
1090       {
1091       log_write_failed(US"main log", g->ptr, written_len);
1092       /* That function does not return */
1093       }
1094     }
1095   }
1096
1097 /* Handle the log for rejected messages. This can be globally disabled, in
1098 which case the flags are altered above. If there are any header lines (i.e. if
1099 the rejection is happening after the DATA phase), log the recipients and the
1100 headers. */
1101
1102 if (flags & LOG_REJECT)
1103   {
1104   if (header_list && LOGGING(rejected_header))
1105     {
1106     gstring * g2;
1107     int i;
1108
1109     if (recipients_count > 0)
1110       {
1111       /* List the sender */
1112
1113       g2 = string_fmt_append_f(g, SVFMT_TAINT_NOCHK,
1114                         "Envelope-from: <%s>\n", sender_address);
1115       if (g2) g = g2;
1116
1117       /* List up to 5 recipients */
1118
1119       g2 = string_fmt_append_f(g, SVFMT_TAINT_NOCHK,
1120                         "Envelope-to: <%s>\n", recipients_list[0].address);
1121       if (g2) g = g2;
1122
1123       for (i = 1; i < recipients_count && i < 5; i++)
1124         {
1125         g2 = string_fmt_append_f(g, SVFMT_TAINT_NOCHK,
1126                         "    <%s>\n", recipients_list[i].address);
1127         if (g2) g = g2;
1128         }
1129
1130       if (i < recipients_count)
1131         {
1132         g2 = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, "    ...\n", NULL);
1133         if (g2) g = g2;
1134         }
1135       }
1136
1137     /* A header with a NULL text is an unfilled in Received: header */
1138
1139     for (header_line * h = header_list; h; h = h->next) if (h->text)
1140       {
1141       g2 = string_fmt_append_f(g, SVFMT_TAINT_NOCHK,
1142                         "%c %s", h->type, h->text);
1143       if (g2)
1144         g = g2;
1145       else              /* Buffer is full; truncate */
1146         {
1147         g->ptr -= 100;        /* For message and separator */
1148         if (g->s[g->ptr-1] == '\n') g->ptr--;
1149         g = string_cat(g, US"\n*** truncated ***\n");
1150         break;
1151         }
1152       }
1153     }
1154
1155   /* Write to syslog or to a log file */
1156
1157   if (  logging_mode & LOG_MODE_SYSLOG
1158      && (syslog_duplication || !(flags & LOG_PANIC)))
1159     write_syslog(LOG_NOTICE, string_from_gstring(g));
1160
1161   /* Check for a change to the rejectlog file name when datestamping is in
1162   operation. This happens at midnight, at which point we want to roll over
1163   the file. Closing it has the desired effect. */
1164
1165   if (logging_mode & LOG_MODE_FILE)
1166     {
1167     struct stat statbuf;
1168
1169     if (rejectlog_datestamp)
1170       {
1171       uschar *nowstamp = tod_stamp(string_datestamp_type);
1172       if (Ustrncmp (rejectlog_datestamp, nowstamp, Ustrlen(nowstamp)) != 0)
1173         {
1174         (void)close(rejectlogfd);       /* Close the file */
1175         rejectlogfd = -1;               /* Clear the file descriptor */
1176         rejectlog_inode = 0;            /* Unset the inode */
1177         rejectlog_datestamp = NULL;     /* Clear the datestamp */
1178         }
1179       }
1180
1181     /* Otherwise, we want to check whether the file has been renamed by a
1182     cycling script. This could be "if else", but for safety's sake, leave it as
1183     "if" so that renaming the log starts a new file even when datestamping is
1184     happening. */
1185
1186     if (rejectlogfd >= 0)
1187       if (Ustat(rejectlog_name, &statbuf) < 0 ||
1188            statbuf.st_ino != rejectlog_inode)
1189         {
1190         (void)close(rejectlogfd);
1191         rejectlogfd = -1;
1192         rejectlog_inode = 0;
1193         }
1194
1195     /* Open the file if necessary, and write the data */
1196
1197     if (rejectlogfd < 0)
1198       {
1199       open_log(&rejectlogfd, lt_reject, NULL); /* No return on error */
1200       if (fstat(rejectlogfd, &statbuf) >= 0) rejectlog_inode = statbuf.st_ino;
1201       }
1202
1203     written_len = write_to_fd_buf(rejectlogfd, g->s, g->ptr);
1204     if (written_len != g->ptr)
1205       {
1206       log_write_failed(US"reject log", g->ptr, written_len);
1207       /* That function does not return */
1208       }
1209     }
1210   }
1211
1212
1213 /* Handle the panic log, which is not kept open like the others. If it fails to
1214 open, there will be a recursive call to log_write(). We detect this above and
1215 attempt to write to the system log as a last-ditch try at telling somebody. In
1216 all cases except mua_wrapper, try to write to log_stderr. */
1217
1218 if (flags & LOG_PANIC)
1219   {
1220   if (log_stderr && log_stderr != debug_file && !mua_wrapper)
1221     fprintf(log_stderr, "%s", CS string_from_gstring(g));
1222
1223   if (logging_mode & LOG_MODE_SYSLOG)
1224     write_syslog(LOG_ALERT, log_buffer);
1225
1226   /* If this panic logging was caused by a failure to open the main log,
1227   the original log line is in panic_save_buffer. Make an attempt to write it. */
1228
1229   if (logging_mode & LOG_MODE_FILE)
1230     {
1231     panic_recurseflag = TRUE;
1232     open_log(&paniclogfd, lt_panic, NULL);  /* Won't return on failure */
1233     panic_recurseflag = FALSE;
1234
1235     if (panic_save_buffer)
1236       {
1237       int i = write(paniclogfd, panic_save_buffer, Ustrlen(panic_save_buffer));
1238       i = i;    /* compiler quietening */
1239       }
1240
1241     written_len = write_to_fd_buf(paniclogfd, g->s, g->ptr);
1242     if (written_len != g->ptr)
1243       {
1244       int save_errno = errno;
1245       write_syslog(LOG_CRIT, log_buffer);
1246       sprintf(CS log_buffer, "write failed on panic log: length=%d result=%d "
1247         "errno=%d (%s)", g->ptr, (int)written_len, save_errno, strerror(save_errno));
1248       write_syslog(LOG_CRIT, string_from_gstring(g));
1249       flags |= LOG_PANIC_DIE;
1250       }
1251
1252     (void)close(paniclogfd);
1253     }
1254
1255   /* Give up if the DIE flag is set */
1256
1257   if ((flags & LOG_PANIC_DIE) != LOG_PANIC)
1258     die(NULL, US"Unexpected failure, please try later");
1259   }
1260 }
1261
1262
1263
1264 /*************************************************
1265 *            Close any open log files            *
1266 *************************************************/
1267
1268 void
1269 log_close_all(void)
1270 {
1271 if (mainlogfd >= 0)
1272   { (void)close(mainlogfd); mainlogfd = -1; }
1273 if (rejectlogfd >= 0)
1274   { (void)close(rejectlogfd); rejectlogfd = -1; }
1275 closelog();
1276 syslog_open = FALSE;
1277 }
1278
1279
1280
1281 /*************************************************
1282 *             Multi-bit set or clear             *
1283 *************************************************/
1284
1285 /* These functions take a list of bit indexes (terminated by -1) and
1286 clear or set the corresponding bits in the selector.
1287
1288 Arguments:
1289   selector       address of the bit string
1290   selsize        number of words in the bit string
1291   bits           list of bits to set
1292 */
1293
1294 void
1295 bits_clear(unsigned int *selector, size_t selsize, int *bits)
1296 {
1297 for(; *bits != -1; ++bits)
1298   BIT_CLEAR(selector, selsize, *bits);
1299 }
1300
1301 void
1302 bits_set(unsigned int *selector, size_t selsize, int *bits)
1303 {
1304 for(; *bits != -1; ++bits)
1305   BIT_SET(selector, selsize, *bits);
1306 }
1307
1308
1309
1310 /*************************************************
1311 *         Decode bit settings for log/debug      *
1312 *************************************************/
1313
1314 /* This function decodes a string containing bit settings in the form of +name
1315 and/or -name sequences, and sets/unsets bits in a bit string accordingly. It
1316 also recognizes a numeric setting of the form =<number>, but this is not
1317 intended for user use. It's an easy way for Exim to pass the debug settings
1318 when it is re-exec'ed.
1319
1320 The option table is a list of names and bit indexes. The index -1
1321 means "set all bits, except for those listed in notall". The notall
1322 list is terminated by -1.
1323
1324 The action taken for bad values varies depending upon why we're here.
1325 For log messages, or if the debugging is triggered from config, then we write
1326 to the log on the way out.  For debug setting triggered from the command-line,
1327 we treat it as an unknown option: error message to stderr and die.
1328
1329 Arguments:
1330   selector       address of the bit string
1331   selsize        number of words in the bit string
1332   notall         list of bits to exclude from "all"
1333   string         the configured string
1334   options        the table of option names
1335   count          size of table
1336   which          "log" or "debug"
1337   flags          DEBUG_FROM_CONFIG
1338
1339 Returns:         nothing on success - bomb out on failure
1340 */
1341
1342 void
1343 decode_bits(unsigned int *selector, size_t selsize, int *notall,
1344   uschar *string, bit_table *options, int count, uschar *which, int flags)
1345 {
1346 uschar *errmsg;
1347 if (!string) return;
1348
1349 if (*string == '=')
1350   {
1351   char *end;    /* Not uschar */
1352   memset(selector, 0, sizeof(*selector)*selsize);
1353   *selector = strtoul(CS string+1, &end, 0);
1354   if (!*end) return;
1355   errmsg = string_sprintf("malformed numeric %s_selector setting: %s", which,
1356     string);
1357   goto ERROR_RETURN;
1358   }
1359
1360 /* Handle symbolic setting */
1361
1362 else for(;;)
1363   {
1364   BOOL adding;
1365   uschar *s;
1366   int len;
1367   bit_table *start, *end;
1368
1369   Uskip_whitespace(&string);
1370   if (!*string) return;
1371
1372   if (*string != '+' && *string != '-')
1373     {
1374     errmsg = string_sprintf("malformed %s_selector setting: "
1375       "+ or - expected but found \"%s\"", which, string);
1376     goto ERROR_RETURN;
1377     }
1378
1379   adding = *string++ == '+';
1380   s = string;
1381   while (isalnum(*string) || *string == '_') string++;
1382   len = string - s;
1383
1384   start = options;
1385   end = options + count;
1386
1387   while (start < end)
1388     {
1389     bit_table *middle = start + (end - start)/2;
1390     int c = Ustrncmp(s, middle->name, len);
1391     if (c == 0)
1392       if (middle->name[len] != 0) c = -1; else
1393         {
1394         unsigned int bit = middle->bit;
1395
1396         if (bit == -1)
1397           {
1398           if (adding)
1399             {
1400             memset(selector, -1, sizeof(*selector)*selsize);
1401             bits_clear(selector, selsize, notall);
1402             }
1403           else
1404             memset(selector, 0, sizeof(*selector)*selsize);
1405           }
1406         else if (adding)
1407           BIT_SET(selector, selsize, bit);
1408         else
1409           BIT_CLEAR(selector, selsize, bit);
1410
1411         break;  /* Out of loop to match selector name */
1412         }
1413     if (c < 0) end = middle; else start = middle + 1;
1414     }  /* Loop to match selector name */
1415
1416   if (start >= end)
1417     {
1418     errmsg = string_sprintf("unknown %s_selector setting: %c%.*s", which,
1419       adding? '+' : '-', len, s);
1420     goto ERROR_RETURN;
1421     }
1422   }    /* Loop for selector names */
1423
1424 /* Handle disasters */
1425
1426 ERROR_RETURN:
1427 if (Ustrcmp(which, "debug") == 0)
1428   {
1429   if (flags & DEBUG_FROM_CONFIG)
1430     {
1431     log_write(0, LOG_CONFIG|LOG_PANIC, "%s", errmsg);
1432     return;
1433     }
1434   fprintf(stderr, "exim: %s\n", errmsg);
1435   exit(EXIT_FAILURE);
1436   }
1437 else log_write(0, LOG_CONFIG|LOG_PANIC_DIE, "%s", errmsg);
1438 }
1439
1440
1441
1442 /*************************************************
1443 *        Activate a debug logfile (late)         *
1444 *************************************************/
1445
1446 /* Normally, debugging is activated from the command-line; it may be useful
1447 within the configuration to activate debugging later, based on certain
1448 conditions.  If debugging is already in progress, we return early, no action
1449 taken (besides debug-logging that we wanted debug-logging).
1450
1451 Failures in options are not fatal but will result in paniclog entries for the
1452 misconfiguration.
1453
1454 The first use of this is in ACL logic, "control = debug/tag=foo/opts=+expand"
1455 which can be combined with conditions, etc, to activate extra logging only
1456 for certain sources. The second use is inetd wait mode debug preservation. */
1457
1458 void
1459 debug_logging_activate(uschar *tag_name, uschar *opts)
1460 {
1461 int fd = -1;
1462
1463 if (debug_file)
1464   {
1465   debug_printf("DEBUGGING ACTIVATED FROM WITHIN CONFIG.\n"
1466       "DEBUG: Tag=\"%s\" opts=\"%s\"\n", tag_name, opts ? opts : US"");
1467   return;
1468   }
1469
1470 if (tag_name != NULL && (Ustrchr(tag_name, '/') != NULL))
1471   {
1472   log_write(0, LOG_MAIN|LOG_PANIC, "debug tag may not contain a '/' in: %s",
1473       tag_name);
1474   return;
1475   }
1476
1477 debug_selector = D_default;
1478 if (opts)
1479   decode_bits(&debug_selector, 1, debug_notall, opts,
1480       debug_options, debug_options_count, US"debug", DEBUG_FROM_CONFIG);
1481
1482 /* When activating from a transport process we may never have logged at all
1483 resulting in certain setup not having been done.  Hack this for now so we
1484 do not segfault; note that nondefault log locations will not work */
1485
1486 if (!*file_path) set_file_path(NULL);
1487
1488 open_log(&fd, lt_debug, tag_name);
1489
1490 if (fd != -1)
1491   debug_file = fdopen(fd, "w");
1492 else
1493   log_write(0, LOG_MAIN|LOG_PANIC, "unable to open debug log");
1494 }
1495
1496
1497 void
1498 debug_logging_stop(void)
1499 {
1500 if (!debug_file || !debuglog_name[0]) return;
1501
1502 debug_selector = 0;
1503 fclose(debug_file);
1504 debug_file = NULL;
1505 unlink_log(lt_debug);
1506 }
1507
1508 void
1509 open_logs(void)
1510 {
1511 set_file_path(NULL);
1512 open_log(&mainlogfd, lt_main, 0);
1513 open_log(&rejectlogfd, lt_reject, 0);
1514 }
1515
1516 /* End of log.c */