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;
#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 */
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
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;
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. */
if (FD_ISSET(lfd, &fds))
{
EXIM_SOCKLEN_T alen = sizeof(accepted);
+#ifdef TCP_INFO
struct tcp_info ti;
socklen_t tlen = sizeof(ti);
/* If monitoring the backlog is wanted, grab for later logging */
smtp_listen_backlog = 0;
-#if defined(TCP_INFO)
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