summaryrefslogtreecommitdiff
path: root/listener.c
diff options
context:
space:
mode:
authoryuangongji <82787816@qq.com>2019-10-12 18:45:52 +0800
committerAzat Khuzhin <azat@libevent.org>2019-10-14 23:23:56 +0300
commitdda8968c71f684235abb3cf6c26810751bf2c31a (patch)
treee352f79595c964725d57cb2a0829c80f87482dc5 /listener.c
parent11bdd41c562f984d15a9f301e11363d9a48ef6bf (diff)
downloadlibevent-dda8968c71f684235abb3cf6c26810751bf2c31a.tar.gz
evutil: implement socketpair with unix domain socket on Win10
Diffstat (limited to 'listener.c')
-rw-r--r--listener.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/listener.c b/listener.c
index f5c00c9c..bf55f7b5 100644
--- a/listener.c
+++ b/listener.c
@@ -39,6 +39,9 @@
#include <ws2tcpip.h>
#include <mswsock.h>
#endif
+#ifdef EVENT__HAVE_AFUNIX_H
+#include <afunix.h>
+#endif
#include <errno.h>
#ifdef EVENT__HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -217,6 +220,7 @@ evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb,
int on = 1;
int family = sa ? sa->sa_family : AF_UNSPEC;
int socktype = SOCK_STREAM | EVUTIL_SOCK_NONBLOCK;
+ int support_keepalive = 1;
if (backlog == 0)
return NULL;
@@ -228,8 +232,17 @@ evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb,
if (fd == -1)
return NULL;
- if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))<0)
- goto err;
+#if defined(_WIN32) && defined(EVENT__HAVE_AFUNIX_H)
+ if (family == AF_UNIX && evutil_check_working_afunix_()) {
+ /* AF_UNIX socket can't set SO_KEEPALIVE option on Win10.
+ * Avoid 10042 error. */
+ support_keepalive = 0;
+ }
+#endif
+ if (support_keepalive) {
+ if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))<0)
+ goto err;
+ }
if (flags & LEV_OPT_REUSEABLE) {
if (evutil_make_listen_socket_reuseable(fd) < 0)
@@ -504,6 +517,10 @@ new_accepting_socket(struct evconnlistener_iocp *lev, int family)
addrlen = sizeof(struct sockaddr_in);
else if (family == AF_INET6)
addrlen = sizeof(struct sockaddr_in6);
+#ifdef EVENT__HAVE_AFUNIX_H
+ else if (family == AF_UNIX && evutil_check_working_afunix_())
+ addrlen = sizeof(struct sockaddr_un);
+#endif
else
return NULL;
buflen = (addrlen+16)*2;