unix: remove errno preserving code
Remove the errno preserving code. Libuv only implemented it in a haphazard way and there seems to be a general consensus that no one really cares anyway. Therefore, remove it.
This commit is contained in:
parent
7d7fe6a9bc
commit
5879c61394
@ -45,12 +45,10 @@ int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) {
|
||||
int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
|
||||
struct sockaddr_un saddr;
|
||||
const char* pipe_fname;
|
||||
int saved_errno;
|
||||
int sockfd;
|
||||
int status;
|
||||
int bound;
|
||||
|
||||
saved_errno = errno;
|
||||
pipe_fname = NULL;
|
||||
sockfd = -1;
|
||||
status = -1;
|
||||
@ -105,35 +103,22 @@ out:
|
||||
free((void*)pipe_fname);
|
||||
}
|
||||
|
||||
errno = saved_errno;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
|
||||
int saved_errno;
|
||||
int status;
|
||||
if (uv__stream_fd(handle) == -1)
|
||||
return uv__set_artificial_error(handle->loop, UV_EINVAL);
|
||||
|
||||
saved_errno = errno;
|
||||
status = -1;
|
||||
|
||||
if (uv__stream_fd(handle) == -1) {
|
||||
uv__set_artificial_error(handle->loop, UV_EINVAL);
|
||||
goto out;
|
||||
}
|
||||
assert(uv__stream_fd(handle) >= 0);
|
||||
if (listen(uv__stream_fd(handle), backlog))
|
||||
return uv__set_sys_error(handle->loop, errno);
|
||||
|
||||
if ((status = listen(uv__stream_fd(handle), backlog)) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
} else {
|
||||
handle->connection_cb = cb;
|
||||
handle->io_watcher.cb = uv__pipe_accept;
|
||||
uv__io_start(handle->loop, &handle->io_watcher, UV__POLLIN);
|
||||
}
|
||||
|
||||
out:
|
||||
errno = saved_errno;
|
||||
return status;
|
||||
handle->connection_cb = cb;
|
||||
handle->io_watcher.cb = uv__pipe_accept;
|
||||
uv__io_start(handle->loop, &handle->io_watcher, UV__POLLIN);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -171,12 +156,10 @@ void uv_pipe_connect(uv_connect_t* req,
|
||||
const char* name,
|
||||
uv_connect_cb cb) {
|
||||
struct sockaddr_un saddr;
|
||||
int saved_errno;
|
||||
int new_sock;
|
||||
int err;
|
||||
int r;
|
||||
|
||||
saved_errno = errno;
|
||||
new_sock = (uv__stream_fd(handle) == -1);
|
||||
err = -1;
|
||||
|
||||
@ -223,19 +206,15 @@ out:
|
||||
/* Mimic the Windows pipe implementation, always
|
||||
* return 0 and let the callback handle errors.
|
||||
*/
|
||||
errno = saved_errno;
|
||||
}
|
||||
|
||||
|
||||
/* TODO merge with uv__server_io()? */
|
||||
static void uv__pipe_accept(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
|
||||
uv_pipe_t* pipe;
|
||||
int saved_errno;
|
||||
int sockfd;
|
||||
|
||||
saved_errno = errno;
|
||||
pipe = container_of(w, uv_pipe_t, io_watcher);
|
||||
|
||||
assert(pipe->type == UV_NAMED_PIPE);
|
||||
|
||||
sockfd = uv__accept(uv__stream_fd(pipe));
|
||||
@ -252,8 +231,6 @@ static void uv__pipe_accept(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
|
||||
uv__io_stop(pipe->loop, &pipe->io_watcher, UV__POLLIN);
|
||||
}
|
||||
}
|
||||
|
||||
errno = saved_errno;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -536,19 +536,11 @@ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
|
||||
|
||||
|
||||
int uv_accept(uv_stream_t* server, uv_stream_t* client) {
|
||||
int saved_errno;
|
||||
int status;
|
||||
|
||||
/* TODO document this */
|
||||
assert(server->loop == client->loop);
|
||||
|
||||
saved_errno = errno;
|
||||
status = -1;
|
||||
|
||||
if (server->accepted_fd < 0) {
|
||||
uv__set_sys_error(server->loop, EAGAIN);
|
||||
goto out;
|
||||
}
|
||||
if (server->accepted_fd == -1)
|
||||
return uv__set_sys_error(server->loop, EAGAIN);
|
||||
|
||||
switch (client->type) {
|
||||
case UV_NAMED_PIPE:
|
||||
@ -559,7 +551,7 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) {
|
||||
/* TODO handle error */
|
||||
close(server->accepted_fd);
|
||||
server->accepted_fd = -1;
|
||||
goto out;
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -567,7 +559,7 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) {
|
||||
if (uv_udp_open((uv_udp_t*) client, server->accepted_fd)) {
|
||||
close(server->accepted_fd);
|
||||
server->accepted_fd = -1;
|
||||
goto out;
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -577,11 +569,7 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) {
|
||||
|
||||
uv__io_start(server->loop, &server->io_watcher, UV__POLLIN);
|
||||
server->accepted_fd = -1;
|
||||
status = 0;
|
||||
|
||||
out:
|
||||
errno = saved_errno;
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -151,77 +151,47 @@ int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) {
|
||||
}
|
||||
|
||||
|
||||
int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name,
|
||||
int* namelen) {
|
||||
int uv_tcp_getsockname(uv_tcp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
socklen_t socklen;
|
||||
int saved_errno;
|
||||
int rv = 0;
|
||||
|
||||
/* Don't clobber errno. */
|
||||
saved_errno = errno;
|
||||
if (handle->delayed_error)
|
||||
return uv__set_sys_error(handle->loop, handle->delayed_error);
|
||||
|
||||
if (handle->delayed_error) {
|
||||
uv__set_sys_error(handle->loop, handle->delayed_error);
|
||||
rv = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (uv__stream_fd(handle) < 0) {
|
||||
uv__set_sys_error(handle->loop, EINVAL);
|
||||
rv = -1;
|
||||
goto out;
|
||||
}
|
||||
if (uv__stream_fd(handle) < 0)
|
||||
return uv__set_sys_error(handle->loop, EINVAL);
|
||||
|
||||
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
||||
socklen = (socklen_t)*namelen;
|
||||
socklen = (socklen_t) *namelen;
|
||||
|
||||
if (getsockname(uv__stream_fd(handle), name, &socklen) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
rv = -1;
|
||||
} else {
|
||||
*namelen = (int)socklen;
|
||||
}
|
||||
if (getsockname(uv__stream_fd(handle), name, &socklen) == -1)
|
||||
return uv__set_sys_error(handle->loop, errno);
|
||||
|
||||
out:
|
||||
errno = saved_errno;
|
||||
return rv;
|
||||
*namelen = (int) socklen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name,
|
||||
int* namelen) {
|
||||
int uv_tcp_getpeername(uv_tcp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
socklen_t socklen;
|
||||
int saved_errno;
|
||||
int rv = 0;
|
||||
|
||||
/* Don't clobber errno. */
|
||||
saved_errno = errno;
|
||||
if (handle->delayed_error)
|
||||
return uv__set_sys_error(handle->loop, handle->delayed_error);
|
||||
|
||||
if (handle->delayed_error) {
|
||||
uv__set_sys_error(handle->loop, handle->delayed_error);
|
||||
rv = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (uv__stream_fd(handle) < 0) {
|
||||
uv__set_sys_error(handle->loop, EINVAL);
|
||||
rv = -1;
|
||||
goto out;
|
||||
}
|
||||
if (uv__stream_fd(handle) < 0)
|
||||
return uv__set_sys_error(handle->loop, EINVAL);
|
||||
|
||||
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
||||
socklen = (socklen_t)*namelen;
|
||||
socklen = (socklen_t) *namelen;
|
||||
|
||||
if (getpeername(uv__stream_fd(handle), name, &socklen) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
rv = -1;
|
||||
} else {
|
||||
*namelen = (int)socklen;
|
||||
}
|
||||
if (getpeername(uv__stream_fd(handle), name, &socklen) == -1)
|
||||
return uv__set_sys_error(handle->loop, errno);
|
||||
|
||||
out:
|
||||
errno = saved_errno;
|
||||
return rv;
|
||||
*namelen = (int) socklen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -259,14 +229,7 @@ int uv__tcp_connect(uv_connect_t* req,
|
||||
uv_tcp_t* handle,
|
||||
struct sockaddr_in addr,
|
||||
uv_connect_cb cb) {
|
||||
int saved_errno;
|
||||
int status;
|
||||
|
||||
saved_errno = errno;
|
||||
status = uv__connect(req, handle, (struct sockaddr*)&addr, sizeof addr, cb);
|
||||
errno = saved_errno;
|
||||
|
||||
return status;
|
||||
return uv__connect(req, handle, (struct sockaddr*) &addr, sizeof addr, cb);
|
||||
}
|
||||
|
||||
|
||||
@ -274,14 +237,7 @@ int uv__tcp_connect6(uv_connect_t* req,
|
||||
uv_tcp_t* handle,
|
||||
struct sockaddr_in6 addr,
|
||||
uv_connect_cb cb) {
|
||||
int saved_errno;
|
||||
int status;
|
||||
|
||||
saved_errno = errno;
|
||||
status = uv__connect(req, handle, (struct sockaddr*)&addr, sizeof addr, cb);
|
||||
errno = saved_errno;
|
||||
|
||||
return status;
|
||||
return uv__connect(req, handle, (struct sockaddr*) &addr, sizeof addr, cb);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -291,36 +291,27 @@ static int uv__bind(uv_udp_t* handle,
|
||||
struct sockaddr* addr,
|
||||
socklen_t len,
|
||||
unsigned flags) {
|
||||
int saved_errno;
|
||||
int status;
|
||||
int yes;
|
||||
int fd;
|
||||
|
||||
saved_errno = errno;
|
||||
status = -1;
|
||||
fd = -1;
|
||||
|
||||
/* Check for bad flags. */
|
||||
if (flags & ~UV_UDP_IPV6ONLY) {
|
||||
uv__set_sys_error(handle->loop, EINVAL);
|
||||
goto out;
|
||||
}
|
||||
if (flags & ~UV_UDP_IPV6ONLY)
|
||||
return uv__set_sys_error(handle->loop, EINVAL);
|
||||
|
||||
/* Cannot set IPv6-only mode on non-IPv6 socket. */
|
||||
if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6) {
|
||||
uv__set_sys_error(handle->loop, EINVAL);
|
||||
goto out;
|
||||
}
|
||||
if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6)
|
||||
return uv__set_sys_error(handle->loop, EINVAL);
|
||||
|
||||
if (handle->io_watcher.fd == -1) {
|
||||
if ((fd = uv__socket(domain, SOCK_DGRAM, 0)) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
goto out;
|
||||
}
|
||||
fd = handle->io_watcher.fd;
|
||||
if (fd == -1) {
|
||||
fd = uv__socket(domain, SOCK_DGRAM, 0);
|
||||
if (fd == -1)
|
||||
return uv__set_sys_error(handle->loop, errno);
|
||||
handle->io_watcher.fd = fd;
|
||||
}
|
||||
|
||||
fd = handle->io_watcher.fd;
|
||||
yes = 1;
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
@ -361,17 +352,12 @@ static int uv__bind(uv_udp_t* handle,
|
||||
goto out;
|
||||
}
|
||||
|
||||
handle->io_watcher.fd = fd;
|
||||
status = 0;
|
||||
return 0;
|
||||
|
||||
out:
|
||||
if (status) {
|
||||
close(handle->io_watcher.fd);
|
||||
handle->io_watcher.fd = -1;
|
||||
}
|
||||
|
||||
errno = saved_errno;
|
||||
return status;
|
||||
close(handle->io_watcher.fd);
|
||||
handle->io_watcher.fd = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@ -479,24 +465,15 @@ int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) {
|
||||
|
||||
|
||||
int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
|
||||
int saved_errno;
|
||||
int status;
|
||||
int yes;
|
||||
|
||||
saved_errno = errno;
|
||||
status = -1;
|
||||
|
||||
/* Check for already active socket. */
|
||||
if (handle->io_watcher.fd != -1) {
|
||||
uv__set_artificial_error(handle->loop, UV_EALREADY);
|
||||
goto out;
|
||||
}
|
||||
if (handle->io_watcher.fd != -1)
|
||||
return uv__set_artificial_error(handle->loop, UV_EALREADY);
|
||||
|
||||
yes = 1;
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
goto out;
|
||||
}
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) == -1)
|
||||
return uv__set_sys_error(handle->loop, errno);
|
||||
|
||||
/* On the BSDs, SO_REUSEADDR lets you reuse an address that's in the TIME_WAIT
|
||||
* state (i.e. was until recently tied to a socket) while SO_REUSEPORT lets
|
||||
@ -508,18 +485,12 @@ int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
|
||||
*/
|
||||
#ifdef SO_REUSEPORT
|
||||
yes = 1;
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof yes) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
goto out;
|
||||
}
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof yes) == -1)
|
||||
return uv__set_sys_error(handle->loop, errno);
|
||||
#endif
|
||||
|
||||
handle->io_watcher.fd = sock;
|
||||
status = 0;
|
||||
|
||||
out:
|
||||
errno = saved_errno;
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -616,31 +587,18 @@ int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) {
|
||||
|
||||
int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name, int* namelen) {
|
||||
socklen_t socklen;
|
||||
int saved_errno;
|
||||
int rv = 0;
|
||||
|
||||
/* Don't clobber errno. */
|
||||
saved_errno = errno;
|
||||
|
||||
if (handle->io_watcher.fd == -1) {
|
||||
uv__set_sys_error(handle->loop, EINVAL);
|
||||
rv = -1;
|
||||
goto out;
|
||||
}
|
||||
if (handle->io_watcher.fd == -1)
|
||||
return uv__set_sys_error(handle->loop, EINVAL);
|
||||
|
||||
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
||||
socklen = (socklen_t)*namelen;
|
||||
socklen = (socklen_t) *namelen;
|
||||
|
||||
if (getsockname(handle->io_watcher.fd, name, &socklen) == -1) {
|
||||
uv__set_sys_error(handle->loop, errno);
|
||||
rv = -1;
|
||||
} else {
|
||||
*namelen = (int)socklen;
|
||||
}
|
||||
if (getsockname(handle->io_watcher.fd, name, &socklen) == -1)
|
||||
return uv__set_sys_error(handle->loop, errno);
|
||||
|
||||
out:
|
||||
errno = saved_errno;
|
||||
return rv;
|
||||
*namelen = (int) socklen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user