diff --git a/src/unix/pipe.c b/src/unix/pipe.c index a6145790..3d7ade60 100644 --- a/src/unix/pipe.c +++ b/src/unix/pipe.c @@ -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; } diff --git a/src/unix/stream.c b/src/unix/stream.c index 8a4e3e68..1e97625e 100644 --- a/src/unix/stream.c +++ b/src/unix/stream.c @@ -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; } diff --git a/src/unix/tcp.c b/src/unix/tcp.c index 1ed69d63..2c81ff08 100644 --- a/src/unix/tcp.c +++ b/src/unix/tcp.c @@ -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); } diff --git a/src/unix/udp.c b/src/unix/udp.c index 994cdf21..b19aebce 100644 --- a/src/unix/udp.c +++ b/src/unix/udp.c @@ -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; }