typo
[exim.git] / src / src / daemon.c
index ebe3be3beb2f154bd488adcb94a9e08c70228a5e..a4b1e2685451633f8480c928a59c1977d037648b 100644 (file)
@@ -973,7 +973,7 @@ const int dir_flags = O_RDONLY | O_NONBLOCK;
 const int base_flags = O_NOFOLLOW | O_NONBLOCK;
 const mode_t base_mode = 0644;
 struct stat sb;
-int cwd_fd, dir_fd, base_fd;
+int cwd_fd = -1, dir_fd = -1, base_fd = -1;
 BOOL success = FALSE;
 errno = EACCES;
 
@@ -1813,8 +1813,7 @@ if (f.daemon_listen && !f.inetd_wait_mode)
 
 #ifdef IPV6_V6ONLY
     if (af == AF_INET6 && wildcard &&
-        setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, CS (&on),
-          sizeof(on)) < 0)
+        setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) < 0)
       log_write(0, LOG_MAIN, "Setting IPV6_V6ONLY on daemon's IPv6 wildcard "
         "socket failed (%s): carrying on without it", strerror(errno));
 #endif  /* IPV6_V6ONLY */
@@ -1823,16 +1822,14 @@ if (f.daemon_listen && !f.inetd_wait_mode)
     is being handled.  Without this, a connection will prevent reuse of the
     smtp port for listening. */
 
-    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
-                   US (&on), sizeof(on)) < 0)
+    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "setting SO_REUSEADDR on socket "
         "failed when starting daemon: %s", strerror(errno));
 
     /* Set TCP_NODELAY; Exim does its own buffering. There is a switch to
     disable this because it breaks some broken clients. */
 
-    if (tcp_nodelay) setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
-      US (&on), sizeof(on));
+    if (tcp_nodelay) setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));
 
     /* Now bind the socket to the required port; if Exim is being restarted
     it may not always be possible to bind immediately, even with SO_REUSEADDR
@@ -1973,17 +1970,6 @@ if (f.running_in_test_harness || write_pid)
     DEBUG(D_any) debug_printf("%s pid file %s: %s\n", (operation == PID_WRITE) ? "write" : "check", pid_file_path, strerror(errno));
   }
 
-/* Add ancillary sockets to the set for select */
-
-#ifndef DISABLE_TLS
-if (tls_watch_fd >= 0)
-  add_listener_socket(tls_watch_fd, &select_listen, &listen_fd_max);
-#endif
-if (daemon_notifier_fd >= 0)
-  add_listener_socket(daemon_notifier_fd, &select_listen, &listen_fd_max);
-
-listen_fd_max++;
-
 /* Set up the handler for SIGHUP, which causes a restart of the daemon. */
 
 sighup_seen = FALSE;
@@ -2199,6 +2185,17 @@ spf_init();
 tls_daemon_init();
 #endif
 
+/* Add ancillary sockets to the set for select */
+
+#ifndef DISABLE_TLS
+if (tls_watch_fd >= 0)
+  add_listener_socket(tls_watch_fd, &select_listen, &listen_fd_max);
+#endif
+if (daemon_notifier_fd >= 0)
+  add_listener_socket(daemon_notifier_fd, &select_listen, &listen_fd_max);
+
+listen_fd_max++;
+
 /* Close the log so it can be renamed and moved. In the few cases below where
 this long-running process writes to the log (always exceptional conditions), it
 closes the log afterwards, for the same reason. */
@@ -2465,7 +2462,14 @@ for (;;)
 
 #ifndef DISABLE_TLS
       /* Create or rotate any required keys; handle (delayed) filewatch event */
-      tls_daemon_tick();
+      for (int old_tfd = tls_daemon_tick(); old_tfd >= 0; )
+       {
+       FD_CLR(old_tfd, &select_listen);
+       if (old_tfd == listen_fd_max - 1) listen_fd_max = old_tfd;
+       if (tls_watch_fd >= 0)
+         add_listener_socket(tls_watch_fd, &select_listen, &listen_fd_max);
+       break;
+       }
 #endif
       errno = select_errno;
       }
@@ -2504,7 +2508,7 @@ for (;;)
           if (FD_ISSET(lfd, &fds))
             {
            EXIM_SOCKLEN_T alen = sizeof(accepted);
-#if defined(TCP_INFO)
+#ifdef TCP_INFO
            struct tcp_info ti;
            socklen_t tlen = sizeof(ti);
 
@@ -2514,11 +2518,12 @@ for (;;)
            if (  smtp_backlog_monitor > 0
               && getsockopt(lfd, IPPROTO_TCP, TCP_INFO, &ti, &tlen) == 0)
              {
-             DEBUG(D_interface) debug_printf("listen fd %d queue max %u curr %u\n",
 # ifdef EXIM_HAVE_TCPI_UNACKED
+             DEBUG(D_interface) debug_printf("listen fd %d queue max %u curr %u\n",
                      lfd, ti.tcpi_sacked, ti.tcpi_unacked);
              smtp_listen_backlog = ti.tcpi_unacked;
 # elif defined(__FreeBSD__)    /* This does not work. Investigate kernel sourcecode. */
+             DEBUG(D_interface) debug_printf("listen fd %d queue max %u curr %u\n",
                      lfd, ti.__tcpi_sacked, ti.__tcpi_unacked);
              smtp_listen_backlog = ti.__tcpi_unacked;
 # endif