[exim-cvs] Allow for platforms not support abstract naming f…

Startseite
Nachricht löschen
Nachricht beantworten
Autor: Exim Git Commits Mailing List
Datum:  
To: exim-cvs
Betreff: [exim-cvs] Allow for platforms not support abstract naming for Unix sockets
Gitweb: https://git.exim.org/exim.git/commitdiff/2f2dd3a5b7af190a42d45fead6230bc1bb75483d
Commit:     2f2dd3a5b7af190a42d45fead6230bc1bb75483d
Parent:     5399df8075b16fdc8a8fe4249972c2786fe6fcab
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Thu Feb 20 14:39:14 2020 +0000
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Fri Feb 21 17:08:28 2020 +0000


    Allow for platforms not support abstract naming for Unix sockets
---
 src/OS/os.h-Linux            |  3 +++
 src/src/daemon.c             | 59 +++++++++++++++++++++++++++++++-------------
 src/src/expand.c             | 24 +++++++++++++-----
 src/src/queue.c              | 12 +++++++--
 test/runtest                 | 11 +++++----
 test/scripts/0000-Basic/0438 |  3 ++-
 test/stderr/0433             | 18 ++++++++++++++
 test/stderr/0438             |  6 +++++
 test/stderr/0609             |  1 +
 test/stderr/1007             | 24 ++++++++++++++++++
 test/stderr/2201             |  1 +
 test/stdout/0438             |  2 +-
 12 files changed, 132 insertions(+), 32 deletions(-)


diff --git a/src/OS/os.h-Linux b/src/OS/os.h-Linux
index 63cf9ba..25c013c 100644
--- a/src/OS/os.h-Linux
+++ b/src/OS/os.h-Linux
@@ -87,5 +87,8 @@ then change the 0 to 1 in the next block. */
# define TCPI_OPT_SYN_DATA 32
#endif

+/* "Abstract" Unix-socket names */
+#define EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+

/* End */
diff --git a/src/src/daemon.c b/src/src/daemon.c
index bb9b32f..b4629ba 100644
--- a/src/src/daemon.c
+++ b/src/src/daemon.c
@@ -954,6 +954,19 @@ daemon_die(void)
{
int pid;

+if (daemon_notifier_fd >= 0)
+  {
+  close(daemon_notifier_fd);
+  daemon_notifier_fd = -1;
+#ifndef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+    {
+    uschar * s = string_sprintf("%s/%s", spool_directory, NOTIFIER_SOCKET_NAME);
+    DEBUG(D_any) debug_printf("unlinking notifier socket %s\n", s);
+    Uunlink(s);
+    }
+#endif
+  }
+
 if (f.running_in_test_harness || write_pid)
   {
   if ((pid = fork()) == 0)
@@ -985,11 +998,11 @@ const uschar * where;
 struct sockaddr_un sun = {.sun_family = AF_UNIX};
 int len;


-DEBUG(D_any) debug_printf("creating notifier socket\n");
+DEBUG(D_any) debug_printf("creating notifier socket ");

where = US"socket";
#ifdef SOCK_CLOEXEC
-if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0)
+if ((fd = socket(PF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0)
goto bad;
#else
if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
@@ -997,25 +1010,31 @@ if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
(void)fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
#endif

+#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
 sun.sun_path[0] = 0;    /* Abstract local socket addr - Linux-specific? */
 len = offsetof(struct sockaddr_un, sun_path) + 1
   + snprintf(sun.sun_path+1, sizeof(sun.sun_path)-1, "%s", NOTIFIER_SOCKET_NAME);
+DEBUG(D_any) debug_printf("@%s\n", sun.sun_path+1);
+#else            /* filesystem-visible and persistent; will neeed removal */
+len = offsetof(struct sockaddr_un, sun_path)
+  + snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s", 
+        spool_directory, NOTIFIER_SOCKET_NAME);
+DEBUG(D_any) debug_printf("%s\n", sun.sun_path);
+#endif


where = US"bind";
if (bind(fd, (const struct sockaddr *)&sun, len) < 0)
goto bad;

-where = US"SO_PASSCRED";
-if (setsockopt(fd, SOL_SOCKET,
 #ifdef SO_PASSCRED        /* Linux */
-    SO_PASSCRED,
-#elif defined(LOCAL_CREDS)    /* BSD-ish */
-    LOCAL_CREDS,
-#else
-# error no SO_PASSCRED
-#endif
-    &on, sizeof(on)) < 0)
+where = US"SO_PASSCRED";
+if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0)
   goto bad;
+#elif defined(LOCAL_CREDS)    /* FreeBSD-ish */
+where = US"LOCAL_CREDS";
+if (setsockopt(fd, SOL_SOCKET, LOCAL_CREDS, &on, sizeof(on)) < 0)
+  goto bad;
+#endif


/* debug_printf("%s: fd %d\n", __FUNCTION__, fd); */
daemon_notifier_fd = fd;
@@ -1053,8 +1072,10 @@ if (sz >= sizeof(buf)) return FALSE;
#ifdef notdef
debug_printf("addrlen %d\n", msg.msg_namelen);
#endif
-DEBUG(D_queue_run) debug_printf("%s from addr%s '%s'\n", __FUNCTION__,
- *sun.sun_path ? "" : " abstract", sun.sun_path+ (*sun.sun_path ? 0 : 1));
+DEBUG(D_queue_run) debug_printf("%s from addr '%s%.*s'\n", __FUNCTION__,
+ *sun.sun_path ? "" : "@",
+ (int)msg.msg_namelen - (*sun.sun_path ? 0 : 1),
+ sun.sun_path + (*sun.sun_path ? 0 : 1));

 /* Refuse to handle the item unless the peer has good credentials */
 #ifdef SCM_CREDENTIALS
@@ -1062,32 +1083,36 @@ DEBUG(D_queue_run) debug_printf("%s from addr%s '%s'\n", __FUNCTION__,
 #elif defined(LOCAL_CREDS) && defined(SCM_CREDS)
 # define EXIM_SCM_CR_TYPE SCM_CREDS
 #else
-# error no SCM creds knowlege
+    /* The OS has no way to get the creds of the caller (for a unix/datagram socket.
+    Punt; don't try to check. */
 #endif


+#ifdef EXIM_SCM_CR_TYPE
 for (struct cmsghdr * cp = CMSG_FIRSTHDR(&msg);
      cp;
      cp = CMSG_NXTHDR(&msg, cp))
   if (cp->cmsg_level == SOL_SOCKET && cp->cmsg_type == EXIM_SCM_CR_TYPE)
   {
-#ifdef SCM_CREDENTIALS                    /* Linux */
+# ifdef SCM_CREDENTIALS                    /* Linux */
   struct ucred * cr = (struct ucred *) CMSG_DATA(cp);
   if (cr->uid && cr->uid != exim_uid)
     {
     DEBUG(D_queue_run) debug_printf("%s: sender creds pid %d uid %d gid %d\n",
       __FUNCTION__, (int)cr->pid, (int)cr->uid, (int)cr->gid);
     return FALSE;
-#elif defined(LOCAL_CREDS)                /* BSD-ish */
+    }
+# elif defined(LOCAL_CREDS)                /* BSD-ish */
   struct sockcred * cr = (struct sockcred *) CMSG_DATA(cp);
   if (cr->sc_uid && cr->sc_uid != exim_uid)
     {
     DEBUG(D_queue_run) debug_printf("%s: sender creds pid ??? uid %d gid %d\n",
       __FUNCTION__, (int)cr->sc_uid, (int)cr->sc_gid);
     return FALSE;
-#endif
     }
+# endif
   break;
   }
+#endif


buf[sz] = 0;
switch (buf[0])
diff --git a/src/src/expand.c b/src/src/expand.c
index 427effe..4af4a36 100644
--- a/src/src/expand.c
+++ b/src/src/expand.c
@@ -1755,6 +1755,9 @@ uschar buf[16];
int fd;
ssize_t len;
const uschar * where;
+#ifndef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+uschar * sname;
+#endif

if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
{
@@ -1762,28 +1765,34 @@ if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
return NULL;
}

-#define ABSTRACT_CLIENT
-#ifdef ABSTRACT_CLIENT
+#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
 sun.sun_path[0] = 0;    /* Abstract local socket addr - Linux-specific? */
 len = offsetof(struct sockaddr_un, sun_path) + 1
   + snprintf(sun.sun_path+1, sizeof(sun.sun_path)-1, "exim_%d", getpid());
 #else
+sname = string_sprintf("%s/p_%d", spool_directory, getpid());
 len = offsetof(struct sockaddr_un, sun_path)
-  + snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/p_%d",
-      spool_directory, getpid());
+  + snprintf(sun.sun_path, sizeof(sun.sun_path), "%s", sname);
 #endif


if (bind(fd, (const struct sockaddr *)&sun, len) < 0)
{ where = US"bind"; goto bad; }

#ifdef notdef
-debug_printf("local%s '%s'\n", *sun.sun_path ? "" : " abstract",
- sun.sun_path+ (*sun.sun_path ? 0 : 1));
+debug_printf("local addr '%s%s'\n",
+ *sun.sun_path ? "" : "@",
+ sun.sun_path + (*sun.sun_path ? 0 : 1));
#endif

+#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
 sun.sun_path[0] = 0;    /* Abstract local socket addr - Linux-specific? */
 len = offsetof(struct sockaddr_un, sun_path) + 1
   + snprintf(sun.sun_path+1, sizeof(sun.sun_path)-1, "%s", NOTIFIER_SOCKET_NAME);
+#else
+len = offsetof(struct sockaddr_un, sun_path)
+  + snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s",
+        spool_directory, NOTIFIER_SOCKET_NAME);
+#endif


if (connect(fd, (const struct sockaddr *)&sun, len) < 0)
{ where = US"connect"; goto bad; }
@@ -1794,6 +1803,9 @@ if (send(fd, buf, 1, 0) < 0) { where = US"send"; goto bad; }
if ((len = recv(fd, buf, sizeof(buf), 0)) < 0) { where = US"recv"; goto bad; }

close(fd);
+#ifndef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+Uunlink(sname);
+#endif
return string_copyn(buf, len);

 bad:
diff --git a/src/src/queue.c b/src/src/queue.c
index ac7aad1..4452163 100644
--- a/src/src/queue.c
+++ b/src/src/queue.c
@@ -475,7 +475,7 @@ for (int i = queue_run_in_order ? -1 : 0;
     if (f.queue_2stage && !queue_run_in_order)
       {
       int i;
-      if (qpid[nelem(qpid) - 1])
+      if (qpid[f.running_in_test_harness ? 0 : nelem(qpid) - 1])
     {
     DEBUG(D_queue_run) debug_printf("q2stage waiting for child\n");
     waitpid(qpid[0], NULL, 0);
@@ -1524,12 +1524,20 @@ memcpy(buf+1, msgid, MESSAGE_ID_LENGTH+1);
 if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) >= 0)
   {
   struct sockaddr_un sun = {.sun_family = AF_UNIX};
+  int slen;
+
+#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
   int len = offsetof(struct sockaddr_un, sun_path) + 1
     + snprintf(sun.sun_path+1, sizeof(sun.sun_path)-1, "%s",
        NOTIFIER_SOCKET_NAME);
   sun.sun_path[0] = 0;
+#else
+  int len = offsetof(struct sockaddr_un, sun_path)
+    + snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s",
+       spool_directory, NOTIFIER_SOCKET_NAME);
+#endif


-  if (sendto(fd, buf, sizeof(buf), 0, &sun, len) < 0)
+  if (sendto(fd, buf, sizeof(buf), 0, (struct sockaddr *)&sun, len) < 0)
     DEBUG(D_queue_run)
       debug_printf("%s: sendto %s\n", __FUNCTION__, strerror(errno));
   close(fd);
diff --git a/test/runtest b/test/runtest
index 0dc5ec9..ffa0a71 100755
--- a/test/runtest
+++ b/test/runtest
@@ -1212,7 +1212,9 @@ RESET_AFTER_EXTRA_LINE_READ:
     next if /in\shosts_require_dane\?\sno\s\(option\sunset\)/x;


     # daemon notifier socket
-    s/^\d+ creating notifier socket$/ppppp creating notifier socket/;
+    s/^(creating notifier socket) .*$/$1/;
+    s/^(\s*\d+|ppppp) (creating notifier socket) .+$/ppppp $2/;
+    next if /unlinking notifier socket/;


     # DISABLE_OCSP
     next if /in hosts_requ(est|ire)_ocsp\? (no|yes)/;
@@ -2330,8 +2332,7 @@ if (/^gnutls/)



# The "killdaemon" command should ultimately follow the starting of any Exim
-# daemon with the -bd option. We kill with SIGINT rather than SIGTERM to stop
-# it outputting "Terminated" to the terminal when not in the background.
+# daemon with the -bd option.

 if (/^killdaemon/)
   {
@@ -2343,14 +2344,14 @@ if (/^killdaemon/)
     print ">> killdaemon: recovered pid $pid\n" if $debug;
     if ($pid)
       {
-      run_system("sudo /bin/kill -INT $pid");
+      run_system("sudo /bin/kill -TERM $pid");
       wait;
       }
     } else {
     $pid = `cat $parm_cwd/spool/exim-daemon.*`;
     if ($pid)
       {
-      run_system("sudo /bin/kill -INT $pid");
+      run_system("sudo /bin/kill -TERM $pid");
       close DAEMONCMD;                                   # Waits for process
       }
     }
diff --git a/test/scripts/0000-Basic/0438 b/test/scripts/0000-Basic/0438
index a8287cf..28795d8 100644
--- a/test/scripts/0000-Basic/0438
+++ b/test/scripts/0000-Basic/0438
@@ -13,8 +13,9 @@ killdaemon
 exim -d -DSERVER=server -bd -oX PORT_D -oP DIR/spool/mypidfile
 ****
 sleep 1
-ls DIR/spool
 sudo perl
+system "ls DIR/spool | grep pid";
+print "\n";
 open(IN, "<", "DIR/spool/mypidfile");
 while (<IN>) { kill "TERM", $_; }
 ****
diff --git a/test/stderr/0433 b/test/stderr/0433
index 6164b0f..f9ac402 100644
--- a/test/stderr/0433
+++ b/test/stderr/0433
@@ -17,6 +17,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -35,6 +38,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 port 1226
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -54,6 +60,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on [127.0.0.1]:1228 port 1225 (IPv4) port 1226 (IPv4)
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <; 127.0.0.1.1228 ; 0.0.0.0 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -73,6 +82,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 port 1226 [127.0.0.1]:1228
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <;  0.0.0.0; 127.0.0.1.1228 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -93,6 +105,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on [127.0.0.1]:1228 port 1227 (IPv4)
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <; 127.0.0.1.1228 ; 0.0.0.0 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -113,3 +128,6 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 port 1226
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
diff --git a/test/stderr/0438 b/test/stderr/0438
index b4afb0a..4fbd577 100644
--- a/test/stderr/0438
+++ b/test/stderr/0438
@@ -19,6 +19,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -38,6 +41,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.anotherpid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
diff --git a/test/stderr/0609 b/test/stderr/0609
index d8b91de..b8df9c3 100644
--- a/test/stderr/0609
+++ b/test/stderr/0609
@@ -52,3 +52,4 @@ ppppp child ppppp ended: status=0x100
 ppppp   normal exit, 1
 ppppp 0 SMTP accept processes now running
 ppppp Listening...
+ppppp >>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
diff --git a/test/stderr/1007 b/test/stderr/1007
index 95a96a4..8eefcb5 100644
--- a/test/stderr/1007
+++ b/test/stderr/1007
@@ -18,6 +18,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 (IPv6 and IPv4)
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -38,6 +41,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 (IPv6 and IPv4) port 1226 (IPv6 and IPv4)
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -59,6 +65,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 (IPv6 and IPv4) port 1226 (IPv6 and IPv4) [127.0.0.1]:1228
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <; ::0 ; 127.0.0.1.1228 ; 0.0.0.0 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -80,6 +89,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 (IPv6 and IPv4) port 1226 (IPv6 and IPv4) [127.0.0.1]:1228
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <;  0.0.0.0; 127.0.0.1.1228 ; ::0 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -98,6 +110,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on [ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6]:{1225,1226}
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <;  ip6:ip6:ip6:ip6:ip6:ip6:ip6:ip6 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -119,6 +134,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1227 (IPv6 and IPv4) [127.0.0.1]:1228
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <; ::0 ; 127.0.0.1.1228 ; 0.0.0.0 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -141,6 +159,9 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on [127.0.0.1]:{1227,1225}
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -DPORT=daemon_smtp_port=1225:1226 -DIFACE=local_interfaces = <; ::0 ; 127.0.0.1.1228 ; 0.0.0.0 -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=CALLER_GID pid=pppp
@@ -162,3 +183,6 @@ LOG: MAIN
 set_process_info: pppp daemon(x.yz): no queue runs, listening for SMTP on port 1225 (IPv6 and IPv4) port 1226 (IPv4)
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
+pppp exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DSERVER=server -C TESTSUITE/test-config -d=0xf7795cfd -oP TESTSUITE/spool/exim-daemon.pid -oPX
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
diff --git a/test/stderr/2201 b/test/stderr/2201
index 2d1386a..181a27f 100644
--- a/test/stderr/2201
+++ b/test/stderr/2201
@@ -228,3 +228,4 @@ ppppp child ppppp ended: status=0x0
 ppppp   normal exit, 0
 ppppp 0 SMTP accept processes now running
 ppppp Listening...
+ppppp >>>>>>>>>>>>>>>> Exim pid=pppp (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
diff --git a/test/stdout/0438 b/test/stdout/0438
index 431c133..bdf0c73 100644
--- a/test/stdout/0438
+++ b/test/stdout/0438
@@ -1,3 +1,3 @@
-log
 mypidfile
+
 log