Debug: _exit() process-termination
[exim.git] / src / src / queue.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2018 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8 /* Functions that operate on the input queue. */
9
10
11 #include "exim.h"
12
13
14
15
16
17
18
19 #ifndef COMPILE_UTILITY
20
21 /* The number of nodes to use for the bottom-up merge sort when a list of queue
22 items is to be ordered. The code for this sort was contributed as a patch by
23 Michael Haardt. */
24
25 #define LOG2_MAXNODES 32
26
27
28
29 /*************************************************
30 *  Helper sort function for queue_get_spool_list *
31 *************************************************/
32
33 /* This function is used when sorting the queue list in the function
34 queue_get_spool_list() below.
35
36 Arguments:
37   a            points to an ordered list of queue_filename items
38   b            points to another ordered list
39
40 Returns:       a pointer to a merged ordered list
41 */
42
43 static queue_filename *
44 merge_queue_lists(queue_filename *a, queue_filename *b)
45 {
46 queue_filename *first = NULL;
47 queue_filename **append = &first;
48
49 while (a && b)
50   {
51   int d;
52   if ((d = Ustrncmp(a->text, b->text, 6)) == 0)
53     d = Ustrcmp(a->text + 14, b->text + 14);
54   if (d < 0)
55     {
56     *append = a;
57     append= &a->next;
58     a = a->next;
59     }
60   else
61     {
62     *append = b;
63     append= &b->next;
64     b = b->next;
65     }
66   }
67
68 *append = a ? a : b;
69 return first;
70 }
71
72
73
74
75
76 /*************************************************
77 *             Get list of spool files            *
78 *************************************************/
79
80 /* Scan the spool directory and return a list of the relevant file names
81 therein. Single-character sub-directories are handled as follows:
82
83   If the first argument is > 0, a sub-directory is scanned; the letter is
84   taken from the nth entry in subdirs.
85
86   If the first argument is 0, sub-directories are not scanned. However, a
87   list of them is returned.
88
89   If the first argument is < 0, sub-directories are scanned for messages,
90   and a single, unified list is created. The returned data blocks contain the
91   identifying character of the subdirectory, if any. The subdirs vector is
92   still required as an argument.
93
94 If the randomize argument is TRUE, messages are returned in "randomized" order.
95 Actually, the order is anything but random, but the algorithm is cheap, and the
96 point is simply to ensure that the same order doesn't occur every time, in case
97 a particular message is causing a remote MTA to barf - we would like to try
98 other messages to that MTA first.
99
100 If the randomize argument is FALSE, sort the list according to the file name.
101 This should give the order in which the messages arrived. It is normally used
102 only for presentation to humans, in which case the (possibly expensive) sort
103 that it does is not part of the normal operational code. However, if
104 queue_run_in_order is set, sorting has to take place for queue runs as well.
105 When randomize is FALSE, the first argument is normally -1, so all messages are
106 included.
107
108 Arguments:
109   subdiroffset   sub-directory character offset, or 0 or -1 (see above)
110   subdirs        vector to store list of subdirchars
111   subcount       pointer to int in which to store count of subdirs
112   randomize      TRUE if the order of the list is to be unpredictable
113   pcount         If not NULL, fill in with count of files and do not return list
114
115 Returns:         pointer to a chain of queue name items
116 */
117
118 static queue_filename *
119 queue_get_spool_list(int subdiroffset, uschar *subdirs, int *subcount,
120   BOOL randomize, unsigned * pcount)
121 {
122 int i;
123 int flags = 0;
124 int resetflags = -1;
125 int subptr;
126 queue_filename *yield = NULL;
127 queue_filename *last = NULL;
128 struct dirent *ent;
129 DIR *dd;
130 uschar buffer[256];
131 queue_filename *root[LOG2_MAXNODES];
132
133 /* When randomizing, the file names are added to the start or end of the list
134 according to the bits of the flags variable. Get a collection of bits from the
135 current time. Use the bottom 16 and just keep re-using them if necessary. When
136 not randomizing, initialize the sublists for the bottom-up merge sort. */
137
138 if (pcount)
139   *pcount = 0;
140 else if (randomize)
141   resetflags = time(NULL) & 0xFFFF;
142 else
143    for (i = 0; i < LOG2_MAXNODES; i++)
144      root[i] = NULL;
145
146 /* If processing the full queue, or just the top-level, start at the base
147 directory, and initialize the first subdirectory name (as none). Otherwise,
148 start at the sub-directory offset. */
149
150 if (subdiroffset <= 0)
151   {
152   i = 0;
153   subdirs[0] = 0;
154   *subcount = 0;
155   }
156 else
157   i = subdiroffset;
158
159 /* Set up prototype for the directory name. */
160
161 spool_pname_buf(buffer, sizeof(buffer));
162 buffer[sizeof(buffer) - 3] = 0;
163 subptr = Ustrlen(buffer);
164 buffer[subptr+2] = 0;               /* terminator for lengthened name */
165
166 /* This loop runs at least once, for the main or given directory, and then as
167 many times as necessary to scan any subdirectories encountered in the main
168 directory, if they are to be scanned at this time. */
169
170 for (; i <= *subcount; i++)
171   {
172   int count = 0;
173   int subdirchar = subdirs[i];      /* 0 for main directory */
174
175   if (subdirchar != 0)
176     {
177     buffer[subptr] = '/';
178     buffer[subptr+1] = subdirchar;
179     }
180
181   DEBUG(D_queue_run) debug_printf("looking in %s\n", buffer);
182   if (!(dd = opendir(CS buffer)))
183     continue;
184
185   /* Now scan the directory. */
186
187   while ((ent = readdir(dd)))
188     {
189     uschar *name = US ent->d_name;
190     int len = Ustrlen(name);
191
192     /* Count entries */
193
194     count++;
195
196     /* If we find a single alphameric sub-directory in the base directory,
197     add it to the list for subsequent scans. */
198
199     if (i == 0 && len == 1 && isalnum(*name))
200       {
201       *subcount = *subcount + 1;
202       subdirs[*subcount] = *name;
203       continue;
204       }
205
206     /* Otherwise, if it is a header spool file, add it to the list */
207
208     if (len == SPOOL_NAME_LENGTH &&
209         Ustrcmp(name + SPOOL_NAME_LENGTH - 2, "-H") == 0)
210       if (pcount)
211         (*pcount)++;
212       else
213         {
214         queue_filename *next =
215           store_get(sizeof(queue_filename) + Ustrlen(name), is_tainted(name));
216         Ustrcpy(next->text, name);
217         next->dir_uschar = subdirchar;
218
219         /* Handle the creation of a randomized list. The first item becomes both
220         the top and bottom of the list. Subsequent items are inserted either at
221         the top or the bottom, randomly. This is, I argue, faster than doing a
222         sort by allocating a random number to each item, and it also saves having
223         to store the number with each item. */
224
225         if (randomize)
226           if (!yield)
227             {
228             next->next = NULL;
229             yield = last = next;
230             }
231           else
232             {
233             if (flags == 0)
234               flags = resetflags;
235             if ((flags & 1) == 0)
236               {
237               next->next = yield;
238               yield = next;
239               }
240             else
241               {
242               next->next = NULL;
243               last->next = next;
244               last = next;
245               }
246             flags = flags >> 1;
247             }
248
249         /* Otherwise do a bottom-up merge sort based on the name. */
250
251         else
252           {
253           next->next = NULL;
254           for (int j = 0; j < LOG2_MAXNODES; j++)
255             if (root[j])
256               {
257               next = merge_queue_lists(next, root[j]);
258               root[j] = j == LOG2_MAXNODES - 1 ? next : NULL;
259               }
260             else
261               {
262               root[j] = next;
263               break;
264               }
265           }
266         }
267     }
268
269   /* Finished with this directory */
270
271   closedir(dd);
272
273   /* If we have just scanned a sub-directory, and it was empty (count == 2
274   implies just "." and ".." entries), and Exim is no longer configured to
275   use sub-directories, attempt to get rid of it. At the same time, try to
276   get rid of any corresponding msglog subdirectory. These are just cosmetic
277   tidying actions, so just ignore failures. If we are scanning just a single
278   sub-directory, break the loop. */
279
280   if (i != 0)
281     {
282     if (!split_spool_directory && count <= 2)
283       {
284       uschar subdir[2];
285
286       rmdir(CS buffer);
287       subdir[0] = subdirchar; subdir[1] = 0;
288       rmdir(CS spool_dname(US"msglog", subdir));
289       }
290     if (subdiroffset > 0) break;    /* Single sub-directory */
291     }
292
293   /* If we have just scanned the base directory, and subdiroffset is 0,
294   we do not want to continue scanning the sub-directories. */
295
296   else if (subdiroffset == 0)
297     break;
298   }    /* Loop for multiple subdirectories */
299
300 /* When using a bottom-up merge sort, do the final merging of the sublists.
301 Then pass back the final list of file items. */
302
303 if (!pcount && !randomize)
304   for (i = 0; i < LOG2_MAXNODES; ++i)
305     yield = merge_queue_lists(yield, root[i]);
306
307 return yield;
308 }
309
310
311
312
313 /*************************************************
314 *              Perform a queue run               *
315 *************************************************/
316
317 /* The arguments give the messages to start and stop at; NULL means start at
318 the beginning or stop at the end. If the given start message doesn't exist, we
319 start at the next lexically greater one, and likewise we stop at the after the
320 previous lexically lesser one if the given stop message doesn't exist. Because
321 a queue run can take some time, stat each file before forking, in case it has
322 been delivered in the meantime by some other means.
323
324 The global variables queue_run_force and queue_run_local may be set to cause
325 forced deliveries or local-only deliveries, respectively.
326
327 If deliver_selectstring[_sender] is not NULL, skip messages whose recipients do
328 not contain the string. As this option is typically used when a machine comes
329 back online, we want to ensure that at least one delivery attempt takes place,
330 so force the first one. The selecting string can optionally be a regex, or
331 refer to the sender instead of recipients.
332
333 If queue_2stage is set, the queue is scanned twice. The first time, queue_smtp
334 is set so that routing is done for all messages. Thus in the second run those
335 that are routed to the same host should go down the same SMTP connection.
336
337 Arguments:
338   start_id   message id to start at, or NULL for all
339   stop_id    message id to end at, or NULL for all
340   recurse    TRUE if recursing for 2-stage run
341
342 Returns:     nothing
343 */
344
345 void
346 queue_run(uschar *start_id, uschar *stop_id, BOOL recurse)
347 {
348 BOOL force_delivery = f.queue_run_force || deliver_selectstring != NULL ||
349   deliver_selectstring_sender != NULL;
350 const pcre *selectstring_regex = NULL;
351 const pcre *selectstring_regex_sender = NULL;
352 uschar *log_detail = NULL;
353 int subcount = 0;
354 uschar subdirs[64];
355 pid_t qpid[4] = {0};    /* Parallelism factor for q2stage 1st phase */
356
357 #ifdef MEASURE_TIMING
358 report_time_since(&timestamp_startup, US"queue_run start");
359 #endif
360
361 /* Cancel any specific queue domains. Turn off the flag that causes SMTP
362 deliveries not to happen, unless doing a 2-stage queue run, when the SMTP flag
363 gets set. Save the queue_runner's pid and the flag that indicates any
364 deliveries run directly from this process. Deliveries that are run by handing
365 on TCP/IP channels have queue_run_pid set, but not queue_running. */
366
367 queue_domains = NULL;
368 queue_smtp_domains = NULL;
369 f.queue_smtp = f.queue_2stage;
370
371 queue_run_pid = getpid();
372 f.queue_running = TRUE;
373
374 /* Log the true start of a queue run, and fancy options */
375
376 if (!recurse)
377   {
378   uschar extras[8];
379   uschar *p = extras;
380
381   if (f.queue_2stage) *p++ = 'q';
382   if (f.queue_run_first_delivery) *p++ = 'i';
383   if (f.queue_run_force) *p++ = 'f';
384   if (f.deliver_force_thaw) *p++ = 'f';
385   if (f.queue_run_local) *p++ = 'l';
386   *p = 0;
387
388   p = big_buffer;
389   p += sprintf(CS p, "pid=%d", (int)queue_run_pid);
390
391   if (extras[0] != 0)
392     p += sprintf(CS p, " -q%s", extras);
393
394   if (deliver_selectstring)
395     p += sprintf(CS p, " -R%s %s", f.deliver_selectstring_regex? "r" : "",
396       deliver_selectstring);
397
398   if (deliver_selectstring_sender)
399     p += sprintf(CS p, " -S%s %s", f.deliver_selectstring_sender_regex? "r" : "",
400       deliver_selectstring_sender);
401
402   log_detail = string_copy(big_buffer);
403   if (*queue_name)
404     log_write(L_queue_run, LOG_MAIN, "Start '%s' queue run: %s",
405       queue_name, log_detail);
406   else
407     log_write(L_queue_run, LOG_MAIN, "Start queue run: %s", log_detail);
408   }
409
410 /* If deliver_selectstring is a regex, compile it. */
411
412 if (deliver_selectstring && f.deliver_selectstring_regex)
413   selectstring_regex = regex_must_compile(deliver_selectstring, TRUE, FALSE);
414
415 if (deliver_selectstring_sender && f.deliver_selectstring_sender_regex)
416   selectstring_regex_sender =
417     regex_must_compile(deliver_selectstring_sender, TRUE, FALSE);
418
419 /* If the spool is split into subdirectories, we want to process it one
420 directory at a time, so as to spread out the directory scanning and the
421 delivering when there are lots of messages involved, except when
422 queue_run_in_order is set.
423
424 In the random order case, this loop runs once for the main directory (handling
425 any messages therein), and then repeats for any subdirectories that were found.
426 When the first argument of queue_get_spool_list() is 0, it scans the top
427 directory, fills in subdirs, and sets subcount. The order of the directories is
428 then randomized after the first time through, before they are scanned in
429 subsequent iterations.
430
431 When the first argument of queue_get_spool_list() is -1 (for queue_run_in_
432 order), it scans all directories and makes a single message list. */
433
434 for (int i = queue_run_in_order ? -1 : 0;
435      i <= (queue_run_in_order ? -1 : subcount);
436      i++)
437   {
438   rmark reset_point1 = store_mark();
439
440   DEBUG(D_queue_run)
441     {
442     if (i == 0)
443       debug_printf("queue running main directory\n");
444     else if (i == -1)
445       debug_printf("queue running combined directories\n");
446     else
447       debug_printf("queue running subdirectory '%c'\n", subdirs[i]);
448     }
449
450   for (queue_filename * fq = queue_get_spool_list(i, subdirs, &subcount,
451                                              !queue_run_in_order, NULL);
452        fq; fq = fq->next)
453     {
454     pid_t pid;
455     int status;
456     int pfd[2];
457     struct stat statbuf;
458     uschar buffer[256];
459
460     /* Unless deliveries are forced, if deliver_queue_load_max is non-negative,
461     check that the load average is low enough to permit deliveries. */
462
463     if (!f.queue_run_force && deliver_queue_load_max >= 0)
464       if ((load_average = os_getloadavg()) > deliver_queue_load_max)
465         {
466         log_write(L_queue_run, LOG_MAIN, "Abandon queue run: %s (load %.2f, max %.2f)",
467           log_detail,
468           (double)load_average/1000.0,
469           (double)deliver_queue_load_max/1000.0);
470         i = subcount;                 /* Don't process other directories */
471         break;
472         }
473       else
474         DEBUG(D_load) debug_printf("load average = %.2f max = %.2f\n",
475           (double)load_average/1000.0,
476           (double)deliver_queue_load_max/1000.0);
477
478     /* If initial of a 2-phase run, maintain a set of child procs
479     to get disk parallelism */
480
481     if (f.queue_2stage && !queue_run_in_order)
482       {
483       int i;
484       if (qpid[f.running_in_test_harness ? 0 : nelem(qpid) - 1])
485         {
486         DEBUG(D_queue_run) debug_printf("q2stage waiting for child %d\n", (int)qpid[0]);
487         waitpid(qpid[0], NULL, 0);
488         DEBUG(D_queue_run) debug_printf("q2stage reaped child %d\n", (int)qpid[0]);
489         if (f.running_in_test_harness) i = 0;
490         else for (i = 0; i < nelem(qpid) - 1; i++) qpid[i] = qpid[i+1];
491         qpid[i] = 0;
492         }
493       else
494         for (i = 0; qpid[i]; ) i++;
495       DEBUG(D_queue_run) debug_printf("q2stage forking\n");
496       if ((qpid[i] = fork()))
497         continue;       /* parent loops around */
498       DEBUG(D_queue_run) debug_printf("q2stage child\n");
499       }
500
501     /* Skip this message unless it's within the ID limits */
502
503     if (stop_id && Ustrncmp(fq->text, stop_id, MESSAGE_ID_LENGTH) > 0)
504       goto go_around;
505     if (start_id && Ustrncmp(fq->text, start_id, MESSAGE_ID_LENGTH) < 0)
506       goto go_around;
507
508     /* Check that the message still exists */
509
510     message_subdir[0] = fq->dir_uschar;
511     if (Ustat(spool_fname(US"input", message_subdir, fq->text, US""), &statbuf) < 0)
512       goto go_around;
513
514     /* There are some tests that require the reading of the header file. Ensure
515     the store used is scavenged afterwards so that this process doesn't keep
516     growing its store. We have to read the header file again when actually
517     delivering, but it's cheaper than forking a delivery process for each
518     message when many are not going to be delivered. */
519
520     if (deliver_selectstring || deliver_selectstring_sender ||
521         f.queue_run_first_delivery)
522       {
523       BOOL wanted = TRUE;
524       BOOL orig_dont_deliver = f.dont_deliver;
525       rmark reset_point2 = store_mark();
526
527       /* Restore the original setting of dont_deliver after reading the header,
528       so that a setting for a particular message doesn't force it for any that
529       follow. If the message is chosen for delivery, the header is read again
530       in the deliver_message() function, in a subprocess. */
531
532       if (spool_read_header(fq->text, FALSE, TRUE) != spool_read_OK) goto go_around;
533       f.dont_deliver = orig_dont_deliver;
534
535       /* Now decide if we want to deliver this message. As we have read the
536       header file, we might as well do the freeze test now, and save forking
537       another process. */
538
539       if (f.deliver_freeze && !f.deliver_force_thaw)
540         {
541         log_write(L_skip_delivery, LOG_MAIN, "Message is frozen");
542         wanted = FALSE;
543         }
544
545       /* Check first_delivery in the case when there are no message logs. */
546
547       else if (f.queue_run_first_delivery && !f.deliver_firsttime)
548         {
549         DEBUG(D_queue_run) debug_printf("%s: not first delivery\n", fq->text);
550         wanted = FALSE;
551         }
552
553       /* Check for a matching address if deliver_selectstring[_sender] is set.
554       If so, we do a fully delivery - don't want to omit other addresses since
555       their routing might trigger re-writing etc. */
556
557       /* Sender matching */
558
559       else if (  deliver_selectstring_sender
560               && !(f.deliver_selectstring_sender_regex
561                   ? (pcre_exec(selectstring_regex_sender, NULL,
562                       CS sender_address, Ustrlen(sender_address), 0, PCRE_EOPT,
563                       NULL, 0) >= 0)
564                   : (strstric(sender_address, deliver_selectstring_sender, FALSE)
565                       != NULL)
566               )   )
567         {
568         DEBUG(D_queue_run) debug_printf("%s: sender address did not match %s\n",
569           fq->text, deliver_selectstring_sender);
570         wanted = FALSE;
571         }
572
573       /* Recipient matching */
574
575       else if (deliver_selectstring)
576         {
577         int i;
578         for (i = 0; i < recipients_count; i++)
579           {
580           uschar *address = recipients_list[i].address;
581           if (  (f.deliver_selectstring_regex
582                 ? (pcre_exec(selectstring_regex, NULL, CS address,
583                      Ustrlen(address), 0, PCRE_EOPT, NULL, 0) >= 0)
584                 : (strstric(address, deliver_selectstring, FALSE) != NULL)
585                 )
586              && tree_search(tree_nonrecipients, address) == NULL
587              )
588             break;
589           }
590
591         if (i >= recipients_count)
592           {
593           DEBUG(D_queue_run)
594             debug_printf("%s: no recipient address matched %s\n",
595               fq->text, deliver_selectstring);
596           wanted = FALSE;
597           }
598         }
599
600       /* Recover store used when reading the header */
601
602       spool_clear_header_globals();
603       store_reset(reset_point2);
604       if (!wanted) goto go_around;      /* With next message */
605       }
606
607     /* OK, got a message we want to deliver. Create a pipe which will
608     serve as a means of detecting when all the processes created by the
609     delivery process are finished. This is relevant when the delivery
610     process passes one or more SMTP channels on to its own children. The
611     pipe gets passed down; by reading on it here we detect when the last
612     descendent dies by the unblocking of the read. It's a pity that for
613     most of the time the pipe isn't used, but creating a pipe should be
614     pretty cheap. */
615
616     if (pipe(pfd) < 0)
617       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to create pipe in queue "
618         "runner process %d: %s", queue_run_pid, strerror(errno));
619     queue_run_pipe = pfd[pipe_write];  /* To ensure it gets passed on. */
620
621     /* Make sure it isn't stdin. This seems unlikely, but just to be on the
622     safe side... */
623
624     if (queue_run_pipe == 0)
625       {
626       queue_run_pipe = dup(queue_run_pipe);
627       (void)close(0);
628       }
629
630     /* Before forking to deliver the message, ensure any open and cached
631     lookup files or databases are closed. Otherwise, closing in the subprocess
632     can make the next subprocess have problems. There won't often be anything
633     open here, but it is possible (e.g. if spool_directory is an expanded
634     string). A single call before this loop would probably suffice, but just in
635     case expansions get inserted at some point, I've taken the heavy-handed
636     approach. When nothing is open, the call should be cheap. */
637
638     search_tidyup();
639
640     /* Now deliver the message; get the id by cutting the -H off the file
641     name. The return of the process is zero if a delivery was attempted. */
642
643     set_process_info("running queue: %s", fq->text);
644     fq->text[SPOOL_NAME_LENGTH-2] = 0;
645 #ifdef MEASURE_TIMING
646     report_time_since(&timestamp_startup, US"queue msg selected");
647 #endif
648
649     if ((pid = fork()) == 0)
650       {
651       int rc;
652       testharness_pause_ms(100);
653       (void)close(pfd[pipe_read]);
654       rc = deliver_message(fq->text, force_delivery, FALSE);
655       exim_underbar_exit(rc == DELIVER_NOT_ATTEMPTED, US"qrun-delivery");
656       }
657     if (pid < 0)
658       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "fork of delivery process from "
659         "queue runner %d failed\n", queue_run_pid);
660
661     /* Close the writing end of the synchronizing pipe in this process,
662     then wait for the first level process to terminate. */
663
664     (void)close(pfd[pipe_write]);
665     set_process_info("running queue: waiting for %s (%d)", fq->text, pid);
666     while (wait(&status) != pid);
667
668     /* A zero return means a delivery was attempted; turn off the force flag
669     for any subsequent calls unless queue_force is set. */
670
671     if (!(status & 0xffff)) force_delivery = f.queue_run_force;
672
673     /* If the process crashed, tell somebody */
674
675     else if (status & 0x00ff)
676       log_write(0, LOG_MAIN|LOG_PANIC,
677         "queue run: process %d crashed with signal %d while delivering %s",
678         (int)pid, status & 0x00ff, fq->text);
679
680     /* Before continuing, wait till the pipe gets closed at the far end. This
681     tells us that any children created by the delivery to re-use any SMTP
682     channels have all finished. Since no process actually writes to the pipe,
683     the mere fact that read() unblocks is enough. */
684
685     set_process_info("running queue: waiting for children of %d", pid);
686     if ((status = read(pfd[pipe_read], buffer, sizeof(buffer))) != 0)
687       log_write(0, LOG_MAIN|LOG_PANIC, status > 0 ?
688         "queue run: unexpected data on pipe" : "queue run: error on pipe: %s",
689         strerror(errno));
690     (void)close(pfd[pipe_read]);
691     set_process_info("running queue");
692
693     /* If initial of a 2-phase run, we are a child - so just exit */
694     if (f.queue_2stage && !queue_run_in_order)
695       exim_exit(EXIT_SUCCESS, US"2-phase child");
696
697     /* If we are in the test harness, and this is not the first of a 2-stage
698     queue run, update fudged queue times. */
699
700     if (f.running_in_test_harness && !f.queue_2stage)
701       {
702       uschar * fqtnext = Ustrchr(fudged_queue_times, '/');
703       if (fqtnext) fudged_queue_times = fqtnext + 1;
704       }
705
706
707     continue;
708
709   go_around:
710     /* If initial of a 2-phase run, we are a child - so just exit */
711     if (f.queue_2stage && !queue_run_in_order)
712       exim_exit(EXIT_SUCCESS, US"2-phase child");
713     }                                  /* End loop for list of messages */
714
715   tree_nonrecipients = NULL;
716   store_reset(reset_point1);           /* Scavenge list of messages */
717
718   /* If this was the first time through for random order processing, and
719   sub-directories have been found, randomize their order if necessary. */
720
721   if (i == 0 && subcount > 1 && !queue_run_in_order)
722     for (int j = 1; j <= subcount; j++)
723       {
724       int r;
725       if ((r = random_number(100)) >= 50)
726         {
727         int k = (r % subcount) + 1;
728         int x = subdirs[j];
729         subdirs[j] = subdirs[k];
730         subdirs[k] = x;
731         }
732       }
733   }                                    /* End loop for multiple directories */
734
735 /* If queue_2stage is true, we do it all again, with the 2stage flag
736 turned off. */
737
738 if (f.queue_2stage)
739   {
740
741   /* wait for last children */
742   for (int i = 0; i < nelem(qpid); i++)
743     if (qpid[i])
744       {
745       DEBUG(D_queue_run) debug_printf("q2stage reaped child %d\n", (int)qpid[i]);
746       waitpid(qpid[i], NULL, 0);
747       }
748     else break;
749
750 #ifdef MEASURE_TIMING
751   report_time_since(&timestamp_startup, US"queue_run 1st phase done");
752 #endif
753   f.queue_2stage = FALSE;
754   queue_run(start_id, stop_id, TRUE);
755   }
756
757 /* At top level, log the end of the run. */
758
759 if (!recurse)
760   if (*queue_name)
761     log_write(L_queue_run, LOG_MAIN, "End '%s' queue run: %s",
762       queue_name, log_detail);
763   else
764     log_write(L_queue_run, LOG_MAIN, "End queue run: %s", log_detail);
765 }
766
767
768
769
770 /************************************************
771 *         Count messages on the queue           *
772 ************************************************/
773
774 /* Called as a result of -bpc
775
776 Arguments:  none
777 Returns:    count
778 */
779
780 unsigned
781 queue_count(void)
782 {
783 int subcount;
784 unsigned count = 0;
785 uschar subdirs[64];
786
787 (void) queue_get_spool_list(-1,         /* entire queue */
788                         subdirs,        /* for holding sub list */
789                         &subcount,      /* for subcount */
790                         FALSE,          /* not random */
791                         &count);        /* just get the count */
792 return count;
793 }
794
795
796 #define QUEUE_SIZE_AGE 60       /* update rate for queue_size */
797
798 unsigned
799 queue_count_cached(void)
800 {
801 time_t now;
802 if ((now = time(NULL)) >= queue_size_next)
803   {
804   queue_size = queue_count();
805   queue_size_next = now + (f.running_in_test_harness ? 3 : QUEUE_SIZE_AGE);
806   }
807 return queue_size;
808 }
809
810 /************************************************
811 *          List extra deliveries                *
812 ************************************************/
813
814 /* This is called from queue_list below to print out all addresses that
815 have received a message but which were not primary addresses. That is, all
816 the addresses in the tree of non-recipients that are not primary addresses.
817 The tree has been scanned and the data field filled in for those that are
818 primary addresses.
819
820 Argument:    points to the tree node
821 Returns:     nothing
822 */
823
824 static void
825 queue_list_extras(tree_node *p)
826 {
827 if (p->left) queue_list_extras(p->left);
828 if (!p->data.val) printf("       +D %s\n", p->name);
829 if (p->right) queue_list_extras(p->right);
830 }
831
832
833
834 /************************************************
835 *          List messages on the queue           *
836 ************************************************/
837
838 /* Or a given list of messages. In the "all" case, we get a list of file names
839 as quickly as possible, then scan each one for information to output. If any
840 disappear while we are processing, just leave them out, but give an error if an
841 explicit list was given. This function is a top-level function that is obeyed
842 as a result of the -bp argument. As there may be a lot of messages on the
843 queue, we must tidy up the store after reading the headers for each one.
844
845 Arguments:
846    option     0 => list top-level recipients, with "D" for those delivered
847               1 => list only undelivered top-level recipients
848               2 => as 0, plus any generated delivered recipients
849               If 8 is added to any of these values, the queue is listed in
850                 random order.
851    list       => first of any message ids to list
852    count      count of message ids; 0 => all
853
854 Returns:      nothing
855 */
856
857 void
858 queue_list(int option, uschar **list, int count)
859 {
860 int subcount;
861 int now = (int)time(NULL);
862 rmark reset_point;
863 queue_filename * qf = NULL;
864 uschar subdirs[64];
865
866 /* If given a list of messages, build a chain containing their ids. */
867
868 if (count > 0)
869   {
870   queue_filename *last = NULL;
871   for (int i = 0; i < count; i++)
872     {
873     queue_filename *next =
874       store_get(sizeof(queue_filename) + Ustrlen(list[i]) + 2, is_tainted(list[i]));
875     sprintf(CS next->text, "%s-H", list[i]);
876     next->dir_uschar = '*';
877     next->next = NULL;
878     if (i == 0) qf = next; else last->next = next;
879     last = next;
880     }
881   }
882
883 /* Otherwise get a list of the entire queue, in order if necessary. */
884
885 else
886   qf = queue_get_spool_list(
887           -1,             /* entire queue */
888           subdirs,        /* for holding sub list */
889           &subcount,      /* for subcount */
890           option >= 8,    /* randomize if required */
891           NULL);          /* don't just count */
892
893 if (option >= 8) option -= 8;
894
895 /* Now scan the chain and print information, resetting store used
896 each time. */
897
898 for (;
899     qf && (reset_point = store_mark());
900     spool_clear_header_globals(), store_reset(reset_point), qf = qf->next
901     )
902   {
903   int rc, save_errno;
904   int size = 0;
905   BOOL env_read;
906
907   message_size = 0;
908   message_subdir[0] = qf->dir_uschar;
909   rc = spool_read_header(qf->text, FALSE, count <= 0);
910   if (rc == spool_read_notopen && errno == ENOENT && count <= 0)
911     continue;
912   save_errno = errno;
913
914   env_read = (rc == spool_read_OK || rc == spool_read_hdrerror);
915
916   if (env_read)
917     {
918     int i, ptr;
919     FILE *jread;
920     struct stat statbuf;
921     uschar * fname = spool_fname(US"input", message_subdir, qf->text, US"");
922
923     ptr = Ustrlen(fname)-1;
924     fname[ptr] = 'D';
925
926     /* Add the data size to the header size; don't count the file name
927     at the start of the data file, but add one for the notional blank line
928     that precedes the data. */
929
930     if (Ustat(fname, &statbuf) == 0)
931       size = message_size + statbuf.st_size - SPOOL_DATA_START_OFFSET + 1;
932     i = (now - received_time.tv_sec)/60;  /* minutes on queue */
933     if (i > 90)
934       {
935       i = (i + 30)/60;
936       if (i > 72) printf("%2dd ", (i + 12)/24); else printf("%2dh ", i);
937       }
938     else printf("%2dm ", i);
939
940     /* Collect delivered addresses from any J file */
941
942     fname[ptr] = 'J';
943     if ((jread = Ufopen(fname, "rb")))
944       {
945       while (Ufgets(big_buffer, big_buffer_size, jread) != NULL)
946         {
947         int n = Ustrlen(big_buffer);
948         big_buffer[n-1] = 0;
949         tree_add_nonrecipient(big_buffer);
950         }
951       (void)fclose(jread);
952       }
953     }
954
955   fprintf(stdout, "%s ", string_format_size(size, big_buffer));
956   for (int i = 0; i < 16; i++) fputc(qf->text[i], stdout);
957
958   if (env_read && sender_address)
959     {
960     printf(" <%s>", sender_address);
961     if (f.sender_set_untrusted) printf(" (%s)", originator_login);
962     }
963
964   if (rc != spool_read_OK)
965     {
966     printf("\n    ");
967     if (save_errno == ERRNO_SPOOLFORMAT)
968       {
969       struct stat statbuf;
970       uschar * fname = spool_fname(US"input", message_subdir, qf->text, US"");
971
972       if (Ustat(fname, &statbuf) == 0)
973         printf("*** spool format error: size=" OFF_T_FMT " ***",
974           statbuf.st_size);
975       else printf("*** spool format error ***");
976       }
977     else printf("*** spool read error: %s ***", strerror(save_errno));
978     if (rc != spool_read_hdrerror)
979       {
980       printf("\n\n");
981       continue;
982       }
983     }
984
985   if (f.deliver_freeze) printf(" *** frozen ***");
986
987   printf("\n");
988
989   if (recipients_list)
990     {
991     for (int i = 0; i < recipients_count; i++)
992       {
993       tree_node *delivered =
994         tree_search(tree_nonrecipients, recipients_list[i].address);
995       if (!delivered || option != 1)
996         printf("        %s %s\n",
997           delivered ? "D" : " ", recipients_list[i].address);
998       if (delivered) delivered->data.val = TRUE;
999       }
1000     if (option == 2 && tree_nonrecipients)
1001       queue_list_extras(tree_nonrecipients);
1002     printf("\n");
1003     }
1004   }
1005 }
1006
1007
1008
1009 /*************************************************
1010 *             Act on a specific message          *
1011 *************************************************/
1012
1013 /* Actions that require a list of addresses make use of argv/argc/
1014 recipients_arg. Other actions do not. This function does its own
1015 authority checking.
1016
1017 Arguments:
1018   id              id of the message to work on
1019   action          which action is required (MSG_xxx)
1020   argv            the original argv for Exim
1021   argc            the original argc for Exim
1022   recipients_arg  offset to the list of recipients in argv
1023
1024 Returns:          FALSE if there was any problem
1025 */
1026
1027 BOOL
1028 queue_action(uschar *id, int action, uschar **argv, int argc, int recipients_arg)
1029 {
1030 BOOL yield = TRUE;
1031 BOOL removed = FALSE;
1032 struct passwd *pw;
1033 uschar *doing = NULL;
1034 uschar *username;
1035 uschar *errmsg;
1036 uschar spoolname[32];
1037
1038 /* Set the global message_id variable, used when re-writing spool files. This
1039 also causes message ids to be added to log messages. */
1040
1041 Ustrcpy(message_id, id);
1042
1043 /* The "actions" that just list the files do not require any locking to be
1044 done. Only admin users may read the spool files. */
1045
1046 if (action >= MSG_SHOW_BODY)
1047   {
1048   int fd, rc;
1049   uschar *subdirectory, *suffix;
1050
1051   if (!f.admin_user)
1052     {
1053     printf("Permission denied\n");
1054     return FALSE;
1055     }
1056
1057   if (recipients_arg < argc)
1058     {
1059     printf("*** Only one message can be listed at once\n");
1060     return FALSE;
1061     }
1062
1063   if (action == MSG_SHOW_BODY)
1064     {
1065     subdirectory = US"input";
1066     suffix = US"-D";
1067     }
1068   else if (action == MSG_SHOW_HEADER)
1069     {
1070     subdirectory = US"input";
1071     suffix = US"-H";
1072     }
1073   else
1074     {
1075     subdirectory = US"msglog";
1076     suffix = US"";
1077     }
1078
1079   for (int i = 0; i < 2; i++)
1080     {
1081     set_subdir_str(message_subdir, id, i);
1082     if ((fd = Uopen(spool_fname(subdirectory, message_subdir, id, suffix),
1083                     O_RDONLY, 0)) >= 0)
1084       break;
1085     if (i == 0)
1086       continue;
1087
1088     printf("Failed to open %s file for %s%s: %s\n", subdirectory, id, suffix,
1089       strerror(errno));
1090     if (action == MSG_SHOW_LOG && !message_logs)
1091       printf("(No message logs are being created because the message_logs "
1092         "option is false.)\n");
1093     return FALSE;
1094     }
1095
1096   while((rc = read(fd, big_buffer, big_buffer_size)) > 0)
1097     rc = write(fileno(stdout), big_buffer, rc);
1098
1099   (void)close(fd);
1100   return TRUE;
1101   }
1102
1103 /* For actions that actually act, open and lock the data file to ensure that no
1104 other process is working on this message. If the file does not exist, continue
1105 only if the action is remove and the user is an admin user, to allow for
1106 tidying up broken states. */
1107
1108 if ((deliver_datafile = spool_open_datafile(id)) < 0)
1109   if (errno == ENOENT)
1110     {
1111     yield = FALSE;
1112     printf("Spool data file for %s does not exist\n", id);
1113     if (action != MSG_REMOVE || !f.admin_user) return FALSE;
1114     printf("Continuing, to ensure all files removed\n");
1115     }
1116   else
1117     {
1118     if (errno == 0) printf("Message %s is locked\n", id);
1119       else printf("Couldn't open spool file for %s: %s\n", id,
1120         strerror(errno));
1121     return FALSE;
1122     }
1123
1124 /* Read the spool header file for the message. Again, continue after an
1125 error only in the case of deleting by an administrator. Setting the third
1126 argument false causes it to look both in the main spool directory and in
1127 the appropriate subdirectory, and set message_subdir according to where it
1128 found the message. */
1129
1130 sprintf(CS spoolname, "%s-H", id);
1131 if (spool_read_header(spoolname, TRUE, FALSE) != spool_read_OK)
1132   {
1133   yield = FALSE;
1134   if (errno != ERRNO_SPOOLFORMAT)
1135     printf("Spool read error for %s: %s\n", spoolname, strerror(errno));
1136   else
1137     printf("Spool format error for %s\n", spoolname);
1138   if (action != MSG_REMOVE || !f.admin_user)
1139     {
1140     (void)close(deliver_datafile);
1141     deliver_datafile = -1;
1142     return FALSE;
1143     }
1144   printf("Continuing to ensure all files removed\n");
1145   }
1146
1147 /* Check that the user running this process is entitled to operate on this
1148 message. Only admin users may freeze/thaw, add/cancel recipients, or otherwise
1149 mess about, but the original sender is permitted to remove a message. That's
1150 why we leave this check until after the headers are read. */
1151
1152 if (!f.admin_user && (action != MSG_REMOVE || real_uid != originator_uid))
1153   {
1154   printf("Permission denied\n");
1155   (void)close(deliver_datafile);
1156   deliver_datafile = -1;
1157   return FALSE;
1158   }
1159
1160 /* Set up the user name for logging. */
1161
1162 pw = getpwuid(real_uid);
1163 username = (pw != NULL)?
1164   US pw->pw_name : string_sprintf("uid %ld", (long int)real_uid);
1165
1166 /* Take the necessary action. */
1167
1168 if (action != MSG_SHOW_COPY) printf("Message %s ", id);
1169
1170 switch(action)
1171   {
1172   case MSG_SHOW_COPY:
1173     {
1174     transport_ctx tctx = {{0}};
1175     deliver_in_buffer = store_malloc(DELIVER_IN_BUFFER_SIZE);
1176     deliver_out_buffer = store_malloc(DELIVER_OUT_BUFFER_SIZE);
1177     tctx.u.fd = 1;
1178     (void) transport_write_message(&tctx, 0);
1179     break;
1180     }
1181
1182
1183   case MSG_FREEZE:
1184   if (f.deliver_freeze)
1185     {
1186     yield = FALSE;
1187     printf("is already frozen\n");
1188     }
1189   else
1190     {
1191     f.deliver_freeze = TRUE;
1192     f.deliver_manual_thaw = FALSE;
1193     deliver_frozen_at = time(NULL);
1194     if (spool_write_header(id, SW_MODIFYING, &errmsg) >= 0)
1195       {
1196       printf("is now frozen\n");
1197       log_write(0, LOG_MAIN, "frozen by %s", username);
1198       }
1199     else
1200       {
1201       yield = FALSE;
1202       printf("could not be frozen: %s\n", errmsg);
1203       }
1204     }
1205   break;
1206
1207
1208   case MSG_THAW:
1209   if (!f.deliver_freeze)
1210     {
1211     yield = FALSE;
1212     printf("is not frozen\n");
1213     }
1214   else
1215     {
1216     f.deliver_freeze = FALSE;
1217     f.deliver_manual_thaw = TRUE;
1218     if (spool_write_header(id, SW_MODIFYING, &errmsg) >= 0)
1219       {
1220       printf("is no longer frozen\n");
1221       log_write(0, LOG_MAIN, "unfrozen by %s", username);
1222       }
1223     else
1224       {
1225       yield = FALSE;
1226       printf("could not be unfrozen: %s\n", errmsg);
1227       }
1228     }
1229   break;
1230
1231
1232   /* We must ensure all files are removed from both the input directory
1233   and the appropriate subdirectory, to clean up cases when there are odd
1234   files left lying around in odd places. In the normal case message_subdir
1235   will have been set correctly by spool_read_header, but as this is a rare
1236   operation, just run everything twice. */
1237
1238   case MSG_REMOVE:
1239     {
1240     uschar suffix[3];
1241
1242     suffix[0] = '-';
1243     suffix[2] = 0;
1244     message_subdir[0] = id[5];
1245
1246     for (int j = 0; j < 2; message_subdir[0] = 0, j++)
1247       {
1248       uschar * fname = spool_fname(US"msglog", message_subdir, id, US"");
1249
1250       DEBUG(D_any) debug_printf(" removing %s", fname);
1251       if (Uunlink(fname) < 0)
1252         {
1253         if (errno != ENOENT)
1254           {
1255           yield = FALSE;
1256           printf("Error while removing %s: %s\n", fname, strerror(errno));
1257           }
1258         else DEBUG(D_any) debug_printf(" (no file)\n");
1259         }
1260       else
1261         {
1262         removed = TRUE;
1263         DEBUG(D_any) debug_printf(" (ok)\n");
1264         }
1265
1266       for (int i = 0; i < 3; i++)
1267         {
1268         uschar * fname;
1269
1270         suffix[1] = (US"DHJ")[i];
1271         fname = spool_fname(US"input", message_subdir, id, suffix);
1272
1273         DEBUG(D_any) debug_printf(" removing %s", fname);
1274         if (Uunlink(fname) < 0)
1275           {
1276           if (errno != ENOENT)
1277             {
1278             yield = FALSE;
1279             printf("Error while removing %s: %s\n", fname, strerror(errno));
1280             }
1281           else DEBUG(D_any) debug_printf(" (no file)\n");
1282           }
1283         else
1284           {
1285           removed = TRUE;
1286           DEBUG(D_any) debug_printf(" (done)\n");
1287           }
1288         }
1289       }
1290
1291     /* In the common case, the datafile is open (and locked), so give the
1292     obvious message. Otherwise be more specific. */
1293
1294     if (deliver_datafile >= 0) printf("has been removed\n");
1295       else printf("has been removed or did not exist\n");
1296     if (removed)
1297       {
1298 #ifndef DISABLE_EVENT
1299       if (event_action) for (int i = 0; i < recipients_count; i++)
1300         {
1301         tree_node *delivered =
1302           tree_search(tree_nonrecipients, recipients_list[i].address);
1303         if (!delivered)
1304           {
1305           uschar * save_local = deliver_localpart;
1306           const uschar * save_domain = deliver_domain;
1307           uschar * addr = recipients_list[i].address, * errmsg = NULL;
1308           int start, end, dom;
1309
1310           if (!parse_extract_address(addr, &errmsg, &start, &end, &dom, TRUE))
1311             log_write(0, LOG_MAIN|LOG_PANIC,
1312               "failed to parse address '%.100s'\n: %s", addr, errmsg);
1313           else
1314             {
1315             deliver_localpart =
1316               string_copyn(addr+start, dom ? (dom-1) - start : end - start);
1317             deliver_domain = dom
1318               ? CUS string_copyn(addr+dom, end - dom) : CUS"";
1319
1320             event_raise(event_action, US"msg:fail:internal",
1321               string_sprintf("message removed by %s", username));
1322
1323             deliver_localpart = save_local;
1324             deliver_domain = save_domain;
1325             }
1326           }
1327         }
1328       (void) event_raise(event_action, US"msg:complete", NULL);
1329 #endif
1330       log_write(0, LOG_MAIN, "removed by %s", username);
1331       log_write(0, LOG_MAIN, "Completed");
1332       }
1333     break;
1334     }
1335
1336
1337   case MSG_SETQUEUE:
1338     /* The global "queue_name_dest" is used as destination, "queue_name"
1339     as source */
1340
1341     spool_move_message(id, message_subdir, US"", US"");
1342     break;
1343
1344
1345   case MSG_MARK_ALL_DELIVERED:
1346   for (int i = 0; i < recipients_count; i++)
1347     tree_add_nonrecipient(recipients_list[i].address);
1348
1349   if (spool_write_header(id, SW_MODIFYING, &errmsg) >= 0)
1350     {
1351     printf("has been modified\n");
1352     for (int i = 0; i < recipients_count; i++)
1353       log_write(0, LOG_MAIN, "address <%s> marked delivered by %s",
1354         recipients_list[i].address, username);
1355     }
1356   else
1357     {
1358     yield = FALSE;
1359     printf("- could not mark all delivered: %s\n", errmsg);
1360     }
1361   break;
1362
1363
1364   case MSG_EDIT_SENDER:
1365   if (recipients_arg < argc - 1)
1366     {
1367     yield = FALSE;
1368     printf("- only one sender address can be specified\n");
1369     break;
1370     }
1371   doing = US"editing sender";
1372   /* Fall through */
1373
1374   case MSG_ADD_RECIPIENT:
1375   if (doing == NULL) doing = US"adding recipient";
1376   /* Fall through */
1377
1378   case MSG_MARK_DELIVERED:
1379   if (doing == NULL) doing = US"marking as delivered";
1380
1381   /* Common code for EDIT_SENDER, ADD_RECIPIENT, & MARK_DELIVERED */
1382
1383   if (recipients_arg >= argc)
1384     {
1385     yield = FALSE;
1386     printf("- error while %s: no address given\n", doing);
1387     break;
1388     }
1389
1390   for (; recipients_arg < argc; recipients_arg++)
1391     {
1392     int start, end, domain;
1393     uschar *errmess;
1394     uschar *recipient =
1395       parse_extract_address(argv[recipients_arg], &errmess, &start, &end,
1396         &domain, (action == MSG_EDIT_SENDER));
1397
1398     if (recipient == NULL)
1399       {
1400       yield = FALSE;
1401       printf("- error while %s:\n  bad address %s: %s\n",
1402         doing, argv[recipients_arg], errmess);
1403       }
1404     else if (recipient[0] != 0 && domain == 0)
1405       {
1406       yield = FALSE;
1407       printf("- error while %s:\n  bad address %s: "
1408         "domain missing\n", doing, argv[recipients_arg]);
1409       }
1410     else
1411       {
1412       if (action == MSG_ADD_RECIPIENT)
1413         {
1414 #ifdef SUPPORT_I18N
1415         if (string_is_utf8(recipient)) allow_utf8_domains = message_smtputf8 = TRUE;
1416 #endif
1417         receive_add_recipient(recipient, -1);
1418         log_write(0, LOG_MAIN, "recipient <%s> added by %s",
1419           recipient, username);
1420         }
1421       else if (action == MSG_MARK_DELIVERED)
1422         {
1423         int i;
1424         for (i = 0; i < recipients_count; i++)
1425           if (Ustrcmp(recipients_list[i].address, recipient) == 0) break;
1426         if (i >= recipients_count)
1427           {
1428           printf("- error while %s:\n  %s is not a recipient:"
1429             " message not updated\n", doing, recipient);
1430           yield = FALSE;
1431           }
1432         else
1433           {
1434           tree_add_nonrecipient(recipients_list[i].address);
1435           log_write(0, LOG_MAIN, "address <%s> marked delivered by %s",
1436             recipient, username);
1437           }
1438         }
1439       else  /* MSG_EDIT_SENDER */
1440         {
1441 #ifdef SUPPORT_I18N
1442         if (string_is_utf8(recipient)) allow_utf8_domains = message_smtputf8 = TRUE;
1443 #endif
1444         sender_address = recipient;
1445         log_write(0, LOG_MAIN, "sender address changed to <%s> by %s",
1446           recipient, username);
1447         }
1448       }
1449     }
1450
1451   if (yield)
1452     if (spool_write_header(id, SW_MODIFYING, &errmsg) >= 0)
1453       printf("has been modified\n");
1454     else
1455       {
1456       yield = FALSE;
1457       printf("- while %s: %s\n", doing, errmsg);
1458       }
1459
1460   break;
1461   }
1462
1463 /* Closing the datafile releases the lock and permits other processes
1464 to operate on the message (if it still exists). */
1465
1466 if (deliver_datafile >= 0)
1467   {
1468   (void)close(deliver_datafile);
1469   deliver_datafile = -1;
1470   }
1471 return yield;
1472 }
1473
1474
1475
1476 /*************************************************
1477 *       Check the queue_only_file condition      *
1478 *************************************************/
1479
1480 /* The queue_only_file option forces certain kinds of queueing if a given file
1481 exists.
1482
1483 Arguments:  none
1484 Returns:    nothing
1485 */
1486
1487 void
1488 queue_check_only(void)
1489 {
1490 int sep = 0;
1491 struct stat statbuf;
1492 const uschar * s = queue_only_file;
1493 uschar * ss;
1494
1495 if (s)
1496   while ((ss = string_nextinlist(&s, &sep, NULL, 0)))
1497     if (Ustrncmp(ss, "smtp", 4) == 0)
1498       {
1499       ss += 4;
1500       if (Ustat(ss, &statbuf) == 0)
1501         {
1502         f.queue_smtp = TRUE;
1503         DEBUG(D_receive) debug_printf("queue_smtp set because %s exists\n", ss);
1504         }
1505       }
1506     else
1507       if (Ustat(ss, &statbuf) == 0)
1508         {
1509         queue_only = TRUE;
1510         DEBUG(D_receive) debug_printf("queue_only set because %s exists\n", ss);
1511         }
1512 }
1513
1514
1515
1516 /******************************************************************************/
1517 /******************************************************************************/
1518
1519 #ifdef EXPERIMENTAL_QUEUE_RAMP
1520 void
1521 queue_notify_daemon(const uschar * msgid)
1522 {
1523 uschar buf[MESSAGE_ID_LENGTH + 2];
1524 int fd;
1525
1526 DEBUG(D_queue_run) debug_printf("%s: %s\n", __FUNCTION__, msgid);
1527
1528 buf[0] = NOTIFY_MSG_QRUN;
1529 memcpy(buf+1, msgid, MESSAGE_ID_LENGTH+1);
1530
1531 if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) >= 0)
1532   {
1533   struct sockaddr_un sa_un = {.sun_family = AF_UNIX};
1534   int slen;
1535
1536 #ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
1537   int len = offsetof(struct sockaddr_un, sun_path) + 1
1538     + snprintf(sa_un.sun_path+1, sizeof(sa_un.sun_path)-1, "%s",
1539                 expand_string(notifier_socket));
1540   sa_un.sun_path[0] = 0;
1541 #else
1542   int len = offsetof(struct sockaddr_un, sun_path)
1543     + snprintf(sa_un.sun_path, sizeof(sa_un.sun_path), "%s",
1544                 expand_string(notifier_socket));
1545 #endif
1546
1547   if (sendto(fd, buf, sizeof(buf), 0, (struct sockaddr *)&sa_un, len) < 0)
1548     DEBUG(D_queue_run)
1549       debug_printf("%s: sendto %s\n", __FUNCTION__, strerror(errno));
1550   close(fd);
1551   }
1552 else DEBUG(D_queue_run) debug_printf(" socket: %s\n", strerror(errno));
1553 }
1554 #endif
1555
1556 #endif /*!COMPILE_UTILITY*/
1557
1558 /* End of queue.c */