mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 13:04:23 -04:00
Turn our socketpair() replacement into its own function
This patch splits the formerly windows-only case of evutil_socketpair() into an (internal-use-only) function named evutil_ersatz_socketpair(), and makes it build and work right on non-Windows hosts. We need this for convenience to test sendfile on solaris, where socketpair can't give you an AF_INET pair, and sendfile() won't work on AF_UNIX.
This commit is contained in:
parent
de1f5d6d87
commit
57b30cd7cc
25
evutil.c
25
evutil.c
@ -145,6 +145,14 @@ evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
|
|||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
return socketpair(family, type, protocol, fd);
|
return socketpair(family, type, protocol, fd);
|
||||||
#else
|
#else
|
||||||
|
return evutil_ersatz_socketpair(family, type, protocol, fd);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
evutil_ersatz_socketpair(int family, int type, int protocol,
|
||||||
|
evutil_socket_t fd[2])
|
||||||
|
{
|
||||||
/* This code is originally from Tor. Used with permission. */
|
/* This code is originally from Tor. Used with permission. */
|
||||||
|
|
||||||
/* This socketpair does not work when localhost is down. So
|
/* This socketpair does not work when localhost is down. So
|
||||||
@ -152,12 +160,17 @@ evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
|
|||||||
* for now, and really, when localhost is down sometimes, we
|
* for now, and really, when localhost is down sometimes, we
|
||||||
* have other problems too.
|
* have other problems too.
|
||||||
*/
|
*/
|
||||||
|
#ifdef WIN32
|
||||||
|
#define ERR(e) WSA##e
|
||||||
|
#else
|
||||||
|
#define ERR(e) e
|
||||||
|
#endif
|
||||||
evutil_socket_t listener = -1;
|
evutil_socket_t listener = -1;
|
||||||
evutil_socket_t connector = -1;
|
evutil_socket_t connector = -1;
|
||||||
evutil_socket_t acceptor = -1;
|
evutil_socket_t acceptor = -1;
|
||||||
struct sockaddr_in listen_addr;
|
struct sockaddr_in listen_addr;
|
||||||
struct sockaddr_in connect_addr;
|
struct sockaddr_in connect_addr;
|
||||||
int size;
|
ev_socklen_t size;
|
||||||
int saved_errno = -1;
|
int saved_errno = -1;
|
||||||
|
|
||||||
if (protocol
|
if (protocol
|
||||||
@ -166,11 +179,11 @@ evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
|
|||||||
&& family != AF_UNIX
|
&& family != AF_UNIX
|
||||||
#endif
|
#endif
|
||||||
)) {
|
)) {
|
||||||
EVUTIL_SET_SOCKET_ERROR(WSAEAFNOSUPPORT);
|
EVUTIL_SET_SOCKET_ERROR(ERR(EAFNOSUPPORT));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!fd) {
|
if (!fd) {
|
||||||
EVUTIL_SET_SOCKET_ERROR(WSAEINVAL);
|
EVUTIL_SET_SOCKET_ERROR(ERR(EINVAL));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,10 +235,10 @@ evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
abort_tidy_up_and_fail:
|
abort_tidy_up_and_fail:
|
||||||
saved_errno = WSAECONNABORTED;
|
saved_errno = ERR(ECONNABORTED);
|
||||||
tidy_up_and_fail:
|
tidy_up_and_fail:
|
||||||
if (saved_errno < 0)
|
if (saved_errno < 0)
|
||||||
saved_errno = WSAGetLastError();
|
saved_errno = EVUTIL_SOCKET_ERROR();
|
||||||
if (listener != -1)
|
if (listener != -1)
|
||||||
evutil_closesocket(listener);
|
evutil_closesocket(listener);
|
||||||
if (connector != -1)
|
if (connector != -1)
|
||||||
@ -235,7 +248,7 @@ evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
|
|||||||
|
|
||||||
EVUTIL_SET_SOCKET_ERROR(saved_errno);
|
EVUTIL_SET_SOCKET_ERROR(saved_errno);
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#undef ERR
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -150,6 +150,8 @@ int evutil_socket_connect(evutil_socket_t *fd_ptr, struct sockaddr *sa, int sock
|
|||||||
|
|
||||||
int evutil_socket_finished_connecting(evutil_socket_t fd);
|
int evutil_socket_finished_connecting(evutil_socket_t fd);
|
||||||
|
|
||||||
|
int evutil_ersatz_socketpair(int, int , int, evutil_socket_t[]);
|
||||||
|
|
||||||
int evutil_resolve(int family, const char *hostname, struct sockaddr *sa,
|
int evutil_resolve(int family, const char *hostname, struct sockaddr *sa,
|
||||||
ev_socklen_t *socklen, int port);
|
ev_socklen_t *socklen, int port);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user