fd_max = SD_LISTEN_FDS_START + sd_fds - 1;
for (fd = SD_LISTEN_FDS_START; fd <= fd_max; fd++) {
- if (sd_is_socket_inet(fd, ip->family, SOCK_STREAM, 1, port)) {
+ if (sd_is_socket_inet(fd, ip->family, SOCK_STREAM, 1, port) > 0) {
*fd_r = fd;
return 0;
}
}
#ifdef HAVE_SYSTEMD
-static int get_socket_info(int fd, unsigned int *family, in_port_t *port)
+static int get_socket_info(int fd, sa_family_t *family_r, in_port_t *port_r)
{
union sockaddr_union {
struct sockaddr sa;
} sockaddr;
socklen_t l;
- // FIXME(Stephan): why -1?
- if (port) *port = -1;
- if (family) *family = -1;
+ if (port_r != NULL)
+ *port_r = 0;
+ if (family_r != NULL)
+ *family_r = AF_UNSPEC;
i_zero(&sockaddr);
l = sizeof(sockaddr);
if (getsockname(fd, &sockaddr.sa, &l) < 0)
return -errno;
- if (family) *family = sockaddr.sa.sa_family;
- if (port) {
+ if (family_r != NULL)
+ *family_r = sockaddr.sa.sa_family;
+ if (port_r != NULL) {
if (sockaddr.sa.sa_family == AF_INET) {
if (l < sizeof(struct sockaddr_in))
return -EINVAL;
- *port = ntohs(sockaddr.in4.sin_port);
+ *port_r = ntohs(sockaddr.in4.sin_port);
} else {
if (l < sizeof(struct sockaddr_in6))
return -EINVAL;
- *port = ntohs(sockaddr.in6.sin6_port);
+ *port_r = ntohs(sockaddr.in6.sin6_port);
}
}
return 0;
fd_max = SD_LISTEN_FDS_START + sd_fds - 1;
for (fd = SD_LISTEN_FDS_START; fd <= fd_max; fd++) {
if (sd_is_socket_inet(fd, 0, SOCK_STREAM, 1, 0) > 0) {
- int found = FALSE;
+ bool found = FALSE;
in_port_t port;
- unsigned int family;
+ sa_family_t family;
get_socket_info(fd, &family, &port);
array_foreach(&service_list->services, services) {
break;
}
}
- if (found) break;
+ if (found)
+ break;
}
if (!found) {
- i_error("systemd listens on port %d, but it's not configured in Dovecot. Closing.",port);
- if (shutdown(fd, SHUT_RDWR) < 0 && errno != ENOTCONN)
- i_error("shutdown() failed: %m");
+ i_error("systemd listens on port %d, "
+ "but it's not configured in Dovecot. "
+ "Closing.", port);
+ if (shutdown(fd, SHUT_RDWR) < 0 &&
+ errno != ENOTCONN)
+ i_error("shutdown(%d) failed: %m", fd);
if (dup2(dev_null_fd, fd) < 0)
- i_error("dup2() failed: %m");
+ i_error("dup2(%d, %d) failed: %m",
+ dev_null_fd, fd);
}
}
}