aboutsummaryrefslogtreecommitdiff
path: root/deps/uv/src/unix/udp.c
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2013-07-16 21:04:31 +0200
committerBen Noordhuis <info@bnoordhuis.nl>2013-07-20 12:04:35 +0200
commit0e48cb4998a89a2adae95d97f3bce5f89c77d762 (patch)
tree754bf7e9765fbeb8f0fe9418d9d399335c7c7af8 /deps/uv/src/unix/udp.c
parent221c689ebbac9bda42c005b7f0278ce420766b22 (diff)
downloadandroid-node-v8-0e48cb4998a89a2adae95d97f3bce5f89c77d762.tar.gz
android-node-v8-0e48cb4998a89a2adae95d97f3bce5f89c77d762.tar.bz2
android-node-v8-0e48cb4998a89a2adae95d97f3bce5f89c77d762.zip
deps: upgrade libuv to 3ee4d3f
Diffstat (limited to 'deps/uv/src/unix/udp.c')
-rw-r--r--deps/uv/src/unix/udp.c113
1 files changed, 54 insertions, 59 deletions
diff --git a/deps/uv/src/unix/udp.c b/deps/uv/src/unix/udp.c
index b19aebce97..72a4acf9b7 100644
--- a/deps/uv/src/unix/udp.c
+++ b/deps/uv/src/unix/udp.c
@@ -72,10 +72,8 @@ void uv__udp_finish_close(uv_udp_t* handle) {
free(req->bufs);
req->bufs = NULL;
- if (req->send_cb) {
- uv__set_artificial_error(handle->loop, UV_ECANCELED);
- req->send_cb(req, -1);
- }
+ if (req->send_cb != NULL)
+ req->send_cb(req, -ECANCELED);
}
/* Now tear down the handle. */
@@ -163,13 +161,10 @@ static void uv__udp_run_completed(uv_udp_t* handle) {
/* req->status >= 0 == bytes written
* req->status < 0 == errno
*/
- if (req->status >= 0) {
+ if (req->status >= 0)
req->send_cb(req, 0);
- }
- else {
- uv__set_sys_error(handle->loop, -req->status);
- req->send_cb(req, -1);
- }
+ else
+ req->send_cb(req, req->status);
}
}
@@ -224,14 +219,10 @@ static void uv__udp_recvmsg(uv_loop_t* loop,
while (nread == -1 && errno == EINTR);
if (nread == -1) {
- if (errno == EAGAIN || errno == EWOULDBLOCK) {
- uv__set_sys_error(handle->loop, EAGAIN);
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
handle->recv_cb(handle, 0, buf, NULL, 0);
- }
- else {
- uv__set_sys_error(handle->loop, errno);
- handle->recv_cb(handle, -1, buf, NULL, 0);
- }
+ else
+ handle->recv_cb(handle, -errno, buf, NULL, 0);
}
else {
flags = 0;
@@ -291,30 +282,32 @@ static int uv__bind(uv_udp_t* handle,
struct sockaddr* addr,
socklen_t len,
unsigned flags) {
+ int err;
int yes;
int fd;
+ err = -EINVAL;
fd = -1;
/* Check for bad flags. */
if (flags & ~UV_UDP_IPV6ONLY)
- return uv__set_sys_error(handle->loop, EINVAL);
+ return -EINVAL;
/* Cannot set IPv6-only mode on non-IPv6 socket. */
if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6)
- return uv__set_sys_error(handle->loop, EINVAL);
+ return -EINVAL;
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);
+ return -errno;
handle->io_watcher.fd = fd;
}
yes = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) == -1) {
- uv__set_sys_error(handle->loop, errno);
+ err = -errno;
goto out;
}
@@ -329,7 +322,7 @@ static int uv__bind(uv_udp_t* handle,
#ifdef SO_REUSEPORT
yes = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof yes) == -1) {
- uv__set_sys_error(handle->loop, errno);
+ err = -errno;
goto out;
}
#endif
@@ -338,17 +331,17 @@ static int uv__bind(uv_udp_t* handle,
#ifdef IPV6_V6ONLY
yes = 1;
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) {
- uv__set_sys_error(handle->loop, errno);
+ err = -errno;
goto out;
}
#else
- uv__set_sys_error(handle->loop, ENOTSUP);
+ err = -ENOTSUP;
goto out;
#endif
}
if (bind(fd, addr, len) == -1) {
- uv__set_sys_error(handle->loop, errno);
+ err = -errno;
goto out;
}
@@ -357,7 +350,7 @@ static int uv__bind(uv_udp_t* handle,
out:
close(handle->io_watcher.fd);
handle->io_watcher.fd = -1;
- return -1;
+ return err;
}
@@ -405,10 +398,13 @@ static int uv__send(uv_udp_send_t* req,
struct sockaddr* addr,
socklen_t addrlen,
uv_udp_send_cb send_cb) {
+ int err;
+
assert(bufcnt > 0);
- if (uv__udp_maybe_deferred_bind(handle, addr->sa_family))
- return -1;
+ err = uv__udp_maybe_deferred_bind(handle, addr->sa_family);
+ if (err)
+ return err;
uv__req_init(handle->loop, req, UV_UDP_SEND);
@@ -418,13 +414,13 @@ static int uv__send(uv_udp_send_t* req,
req->handle = handle;
req->bufcnt = bufcnt;
- if (bufcnt <= (int) ARRAY_SIZE(req->bufsml)) {
+ if (bufcnt <= (int) ARRAY_SIZE(req->bufsml))
req->bufs = req->bufsml;
- }
- else if ((req->bufs = malloc(bufcnt * sizeof(bufs[0]))) == NULL) {
- uv__set_sys_error(handle->loop, ENOMEM);
- return -1;
- }
+ else
+ req->bufs = malloc(bufcnt * sizeof(*bufs));
+
+ if (req->bufs == NULL)
+ return -ENOMEM;
memcpy(req->bufs, bufs, bufcnt * sizeof(bufs[0]));
QUEUE_INSERT_TAIL(&handle->write_queue, &req->queue);
@@ -469,11 +465,11 @@ int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
/* Check for already active socket. */
if (handle->io_watcher.fd != -1)
- return uv__set_artificial_error(handle->loop, UV_EALREADY);
+ return -EALREADY; /* FIXME(bnoordhuis) Should be -EBUSY. */
yes = 1;
- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) == -1)
- return uv__set_sys_error(handle->loop, errno);
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes))
+ return -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
@@ -485,8 +481,8 @@ 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)
- return uv__set_sys_error(handle->loop, errno);
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof yes))
+ return -errno;
#endif
handle->io_watcher.fd = sock;
@@ -519,7 +515,7 @@ int uv_udp_set_membership(uv_udp_t* handle,
optname = IP_DROP_MEMBERSHIP;
break;
default:
- return uv__set_artificial_error(handle->loop, UV_EINVAL);
+ return -EINVAL;
}
if (setsockopt(handle->io_watcher.fd,
@@ -527,7 +523,7 @@ int uv_udp_set_membership(uv_udp_t* handle,
optname,
&mreq,
sizeof(mreq))) {
- return uv__set_sys_error(handle->loop, errno);
+ return -errno;
}
return 0;
@@ -542,10 +538,10 @@ static int uv__setsockopt_maybe_char(uv_udp_t* handle, int option, int val) {
#endif
if (val < 0 || val > 255)
- return uv__set_sys_error(handle->loop, EINVAL);
+ return -EINVAL;
if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, option, &arg, sizeof(arg)))
- return uv__set_sys_error(handle->loop, errno);
+ return -errno;
return 0;
}
@@ -557,7 +553,7 @@ int uv_udp_set_broadcast(uv_udp_t* handle, int on) {
SO_BROADCAST,
&on,
sizeof(on))) {
- return uv__set_sys_error(handle->loop, errno);
+ return -errno;
}
return 0;
@@ -566,10 +562,10 @@ int uv_udp_set_broadcast(uv_udp_t* handle, int on) {
int uv_udp_set_ttl(uv_udp_t* handle, int ttl) {
if (ttl < 1 || ttl > 255)
- return uv__set_sys_error(handle->loop, EINVAL);
+ return -EINVAL;
if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)))
- return uv__set_sys_error(handle->loop, errno);
+ return -errno;
return 0;
}
@@ -589,13 +585,13 @@ int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name, int* namelen) {
socklen_t socklen;
if (handle->io_watcher.fd == -1)
- return uv__set_sys_error(handle->loop, EINVAL);
+ return -EINVAL; /* FIXME(bnoordhuis) -EBADF */
/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t) *namelen;
- if (getsockname(handle->io_watcher.fd, name, &socklen) == -1)
- return uv__set_sys_error(handle->loop, errno);
+ if (getsockname(handle->io_watcher.fd, name, &socklen))
+ return -errno;
*namelen = (int) socklen;
return 0;
@@ -637,18 +633,17 @@ int uv__udp_send6(uv_udp_send_t* req,
int uv__udp_recv_start(uv_udp_t* handle,
uv_alloc_cb alloc_cb,
uv_udp_recv_cb recv_cb) {
- if (alloc_cb == NULL || recv_cb == NULL) {
- uv__set_artificial_error(handle->loop, UV_EINVAL);
- return -1;
- }
+ int err;
- if (uv__io_active(&handle->io_watcher, UV__POLLIN)) {
- uv__set_artificial_error(handle->loop, UV_EALREADY);
- return -1;
- }
+ if (alloc_cb == NULL || recv_cb == NULL)
+ return -EINVAL;
+
+ if (uv__io_active(&handle->io_watcher, UV__POLLIN))
+ return -EALREADY; /* FIXME(bnoordhuis) Should be -EBUSY. */
- if (uv__udp_maybe_deferred_bind(handle, AF_INET))
- return -1;
+ err = uv__udp_maybe_deferred_bind(handle, AF_INET);
+ if (err)
+ return err;
handle->alloc_cb = alloc_cb;
handle->recv_cb = recv_cb;