Merge branch 'v0.10' into v1.x

This commit is contained in:
Bert Belder 2014-12-14 20:36:18 +01:00
commit eb986397c1
3 changed files with 42 additions and 15 deletions

3
.gitignore vendored
View File

@ -49,7 +49,10 @@ Makefile.in
/test/run-benchmarks.dSYM /test/run-benchmarks.dSYM
*.sln *.sln
*.sln.cache
*.ncb
*.vcproj *.vcproj
*.vcproj*.user
*.vcxproj *.vcxproj
*.vcxproj.filters *.vcxproj.filters
*.vcxproj.user *.vcxproj.user

View File

@ -69,17 +69,44 @@ const char* uv_dlerror(const uv_lib_t* lib) {
} }
static void uv__format_fallback_error(uv_lib_t* lib, int errorno){
DWORD_PTR args[1] = { (DWORD_PTR) errorno };
LPSTR fallback_error = "error: %1!d!";
FormatMessageA(FORMAT_MESSAGE_FROM_STRING |
FORMAT_MESSAGE_ARGUMENT_ARRAY |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
fallback_error, 0, 0,
(LPSTR) &lib->errmsg,
0, (va_list*) args);
}
static int uv__dlerror(uv_lib_t* lib, int errorno) { static int uv__dlerror(uv_lib_t* lib, int errorno) {
DWORD res;
if (lib->errmsg) { if (lib->errmsg) {
LocalFree((void*)lib->errmsg); LocalFree((void*)lib->errmsg);
lib->errmsg = NULL; lib->errmsg = NULL;
} }
if (errorno) { if (errorno) {
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, FORMAT_MESSAGE_FROM_SYSTEM |
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
(LPSTR)&lib->errmsg, 0, NULL); MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(LPSTR) &lib->errmsg, 0, NULL);
if (!res && GetLastError() == ERROR_MUI_FILE_NOT_FOUND) {
res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
0, (LPSTR) &lib->errmsg, 0, NULL);
}
if (!res) {
uv__format_fallback_error(lib, errorno);
}
} }
return errorno ? -1 : 0; return errorno ? -1 : 0;

View File

@ -26,31 +26,28 @@
TEST_IMPL(dlerror) { TEST_IMPL(dlerror) {
const char* path = "test/fixtures/load_error.node"; const char* path = "test/fixtures/load_error.node";
const char* dlerror_no_error = "no error";
const char* msg; const char* msg;
uv_lib_t lib; uv_lib_t lib;
int r; int r;
#ifdef __linux__ lib.errmsg = NULL;
const char* dlerror_desc = "file too short"; lib.handle = NULL;
#elif defined (__sun__) msg = uv_dlerror(&lib);
const char* dlerror_desc = "unknown file type"; ASSERT(msg != NULL);
#elif defined (_WIN32) ASSERT(strstr(msg, dlerror_no_error) != NULL);
const char* dlerror_desc = "%1 is not a valid Win32 application";
#else
const char* dlerror_desc = "";
#endif
r = uv_dlopen(path, &lib); r = uv_dlopen(path, &lib);
ASSERT(r == -1); ASSERT(r == -1);
msg = uv_dlerror(&lib); msg = uv_dlerror(&lib);
ASSERT(msg != NULL); ASSERT(msg != NULL);
ASSERT(strstr(msg, dlerror_desc) != NULL); ASSERT(strstr(msg, dlerror_no_error) == NULL);
/* Should return the same error twice in a row. */ /* Should return the same error twice in a row. */
msg = uv_dlerror(&lib); msg = uv_dlerror(&lib);
ASSERT(msg != NULL); ASSERT(msg != NULL);
ASSERT(strstr(msg, dlerror_desc) != NULL); ASSERT(strstr(msg, dlerror_no_error) == NULL);
uv_dlclose(&lib); uv_dlclose(&lib);