debug tidying
[exim.git] / src / src / daemon.c
index 12e3413a06798a4d4178ba577b80a3ed2ef23b89..fa74ddb0e9aa3e7824b3787452c9e536c4cbc9fd 100644 (file)
@@ -126,6 +126,18 @@ if (smtp_out) smtp_printf("421 %s\r\n", FALSE, smtp_msg);
 
 
 
+/*************************************************
+*************************************************/
+
+static void
+close_daemon_sockets(int daemon_notifier_fd,
+  int * listen_sockets, int listen_socket_count)
+{
+if (daemon_notifier_fd >= 0) (void) close(daemon_notifier_fd);
+for (int i = 0; i < listen_socket_count; i++) (void) close(listen_sockets[i]);
+}
+
+
 /*************************************************
 *            Handle a connected SMTP call        *
 *************************************************/
@@ -355,7 +367,7 @@ if (LOGGING(smtp_connection))
 expansion above did a lookup. */
 
 search_tidyup();
-pid = fork();
+pid = exim_fork(US"daemon accept");
 
 /* Handle the child process */
 
@@ -406,7 +418,7 @@ if (pid == 0)
           "please try again later.\r\n", FALSE);
         mac_smtp_fflush();
         search_tidyup();
-        exim_underbar_exit(EXIT_FAILURE);
+        exim_underbar_exit(EXIT_FAILURE, US"conn-accept");
         }
       }
     else if (*nah) smtp_active_hostname = nah;
@@ -424,7 +436,7 @@ if (pid == 0)
   extensive comment before the reception loop in exim.c for a fuller
   explanation of this logic. */
 
-  for (i = 0; i < listen_socket_count; i++) (void)close(listen_sockets[i]);
+  close_daemon_sockets(daemon_notifier_fd, listen_sockets, listen_socket_count);
 
   /* Set FD_CLOEXEC on the SMTP socket. We don't want any rogue child processes
   to be able to communicate with them, under any circumstances. */
@@ -493,7 +505,7 @@ if (pid == 0)
     {
     mac_smtp_fflush();
     search_tidyup();
-    exim_underbar_exit(EXIT_SUCCESS);
+    exim_underbar_exit(EXIT_SUCCESS, US"conn-smtp");
     }
 
   for (;;)
@@ -521,7 +533,7 @@ if (pid == 0)
        cancel_cutthrough_connection(TRUE, US"receive dropped");
         mac_smtp_fflush();
         smtp_log_no_mail();               /* Log no mail if configured */
-        exim_underbar_exit(EXIT_SUCCESS);
+        exim_underbar_exit(EXIT_SUCCESS, US"conn-receive");
         }
       if (message_id[0] == 0) continue;   /* No message was accepted */
       }
@@ -544,7 +556,7 @@ if (pid == 0)
       /*XXX should we pause briefly, hoping that the client will be the
       active TCP closer hence get the TCP_WAIT endpoint? */
       DEBUG(D_receive) debug_printf("SMTP>>(close on process exit)\n");
-      exim_underbar_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS);
+      exim_underbar_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS, US"conn-setup");
       }
 
     /* Show the recipients when debugging */
@@ -651,7 +663,7 @@ if (pid == 0)
 
       mac_smtp_fflush();
 
-      if ((dpid = fork()) == 0)
+      if ((dpid = exim_fork(US"daemon-accept-delivery")) == 0)
         {
         (void)fclose(smtp_in);
         (void)fclose(smtp_out);
@@ -680,7 +692,7 @@ if (pid == 0)
 
         (void) deliver_message(message_id, FALSE, FALSE);
         search_tidyup();
-        exim_underbar_exit(EXIT_SUCCESS);
+        exim_underbar_exit(EXIT_SUCCESS, US"deliver_msg");
         }
 
       if (dpid > 0)
@@ -960,7 +972,7 @@ if (daemon_notifier_fd >= 0)
   daemon_notifier_fd = -1;
 #ifndef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
     {
-    uschar * s = string_sprintf("%s/%s", spool_directory, NOTIFIER_SOCKET_NAME);
+    uschar * s = expand_string(notifier_socket);
     DEBUG(D_any) debug_printf("unlinking notifier socket %s\n", s);
     Uunlink(s);
     }
@@ -969,7 +981,7 @@ if (daemon_notifier_fd >= 0)
 
 if (f.running_in_test_harness || write_pid)
   {
-  if ((pid = fork()) == 0)
+  if ((pid = exim_fork(US"daemon-del-pidfile")) == 0)
     {
     if (override_pid_file_path)
       (void)child_exec_exim(CEE_EXEC_PANIC, FALSE, NULL, FALSE, 3,
@@ -998,51 +1010,61 @@ const uschar * where;
 struct sockaddr_un sa_un = {.sun_family = AF_UNIX};
 int len;
 
-DEBUG(D_any) debug_printf("creating notifier socket ");
+if (override_local_interfaces && !override_pid_file_path)
+  {
+  DEBUG(D_any)
+    debug_printf("-oX used without -oP so not creating notifier socket\n");
+  return;
+  }
+
+DEBUG(D_any) debug_printf("creating notifier socket\n");
 
-where = US"socket";
 #ifdef SOCK_CLOEXEC
 if ((fd = socket(PF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0)
-  goto bad;
+  { where = US"socket"; goto bad; }
 #else
-if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
-  goto bad;
+if ((fd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
+  { where = US"socket"; goto bad; }
 (void)fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
 #endif
 
 #ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
 sa_un.sun_path[0] = 0; /* Abstract local socket addr - Linux-specific? */
 len = offsetof(struct sockaddr_un, sun_path) + 1
-  + snprintf(sa_un.sun_path+1, sizeof(sa_un.sun_path)-1, "%s", NOTIFIER_SOCKET_NAME);
-DEBUG(D_any) debug_printf("@%s\n", sa_un.sun_path+1);
+  + snprintf(sa_un.sun_path+1, sizeof(sa_un.sun_path)-1, "%s",
+             expand_string(notifier_socket));
+DEBUG(D_any) debug_printf(" @%s\n", sa_un.sun_path+1);
 #else                  /* filesystem-visible and persistent; will neeed removal */
 len = offsetof(struct sockaddr_un, sun_path)
-  + snprintf(sa_un.sun_path, sizeof(sa_un.sun_path), "%s/%s", 
-               spool_directory, NOTIFIER_SOCKET_NAME);
-DEBUG(D_any) debug_printf("%s\n", sa_un.sun_path);
+  + snprintf(sa_un.sun_path, sizeof(sa_un.sun_path), "%s", 
+             expand_string(notifier_socket));
+DEBUG(D_any) debug_printf(" %s\n", sa_un.sun_path);
 #endif
 
-where = US"bind";
 if (bind(fd, (const struct sockaddr *)&sa_un, len) < 0)
-  goto bad;
+  { where = US"bind"; goto bad; }
 
 #ifdef SO_PASSCRED             /* Linux */
-where = US"SO_PASSCRED";
 if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0)
-  goto bad;
+  { where = US"SO_PASSCRED"; goto bad2; }
 #elif defined(LOCAL_CREDS)     /* FreeBSD-ish */
-where = US"LOCAL_CREDS";
-if (setsockopt(fd, SOL_SOCKET, LOCAL_CREDS, &on, sizeof(on)) < 0)
-  goto bad;
+if (setsockopt(fd, 0, LOCAL_CREDS, &on, sizeof(on)) < 0)
+  { where = US"LOCAL_CREDS"; goto bad2; }
 #endif
 
 /* debug_printf("%s: fd %d\n", __FUNCTION__, fd); */
 daemon_notifier_fd = fd;
 return;
 
+bad2:
+#ifndef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+  Uunlink(sa_un.sun_path);
+#endif
 bad:
-  log_write(0, LOG_MAIN|LOG_PANIC, "%s: %s: %s",
+  log_write(0, LOG_MAIN|LOG_PANIC, "%s %s: %s",
     __FUNCTION__, where, strerror(errno));
+  close(fd);
+  return;
 }
 
 
@@ -1579,7 +1601,7 @@ if (f.background_daemon)
 
   if (getppid() != 1)
     {
-    pid_t pid = fork();
+    pid_t pid = exim_fork(US"daemon");
     if (pid < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE,
       "fork() failed when starting daemon: %s", strerror(errno));
     if (pid > 0) exit(EXIT_SUCCESS);      /* in parent process, just exit */
@@ -2105,14 +2127,11 @@ for (;;)
       have enough queue runners on the go. If we are not running as root, a
       re-exec is required. */
 
-      if (queue_interval > 0 &&
-         (local_queue_run_max <= 0 || queue_run_count < local_queue_run_max))
+      if (  queue_interval > 0
+         && (local_queue_run_max <= 0 || queue_run_count < local_queue_run_max))
         {
-        if ((pid = fork()) == 0)
+        if ((pid = exim_fork(US"queue-runner")) == 0)
           {
-          DEBUG(D_any) debug_printf("Starting queue-runner: pid %d\n",
-            (int)getpid());
-
           /* Disable debugging if it's required only for the daemon process. We
           leave the above message, because it ties up with the "child ended"
           debugging messages. */
@@ -2121,10 +2140,8 @@ for (;;)
 
           /* Close any open listening sockets in the child */
 
-         if (daemon_notifier_fd >= 0)
-           (void) close(daemon_notifier_fd);
-          for (int sk = 0; sk < listen_socket_count; sk++)
-            (void) close(listen_sockets[sk]);
+         close_daemon_sockets(daemon_notifier_fd,
+           listen_sockets, listen_socket_count);
 
           /* Reset SIGHUP and SIGCHLD in the child in both cases. */
 
@@ -2201,7 +2218,7 @@ for (;;)
          else
 #endif
            queue_run(NULL, NULL, FALSE);
-          exim_underbar_exit(EXIT_SUCCESS);
+          exim_underbar_exit(EXIT_SUCCESS, US"queue-runner");
           }
 
         if (pid < 0)
@@ -2432,8 +2449,8 @@ for (;;)
     {
     log_write(0, LOG_MAIN, "pid %d: SIGHUP received: re-exec daemon",
       getpid());
-    for (int sk = 0; sk < listen_socket_count; sk++)
-      (void)close(listen_sockets[sk]);
+    close_daemon_sockets(daemon_notifier_fd,
+      listen_sockets, listen_socket_count);
     ALARM_CLR(0);
     signal(SIGHUP, SIG_IGN);
     sighup_argv[0] = exim_path;