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:
Ben Noordhuis 2013-05-12 10:34:49 +02:00
parent 7d7fe6a9bc
commit 5879c61394
4 changed files with 66 additions and 187 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}