Heiko Schlitterman's patch for log_selector=+pid, plus appropriate
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Wed, 31 Jan 2007 16:52:12 +0000 (16:52 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Wed, 31 Jan 2007 16:52:12 +0000 (16:52 +0000)
patches for eximstats and eximon (his patch dealt with exigrep).

19 files changed:
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/ACKNOWLEDGMENTS
src/exim_monitor/em_log.c
src/exim_monitor/em_version.c
src/src/exigrep.src
src/src/eximstats.src
src/src/globals.c
src/src/log.c
src/src/macros.h
test/README
test/confs/0551 [new file with mode: 0644]
test/log/0551 [new file with mode: 0644]
test/mail/0551.userx [new file with mode: 0644]
test/mail/0551.usery [new file with mode: 0644]
test/mail/0551.userz [new file with mode: 0644]
test/runtest
test/scripts/0000-Basic/0551 [new file with mode: 0644]
test/stdout/0551 [new file with mode: 0644]

index e36d4bb50df990f7a9ae5ac59fd5f28ecd824bc7..4cb842c6dcbf9a70f50cc6738d68256f887605d0 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.466 2007/01/31 11:30:08 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.467 2007/01/31 16:52:12 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -69,6 +69,8 @@ PH/12 Added $sending_ip_address and $sending_port (mostly Magnus Holmgren's
 
 PH/13 Added ${rfc2047d: to decoded RFC 2047 strings.
 
+PH/14 Added log_selector = +pid.
+
 
 Exim version 4.66
 -----------------
index cfa846c4892797408fb2a9955d6bbd034817e555..ccd5989cbcd2704556554a73c30d1af57c7a3ac9 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.133 2007/01/31 11:30:08 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.134 2007/01/31 16:52:12 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -228,6 +228,10 @@ Version 4.67
     headers_charset. Overlong RFC 2047 "words" are not recognized unless
     check_rfc2047_length is set false.
 
+10. There is a new log selector called "pid", which causes the current process
+    id to be added to every log line, in square brackets, immediately after the
+    time and date.
+
 
 Version 4.66
 ------------
index a855be12cbea36a548fda02c82a0d5fe06423809..1a39046c3809b657da9a8dcbb0f8a8982d0b4945 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.70 2007/01/31 11:30:08 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.71 2007/01/31 16:52:12 ph10 Exp $
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -240,6 +240,7 @@ Jonathan Sambrook         Suggested patch for expanding uid and gid lists
 Peter Savitch             Diagnosis of FPE bug when statvfs() fails on spool
 Harald Schueler           Patch for dn_expand() failure on truncated data
 Heiko Schlichting         Diagnosis of intermittent daemon crash bug
+Heiko Schlitterman        Proposed patch for +pid
 Stephan Schulz            Patch for $host_data caching error
 Lai Zit Seng              Patch for radiusclient 0.4.9 interface bugs
 Tony Sheen                Log files with datestamped names and auto rollover
index e87d5207e21d0a339ab5a533e182504231856124..409f2daf6c2e8a28b3e88a053fb81479e1c96a39 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/exim_monitor/em_log.c,v 1.4 2007/01/08 10:50:17 ph10 Exp $ */
+/* $Cambridge: exim/src/exim_monitor/em_log.c,v 1.5 2007/01/31 16:52:12 ph10 Exp $ */
 
 /*************************************************
 *                 Exim Monitor                   *
@@ -7,7 +7,7 @@
 /* Copyright (c) University of Cambridge 1995 - 2007 */
 /* See the file NOTICE for conditions of use and distribution. */
 
-/* This module contains code for scanning the smaill log,
+/* This module contains code for scanning the main log,
 extracting information from it, and displaying a "tail". */
 
 #include "em_hdr.h"
@@ -250,14 +250,20 @@ if (LOG != NULL)
       }
 
     /* Munge the log entry and display shortened form on one line.
-    We omit the date and show only the time. Remove any time zone offset. */
+    We omit the date and show only the time. Remove any time zone offset.
+    Take note of the presence of [pid]. */
 
     if (pcre_exec(yyyymmdd_regex,NULL,CS buffer,length,0,PCRE_EOPT,NULL,0) >= 0)
       {
+      int pidlength = 0;
       if ((buffer[20] == '+' || buffer[20] == '-') &&
           isdigit(buffer[21]) && buffer[25] == ' ')
         memmove(buffer + 20, buffer + 26, Ustrlen(buffer + 26) + 1);
-      id = string_copyn(buffer + 20, MESSAGE_ID_LENGTH);
+      if (buffer[20] == '[')
+        {
+        while (Ustrchr("[]0123456789", buffer[20+pidlength++]) != NULL);
+        }
+      id = string_copyn(buffer + 20 + pidlength, MESSAGE_ID_LENGTH);
       show_log("%s", buffer+11);
       }
     else
index 871fbf199d72591eb969e11640fdbf93ff71e3a1..4a6f3ce4e8ec71e07c8098fa9345d44f60615937 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/exim_monitor/em_version.c,v 1.4 2007/01/08 10:50:17 ph10 Exp $ */
+/* $Cambridge: exim/src/exim_monitor/em_version.c,v 1.5 2007/01/31 16:52:12 ph10 Exp $ */
 
 /*************************************************
 *                  Exim Monitor                  *
@@ -21,7 +21,7 @@ version_init(void)
 int i = 0;
 uschar today[20];
 
-version_string = US"2.05";
+version_string = US"2.06";
 
 Ustrcpy(today, __DATE__);
 if (today[4] == ' ') i = 1;
index c6ccbfdc50e3d0115e74108f0fd6c0a241481f39..f888984b0c8b8805748d599f7321c1fb667b0a83 100644 (file)
@@ -1,9 +1,9 @@
 #! PERL_COMMAND -w
-# $Cambridge: exim/src/src/exigrep.src,v 1.3 2005/08/01 13:28:30 ph10 Exp $
+# $Cambridge: exim/src/src/exigrep.src,v 1.4 2007/01/31 16:52:12 ph10 Exp $
 
 use strict;
 
-# Copyright (c) 2004 University of Cambridge.
+# Copyright (c) 2007 University of Cambridge.
 # See the file NOTICE for conditions of use and distribution.
 
 # Except when they appear in comments, the following placeholders in this
@@ -68,9 +68,9 @@ return unless
 
 # Handle the case when the log line belongs to a specific message. We save
 # lines for specific messages until the message is complete. Then either print
-# discard.
+# or discard.
 
-if (my($id) = $entry =~ /^(\w{6}\-\w{6}\-\w{2})/)
+if (my($id) = $entry =~ /^(?:\[\d+\]\s)?(\w{6}\-\w{6}\-\w{2})/)
   {
   $saved{$id} = '' unless defined($saved{$id});
 
index 539c756d7aacb7327852e965fcd977b5095638b0..88eb69fe83b3d849b59d3c965cd5139704340f28 100644 (file)
@@ -1,5 +1,5 @@
 #!PERL_COMMAND -w
-# $Cambridge: exim/src/src/eximstats.src,v 1.12 2007/01/22 15:14:01 steve Exp $
+# $Cambridge: exim/src/src/eximstats.src,v 1.13 2007/01/31 16:52:12 ph10 Exp $
 
 # Copyright (c) 2001 University of Cambridge.
 # See the file NOTICE for conditions of use and distribution.
 # 2006-11-27  V1.52 Steve Campbell
 #             Tally any reject message containing SpamAssassin.
 #
+# 2007-01-31  V1.53 Philip Hazel
+#             Allow for [pid] after date in log lines
+#
 #
 #
 # For documentation on the logfile format, see
@@ -558,7 +561,7 @@ use vars qw($WEEK $DAY $HOUR $MINUTE);
 
 @days_per_month = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
 $gig     = 1024 * 1024 * 1024;
-$VERSION = '1.52';
+$VERSION = '1.53';
 
 # How much space do we allow for the Hosts/Domains/Emails/Edomains column headers?
 $COLUMN_WIDTHS = 8;
@@ -1821,7 +1824,7 @@ sub generate_parser {
 
     $length = length($_);
     next if ($length < 38);
-    next unless /^(\\d{4}\\-\\d\\d-\\d\\d\\s(\\d\\d):(\\d\\d):\\d\\d( [-+]\\d\\d\\d\\d)?)/o;
+    next unless /^(\\d{4}\\-\\d\\d-\\d\\d\\s(\\d\\d):(\\d\\d):\\d\\d( [-+]\\d\\d\\d\\d)?)( \\[\\d+\\])?/o;
 
     ($tod,$m_hour,$m_min) = ($1,$2,$3);
 
@@ -1834,6 +1837,12 @@ sub generate_parser {
       $extra = 0;
     }
 
+    # PH - watch for PID added after the timestamp.
+    if (defined($5)) {
+      $extra += length($5);
+      next if ($length < 38 + $extra);
+    }
+
     $id   = substr($_, 20 + $extra, 16);
     $flag = substr($_, 37 + $extra, 2);
 
index 880b9998586fc7cba3a2bf5aed92ce5a20a16d73..b030c7f7b4a43add87d51239f8e606bd3f14a522 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.c,v 1.66 2007/01/30 15:10:59 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.67 2007/01/31 16:52:12 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -668,6 +668,8 @@ top bit). They are never used in calls to log_write(), but are tested
 independently. This separation became necessary when the number of log
 selectors was getting close to filling a 32-bit word. */
 
+/* Note that this list must be in alphabetical order. */
+
 bit_table log_options[]        = {
   { US"acl_warn_skipped",             LX_acl_warn_skipped },
   { US"address_rewrite",              L_address_rewrite },
@@ -686,6 +688,7 @@ bit_table log_options[]        = {
   { US"incoming_port",                LX_incoming_port },
   { US"lost_incoming_connection",     L_lost_incoming_connection },
   { US"outgoing_port",                LX_outgoing_port },
+  { US"pid",                          LX_pid },
   { US"queue_run",                    L_queue_run },
   { US"queue_time",                   LX_queue_time },
   { US"queue_time_overall",           LX_queue_time_overall },
index 2757ee0b412837db796610f2e91606a20553a4da..5cc30928747c83ae0f0e1d740dccadb2ac479432 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/log.c,v 1.11 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/log.c,v 1.12 2007/01/31 16:52:12 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -732,11 +732,21 @@ if (!write_rejectlog) flags &= ~LOG_REJECT;
 id except for the process log and when called by a utility. */
 
 ptr = log_buffer;
+sprintf(CS ptr, "%s ", tod_stamp(tod_log));
+while(*ptr) ptr++;
+
+if ((log_extra_selector & LX_pid) != 0)
+  {
+  sprintf(CS ptr, "[%d] ", (int)getpid());
+  while (*ptr) ptr++;
+  }
+
 if (really_exim && (flags & LOG_PROCESS) == 0 && message_id[0] != 0)
-  sprintf(CS ptr, "%s %s ", tod_stamp(tod_log), message_id);
-else sprintf(CS ptr, "%s ", tod_stamp(tod_log));
+  {
+  sprintf(CS ptr, "%s ", message_id);
+  while(*ptr) ptr++;
+  }
 
-while(*ptr) ptr++;
 if ((flags & LOG_CONFIG) != 0) ptr = log_config_info(ptr, flags);
 
 va_start(ap, format);
index 7b317e42d3fc25200adc19fdaf9cc7622e438bfd..f73ce63ac8753eca9343251f185499dee8e68eb7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/macros.h,v 1.30 2007/01/15 15:59:22 ph10 Exp $ */
+/* $Cambridge: exim/src/src/macros.h,v 1.31 2007/01/31 16:52:12 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -378,21 +378,22 @@ set all the bits in a multi-word selector. */
 #define LX_incoming_interface          0x80000020
 #define LX_incoming_port               0x80000040
 #define LX_outgoing_port               0x80000080
-#define LX_queue_time                  0x80000100
-#define LX_queue_time_overall          0x80000200
-#define LX_received_sender             0x80000400
-#define LX_received_recipients         0x80000800
-#define LX_rejected_header             0x80001000
-#define LX_return_path_on_delivery     0x80002000
-#define LX_sender_on_delivery          0x80004000
-#define LX_sender_verify_fail          0x80008000
-#define LX_smtp_confirmation           0x80010000
-#define LX_smtp_no_mail                0x80020000
-#define LX_subject                     0x80040000
-#define LX_tls_certificate_verified    0x80080000
-#define LX_tls_cipher                  0x80100000
-#define LX_tls_peerdn                  0x80200000
-#define LX_unknown_in_list             0x80400000
+#define LX_pid                         0x80000100
+#define LX_queue_time                  0x80000200
+#define LX_queue_time_overall          0x80000400
+#define LX_received_sender             0x80000800
+#define LX_received_recipients         0x80001000
+#define LX_rejected_header             0x80002000
+#define LX_return_path_on_delivery     0x80004000
+#define LX_sender_on_delivery          0x80008000
+#define LX_sender_verify_fail          0x80010000
+#define LX_smtp_confirmation           0x80020000
+#define LX_smtp_no_mail                0x80040000
+#define LX_subject                     0x80080000
+#define LX_tls_certificate_verified    0x80100000
+#define LX_tls_cipher                  0x80200000
+#define LX_tls_peerdn                  0x80400000
+#define LX_unknown_in_list             0x80800000
 
 #define L_default     (L_connection_reject        | \
                        L_delay_delivery           | \
index e1f8048f79766659a730b70a76f461c468bba1ea..5c060974c136a783829d829188f78698c408dc3c 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/test/README,v 1.6 2007/01/23 11:01:10 ph10 Exp $
+$Cambridge: exim/test/README,v 1.7 2007/01/31 16:52:12 ph10 Exp $
 
 EXPORTABLE EXIM TEST SUITE
 --------------------------
@@ -6,7 +6,7 @@ EXPORTABLE EXIM TEST SUITE
 This document last updated for:
 
 Test Suite Version: 4.67
-Date: 23 January 2007
+Date: 31 January 2007
 
 
 BACKGROUND
@@ -637,6 +637,12 @@ The file remains locked with the following command (normally exim) is obeyed.
 This command runs the exinext utility with the given argument data.
 
 
+  exigrep <data>
+
+This command runs the exigrep utility with the given data (the search pattern)
+on the current mainlog file.
+
+
   gnutls
 
 This command is present at the start of all but one of the tests that use
diff --git a/test/confs/0551 b/test/confs/0551
new file mode 100644 (file)
index 0000000..cecaae4
--- /dev/null
@@ -0,0 +1,36 @@
+# Exim test configuration 0551
+
+LS=+pid
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+log_selector = LS
+
+# ----- Routers -----
+
+begin routers
+
+r1:
+  driver = accept
+  transport = t1
+
+
+# ----- Transports -----
+
+begin transports
+
+t1:
+  driver = appendfile
+  user = CALLER
+  file = DIR/test-mail/$local_part
+
+# End
diff --git a/test/log/0551 b/test/log/0551
new file mode 100644 (file)
index 0000000..831e11a
--- /dev/null
@@ -0,0 +1,11 @@
+1999-03-02 09:44:33 [1234] 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 [1235] 10HmaX-0005vi-00 => userx <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1235] 10HmaX-0005vi-00 => usery <usery@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1235] 10HmaX-0005vi-00 Completed
+1999-03-02 09:44:33 [1236] 10HmaY-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 [1237] 10HmaY-0005vi-00 => userx <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1237] 10HmaY-0005vi-00 => userz <userz@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1237] 10HmaY-0005vi-00 Completed
+1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaZ-0005vi-00 => userx <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed
diff --git a/test/mail/0551.userx b/test/mail/0551.userx
new file mode 100644 (file)
index 0000000..01ca394
--- /dev/null
@@ -0,0 +1,31 @@
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaX-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+Message 1
+
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaY-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaY-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+Message 2
+
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaZ-0005vi-00
+       for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaZ-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+Message 3
+
diff --git a/test/mail/0551.usery b/test/mail/0551.usery
new file mode 100644 (file)
index 0000000..e4d855b
--- /dev/null
@@ -0,0 +1,10 @@
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaX-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+Message 1
+
diff --git a/test/mail/0551.userz b/test/mail/0551.userz
new file mode 100644 (file)
index 0000000..29b2f0d
--- /dev/null
@@ -0,0 +1,10 @@
+From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmaY-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaY-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+Message 2
+
index 0d5b105049b3d73694b5ac116c8dd31cca0e785c..328b8995868f96fd780acf2389bffdfe7000b422 100755 (executable)
@@ -1,6 +1,6 @@
 #! /usr/bin/perl -w
 
-# $Cambridge: exim/test/runtest,v 1.22 2007/01/23 14:57:51 ph10 Exp $
+# $Cambridge: exim/test/runtest,v 1.23 2007/01/31 16:52:12 ph10 Exp $
 
 ###############################################################################
 # This is the controlling script for the "new" test suite for Exim. It should #
@@ -432,6 +432,10 @@ while(<IN>)
   # Time on queue tolerance
   s/QT=1s/QT=0s/;
 
+  # Eximstats heading
+  s/Exim\sstatistics\sfrom\s\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d\sto\s
+    \d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d/Exim statistics from <time> to <time>/x;
+
 
   # ======== Caller's login, uid, gid, home ========
 
@@ -497,6 +501,10 @@ while(<IN>)
   # Pid in temp file in appendfile transport
   s"test-mail/temp\.\d+\."test-mail/temp.pppp.";
 
+  # Optional pid in log lines
+  s/^(\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d)(\s[+-]\d\d\d\d|)(\s\[\d+\])/
+    "$1$2 [" . new_value($3, "%s", \$next_pid) . "]"/gxe;
+
   # Detect a daemon stderr line with a pid and save the pid for subsequent
   # removal from following lines.
   $spid = $1 if /^(\s*\d+) (?:listening|LOG: MAIN|(?:daemon_smtp_port|local_interfaces) overridden by)/;
@@ -590,6 +598,8 @@ while(<IN>)
   s/\+0100,\d+;/+0100,ddd;/;
   s/\(\d+ bytes written\)/(ddd bytes written)/;
   s/added '\d+ 1'/added 'ddd 1'/;
+  s/Received\s+\d+/Received               nnn/;
+  s/Delivered\s+\d+/Delivered              nnn/;
 
 
   # ======== Values in spool space failure message ========
@@ -1413,6 +1423,30 @@ if (/^exinext\s+(.*)/)
   }
 
 
+# The "exigrep" command runs exigrep on the current mainlog
+
+if (/^exigrep\s+(.*)/)
+  {
+  run_system("(./eximdir/exigrep " .
+    "$1 $parm_cwd/spool/log/mainlog;" .
+    "echo exigrep exit code = \$?)" .
+    ">>test-stdout");
+  return 1;
+  }
+
+
+# The "eximstats" command runs eximstats on the current mainlog
+
+if (/^eximstats\s+(.*)/)
+  {
+  run_system("(./eximdir/eximstats " .
+    "$1 $parm_cwd/spool/log/mainlog;" .
+    "echo eximstats exit code = \$?)" .
+    ">>test-stdout");
+  return 1;
+  }
+
+
 # The "gnutls" command makes a copy of saved GnuTLS parameter data in the
 # spool directory, to save Exim from re-creating it each time.
 
@@ -2535,6 +2569,16 @@ if (system("cp $parm_exim_dir/exinext eximdir") != 0)
   tests_exit(-1, "Failed to make a copy of exinext: $!");
   }
 
+if (system("cp $parm_exim_dir/exigrep eximdir") != 0)
+  {
+  tests_exit(-1, "Failed to make a copy of exigrep: $!");
+  }
+
+if (system("cp $parm_exim_dir/eximstats eximdir") != 0)
+  {
+  tests_exit(-1, "Failed to make a copy of eximstats: $!");
+  }
+
 
 ##################################################
 #    Check that the Exim user can access stuff   #
@@ -2904,6 +2948,7 @@ foreach $test (@test_list)
 
   undef %cache;
   $next_msgid = "aX";
+  $next_pid = 1234;
   $next_port = 1111;
   $message_skip = 0;
   $msglog_skip = 0;
diff --git a/test/scripts/0000-Basic/0551 b/test/scripts/0000-Basic/0551
new file mode 100644 (file)
index 0000000..afd5c9b
--- /dev/null
@@ -0,0 +1,14 @@
+# log_selector = +pid
+#
+exim -odi userx@test.ex usery@test.ex
+Message 1
+****
+exim -odi userx@test.ex userz@test.ex
+Message 2
+****
+exim -DLS= -odi userx@test.ex
+Message 3
+****
+exigrep userx
+eximstats -ne -nr -nt -tnl -q0 -h0 -t0
+no_msglog_check
diff --git a/test/stdout/0551 b/test/stdout/0551
new file mode 100644 (file)
index 0000000..8af2815
--- /dev/null
@@ -0,0 +1,26 @@
+1999-03-02 09:44:33 [1234] 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 [1235] 10HmaX-0005vi-00 => userx <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1235] 10HmaX-0005vi-00 => usery <usery@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1235] 10HmaX-0005vi-00 Completed
+
+1999-03-02 09:44:33 [1236] 10HmaY-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 [1237] 10HmaY-0005vi-00 => userx <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1237] 10HmaY-0005vi-00 => userz <userz@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 [1237] 10HmaY-0005vi-00 Completed
+
+1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaZ-0005vi-00 => userx <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed
+
+exigrep exit code = 0
+
+Exim statistics from <time> to <time>
+
+Grand total summary
+-------------------
+                                                                  At least one address
+  TOTAL               Volume   Messages Addresses     Hosts      Delayed       Failed
+  Received               nnn          3                   1       0  0.0%      0  0.0%
+  Delivered              nnn          5         5         1
+
+eximstats exit code = 0