diff options
Diffstat (limited to 'deps/uv/src/win')
-rw-r--r-- | deps/uv/src/win/dl.c | 3 | ||||
-rw-r--r-- | deps/uv/src/win/fs.c | 72 | ||||
-rw-r--r-- | deps/uv/src/win/getaddrinfo.c | 14 | ||||
-rw-r--r-- | deps/uv/src/win/process.c | 9 | ||||
-rw-r--r-- | deps/uv/src/win/signal.c | 2 | ||||
-rw-r--r-- | deps/uv/src/win/tcp.c | 4 | ||||
-rw-r--r-- | deps/uv/src/win/tty.c | 11 | ||||
-rw-r--r-- | deps/uv/src/win/util.c | 3 |
8 files changed, 101 insertions, 17 deletions
diff --git a/deps/uv/src/win/dl.c b/deps/uv/src/win/dl.c index 97ac1c1ad1..5b84555ca4 100644 --- a/deps/uv/src/win/dl.c +++ b/deps/uv/src/win/dl.c @@ -107,7 +107,8 @@ static int uv__dlerror(uv_lib_t* lib, const char* filename, DWORD errorno) { MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR) &lib->errmsg, 0, NULL); - if (!res && GetLastError() == ERROR_MUI_FILE_NOT_FOUND) { + if (!res && (GetLastError() == ERROR_MUI_FILE_NOT_FOUND || + GetLastError() == ERROR_RESOURCE_TYPE_NOT_FOUND)) { res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c index 812c1a6de5..7ad0d077a6 100644 --- a/deps/uv/src/win/fs.c +++ b/deps/uv/src/win/fs.c @@ -42,6 +42,8 @@ #define UV_FS_FREE_PTR 0x0008 #define UV_FS_CLEANEDUP 0x0010 +#define UV__RENAME_RETRIES 4 +#define UV__RENAME_WAIT 250 #define INIT(subtype) \ do { \ @@ -1329,12 +1331,78 @@ static void fs__fstat(uv_fs_t* req) { static void fs__rename(uv_fs_t* req) { - if (!MoveFileExW(req->file.pathw, req->fs.info.new_pathw, MOVEFILE_REPLACE_EXISTING)) { + int tries; + int sys_errno; + int result; + int try_rmdir; + WCHAR* src, *dst; + DWORD src_attrib, dst_attrib; + + src = req->file.pathw; + dst = req->fs.info.new_pathw; + try_rmdir = 0; + + /* Do some checks to fail early. */ + src_attrib = GetFileAttributesW(src); + if (src_attrib == INVALID_FILE_ATTRIBUTES) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } + dst_attrib = GetFileAttributesW(dst); + if (dst_attrib != INVALID_FILE_ATTRIBUTES) { + if (dst_attrib & FILE_ATTRIBUTE_READONLY) { + req->result = UV_EPERM; + return; + } + /* Renaming folder to a folder name that already exist will fail on + * Windows. We will try to delete target folder first. + */ + if (src_attrib & FILE_ATTRIBUTE_DIRECTORY && + dst_attrib & FILE_ATTRIBUTE_DIRECTORY) + try_rmdir = 1; + } - SET_REQ_RESULT(req, 0); + /* Sometimes an antivirus or indexing software can lock the target or the + * source file/directory. This is annoying for users, in such cases we will + * retry couple of times with some delay before failing. + */ + for (tries = 0; tries < UV__RENAME_RETRIES; ++tries) { + if (tries > 0) + Sleep(UV__RENAME_WAIT); + + if (try_rmdir) { + result = _wrmdir(dst) == 0 ? 0 : uv_translate_sys_error(_doserrno); + switch (result) + { + case 0: + case UV_ENOENT: + /* Folder removed or did not exist at all. */ + try_rmdir = 0; + break; + case UV_ENOTEMPTY: + /* Non-empty target folder, fail instantly. */ + SET_REQ_RESULT(req, -1); + return; + default: + /* All other errors - try to move file anyway and handle the error + * there, retrying folder deletion next time around. + */ + break; + } + } + + if (MoveFileExW(src, dst, MOVEFILE_REPLACE_EXISTING) != 0) { + SET_REQ_RESULT(req, 0); + return; + } + + sys_errno = GetLastError(); + result = uv_translate_sys_error(sys_errno); + if (result != UV_EBUSY && result != UV_EPERM && result != UV_EACCES) + break; + } + req->sys_errno_ = sys_errno; + req->result = result; } diff --git a/deps/uv/src/win/getaddrinfo.c b/deps/uv/src/win/getaddrinfo.c index 614ea8e376..dfab860a73 100644 --- a/deps/uv/src/win/getaddrinfo.c +++ b/deps/uv/src/win/getaddrinfo.c @@ -24,6 +24,7 @@ #include "uv.h" #include "internal.h" #include "req-inl.h" +#include "idna.h" /* EAI_* constants. */ #include <winsock2.h> @@ -259,11 +260,13 @@ int uv_getaddrinfo(uv_loop_t* loop, const char* node, const char* service, const struct addrinfo* hints) { + char hostname_ascii[256]; int nodesize = 0; int servicesize = 0; int hintssize = 0; char* alloc_ptr = NULL; int err; + long rc; if (req == NULL || (node == NULL && service == NULL)) { return UV_EINVAL; @@ -277,12 +280,19 @@ int uv_getaddrinfo(uv_loop_t* loop, /* calculate required memory size for all input values */ if (node != NULL) { - nodesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, 0, node, -1, NULL, 0) * - sizeof(WCHAR)); + rc = uv__idna_toascii(node, + node + strlen(node), + hostname_ascii, + hostname_ascii + sizeof(hostname_ascii)); + if (rc < 0) + return rc; + nodesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, 0, hostname_ascii, + -1, NULL, 0) * sizeof(WCHAR)); if (nodesize == 0) { err = GetLastError(); goto error; } + node = hostname_ascii; } if (service != NULL) { diff --git a/deps/uv/src/win/process.c b/deps/uv/src/win/process.c index b47f203e9d..e7cccd9c80 100644 --- a/deps/uv/src/win/process.c +++ b/deps/uv/src/win/process.c @@ -964,6 +964,8 @@ int uv_spawn(uv_loop_t* loop, UV_PROCESS_SETGID | UV_PROCESS_SETUID | UV_PROCESS_WINDOWS_HIDE | + UV_PROCESS_WINDOWS_HIDE_CONSOLE | + UV_PROCESS_WINDOWS_HIDE_GUI | UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); err = uv_utf8_to_utf16_alloc(options->file, &application); @@ -1065,7 +1067,8 @@ int uv_spawn(uv_loop_t* loop, process_flags = CREATE_UNICODE_ENVIRONMENT; - if (options->flags & UV_PROCESS_WINDOWS_HIDE) { + if ((options->flags & UV_PROCESS_WINDOWS_HIDE_CONSOLE) || + (options->flags & UV_PROCESS_WINDOWS_HIDE)) { /* Avoid creating console window if stdio is not inherited. */ for (i = 0; i < options->stdio_count; i++) { if (options->stdio[i].flags & UV_INHERIT_FD) @@ -1073,7 +1076,9 @@ int uv_spawn(uv_loop_t* loop, if (i == options->stdio_count - 1) process_flags |= CREATE_NO_WINDOW; } - + } + if ((options->flags & UV_PROCESS_WINDOWS_HIDE_GUI) || + (options->flags & UV_PROCESS_WINDOWS_HIDE)) { /* Use SW_HIDE to avoid any potential process window. */ startup.wShowWindow = SW_HIDE; } else { diff --git a/deps/uv/src/win/signal.c b/deps/uv/src/win/signal.c index 3d0b8a35b9..276dc60973 100644 --- a/deps/uv/src/win/signal.c +++ b/deps/uv/src/win/signal.c @@ -190,7 +190,7 @@ int uv__signal_start(uv_signal_t* handle, int signum, int oneshot) { /* Test for invalid signal values. */ - if (signum != SIGWINCH && (signum <= 0 || signum >= NSIG)) + if (signum <= 0 || signum >= NSIG) return UV_EINVAL; /* Short circuit: if the signal watcher is already watching {signum} don't go diff --git a/deps/uv/src/win/tcp.c b/deps/uv/src/win/tcp.c index 8b6f0a5c99..3ce5548c0a 100644 --- a/deps/uv/src/win/tcp.c +++ b/deps/uv/src/win/tcp.c @@ -945,6 +945,7 @@ void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req) { DWORD bytes, flags, err; uv_buf_t buf; + int count; assert(handle->type == UV_TCP); @@ -999,7 +1000,8 @@ void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, } /* Do nonblocking reads until the buffer is empty */ - while (handle->flags & UV_HANDLE_READING) { + count = 32; + while ((handle->flags & UV_HANDLE_READING) && (count-- > 0)) { buf = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); if (buf.base == NULL || buf.len == 0) { diff --git a/deps/uv/src/win/tty.c b/deps/uv/src/win/tty.c index 32ccf74ca8..398288ec1d 100644 --- a/deps/uv/src/win/tty.c +++ b/deps/uv/src/win/tty.c @@ -941,20 +941,15 @@ void uv_process_tty_read_line_req(uv_loop_t* loop, uv_tty_t* handle, handle->read_cb((uv_stream_t*) handle, uv_translate_sys_error(GET_REQ_ERROR(req)), &buf); - } else { - /* The read was cancelled, or whatever we don't care */ - handle->read_cb((uv_stream_t*) handle, 0, &buf); } - } else { - if (!(handle->flags & UV_HANDLE_CANCELLATION_PENDING)) { + if (!(handle->flags & UV_HANDLE_CANCELLATION_PENDING) && + req->u.io.overlapped.InternalHigh != 0) { /* Read successful. TODO: read unicode, convert to utf-8 */ DWORD bytes = req->u.io.overlapped.InternalHigh; handle->read_cb((uv_stream_t*) handle, bytes, &buf); - } else { - handle->flags &= ~UV_HANDLE_CANCELLATION_PENDING; - handle->read_cb((uv_stream_t*) handle, 0, &buf); } + handle->flags &= ~UV_HANDLE_CANCELLATION_PENDING; } /* Wait for more input events. */ diff --git a/deps/uv/src/win/util.c b/deps/uv/src/win/util.c index c994984fe6..6e81c26165 100644 --- a/deps/uv/src/win/util.c +++ b/deps/uv/src/win/util.c @@ -816,6 +816,9 @@ int uv_interface_addresses(uv_interface_address_t** addresses_ptr, int is_vista_or_greater; ULONG flags; + *addresses_ptr = NULL; + *count_ptr = 0; + is_vista_or_greater = is_windows_version_or_greater(6, 0, 0, 0); if (is_vista_or_greater) { flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | |