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