Mercurial > dovecot > core-2.2
comparison src/lib/net.c @ 16822:6a814345f16c
lib: Added net_listen_full() with a flag to set SO_REUSEPORT on the socket if available.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 23 Sep 2013 04:06:08 +0300 |
parents | 07cc79e0041d |
children | 93cf0434dda4 |
comparison
equal
deleted
inserted
replaced
16821:1a5d92b8d3d5 | 16822:6a814345f16c |
---|---|
382 #endif | 382 #endif |
383 } | 383 } |
384 | 384 |
385 int net_listen(const struct ip_addr *my_ip, unsigned int *port, int backlog) | 385 int net_listen(const struct ip_addr *my_ip, unsigned int *port, int backlog) |
386 { | 386 { |
387 enum net_listen_flags flags = 0; | |
388 | |
389 return net_listen_full(my_ip, port, &flags, backlog); | |
390 } | |
391 | |
392 int net_listen_full(const struct ip_addr *my_ip, unsigned int *port, | |
393 enum net_listen_flags *flags, int backlog) | |
394 { | |
387 union sockaddr_union so; | 395 union sockaddr_union so; |
388 int ret, fd, opt = 1; | 396 int ret, fd, opt = 1; |
389 socklen_t len; | 397 socklen_t len; |
390 | 398 |
391 memset(&so, 0, sizeof(so)); | 399 memset(&so, 0, sizeof(so)); |
410 } | 418 } |
411 | 419 |
412 /* set socket options */ | 420 /* set socket options */ |
413 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); | 421 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); |
414 setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)); | 422 setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)); |
423 | |
424 if ((*flags & NET_LISTEN_FLAG_REUSEPORT) != 0) { | |
425 #ifdef SO_REUSEPORT | |
426 if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, | |
427 &opt, sizeof(opt)) < 0) | |
428 #endif | |
429 *flags &= ~NET_LISTEN_FLAG_REUSEPORT; | |
430 } | |
415 | 431 |
416 /* If using IPv6, bind only to IPv6 if possible. This avoids | 432 /* If using IPv6, bind only to IPv6 if possible. This avoids |
417 ambiguities with IPv4-mapped IPv6 addresses. */ | 433 ambiguities with IPv4-mapped IPv6 addresses. */ |
418 #ifdef IPV6_V6ONLY | 434 #ifdef IPV6_V6ONLY |
419 if (so.sin.sin_family == AF_INET6) { | 435 if (so.sin.sin_family == AF_INET6) { |