From 576b11662e394ac0fa9bd23b6f2be3384073e99b Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Fri, 26 Aug 2011 00:23:17 +0200 Subject: [PATCH] uv: upgrade to 6490c6a --- deps/uv/src/uv-unix.c | 18 ++++- deps/uv/test/test-getsockname.c | 127 +++++++++++++++++++++++++++++++- deps/uv/test/test-list.h | 6 +- 3 files changed, 142 insertions(+), 9 deletions(-) diff --git a/deps/uv/src/uv-unix.c b/deps/uv/src/uv-unix.c index 3044363b29..f45aa22760 100644 --- a/deps/uv/src/uv-unix.c +++ b/deps/uv/src/uv-unix.c @@ -44,14 +44,26 @@ #include /* writev */ #include -#ifdef __linux__ +#if defined(__linux__) + #include +#include + +#undef HAVE_PIPE2 +#undef HAVE_ACCEPT4 + /* pipe2() requires linux >= 2.6.27 and glibc >= 2.9 */ -#if defined(LINUX_VERSION_CODE) && defined(__GLIBC_PREREQ) && LINUX_VERSION_CODE >= 0x2061B && __GLIBC_PREREQ(2, 9) +#if LINUX_VERSION_CODE >= 0x2061B && __GLIBC_PREREQ(2, 9) #define HAVE_PIPE2 #endif + +/* accept4() requires linux >= 2.6.28 and glib >= 2.10 */ +#if LINUX_VERSION_CODE >= 0x2061C && __GLIBC_PREREQ(2, 10) +#define HAVE_ACCEPT4 #endif +#endif /* __linux__ */ + #ifdef __sun # include # include @@ -2601,7 +2613,7 @@ static int uv__accept(int sockfd, struct sockaddr* saddr, socklen_t slen) { assert(sockfd >= 0); do { -#if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) +#if defined(HAVE_ACCEPT4) peerfd = accept4(sockfd, saddr, &slen, SOCK_NONBLOCK | SOCK_CLOEXEC); #else if ((peerfd = accept(sockfd, saddr, &slen)) != -1) { diff --git a/deps/uv/test/test-getsockname.c b/deps/uv/test/test-getsockname.c index c804ecc5e7..c1fa8215a6 100644 --- a/deps/uv/test/test-getsockname.c +++ b/deps/uv/test/test-getsockname.c @@ -22,15 +22,19 @@ #include "uv.h" #include "task.h" -#include #include +#include +#include -static int getsocknamecount = 0; +static int getsocknamecount = 0; static uv_tcp_t tcp; +static uv_udp_t udp; static uv_connect_t connect_req; static uv_tcp_t tcpServer; +static uv_udp_t udpServer; +static uv_udp_send_t send_req; static uv_buf_t alloc(uv_handle_t* handle, size_t suggested_size) { @@ -99,7 +103,6 @@ static void on_connection(uv_stream_t* server, int status) { r = uv_read_start((uv_stream_t*)handle, alloc, after_read); ASSERT(r == 0); - } @@ -147,6 +150,8 @@ static int tcp_listener(int port) { return 1; } + memset(&sockname, -1, sizeof sockname); + r = uv_getsockname((uv_handle_t*)&tcpServer, &sockname, &namelen); if (r != 0) { fprintf(stderr, "uv_getsockname error (listening) %d\n", uv_last_error().code); @@ -179,7 +184,106 @@ static void tcp_connector() { } -TEST_IMPL(getsockname) { +static void udp_recv(uv_udp_t* handle, + ssize_t nread, + uv_buf_t buf, + struct sockaddr* addr, + unsigned flags) { + struct sockaddr sockname; + char ip[20]; + int namelen; + int r; + + ASSERT(nread >= 0); + + if (nread == 0) { + uv_close((uv_handle_t*)handle, NULL); + free(buf.base); + return; + } + + namelen = sizeof(sockname); + r = uv_getsockname((uv_handle_t*)&udp, &sockname, &namelen); + if (r != 0) { + fprintf(stderr, "uv_getsockname error (connector) %d\n", uv_last_error().code); + } + ASSERT(r == 0); + + r = uv_ip4_name((struct sockaddr_in*)&sockname, ip, 20); + ASSERT(r == 0); + printf("sockname = %s\n", ip); + + getsocknamecount++; + + uv_close((uv_handle_t*)&udp, NULL); +} + + +static void udp_send(uv_udp_send_t* req, int status) { + +} + + +static int udp_listener(int port) { + struct sockaddr_in addr = uv_ip4_addr("0.0.0.0", port); + struct sockaddr sockname; + int namelen = sizeof(sockname); + char ip[20]; + int r; + + r = uv_udp_init(&udpServer); + if (r) { + fprintf(stderr, "Socket creation error\n"); + return 1; + } + + r = uv_udp_bind(&udpServer, addr, 0); + if (r) { + fprintf(stderr, "Bind error\n"); + return 1; + } + + memset(&sockname, -1, sizeof sockname); + + r = uv_getsockname((uv_handle_t*)&udpServer, &sockname, &namelen); + if (r != 0) { + fprintf(stderr, "uv_getsockname error (listening) %d\n", uv_last_error().code); + } + ASSERT(r == 0); + + r = uv_ip4_name((struct sockaddr_in*)&sockname, ip, 20); + ASSERT(r == 0); + ASSERT(ip[0] == '0'); + ASSERT(ip[1] == '.'); + ASSERT(ip[2] == '0'); + printf("sockname = %s\n", ip); + + getsocknamecount++; + + r = uv_udp_recv_start(&udpServer, alloc, udp_recv); + ASSERT(r == 0); + + return 0; +} + + +static void udp_sender(void) { + struct sockaddr_in server_addr; + uv_buf_t buf; + int r; + + r = uv_udp_init(&udp); + ASSERT(!r); + + buf = uv_buf_init("PING", 4); + server_addr = uv_ip4_addr("127.0.0.1", TEST_PORT); + + r = uv_udp_send(&send_req, &udp, &buf, 1, server_addr, udp_send); + ASSERT(!r); +} + + +TEST_IMPL(getsockname_tcp) { uv_init(); if (tcp_listener(TEST_PORT)) @@ -194,3 +298,18 @@ TEST_IMPL(getsockname) { return 0; } + +TEST_IMPL(getsockname_udp) { + uv_init(); + + if (udp_listener(TEST_PORT)) + return 1; + + udp_sender(); + + uv_run(); + + ASSERT(getsocknamecount == 2); + + return 0; +} diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h index 8a9f8c7e80..eeda7f40fb 100644 --- a/deps/uv/test/test-list.h +++ b/deps/uv/test/test-list.h @@ -64,7 +64,8 @@ TEST_DECLARE (hrtime) TEST_DECLARE (getaddrinfo_basic) TEST_DECLARE (getaddrinfo_concurrent) TEST_DECLARE (gethostbyname) -TEST_DECLARE (getsockname) +TEST_DECLARE (getsockname_tcp) +TEST_DECLARE (getsockname_udp) TEST_DECLARE (fail_always) TEST_DECLARE (pass_always) TEST_DECLARE (spawn_exit_code) @@ -156,7 +157,8 @@ TASK_LIST_START TEST_ENTRY (gethostbyname) TEST_HELPER (gethostbyname, tcp4_echo_server) - TEST_ENTRY (getsockname) + TEST_ENTRY (getsockname_tcp) + TEST_ENTRY (getsockname_udp) TEST_ENTRY (spawn_exit_code) TEST_ENTRY (spawn_stdout)