static bool
rspamd_maybe_reuseport_socket (struct rspamd_worker_listen_socket *ls)
{
- if (ls->fd == -1 || ls->is_systemd ||
- rspamd_inet_address_get_af (ls->addr) == AF_UNIX) {
- return false;
+ gint nfd = -1;
+
+ if (ls->fd == -1 || ls->is_systemd) {
+ /* No need to reuseport */
+ return true;
+ }
+
+ if (rspamd_inet_address_get_af (ls->addr) == AF_UNIX) {
+ /* Just try listen */
+
+ if (listen (ls->fd, -1) == -1) {
+ return false;
+ }
+
+ return true;
}
#if defined(SO_REUSEPORT) && defined(SO_REUSEADDR)
- gint nfd;
nfd = rspamd_inet_address_listen (ls->addr,
(ls->type == RSPAMD_WORKER_SOCKET_UDP ? SOCK_DGRAM : SOCK_STREAM),
if (nfd == -1) {
msg_warn ("cannot create reuseport listen socket for %d: %s",
ls->fd, strerror (errno));
+ nfd = ls->fd;
}
else {
close (ls->fd);
ls->fd = nfd;
+ nfd = -1;
}
#else
-
+ nfd = ls->fd;
#endif
- return false;
+ /* This means that we have an fd with no listening enabled */
+ if (nfd != -1) {
+ if (listen (nfd, -1) == -1) {
+ return false;
+ }
+ }
+
+ return true;
}
/**
}
}
- if (type != (int)SOCK_DGRAM) {
+ if (addr->af == AF_UNIX) {
+ path = addr->u.un->addr.sun_path;
+ /* Try to set mode and owner */
- if (addr->af == AF_UNIX) {
- path = addr->u.un->addr.sun_path;
- /* Try to set mode and owner */
-
- if (addr->u.un->owner != (uid_t)-1 || addr->u.un->group != (gid_t)-1) {
- if (chown (path, addr->u.un->owner, addr->u.un->group) == -1) {
- msg_info ("cannot change owner for %s to %d:%d: %s",
- path, addr->u.un->owner, addr->u.un->group,
- strerror (errno));
- }
+ if (addr->u.un->owner != (uid_t)-1 || addr->u.un->group != (gid_t)-1) {
+ if (chown (path, addr->u.un->owner, addr->u.un->group) == -1) {
+ msg_info ("cannot change owner for %s to %d:%d: %s",
+ path, addr->u.un->owner, addr->u.un->group,
+ strerror (errno));
}
+ }
- if (chmod (path, addr->u.un->mode) == -1) {
- msg_info ("cannot change mode for %s to %od %s",
- path, addr->u.un->mode, strerror (errno));
- }
+ if (chmod (path, addr->u.un->mode) == -1) {
+ msg_info ("cannot change mode for %s to %od %s",
+ path, addr->u.un->mode, strerror (errno));
}
+ }
- r = listen (fd, listen_queue);
+ if (type != (int)SOCK_DGRAM) {
- if (r == -1) {
- msg_warn ("listen %s failed: %d, '%s'",
- rspamd_inet_address_to_string_pretty (addr),
- errno, strerror (errno));
+ if (!(opts & RSPAMD_INET_ADDRESS_LISTEN_NOLISTEN)) {
+ r = listen (fd, listen_queue);
- goto err;
+ if (r == -1) {
+ msg_warn ("listen %s failed: %d, '%s'",
+ rspamd_inet_address_to_string_pretty (addr),
+ errno, strerror (errno));
+
+ goto err;
+ }
}
}
GList *result = NULL;
gint fd;
guint i;
+ static const int listen_opts = RSPAMD_INET_ADDRESS_LISTEN_ASYNC|
+ RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT|
+ RSPAMD_INET_ADDRESS_LISTEN_NOLISTEN;
struct rspamd_worker_listen_socket *ls;
g_ptr_array_sort (addrs, rspamd_inet_address_compare_ptr);
if (listen_type & RSPAMD_WORKER_SOCKET_TCP) {
fd = rspamd_inet_address_listen (g_ptr_array_index (addrs, i),
SOCK_STREAM,
- RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, -1);
+ listen_opts, -1);
if (fd != -1) {
ls = g_malloc0 (sizeof (*ls));
ls->addr = rspamd_inet_address_copy (g_ptr_array_index (addrs, i));
if (listen_type & RSPAMD_WORKER_SOCKET_UDP) {
fd = rspamd_inet_address_listen (g_ptr_array_index (addrs, i),
SOCK_DGRAM,
- RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, -1);
+ listen_opts, -1);
if (fd != -1) {
ls = g_malloc0 (sizeof (*ls));
ls->addr = rspamd_inet_address_copy (g_ptr_array_index (addrs, i));