#include <haproxy/api-t.h>
+#define SOCK_XFER_OPT_FOREIGN 0x000000001
+#define SOCK_XFER_OPT_V6ONLY 0x000000002
+
/* The list used to transfer sockets between old and new processes */
struct xfer_sock_list {
int fd;
- int options; /* socket options as LI_O_* */
+ int options; /* socket options as SOCK_XFER_OPT_* */
char *iface;
char *namespace;
int if_namelen;
/* determine the foreign status directly from the socket itself */
if (sock_inet_is_foreign(fd, xfer_sock->addr.ss_family))
- xfer_sock->options |= LI_O_FOREIGN;
+ xfer_sock->options |= SOCK_XFER_OPT_FOREIGN;
#if defined(IPV6_V6ONLY)
/* keep only the v6only flag depending on what's currently
socklen = sizeof(val);
if (xfer_sock->addr.ss_family == AF_INET6 &&
getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, &socklen) == 0 && val > 0)
- xfer_sock->options |= LI_O_V6ONLY;
+ xfer_sock->options |= SOCK_XFER_OPT_V6ONLY;
#endif
xfer_sock->fd = fd;
int sock_find_compatible_fd(const struct listener *l)
{
struct xfer_sock_list *xfer_sock = xfer_sock_list;
- int options = l->options & (LI_O_FOREIGN | LI_O_V6ONLY | LI_O_V4V6);
+ int options = 0;
int if_namelen = 0;
int ns_namelen = 0;
int ret = -1;
if (!l->proto->addrcmp)
return -1;
+ if (l->options & LI_O_FOREIGN)
+ options |= SOCK_XFER_OPT_FOREIGN;
+
if (l->addr.ss_family == AF_INET6) {
/* Prepare to match the v6only option against what we really want. Note
* that sadly the two options are not exclusive to each other and that
* v6only is stronger than v4v6.
*/
- if ((options & LI_O_V6ONLY) || (sock_inet6_v6only_default && !(options & LI_O_V4V6)))
- options |= LI_O_V6ONLY;
- else if ((options & LI_O_V4V6) || !sock_inet6_v6only_default)
- options &= ~LI_O_V6ONLY;
+ if ((l->options & LI_O_V6ONLY) ||
+ (sock_inet6_v6only_default && !(l->options & LI_O_V4V6)))
+ options |= SOCK_XFER_OPT_V6ONLY;
}
- options &= ~LI_O_V4V6;
if (l->interface)
if_namelen = strlen(l->interface);
#endif
while (xfer_sock) {
- if (((options ^ xfer_sock->options) & (LI_O_FOREIGN | LI_O_V6ONLY)) == 0 &&
+ if ((options == xfer_sock->options) &&
(if_namelen == xfer_sock->if_namelen) &&
(ns_namelen == xfer_sock->ns_namelen) &&
(!if_namelen || strcmp(l->interface, xfer_sock->iface) == 0) &&