summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorcjihrig <cjihrig@gmail.com>2019-10-19 16:46:32 -0500
committercjihrig <cjihrig@gmail.com>2019-10-20 10:13:31 -0500
commit7d433a936bce26707f7a10bb56b121fe0dfb0a66 (patch)
treeee46549068d0ba1c62b2cca0a9036182d70e0682 /deps
parent0822bfaa9f52aea289abd0e15a90b0df2e12f7e1 (diff)
downloadandroid-node-v8-7d433a936bce26707f7a10bb56b121fe0dfb0a66.tar.gz
android-node-v8-7d433a936bce26707f7a10bb56b121fe0dfb0a66.tar.bz2
android-node-v8-7d433a936bce26707f7a10bb56b121fe0dfb0a66.zip
deps: upgrade to libuv 1.33.1
Notable changes: - uv_random() has been added. - More work to read those pesky Windows environment variables. - Several build fixes for Tier 3 platforms (Android, NetBSD, OpenBSD, Haiku). - Stop using fsevents to watch files (using kqueue again). PR-URL: https://github.com/nodejs/node/pull/29996 Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: David Carlier <devnexen@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Diffstat (limited to 'deps')
-rw-r--r--deps/uv/AUTHORS8
-rw-r--r--deps/uv/CMakeLists.txt42
-rw-r--r--deps/uv/ChangeLog80
-rw-r--r--deps/uv/Makefile.am18
-rw-r--r--deps/uv/SUPPORTED_PLATFORMS.md7
-rw-r--r--deps/uv/configure.ac4
-rw-r--r--deps/uv/docs/src/fs.rst14
-rw-r--r--deps/uv/docs/src/handle.rst14
-rw-r--r--deps/uv/docs/src/misc.rst45
-rw-r--r--deps/uv/docs/src/tty.rst39
-rw-r--r--deps/uv/include/uv.h41
-rw-r--r--deps/uv/include/uv/version.h4
-rw-r--r--deps/uv/src/random.c121
-rw-r--r--deps/uv/src/threadpool.c4
-rw-r--r--deps/uv/src/unix/android-ifaddrs.c2
-rw-r--r--deps/uv/src/unix/bsd-ifaddrs.c2
-rw-r--r--deps/uv/src/unix/core.c6
-rw-r--r--deps/uv/src/unix/darwin-proctitle.c139
-rw-r--r--deps/uv/src/unix/fs.c30
-rw-r--r--deps/uv/src/unix/fsevents.c6
-rw-r--r--deps/uv/src/unix/internal.h6
-rw-r--r--deps/uv/src/unix/kqueue.c44
-rw-r--r--deps/uv/src/unix/linux-core.c53
-rw-r--r--deps/uv/src/unix/linux-syscalls.c25
-rw-r--r--deps/uv/src/unix/linux-syscalls.h1
-rw-r--r--deps/uv/src/unix/openbsd.c2
-rw-r--r--deps/uv/src/unix/pipe.c2
-rw-r--r--deps/uv/src/unix/proctitle.c4
-rw-r--r--deps/uv/src/unix/random-devurandom.c93
-rw-r--r--deps/uv/src/unix/random-getentropy.c57
-rw-r--r--deps/uv/src/unix/random-getrandom.c88
-rw-r--r--deps/uv/src/unix/random-sysctl.c100
-rw-r--r--deps/uv/src/unix/tty.c7
-rw-r--r--deps/uv/src/unix/udp.c22
-rw-r--r--deps/uv/src/uv-common.c3
-rw-r--r--deps/uv/src/win/fs.c17
-rw-r--r--deps/uv/src/win/internal.h2
-rw-r--r--deps/uv/src/win/tcp.c2
-rw-r--r--deps/uv/src/win/tty.c44
-rw-r--r--deps/uv/src/win/udp.c2
-rw-r--r--deps/uv/src/win/util.c17
-rw-r--r--deps/uv/src/win/winapi.c11
-rw-r--r--deps/uv/src/win/winapi.h8
-rw-r--r--deps/uv/src/win/winsock.h8
-rw-r--r--deps/uv/test/test-env-vars.c8
-rw-r--r--deps/uv/test/test-fs-copyfile.c2
-rw-r--r--deps/uv/test/test-fs-event.c72
-rw-r--r--deps/uv/test/test-fs-readdir.c2
-rw-r--r--deps/uv/test/test-ip4-addr.c4
-rw-r--r--deps/uv/test/test-ip6-addr.c9
-rw-r--r--deps/uv/test/test-list.h8
-rw-r--r--deps/uv/test/test-process-title-threadsafe.c6
-rw-r--r--deps/uv/test/test-random.c94
-rw-r--r--deps/uv/test/test-threadpool-cancel.c41
-rw-r--r--deps/uv/test/test-udp-multicast-join.c2
-rw-r--r--deps/uv/test/test-udp-multicast-join6.c4
-rw-r--r--deps/uv/test/test.gyp4
-rw-r--r--deps/uv/uv.gyp15
58 files changed, 1282 insertions, 233 deletions
diff --git a/deps/uv/AUTHORS b/deps/uv/AUTHORS
index 8c3d342d33..408cfd6541 100644
--- a/deps/uv/AUTHORS
+++ b/deps/uv/AUTHORS
@@ -403,3 +403,11 @@ Vladimir Karnushin <v.karnushin@mail.ru>
MaYuming <maym@appexnetworks.com>
Eneas U de Queiroz <cotequeiroz@gmail.com>
Daniel Hahler <git@thequod.de>
+Yang Yu <yang.yu@disigma.org>
+David Carlier <devnexen@gmail.com>
+Calvin Hill <calvin@hakobaito.co.uk>
+Isabella Muerte <63051+slurps-mad-rips@users.noreply.github.com>
+Ouyang Yadong <oyydoibh@gmail.com>
+ZYSzys <zyszys98@gmail.com>
+Carl Lei <xecycle@gmail.com>
+Stefan Bender <stefan.bender@ntnu.no>
diff --git a/deps/uv/CMakeLists.txt b/deps/uv/CMakeLists.txt
index 6f18f3397d..7da5e68816 100644
--- a/deps/uv/CMakeLists.txt
+++ b/deps/uv/CMakeLists.txt
@@ -1,6 +1,15 @@
# TODO: determine CMAKE_SYSTEM_NAME on OS/390. Currently assumes "OS/390".
-cmake_minimum_required(VERSION 2.8.12)
-project(libuv)
+cmake_minimum_required(VERSION 3.4)
+project(libuv LANGUAGES C)
+
+include(CMakePackageConfigHelpers)
+include(CMakeDependentOption)
+include(GNUInstallDirs)
+include(CTest)
+
+cmake_dependent_option(LIBUV_BUILD_TESTS
+ "Build the unit tests when BUILD_TESTING is enabled and we are the root project" ON
+ "BUILD_TESTING;CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF)
if(MSVC)
list(APPEND uv_cflags /W4)
@@ -14,6 +23,7 @@ set(uv_sources
src/fs-poll.c
src/idna.c
src/inet.c
+ src/random.c
src/strscpy.c
src/threadpool.c
src/timer.c
@@ -72,7 +82,6 @@ set(uv_test_sources
test/test-idna.c
test/test-ip4-addr.c
test/test-ip6-addr.c
- test/test-ip6-addr.c
test/test-ipc-heavy-traffic-deadlock-bug.c
test/test-ipc-send-recv.c
test/test-ipc.c
@@ -108,6 +117,7 @@ set(uv_test_sources
test/test-process-title-threadsafe.c
test/test-process-title.c
test/test-queue-foreach-delete.c
+ test/test-random.c
test/test-ref.c
test/test-run-nowait.c
test/test-run-once.c
@@ -236,6 +246,7 @@ else()
src/unix/pipe.c
src/unix/poll.c
src/unix/process.c
+ src/unix/random-devurandom.c
src/unix/signal.c
src/unix/stream.c
src/unix/tcp.c
@@ -284,6 +295,14 @@ if(APPLE OR CMAKE_SYSTEM_NAME MATCHES "DragonFly|FreeBSD|NetBSD|OpenBSD")
list(APPEND uv_sources src/unix/bsd-ifaddrs.c src/unix/kqueue.c)
endif()
+if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
+ list(APPEND uv_sources src/unix/random-getrandom.c)
+endif()
+
+if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
+ list(APPEND uv_sources src/unix/random-getentropy.c)
+endif()
+
if(APPLE)
list(APPEND uv_defines _DARWIN_UNLIMITED_SELECT=1 _DARWIN_USE_64_BIT_INODE=1)
list(APPEND uv_sources
@@ -300,6 +319,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
src/unix/linux-inotify.c
src/unix/linux-syscalls.c
src/unix/procfs-exepath.c
+ src/unix/random-getrandom.c
+ src/unix/random-sysctl.c
src/unix/sysinfo-loadavg.c)
endif()
@@ -356,11 +377,7 @@ target_compile_options(uv_a PRIVATE ${uv_cflags})
target_include_directories(uv_a PUBLIC include PRIVATE src)
target_link_libraries(uv_a ${uv_libraries})
-option(libuv_buildtests "Build the unit tests when BUILD_TESTING is enabled." ON)
-
-include(CTest)
-if(BUILD_TESTING AND libuv_buildtests)
- enable_testing()
+if(LIBUV_BUILD_TESTS)
add_executable(uv_run_tests ${uv_test_sources})
target_compile_definitions(uv_run_tests
PRIVATE ${uv_defines} USING_UV_SHARED=1)
@@ -380,7 +397,6 @@ endif()
if(UNIX)
# Now for some gibbering horrors from beyond the stars...
- include(GNUInstallDirs)
foreach(x ${uv_libraries})
set(LIBS "${LIBS} -l${x}")
endforeach(x)
@@ -402,3 +418,11 @@ if(UNIX)
install(TARGETS uv LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(TARGETS uv_a ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
+
+if(WIN32)
+ install(DIRECTORY include/ DESTINATION include)
+ install(FILES LICENSE DESTINATION .)
+ install(TARGETS uv uv_a
+ RUNTIME DESTINATION lib/$<CONFIG>
+ ARCHIVE DESTINATION lib/$<CONFIG>)
+endif()
diff --git a/deps/uv/ChangeLog b/deps/uv/ChangeLog
index 093579de8e..cd4451ae69 100644
--- a/deps/uv/ChangeLog
+++ b/deps/uv/ChangeLog
@@ -1,3 +1,83 @@
+2019.10.20, Version 1.33.1 (Stable), 07ad32138f4d2285ba2226b5e20462b27b091a59
+
+Changes since version 1.33.0:
+
+* linux: fix arm64 SYS__sysctl build breakage (Ben Noordhuis)
+
+
+2019.10.17, Version 1.33.0 (Stable), e56e42e9310e4437e1886dbd6771792c14c0a5f3
+
+Changes since version 1.32.0:
+
+* Revert "linux: drop code path for epoll_pwait-less kernels" (Yang Yu)
+
+* build: fix build error with __ANDROID_API__ < 21 (Yang Yu)
+
+* win: fix reading hidden env vars (Anna Henningsen)
+
+* unix,win: add uv_random() (Ben Noordhuis)
+
+* win: simplify mkdtemp (Saúl Ibarra Corretgé)
+
+* docs: fix literal-includes in User Guide (Nhan Khong)
+
+* win, tty: fix problem of receiving unexpected SIGWINCH (erw7)
+
+* unix: fix {Net,Open}BSD build (David Carlier)
+
+* win,mingw: Fix undefined MCAST_* constants (Crunkle)
+
+* build: Add link for test/fixtures/lorem_ipsum.txt (Andrew Paprocki)
+
+* fs: use statvfs in uv__fs_statfs() for Haiku (Calvin Hill)
+
+* fsevents: stop using fsevents to watch files (Jameson Nash)
+
+* fsevents: regression in watching / (Jameson Nash)
+
+* build,cmake: don't try to detect a C++ compiler (Isabella Muerte)
+
+* build: fix build warning on cygwin (MaYuming)
+
+* unix: set sin_len and sin6_len (Ouyang Yadong)
+
+* test: fix order of operations in test (cjihrig)
+
+* doc: improve uv_fs_readdir() cleanup docs (cjihrig)
+
+* build: remove duplicated test in build files (ZYSzys)
+
+* android: enable getentropy on Android >= 28 (David Carlier)
+
+* android: fix build (David Carlier)
+
+* darwin: speed up uv_set_process_title() (Ben Noordhuis)
+
+* darwin: assume pthread_setname_np() is available (Ben Noordhuis)
+
+* unix,udp: ensure addr is non-null (Jameson Nash)
+
+* win,tty: add uv_tty_{get,set}_vterm_state (erw7)
+
+* win: fix uv_statfs_t leak in uv_fs_statfs() (Ryan Liptak)
+
+* build: install files on windows via cmake (Carl Lei)
+
+* darwin,test: include AvailabilityMacros.h (Saúl Ibarra Corretgé)
+
+* darwin,test: update loop time after sleeping (Saúl Ibarra Corretgé)
+
+* doc: remove old FreeBSD 9 related note (Saúl Ibarra Corretgé)
+
+* doc: improve uv_{send,recv}_buffer_size() docs (Ryan Liptak)
+
+* build: move -Wno-long-long check to configure time (Ben Noordhuis)
+
+* unix: update uv_fs_copyfile() fallback logic (Stefan Bender)
+
+* win: cast setsockopt struct to const char* (Shelley Vohr)
+
+
2019.09.10, Version 1.32.0 (Stable), 697bea87b3a0b0e9b4e5ff86b39d1dedb70ee46d
Changes since version 1.31.0:
diff --git a/deps/uv/Makefile.am b/deps/uv/Makefile.am
index 099b0efb08..ce4ca274b2 100644
--- a/deps/uv/Makefile.am
+++ b/deps/uv/Makefile.am
@@ -35,6 +35,7 @@ libuv_la_SOURCES = src/fs-poll.c \
src/idna.h \
src/inet.c \
src/queue.h \
+ src/random.c \
src/strscpy.c \
src/strscpy.h \
src/threadpool.c \
@@ -105,6 +106,7 @@ libuv_la_SOURCES += src/unix/async.c \
src/unix/pipe.c \
src/unix/poll.c \
src/unix/process.c \
+ src/unix/random-devurandom.c \
src/unix/signal.c \
src/unix/spinlock.h \
src/unix/stream.c \
@@ -138,11 +140,7 @@ EXTRA_DIST = test/fixtures/empty_file \
TESTS = test/run-tests
check_PROGRAMS = test/run-tests
-if OS390
test_run_tests_CFLAGS =
-else
-test_run_tests_CFLAGS = -Wno-long-long
-endif
if SUNOS
# Can't be turned into a CC_CHECK_CFLAGS in configure.ac, it makes compilers
@@ -240,6 +238,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \
test/test-process-title.c \
test/test-process-title-threadsafe.c \
test/test-queue-foreach-delete.c \
+ test/test-random.c \
test/test-ref.c \
test/test-run-nowait.c \
test/test-run-once.c \
@@ -414,7 +413,8 @@ libuv_la_SOURCES += src/unix/bsd-ifaddrs.c \
src/unix/darwin-proctitle.c \
src/unix/fsevents.c \
src/unix/kqueue.c \
- src/unix/proctitle.c
+ src/unix/proctitle.c \
+ src/unix/random-getentropy.c
test_run_tests_LDFLAGS += -lutil
endif
@@ -434,7 +434,8 @@ libuv_la_SOURCES += src/unix/bsd-ifaddrs.c \
src/unix/bsd-proctitle.c \
src/unix/freebsd.c \
src/unix/kqueue.c \
- src/unix/posix-hrtime.c
+ src/unix/posix-hrtime.c \
+ src/unix/random-getrandom.c
test_run_tests_LDFLAGS += -lutil
endif
@@ -465,6 +466,8 @@ libuv_la_SOURCES += src/unix/linux-core.c \
src/unix/linux-syscalls.h \
src/unix/procfs-exepath.c \
src/unix/proctitle.c \
+ src/unix/random-getrandom.c \
+ src/unix/random-sysctl.c \
src/unix/sysinfo-loadavg.c
test_run_tests_LDFLAGS += -lutil
endif
@@ -498,7 +501,8 @@ libuv_la_SOURCES += src/unix/bsd-ifaddrs.c \
src/unix/bsd-proctitle.c \
src/unix/kqueue.c \
src/unix/openbsd.c \
- src/unix/posix-hrtime.c
+ src/unix/posix-hrtime.c \
+ src/unix/random-getentropy.c
test_run_tests_LDFLAGS += -lutil
endif
diff --git a/deps/uv/SUPPORTED_PLATFORMS.md b/deps/uv/SUPPORTED_PLATFORMS.md
index 077191086c..29e4844ff3 100644
--- a/deps/uv/SUPPORTED_PLATFORMS.md
+++ b/deps/uv/SUPPORTED_PLATFORMS.md
@@ -5,7 +5,7 @@
| GNU/Linux | Tier 1 | Linux >= 2.6.32 with glibc >= 2.12 | |
| macOS | Tier 1 | macOS >= 10.7 | |
| Windows | Tier 1 | >= Windows 7 | MSVC 2008 and later are supported |
-| FreeBSD | Tier 1 | >= 9 (see note) | |
+| FreeBSD | Tier 1 | >= 10 | |
| AIX | Tier 2 | >= 6 | Maintainers: @libuv/aix |
| z/OS | Tier 2 | >= V2R2 | Maintainers: @libuv/zos |
| Linux with musl | Tier 2 | musl >= 1.0 | |
@@ -16,11 +16,6 @@
| SunOS | Tier 3 | Solaris 121 and later | |
| Other | Tier 3 | N/A | |
-#### Note on FreeBSD 9
-
-While FreeBSD is supported as Tier 1, FreeBSD 9 will get Tier 2 support until
-it reaches end of life, in December 2016.
-
## Support types
* **Tier 1**: Officially supported and tested with CI. Any contributed patch
diff --git a/deps/uv/configure.ac b/deps/uv/configure.ac
index b503e53829..07ad0cde81 100644
--- a/deps/uv/configure.ac
+++ b/deps/uv/configure.ac
@@ -13,7 +13,7 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
AC_PREREQ(2.57)
-AC_INIT([libuv], [1.32.0], [https://github.com/libuv/libuv/issues])
+AC_INIT([libuv], [1.33.1], [https://github.com/libuv/libuv/issues])
AC_CONFIG_MACRO_DIR([m4])
m4_include([m4/libuv-extra-automake-flags.m4])
m4_include([m4/as_case.m4])
@@ -32,6 +32,7 @@ CC_CHECK_CFLAGS_APPEND([-g])
CC_CHECK_CFLAGS_APPEND([-std=gnu89])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
+CC_CHECK_CFLAGS_APPEND([-Wno-long-long])
CC_CHECK_CFLAGS_APPEND([-Wno-unused-parameter])
CC_CHECK_CFLAGS_APPEND([-Wstrict-prototypes])
# AM_PROG_AR is not available in automake v0.11 but it's essential in v0.12.
@@ -80,4 +81,5 @@ AC_CHECK_HEADERS([sys/ahafs_evProds.h])
AC_CONFIG_FILES([Makefile libuv.pc])
AC_CONFIG_LINKS([test/fixtures/empty_file:test/fixtures/empty_file])
AC_CONFIG_LINKS([test/fixtures/load_error.node:test/fixtures/load_error.node])
+AC_CONFIG_LINKS([test/fixtures/lorem_ipsum.txt:test/fixtures/lorem_ipsum.txt])
AC_OUTPUT
diff --git a/deps/uv/docs/src/fs.rst b/deps/uv/docs/src/fs.rst
index aabe49b3f3..dc16ff08e6 100644
--- a/deps/uv/docs/src/fs.rst
+++ b/deps/uv/docs/src/fs.rst
@@ -295,7 +295,8 @@ API
.. note::
On success this function allocates memory that must be freed using
- `uv_fs_req_cleanup()`.
+ `uv_fs_req_cleanup()`. `uv_fs_req_cleanup()` must be called before
+ closing the directory with `uv_fs_closedir()`.
.. c:function:: int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb)
.. c:function:: int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent)
@@ -358,10 +359,13 @@ API
is to overwrite the destination if it exists.
- `UV_FS_COPYFILE_FICLONE`: If present, `uv_fs_copyfile()` will attempt to
create a copy-on-write reflink. If the underlying platform does not
- support copy-on-write, then a fallback copy mechanism is used.
+ support copy-on-write, or an error occurs while attempting to use
+ copy-on-write, a fallback copy mechanism based on
+ :c:func:`uv_fs_sendfile()` is used.
- `UV_FS_COPYFILE_FICLONE_FORCE`: If present, `uv_fs_copyfile()` will
attempt to create a copy-on-write reflink. If the underlying platform does
- not support copy-on-write, then an error is returned.
+ not support copy-on-write, or an error occurs while attempting to use
+ copy-on-write, then an error is returned.
.. warning::
If the destination path is created, but an error occurs while copying
@@ -374,6 +378,10 @@ API
.. versionchanged:: 1.20.0 `UV_FS_COPYFILE_FICLONE` and
`UV_FS_COPYFILE_FICLONE_FORCE` are supported.
+ .. versionchanged:: 1.33.0 If an error occurs while using
+ `UV_FS_COPYFILE_FICLONE_FORCE`, that error is returned. Previously,
+ all errors were mapped to `UV_ENOTSUP`.
+
.. c:function:: int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb)
Limited equivalent to :man:`sendfile(2)`.
diff --git a/deps/uv/docs/src/handle.rst b/deps/uv/docs/src/handle.rst
index 0a25bfa8b2..943c51d94b 100644
--- a/deps/uv/docs/src/handle.rst
+++ b/deps/uv/docs/src/handle.rst
@@ -190,8 +190,11 @@ just for some handle types.
Gets or sets the size of the send buffer that the operating
system uses for the socket.
- If `*value` == 0, it will return the current send buffer size,
- otherwise it will use `*value` to set the new send buffer size.
+ If `*value` == 0, then it will set `*value` to the current send buffer size.
+ If `*value` > 0 then it will use `*value` to set the new send buffer size.
+
+ On success, zero is returned. On error, a negative result is
+ returned.
This function works for TCP, pipe and UDP handles on Unix and for TCP and
UDP handles on Windows.
@@ -204,8 +207,11 @@ just for some handle types.
Gets or sets the size of the receive buffer that the operating
system uses for the socket.
- If `*value` == 0, it will return the current receive buffer size,
- otherwise it will use `*value` to set the new receive buffer size.
+ If `*value` == 0, then it will set `*value` to the current receive buffer size.
+ If `*value` > 0 then it will use `*value` to set the new receive buffer size.
+
+ On success, zero is returned. On error, a negative result is
+ returned.
This function works for TCP, pipe and UDP handles on Unix and for TCP and
UDP handles on Windows.
diff --git a/deps/uv/docs/src/misc.rst b/deps/uv/docs/src/misc.rst
index 3ecfce486c..8e167e3ec4 100644
--- a/deps/uv/docs/src/misc.rst
+++ b/deps/uv/docs/src/misc.rst
@@ -46,6 +46,12 @@ Data types
Replacement function for :man:`free(3)`.
See :c:func:`uv_replace_allocator`.
+.. c:type:: void (*uv_random_cb)(uv_random_t* req, int status, void* buf, size_t buflen)
+
+ Callback passed to :c:func:`uv_random`. `status` is non-zero in case of
+ error. The `buf` pointer is the same pointer that was passed to
+ :c:func:`uv_random`.
+
.. c:type:: uv_file
Cross platform representation of a file handle.
@@ -191,6 +197,9 @@ Data types
char* value;
} uv_env_item_t;
+.. c:type:: uv_random_t
+
+ Random data request type.
API
---
@@ -648,3 +657,39 @@ API
argument to `gettimeofday()` is not supported, as it is considered obsolete.
.. versionadded:: 1.28.0
+
+.. c:function:: int uv_random(uv_loop_t* loop, uv_random_t* req, void* buf, size_t buflen, unsigned int flags, uv_random_cb cb)
+
+ Fill `buf` with exactly `buflen` cryptographically strong random bytes
+ acquired from the system CSPRNG. `flags` is reserved for future extension
+ and must currently be 0.
+
+ Short reads are not possible. When less than `buflen` random bytes are
+ available, a non-zero error value is returned or passed to the callback.
+
+ The synchronous version may block indefinitely when not enough entropy
+ is available. The asynchronous version may not ever finish when the system
+ is low on entropy.
+
+ Sources of entropy:
+
+ - Windows: `RtlGenRandom <https://docs.microsoft.com/en-us/windows/desktop/api/ntsecapi/nf-ntsecapi-rtlgenrandom>_`.
+ - Linux, Android: :man:`getrandom(2)` if available, or :man:`urandom(4)`
+ after reading from `/dev/random` once, or the `KERN_RANDOM`
+ :man:`sysctl(2)`.
+ - FreeBSD: `getrandom(2) <https://www.freebsd.org/cgi/man.cgi?query=getrandom&sektion=2>_`,
+ or `/dev/urandom` after reading from `/dev/random` once.
+ - macOS, OpenBSD: `getentropy(2) <https://man.openbsd.org/getentropy.2>_`
+ if available, or `/dev/urandom` after reading from `/dev/random` once.
+ - AIX: `/dev/random`.
+ - IBM i: `/dev/urandom`.
+ - Other UNIX: `/dev/urandom` after reading from `/dev/random` once.
+
+ :returns: 0 on success, or an error code < 0 on failure. The contents of
+ `buf` is undefined after an error.
+
+ .. note::
+ When using the synchronous version, both `loop` and `req` parameters
+ are not used and can be set to `NULL`.
+
+ .. versionadded:: 1.33.0
diff --git a/deps/uv/docs/src/tty.rst b/deps/uv/docs/src/tty.rst
index 9889a0a0b6..ad379dab0d 100644
--- a/deps/uv/docs/src/tty.rst
+++ b/deps/uv/docs/src/tty.rst
@@ -33,6 +33,23 @@ Data types
UV_TTY_MODE_IO
} uv_tty_mode_t;
+.. c:type:: uv_tty_vtermstate_t
+ Console virtual terminal mode type:
+
+ ::
+
+ typedef enum {
+ /*
+ * The console supports handling of virtual terminal sequences
+ * (Windows10 new console, ConEmu)
+ */
+ UV_TTY_SUPPORTED,
+ /* The console cannot process virtual terminal sequences. (Legacy
+ * console)
+ */
+ UV_TTY_UNSUPPORTED
+ } uv_tty_vtermstate_t
+
Public members
@@ -98,3 +115,25 @@ API
Gets the current Window size. On success it returns 0.
.. seealso:: The :c:type:`uv_stream_t` API functions also apply.
+
+.. c:function:: void uv_tty_set_vterm_state(uv_tty_vtermstate_t state)
+
+ Controls whether console virtual terminal sequences are processed by libuv
+ or console.
+ Useful in particular for enabling ConEmu support of ANSI X3.64 and Xterm
+ 256 colors. Otherwise Windows10 consoles are usually detected automatically.
+
+ This function is only meaningful on Windows systems. On Unix it is silently
+ ignored.
+
+ .. versionadded:: 1.33.0
+
+.. c:function:: int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state)
+
+ Get the current state of whether console virtual terminal sequences are
+ handled by libuv or the console.
+
+ This function is not implemented on Unix, where it returns ``UV_ENOTSUP``.
+
+ .. versionadded:: 1.33.0
+
diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h
index ee45bcaefc..0e8132e438 100644
--- a/deps/uv/include/uv.h
+++ b/deps/uv/include/uv.h
@@ -177,6 +177,7 @@ extern "C" {
XX(WORK, work) \
XX(GETADDRINFO, getaddrinfo) \
XX(GETNAMEINFO, getnameinfo) \
+ XX(RANDOM, random) \
typedef enum {
#define XX(code, _) UV_ ## code = UV__ ## code,
@@ -234,6 +235,7 @@ typedef struct uv_connect_s uv_connect_t;
typedef struct uv_udp_send_s uv_udp_send_t;
typedef struct uv_fs_s uv_fs_t;
typedef struct uv_work_s uv_work_t;
+typedef struct uv_random_s uv_random_t;
/* None of the above. */
typedef struct uv_env_item_s uv_env_item_t;
@@ -330,6 +332,10 @@ typedef void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req,
int status,
const char* hostname,
const char* service);
+typedef void (*uv_random_cb)(uv_random_t* req,
+ int status,
+ void* buf,
+ size_t buflen);
typedef struct {
long tv_sec;
@@ -700,10 +706,25 @@ typedef enum {
UV_TTY_MODE_IO
} uv_tty_mode_t;
+typedef enum {
+ /*
+ * The console supports handling of virtual terminal sequences
+ * (Windows10 new console, ConEmu)
+ */
+ UV_TTY_SUPPORTED,
+ /* The console cannot process the virtual terminal sequence. (Legacy
+ * console)
+ */
+ UV_TTY_UNSUPPORTED
+} uv_tty_vtermstate_t;
+
+
UV_EXTERN int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable);
UV_EXTERN int uv_tty_set_mode(uv_tty_t*, uv_tty_mode_t mode);
UV_EXTERN int uv_tty_reset_mode(void);
UV_EXTERN int uv_tty_get_winsize(uv_tty_t*, int* width, int* height);
+UV_EXTERN void uv_tty_set_vterm_state(uv_tty_vtermstate_t state);
+UV_EXTERN int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state);
#ifdef __cplusplus
extern "C++" {
@@ -1574,6 +1595,26 @@ UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size
UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size);
UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst);
+
+struct uv_random_s {
+ UV_REQ_FIELDS
+ /* read-only */
+ uv_loop_t* loop;
+ /* private */
+ int status;
+ void* buf;
+ size_t buflen;
+ uv_random_cb cb;
+ struct uv__work work_req;
+};
+
+UV_EXTERN int uv_random(uv_loop_t* loop,
+ uv_random_t* req,
+ void *buf,
+ size_t buflen,
+ unsigned flags, /* For future extension; must be 0. */
+ uv_random_cb cb);
+
#if defined(IF_NAMESIZE)
# define UV_IF_NAMESIZE (IF_NAMESIZE + 1)
#elif defined(IFNAMSIZ)
diff --git a/deps/uv/include/uv/version.h b/deps/uv/include/uv/version.h
index 928647b820..ca94be6dd4 100644
--- a/deps/uv/include/uv/version.h
+++ b/deps/uv/include/uv/version.h
@@ -31,8 +31,8 @@
*/
#define UV_VERSION_MAJOR 1
-#define UV_VERSION_MINOR 32
-#define UV_VERSION_PATCH 0
+#define UV_VERSION_MINOR 33
+#define UV_VERSION_PATCH 1
#define UV_VERSION_IS_RELEASE 1
#define UV_VERSION_SUFFIX ""
diff --git a/deps/uv/src/random.c b/deps/uv/src/random.c
new file mode 100644
index 0000000000..8c4fe32013
--- /dev/null
+++ b/deps/uv/src/random.c
@@ -0,0 +1,121 @@
+/* Copyright libuv 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 "uv-common.h"
+
+#ifdef _WIN32
+# include "win/internal.h"
+#else
+# include "unix/internal.h"
+#endif
+
+static int uv__random(void* buf, size_t buflen) {
+ int rc;
+
+#if defined(__PASE__)
+ rc = uv__random_readpath("/dev/urandom", buf, buflen);
+#elif defined(_AIX)
+ rc = uv__random_readpath("/dev/random", buf, buflen);
+#elif defined(__APPLE__) || defined(__OpenBSD__) || \
+ (defined(__ANDROID_API__) && __ANDROID_API__ >= 28)
+ rc = uv__random_getentropy(buf, buflen);
+ if (rc == UV_ENOSYS)
+ rc = uv__random_devurandom(buf, buflen);
+#elif defined(__FreeBSD__) || defined(__linux__)
+ rc = uv__random_getrandom(buf, buflen);
+ if (rc == UV_ENOSYS)
+ rc = uv__random_devurandom(buf, buflen);
+# if defined(__linux__)
+ switch (rc) {
+ case UV_EACCES:
+ case UV_EIO:
+ case UV_ELOOP:
+ case UV_EMFILE:
+ case UV_ENFILE:
+ case UV_ENOENT:
+ case UV_EPERM:
+ rc = uv__random_sysctl(buf, buflen);
+ break;
+ }
+# endif
+#elif defined(_WIN32)
+ uv__once_init();
+ rc = uv__random_rtlgenrandom(buf, buflen);
+#else
+ rc = uv__random_devurandom(buf, buflen);
+#endif
+
+ return rc;
+}
+
+
+static void uv__random_work(struct uv__work* w) {
+ uv_random_t* req;
+
+ req = container_of(w, uv_random_t, work_req);
+ req->status = uv__random(req->buf, req->buflen);
+}
+
+
+static void uv__random_done(struct uv__work* w, int status) {
+ uv_random_t* req;
+
+ req = container_of(w, uv_random_t, work_req);
+ uv__req_unregister(req->loop, req);
+
+ if (status == 0)
+ status = req->status;
+
+ req->cb(req, status, req->buf, req->buflen);
+}
+
+
+int uv_random(uv_loop_t* loop,
+ uv_random_t* req,
+ void *buf,
+ size_t buflen,
+ unsigned flags,
+ uv_random_cb cb) {
+ if (buflen > 0x7FFFFFFFu)
+ return UV_E2BIG;
+
+ if (flags != 0)
+ return UV_EINVAL;
+
+ if (cb == NULL)
+ return uv__random(buf, buflen);
+
+ uv__req_init(loop, req, UV_RANDOM);
+ req->loop = loop;
+ req->status = 0;
+ req->cb = cb;
+ req->buf = buf;
+ req->buflen = buflen;
+
+ uv__work_submit(loop,
+ &req->work_req,
+ UV__WORK_CPU,
+ uv__random_work,
+ uv__random_done);
+
+ return 0;
+}
diff --git a/deps/uv/src/threadpool.c b/deps/uv/src/threadpool.c
index 7aa575508f..a8f433f051 100644
--- a/deps/uv/src/threadpool.c
+++ b/deps/uv/src/threadpool.c
@@ -372,6 +372,10 @@ int uv_cancel(uv_req_t* req) {
loop = ((uv_getnameinfo_t*) req)->loop;
wreq = &((uv_getnameinfo_t*) req)->work_req;
break;
+ case UV_RANDOM:
+ loop = ((uv_random_t*) req)->loop;
+ wreq = &((uv_random_t*) req)->work_req;
+ break;
case UV_WORK:
loop = ((uv_work_t*) req)->loop;
wreq = &((uv_work_t*) req)->work_req;
diff --git a/deps/uv/src/unix/android-ifaddrs.c b/deps/uv/src/unix/android-ifaddrs.c
index 99fb25a43b..7d48c6af57 100644
--- a/deps/uv/src/unix/android-ifaddrs.c
+++ b/deps/uv/src/unix/android-ifaddrs.c
@@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <netinet/in.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
+#include <linux/if_packet.h>
typedef struct NetlinkList
{
@@ -475,6 +476,7 @@ static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList,
l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize));
l_addedNetmask = 1;
}
+ break;
case IFA_BROADCAST:
l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize));
break;
diff --git a/deps/uv/src/unix/bsd-ifaddrs.c b/deps/uv/src/unix/bsd-ifaddrs.c
index 0d7bbe662a..a3385af17c 100644
--- a/deps/uv/src/unix/bsd-ifaddrs.c
+++ b/deps/uv/src/unix/bsd-ifaddrs.c
@@ -69,7 +69,9 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
struct ifaddrs* addrs;
struct ifaddrs* ent;
uv_interface_address_t* address;
+#if !(defined(__CYGWIN__) || defined(__MSYS__))
int i;
+#endif
*count = 0;
*addresses = NULL;
diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c
index 366c43c2ab..ffce948c95 100644
--- a/deps/uv/src/unix/core.c
+++ b/deps/uv/src/unix/core.c
@@ -66,7 +66,8 @@ extern char** environ;
#if defined(__DragonFly__) || \
defined(__FreeBSD__) || \
defined(__FreeBSD_kernel__) || \
- defined(__NetBSD__)
+ defined(__NetBSD__) || \
+ defined(__OpenBSD__)
# include <sys/sysctl.h>
# include <sys/filio.h>
# include <sys/wait.h>
@@ -76,7 +77,8 @@ extern char** environ;
# if defined(__NetBSD__)
# define uv__accept4(a, b, c, d) paccept((a), (b), (c), NULL, (d))
# endif
-# if (defined(__FreeBSD__) && __FreeBSD__ >= 10) || defined(__NetBSD__)
+# if (defined(__FreeBSD__) && __FreeBSD__ >= 10) || \
+ defined(__NetBSD__) || defined(__OpenBSD__)
# define UV__SOCK_NONBLOCK SOCK_NONBLOCK
# define UV__SOCK_CLOEXEC SOCK_CLOEXEC
# endif
diff --git a/deps/uv/src/unix/darwin-proctitle.c b/deps/uv/src/unix/darwin-proctitle.c
index dabde2239c..eced23c2da 100644
--- a/deps/uv/src/unix/darwin-proctitle.c
+++ b/deps/uv/src/unix/darwin-proctitle.c
@@ -23,6 +23,7 @@
#include <dlfcn.h>
#include <errno.h>
+#include <pthread.h>
#include <stdlib.h>
#include <string.h>
@@ -33,61 +34,52 @@
# include <ApplicationServices/ApplicationServices.h>
#endif
+#define S(s) pCFStringCreateWithCString(NULL, (s), kCFStringEncodingUTF8)
-static int uv__pthread_setname_np(const char* name) {
- int (*dynamic_pthread_setname_np)(const char* name);
- char namebuf[64]; /* MAXTHREADNAMESIZE */
- int err;
-
- /* pthread_setname_np() first appeared in OS X 10.6 and iOS 3.2. */
- *(void **)(&dynamic_pthread_setname_np) =
- dlsym(RTLD_DEFAULT, "pthread_setname_np");
-
- if (dynamic_pthread_setname_np == NULL)
- return UV_ENOSYS;
-
- strncpy(namebuf, name, sizeof(namebuf) - 1);
- namebuf[sizeof(namebuf) - 1] = '\0';
- err = dynamic_pthread_setname_np(namebuf);
- if (err)
- return UV__ERR(err);
+#if !TARGET_OS_IPHONE
+static CFStringRef (*pCFStringCreateWithCString)(CFAllocatorRef,
+ const char*,
+ CFStringEncoding);
+static CFBundleRef (*pCFBundleGetBundleWithIdentifier)(CFStringRef);
+static void *(*pCFBundleGetDataPointerForName)(CFBundleRef, CFStringRef);
+static void *(*pCFBundleGetFunctionPointerForName)(CFBundleRef, CFStringRef);
+static CFTypeRef (*pLSGetCurrentApplicationASN)(void);
+static OSStatus (*pLSSetApplicationInformationItem)(int,
+ CFTypeRef,
+ CFStringRef,
+ CFStringRef,
+ CFDictionaryRef*);
+static void* application_services_handle;
+static void* core_foundation_handle;
+static CFBundleRef launch_services_bundle;
+static CFStringRef* display_name_key;
+static CFDictionaryRef (*pCFBundleGetInfoDictionary)(CFBundleRef);
+static CFBundleRef (*pCFBundleGetMainBundle)(void);
+static CFBundleRef hi_services_bundle;
+static CFDictionaryRef (*pLSApplicationCheckIn)(int, CFDictionaryRef);
+static void (*pLSSetApplicationLaunchServicesServerConnectionStatus)(uint64_t,
+ void*);
+
+
+UV_DESTRUCTOR(static void uv__set_process_title_platform_fini(void)) {
+ if (core_foundation_handle != NULL) {
+ dlclose(core_foundation_handle);
+ core_foundation_handle = NULL;
+ }
- return 0;
+ if (application_services_handle != NULL) {
+ dlclose(application_services_handle);
+ application_services_handle = NULL;
+ }
}
+#endif /* !TARGET_OS_IPHONE */
-int uv__set_process_title(const char* title) {
-#if TARGET_OS_IPHONE
- return uv__pthread_setname_np(title);
-#else
- CFStringRef (*pCFStringCreateWithCString)(CFAllocatorRef,
- const char*,
- CFStringEncoding);
- CFBundleRef (*pCFBundleGetBundleWithIdentifier)(CFStringRef);
- void *(*pCFBundleGetDataPointerForName)(CFBundleRef, CFStringRef);
- void *(*pCFBundleGetFunctionPointerForName)(CFBundleRef, CFStringRef);
- CFTypeRef (*pLSGetCurrentApplicationASN)(void);
- OSStatus (*pLSSetApplicationInformationItem)(int,
- CFTypeRef,
- CFStringRef,
- CFStringRef,
- CFDictionaryRef*);
- void* application_services_handle;
- void* core_foundation_handle;
- CFBundleRef launch_services_bundle;
- CFStringRef* display_name_key;
- CFDictionaryRef (*pCFBundleGetInfoDictionary)(CFBundleRef);
- CFBundleRef (*pCFBundleGetMainBundle)(void);
- CFBundleRef hi_services_bundle;
+void uv__set_process_title_platform_init(void) {
+#if !TARGET_OS_IPHONE
OSStatus (*pSetApplicationIsDaemon)(int);
- CFDictionaryRef (*pLSApplicationCheckIn)(int, CFDictionaryRef);
- void (*pLSSetApplicationLaunchServicesServerConnectionStatus)(uint64_t,
- void*);
- CFTypeRef asn;
- int err;
- err = UV_ENOENT;
application_services_handle = dlopen("/System/Library/Frameworks/"
"ApplicationServices.framework/"
"Versions/A/ApplicationServices",
@@ -116,8 +108,6 @@ int uv__set_process_title(const char* title) {
goto out;
}
-#define S(s) pCFStringCreateWithCString(NULL, (s), kCFStringEncodingUTF8)
-
launch_services_bundle =
pCFBundleGetBundleWithIdentifier(S("com.apple.LaunchServices"));
@@ -148,13 +138,14 @@ int uv__set_process_title(const char* title) {
"CFBundleGetInfoDictionary");
*(void **)(&pCFBundleGetMainBundle) = dlsym(core_foundation_handle,
"CFBundleGetMainBundle");
+
if (pCFBundleGetInfoDictionary == NULL || pCFBundleGetMainBundle == NULL)
goto out;
/* Black 10.9 magic, to remove (Not responding) mark in Activity Monitor */
hi_services_bundle =
pCFBundleGetBundleWithIdentifier(S("com.apple.HIServices"));
- err = UV_ENOENT;
+
if (hi_services_bundle == NULL)
goto out;
@@ -168,42 +159,38 @@ int uv__set_process_title(const char* title) {
pCFBundleGetFunctionPointerForName(
launch_services_bundle,
S("_LSSetApplicationLaunchServicesServerConnectionStatus"));
+
if (pSetApplicationIsDaemon == NULL ||
pLSApplicationCheckIn == NULL ||
pLSSetApplicationLaunchServicesServerConnectionStatus == NULL) {
goto out;
}
- if (pSetApplicationIsDaemon(1) != noErr)
- goto out;
+ /* Prevent crash when LaunchServices cannot be connected to. */
+ pSetApplicationIsDaemon(1);
+ return;
- pLSSetApplicationLaunchServicesServerConnectionStatus(0, NULL);
+out:
+ uv__set_process_title_platform_fini();
+#endif /* !TARGET_OS_IPHONE */
+}
- /* Check into process manager?! */
- pLSApplicationCheckIn(-2,
- pCFBundleGetInfoDictionary(pCFBundleGetMainBundle()));
- asn = pLSGetCurrentApplicationASN();
+void uv__set_process_title(const char* title) {
+ char namebuf[64 /* MAXTHREADNAMESIZE */];
- err = UV_EINVAL;
- if (pLSSetApplicationInformationItem(-2, /* Magic value. */
- asn,
- *display_name_key,
- S(title),
- NULL) != noErr) {
- goto out;
+#if !TARGET_OS_IPHONE
+ if (core_foundation_handle != NULL) {
+ CFTypeRef asn;
+ pLSSetApplicationLaunchServicesServerConnectionStatus(0, NULL);
+ pLSApplicationCheckIn(/* Magic value */ -2,
+ pCFBundleGetInfoDictionary(pCFBundleGetMainBundle()));
+ asn = pLSGetCurrentApplicationASN();
+ pLSSetApplicationInformationItem(/* Magic value */ -2, asn,
+ *display_name_key, S(title), NULL);
}
-
- uv__pthread_setname_np(title); /* Don't care if it fails. */
- err = 0;
-
-out:
- if (core_foundation_handle != NULL)
- dlclose(core_foundation_handle);
-
- if (application_services_handle != NULL)
- dlclose(application_services_handle);
-
- return err;
#endif /* !TARGET_OS_IPHONE */
+
+ uv__strscpy(namebuf, title, sizeof(namebuf));
+ pthread_setname_np(namebuf);
}
diff --git a/deps/uv/src/unix/fs.c b/deps/uv/src/unix/fs.c
index fd3dd4c287..b37cfbbc7a 100644
--- a/deps/uv/src/unix/fs.c
+++ b/deps/uv/src/unix/fs.c
@@ -78,7 +78,7 @@
defined(__NetBSD__)
# include <sys/param.h>
# include <sys/mount.h>
-#elif defined(__sun) || defined(__MVS__)
+#elif defined(__sun) || defined(__MVS__) || defined(__NetBSD__) || defined(__HAIKU__)
# include <sys/statvfs.h>
#else
# include <sys/statfs.h>
@@ -216,7 +216,11 @@ static ssize_t uv__fs_futime(uv_fs_t* req) {
ts[0].tv_nsec = (uint64_t)(req->atime * 1000000) % 1000000 * 1000;
ts[1].tv_sec = req->mtime;
ts[1].tv_nsec = (uint64_t)(req->mtime * 1000000) % 1000000 * 1000;
+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+ return utimensat(req->file, NULL, ts, 0);
+#else
return futimens(req->file, ts);
+#endif
#elif defined(__APPLE__) \
|| defined(__DragonFly__) \
|| defined(__FreeBSD__) \
@@ -528,7 +532,7 @@ static int uv__fs_closedir(uv_fs_t* req) {
static int uv__fs_statfs(uv_fs_t* req) {
uv_statfs_t* stat_fs;
-#if defined(__sun) || defined(__MVS__)
+#if defined(__sun) || defined(__MVS__) || defined(__NetBSD__) || defined(__HAIKU__)
struct statvfs buf;
if (0 != statvfs(req->path, &buf))
@@ -545,7 +549,7 @@ static int uv__fs_statfs(uv_fs_t* req) {
return -1;
}
-#if defined(__sun) || defined(__MVS__)
+#if defined(__sun) || defined(__MVS__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__)
stat_fs->f_type = 0; /* f_type is not supported. */
#else
stat_fs->f_type = buf.f_type;
@@ -1051,18 +1055,14 @@ static ssize_t uv__fs_copyfile(uv_fs_t* req) {
#ifdef FICLONE
if (req->flags & UV_FS_COPYFILE_FICLONE ||
req->flags & UV_FS_COPYFILE_FICLONE_FORCE) {
- if (ioctl(dstfd, FICLONE, srcfd) == -1) {
- /* If an error occurred that the sendfile fallback also won't handle, or
- this is a force clone then exit. Otherwise, fall through to try using
- sendfile(). */
- if (errno != ENOTTY && errno != EOPNOTSUPP && errno != EXDEV) {
- err = UV__ERR(errno);
- goto out;
- } else if (req->flags & UV_FS_COPYFILE_FICLONE_FORCE) {
- err = UV_ENOTSUP;
- goto out;
- }
- } else {
+ if (ioctl(dstfd, FICLONE, srcfd) == 0) {
+ /* ioctl() with FICLONE succeeded. */
+ goto out;
+ }
+ /* If an error occurred and force was set, return the error to the caller;
+ * fall back to sendfile() when force was not set. */
+ if (req->flags & UV_FS_COPYFILE_FICLONE_FORCE) {
+ err = UV__ERR(errno);
goto out;
}
}
diff --git a/deps/uv/src/unix/fsevents.c b/deps/uv/src/unix/fsevents.c
index ddacda31fe..deeaa63d47 100644
--- a/deps/uv/src/unix/fsevents.c
+++ b/deps/uv/src/unix/fsevents.c
@@ -263,10 +263,12 @@ static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef,
if (len < handle->realpath_len)
continue;
+ /* Make sure that realpath actually named a directory,
+ * (unless watching root, which alone keeps a trailing slash on the realpath)
+ * or that we matched the whole string */
if (handle->realpath_len != len &&
+ handle->realpath_len > 1 &&
path[handle->realpath_len] != '/')
- /* Make sure that realpath actually named a directory,
- * or that we matched the whole string */
continue;
if (memcmp(path, handle->realpath, handle->realpath_len) != 0)
diff --git a/deps/uv/src/unix/internal.h b/deps/uv/src/unix/internal.h
index 260616474e..47f220000d 100644
--- a/deps/uv/src/unix/internal.h
+++ b/deps/uv/src/unix/internal.h
@@ -270,6 +270,12 @@ uv_handle_type uv__handle_type(int fd);
FILE* uv__open_file(const char* path);
int uv__getpwuid_r(uv_passwd_t* pwd);
+/* random */
+int uv__random_devurandom(void* buf, size_t buflen);
+int uv__random_getrandom(void* buf, size_t buflen);
+int uv__random_getentropy(void* buf, size_t buflen);
+int uv__random_readpath(const char* path, void* buf, size_t buflen);
+int uv__random_sysctl(void* buf, size_t buflen);
#if defined(__APPLE__)
int uv___stream_fd(const uv_stream_t* handle);
diff --git a/deps/uv/src/unix/kqueue.c b/deps/uv/src/unix/kqueue.c
index c04e7a485c..ad09f40313 100644
--- a/deps/uv/src/unix/kqueue.c
+++ b/deps/uv/src/unix/kqueue.c
@@ -454,10 +454,26 @@ int uv_fs_event_start(uv_fs_event_t* handle,
const char* path,
unsigned int flags) {
int fd;
+#if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
+ struct stat statbuf;
+#endif
if (uv__is_active(handle))
return UV_EINVAL;
+ handle->cb = cb;
+ handle->path = uv__strdup(path);
+ if (handle->path == NULL)
+ return UV_ENOMEM;
+
+ /* TODO open asynchronously - but how do we report back errors? */
+ fd = open(handle->path, O_RDONLY);
+ if (fd == -1) {
+ uv__free(handle->path);
+ handle->path = NULL;
+ return UV__ERR(errno);
+ }
+
#if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
/* Nullify field to perform checks later */
handle->cf_cb = NULL;
@@ -465,14 +481,17 @@ int uv_fs_event_start(uv_fs_event_t* handle,
handle->realpath_len = 0;
handle->cf_flags = flags;
+ if (fstat(fd, &statbuf))
+ goto fallback;
+ /* FSEvents works only with directories */
+ if (!(statbuf.st_mode & S_IFDIR))
+ goto fallback;
+
if (!uv__has_forked_with_cfrunloop) {
int r;
- /* The fallback fd is not used */
+ /* The fallback fd is no longer needed */
+ uv__close_nocheckstdio(fd);
handle->event_watcher.fd = -1;
- handle->path = uv__strdup(path);
- if (handle->path == NULL)
- return UV_ENOMEM;
- handle->cb = cb;
r = uv__fsevents_init(handle);
if (r == 0) {
uv__handle_start(handle);
@@ -482,20 +501,9 @@ int uv_fs_event_start(uv_fs_event_t* handle,
}
return r;
}
+fallback:
#endif /* #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */
- /* TODO open asynchronously - but how do we report back errors? */
- fd = open(path, O_RDONLY);
- if (fd == -1)
- return UV__ERR(errno);
-
- handle->path = uv__strdup(path);
- if (handle->path == NULL) {
- uv__close_nocheckstdio(fd);
- return UV_ENOMEM;
- }
-
- handle->cb = cb;
uv__handle_start(handle);
uv__io_init(&handle->event_watcher, uv__fs_event, fd);
uv__io_start(handle->loop, &handle->event_watcher, POLLIN);
@@ -514,7 +522,7 @@ int uv_fs_event_stop(uv_fs_event_t* handle) {
uv__handle_stop(handle);
#if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
- if (!uv__has_forked_with_cfrunloop)
+ if (!uv__has_forked_with_cfrunloop && handle->cf_cb != NULL)
r = uv__fsevents_close(handle);
#endif
diff --git a/deps/uv/src/unix/linux-core.c b/deps/uv/src/unix/linux-core.c
index 433e201fe1..a155a374e7 100644
--- a/deps/uv/src/unix/linux-core.c
+++ b/deps/uv/src/unix/linux-core.c
@@ -90,7 +90,12 @@ int uv__platform_loop_init(uv_loop_t* loop) {
* a.k.a. Lollipop. Since EPOLL_CLOEXEC is an alias for O_CLOEXEC on all
* architectures, we just use that instead.
*/
+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+ fd = -1;
+ errno = ENOSYS;
+#else
fd = epoll_create1(O_CLOEXEC);
+#endif
/* epoll_create1() can fail either because it's not implemented (old kernel)
* or because it doesn't understand the O_CLOEXEC flag.
@@ -203,6 +208,8 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
* that being the largest value I have seen in the wild (and only once.)
*/
static const int max_safe_timeout = 1789569;
+ static int no_epoll_pwait;
+ static int no_epoll_wait;
struct epoll_event events[1024];
struct epoll_event* pe;
struct epoll_event e;
@@ -210,7 +217,7 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
QUEUE* q;
uv__io_t* w;
sigset_t sigset;
- sigset_t* psigset;
+ uint64_t sigmask;
uint64_t base;
int have_signals;
int nevents;
@@ -262,11 +269,11 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
w->events = w->pevents;
}
- psigset = NULL;
+ sigmask = 0;
if (loop->flags & UV_LOOP_BLOCK_SIGPROF) {
sigemptyset(&sigset);
sigaddset(&sigset, SIGPROF);
- psigset = &sigset;
+ sigmask |= 1 << (SIGPROF - 1);
}
assert(timeout >= -1);
@@ -281,11 +288,35 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
if (sizeof(int32_t) == sizeof(long) && timeout >= max_safe_timeout)
timeout = max_safe_timeout;
- nfds = epoll_pwait(loop->backend_fd,
- events,
- ARRAY_SIZE(events),
- timeout,
- psigset);
+ if (sigmask != 0 && no_epoll_pwait != 0)
+ if (pthread_sigmask(SIG_BLOCK, &sigset, NULL))
+ abort();
+
+ if (no_epoll_wait != 0 || (sigmask != 0 && no_epoll_pwait == 0)) {
+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+ nfds = -1;
+ errno = ENOSYS;
+#else
+ nfds = epoll_pwait(loop->backend_fd,
+ events,
+ ARRAY_SIZE(events),
+ timeout,
+ &sigset);
+#endif
+ if (nfds == -1 && errno == ENOSYS)
+ no_epoll_pwait = 1;
+ } else {
+ nfds = epoll_wait(loop->backend_fd,
+ events,
+ ARRAY_SIZE(events),
+ timeout);
+ if (nfds == -1 && errno == ENOSYS)
+ no_epoll_wait = 1;
+ }
+
+ if (sigmask != 0 && no_epoll_pwait != 0)
+ if (pthread_sigmask(SIG_UNBLOCK, &sigset, NULL))
+ abort();
/* Update loop->time unconditionally. It's tempting to skip the update when
* timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the
@@ -306,6 +337,12 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
}
if (nfds == -1) {
+ if (errno == ENOSYS) {
+ /* epoll_wait() or epoll_pwait() failed, try the other system call. */
+ assert(no_epoll_wait == 0 || no_epoll_pwait == 0);
+ continue;
+ }
+
if (errno != EINTR)
abort();
diff --git a/deps/uv/src/unix/linux-syscalls.c b/deps/uv/src/unix/linux-syscalls.c
index 5637cf98a7..950387860f 100644
--- a/deps/uv/src/unix/linux-syscalls.c
+++ b/deps/uv/src/unix/linux-syscalls.c
@@ -203,6 +203,22 @@
# endif
#endif /* __NR_statx */
+#ifndef __NR_getrandom
+# if defined(__x86_64__)
+# define __NR_getrandom 318
+# elif defined(__i386__)
+# define __NR_getrandom 355
+# elif defined(__aarch64__)
+# define __NR_getrandom 384
+# elif defined(__arm__)
+# define __NR_getrandom (UV_SYSCALL_BASE + 384)
+# elif defined(__ppc__)
+# define __NR_getrandom 359
+# elif defined(__s390__)
+# define __NR_getrandom 349
+# endif
+#endif /* __NR_getrandom */
+
int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags) {
#if defined(__i386__)
unsigned long args[4];
@@ -367,3 +383,12 @@ int uv__statx(int dirfd,
return errno = ENOSYS, -1;
#endif
}
+
+
+ssize_t uv__getrandom(void* buf, size_t buflen, unsigned flags) {
+#if defined(__NR_getrandom)
+ return syscall(__NR_getrandom, buf, buflen, flags);
+#else
+ return errno = ENOSYS, -1;
+#endif
+}
diff --git a/deps/uv/src/unix/linux-syscalls.h b/deps/uv/src/unix/linux-syscalls.h
index 7e58bfa218..b7729b82ae 100644
--- a/deps/uv/src/unix/linux-syscalls.h
+++ b/deps/uv/src/unix/linux-syscalls.h
@@ -148,5 +148,6 @@ int uv__statx(int dirfd,
int flags,
unsigned int mask,
struct uv__statx* statxbuf);
+ssize_t uv__getrandom(void* buf, size_t buflen, unsigned flags);
#endif /* UV_LINUX_SYSCALL_H_ */
diff --git a/deps/uv/src/unix/openbsd.c b/deps/uv/src/unix/openbsd.c
index 1f5228dc13..199a34658a 100644
--- a/deps/uv/src/unix/openbsd.c
+++ b/deps/uv/src/unix/openbsd.c
@@ -186,7 +186,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
int numcpus = 1;
int which[] = {CTL_HW,HW_MODEL,0};
size_t size;
- int i;
+ int i, j;
uv_cpu_info_t* cpu_info;
size = sizeof(model);
diff --git a/deps/uv/src/unix/pipe.c b/deps/uv/src/unix/pipe.c
index 8347668632..cdf24fa976 100644
--- a/deps/uv/src/unix/pipe.c
+++ b/deps/uv/src/unix/pipe.c
@@ -261,7 +261,7 @@ static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
addrlen = strlen(sa.sun_path);
- if (addrlen >= *size) {
+ if ((size_t)addrlen >= *size) {
*size = addrlen + 1;
return UV_ENOBUFS;
}
diff --git a/deps/uv/src/unix/proctitle.c b/deps/uv/src/unix/proctitle.c
index 1a8c7a7090..a5ce2030c5 100644
--- a/deps/uv/src/unix/proctitle.c
+++ b/deps/uv/src/unix/proctitle.c
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include <string.h>
+extern void uv__set_process_title_platform_init(void);
extern void uv__set_process_title(const char* title);
static uv_mutex_t process_title_mutex;
@@ -38,6 +39,9 @@ static struct {
static void init_process_title_mutex_once(void) {
uv_mutex_init(&process_title_mutex);
+#ifdef __APPLE__
+ uv__set_process_title_platform_init();
+#endif
}
diff --git a/deps/uv/src/unix/random-devurandom.c b/deps/uv/src/unix/random-devurandom.c
new file mode 100644
index 0000000000..bfc40d20f8
--- /dev/null
+++ b/deps/uv/src/unix/random-devurandom.c
@@ -0,0 +1,93 @@
+/* Copyright libuv 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 "internal.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+static uv_once_t once = UV_ONCE_INIT;
+static int status;
+
+
+int uv__random_readpath(const char* path, void* buf, size_t buflen) {
+ struct stat s;
+ size_t pos;
+ ssize_t n;
+ int fd;
+
+ fd = uv__open_cloexec(path, O_RDONLY);
+
+ if (fd == -1)
+ return UV__ERR(errno);
+
+ if (fstat(fd, &s)) {
+ uv__close(fd);
+ return UV__ERR(errno);
+ }
+
+ if (!S_ISCHR(s.st_mode)) {
+ uv__close(fd);
+ return UV_EIO;
+ }
+
+ for (pos = 0; pos != buflen; pos += n) {
+ do
+ n = read(fd, (char*) buf + pos, buflen - pos);
+ while (n == -1 && errno == EINTR);
+
+ if (n == -1) {
+ uv__close(fd);
+ return UV__ERR(errno);
+ }
+
+ if (n == 0) {
+ uv__close(fd);
+ return UV_EIO;
+ }
+ }
+
+ uv__close(fd);
+ return 0;
+}
+
+
+static void uv__random_devurandom_init(void) {
+ char c;
+
+ /* Linux's and NetBSD's random(4) man page suggests applications should read
+ * at least once from /dev/random before switching to /dev/urandom in order
+ * to seed the system RNG. Reads from /dev/random can of course block
+ * indefinitely until entropy is available but that's the point.
+ */
+ status = uv__random_readpath("/dev/random", &c, 1);
+}
+
+
+int uv__random_devurandom(void* buf, size_t buflen) {
+ uv_once(&once, uv__random_devurandom_init);
+
+ if (status != 0)
+ return status;
+
+ return uv__random_readpath("/dev/urandom", buf, buflen);
+}
diff --git a/deps/uv/src/unix/random-getentropy.c b/deps/uv/src/unix/random-getentropy.c
new file mode 100644
index 0000000000..c45d9fd4a2
--- /dev/null
+++ b/deps/uv/src/unix/random-getentropy.c
@@ -0,0 +1,57 @@
+/* Copyright libuv 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 "internal.h"
+
+#include <stddef.h>
+#include <dlfcn.h>
+
+typedef int (*uv__getentropy_cb)(void *, size_t);
+
+static uv__getentropy_cb uv__getentropy;
+static uv_once_t once = UV_ONCE_INIT;
+
+
+static void uv__random_getentropy_init(void) {
+ uv__getentropy = (uv__getentropy_cb) dlsym(RTLD_DEFAULT, "getentropy");
+}
+
+
+int uv__random_getentropy(void* buf, size_t buflen) {
+ size_t pos;
+ size_t stride;
+
+ uv_once(&once, uv__random_getentropy_init);
+
+ if (uv__getentropy == NULL)
+ return UV_ENOSYS;
+
+ /* getentropy() returns an error for requests > 256 bytes. */
+ for (pos = 0, stride = 256; pos + stride < buflen; pos += stride)
+ if (uv__getentropy((char *) buf + pos, stride))
+ return UV__ERR(errno);
+
+ if (uv__getentropy((char *) buf + pos, buflen - pos))
+ return UV__ERR(errno);
+
+ return 0;
+}
diff --git a/deps/uv/src/unix/random-getrandom.c b/deps/uv/src/unix/random-getrandom.c
new file mode 100644
index 0000000000..bcc94089bc
--- /dev/null
+++ b/deps/uv/src/unix/random-getrandom.c
@@ -0,0 +1,88 @@
+/* Copyright libuv 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 "internal.h"
+
+#ifdef __linux__
+
+#include "linux-syscalls.h"
+
+#define uv__random_getrandom_init() 0
+
+#else /* !__linux__ */
+
+#include <stddef.h>
+#include <dlfcn.h>
+
+typedef ssize_t (*uv__getrandom_cb)(void *, size_t, unsigned);
+
+static uv__getrandom_cb uv__getrandom;
+static uv_once_t once = UV_ONCE_INIT;
+
+static void uv__random_getrandom_init_once(void) {
+ uv__getrandom = (uv__getrandom_cb) dlsym(RTLD_DEFAULT, "getrandom");
+}
+
+static int uv__random_getrandom_init(void) {
+ uv_once(&once, uv__random_getrandom_init_once);
+
+ if (uv__getrandom == NULL)
+ return UV_ENOSYS;
+
+ return 0;
+}
+
+#endif /* !__linux__ */
+
+int uv__random_getrandom(void* buf, size_t buflen) {
+ ssize_t n;
+ size_t pos;
+ int rc;
+
+ rc = uv__random_getrandom_init();
+ if (rc != 0)
+ return rc;
+
+ for (pos = 0; pos != buflen; pos += n) {
+ do {
+ n = buflen - pos;
+
+ /* Most getrandom() implementations promise that reads <= 256 bytes
+ * will always succeed and won't be interrupted by signals.
+ * It's therefore useful to split it up in smaller reads because
+ * one big read may, in theory, continuously fail with EINTR.
+ */
+ if (n > 256)
+ n = 256;
+
+ n = uv__getrandom((char *) buf + pos, n, 0);
+ } while (n == -1 && errno == EINTR);
+
+ if (n == -1)
+ return UV__ERR(errno);
+
+ if (n == 0)
+ return UV_EIO;
+ }
+
+ return 0;
+}
diff --git a/deps/uv/src/unix/random-sysctl.c b/deps/uv/src/unix/random-sysctl.c
new file mode 100644
index 0000000000..fb182ded09
--- /dev/null
+++ b/deps/uv/src/unix/random-sysctl.c
@@ -0,0 +1,100 @@
+/* Copyright libuv 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 "internal.h"
+
+#include <errno.h>
+#include <string.h>
+
+#include <syscall.h>
+#include <unistd.h>
+
+
+struct uv__sysctl_args {
+ int* name;
+ int nlen;
+ void* oldval;
+ size_t* oldlenp;
+ void* newval;
+ size_t newlen;
+ unsigned long unused[4];
+};
+
+
+/* TODO(bnoordhuis) Use {CTL_KERN, KERN_ARND} on FreeBSD (and NetBSD?) */
+int uv__random_sysctl(void* buf, size_t buflen) {
+ static int name[] = {1 /*CTL_KERN*/, 40 /*KERN_RANDOM*/, 6 /*RANDOM_UUID*/};
+ struct uv__sysctl_args args;
+ char uuid[16];
+ char* p;
+ char* pe;
+ size_t n;
+
+ p = buf;
+ pe = p + buflen;
+
+ while (p < pe) {
+ memset(&args, 0, sizeof(args));
+
+ args.name = name;
+ args.nlen = ARRAY_SIZE(name);
+ args.oldval = uuid;
+ args.oldlenp = &n;
+ n = sizeof(uuid);
+
+ /* Emits a deprecation warning with some kernels but that seems like
+ * an okay trade-off for the fallback of the fallback: this function is
+ * only called when neither getrandom(2) nor /dev/urandom are available.
+ * Fails with ENOSYS on kernels configured without CONFIG_SYSCTL_SYSCALL.
+ * At least arm64 never had a _sysctl system call and therefore doesn't
+ * have a SYS__sysctl define either.
+ */
+#ifdef SYS__sysctl
+ if (syscall(SYS__sysctl, &args) == -1)
+ return UV__ERR(errno);
+#else
+ {
+ (void) &args;
+ return UV_ENOSYS;
+ }
+#endif
+
+ if (n != sizeof(uuid))
+ return UV_EIO; /* Can't happen. */
+
+ /* uuid[] is now a type 4 UUID. Bytes 6 and 8 (counting from zero) contain
+ * 4 and 5 bits of entropy, respectively. For ease of use, we skip those
+ * and only use 14 of the 16 bytes.
+ */
+ uuid[6] = uuid[14];
+ uuid[8] = uuid[15];
+
+ n = pe - p;
+ if (n > 14)
+ n = 14;
+
+ memcpy(p, uuid, n);
+ p += n;
+ }
+
+ return 0;
+}
diff --git a/deps/uv/src/unix/tty.c b/deps/uv/src/unix/tty.c
index 74d3d75d76..e7c520f774 100644
--- a/deps/uv/src/unix/tty.c
+++ b/deps/uv/src/unix/tty.c
@@ -365,3 +365,10 @@ int uv_tty_reset_mode(void) {
return err;
}
+
+void uv_tty_set_vterm_state(uv_tty_vtermstate_t state) {
+}
+
+int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state) {
+ return UV_ENOTSUP;
+}
diff --git a/deps/uv/src/unix/udp.c b/deps/uv/src/unix/udp.c
index dba8eff838..98215f7e1d 100644
--- a/deps/uv/src/unix/udp.c
+++ b/deps/uv/src/unix/udp.c
@@ -165,9 +165,6 @@ static void uv__udp_recvmsg(uv_udp_t* handle) {
*/
count = 32;
- memset(&h, 0, sizeof(h));
- h.msg_name = &peer;
-
do {
buf = uv_buf_init(NULL, 0);
handle->alloc_cb((uv_handle_t*) handle, 64 * 1024, &buf);
@@ -177,6 +174,9 @@ static void uv__udp_recvmsg(uv_udp_t* handle) {
}
assert(buf.base != NULL);
+ memset(&h, 0, sizeof(h));
+ memset(&peer, 0, sizeof(peer));
+ h.msg_name = &peer;
h.msg_namelen = sizeof(peer);
h.msg_iov = (void*) &buf;
h.msg_iovlen = 1;
@@ -193,17 +193,11 @@ static void uv__udp_recvmsg(uv_udp_t* handle) {
handle->recv_cb(handle, UV__ERR(errno), &buf, NULL, 0);
}
else {
- const struct sockaddr *addr;
- if (h.msg_namelen == 0)
- addr = NULL;
- else
- addr = (const struct sockaddr*) &peer;
-
flags = 0;
if (h.msg_flags & MSG_TRUNC)
flags |= UV_UDP_PARTIAL;
- handle->recv_cb(handle, nread, &buf, addr, flags);
+ handle->recv_cb(handle, nread, &buf, (const struct sockaddr*) &peer, flags);
}
}
/* recv_cb callback may decide to pause or close the handle */
@@ -659,6 +653,7 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
}
+#if !defined(__OpenBSD__) && !defined(__NetBSD__)
static int uv__udp_set_source_membership4(uv_udp_t* handle,
const struct sockaddr_in* multicast_addr,
const char* interface_addr,
@@ -749,6 +744,7 @@ static int uv__udp_set_source_membership6(uv_udp_t* handle,
return 0;
}
+#endif
int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
@@ -846,6 +842,7 @@ int uv_udp_set_source_membership(uv_udp_t* handle,
const char* interface_addr,
const char* source_addr,
uv_membership membership) {
+#if !defined(__OpenBSD__) && !defined(__NetBSD__)
int err;
struct sockaddr_storage mcast_addr;
struct sockaddr_in* mcast_addr4;
@@ -873,7 +870,7 @@ int uv_udp_set_source_membership(uv_udp_t* handle,
src_addr6,
membership);
}
-
+
err = uv_ip4_addr(source_addr, 0, src_addr4);
if (err)
return err;
@@ -882,6 +879,9 @@ int uv_udp_set_source_membership(uv_udp_t* handle,
interface_addr,
src_addr4,
membership);
+#else
+ return UV_ENOSYS;
+#endif
}
diff --git a/deps/uv/src/uv-common.c b/deps/uv/src/uv-common.c
index 70db53ab04..cec4ac6281 100644
--- a/deps/uv/src/uv-common.c
+++ b/deps/uv/src/uv-common.c
@@ -211,6 +211,9 @@ int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) {
memset(addr, 0, sizeof(*addr));
addr->sin_family = AF_INET;
addr->sin_port = htons(port);
+#ifdef SIN6_LEN
+ addr->sin_len = sizeof(*addr);
+#endif
return uv_inet_pton(AF_INET, ip, &(addr->sin_addr.s_addr));
}
diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c
index 5dccca7799..3ab486080c 100644
--- a/deps/uv/src/win/fs.c
+++ b/deps/uv/src/win/fs.c
@@ -36,8 +36,6 @@
#include "handle-inl.h"
#include "fs-fd-hash-inl.h"
-#include <wincrypt.h>
-
#define UV_FS_FREE_PATHS 0x0002
#define UV_FS_FREE_PTR 0x0008
@@ -1207,9 +1205,7 @@ void fs__mkdtemp(uv_fs_t* req) {
WCHAR *cp, *ep;
unsigned int tries, i;
size_t len;
- HCRYPTPROV h_crypt_prov;
uint64_t v;
- BOOL released;
len = wcslen(req->file.pathw);
ep = req->file.pathw + len;
@@ -1218,16 +1214,10 @@ void fs__mkdtemp(uv_fs_t* req) {
return;
}
- if (!CryptAcquireContext(&h_crypt_prov, NULL, NULL, PROV_RSA_FULL,
- CRYPT_VERIFYCONTEXT)) {
- SET_REQ_WIN32_ERROR(req, GetLastError());
- return;
- }
-
tries = TMP_MAX;
do {
- if (!CryptGenRandom(h_crypt_prov, sizeof(v), (BYTE*) &v)) {
- SET_REQ_WIN32_ERROR(req, GetLastError());
+ if (uv__random_rtlgenrandom((void *)&v, sizeof(v)) < 0) {
+ SET_REQ_UV_ERROR(req, UV_EIO, ERROR_IO_DEVICE);
break;
}
@@ -1248,8 +1238,6 @@ void fs__mkdtemp(uv_fs_t* req) {
}
} while (--tries);
- released = CryptReleaseContext(h_crypt_prov, 0);
- assert(released);
if (tries == 0) {
SET_REQ_RESULT(req, -1);
}
@@ -2587,6 +2575,7 @@ static void fs__statfs(uv_fs_t* req) {
stat_fs->f_files = 0;
stat_fs->f_ffree = 0;
req->ptr = stat_fs;
+ req->flags |= UV_FS_FREE_PTR;
SET_REQ_RESULT(req, 0);
}
diff --git a/deps/uv/src/win/internal.h b/deps/uv/src/win/internal.h
index 70ddaa5332..058ddb8edc 100644
--- a/deps/uv/src/win/internal.h
+++ b/deps/uv/src/win/internal.h
@@ -280,6 +280,8 @@ int uv__getsockpeername(const uv_handle_t* handle,
int* namelen,
int delayed_error);
+int uv__random_rtlgenrandom(void* buf, size_t buflen);
+
/*
* Process stdio handles.
diff --git a/deps/uv/src/win/tcp.c b/deps/uv/src/win/tcp.c
index 81e48136a3..fd34c623d8 100644
--- a/deps/uv/src/win/tcp.c
+++ b/deps/uv/src/win/tcp.c
@@ -556,7 +556,7 @@ int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb) {
if (handle->flags & UV_HANDLE_SHUTTING)
return UV_EINVAL;
- if (0 != setsockopt(handle->socket, SOL_SOCKET, SO_LINGER, &l, sizeof(l)))
+ if (0 != setsockopt(handle->socket, SOL_SOCKET, SO_LINGER, (const char*)&l, sizeof(l)))
return uv_translate_sys_error(WSAGetLastError());
uv_close((uv_handle_t*) handle, close_cb);
diff --git a/deps/uv/src/win/tty.c b/deps/uv/src/win/tty.c
index 8f84bcd0e4..5d5b92d0d2 100644
--- a/deps/uv/src/win/tty.c
+++ b/deps/uv/src/win/tty.c
@@ -149,13 +149,9 @@ static char uv_tty_default_fg_bright = 0;
static char uv_tty_default_bg_bright = 0;
static char uv_tty_default_inverse = 0;
-typedef enum {
- UV_SUPPORTED,
- UV_UNCHECKED,
- UV_UNSUPPORTED
-} uv_vtermstate_t;
/* Determine whether or not ANSI support is enabled. */
-static uv_vtermstate_t uv__vterm_state = UV_UNCHECKED;
+static BOOL uv__need_check_vterm_state = TRUE;
+static uv_tty_vtermstate_t uv__vterm_state = UV_TTY_UNSUPPORTED;
static void uv__determine_vterm_state(HANDLE handle);
void uv_console_init(void) {
@@ -169,10 +165,15 @@ void uv_console_init(void) {
0,
0);
if (uv__tty_console_handle != INVALID_HANDLE_VALUE) {
+ CONSOLE_SCREEN_BUFFER_INFO sb_info;
QueueUserWorkItem(uv__tty_console_resize_message_loop_thread,
NULL,
WT_EXECUTELONGFUNCTION);
uv_mutex_init(&uv__tty_console_resize_mutex);
+ if (GetConsoleScreenBufferInfo(uv__tty_console_handle, &sb_info)) {
+ uv__tty_console_width = sb_info.dwSize.X;
+ uv__tty_console_height = sb_info.srWindow.Bottom - sb_info.srWindow.Top + 1;
+ }
}
}
@@ -218,7 +219,7 @@ int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd, int unused) {
* between all uv_tty_t handles. */
uv_sem_wait(&uv_tty_output_lock);
- if (uv__vterm_state == UV_UNCHECKED)
+ if (uv__need_check_vterm_state)
uv__determine_vterm_state(handle);
/* Remember the original console text attributes. */
@@ -1670,7 +1671,7 @@ static int uv_tty_write_bufs(uv_tty_t* handle,
uv_buf_t buf = bufs[i];
unsigned int j;
- if (uv__vterm_state == UV_SUPPORTED && buf.len > 0) {
+ if (uv__vterm_state == UV_TTY_SUPPORTED && buf.len > 0) {
utf16_buf_used = MultiByteToWideChar(CP_UTF8,
0,
buf.base,
@@ -2275,32 +2276,24 @@ int uv_tty_reset_mode(void) {
static void uv__determine_vterm_state(HANDLE handle) {
DWORD dwMode = 0;
+ uv__need_check_vterm_state = FALSE;
if (!GetConsoleMode(handle, &dwMode)) {
- uv__vterm_state = UV_UNSUPPORTED;
return;
}
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(handle, dwMode)) {
- uv__vterm_state = UV_UNSUPPORTED;
return;
}
- uv__vterm_state = UV_SUPPORTED;
+ uv__vterm_state = UV_TTY_SUPPORTED;
}
static DWORD WINAPI uv__tty_console_resize_message_loop_thread(void* param) {
- CONSOLE_SCREEN_BUFFER_INFO sb_info;
NTSTATUS status;
ULONG_PTR conhost_pid;
MSG msg;
- if (!GetConsoleScreenBufferInfo(uv__tty_console_handle, &sb_info))
- return 0;
-
- uv__tty_console_width = sb_info.dwSize.X;
- uv__tty_console_height = sb_info.srWindow.Bottom - sb_info.srWindow.Top + 1;
-
if (pSetWinEventHook == NULL || pNtQueryInformationProcess == NULL)
return 0;
@@ -2375,6 +2368,7 @@ static void uv__tty_console_signal_resize(void) {
height = sb_info.srWindow.Bottom - sb_info.srWindow.Top + 1;
uv_mutex_lock(&uv__tty_console_resize_mutex);
+ assert(uv__tty_console_width != -1 && uv__tty_console_height != -1);
if (width != uv__tty_console_width || height != uv__tty_console_height) {
uv__tty_console_width = width;
uv__tty_console_height = height;
@@ -2384,3 +2378,17 @@ static void uv__tty_console_signal_resize(void) {
uv_mutex_unlock(&uv__tty_console_resize_mutex);
}
}
+
+void uv_tty_set_vterm_state(uv_tty_vtermstate_t state) {
+ uv_sem_wait(&uv_tty_output_lock);
+ uv__need_check_vterm_state = FALSE;
+ uv__vterm_state = state;
+ uv_sem_post(&uv_tty_output_lock);
+}
+
+int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state) {
+ uv_sem_wait(&uv_tty_output_lock);
+ *state = uv__vterm_state;
+ uv_sem_post(&uv_tty_output_lock);
+ return 0;
+}
diff --git a/deps/uv/src/win/udp.c b/deps/uv/src/win/udp.c
index 39fc34d3bf..3daa55f62d 100644
--- a/deps/uv/src/win/udp.c
+++ b/deps/uv/src/win/udp.c
@@ -856,7 +856,7 @@ int uv_udp_set_source_membership(uv_udp_t* handle,
src_addr6,
membership);
}
-
+
err = uv_ip4_addr(source_addr, 0, src_addr4);
if (err)
return err;
diff --git a/deps/uv/src/win/util.c b/deps/uv/src/win/util.c
index 8849d041bf..4bbeb31541 100644
--- a/deps/uv/src/win/util.c
+++ b/deps/uv/src/win/util.c
@@ -1417,7 +1417,9 @@ int uv_os_environ(uv_env_item_t** envitems, int* count) {
if (uv__convert_utf16_to_utf8(penv, -1, &buf) != 0)
goto fail;
- ptr = strchr(buf, '=');
+ /* Using buf + 1 here because we know that `buf` has length at least 1,
+ * and some special environment variables on Windows start with a = sign. */
+ ptr = strchr(buf + 1, '=');
if (ptr == NULL) {
uv__free(buf);
goto do_continue;
@@ -1858,3 +1860,16 @@ int uv_gettimeofday(uv_timeval64_t* tv) {
tv->tv_usec = (int32_t) (((ularge.QuadPart - epoch) % 10000000L) / 10);
return 0;
}
+
+int uv__random_rtlgenrandom(void* buf, size_t buflen) {
+ if (pRtlGenRandom == NULL)
+ return UV_ENOSYS;
+
+ if (buflen == 0)
+ return 0;
+
+ if (pRtlGenRandom(buf, buflen) == FALSE)
+ return UV_EIO;
+
+ return 0;
+}
diff --git a/deps/uv/src/win/winapi.c b/deps/uv/src/win/winapi.c
index 19e4377faf..85a9de8a22 100644
--- a/deps/uv/src/win/winapi.c
+++ b/deps/uv/src/win/winapi.c
@@ -36,6 +36,9 @@ sNtQueryDirectoryFile pNtQueryDirectoryFile;
sNtQuerySystemInformation pNtQuerySystemInformation;
sNtQueryInformationProcess pNtQueryInformationProcess;
+/* Advapi32 function pointers */
+sRtlGenRandom pRtlGenRandom;
+
/* Kernel32 function pointers */
sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx;
@@ -51,6 +54,7 @@ void uv_winapi_init(void) {
HMODULE powrprof_module;
HMODULE user32_module;
HMODULE kernel32_module;
+ HMODULE advapi32_module;
ntdll_module = GetModuleHandleA("ntdll.dll");
if (ntdll_module == NULL) {
@@ -135,4 +139,11 @@ void uv_winapi_init(void) {
GetProcAddress(user32_module, "SetWinEventHook");
}
+ advapi32_module = GetModuleHandleA("advapi32.dll");
+ if (advapi32_module == NULL) {
+ uv_fatal_error(GetLastError(), "GetModuleHandleA");
+ }
+
+ pRtlGenRandom =
+ (sRtlGenRandom) GetProcAddress(advapi32_module, "SystemFunction036");
}
diff --git a/deps/uv/src/win/winapi.h b/deps/uv/src/win/winapi.h
index 322a212dd7..fcc70652a9 100644
--- a/deps/uv/src/win/winapi.h
+++ b/deps/uv/src/win/winapi.h
@@ -4590,6 +4590,11 @@ typedef NTSTATUS (NTAPI *sNtQueryInformationProcess)
PULONG ReturnLength);
/*
+ * Advapi32 headers
+ */
+typedef BOOLEAN (WINAPI *sRtlGenRandom)(PVOID Buffer, ULONG BufferLength);
+
+/*
* Kernel32 headers
*/
#ifndef FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
@@ -4731,6 +4736,9 @@ extern sNtQueryDirectoryFile pNtQueryDirectoryFile;
extern sNtQuerySystemInformation pNtQuerySystemInformation;
extern sNtQueryInformationProcess pNtQueryInformationProcess;
+/* Advapi32 function pointers */
+extern sRtlGenRandom pRtlGenRandom;
+
/* Kernel32 function pointers */
extern sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx;
diff --git a/deps/uv/src/win/winsock.h b/deps/uv/src/win/winsock.h
index 7ecb755bfb..2af958870a 100644
--- a/deps/uv/src/win/winsock.h
+++ b/deps/uv/src/win/winsock.h
@@ -54,6 +54,14 @@
# define SIO_BASE_HANDLE 0x48000022
#endif
+#ifndef MCAST_JOIN_SOURCE_GROUP
+# define MCAST_JOIN_SOURCE_GROUP 45
+#endif
+
+#ifndef MCAST_LEAVE_SOURCE_GROUP
+# define MCAST_LEAVE_SOURCE_GROUP 46
+#endif
+
/*
* TDI defines that are only in the DDK.
* We only need receive flags so far.
diff --git a/deps/uv/test/test-env-vars.c b/deps/uv/test/test-env-vars.c
index 3814699356..3c9de95b10 100644
--- a/deps/uv/test/test-env-vars.c
+++ b/deps/uv/test/test-env-vars.c
@@ -30,7 +30,7 @@ TEST_IMPL(env_vars) {
const char* name2 = "UV_TEST_FOO2";
char buf[BUF_SIZE];
size_t size;
- int i, r, envcount, found;
+ int i, r, envcount, found, found_win_special;
uv_env_item_t* envitems;
/* Reject invalid inputs when setting an environment variable */
@@ -108,6 +108,7 @@ TEST_IMPL(env_vars) {
ASSERT(envcount > 0);
found = 0;
+ found_win_special = 0;
for (i = 0; i < envcount; i++) {
/* printf("Env: %s = %s\n", envitems[i].name, envitems[i].value); */
@@ -117,10 +118,15 @@ TEST_IMPL(env_vars) {
} else if (strcmp(envitems[i].name, name2) == 0) {
found++;
ASSERT(strlen(envitems[i].value) == 0);
+ } else if (envitems[i].name[0] == '=') {
+ found_win_special++;
}
}
ASSERT(found == 2);
+#ifdef _WIN32
+ ASSERT(found_win_special > 0);
+#endif
uv_os_free_environ(envitems, envcount);
diff --git a/deps/uv/test/test-fs-copyfile.c b/deps/uv/test/test-fs-copyfile.c
index def3d967e7..c3e698e585 100644
--- a/deps/uv/test/test-fs-copyfile.c
+++ b/deps/uv/test/test-fs-copyfile.c
@@ -188,7 +188,7 @@ TEST_IMPL(fs_copyfile) {
unlink(dst);
r = uv_fs_copyfile(NULL, &req, fixture, dst, UV_FS_COPYFILE_FICLONE_FORCE,
NULL);
- ASSERT(r == 0 || r == UV_ENOSYS || r == UV_ENOTSUP);
+ ASSERT(r <= 0);
if (r == 0)
handle_result(&req);
diff --git a/deps/uv/test/test-fs-event.c b/deps/uv/test/test-fs-event.c
index ea34bd63a7..e694d258ea 100644
--- a/deps/uv/test/test-fs-event.c
+++ b/deps/uv/test/test-fs-event.c
@@ -25,6 +25,10 @@
#include <string.h>
#include <fcntl.h>
+#if defined(__APPLE__) && !TARGET_OS_IPHONE
+# include <AvailabilityMacros.h>
+#endif
+
#ifndef HAVE_KQUEUE
# if defined(__APPLE__) || \
defined(__DragonFly__) || \
@@ -47,6 +51,7 @@ static const char file_prefix[] = "fsevent-";
static const int fs_event_file_count = 16;
#if defined(__APPLE__) || defined(_WIN32)
static const char file_prefix_in_subdir[] = "subdir";
+static int fs_multievent_cb_called;
#endif
static uv_timer_t timer;
static int timer_cb_called;
@@ -280,7 +285,7 @@ static void fs_event_cb_dir_multi_file_in_subdir(uv_fs_event_t* handle,
if (filename && strcmp(filename, file_prefix_in_subdir) == 0)
return;
#endif
- fs_event_cb_called++;
+ fs_multievent_cb_called++;
ASSERT(handle == &fs_event);
ASSERT(status == 0);
ASSERT(events == UV_CHANGE || events == UV_RENAME);
@@ -298,7 +303,7 @@ static void fs_event_cb_dir_multi_file_in_subdir(uv_fs_event_t* handle,
if (fs_event_created + fs_event_removed == fs_event_file_count) {
/* Once we've processed all create events, delete all files */
ASSERT(0 == uv_timer_start(&timer, fs_event_unlink_files_in_subdir, 1, 0));
- } else if (fs_event_cb_called == 2 * fs_event_file_count) {
+ } else if (fs_multievent_cb_called == 2 * fs_event_file_count) {
/* Once we've processed all create and delete events, stop watching */
uv_close((uv_handle_t*) &timer, close_cb);
uv_close((uv_handle_t*) handle, close_cb);
@@ -393,6 +398,21 @@ static void timer_cb_watch_twice(uv_timer_t* handle) {
uv_close((uv_handle_t*) handle, NULL);
}
+static void fs_event_cb_close(uv_fs_event_t* handle,
+ const char* filename,
+ int events,
+ int status) {
+ ASSERT(status == 0);
+
+ ASSERT(fs_event_cb_called < 3);
+ ++fs_event_cb_called;
+
+ if (fs_event_cb_called == 3) {
+ uv_close((uv_handle_t*) handle, close_cb);
+ }
+}
+
+
TEST_IMPL(fs_event_watch_dir) {
#if defined(NO_FS_EVENTS)
RETURN_SKIP(NO_FS_EVENTS);
@@ -434,10 +454,12 @@ TEST_IMPL(fs_event_watch_dir) {
return 0;
}
+
TEST_IMPL(fs_event_watch_dir_recursive) {
#if defined(__APPLE__) || defined(_WIN32)
uv_loop_t* loop;
int r;
+ uv_fs_event_t fs_event_root;
/* Setup */
loop = uv_default_loop();
@@ -451,17 +473,37 @@ TEST_IMPL(fs_event_watch_dir_recursive) {
r = uv_fs_event_init(loop, &fs_event);
ASSERT(r == 0);
- r = uv_fs_event_start(&fs_event, fs_event_cb_dir_multi_file_in_subdir, "watch_dir", UV_FS_EVENT_RECURSIVE);
+ r = uv_fs_event_start(&fs_event,
+ fs_event_cb_dir_multi_file_in_subdir,
+ "watch_dir",
+ UV_FS_EVENT_RECURSIVE);
ASSERT(r == 0);
r = uv_timer_init(loop, &timer);
ASSERT(r == 0);
r = uv_timer_start(&timer, fs_event_create_files_in_subdir, 100, 0);
ASSERT(r == 0);
+#ifndef _WIN32
+ /* Also try to watch the root directory.
+ * This will be noisier, so we're just checking for any couple events to happen. */
+ r = uv_fs_event_init(loop, &fs_event_root);
+ ASSERT(r == 0);
+ r = uv_fs_event_start(&fs_event_root,
+ fs_event_cb_close,
+ "/",
+ UV_FS_EVENT_RECURSIVE);
+ ASSERT(r == 0);
+#else
+ fs_event_cb_called += 3;
+ close_cb_called += 1;
+ (void)fs_event_root;
+#endif
+
uv_run(loop, UV_RUN_DEFAULT);
- ASSERT(fs_event_cb_called == fs_event_created + fs_event_removed);
- ASSERT(close_cb_called == 2);
+ ASSERT(fs_multievent_cb_called == fs_event_created + fs_event_removed);
+ ASSERT(fs_event_cb_called == 3);
+ ASSERT(close_cb_called == 3);
/* Cleanup */
fs_event_unlink_files_in_subdir(NULL);
@@ -596,6 +638,7 @@ TEST_IMPL(fs_event_watch_file_exact_path) {
* versions. Give a long delay here to let the system settle before running
* the test. */
uv_sleep(1100);
+ uv_update_time(loop);
#endif
r = uv_fs_event_init(loop, &fs_event);
@@ -656,6 +699,13 @@ TEST_IMPL(fs_event_watch_file_current_dir) {
/* Setup */
remove("watch_file");
create_file("watch_file");
+#if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_12)
+ /* Empirically, kevent seems to (sometimes) report the preceeding
+ * create_file events prior to macOS 10.11.6 in the subsequent fs_event_start
+ * So let the system settle before running the test. */
+ uv_sleep(1100);
+ uv_update_time(loop);
+#endif
r = uv_fs_event_init(loop, &fs_event);
ASSERT(r == 0);
@@ -864,18 +914,6 @@ TEST_IMPL(fs_event_close_with_pending_event) {
return 0;
}
-static void fs_event_cb_close(uv_fs_event_t* handle, const char* filename,
- int events, int status) {
- ASSERT(status == 0);
-
- ASSERT(fs_event_cb_called < 3);
- ++fs_event_cb_called;
-
- if (fs_event_cb_called == 3) {
- uv_close((uv_handle_t*) handle, close_cb);
- }
-}
-
TEST_IMPL(fs_event_close_in_callback) {
#if defined(NO_FS_EVENTS)
RETURN_SKIP(NO_FS_EVENTS);
diff --git a/deps/uv/test/test-fs-readdir.c b/deps/uv/test/test-fs-readdir.c
index a767f1fb88..5efc853cc6 100644
--- a/deps/uv/test/test-fs-readdir.c
+++ b/deps/uv/test/test-fs-readdir.c
@@ -62,12 +62,12 @@ static void empty_readdir_cb(uv_fs_t* req) {
ASSERT(req->fs_type == UV_FS_READDIR);
ASSERT(req->result == 0);
dir = req->ptr;
+ uv_fs_req_cleanup(req);
r = uv_fs_closedir(uv_default_loop(),
&closedir_req,
dir,
empty_closedir_cb);
ASSERT(r == 0);
- uv_fs_req_cleanup(req);
}
static void empty_opendir_cb(uv_fs_t* req) {
diff --git a/deps/uv/test/test-ip4-addr.c b/deps/uv/test/test-ip4-addr.c
index c72f36a694..dfefb0f914 100644
--- a/deps/uv/test/test-ip4-addr.c
+++ b/deps/uv/test/test-ip4-addr.c
@@ -42,6 +42,10 @@ TEST_IMPL(ip4_addr) {
ASSERT(UV_EINVAL == uv_ip4_addr("2555.0.0.0", TEST_PORT, &addr));
ASSERT(UV_EINVAL == uv_ip4_addr("255", TEST_PORT, &addr));
+#ifdef SIN6_LEN
+ ASSERT(addr.sin_len == sizeof(addr));
+#endif
+
/* for broken address family */
ASSERT(UV_EAFNOSUPPORT == uv_inet_pton(42, "127.0.0.1",
&addr.sin_addr.s_addr));
diff --git a/deps/uv/test/test-ip6-addr.c b/deps/uv/test/test-ip6-addr.c
index bbf33a4854..39d570659d 100644
--- a/deps/uv/test/test-ip6-addr.c
+++ b/deps/uv/test/test-ip6-addr.c
@@ -160,3 +160,12 @@ TEST_IMPL(ip6_pton) {
#undef GOOD_ADDR_LIST
#undef BAD_ADDR_LIST
+
+#ifdef SIN6_LEN
+TEST_IMPL(ip6_sin6_len) {
+ struct sockaddr_in6 s;
+ ASSERT(uv_ip6_addr("::", 0, &s) < 0);
+ ASSERT(s.sin6_len == sizeof(s));
+ return 0;
+}
+#endif
diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h
index b6066f2727..ad94c52d0c 100644
--- a/deps/uv/test/test-list.h
+++ b/deps/uv/test/test-list.h
@@ -395,6 +395,7 @@ TEST_DECLARE (threadpool_queue_work_einval)
TEST_DECLARE (threadpool_multiple_event_loops)
TEST_DECLARE (threadpool_cancel_getaddrinfo)
TEST_DECLARE (threadpool_cancel_getnameinfo)
+TEST_DECLARE (threadpool_cancel_random)
TEST_DECLARE (threadpool_cancel_work)
TEST_DECLARE (threadpool_cancel_fs)
TEST_DECLARE (threadpool_cancel_single)
@@ -464,6 +465,9 @@ HELPER_DECLARE (pipe_echo_server)
TEST_DECLARE (queue_foreach_delete)
+TEST_DECLARE (random_async)
+TEST_DECLARE (random_sync)
+
TEST_DECLARE (handle_type_name)
TEST_DECLARE (req_type_name)
TEST_DECLARE (getters_setters)
@@ -1000,6 +1004,7 @@ TASK_LIST_START
TEST_ENTRY_CUSTOM (threadpool_multiple_event_loops, 0, 0, 60000)
TEST_ENTRY (threadpool_cancel_getaddrinfo)
TEST_ENTRY (threadpool_cancel_getnameinfo)
+ TEST_ENTRY (threadpool_cancel_random)
TEST_ENTRY (threadpool_cancel_work)
TEST_ENTRY (threadpool_cancel_fs)
TEST_ENTRY (threadpool_cancel_single)
@@ -1018,6 +1023,9 @@ TASK_LIST_START
TEST_ENTRY (queue_foreach_delete)
+ TEST_ENTRY (random_async)
+ TEST_ENTRY (random_sync)
+
TEST_ENTRY (handle_type_name)
TEST_ENTRY (req_type_name)
TEST_ENTRY (getters_setters)
diff --git a/deps/uv/test/test-process-title-threadsafe.c b/deps/uv/test/test-process-title-threadsafe.c
index 5b30f17f44..19098eda0c 100644
--- a/deps/uv/test/test-process-title-threadsafe.c
+++ b/deps/uv/test/test-process-title-threadsafe.c
@@ -25,11 +25,7 @@
#include <string.h>
-#ifdef __APPLE__
-# define NUM_ITERATIONS 10
-#else
-# define NUM_ITERATIONS 50
-#endif
+#define NUM_ITERATIONS 50
static const char* titles[] = {
"8L2NY0Kdj0XyNFZnmUZigIOfcWjyNr0SkMmUhKw99VLUsZFrvCQQC3XIRfNR8pjyMjXObllled",
diff --git a/deps/uv/test/test-random.c b/deps/uv/test/test-random.c
new file mode 100644
index 0000000000..2e3ce4424d
--- /dev/null
+++ b/deps/uv/test/test-random.c
@@ -0,0 +1,94 @@
+/* Copyright libuv 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 <string.h>
+
+static char scratch[256];
+static int random_cb_called;
+
+
+static void random_cb(uv_random_t* req, int status, void* buf, size_t buflen) {
+ char zero[sizeof(scratch)];
+
+ memset(zero, 0, sizeof(zero));
+
+ ASSERT(0 == status);
+ ASSERT(buf == (void*) scratch);
+
+ if (random_cb_called == 0) {
+ ASSERT(buflen == 0);
+ ASSERT(0 == memcmp(scratch, zero, sizeof(zero)));
+ } else {
+ ASSERT(buflen == sizeof(scratch));
+ /* Buy a lottery ticket if you manage to trip this assertion. */
+ ASSERT(0 != memcmp(scratch, zero, sizeof(zero)));
+ }
+
+ random_cb_called++;
+}
+
+
+TEST_IMPL(random_async) {
+ uv_random_t req;
+ uv_loop_t* loop;
+
+ loop = uv_default_loop();
+ ASSERT(UV_EINVAL == uv_random(loop, &req, scratch, sizeof(scratch), -1,
+ random_cb));
+ ASSERT(UV_E2BIG == uv_random(loop, &req, scratch, -1, -1, random_cb));
+
+ ASSERT(0 == uv_random(loop, &req, scratch, 0, 0, random_cb));
+ ASSERT(0 == random_cb_called);
+
+ ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
+ ASSERT(1 == random_cb_called);
+
+ ASSERT(0 == uv_random(loop, &req, scratch, sizeof(scratch), 0, random_cb));
+ ASSERT(1 == random_cb_called);
+
+ ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
+ ASSERT(2 == random_cb_called);
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
+
+
+TEST_IMPL(random_sync) {
+ char zero[256];
+ char buf[256];
+
+ ASSERT(UV_EINVAL == uv_random(NULL, NULL, buf, sizeof(buf), -1, NULL));
+ ASSERT(UV_E2BIG == uv_random(NULL, NULL, buf, -1, -1, NULL));
+
+ memset(buf, 0, sizeof(buf));
+ ASSERT(0 == uv_random(NULL, NULL, buf, sizeof(buf), 0, NULL));
+
+ /* Buy a lottery ticket if you manage to trip this assertion. */
+ memset(zero, 0, sizeof(zero));
+ ASSERT(0 != memcmp(buf, zero, sizeof(zero)));
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
diff --git a/deps/uv/test/test-threadpool-cancel.c b/deps/uv/test/test-threadpool-cancel.c
index dd13d8ae4b..be252c6f72 100644
--- a/deps/uv/test/test-threadpool-cancel.c
+++ b/deps/uv/test/test-threadpool-cancel.c
@@ -37,6 +37,11 @@ struct cancel_info {
uv_timer_t timer_handle;
};
+struct random_info {
+ uv_random_t random_req;
+ char buf[1];
+};
+
static unsigned fs_cb_called;
static unsigned done_cb_called;
static unsigned done2_cb_called;
@@ -143,6 +148,19 @@ static void nop_done_cb(uv_work_t* req, int status) {
}
+static void nop_random_cb(uv_random_t* req, int status, void* buf, size_t len) {
+ struct random_info* ri;
+
+ ri = container_of(req, struct random_info, random_req);
+
+ ASSERT(status == UV_ECANCELED);
+ ASSERT(buf == (void*) ri->buf);
+ ASSERT(len == sizeof(ri->buf));
+
+ done_cb_called++;
+}
+
+
TEST_IMPL(threadpool_cancel_getaddrinfo) {
uv_getaddrinfo_t reqs[4];
struct cancel_info ci;
@@ -212,6 +230,29 @@ TEST_IMPL(threadpool_cancel_getnameinfo) {
}
+TEST_IMPL(threadpool_cancel_random) {
+ struct random_info req;
+ uv_loop_t* loop;
+
+ saturate_threadpool();
+ loop = uv_default_loop();
+ ASSERT(0 == uv_random(loop,
+ &req.random_req,
+ &req.buf,
+ sizeof(req.buf),
+ 0,
+ nop_random_cb));
+ ASSERT(0 == uv_cancel((uv_req_t*) &req));
+ ASSERT(0 == done_cb_called);
+ unblock_threadpool();
+ ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
+ ASSERT(1 == done_cb_called);
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
+
+
TEST_IMPL(threadpool_cancel_work) {
struct cancel_info ci;
uv_work_t reqs[16];
diff --git a/deps/uv/test/test-udp-multicast-join.c b/deps/uv/test/test-udp-multicast-join.c
index 9ee80e44e7..6bac072db0 100644
--- a/deps/uv/test/test-udp-multicast-join.c
+++ b/deps/uv/test/test-udp-multicast-join.c
@@ -74,7 +74,7 @@ static void sv_send_cb(uv_udp_send_t* req, int status) {
static int do_send(uv_udp_send_t* send_req) {
uv_buf_t buf;
struct sockaddr_in addr;
-
+
buf = uv_buf_init("PING", 4);
ASSERT(0 == uv_ip4_addr(MULTICAST_ADDR, TEST_PORT, &addr));
diff --git a/deps/uv/test/test-udp-multicast-join6.c b/deps/uv/test/test-udp-multicast-join6.c
index edcd371b2c..5de27a7fb2 100644
--- a/deps/uv/test/test-udp-multicast-join6.c
+++ b/deps/uv/test/test-udp-multicast-join6.c
@@ -86,7 +86,7 @@ static void sv_send_cb(uv_udp_send_t* req, int status) {
static int do_send(uv_udp_send_t* send_req) {
uv_buf_t buf;
struct sockaddr_in6 addr;
-
+
buf = uv_buf_init("PING", 4);
ASSERT(0 == uv_ip6_addr(MULTICAST_ADDR, TEST_PORT, &addr));
@@ -195,7 +195,7 @@ TEST_IMPL(udp_multicast_join6) {
r = uv_udp_recv_start(&server, alloc_cb, cl_recv_cb);
ASSERT(r == 0);
-
+
r = do_send(&req);
ASSERT(r == 0);
diff --git a/deps/uv/test/test.gyp b/deps/uv/test/test.gyp
index 60792ad6eb..73ff42c56e 100644
--- a/deps/uv/test/test.gyp
+++ b/deps/uv/test/test.gyp
@@ -52,6 +52,7 @@
'test-hrtime.c',
'test-idle.c',
'test-idna.c',
+ 'test-ip4-addr.c',
'test-ip6-addr.c',
'test-ipc-heavy-traffic-deadlock-bug.c',
'test-ipc-send-recv.c',
@@ -90,6 +91,7 @@
'test-process-title.c',
'test-process-title-threadsafe.c',
'test-queue-foreach-delete.c',
+ 'test-random.c',
'test-ref.c',
'test-run-nowait.c',
'test-run-once.c',
@@ -158,8 +160,6 @@
'test-udp-multicast-join6.c',
'test-dlerror.c',
'test-udp-multicast-ttl.c',
- 'test-ip4-addr.c',
- 'test-ip6-addr.c',
'test-udp-multicast-interface.c',
'test-udp-multicast-interface6.c',
'test-udp-try-send.c',
diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp
index 75a6d97819..051bdc937c 100644
--- a/deps/uv/uv.gyp
+++ b/deps/uv/uv.gyp
@@ -75,6 +75,7 @@
'src/idna.h',
'src/inet.c',
'src/queue.h',
+ 'src/random.c',
'src/strscpy.c',
'src/strscpy.h',
'src/threadpool.c',
@@ -167,6 +168,7 @@
'src/unix/pipe.c',
'src/unix/poll.c',
'src/unix/process.c',
+ 'src/unix/random-devurandom.c',
'src/unix/signal.c',
'src/unix/spinlock.h',
'src/unix/stream.c',
@@ -226,7 +228,8 @@
'sources': [
'src/unix/darwin.c',
'src/unix/fsevents.c',
- 'src/unix/darwin-proctitle.c'
+ 'src/unix/darwin-proctitle.c',
+ 'src/unix/random-getentropy.c',
],
'defines': [
'_DARWIN_USE_64_BIT_INODE=1',
@@ -241,6 +244,8 @@
'src/unix/linux-syscalls.c',
'src/unix/linux-syscalls.h',
'src/unix/procfs-exepath.c',
+ 'src/unix/random-getrandom.c',
+ 'src/unix/random-sysctl.c',
'src/unix/sysinfo-loadavg.c',
],
'link_settings': {
@@ -320,8 +325,14 @@
[ 'OS=="freebsd" or OS=="dragonflybsd"', {
'sources': [ 'src/unix/freebsd.c' ],
}],
+ [ 'OS=="freebsd"', {
+ 'sources': [ 'src/unix/random-getrandom.c' ],
+ }],
[ 'OS=="openbsd"', {
- 'sources': [ 'src/unix/openbsd.c' ],
+ 'sources': [
+ 'src/unix/openbsd.c',
+ 'src/unix/random-getentropy.c',
+ ],
}],
[ 'OS=="netbsd"', {
'link_settings': {