summaryrefslogtreecommitdiff
path: root/deps/uv/src/win
diff options
context:
space:
mode:
Diffstat (limited to 'deps/uv/src/win')
-rw-r--r--deps/uv/src/win/dl.c3
-rw-r--r--deps/uv/src/win/fs.c72
-rw-r--r--deps/uv/src/win/getaddrinfo.c14
-rw-r--r--deps/uv/src/win/process.c9
-rw-r--r--deps/uv/src/win/signal.c2
-rw-r--r--deps/uv/src/win/tcp.c4
-rw-r--r--deps/uv/src/win/tty.c11
-rw-r--r--deps/uv/src/win/util.c3
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 |