From e0796b6f1f854126adf5b2bbeca4cb580d0ca84a Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 5 Mar 2012 15:38:43 +0100 Subject: [PATCH] uv: upgrade to a93dc7e --- deps/uv/config-unix.mk | 2 +- deps/uv/include/uv.h | 6 ++++ deps/uv/src/unix/core.c | 2 -- deps/uv/src/unix/dl.c | 22 ++++++++++++ deps/uv/src/win/dl.c | 27 ++++++++++++--- deps/uv/src/win/util.c | 1 - deps/uv/test/fixtures/load_error.node | 1 + deps/uv/test/test-dlerror.c | 49 +++++++++++++++++++++++++++ deps/uv/test/test-list.h | 2 ++ deps/uv/uv.gyp | 6 ++++ 10 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 deps/uv/test/fixtures/load_error.node create mode 100644 deps/uv/test/test-dlerror.c diff --git a/deps/uv/config-unix.mk b/deps/uv/config-unix.mk index 8eb1c6e195..97ba52c75a 100644 --- a/deps/uv/config-unix.mk +++ b/deps/uv/config-unix.mk @@ -62,7 +62,7 @@ EV_CONFIG=config_linux.h EIO_CONFIG=config_linux.h CSTDFLAG += -D_GNU_SOURCE CPPFLAGS += -Isrc/ares/config_linux -LINKFLAGS+=-lrt +LINKFLAGS+=-ldl -lrt OBJS += src/unix/linux/core.o src/unix/linux/inotify.o endif diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h index 4af154e9d4..19c5e0e5c8 100644 --- a/deps/uv/include/uv.h +++ b/deps/uv/include/uv.h @@ -1399,6 +1399,12 @@ UV_EXTERN uv_err_t uv_dlclose(uv_lib_t library); */ UV_EXTERN uv_err_t uv_dlsym(uv_lib_t library, const char* name, void** ptr); +/* + * Retrieves and frees an error message of dynamic linking loaders. + */ +UV_EXTERN const char *uv_dlerror(uv_lib_t library); +UV_EXTERN void uv_dlerror_free(uv_lib_t library, const char *msg); + /* * The mutex functions return 0 on success, -1 on error * (unless the return type is void, of course). diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c index e93a1686a7..728eb0bf90 100644 --- a/deps/uv/src/unix/core.c +++ b/deps/uv/src/unix/core.c @@ -541,8 +541,6 @@ static void uv__timer_cb(EV_P_ ev_timer* w, int revents) { assert(uv__timer_active(timer)); - assert(uv__timer_active(timer)); - if (!uv__timer_repeating(timer)) { timer->flags &= ~UV_TIMER_ACTIVE; ev_ref(EV_A); diff --git a/deps/uv/src/unix/dl.c b/deps/uv/src/unix/dl.c index 41c244d79e..88c9525f76 100644 --- a/deps/uv/src/unix/dl.c +++ b/deps/uv/src/unix/dl.c @@ -24,6 +24,8 @@ #include #include +#include +#include /* The dl family of functions don't set errno. We need a good way to communicate * errors to the caller but there is only dlerror() and that returns a string - @@ -67,3 +69,23 @@ uv_err_t uv_dlsym(uv_lib_t library, const char* name, void** ptr) { *ptr = (void*) address; return uv_ok_; } + + +const char *uv_dlerror(uv_lib_t library) { + const char* buf = NULL; + /* Make uv_dlerror() be independent of locale */ + char* loc = setlocale(LC_MESSAGES, NULL); + if(strcmp(loc, "C") == 0) { + return strdup(dlerror()); + } else { + setlocale(LC_MESSAGES, "C"); + buf = dlerror(); + setlocale(LC_MESSAGES, loc); + return strdup(buf); + } +} + + +void uv_dlerror_free(uv_lib_t library, const char *msg) { + free((void*)msg); +} diff --git a/deps/uv/src/win/dl.c b/deps/uv/src/win/dl.c index 37cdc131a1..a7d4ced46c 100644 --- a/deps/uv/src/win/dl.c +++ b/deps/uv/src/win/dl.c @@ -22,6 +22,7 @@ #include "uv.h" #include "internal.h" +__declspec( thread ) DWORD saved_errno = 0; uv_err_t uv_dlopen(const char* filename, uv_lib_t* library) { wchar_t filename_w[32768]; @@ -30,12 +31,14 @@ uv_err_t uv_dlopen(const char* filename, uv_lib_t* library) { if (!uv_utf8_to_utf16(filename, filename_w, sizeof(filename_w) / sizeof(wchar_t))) { - return uv__new_sys_error(GetLastError()); + saved_errno = GetLastError(); + return uv__new_sys_error(saved_errno); } handle = LoadLibraryW(filename_w); if (handle == NULL) { - return uv__new_sys_error(GetLastError()); + saved_errno = GetLastError(); + return uv__new_sys_error(saved_errno); } *library = handle; @@ -45,7 +48,8 @@ uv_err_t uv_dlopen(const char* filename, uv_lib_t* library) { uv_err_t uv_dlclose(uv_lib_t library) { if (!FreeLibrary(library)) { - return uv__new_sys_error(GetLastError()); + saved_errno = GetLastError(); + return uv__new_sys_error(saved_errno); } return uv_ok_; @@ -55,9 +59,24 @@ uv_err_t uv_dlclose(uv_lib_t library) { uv_err_t uv_dlsym(uv_lib_t library, const char* name, void** ptr) { FARPROC proc = GetProcAddress(library, name); if (proc == NULL) { - return uv__new_sys_error(GetLastError()); + saved_errno = GetLastError(); + return uv__new_sys_error(saved_errno); } *ptr = (void*) proc; return uv_ok_; } + + +const char *uv_dlerror(uv_lib_t library) { + char* buf = NULL; + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, saved_errno, + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&buf, 0, NULL); + return buf; +} + + +void uv_dlerror_free(uv_lib_t library, const char *msg) { + LocalFree((LPVOID)msg); +} diff --git a/deps/uv/src/win/util.c b/deps/uv/src/win/util.c index 6ded755cef..15618e928d 100644 --- a/deps/uv/src/win/util.c +++ b/deps/uv/src/win/util.c @@ -610,7 +610,6 @@ void uv_filetime_to_time_t(FILETIME* file_time, time_t* stat_time) { time.tm_hour = system_time.wHour; time.tm_min = system_time.wMinute; time.tm_sec = system_time.wSecond; - time.tm_isdst = -1; *stat_time = mktime(&time); } else { diff --git a/deps/uv/test/fixtures/load_error.node b/deps/uv/test/fixtures/load_error.node new file mode 100644 index 0000000000..323fae03f4 --- /dev/null +++ b/deps/uv/test/fixtures/load_error.node @@ -0,0 +1 @@ +foobar diff --git a/deps/uv/test/test-dlerror.c b/deps/uv/test/test-dlerror.c new file mode 100644 index 0000000000..763bfeca2d --- /dev/null +++ b/deps/uv/test/test-dlerror.c @@ -0,0 +1,49 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "task.h" +#include + +const char* path = "test/fixtures/load_error.node"; +const char* msg; + +#ifdef __linux__ + const char* dlerror_desc = "file too short"; +#elif defined (__sun__) + const char* dlerror_desc = "unknown file type"; +#elif defined (_WIN32) + const char* dlerror_desc = "%1 is not a valid Win32 application"; +#else + const char* dlerror_desc = ""; +#endif + +uv_lib_t lib; +uv_err_t r; + +TEST_IMPL(dlerror) { + r = uv_dlopen(path, &lib); + msg = uv_dlerror(lib); + ASSERT(msg != NULL); + ASSERT(strstr(msg, dlerror_desc) != NULL); + uv_dlerror_free(lib, msg); + return 0; +} diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h index 2997b179d2..38d39259e9 100644 --- a/deps/uv/test/test-list.h +++ b/deps/uv/test/test-list.h @@ -142,6 +142,7 @@ TEST_DECLARE (thread_create) TEST_DECLARE (strlcpy) TEST_DECLARE (strlcat) TEST_DECLARE (counters_init) +TEST_DECLARE (dlerror) #ifdef _WIN32 TEST_DECLARE (spawn_detect_pipe_name_collisions_on_windows) TEST_DECLARE (argument_escaping) @@ -326,6 +327,7 @@ TASK_LIST_START TEST_ENTRY (strlcpy) TEST_ENTRY (strlcat) TEST_ENTRY (counters_init) + TEST_ENTRY (dlerror) #if 0 /* These are for testing the test runner. */ TEST_ENTRY (fail_always) diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp index 89a9445b30..9a828305ae 100644 --- a/deps/uv/uv.gyp +++ b/deps/uv/uv.gyp @@ -32,6 +32,11 @@ ], 'direct_dependent_settings': { 'include_dirs': [ 'include' ], + 'conditions': [ + ['OS=="linux"', { + 'libraries': [ '-ldl' ], + }], + ], }, 'defines': [ @@ -338,6 +343,7 @@ 'test/test-udp-send-and-recv.c', 'test/test-udp-multicast-join.c', 'test/test-counters-init.c', + 'test/test-dlerror.c', 'test/test-udp-multicast-ttl.c', ], 'conditions': [