summaryrefslogtreecommitdiff
path: root/deps/uv/src/uv-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/uv/src/uv-common.c')
-rw-r--r--deps/uv/src/uv-common.c131
1 files changed, 53 insertions, 78 deletions
diff --git a/deps/uv/src/uv-common.c b/deps/uv/src/uv-common.c
index bc96029f65..6cfd10852a 100644
--- a/deps/uv/src/uv-common.c
+++ b/deps/uv/src/uv-common.c
@@ -19,6 +19,13 @@
* IN THE SOFTWARE.
*/
+/* Expose glibc-specific EAI_* error codes. Needs to be defined before we
+ * include any headers.
+ */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+
#include "uv.h"
#include "uv-common.h"
@@ -184,75 +191,59 @@ int uv_ip6_name(struct sockaddr_in6* src, char* dst, size_t size) {
}
-int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr_in* addr) {
- if (handle->type == UV_TCP && addr->sin_family == AF_INET)
- return uv__tcp_bind(handle, (const struct sockaddr*) addr, sizeof(*addr));
- else
- return UV_EINVAL;
-}
+int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr) {
+ unsigned int addrlen;
+ if (handle->type != UV_TCP)
+ return UV_EINVAL;
-int uv_tcp_bind6(uv_tcp_t* handle, const struct sockaddr_in6* addr) {
- if (handle->type == UV_TCP && addr->sin6_family == AF_INET6)
- return uv__tcp_bind(handle, (const struct sockaddr*) addr, sizeof(*addr));
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
else
return UV_EINVAL;
+
+ return uv__tcp_bind(handle, addr, addrlen);
}
int uv_udp_bind(uv_udp_t* handle,
- const struct sockaddr_in* addr,
+ const struct sockaddr* addr,
unsigned int flags) {
- if (handle->type == UV_UDP && addr->sin_family == AF_INET) {
- return uv__udp_bind(handle,
- (const struct sockaddr*) addr,
- sizeof(*addr),
- flags);
- }
- return UV_EINVAL;
-}
+ unsigned int addrlen;
+
+ if (handle->type != UV_UDP)
+ return UV_EINVAL;
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
+ else
+ return UV_EINVAL;
-int uv_udp_bind6(uv_udp_t* handle,
- const struct sockaddr_in6* addr,
- unsigned int flags) {
- if (handle->type == UV_UDP && addr->sin6_family == AF_INET6) {
- return uv__udp_bind(handle,
- (const struct sockaddr*) addr,
- sizeof(*addr),
- flags);
- }
- return UV_EINVAL;
+ return uv__udp_bind(handle, addr, addrlen, flags);
}
int uv_tcp_connect(uv_connect_t* req,
uv_tcp_t* handle,
- const struct sockaddr_in* addr,
+ const struct sockaddr* addr,
uv_connect_cb cb) {
- if (handle->type == UV_TCP && addr->sin_family == AF_INET) {
- return uv__tcp_connect(req,
- handle,
- (const struct sockaddr*) addr,
- sizeof(*addr),
- cb);
- }
- return UV_EINVAL;
-}
+ unsigned int addrlen;
+ if (handle->type != UV_TCP)
+ return UV_EINVAL;
-int uv_tcp_connect6(uv_connect_t* req,
- uv_tcp_t* handle,
- const struct sockaddr_in6* addr,
- uv_connect_cb cb) {
- if (handle->type == UV_TCP && addr->sin6_family == AF_INET6) {
- return uv__tcp_connect(req,
- handle,
- (const struct sockaddr*) addr,
- sizeof(*addr),
- cb);
- }
- return UV_EINVAL;
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
+ else
+ return UV_EINVAL;
+
+ return uv__tcp_connect(req, handle, addr, addrlen, cb);
}
@@ -260,37 +251,21 @@ int uv_udp_send(uv_udp_send_t* req,
uv_udp_t* handle,
const uv_buf_t bufs[],
unsigned int nbufs,
- const struct sockaddr_in* addr,
+ const struct sockaddr* addr,
uv_udp_send_cb send_cb) {
- if (handle->type == UV_UDP && addr->sin_family == AF_INET) {
- return uv__udp_send(req,
- handle,
- bufs,
- nbufs,
- (const struct sockaddr*) addr,
- sizeof(*addr),
- send_cb);
- }
- return UV_EINVAL;
-}
+ unsigned int addrlen;
+ if (handle->type != UV_UDP)
+ return UV_EINVAL;
-int uv_udp_send6(uv_udp_send_t* req,
- uv_udp_t* handle,
- const uv_buf_t bufs[],
- unsigned int nbufs,
- const struct sockaddr_in6* addr,
- uv_udp_send_cb send_cb) {
- if (handle->type == UV_UDP && addr->sin6_family == AF_INET6) {
- return uv__udp_send(req,
- handle,
- bufs,
- nbufs,
- (const struct sockaddr*) addr,
- sizeof(*addr),
- send_cb);
- }
- return UV_EINVAL;
+ if (addr->sa_family == AF_INET)
+ addrlen = sizeof(struct sockaddr_in);
+ else if (addr->sa_family == AF_INET6)
+ addrlen = sizeof(struct sockaddr_in6);
+ else
+ return UV_EINVAL;
+
+ return uv__udp_send(req, handle, bufs, nbufs, addr, addrlen, send_cb);
}