[Cmake-commits] CMake branch, master, updated. v3.10.2-875-gb058d92

Kitware Robot kwrobot at kitware.com
Mon Jan 22 10:25:08 EST 2018


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, master has been updated
       via  b058d92b33ab37a56ac4dcf2f1e49aec89f554e3 (commit)
       via  5d13fa1010223a65e64f5270db06ada9c6a0ae0d (commit)
       via  de9c3d796491daf6276fe6df25b3ef5d85501ff0 (commit)
       via  63f263b27fa9b9c63f038ff108118726bc9c5c64 (commit)
       via  c81ace7ab7e5e325fef9339ed3ea05abbd0f8be4 (commit)
       via  2a9614039ed7b9f9c5d28922131aef51c530d70a (commit)
       via  a629c338a1a7a09f827a185af4f8586fd8dd570d (commit)
       via  b4e6911bf51c05001c1b3cbcc04587afa6ba4577 (commit)
       via  6db7b35236b81a73047a47c0f70f8befbf2ca51f (commit)
       via  b58d48c15f9ee18015960e2eed7410f5166c855f (commit)
       via  f4a26c748b5ea2cafecdf5490b744a2b167c01ae (commit)
       via  3c08d2075fae7ef62838f18e1af5d398c6401572 (commit)
       via  2557cad5ec5084f86d4bb56c82939a49fc9d3071 (commit)
       via  a7d344be712cddd906f066809896c208ae99702c (commit)
       via  33802b316855b69f2a542574caa4dd2fbe569b11 (commit)
       via  ff91a5d54b5458eaebab6be814624925a02eccd7 (commit)
       via  a1d491ca2721d234eb10553a9e336f51752aa2a0 (commit)
       via  7c525c84166d2d45933fb9907682d4f834392520 (commit)
       via  e8b57c2283f731f42b4c7eece0531dab67df3d41 (commit)
      from  1f35d3f20a0d7929fb8efc19b6bdc546c16a2c71 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b058d92b33ab37a56ac4dcf2f1e49aec89f554e3
commit b058d92b33ab37a56ac4dcf2f1e49aec89f554e3
Merge: 5d13fa1 b4e6911
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Jan 22 15:23:14 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Jan 22 10:23:41 2018 -0500

    Merge topic 'autogen-first-line-fix'
    
    b4e6911b Autogen: Tests: Extend AUTOUIC include patterns test
    ff91a5d5 Autogen: Tests: Extend AUTOMOC include patterns test
    a1d491ca Autogen: AUTOMOC/UIC fix for moc/uic include on the first line
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !1670


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5d13fa1010223a65e64f5270db06ada9c6a0ae0d
commit 5d13fa1010223a65e64f5270db06ada9c6a0ae0d
Merge: de9c3d7 2557cad
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Jan 22 15:20:48 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Jan 22 10:20:53 2018 -0500

    Merge topic 'boost-optional-components'
    
    2557cad5 FindBoost: support OPTIONAL_COMPONENTS
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Acked-by: Paul "TBBle" Hampson <paul.hampson at pobox.com>
    Merge-request: !1660


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=de9c3d796491daf6276fe6df25b3ef5d85501ff0
commit de9c3d796491daf6276fe6df25b3ef5d85501ff0
Merge: 63f263b 33802b3
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Jan 22 15:19:23 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Jan 22 10:19:28 2018 -0500

    Merge topic 'serverCrashIfNoMinVersionSpecified'
    
    33802b31 server: fix crash if no min version specified
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !1673


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=63f263b27fa9b9c63f038ff108118726bc9c5c64
commit 63f263b27fa9b9c63f038ff108118726bc9c5c64
Merge: c81ace7 6db7b35
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Jan 22 15:18:39 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Jan 22 10:18:44 2018 -0500

    Merge topic 'update-libuv'
    
    6db7b352 libuv: Update build within CMake
    b58d48c1 Merge branch 'upstream-libuv' into update-libuv
    f4a26c74 libuv 2018-01-19 (63de1eca)
    e8b57c22 libuv: Teach import script to add missing newlines
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !1666


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c81ace7ab7e5e325fef9339ed3ea05abbd0f8be4
commit c81ace7ab7e5e325fef9339ed3ea05abbd0f8be4
Merge: 2a96140 3c08d20
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Jan 22 15:18:10 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Jan 22 10:18:15 2018 -0500

    Merge topic 'FindJava-jdk-10'
    
    3c08d207 FindJava: ignore javah for JDK 10, it has been removed
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !1637


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2a9614039ed7b9f9c5d28922131aef51c530d70a
commit 2a9614039ed7b9f9c5d28922131aef51c530d70a
Merge: a629c33 a7d344b
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Jan 22 15:17:21 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Jan 22 10:17:25 2018 -0500

    Merge topic 'FindPythonInterp-windows-current-user'
    
    a7d344be FindPythonInterp: support single-user installs on Windows
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !1674


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a629c338a1a7a09f827a185af4f8586fd8dd570d
commit a629c338a1a7a09f827a185af4f8586fd8dd570d
Merge: 1f35d3f 7c525c8
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Jan 22 15:16:08 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Jan 22 10:16:16 2018 -0500

    Merge topic 'genex-output-known-extension'
    
    7c525c84 genex: generated files have known extensions
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !1669


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b4e6911bf51c05001c1b3cbcc04587afa6ba4577
commit b4e6911bf51c05001c1b3cbcc04587afa6ba4577
Author:     Sebastian Holtermann <sebholt at xwmw.org>
AuthorDate: Thu Jan 18 11:13:41 2018 +0100
Commit:     Sebastian Holtermann <sebholt at xwmw.org>
CommitDate: Fri Jan 19 19:21:12 2018 +0100

    Autogen: Tests: Extend AUTOUIC include patterns test

diff --git a/Tests/QtAutogen/CommonTests.cmake b/Tests/QtAutogen/CommonTests.cmake
index 2c2e6d6..094a755 100644
--- a/Tests/QtAutogen/CommonTests.cmake
+++ b/Tests/QtAutogen/CommonTests.cmake
@@ -1,9 +1,7 @@
 # Autogen tests common for Qt4 and Qt5
 ADD_AUTOGEN_TEST(MocOnly mocOnly)
 ADD_AUTOGEN_TEST(MocOptions mocOptions)
-if(QT_TEST_ALLOW_QT_MACROS)
-  ADD_AUTOGEN_TEST(UicOnly uicOnly)
-endif()
+ADD_AUTOGEN_TEST(UicOnly uicOnly)
 ADD_AUTOGEN_TEST(RccOnly rccOnly)
 ADD_AUTOGEN_TEST(RccEmpty rccEmpty)
 ADD_AUTOGEN_TEST(RccOffMocLibrary)
diff --git a/Tests/QtAutogen/UicOnly/CMakeLists.txt b/Tests/QtAutogen/UicOnly/CMakeLists.txt
index 89a9a1b..f927f72 100644
--- a/Tests/QtAutogen/UicOnly/CMakeLists.txt
+++ b/Tests/QtAutogen/UicOnly/CMakeLists.txt
@@ -3,8 +3,6 @@ project(UicOnly)
 include("../AutogenTest.cmake")
 
 # Test AUTOUIC being enabled only
-# The moc is provided by the Qt macro
-qtx_wrap_cpp(uicOnlyMoc uiconly.h)
-add_executable(uicOnly uiconly.cpp ${uicOnlyMoc})
+add_executable(uicOnly main.cpp UicOnly.cpp)
 set_property(TARGET uicOnly PROPERTY AUTOUIC ON)
 target_link_libraries(uicOnly ${QT_LIBRARIES})
diff --git a/Tests/QtAutogen/UicOnly/UicOnly.cpp b/Tests/QtAutogen/UicOnly/UicOnly.cpp
new file mode 100644
index 0000000..8eee6d2
--- /dev/null
+++ b/Tests/QtAutogen/UicOnly/UicOnly.cpp
@@ -0,0 +1,18 @@
+#include "ui_uiC.h"
+#include "ui_uiD.h"
+// AUTOUIC includes on the first two lines of a source file
+#include "UicOnly.hpp"
+
+UicOnly::UicOnly()
+  : uiA(new Ui::UiA)
+  , uiB(new Ui::UiB)
+{
+  Ui::UiC uiC;
+  Ui::UiD uiD;
+}
+
+UicOnly::~UicOnly()
+{
+  delete uiB;
+  delete uiA;
+}
diff --git a/Tests/QtAutogen/UicOnly/UicOnly.hpp b/Tests/QtAutogen/UicOnly/UicOnly.hpp
new file mode 100644
index 0000000..24e1e0b
--- /dev/null
+++ b/Tests/QtAutogen/UicOnly/UicOnly.hpp
@@ -0,0 +1,15 @@
+#include "ui_uiA.h"
+#include "ui_uiB.h"
+// AUTOUIC includes on the first two lines of a header file
+#include <QObject>
+
+class UicOnly : public QObject
+{
+public:
+  UicOnly();
+  ~UicOnly();
+
+private:
+  Ui::UiA* uiA;
+  Ui::UiB* uiB;
+};
diff --git a/Tests/QtAutogen/UicOnly/main.cpp b/Tests/QtAutogen/UicOnly/main.cpp
new file mode 100644
index 0000000..bdd242e
--- /dev/null
+++ b/Tests/QtAutogen/UicOnly/main.cpp
@@ -0,0 +1,7 @@
+#include "UicOnly.hpp"
+
+int main(int argc, char* argv[])
+{
+  UicOnly uicOnly;
+  return 0;
+}
diff --git a/Tests/QtAutogen/UicOnly/uiconly.ui b/Tests/QtAutogen/UicOnly/uiA.ui
similarity index 87%
copy from Tests/QtAutogen/UicOnly/uiconly.ui
copy to Tests/QtAutogen/UicOnly/uiA.ui
index 13fb832..4c5762e 100644
--- a/Tests/QtAutogen/UicOnly/uiconly.ui
+++ b/Tests/QtAutogen/UicOnly/uiA.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>UicOnly</class>
- <widget class="QWidget" name="UicOnly">
+ <class>UiA</class>
+ <widget class="QWidget" name="UiA">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/Tests/QtAutogen/UicOnly/uiconly.ui b/Tests/QtAutogen/UicOnly/uiB.ui
similarity index 87%
copy from Tests/QtAutogen/UicOnly/uiconly.ui
copy to Tests/QtAutogen/UicOnly/uiB.ui
index 13fb832..6ca77de 100644
--- a/Tests/QtAutogen/UicOnly/uiconly.ui
+++ b/Tests/QtAutogen/UicOnly/uiB.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>UicOnly</class>
- <widget class="QWidget" name="UicOnly">
+ <class>UiB</class>
+ <widget class="QWidget" name="UiB">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/Tests/QtAutogen/UicOnly/uiconly.ui b/Tests/QtAutogen/UicOnly/uiC.ui
similarity index 87%
copy from Tests/QtAutogen/UicOnly/uiconly.ui
copy to Tests/QtAutogen/UicOnly/uiC.ui
index 13fb832..6802550 100644
--- a/Tests/QtAutogen/UicOnly/uiconly.ui
+++ b/Tests/QtAutogen/UicOnly/uiC.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>UicOnly</class>
- <widget class="QWidget" name="UicOnly">
+ <class>UiC</class>
+ <widget class="QWidget" name="UiC">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/Tests/QtAutogen/UicOnly/uiconly.ui b/Tests/QtAutogen/UicOnly/uiD.ui
similarity index 87%
rename from Tests/QtAutogen/UicOnly/uiconly.ui
rename to Tests/QtAutogen/UicOnly/uiD.ui
index 13fb832..aad79cf 100644
--- a/Tests/QtAutogen/UicOnly/uiconly.ui
+++ b/Tests/QtAutogen/UicOnly/uiD.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>UicOnly</class>
- <widget class="QWidget" name="UicOnly">
+ <class>UiD</class>
+ <widget class="QWidget" name="UiD">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/Tests/QtAutogen/UicOnly/uiconly.cpp b/Tests/QtAutogen/UicOnly/uiconly.cpp
deleted file mode 100644
index 7b91b25..0000000
--- a/Tests/QtAutogen/UicOnly/uiconly.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-
-#include "uiconly.h"
-
-UicOnly::UicOnly(QWidget* parent)
-  : QWidget(parent)
-  , ui(new Ui::UicOnly)
-{
-}
-
-UicOnly::~UicOnly()
-{
-  delete ui;
-}
-
-int main()
-{
-  return 0;
-}
diff --git a/Tests/QtAutogen/UicOnly/uiconly.h b/Tests/QtAutogen/UicOnly/uiconly.h
deleted file mode 100644
index 8f4eebe..0000000
--- a/Tests/QtAutogen/UicOnly/uiconly.h
+++ /dev/null
@@ -1,20 +0,0 @@
-
-#ifndef UIC_ONLY_H
-#define UIC_ONLY_H
-
-#include <QWidget>
-
-#include "ui_uiconly.h"
-
-class UicOnly : public QWidget
-{
-  Q_OBJECT
-public:
-  explicit UicOnly(QWidget* parent = 0);
-  ~UicOnly();
-
-private:
-  Ui::UicOnly* ui;
-};
-
-#endif

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6db7b35236b81a73047a47c0f70f8befbf2ca51f
commit 6db7b35236b81a73047a47c0f70f8befbf2ca51f
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Tue Jan 16 11:50:49 2018 -0500
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Jan 19 13:03:12 2018 -0500

    libuv: Update build within CMake
    
    Update our CMake build rules to account for upstream changes.

diff --git a/Utilities/cmlibuv/CMakeLists.txt b/Utilities/cmlibuv/CMakeLists.txt
index 4c8e228..ba1638e 100644
--- a/Utilities/cmlibuv/CMakeLists.txt
+++ b/Utilities/cmlibuv/CMakeLists.txt
@@ -26,6 +26,7 @@ set(uv_sources
   src/threadpool.c
   src/uv-common.c
   src/uv-common.h
+  src/uv-data-getter-setters.c
   src/version.c
   )
 if(WIN32)
@@ -130,6 +131,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "AIX")
     )
   list(APPEND uv_sources
     src/unix/aix.c
+    src/unix/aix-common.c
     )
 endif()
 
@@ -170,7 +172,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
     src/unix/fsevents.c
     src/unix/kqueue.c
     src/unix/proctitle.c
-    src/unix/pthread-barrier.c
     )
 endif()
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b58d48c15f9ee18015960e2eed7410f5166c855f
commit b58d48c15f9ee18015960e2eed7410f5166c855f
Merge: e8b57c2 f4a26c7
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Jan 19 13:03:04 2018 -0500
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Jan 19 13:03:04 2018 -0500

    Merge branch 'upstream-libuv' into update-libuv
    
    * upstream-libuv:
      libuv 2018-01-19 (63de1eca)

diff --cc Utilities/cmlibuv/include/uv-unix.h
index ff59bcb,0000000..d8d031f
mode 100644,000000..100644
--- a/Utilities/cmlibuv/include/uv-unix.h
+++ b/Utilities/cmlibuv/include/uv-unix.h
@@@ -1,382 -1,0 +1,478 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#ifndef UV_UNIX_H
 +#define UV_UNIX_H
 +
 +#include <sys/types.h>
 +#include <sys/stat.h>
 +#include <fcntl.h>
 +#include <dirent.h>
 +
 +#include <sys/socket.h>
 +#include <netinet/in.h>
 +#include <netinet/tcp.h>
 +#include <arpa/inet.h>
 +#include <netdb.h>
 +
 +#include <termios.h>
 +#include <pwd.h>
 +
 +#if !defined(__MVS__)
 +#include <semaphore.h>
 +#endif
 +#include <pthread.h>
 +#include <signal.h>
 +
 +#include "uv-threadpool.h"
 +
 +#ifdef CMAKE_BOOTSTRAP
 +# include "uv-posix.h"
 +#elif defined(__linux__)
 +# include "uv-linux.h"
 +#elif defined (__MVS__)
 +# include "uv-os390.h"
++#elif defined(_PASE)
++# include "uv-posix.h"
 +#elif defined(_AIX)
 +# include "uv-aix.h"
 +#elif defined(__sun)
 +# include "uv-sunos.h"
 +#elif defined(__APPLE__)
 +# include "uv-darwin.h"
 +#elif defined(__DragonFly__)       || \
 +      defined(__FreeBSD__)         || \
 +      defined(__FreeBSD_kernel__)  || \
 +      defined(__OpenBSD__)         || \
 +      defined(__NetBSD__)
 +# include "uv-bsd.h"
 +#elif defined(__CYGWIN__) || defined(__MSYS__)
 +# include "uv-posix.h"
 +#endif
 +
 +#ifndef PTHREAD_BARRIER_SERIAL_THREAD
 +# include "pthread-barrier.h"
 +#endif
 +
 +#ifndef NI_MAXHOST
 +# define NI_MAXHOST 1025
 +#endif
 +
 +#ifndef NI_MAXSERV
 +# define NI_MAXSERV 32
 +#endif
 +
 +#ifndef UV_IO_PRIVATE_PLATFORM_FIELDS
 +# define UV_IO_PRIVATE_PLATFORM_FIELDS /* empty */
 +#endif
 +
 +struct uv__io_s;
 +struct uv_loop_s;
 +
 +typedef void (*uv__io_cb)(struct uv_loop_s* loop,
 +                          struct uv__io_s* w,
 +                          unsigned int events);
 +typedef struct uv__io_s uv__io_t;
 +
 +struct uv__io_s {
 +  uv__io_cb cb;
 +  void* pending_queue[2];
 +  void* watcher_queue[2];
 +  unsigned int pevents; /* Pending event mask i.e. mask at next tick. */
 +  unsigned int events;  /* Current event mask. */
 +  int fd;
 +  UV_IO_PRIVATE_PLATFORM_FIELDS
 +};
 +
 +#ifndef UV_PLATFORM_SEM_T
 +# define UV_PLATFORM_SEM_T sem_t
 +#endif
 +
 +#ifndef UV_PLATFORM_LOOP_FIELDS
 +# define UV_PLATFORM_LOOP_FIELDS /* empty */
 +#endif
 +
 +#ifndef UV_PLATFORM_FS_EVENT_FIELDS
 +# define UV_PLATFORM_FS_EVENT_FIELDS /* empty */
 +#endif
 +
 +#ifndef UV_STREAM_PRIVATE_PLATFORM_FIELDS
 +# define UV_STREAM_PRIVATE_PLATFORM_FIELDS /* empty */
 +#endif
 +
 +/* Note: May be cast to struct iovec. See writev(2). */
 +typedef struct uv_buf_t {
 +  char* base;
 +  size_t len;
 +} uv_buf_t;
 +
 +typedef int uv_file;
 +typedef int uv_os_sock_t;
 +typedef int uv_os_fd_t;
++typedef pid_t uv_pid_t;
 +
 +#ifdef CMAKE_BOOTSTRAP
 +#define UV_ONCE_INIT 0
 +typedef int uv_once_t;
 +typedef int uv_thread_t;
 +typedef int uv_mutex_t;
 +typedef int uv_rwlock_t;
 +typedef int uv_sem_t;
 +typedef int uv_cond_t;
 +typedef int uv_key_t;
 +typedef int uv_barrier_t;
 +#else
 +#define UV_ONCE_INIT PTHREAD_ONCE_INIT
 +
 +typedef pthread_once_t uv_once_t;
 +typedef pthread_t uv_thread_t;
 +typedef pthread_mutex_t uv_mutex_t;
 +typedef pthread_rwlock_t uv_rwlock_t;
 +typedef UV_PLATFORM_SEM_T uv_sem_t;
 +typedef pthread_cond_t uv_cond_t;
 +typedef pthread_key_t uv_key_t;
 +typedef pthread_barrier_t uv_barrier_t;
 +#endif
 +
 +
 +/* Platform-specific definitions for uv_spawn support. */
 +typedef gid_t uv_gid_t;
 +typedef uid_t uv_uid_t;
 +
 +typedef struct dirent uv__dirent_t;
 +
 +#if defined(DT_UNKNOWN)
 +# define HAVE_DIRENT_TYPES
 +# if defined(DT_REG)
 +#  define UV__DT_FILE DT_REG
 +# else
 +#  define UV__DT_FILE -1
 +# endif
 +# if defined(DT_DIR)
 +#  define UV__DT_DIR DT_DIR
 +# else
 +#  define UV__DT_DIR -2
 +# endif
 +# if defined(DT_LNK)
 +#  define UV__DT_LINK DT_LNK
 +# else
 +#  define UV__DT_LINK -3
 +# endif
 +# if defined(DT_FIFO)
 +#  define UV__DT_FIFO DT_FIFO
 +# else
 +#  define UV__DT_FIFO -4
 +# endif
 +# if defined(DT_SOCK)
 +#  define UV__DT_SOCKET DT_SOCK
 +# else
 +#  define UV__DT_SOCKET -5
 +# endif
 +# if defined(DT_CHR)
 +#  define UV__DT_CHAR DT_CHR
 +# else
 +#  define UV__DT_CHAR -6
 +# endif
 +# if defined(DT_BLK)
 +#  define UV__DT_BLOCK DT_BLK
 +# else
 +#  define UV__DT_BLOCK -7
 +# endif
 +#endif
 +
 +/* Platform-specific definitions for uv_dlopen support. */
 +#define UV_DYNAMIC /* empty */
 +
 +typedef struct {
 +  void* handle;
 +  char* errmsg;
 +} uv_lib_t;
 +
 +#define UV_LOOP_PRIVATE_FIELDS                                                \
 +  unsigned long flags;                                                        \
 +  int backend_fd;                                                             \
 +  void* pending_queue[2];                                                     \
 +  void* watcher_queue[2];                                                     \
 +  uv__io_t** watchers;                                                        \
 +  unsigned int nwatchers;                                                     \
 +  unsigned int nfds;                                                          \
 +  void* wq[2];                                                                \
 +  uv_mutex_t wq_mutex;                                                        \
 +  uv_async_t wq_async;                                                        \
 +  uv_rwlock_t cloexec_lock;                                                   \
 +  uv_handle_t* closing_handles;                                               \
 +  void* process_handles[2];                                                   \
 +  void* prepare_handles[2];                                                   \
 +  void* check_handles[2];                                                     \
 +  void* idle_handles[2];                                                      \
 +  void* async_handles[2];                                                     \
 +  void (*async_unused)(void);  /* TODO(bnoordhuis) Remove in libuv v2. */     \
 +  uv__io_t async_io_watcher;                                                  \
 +  int async_wfd;                                                              \
 +  struct {                                                                    \
 +    void* min;                                                                \
 +    unsigned int nelts;                                                       \
 +  } timer_heap;                                                               \
 +  uint64_t timer_counter;                                                     \
 +  uint64_t time;                                                              \
 +  int signal_pipefd[2];                                                       \
 +  uv__io_t signal_io_watcher;                                                 \
 +  uv_signal_t child_watcher;                                                  \
 +  int emfile_fd;                                                              \
 +  UV_PLATFORM_LOOP_FIELDS                                                     \
 +
 +#define UV_REQ_TYPE_PRIVATE /* empty */
 +
 +#define UV_REQ_PRIVATE_FIELDS  /* empty */
 +
 +#define UV_PRIVATE_REQ_TYPES /* empty */
 +
 +#define UV_WRITE_PRIVATE_FIELDS                                               \
 +  void* queue[2];                                                             \
 +  unsigned int write_index;                                                   \
 +  uv_buf_t* bufs;                                                             \
 +  unsigned int nbufs;                                                         \
 +  int error;                                                                  \
 +  uv_buf_t bufsml[4];                                                         \
 +
 +#define UV_CONNECT_PRIVATE_FIELDS                                             \
 +  void* queue[2];                                                             \
 +
 +#define UV_SHUTDOWN_PRIVATE_FIELDS /* empty */
 +
 +#define UV_UDP_SEND_PRIVATE_FIELDS                                            \
 +  void* queue[2];                                                             \
 +  struct sockaddr_storage addr;                                               \
 +  unsigned int nbufs;                                                         \
 +  uv_buf_t* bufs;                                                             \
 +  ssize_t status;                                                             \
 +  uv_udp_send_cb send_cb;                                                     \
 +  uv_buf_t bufsml[4];                                                         \
 +
 +#define UV_HANDLE_PRIVATE_FIELDS                                              \
 +  uv_handle_t* next_closing;                                                  \
 +  unsigned int flags;                                                         \
 +
 +#define UV_STREAM_PRIVATE_FIELDS                                              \
 +  uv_connect_t *connect_req;                                                  \
 +  uv_shutdown_t *shutdown_req;                                                \
 +  uv__io_t io_watcher;                                                        \
 +  void* write_queue[2];                                                       \
 +  void* write_completed_queue[2];                                             \
 +  uv_connection_cb connection_cb;                                             \
 +  int delayed_error;                                                          \
 +  int accepted_fd;                                                            \
 +  void* queued_fds;                                                           \
 +  UV_STREAM_PRIVATE_PLATFORM_FIELDS                                           \
 +
 +#define UV_TCP_PRIVATE_FIELDS /* empty */
 +
 +#define UV_UDP_PRIVATE_FIELDS                                                 \
 +  uv_alloc_cb alloc_cb;                                                       \
 +  uv_udp_recv_cb recv_cb;                                                     \
 +  uv__io_t io_watcher;                                                        \
 +  void* write_queue[2];                                                       \
 +  void* write_completed_queue[2];                                             \
 +
 +#define UV_PIPE_PRIVATE_FIELDS                                                \
 +  const char* pipe_fname; /* strdup'ed */
 +
 +#define UV_POLL_PRIVATE_FIELDS                                                \
 +  uv__io_t io_watcher;
 +
 +#define UV_PREPARE_PRIVATE_FIELDS                                             \
 +  uv_prepare_cb prepare_cb;                                                   \
 +  void* queue[2];                                                             \
 +
 +#define UV_CHECK_PRIVATE_FIELDS                                               \
 +  uv_check_cb check_cb;                                                       \
 +  void* queue[2];                                                             \
 +
 +#define UV_IDLE_PRIVATE_FIELDS                                                \
 +  uv_idle_cb idle_cb;                                                         \
 +  void* queue[2];                                                             \
 +
 +#define UV_ASYNC_PRIVATE_FIELDS                                               \
 +  uv_async_cb async_cb;                                                       \
 +  void* queue[2];                                                             \
 +  int pending;                                                                \
 +
 +#define UV_TIMER_PRIVATE_FIELDS                                               \
 +  uv_timer_cb timer_cb;                                                       \
 +  void* heap_node[3];                                                         \
 +  uint64_t timeout;                                                           \
 +  uint64_t repeat;                                                            \
 +  uint64_t start_id;
 +
 +#define UV_GETADDRINFO_PRIVATE_FIELDS                                         \
 +  struct uv__work work_req;                                                   \
 +  uv_getaddrinfo_cb cb;                                                       \
 +  struct addrinfo* hints;                                                     \
 +  char* hostname;                                                             \
 +  char* service;                                                              \
 +  struct addrinfo* addrinfo;                                                  \
 +  int retcode;
 +
 +#define UV_GETNAMEINFO_PRIVATE_FIELDS                                         \
 +  struct uv__work work_req;                                                   \
 +  uv_getnameinfo_cb getnameinfo_cb;                                           \
 +  struct sockaddr_storage storage;                                            \
 +  int flags;                                                                  \
 +  char host[NI_MAXHOST];                                                      \
 +  char service[NI_MAXSERV];                                                   \
 +  int retcode;
 +
 +#define UV_PROCESS_PRIVATE_FIELDS                                             \
 +  void* queue[2];                                                             \
 +  int status;                                                                 \
 +
 +#define UV_FS_PRIVATE_FIELDS                                                  \
 +  const char *new_path;                                                       \
 +  uv_file file;                                                               \
 +  int flags;                                                                  \
 +  mode_t mode;                                                                \
 +  unsigned int nbufs;                                                         \
 +  uv_buf_t* bufs;                                                             \
 +  off_t off;                                                                  \
 +  uv_uid_t uid;                                                               \
 +  uv_gid_t gid;                                                               \
 +  double atime;                                                               \
 +  double mtime;                                                               \
 +  struct uv__work work_req;                                                   \
 +  uv_buf_t bufsml[4];                                                         \
 +
 +#define UV_WORK_PRIVATE_FIELDS                                                \
 +  struct uv__work work_req;
 +
 +#define UV_TTY_PRIVATE_FIELDS                                                 \
 +  struct termios orig_termios;                                                \
 +  int mode;
 +
 +#define UV_SIGNAL_PRIVATE_FIELDS                                              \
 +  /* RB_ENTRY(uv_signal_s) tree_entry; */                                     \
 +  struct {                                                                    \
 +    struct uv_signal_s* rbe_left;                                             \
 +    struct uv_signal_s* rbe_right;                                            \
 +    struct uv_signal_s* rbe_parent;                                           \
 +    int rbe_color;                                                            \
 +  } tree_entry;                                                               \
 +  /* Use two counters here so we don have to fiddle with atomics. */          \
 +  unsigned int caught_signals;                                                \
 +  unsigned int dispatched_signals;
 +
 +#define UV_FS_EVENT_PRIVATE_FIELDS                                            \
 +  uv_fs_event_cb cb;                                                          \
 +  UV_PLATFORM_FS_EVENT_FIELDS                                                 \
 +
++/* fs open() flags supported on this platform: */
++#if defined(O_APPEND)
++# define UV_FS_O_APPEND       O_APPEND
++#else
++# define UV_FS_O_APPEND       0
++#endif
++#if defined(O_CREAT)
++# define UV_FS_O_CREAT        O_CREAT
++#else
++# define UV_FS_O_CREAT        0
++#endif
++#if defined(O_DIRECT)
++# define UV_FS_O_DIRECT       O_DIRECT
++#else
++# define UV_FS_O_DIRECT       0
++#endif
++#if defined(O_DIRECTORY)
++# define UV_FS_O_DIRECTORY    O_DIRECTORY
++#else
++# define UV_FS_O_DIRECTORY    0
++#endif
++#if defined(O_DSYNC)
++# define UV_FS_O_DSYNC        O_DSYNC
++#else
++# define UV_FS_O_DSYNC        0
++#endif
++#if defined(O_EXCL)
++# define UV_FS_O_EXCL         O_EXCL
++#else
++# define UV_FS_O_EXCL         0
++#endif
++#if defined(O_EXLOCK)
++# define UV_FS_O_EXLOCK       O_EXLOCK
++#else
++# define UV_FS_O_EXLOCK       0
++#endif
++#if defined(O_NOATIME)
++# define UV_FS_O_NOATIME      O_NOATIME
++#else
++# define UV_FS_O_NOATIME      0
++#endif
++#if defined(O_NOCTTY)
++# define UV_FS_O_NOCTTY       O_NOCTTY
++#else
++# define UV_FS_O_NOCTTY       0
++#endif
++#if defined(O_NOFOLLOW)
++# define UV_FS_O_NOFOLLOW     O_NOFOLLOW
++#else
++# define UV_FS_O_NOFOLLOW     0
++#endif
++#if defined(O_NONBLOCK)
++# define UV_FS_O_NONBLOCK     O_NONBLOCK
++#else
++# define UV_FS_O_NONBLOCK     0
++#endif
++#if defined(O_RDONLY)
++# define UV_FS_O_RDONLY       O_RDONLY
++#else
++# define UV_FS_O_RDONLY       0
++#endif
++#if defined(O_RDWR)
++# define UV_FS_O_RDWR         O_RDWR
++#else
++# define UV_FS_O_RDWR         0
++#endif
++#if defined(O_SYMLINK)
++# define UV_FS_O_SYMLINK      O_SYMLINK
++#else
++# define UV_FS_O_SYMLINK      0
++#endif
++#if defined(O_SYNC)
++# define UV_FS_O_SYNC         O_SYNC
++#else
++# define UV_FS_O_SYNC         0
++#endif
++#if defined(O_TRUNC)
++# define UV_FS_O_TRUNC        O_TRUNC
++#else
++# define UV_FS_O_TRUNC        0
++#endif
++#if defined(O_WRONLY)
++# define UV_FS_O_WRONLY       O_WRONLY
++#else
++# define UV_FS_O_WRONLY       0
++#endif
++
++/* fs open() flags supported on other platforms: */
++#define UV_FS_O_RANDOM        0
++#define UV_FS_O_SHORT_LIVED   0
++#define UV_FS_O_SEQUENTIAL    0
++#define UV_FS_O_TEMPORARY     0
++
 +#endif /* UV_UNIX_H */
diff --cc Utilities/cmlibuv/include/uv-win.h
index d3e32a5,0000000..6486aab
mode 100644,000000..100644
--- a/Utilities/cmlibuv/include/uv-win.h
+++ b/Utilities/cmlibuv/include/uv-win.h
@@@ -1,661 -1,0 +1,687 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#ifndef _WIN32_WINNT
- # define _WIN32_WINNT   0x0502
++# define _WIN32_WINNT   0x0600
 +#endif
 +
 +#if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
 +typedef intptr_t ssize_t;
 +# define _SSIZE_T_
 +# define _SSIZE_T_DEFINED
 +#endif
 +
 +#include <winsock2.h>
 +
 +#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
 +typedef struct pollfd {
 +  SOCKET fd;
 +  short  events;
 +  short  revents;
 +} WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD;
 +#endif
 +
 +#ifndef LOCALE_INVARIANT
 +# define LOCALE_INVARIANT 0x007f
 +#endif
 +
 +#include <mswsock.h>
 +#include <ws2tcpip.h>
 +#include <windows.h>
 +
 +#include <process.h>
 +#include <signal.h>
 +#include <fcntl.h>
 +#include <sys/stat.h>
 +
 +#if defined(_MSC_VER) && _MSC_VER < 1600
 +# include "stdint-msvc2008.h"
 +#else
 +# include <stdint.h>
 +#endif
 +
 +#include "tree.h"
 +#include "uv-threadpool.h"
 +
 +#define MAX_PIPENAME_LEN 256
 +
 +#ifndef S_IFLNK
 +# define S_IFLNK 0xA000
 +#endif
 +
 +/* Additional signals supported by uv_signal and or uv_kill. The CRT defines
 + * the following signals already:
 + *
 + *   #define SIGINT           2
 + *   #define SIGILL           4
 + *   #define SIGABRT_COMPAT   6
 + *   #define SIGFPE           8
 + *   #define SIGSEGV         11
 + *   #define SIGTERM         15
 + *   #define SIGBREAK        21
 + *   #define SIGABRT         22
 + *
 + * The additional signals have values that are common on other Unix
 + * variants (Linux and Darwin)
 + */
 +#define SIGHUP                1
 +#define SIGKILL               9
 +#define SIGWINCH             28
 +
 +/* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many */
 +/* unix-like platforms. However MinGW doesn't define it, so we do. */
 +#ifndef SIGABRT_COMPAT
 +# define SIGABRT_COMPAT       6
 +#endif
 +
 +/*
 + * Guids and typedefs for winsock extension functions
 + * Mingw32 doesn't have these :-(
 + */
 +#ifndef WSAID_ACCEPTEX
 +# define WSAID_ACCEPTEX                                                       \
 +         {0xb5367df1, 0xcbac, 0x11cf,                                         \
 +         {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
 +#endif
 +
 +#ifndef WSAID_CONNECTEX
 +# define WSAID_CONNECTEX                                                      \
 +         {0x25a207b9, 0xddf3, 0x4660,                                         \
 +         {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}}
 +#endif
 +
 +#ifndef WSAID_GETACCEPTEXSOCKADDRS
 +# define WSAID_GETACCEPTEXSOCKADDRS                                           \
 +         {0xb5367df2, 0xcbac, 0x11cf,                                         \
 +         {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
 +#endif
 +
 +#ifndef WSAID_DISCONNECTEX
 +# define WSAID_DISCONNECTEX                                                   \
 +         {0x7fda2e11, 0x8630, 0x436f,                                         \
 +         {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
 +#endif
 +
 +#ifndef WSAID_TRANSMITFILE
 +# define WSAID_TRANSMITFILE                                                   \
 +         {0xb5367df0, 0xcbac, 0x11cf,                                         \
 +         {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
 +#endif
 +
 +#if (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) \
 + || (defined(_MSC_VER) && _MSC_VER < 1500)
 +  typedef BOOL (PASCAL *LPFN_ACCEPTEX)
 +                      (SOCKET sListenSocket,
 +                       SOCKET sAcceptSocket,
 +                       PVOID lpOutputBuffer,
 +                       DWORD dwReceiveDataLength,
 +                       DWORD dwLocalAddressLength,
 +                       DWORD dwRemoteAddressLength,
 +                       LPDWORD lpdwBytesReceived,
 +                       LPOVERLAPPED lpOverlapped);
 +
 +  typedef BOOL (PASCAL *LPFN_CONNECTEX)
 +                      (SOCKET s,
 +                       const struct sockaddr* name,
 +                       int namelen,
 +                       PVOID lpSendBuffer,
 +                       DWORD dwSendDataLength,
 +                       LPDWORD lpdwBytesSent,
 +                       LPOVERLAPPED lpOverlapped);
 +
 +  typedef void (PASCAL *LPFN_GETACCEPTEXSOCKADDRS)
 +                      (PVOID lpOutputBuffer,
 +                       DWORD dwReceiveDataLength,
 +                       DWORD dwLocalAddressLength,
 +                       DWORD dwRemoteAddressLength,
 +                       LPSOCKADDR* LocalSockaddr,
 +                       LPINT LocalSockaddrLength,
 +                       LPSOCKADDR* RemoteSockaddr,
 +                       LPINT RemoteSockaddrLength);
 +
 +  typedef BOOL (PASCAL *LPFN_DISCONNECTEX)
 +                      (SOCKET hSocket,
 +                       LPOVERLAPPED lpOverlapped,
 +                       DWORD dwFlags,
 +                       DWORD reserved);
 +
 +  typedef BOOL (PASCAL *LPFN_TRANSMITFILE)
 +                      (SOCKET hSocket,
 +                       HANDLE hFile,
 +                       DWORD nNumberOfBytesToWrite,
 +                       DWORD nNumberOfBytesPerSend,
 +                       LPOVERLAPPED lpOverlapped,
 +                       LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
 +                       DWORD dwFlags);
 +
 +  typedef PVOID RTL_SRWLOCK;
 +  typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
 +#endif
 +
 +typedef int (WSAAPI* LPFN_WSARECV)
 +            (SOCKET socket,
 +             LPWSABUF buffers,
 +             DWORD buffer_count,
 +             LPDWORD bytes,
 +             LPDWORD flags,
 +             LPWSAOVERLAPPED overlapped,
 +             LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
 +
 +typedef int (WSAAPI* LPFN_WSARECVFROM)
 +            (SOCKET socket,
 +             LPWSABUF buffers,
 +             DWORD buffer_count,
 +             LPDWORD bytes,
 +             LPDWORD flags,
 +             struct sockaddr* addr,
 +             LPINT addr_len,
 +             LPWSAOVERLAPPED overlapped,
 +             LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
 +
 +#ifndef _NTDEF_
 +  typedef LONG NTSTATUS;
 +  typedef NTSTATUS *PNTSTATUS;
 +#endif
 +
 +#ifndef RTL_CONDITION_VARIABLE_INIT
 +  typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE;
 +#endif
 +
 +typedef struct _AFD_POLL_HANDLE_INFO {
 +  HANDLE Handle;
 +  ULONG Events;
 +  NTSTATUS Status;
 +} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
 +
 +typedef struct _AFD_POLL_INFO {
 +  LARGE_INTEGER Timeout;
 +  ULONG NumberOfHandles;
 +  ULONG Exclusive;
 +  AFD_POLL_HANDLE_INFO Handles[1];
 +} AFD_POLL_INFO, *PAFD_POLL_INFO;
 +
 +#define UV_MSAFD_PROVIDER_COUNT 3
 +
 +
 +/**
 + * It should be possible to cast uv_buf_t[] to WSABUF[]
 + * see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx
 + */
 +typedef struct uv_buf_t {
 +  ULONG len;
 +  char* base;
 +} uv_buf_t;
 +
 +typedef int uv_file;
 +typedef SOCKET uv_os_sock_t;
 +typedef HANDLE uv_os_fd_t;
++typedef int uv_pid_t;
 +
 +typedef HANDLE uv_thread_t;
 +
 +typedef HANDLE uv_sem_t;
 +
 +typedef CRITICAL_SECTION uv_mutex_t;
 +
 +/* This condition variable implementation is based on the SetEvent solution
 + * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
 + * We could not use the SignalObjectAndWait solution (section 3.4) because
 + * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and
 + * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs.
 + */
 +
 +typedef union {
 +  CONDITION_VARIABLE cond_var;
 +  struct {
 +    unsigned int waiters_count;
 +    CRITICAL_SECTION waiters_count_lock;
 +    HANDLE signal_event;
 +    HANDLE broadcast_event;
 +  } fallback;
 +} uv_cond_t;
 +
 +typedef union {
 +  struct {
 +    unsigned int num_readers_;
 +    CRITICAL_SECTION num_readers_lock_;
 +    HANDLE write_semaphore_;
 +  } state_;
 +  /* TODO: remove me in v2.x. */
 +  struct {
 +    SRWLOCK unused_;
 +  } unused1_;
 +  /* TODO: remove me in v2.x. */
 +  struct {
 +    uv_mutex_t unused1_;
 +    uv_mutex_t unused2_;
 +  } unused2_;
 +} uv_rwlock_t;
 +
 +typedef struct {
 +  unsigned int n;
 +  unsigned int count;
 +  uv_mutex_t mutex;
 +  uv_sem_t turnstile1;
 +  uv_sem_t turnstile2;
 +} uv_barrier_t;
 +
 +typedef struct {
 +  DWORD tls_index;
 +} uv_key_t;
 +
 +#define UV_ONCE_INIT { 0, NULL }
 +
 +typedef struct uv_once_s {
 +  unsigned char ran;
 +  HANDLE event;
 +} uv_once_t;
 +
 +/* Platform-specific definitions for uv_spawn support. */
 +typedef unsigned char uv_uid_t;
 +typedef unsigned char uv_gid_t;
 +
 +typedef struct uv__dirent_s {
 +  int d_type;
 +  char d_name[1];
 +} uv__dirent_t;
 +
 +#define HAVE_DIRENT_TYPES
 +#define UV__DT_DIR     UV_DIRENT_DIR
 +#define UV__DT_FILE    UV_DIRENT_FILE
 +#define UV__DT_LINK    UV_DIRENT_LINK
 +#define UV__DT_FIFO    UV_DIRENT_FIFO
 +#define UV__DT_SOCKET  UV_DIRENT_SOCKET
 +#define UV__DT_CHAR    UV_DIRENT_CHAR
 +#define UV__DT_BLOCK   UV_DIRENT_BLOCK
 +
 +/* Platform-specific definitions for uv_dlopen support. */
 +#define UV_DYNAMIC FAR WINAPI
 +typedef struct {
 +  HMODULE handle;
 +  char* errmsg;
 +} uv_lib_t;
 +
 +RB_HEAD(uv_timer_tree_s, uv_timer_s);
 +
 +#define UV_LOOP_PRIVATE_FIELDS                                                \
 +    /* The loop's I/O completion port */                                      \
 +  HANDLE iocp;                                                                \
 +  /* The current time according to the event loop. in msecs. */               \
 +  uint64_t time;                                                              \
 +  /* Tail of a single-linked circular queue of pending reqs. If the queue */  \
 +  /* is empty, tail_ is NULL. If there is only one item, */                   \
 +  /* tail_->next_req == tail_ */                                              \
 +  uv_req_t* pending_reqs_tail;                                                \
 +  /* Head of a single-linked list of closed handles */                        \
 +  uv_handle_t* endgame_handles;                                               \
 +  /* The head of the timers tree */                                           \
 +  struct uv_timer_tree_s timers;                                              \
 +    /* Lists of active loop (prepare / check / idle) watchers */              \
 +  uv_prepare_t* prepare_handles;                                              \
 +  uv_check_t* check_handles;                                                  \
 +  uv_idle_t* idle_handles;                                                    \
 +  /* This pointer will refer to the prepare/check/idle handle whose */        \
 +  /* callback is scheduled to be called next. This is needed to allow */      \
 +  /* safe removal from one of the lists above while that list being */        \
 +  /* iterated over. */                                                        \
 +  uv_prepare_t* next_prepare_handle;                                          \
 +  uv_check_t* next_check_handle;                                              \
 +  uv_idle_t* next_idle_handle;                                                \
 +  /* This handle holds the peer sockets for the fast variant of uv_poll_t */  \
 +  SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT];                          \
 +  /* Counter to keep track of active tcp streams */                           \
 +  unsigned int active_tcp_streams;                                            \
 +  /* Counter to keep track of active udp streams */                           \
 +  unsigned int active_udp_streams;                                            \
 +  /* Counter to started timer */                                              \
 +  uint64_t timer_counter;                                                     \
 +  /* Threadpool */                                                            \
 +  void* wq[2];                                                                \
 +  uv_mutex_t wq_mutex;                                                        \
 +  uv_async_t wq_async;
 +
 +#define UV_REQ_TYPE_PRIVATE                                                   \
 +  /* TODO: remove the req suffix */                                           \
 +  UV_ACCEPT,                                                                  \
 +  UV_FS_EVENT_REQ,                                                            \
 +  UV_POLL_REQ,                                                                \
 +  UV_PROCESS_EXIT,                                                            \
 +  UV_READ,                                                                    \
 +  UV_UDP_RECV,                                                                \
 +  UV_WAKEUP,                                                                  \
 +  UV_SIGNAL_REQ,
 +
 +#define UV_REQ_PRIVATE_FIELDS                                                 \
 +  union {                                                                     \
 +    /* Used by I/O operations */                                              \
 +    struct {                                                                  \
 +      OVERLAPPED overlapped;                                                  \
 +      size_t queued_bytes;                                                    \
 +    } io;                                                                     \
 +  } u;                                                                        \
 +  struct uv_req_s* next_req;
 +
 +#define UV_WRITE_PRIVATE_FIELDS                                               \
 +  int ipc_header;                                                             \
 +  uv_buf_t write_buffer;                                                      \
 +  HANDLE event_handle;                                                        \
 +  HANDLE wait_handle;
 +
 +#define UV_CONNECT_PRIVATE_FIELDS                                             \
 +  /* empty */
 +
 +#define UV_SHUTDOWN_PRIVATE_FIELDS                                            \
 +  /* empty */
 +
 +#define UV_UDP_SEND_PRIVATE_FIELDS                                            \
 +  /* empty */
 +
 +#define UV_PRIVATE_REQ_TYPES                                                  \
 +  typedef struct uv_pipe_accept_s {                                           \
 +    UV_REQ_FIELDS                                                             \
 +    HANDLE pipeHandle;                                                        \
 +    struct uv_pipe_accept_s* next_pending;                                    \
 +  } uv_pipe_accept_t;                                                         \
 +                                                                              \
 +  typedef struct uv_tcp_accept_s {                                            \
 +    UV_REQ_FIELDS                                                             \
 +    SOCKET accept_socket;                                                     \
 +    char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32];             \
 +    HANDLE event_handle;                                                      \
 +    HANDLE wait_handle;                                                       \
 +    struct uv_tcp_accept_s* next_pending;                                     \
 +  } uv_tcp_accept_t;                                                          \
 +                                                                              \
 +  typedef struct uv_read_s {                                                  \
 +    UV_REQ_FIELDS                                                             \
 +    HANDLE event_handle;                                                      \
 +    HANDLE wait_handle;                                                       \
 +  } uv_read_t;
 +
 +#define uv_stream_connection_fields                                           \
 +  unsigned int write_reqs_pending;                                            \
 +  uv_shutdown_t* shutdown_req;
 +
 +#define uv_stream_server_fields                                               \
 +  uv_connection_cb connection_cb;
 +
 +#define UV_STREAM_PRIVATE_FIELDS                                              \
 +  unsigned int reqs_pending;                                                  \
 +  int activecnt;                                                              \
 +  uv_read_t read_req;                                                         \
 +  union {                                                                     \
 +    struct { uv_stream_connection_fields } conn;                              \
 +    struct { uv_stream_server_fields     } serv;                              \
 +  } stream;
 +
 +#define uv_tcp_server_fields                                                  \
 +  uv_tcp_accept_t* accept_reqs;                                               \
 +  unsigned int processed_accepts;                                             \
 +  uv_tcp_accept_t* pending_accepts;                                           \
 +  LPFN_ACCEPTEX func_acceptex;
 +
 +#define uv_tcp_connection_fields                                              \
 +  uv_buf_t read_buffer;                                                       \
 +  LPFN_CONNECTEX func_connectex;
 +
 +#define UV_TCP_PRIVATE_FIELDS                                                 \
 +  SOCKET socket;                                                              \
 +  int delayed_error;                                                          \
 +  union {                                                                     \
 +    struct { uv_tcp_server_fields } serv;                                     \
 +    struct { uv_tcp_connection_fields } conn;                                 \
 +  } tcp;
 +
 +#define UV_UDP_PRIVATE_FIELDS                                                 \
 +  SOCKET socket;                                                              \
 +  unsigned int reqs_pending;                                                  \
 +  int activecnt;                                                              \
 +  uv_req_t recv_req;                                                          \
 +  uv_buf_t recv_buffer;                                                       \
 +  struct sockaddr_storage recv_from;                                          \
 +  int recv_from_len;                                                          \
 +  uv_udp_recv_cb recv_cb;                                                     \
 +  uv_alloc_cb alloc_cb;                                                       \
 +  LPFN_WSARECV func_wsarecv;                                                  \
 +  LPFN_WSARECVFROM func_wsarecvfrom;
 +
 +#define uv_pipe_server_fields                                                 \
 +  int pending_instances;                                                      \
 +  uv_pipe_accept_t* accept_reqs;                                              \
 +  uv_pipe_accept_t* pending_accepts;
 +
 +#define uv_pipe_connection_fields                                             \
 +  uv_timer_t* eof_timer;                                                      \
 +  uv_write_t ipc_header_write_req;                                            \
 +  int ipc_pid;                                                                \
 +  uint64_t remaining_ipc_rawdata_bytes;                                       \
 +  struct {                                                                    \
 +    void* queue[2];                                                           \
 +    int queue_len;                                                            \
 +  } pending_ipc_info;                                                         \
 +  uv_write_t* non_overlapped_writes_tail;                                     \
 +  uv_mutex_t readfile_mutex;                                                  \
 +  volatile HANDLE readfile_thread;
 +
 +#define UV_PIPE_PRIVATE_FIELDS                                                \
 +  HANDLE handle;                                                              \
 +  WCHAR* name;                                                                \
 +  union {                                                                     \
 +    struct { uv_pipe_server_fields } serv;                                    \
 +    struct { uv_pipe_connection_fields } conn;                                \
 +  } pipe;
 +
 +/* TODO: put the parser states in an union - TTY handles are always */
 +/* half-duplex so read-state can safely overlap write-state. */
 +#define UV_TTY_PRIVATE_FIELDS                                                 \
 +  HANDLE handle;                                                              \
 +  union {                                                                     \
 +    struct {                                                                  \
 +      /* Used for readable TTY handles */                                     \
 +      /* TODO: remove me in v2.x. */                                          \
 +      HANDLE unused_;                                                         \
 +      uv_buf_t read_line_buffer;                                              \
 +      HANDLE read_raw_wait;                                                   \
 +      /* Fields used for translating win keystrokes into vt100 characters */  \
 +      char last_key[8];                                                       \
 +      unsigned char last_key_offset;                                          \
 +      unsigned char last_key_len;                                             \
 +      WCHAR last_utf16_high_surrogate;                                        \
 +      INPUT_RECORD last_input_record;                                         \
 +    } rd;                                                                     \
 +    struct {                                                                  \
 +      /* Used for writable TTY handles */                                     \
 +      /* utf8-to-utf16 conversion state */                                    \
 +      unsigned int utf8_codepoint;                                            \
 +      unsigned char utf8_bytes_left;                                          \
 +      /* eol conversion state */                                              \
 +      unsigned char previous_eol;                                             \
 +      /* ansi parser state */                                                 \
 +      unsigned char ansi_parser_state;                                        \
 +      unsigned char ansi_csi_argc;                                            \
 +      unsigned short ansi_csi_argv[4];                                        \
 +      COORD saved_position;                                                   \
 +      WORD saved_attributes;                                                  \
 +    } wr;                                                                     \
 +  } tty;
 +
 +#define UV_POLL_PRIVATE_FIELDS                                                \
 +  SOCKET socket;                                                              \
 +  /* Used in fast mode */                                                     \
 +  SOCKET peer_socket;                                                         \
 +  AFD_POLL_INFO afd_poll_info_1;                                              \
 +  AFD_POLL_INFO afd_poll_info_2;                                              \
 +  /* Used in fast and slow mode. */                                           \
 +  uv_req_t poll_req_1;                                                        \
 +  uv_req_t poll_req_2;                                                        \
 +  unsigned char submitted_events_1;                                           \
 +  unsigned char submitted_events_2;                                           \
 +  unsigned char mask_events_1;                                                \
 +  unsigned char mask_events_2;                                                \
 +  unsigned char events;
 +
 +#define UV_TIMER_PRIVATE_FIELDS                                               \
 +  RB_ENTRY(uv_timer_s) tree_entry;                                            \
 +  uint64_t due;                                                               \
 +  uint64_t repeat;                                                            \
 +  uint64_t start_id;                                                          \
 +  uv_timer_cb timer_cb;
 +
 +#define UV_ASYNC_PRIVATE_FIELDS                                               \
 +  struct uv_req_s async_req;                                                  \
 +  uv_async_cb async_cb;                                                       \
 +  /* char to avoid alignment issues */                                        \
 +  char volatile async_sent;
 +
 +#define UV_PREPARE_PRIVATE_FIELDS                                             \
 +  uv_prepare_t* prepare_prev;                                                 \
 +  uv_prepare_t* prepare_next;                                                 \
 +  uv_prepare_cb prepare_cb;
 +
 +#define UV_CHECK_PRIVATE_FIELDS                                               \
 +  uv_check_t* check_prev;                                                     \
 +  uv_check_t* check_next;                                                     \
 +  uv_check_cb check_cb;
 +
 +#define UV_IDLE_PRIVATE_FIELDS                                                \
 +  uv_idle_t* idle_prev;                                                       \
 +  uv_idle_t* idle_next;                                                       \
 +  uv_idle_cb idle_cb;
 +
 +#define UV_HANDLE_PRIVATE_FIELDS                                              \
 +  uv_handle_t* endgame_next;                                                  \
 +  unsigned int flags;
 +
 +#define UV_GETADDRINFO_PRIVATE_FIELDS                                         \
 +  struct uv__work work_req;                                                   \
 +  uv_getaddrinfo_cb getaddrinfo_cb;                                           \
 +  void* alloc;                                                                \
 +  WCHAR* node;                                                                \
 +  WCHAR* service;                                                             \
 +  /* The addrinfoW field is used to store a pointer to the hints, and    */   \
 +  /* later on to store the result of GetAddrInfoW. The final result will */   \
 +  /* be converted to struct addrinfo* and stored in the addrinfo field.  */   \
 +  struct addrinfoW* addrinfow;                                                \
 +  struct addrinfo* addrinfo;                                                  \
 +  int retcode;
 +
 +#define UV_GETNAMEINFO_PRIVATE_FIELDS                                         \
 +  struct uv__work work_req;                                                   \
 +  uv_getnameinfo_cb getnameinfo_cb;                                           \
 +  struct sockaddr_storage storage;                                            \
 +  int flags;                                                                  \
 +  char host[NI_MAXHOST];                                                      \
 +  char service[NI_MAXSERV];                                                   \
 +  int retcode;
 +
 +#define UV_PROCESS_PRIVATE_FIELDS                                             \
 +  struct uv_process_exit_s {                                                  \
 +    UV_REQ_FIELDS                                                             \
 +  } exit_req;                                                                 \
 +  BYTE* child_stdio_buffer;                                                   \
 +  int exit_signal;                                                            \
 +  HANDLE wait_handle;                                                         \
 +  HANDLE process_handle;                                                      \
 +  volatile char exit_cb_pending;
 +
 +#define UV_FS_PRIVATE_FIELDS                                                  \
 +  struct uv__work work_req;                                                   \
 +  int flags;                                                                  \
 +  DWORD sys_errno_;                                                           \
 +  union {                                                                     \
 +    /* TODO: remove me in 0.9. */                                             \
 +    WCHAR* pathw;                                                             \
 +    int fd;                                                                   \
 +  } file;                                                                     \
 +  union {                                                                     \
 +    struct {                                                                  \
 +      int mode;                                                               \
 +      WCHAR* new_pathw;                                                       \
 +      int file_flags;                                                         \
 +      int fd_out;                                                             \
 +      unsigned int nbufs;                                                     \
 +      uv_buf_t* bufs;                                                         \
 +      int64_t offset;                                                         \
 +      uv_buf_t bufsml[4];                                                     \
 +    } info;                                                                   \
 +    struct {                                                                  \
 +      double atime;                                                           \
 +      double mtime;                                                           \
 +    } time;                                                                   \
 +  } fs;
 +
 +#define UV_WORK_PRIVATE_FIELDS                                                \
 +  struct uv__work work_req;
 +
 +#define UV_FS_EVENT_PRIVATE_FIELDS                                            \
 +  struct uv_fs_event_req_s {                                                  \
 +    UV_REQ_FIELDS                                                             \
 +  } req;                                                                      \
 +  HANDLE dir_handle;                                                          \
 +  int req_pending;                                                            \
 +  uv_fs_event_cb cb;                                                          \
 +  WCHAR* filew;                                                               \
 +  WCHAR* short_filew;                                                         \
 +  WCHAR* dirw;                                                                \
 +  char* buffer;
 +
 +#define UV_SIGNAL_PRIVATE_FIELDS                                              \
 +  RB_ENTRY(uv_signal_s) tree_entry;                                           \
 +  struct uv_req_s signal_req;                                                 \
 +  unsigned long pending_signum;
 +
 +#ifndef F_OK
 +#define F_OK 0
 +#endif
 +#ifndef R_OK
 +#define R_OK 4
 +#endif
 +#ifndef W_OK
 +#define W_OK 2
 +#endif
 +#ifndef X_OK
 +#define X_OK 1
 +#endif
++
++/* fs open() flags supported on this platform: */
++#define UV_FS_O_APPEND       _O_APPEND
++#define UV_FS_O_CREAT        _O_CREAT
++#define UV_FS_O_EXCL         _O_EXCL
++#define UV_FS_O_RANDOM       _O_RANDOM
++#define UV_FS_O_RDONLY       _O_RDONLY
++#define UV_FS_O_RDWR         _O_RDWR
++#define UV_FS_O_SEQUENTIAL   _O_SEQUENTIAL
++#define UV_FS_O_SHORT_LIVED  _O_SHORT_LIVED
++#define UV_FS_O_TEMPORARY    _O_TEMPORARY
++#define UV_FS_O_TRUNC        _O_TRUNC
++#define UV_FS_O_WRONLY       _O_WRONLY
++
++/* fs open() flags supported on other platforms (or mapped on this platform): */
++#define UV_FS_O_DIRECT       0x02000000 /* FILE_FLAG_NO_BUFFERING */
++#define UV_FS_O_DIRECTORY    0
++#define UV_FS_O_DSYNC        0x04000000 /* FILE_FLAG_WRITE_THROUGH */
++#define UV_FS_O_EXLOCK       0x10000000 /* EXCLUSIVE SHARING MODE */
++#define UV_FS_O_NOATIME      0
++#define UV_FS_O_NOCTTY       0
++#define UV_FS_O_NOFOLLOW     0
++#define UV_FS_O_NONBLOCK     0
++#define UV_FS_O_SYMLINK      0
++#define UV_FS_O_SYNC         0x08000000 /* FILE_FLAG_WRITE_THROUGH */
diff --cc Utilities/cmlibuv/include/uv.h
index 38f5676,0000000..328ce9e
mode 100644,000000..100644
--- a/Utilities/cmlibuv/include/uv.h
+++ b/Utilities/cmlibuv/include/uv.h
@@@ -1,1511 -1,0 +1,1570 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +/* See https://github.com/libuv/libuv#documentation for documentation. */
 +
 +#ifndef UV_H
 +#define UV_H
 +
 +/* Include KWSys Large File Support configuration. */
 +#include <cmsys/Configure.h>
 +
 +#ifdef __cplusplus
 +extern "C" {
 +#endif
 +
 +#ifdef _WIN32
 +  /* Windows - set up dll import/export decorators. */
 +# if defined(BUILDING_UV_SHARED)
 +    /* Building shared library. */
 +#   define UV_EXTERN __declspec(dllexport)
 +# elif defined(USING_UV_SHARED)
 +    /* Using shared library. */
 +#   define UV_EXTERN __declspec(dllimport)
 +# else
 +    /* Building static library. */
 +#   define UV_EXTERN /* nothing */
 +# endif
 +#elif __GNUC__ >= 4
 +# define UV_EXTERN __attribute__((visibility("default")))
 +#else
 +# define UV_EXTERN /* nothing */
 +#endif
 +
 +#include "uv-errno.h"
 +#include "uv-version.h"
 +#include <stddef.h>
 +#include <stdio.h>
 +
 +#if defined(_MSC_VER) && _MSC_VER < 1600
 +# include "stdint-msvc2008.h"
 +#else
 +# include <stdint.h>
 +#endif
 +
 +#if defined(_WIN32)
 +# include "uv-win.h"
 +#else
 +# include "uv-unix.h"
 +#endif
 +
 +/* Expand this list if necessary. */
 +#define UV_ERRNO_MAP(XX)                                                      \
 +  XX(E2BIG, "argument list too long")                                         \
 +  XX(EACCES, "permission denied")                                             \
 +  XX(EADDRINUSE, "address already in use")                                    \
 +  XX(EADDRNOTAVAIL, "address not available")                                  \
 +  XX(EAFNOSUPPORT, "address family not supported")                            \
 +  XX(EAGAIN, "resource temporarily unavailable")                              \
 +  XX(EAI_ADDRFAMILY, "address family not supported")                          \
 +  XX(EAI_AGAIN, "temporary failure")                                          \
 +  XX(EAI_BADFLAGS, "bad ai_flags value")                                      \
 +  XX(EAI_BADHINTS, "invalid value for hints")                                 \
 +  XX(EAI_CANCELED, "request canceled")                                        \
 +  XX(EAI_FAIL, "permanent failure")                                           \
 +  XX(EAI_FAMILY, "ai_family not supported")                                   \
 +  XX(EAI_MEMORY, "out of memory")                                             \
 +  XX(EAI_NODATA, "no address")                                                \
 +  XX(EAI_NONAME, "unknown node or service")                                   \
 +  XX(EAI_OVERFLOW, "argument buffer overflow")                                \
 +  XX(EAI_PROTOCOL, "resolved protocol is unknown")                            \
 +  XX(EAI_SERVICE, "service not available for socket type")                    \
 +  XX(EAI_SOCKTYPE, "socket type not supported")                               \
 +  XX(EALREADY, "connection already in progress")                              \
 +  XX(EBADF, "bad file descriptor")                                            \
 +  XX(EBUSY, "resource busy or locked")                                        \
 +  XX(ECANCELED, "operation canceled")                                         \
 +  XX(ECHARSET, "invalid Unicode character")                                   \
 +  XX(ECONNABORTED, "software caused connection abort")                        \
 +  XX(ECONNREFUSED, "connection refused")                                      \
 +  XX(ECONNRESET, "connection reset by peer")                                  \
 +  XX(EDESTADDRREQ, "destination address required")                            \
 +  XX(EEXIST, "file already exists")                                           \
 +  XX(EFAULT, "bad address in system call argument")                           \
 +  XX(EFBIG, "file too large")                                                 \
 +  XX(EHOSTUNREACH, "host is unreachable")                                     \
 +  XX(EINTR, "interrupted system call")                                        \
 +  XX(EINVAL, "invalid argument")                                              \
 +  XX(EIO, "i/o error")                                                        \
 +  XX(EISCONN, "socket is already connected")                                  \
 +  XX(EISDIR, "illegal operation on a directory")                              \
 +  XX(ELOOP, "too many symbolic links encountered")                            \
 +  XX(EMFILE, "too many open files")                                           \
 +  XX(EMSGSIZE, "message too long")                                            \
 +  XX(ENAMETOOLONG, "name too long")                                           \
 +  XX(ENETDOWN, "network is down")                                             \
 +  XX(ENETUNREACH, "network is unreachable")                                   \
 +  XX(ENFILE, "file table overflow")                                           \
 +  XX(ENOBUFS, "no buffer space available")                                    \
 +  XX(ENODEV, "no such device")                                                \
 +  XX(ENOENT, "no such file or directory")                                     \
 +  XX(ENOMEM, "not enough memory")                                             \
 +  XX(ENONET, "machine is not on the network")                                 \
 +  XX(ENOPROTOOPT, "protocol not available")                                   \
 +  XX(ENOSPC, "no space left on device")                                       \
 +  XX(ENOSYS, "function not implemented")                                      \
 +  XX(ENOTCONN, "socket is not connected")                                     \
 +  XX(ENOTDIR, "not a directory")                                              \
 +  XX(ENOTEMPTY, "directory not empty")                                        \
 +  XX(ENOTSOCK, "socket operation on non-socket")                              \
 +  XX(ENOTSUP, "operation not supported on socket")                            \
 +  XX(EPERM, "operation not permitted")                                        \
 +  XX(EPIPE, "broken pipe")                                                    \
 +  XX(EPROTO, "protocol error")                                                \
 +  XX(EPROTONOSUPPORT, "protocol not supported")                               \
 +  XX(EPROTOTYPE, "protocol wrong type for socket")                            \
 +  XX(ERANGE, "result too large")                                              \
 +  XX(EROFS, "read-only file system")                                          \
 +  XX(ESHUTDOWN, "cannot send after transport endpoint shutdown")              \
 +  XX(ESPIPE, "invalid seek")                                                  \
 +  XX(ESRCH, "no such process")                                                \
 +  XX(ETIMEDOUT, "connection timed out")                                       \
 +  XX(ETXTBSY, "text file is busy")                                            \
 +  XX(EXDEV, "cross-device link not permitted")                                \
 +  XX(UNKNOWN, "unknown error")                                                \
 +  XX(EOF, "end of file")                                                      \
 +  XX(ENXIO, "no such device or address")                                      \
 +  XX(EMLINK, "too many links")                                                \
 +  XX(EHOSTDOWN, "host is down")                                               \
++  XX(EREMOTEIO, "remote I/O error")                                           \
++  XX(ENOTTY, "inappropriate ioctl for device")                                \
 +
 +#define UV_HANDLE_TYPE_MAP(XX)                                                \
 +  XX(ASYNC, async)                                                            \
 +  XX(CHECK, check)                                                            \
 +  XX(FS_EVENT, fs_event)                                                      \
 +  XX(FS_POLL, fs_poll)                                                        \
 +  XX(HANDLE, handle)                                                          \
 +  XX(IDLE, idle)                                                              \
 +  XX(NAMED_PIPE, pipe)                                                        \
 +  XX(POLL, poll)                                                              \
 +  XX(PREPARE, prepare)                                                        \
 +  XX(PROCESS, process)                                                        \
 +  XX(STREAM, stream)                                                          \
 +  XX(TCP, tcp)                                                                \
 +  XX(TIMER, timer)                                                            \
 +  XX(TTY, tty)                                                                \
 +  XX(UDP, udp)                                                                \
 +  XX(SIGNAL, signal)                                                          \
 +
 +#define UV_REQ_TYPE_MAP(XX)                                                   \
 +  XX(REQ, req)                                                                \
 +  XX(CONNECT, connect)                                                        \
 +  XX(WRITE, write)                                                            \
 +  XX(SHUTDOWN, shutdown)                                                      \
 +  XX(UDP_SEND, udp_send)                                                      \
 +  XX(FS, fs)                                                                  \
 +  XX(WORK, work)                                                              \
 +  XX(GETADDRINFO, getaddrinfo)                                                \
 +  XX(GETNAMEINFO, getnameinfo)                                                \
 +
 +typedef enum {
 +#define XX(code, _) UV_ ## code = UV__ ## code,
 +  UV_ERRNO_MAP(XX)
 +#undef XX
 +  UV_ERRNO_MAX = UV__EOF - 1
 +} uv_errno_t;
 +
 +typedef enum {
 +  UV_UNKNOWN_HANDLE = 0,
 +#define XX(uc, lc) UV_##uc,
 +  UV_HANDLE_TYPE_MAP(XX)
 +#undef XX
 +  UV_FILE,
 +  UV_HANDLE_TYPE_MAX
 +} uv_handle_type;
 +
 +typedef enum {
 +  UV_UNKNOWN_REQ = 0,
 +#define XX(uc, lc) UV_##uc,
 +  UV_REQ_TYPE_MAP(XX)
 +#undef XX
 +  UV_REQ_TYPE_PRIVATE
 +  UV_REQ_TYPE_MAX
 +} uv_req_type;
 +
 +
 +/* Handle types. */
 +typedef struct uv_loop_s uv_loop_t;
 +typedef struct uv_handle_s uv_handle_t;
 +typedef struct uv_stream_s uv_stream_t;
 +typedef struct uv_tcp_s uv_tcp_t;
 +typedef struct uv_udp_s uv_udp_t;
 +typedef struct uv_pipe_s uv_pipe_t;
 +typedef struct uv_tty_s uv_tty_t;
 +typedef struct uv_poll_s uv_poll_t;
 +typedef struct uv_timer_s uv_timer_t;
 +typedef struct uv_prepare_s uv_prepare_t;
 +typedef struct uv_check_s uv_check_t;
 +typedef struct uv_idle_s uv_idle_t;
 +typedef struct uv_async_s uv_async_t;
 +typedef struct uv_process_s uv_process_t;
 +typedef struct uv_fs_event_s uv_fs_event_t;
 +typedef struct uv_fs_poll_s uv_fs_poll_t;
 +typedef struct uv_signal_s uv_signal_t;
 +
 +/* Request types. */
 +typedef struct uv_req_s uv_req_t;
 +typedef struct uv_getaddrinfo_s uv_getaddrinfo_t;
 +typedef struct uv_getnameinfo_s uv_getnameinfo_t;
 +typedef struct uv_shutdown_s uv_shutdown_t;
 +typedef struct uv_write_s uv_write_t;
 +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;
 +
 +/* None of the above. */
 +typedef struct uv_cpu_info_s uv_cpu_info_t;
 +typedef struct uv_interface_address_s uv_interface_address_t;
 +typedef struct uv_dirent_s uv_dirent_t;
 +typedef struct uv_passwd_s uv_passwd_t;
 +
 +typedef enum {
 +  UV_LOOP_BLOCK_SIGNAL
 +} uv_loop_option;
 +
 +typedef enum {
 +  UV_RUN_DEFAULT = 0,
 +  UV_RUN_ONCE,
 +  UV_RUN_NOWAIT
 +} uv_run_mode;
 +
 +
 +UV_EXTERN unsigned int uv_version(void);
 +UV_EXTERN const char* uv_version_string(void);
 +
 +typedef void* (*uv_malloc_func)(size_t size);
 +typedef void* (*uv_realloc_func)(void* ptr, size_t size);
 +typedef void* (*uv_calloc_func)(size_t count, size_t size);
 +typedef void (*uv_free_func)(void* ptr);
 +
 +UV_EXTERN int uv_replace_allocator(uv_malloc_func malloc_func,
 +                                   uv_realloc_func realloc_func,
 +                                   uv_calloc_func calloc_func,
 +                                   uv_free_func free_func);
 +
 +UV_EXTERN uv_loop_t* uv_default_loop(void);
 +UV_EXTERN int uv_loop_init(uv_loop_t* loop);
 +UV_EXTERN int uv_loop_close(uv_loop_t* loop);
 +/*
 + * NOTE:
 + *  This function is DEPRECATED (to be removed after 0.12), users should
 + *  allocate the loop manually and use uv_loop_init instead.
 + */
 +UV_EXTERN uv_loop_t* uv_loop_new(void);
 +/*
 + * NOTE:
 + *  This function is DEPRECATED (to be removed after 0.12). Users should use
 + *  uv_loop_close and free the memory manually instead.
 + */
 +UV_EXTERN void uv_loop_delete(uv_loop_t*);
 +UV_EXTERN size_t uv_loop_size(void);
 +UV_EXTERN int uv_loop_alive(const uv_loop_t* loop);
 +UV_EXTERN int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...);
 +UV_EXTERN int uv_loop_fork(uv_loop_t* loop);
 +
 +UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode);
 +UV_EXTERN void uv_stop(uv_loop_t*);
 +
 +UV_EXTERN void uv_ref(uv_handle_t*);
 +UV_EXTERN void uv_unref(uv_handle_t*);
 +UV_EXTERN int uv_has_ref(const uv_handle_t*);
 +
 +UV_EXTERN void uv_update_time(uv_loop_t*);
 +UV_EXTERN uint64_t uv_now(const uv_loop_t*);
 +
 +UV_EXTERN int uv_backend_fd(const uv_loop_t*);
 +UV_EXTERN int uv_backend_timeout(const uv_loop_t*);
 +
 +typedef void (*uv_alloc_cb)(uv_handle_t* handle,
 +                            size_t suggested_size,
 +                            uv_buf_t* buf);
 +typedef void (*uv_read_cb)(uv_stream_t* stream,
 +                           ssize_t nread,
 +                           const uv_buf_t* buf);
 +typedef void (*uv_write_cb)(uv_write_t* req, int status);
 +typedef void (*uv_connect_cb)(uv_connect_t* req, int status);
 +typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status);
 +typedef void (*uv_connection_cb)(uv_stream_t* server, int status);
 +typedef void (*uv_close_cb)(uv_handle_t* handle);
 +typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int events);
 +typedef void (*uv_timer_cb)(uv_timer_t* handle);
 +typedef void (*uv_async_cb)(uv_async_t* handle);
 +typedef void (*uv_prepare_cb)(uv_prepare_t* handle);
 +typedef void (*uv_check_cb)(uv_check_t* handle);
 +typedef void (*uv_idle_cb)(uv_idle_t* handle);
 +typedef void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal);
 +typedef void (*uv_walk_cb)(uv_handle_t* handle, void* arg);
 +typedef void (*uv_fs_cb)(uv_fs_t* req);
 +typedef void (*uv_work_cb)(uv_work_t* req);
 +typedef void (*uv_after_work_cb)(uv_work_t* req, int status);
 +typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req,
 +                                  int status,
 +                                  struct addrinfo* res);
 +typedef void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req,
 +                                  int status,
 +                                  const char* hostname,
 +                                  const char* service);
 +
 +typedef struct {
 +  long tv_sec;
 +  long tv_nsec;
 +} uv_timespec_t;
 +
 +
 +typedef struct {
 +  uint64_t st_dev;
 +  uint64_t st_mode;
 +  uint64_t st_nlink;
 +  uint64_t st_uid;
 +  uint64_t st_gid;
 +  uint64_t st_rdev;
 +  uint64_t st_ino;
 +  uint64_t st_size;
 +  uint64_t st_blksize;
 +  uint64_t st_blocks;
 +  uint64_t st_flags;
 +  uint64_t st_gen;
 +  uv_timespec_t st_atim;
 +  uv_timespec_t st_mtim;
 +  uv_timespec_t st_ctim;
 +  uv_timespec_t st_birthtim;
 +} uv_stat_t;
 +
 +
 +typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle,
 +                               const char* filename,
 +                               int events,
 +                               int status);
 +
 +typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle,
 +                              int status,
 +                              const uv_stat_t* prev,
 +                              const uv_stat_t* curr);
 +
 +typedef void (*uv_signal_cb)(uv_signal_t* handle, int signum);
 +
 +
 +typedef enum {
 +  UV_LEAVE_GROUP = 0,
 +  UV_JOIN_GROUP
 +} uv_membership;
 +
 +
 +UV_EXTERN int uv_translate_sys_error(int sys_errno);
 +
 +UV_EXTERN const char* uv_strerror(int err);
 +UV_EXTERN const char* uv_err_name(int err);
 +
 +
 +#define UV_REQ_FIELDS                                                         \
 +  /* public */                                                                \
 +  void* data;                                                                 \
 +  /* read-only */                                                             \
 +  uv_req_type type;                                                           \
 +  /* private */                                                               \
 +  void* active_queue[2];                                                      \
 +  void* reserved[4];                                                          \
 +  UV_REQ_PRIVATE_FIELDS                                                       \
 +
 +/* Abstract base class of all requests. */
 +struct uv_req_s {
 +  UV_REQ_FIELDS
 +};
 +
 +
 +/* Platform-specific request types. */
 +UV_PRIVATE_REQ_TYPES
 +
 +
 +UV_EXTERN int uv_shutdown(uv_shutdown_t* req,
 +                          uv_stream_t* handle,
 +                          uv_shutdown_cb cb);
 +
 +struct uv_shutdown_s {
 +  UV_REQ_FIELDS
 +  uv_stream_t* handle;
 +  uv_shutdown_cb cb;
 +  UV_SHUTDOWN_PRIVATE_FIELDS
 +};
 +
 +
 +#define UV_HANDLE_FIELDS                                                      \
 +  /* public */                                                                \
 +  void* data;                                                                 \
 +  /* read-only */                                                             \
 +  uv_loop_t* loop;                                                            \
 +  uv_handle_type type;                                                        \
 +  /* private */                                                               \
 +  uv_close_cb close_cb;                                                       \
 +  void* handle_queue[2];                                                      \
 +  union {                                                                     \
 +    int fd;                                                                   \
 +    void* reserved[4];                                                        \
 +  } u;                                                                        \
 +  UV_HANDLE_PRIVATE_FIELDS                                                    \
 +
 +/* The abstract base class of all handles. */
 +struct uv_handle_s {
 +  UV_HANDLE_FIELDS
 +};
 +
 +UV_EXTERN size_t uv_handle_size(uv_handle_type type);
++UV_EXTERN uv_handle_type uv_handle_get_type(const uv_handle_t* handle);
++UV_EXTERN const char* uv_handle_type_name(uv_handle_type type);
++UV_EXTERN void* uv_handle_get_data(const uv_handle_t* handle);
++UV_EXTERN uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle);
++UV_EXTERN void uv_handle_set_data(uv_handle_t* handle, void* data);
++
 +UV_EXTERN size_t uv_req_size(uv_req_type type);
++UV_EXTERN void* uv_req_get_data(const uv_req_t* req);
++UV_EXTERN void uv_req_set_data(uv_req_t* req, void* data);
++UV_EXTERN uv_req_type uv_req_get_type(const uv_req_t* req);
++UV_EXTERN const char* uv_req_type_name(uv_req_type type);
 +
 +UV_EXTERN int uv_is_active(const uv_handle_t* handle);
 +
 +UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg);
 +
 +/* Helpers for ad hoc debugging, no API/ABI stability guaranteed. */
 +UV_EXTERN void uv_print_all_handles(uv_loop_t* loop, FILE* stream);
 +UV_EXTERN void uv_print_active_handles(uv_loop_t* loop, FILE* stream);
 +
 +UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb);
 +
 +UV_EXTERN int uv_send_buffer_size(uv_handle_t* handle, int* value);
 +UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value);
 +
 +UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd);
 +
 +UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len);
 +
 +
 +#define UV_STREAM_FIELDS                                                      \
 +  /* number of bytes queued for writing */                                    \
 +  size_t write_queue_size;                                                    \
 +  uv_alloc_cb alloc_cb;                                                       \
 +  uv_read_cb read_cb;                                                         \
 +  /* private */                                                               \
 +  UV_STREAM_PRIVATE_FIELDS
 +
 +/*
 + * uv_stream_t is a subclass of uv_handle_t.
 + *
 + * uv_stream is an abstract class.
 + *
 + * uv_stream_t is the parent class of uv_tcp_t, uv_pipe_t and uv_tty_t.
 + */
 +struct uv_stream_s {
 +  UV_HANDLE_FIELDS
 +  UV_STREAM_FIELDS
 +};
 +
++UV_EXTERN size_t uv_stream_get_write_queue_size(const uv_stream_t* stream);
++
 +UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb);
 +UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client);
 +
 +UV_EXTERN int uv_read_start(uv_stream_t*,
 +                            uv_alloc_cb alloc_cb,
 +                            uv_read_cb read_cb);
 +UV_EXTERN int uv_read_stop(uv_stream_t*);
 +
 +UV_EXTERN int uv_write(uv_write_t* req,
 +                       uv_stream_t* handle,
 +                       const uv_buf_t bufs[],
 +                       unsigned int nbufs,
 +                       uv_write_cb cb);
 +UV_EXTERN int uv_write2(uv_write_t* req,
 +                        uv_stream_t* handle,
 +                        const uv_buf_t bufs[],
 +                        unsigned int nbufs,
 +                        uv_stream_t* send_handle,
 +                        uv_write_cb cb);
 +UV_EXTERN int uv_try_write(uv_stream_t* handle,
 +                           const uv_buf_t bufs[],
 +                           unsigned int nbufs);
 +
 +/* uv_write_t is a subclass of uv_req_t. */
 +struct uv_write_s {
 +  UV_REQ_FIELDS
 +  uv_write_cb cb;
 +  uv_stream_t* send_handle;
 +  uv_stream_t* handle;
 +  UV_WRITE_PRIVATE_FIELDS
 +};
 +
 +
 +UV_EXTERN int uv_is_readable(const uv_stream_t* handle);
 +UV_EXTERN int uv_is_writable(const uv_stream_t* handle);
 +
 +UV_EXTERN int uv_stream_set_blocking(uv_stream_t* handle, int blocking);
 +
 +UV_EXTERN int uv_is_closing(const uv_handle_t* handle);
 +
 +
 +/*
 + * uv_tcp_t is a subclass of uv_stream_t.
 + *
 + * Represents a TCP stream or TCP server.
 + */
 +struct uv_tcp_s {
 +  UV_HANDLE_FIELDS
 +  UV_STREAM_FIELDS
 +  UV_TCP_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle);
 +UV_EXTERN int uv_tcp_init_ex(uv_loop_t*, uv_tcp_t* handle, unsigned int flags);
 +UV_EXTERN int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock);
 +UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable);
 +UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle,
 +                               int enable,
 +                               unsigned int delay);
 +UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable);
 +
 +enum uv_tcp_flags {
 +  /* Used with uv_tcp_bind, when an IPv6 address is used. */
 +  UV_TCP_IPV6ONLY = 1
 +};
 +
 +UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle,
 +                          const struct sockaddr* addr,
 +                          unsigned int flags);
 +UV_EXTERN int uv_tcp_getsockname(const uv_tcp_t* handle,
 +                                 struct sockaddr* name,
 +                                 int* namelen);
 +UV_EXTERN int uv_tcp_getpeername(const uv_tcp_t* handle,
 +                                 struct sockaddr* name,
 +                                 int* namelen);
 +UV_EXTERN int uv_tcp_connect(uv_connect_t* req,
 +                             uv_tcp_t* handle,
 +                             const struct sockaddr* addr,
 +                             uv_connect_cb cb);
 +
 +/* uv_connect_t is a subclass of uv_req_t. */
 +struct uv_connect_s {
 +  UV_REQ_FIELDS
 +  uv_connect_cb cb;
 +  uv_stream_t* handle;
 +  UV_CONNECT_PRIVATE_FIELDS
 +};
 +
 +
 +/*
 + * UDP support.
 + */
 +
 +enum uv_udp_flags {
 +  /* Disables dual stack mode. */
 +  UV_UDP_IPV6ONLY = 1,
 +  /*
 +   * Indicates message was truncated because read buffer was too small. The
 +   * remainder was discarded by the OS. Used in uv_udp_recv_cb.
 +   */
 +  UV_UDP_PARTIAL = 2,
 +  /*
 +   * Indicates if SO_REUSEADDR will be set when binding the handle.
 +   * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other
 +   * Unix platforms, it sets the SO_REUSEADDR flag.  What that means is that
 +   * multiple threads or processes can bind to the same address without error
 +   * (provided they all set the flag) but only the last one to bind will receive
 +   * any traffic, in effect "stealing" the port from the previous listener.
 +   */
 +  UV_UDP_REUSEADDR = 4
 +};
 +
 +typedef void (*uv_udp_send_cb)(uv_udp_send_t* req, int status);
 +typedef void (*uv_udp_recv_cb)(uv_udp_t* handle,
 +                               ssize_t nread,
 +                               const uv_buf_t* buf,
 +                               const struct sockaddr* addr,
 +                               unsigned flags);
 +
 +/* uv_udp_t is a subclass of uv_handle_t. */
 +struct uv_udp_s {
 +  UV_HANDLE_FIELDS
 +  /* read-only */
 +  /*
 +   * Number of bytes queued for sending. This field strictly shows how much
 +   * information is currently queued.
 +   */
 +  size_t send_queue_size;
 +  /*
 +   * Number of send requests currently in the queue awaiting to be processed.
 +   */
 +  size_t send_queue_count;
 +  UV_UDP_PRIVATE_FIELDS
 +};
 +
 +/* uv_udp_send_t is a subclass of uv_req_t. */
 +struct uv_udp_send_s {
 +  UV_REQ_FIELDS
 +  uv_udp_t* handle;
 +  uv_udp_send_cb cb;
 +  UV_UDP_SEND_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_udp_init(uv_loop_t*, uv_udp_t* handle);
 +UV_EXTERN int uv_udp_init_ex(uv_loop_t*, uv_udp_t* handle, unsigned int flags);
 +UV_EXTERN int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock);
 +UV_EXTERN int uv_udp_bind(uv_udp_t* handle,
 +                          const struct sockaddr* addr,
 +                          unsigned int flags);
 +
 +UV_EXTERN int uv_udp_getsockname(const uv_udp_t* handle,
 +                                 struct sockaddr* name,
 +                                 int* namelen);
 +UV_EXTERN int uv_udp_set_membership(uv_udp_t* handle,
 +                                    const char* multicast_addr,
 +                                    const char* interface_addr,
 +                                    uv_membership membership);
 +UV_EXTERN int uv_udp_set_multicast_loop(uv_udp_t* handle, int on);
 +UV_EXTERN int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl);
 +UV_EXTERN int uv_udp_set_multicast_interface(uv_udp_t* handle,
 +                                             const char* interface_addr);
 +UV_EXTERN int uv_udp_set_broadcast(uv_udp_t* handle, int on);
 +UV_EXTERN int uv_udp_set_ttl(uv_udp_t* handle, int ttl);
 +UV_EXTERN int uv_udp_send(uv_udp_send_t* req,
 +                          uv_udp_t* handle,
 +                          const uv_buf_t bufs[],
 +                          unsigned int nbufs,
 +                          const struct sockaddr* addr,
 +                          uv_udp_send_cb send_cb);
 +UV_EXTERN int uv_udp_try_send(uv_udp_t* handle,
 +                              const uv_buf_t bufs[],
 +                              unsigned int nbufs,
 +                              const struct sockaddr* addr);
 +UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle,
 +                                uv_alloc_cb alloc_cb,
 +                                uv_udp_recv_cb recv_cb);
 +UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle);
++UV_EXTERN size_t uv_udp_get_send_queue_size(const uv_udp_t* handle);
++UV_EXTERN size_t uv_udp_get_send_queue_count(const uv_udp_t* handle);
 +
 +
 +/*
 + * uv_tty_t is a subclass of uv_stream_t.
 + *
 + * Representing a stream for the console.
 + */
 +struct uv_tty_s {
 +  UV_HANDLE_FIELDS
 +  UV_STREAM_FIELDS
 +  UV_TTY_PRIVATE_FIELDS
 +};
 +
 +typedef enum {
 +  /* Initial/normal terminal mode */
 +  UV_TTY_MODE_NORMAL,
 +  /* Raw input mode (On Windows, ENABLE_WINDOW_INPUT is also enabled) */
 +  UV_TTY_MODE_RAW,
 +  /* Binary-safe I/O mode for IPC (Unix-only) */
 +  UV_TTY_MODE_IO
 +} uv_tty_mode_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);
 +
 +#ifdef __cplusplus
 +extern "C++" {
 +
 +inline int uv_tty_set_mode(uv_tty_t* handle, int mode) {
 +  return uv_tty_set_mode(handle, static_cast<uv_tty_mode_t>(mode));
 +}
 +
 +}
 +#endif
 +
 +UV_EXTERN uv_handle_type uv_guess_handle(uv_file file);
 +
 +/*
 + * uv_pipe_t is a subclass of uv_stream_t.
 + *
 + * Representing a pipe stream or pipe server. On Windows this is a Named
 + * Pipe. On Unix this is a Unix domain socket.
 + */
 +struct uv_pipe_s {
 +  UV_HANDLE_FIELDS
 +  UV_STREAM_FIELDS
 +  int ipc; /* non-zero if this pipe is used for passing handles */
 +  UV_PIPE_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc);
 +UV_EXTERN int uv_pipe_open(uv_pipe_t*, uv_file file);
 +UV_EXTERN int uv_pipe_bind(uv_pipe_t* handle, const char* name);
 +UV_EXTERN void uv_pipe_connect(uv_connect_t* req,
 +                               uv_pipe_t* handle,
 +                               const char* name,
 +                               uv_connect_cb cb);
 +UV_EXTERN int uv_pipe_getsockname(const uv_pipe_t* handle,
 +                                  char* buffer,
 +                                  size_t* size);
 +UV_EXTERN int uv_pipe_getpeername(const uv_pipe_t* handle,
 +                                  char* buffer,
 +                                  size_t* size);
 +UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count);
 +UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle);
 +UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle);
++UV_EXTERN int uv_pipe_chmod(uv_pipe_t* handle, int flags);
 +
 +
 +struct uv_poll_s {
 +  UV_HANDLE_FIELDS
 +  uv_poll_cb poll_cb;
 +  UV_POLL_PRIVATE_FIELDS
 +};
 +
 +enum uv_poll_event {
 +  UV_READABLE = 1,
 +  UV_WRITABLE = 2,
-   UV_DISCONNECT = 4
++  UV_DISCONNECT = 4,
++  UV_PRIORITIZED = 8
 +};
 +
 +UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd);
 +UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop,
 +                                  uv_poll_t* handle,
 +                                  uv_os_sock_t socket);
 +UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb);
 +UV_EXTERN int uv_poll_stop(uv_poll_t* handle);
 +
 +
 +struct uv_prepare_s {
 +  UV_HANDLE_FIELDS
 +  UV_PREPARE_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare);
 +UV_EXTERN int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb);
 +UV_EXTERN int uv_prepare_stop(uv_prepare_t* prepare);
 +
 +
 +struct uv_check_s {
 +  UV_HANDLE_FIELDS
 +  UV_CHECK_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_check_init(uv_loop_t*, uv_check_t* check);
 +UV_EXTERN int uv_check_start(uv_check_t* check, uv_check_cb cb);
 +UV_EXTERN int uv_check_stop(uv_check_t* check);
 +
 +
 +struct uv_idle_s {
 +  UV_HANDLE_FIELDS
 +  UV_IDLE_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_idle_init(uv_loop_t*, uv_idle_t* idle);
 +UV_EXTERN int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb);
 +UV_EXTERN int uv_idle_stop(uv_idle_t* idle);
 +
 +
 +struct uv_async_s {
 +  UV_HANDLE_FIELDS
 +  UV_ASYNC_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_async_init(uv_loop_t*,
 +                            uv_async_t* async,
 +                            uv_async_cb async_cb);
 +UV_EXTERN int uv_async_send(uv_async_t* async);
 +
 +
 +/*
 + * uv_timer_t is a subclass of uv_handle_t.
 + *
 + * Used to get woken up at a specified time in the future.
 + */
 +struct uv_timer_s {
 +  UV_HANDLE_FIELDS
 +  UV_TIMER_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_timer_init(uv_loop_t*, uv_timer_t* handle);
 +UV_EXTERN int uv_timer_start(uv_timer_t* handle,
 +                             uv_timer_cb cb,
 +                             uint64_t timeout,
 +                             uint64_t repeat);
 +UV_EXTERN int uv_timer_stop(uv_timer_t* handle);
 +UV_EXTERN int uv_timer_again(uv_timer_t* handle);
 +UV_EXTERN void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat);
 +UV_EXTERN uint64_t uv_timer_get_repeat(const uv_timer_t* handle);
 +
 +
 +/*
 + * uv_getaddrinfo_t is a subclass of uv_req_t.
 + *
 + * Request object for uv_getaddrinfo.
 + */
 +struct uv_getaddrinfo_s {
 +  UV_REQ_FIELDS
 +  /* read-only */
 +  uv_loop_t* loop;
 +  /* struct addrinfo* addrinfo is marked as private, but it really isn't. */
 +  UV_GETADDRINFO_PRIVATE_FIELDS
 +};
 +
 +
 +UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop,
 +                             uv_getaddrinfo_t* req,
 +                             uv_getaddrinfo_cb getaddrinfo_cb,
 +                             const char* node,
 +                             const char* service,
 +                             const struct addrinfo* hints);
 +UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai);
 +
 +
 +/*
 +* uv_getnameinfo_t is a subclass of uv_req_t.
 +*
 +* Request object for uv_getnameinfo.
 +*/
 +struct uv_getnameinfo_s {
 +  UV_REQ_FIELDS
 +  /* read-only */
 +  uv_loop_t* loop;
 +  /* host and service are marked as private, but they really aren't. */
 +  UV_GETNAMEINFO_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_getnameinfo(uv_loop_t* loop,
 +                             uv_getnameinfo_t* req,
 +                             uv_getnameinfo_cb getnameinfo_cb,
 +                             const struct sockaddr* addr,
 +                             int flags);
 +
 +
 +/* uv_spawn() options. */
 +typedef enum {
 +  UV_IGNORE         = 0x00,
 +  UV_CREATE_PIPE    = 0x01,
 +  UV_INHERIT_FD     = 0x02,
 +  UV_INHERIT_STREAM = 0x04,
 +
 +  /*
 +   * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE
 +   * determine the direction of flow, from the child process' perspective. Both
 +   * flags may be specified to create a duplex data stream.
 +   */
 +  UV_READABLE_PIPE  = 0x10,
 +  UV_WRITABLE_PIPE  = 0x20
 +} uv_stdio_flags;
 +
 +typedef struct uv_stdio_container_s {
 +  uv_stdio_flags flags;
 +
 +  union {
 +    uv_stream_t* stream;
 +    int fd;
 +  } data;
 +} uv_stdio_container_t;
 +
 +typedef struct uv_process_options_s {
 +  uv_exit_cb exit_cb; /* Called after the process exits. */
 +  const char* file;   /* Path to program to execute. */
 +  /*
 +   * Command line arguments. args[0] should be the path to the program. On
 +   * Windows this uses CreateProcess which concatenates the arguments into a
 +   * string this can cause some strange errors. See the note at
 +   * windows_verbatim_arguments.
 +   */
 +  char** args;
 +  /*
 +   * This will be set as the environ variable in the subprocess. If this is
 +   * NULL then the parents environ will be used.
 +   */
 +  char** env;
 +  /*
 +   * If non-null this represents a directory the subprocess should execute
 +   * in. Stands for current working directory.
 +   */
 +  const char* cwd;
 +  /*
 +   * Various flags that control how uv_spawn() behaves. See the definition of
 +   * `enum uv_process_flags` below.
 +   */
 +  unsigned int flags;
 +  /*
 +   * The `stdio` field points to an array of uv_stdio_container_t structs that
 +   * describe the file descriptors that will be made available to the child
 +   * process. The convention is that stdio[0] points to stdin, fd 1 is used for
 +   * stdout, and fd 2 is stderr.
 +   *
 +   * Note that on windows file descriptors greater than 2 are available to the
 +   * child process only if the child processes uses the MSVCRT runtime.
 +   */
 +  int stdio_count;
 +  uv_stdio_container_t* stdio;
 +  /*
 +   * Libuv can change the child process' user/group id. This happens only when
 +   * the appropriate bits are set in the flags fields. This is not supported on
 +   * windows; uv_spawn() will fail and set the error to UV_ENOTSUP.
 +   */
 +  uv_uid_t uid;
 +  uv_gid_t gid;
 +} uv_process_options_t;
 +
 +/*
 + * These are the flags that can be used for the uv_process_options.flags field.
 + */
 +enum uv_process_flags {
 +  /*
 +   * Set the child process' user id. The user id is supplied in the `uid` field
 +   * of the options struct. This does not work on windows; setting this flag
 +   * will cause uv_spawn() to fail.
 +   */
 +  UV_PROCESS_SETUID = (1 << 0),
 +  /*
 +   * Set the child process' group id. The user id is supplied in the `gid`
 +   * field of the options struct. This does not work on windows; setting this
 +   * flag will cause uv_spawn() to fail.
 +   */
 +  UV_PROCESS_SETGID = (1 << 1),
 +  /*
 +   * Do not wrap any arguments in quotes, or perform any other escaping, when
 +   * converting the argument list into a command line string. This option is
 +   * only meaningful on Windows systems. On Unix it is silently ignored.
 +   */
 +  UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2),
 +  /*
 +   * Spawn the child process in a detached state - this will make it a process
 +   * group leader, and will effectively enable the child to keep running after
 +   * the parent exits.  Note that the child process will still keep the
 +   * parent's event loop alive unless the parent process calls uv_unref() on
 +   * the child's process handle.
 +   */
 +  UV_PROCESS_DETACHED = (1 << 3),
 +  /*
 +   * Hide the subprocess console window that would normally be created. This
 +   * option is only meaningful on Windows systems. On Unix it is silently
 +   * ignored.
 +   */
 +  UV_PROCESS_WINDOWS_HIDE = (1 << 4)
 +};
 +
 +/*
 + * uv_process_t is a subclass of uv_handle_t.
 + */
 +struct uv_process_s {
 +  UV_HANDLE_FIELDS
 +  uv_exit_cb exit_cb;
 +  int pid;
 +  UV_PROCESS_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_spawn(uv_loop_t* loop,
 +                       uv_process_t* handle,
 +                       const uv_process_options_t* options);
 +UV_EXTERN int uv_process_kill(uv_process_t*, int signum);
 +UV_EXTERN int uv_kill(int pid, int signum);
++UV_EXTERN uv_pid_t uv_process_get_pid(const uv_process_t*);
 +
 +
 +/*
 + * uv_work_t is a subclass of uv_req_t.
 + */
 +struct uv_work_s {
 +  UV_REQ_FIELDS
 +  uv_loop_t* loop;
 +  uv_work_cb work_cb;
 +  uv_after_work_cb after_work_cb;
 +  UV_WORK_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_queue_work(uv_loop_t* loop,
 +                            uv_work_t* req,
 +                            uv_work_cb work_cb,
 +                            uv_after_work_cb after_work_cb);
 +
 +UV_EXTERN int uv_cancel(uv_req_t* req);
 +
 +
 +struct uv_cpu_info_s {
 +  char* model;
 +  int speed;
 +  struct uv_cpu_times_s {
 +    uint64_t user;
 +    uint64_t nice;
 +    uint64_t sys;
 +    uint64_t idle;
 +    uint64_t irq;
 +  } cpu_times;
 +};
 +
 +struct uv_interface_address_s {
 +  char* name;
 +  char phys_addr[6];
 +  int is_internal;
 +  union {
 +    struct sockaddr_in address4;
 +    struct sockaddr_in6 address6;
 +  } address;
 +  union {
 +    struct sockaddr_in netmask4;
 +    struct sockaddr_in6 netmask6;
 +  } netmask;
 +};
 +
 +struct uv_passwd_s {
 +  char* username;
 +  long uid;
 +  long gid;
 +  char* shell;
 +  char* homedir;
 +};
 +
 +typedef enum {
 +  UV_DIRENT_UNKNOWN,
 +  UV_DIRENT_FILE,
 +  UV_DIRENT_DIR,
 +  UV_DIRENT_LINK,
 +  UV_DIRENT_FIFO,
 +  UV_DIRENT_SOCKET,
 +  UV_DIRENT_CHAR,
 +  UV_DIRENT_BLOCK
 +} uv_dirent_type_t;
 +
 +struct uv_dirent_s {
 +  const char* name;
 +  uv_dirent_type_t type;
 +};
 +
 +UV_EXTERN char** uv_setup_args(int argc, char** argv);
 +UV_EXTERN int uv_get_process_title(char* buffer, size_t size);
 +UV_EXTERN int uv_set_process_title(const char* title);
 +UV_EXTERN int uv_resident_set_memory(size_t* rss);
 +UV_EXTERN int uv_uptime(double* uptime);
++UV_EXTERN uv_os_fd_t uv_get_osfhandle(int fd);
 +
 +typedef struct {
 +  long tv_sec;
 +  long tv_usec;
 +} uv_timeval_t;
 +
 +typedef struct {
 +   uv_timeval_t ru_utime; /* user CPU time used */
 +   uv_timeval_t ru_stime; /* system CPU time used */
 +   uint64_t ru_maxrss;    /* maximum resident set size */
 +   uint64_t ru_ixrss;     /* integral shared memory size */
 +   uint64_t ru_idrss;     /* integral unshared data size */
 +   uint64_t ru_isrss;     /* integral unshared stack size */
 +   uint64_t ru_minflt;    /* page reclaims (soft page faults) */
 +   uint64_t ru_majflt;    /* page faults (hard page faults) */
 +   uint64_t ru_nswap;     /* swaps */
 +   uint64_t ru_inblock;   /* block input operations */
 +   uint64_t ru_oublock;   /* block output operations */
 +   uint64_t ru_msgsnd;    /* IPC messages sent */
 +   uint64_t ru_msgrcv;    /* IPC messages received */
 +   uint64_t ru_nsignals;  /* signals received */
 +   uint64_t ru_nvcsw;     /* voluntary context switches */
 +   uint64_t ru_nivcsw;    /* involuntary context switches */
 +} uv_rusage_t;
 +
 +UV_EXTERN int uv_getrusage(uv_rusage_t* rusage);
 +
 +UV_EXTERN int uv_os_homedir(char* buffer, size_t* size);
 +UV_EXTERN int uv_os_tmpdir(char* buffer, size_t* size);
 +UV_EXTERN int uv_os_get_passwd(uv_passwd_t* pwd);
 +UV_EXTERN void uv_os_free_passwd(uv_passwd_t* pwd);
++UV_EXTERN uv_pid_t uv_os_getpid(void);
++UV_EXTERN uv_pid_t uv_os_getppid(void);
 +
 +UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count);
 +UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count);
 +
 +UV_EXTERN int uv_interface_addresses(uv_interface_address_t** addresses,
 +                                     int* count);
 +UV_EXTERN void uv_free_interface_addresses(uv_interface_address_t* addresses,
 +                                           int count);
 +
 +UV_EXTERN int uv_os_getenv(const char* name, char* buffer, size_t* size);
 +UV_EXTERN int uv_os_setenv(const char* name, const char* value);
 +UV_EXTERN int uv_os_unsetenv(const char* name);
 +
 +UV_EXTERN int uv_os_gethostname(char* buffer, size_t* size);
 +
 +
 +typedef enum {
 +  UV_FS_UNKNOWN = -1,
 +  UV_FS_CUSTOM,
 +  UV_FS_OPEN,
 +  UV_FS_CLOSE,
 +  UV_FS_READ,
 +  UV_FS_WRITE,
 +  UV_FS_SENDFILE,
 +  UV_FS_STAT,
 +  UV_FS_LSTAT,
 +  UV_FS_FSTAT,
 +  UV_FS_FTRUNCATE,
 +  UV_FS_UTIME,
 +  UV_FS_FUTIME,
 +  UV_FS_ACCESS,
 +  UV_FS_CHMOD,
 +  UV_FS_FCHMOD,
 +  UV_FS_FSYNC,
 +  UV_FS_FDATASYNC,
 +  UV_FS_UNLINK,
 +  UV_FS_RMDIR,
 +  UV_FS_MKDIR,
 +  UV_FS_MKDTEMP,
 +  UV_FS_RENAME,
 +  UV_FS_SCANDIR,
 +  UV_FS_LINK,
 +  UV_FS_SYMLINK,
 +  UV_FS_READLINK,
 +  UV_FS_CHOWN,
 +  UV_FS_FCHOWN,
-   UV_FS_REALPATH
++  UV_FS_REALPATH,
++  UV_FS_COPYFILE
 +} uv_fs_type;
 +
 +/* uv_fs_t is a subclass of uv_req_t. */
 +struct uv_fs_s {
 +  UV_REQ_FIELDS
 +  uv_fs_type fs_type;
 +  uv_loop_t* loop;
 +  uv_fs_cb cb;
 +  ssize_t result;
 +  void* ptr;
 +  const char* path;
 +  uv_stat_t statbuf;  /* Stores the result of uv_fs_stat() and uv_fs_fstat(). */
 +  UV_FS_PRIVATE_FIELDS
 +};
 +
++UV_EXTERN uv_fs_type uv_fs_get_type(const uv_fs_t*);
++UV_EXTERN ssize_t uv_fs_get_result(const uv_fs_t*);
++UV_EXTERN void* uv_fs_get_ptr(const uv_fs_t*);
++UV_EXTERN const char* uv_fs_get_path(const uv_fs_t*);
++UV_EXTERN uv_stat_t* uv_fs_get_statbuf(uv_fs_t*);
++
 +UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req);
 +UV_EXTERN int uv_fs_close(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          uv_file file,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_open(uv_loop_t* loop,
 +                         uv_fs_t* req,
 +                         const char* path,
 +                         int flags,
 +                         int mode,
 +                         uv_fs_cb cb);
 +UV_EXTERN int uv_fs_read(uv_loop_t* loop,
 +                         uv_fs_t* req,
 +                         uv_file file,
 +                         const uv_buf_t bufs[],
 +                         unsigned int nbufs,
 +                         int64_t offset,
 +                         uv_fs_cb cb);
 +UV_EXTERN int uv_fs_unlink(uv_loop_t* loop,
 +                           uv_fs_t* req,
 +                           const char* path,
 +                           uv_fs_cb cb);
 +UV_EXTERN int uv_fs_write(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          uv_file file,
 +                          const uv_buf_t bufs[],
 +                          unsigned int nbufs,
 +                          int64_t offset,
 +                          uv_fs_cb cb);
++/*
++ * This flag can be used with uv_fs_copyfile() to return an error if the
++ * destination already exists.
++ */
++#define UV_FS_COPYFILE_EXCL   0x0001
++
++UV_EXTERN int uv_fs_copyfile(uv_loop_t* loop,
++                             uv_fs_t* req,
++                             const char* path,
++                             const char* new_path,
++                             int flags,
++                             uv_fs_cb cb);
 +UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          const char* path,
 +                          int mode,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop,
 +                            uv_fs_t* req,
 +                            const char* tpl,
 +                            uv_fs_cb cb);
 +UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          const char* path,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_scandir(uv_loop_t* loop,
 +                            uv_fs_t* req,
 +                            const char* path,
 +                            int flags,
 +                            uv_fs_cb cb);
 +UV_EXTERN int uv_fs_scandir_next(uv_fs_t* req,
 +                                 uv_dirent_t* ent);
 +UV_EXTERN int uv_fs_stat(uv_loop_t* loop,
 +                         uv_fs_t* req,
 +                         const char* path,
 +                         uv_fs_cb cb);
 +UV_EXTERN int uv_fs_fstat(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          uv_file file,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_rename(uv_loop_t* loop,
 +                           uv_fs_t* req,
 +                           const char* path,
 +                           const char* new_path,
 +                           uv_fs_cb cb);
 +UV_EXTERN int uv_fs_fsync(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          uv_file file,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop,
 +                              uv_fs_t* req,
 +                              uv_file file,
 +                              uv_fs_cb cb);
 +UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop,
 +                              uv_fs_t* req,
 +                              uv_file file,
 +                              int64_t offset,
 +                              uv_fs_cb cb);
 +UV_EXTERN 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);
 +UV_EXTERN int uv_fs_access(uv_loop_t* loop,
 +                           uv_fs_t* req,
 +                           const char* path,
 +                           int mode,
 +                           uv_fs_cb cb);
 +UV_EXTERN int uv_fs_chmod(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          const char* path,
 +                          int mode,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_utime(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          const char* path,
 +                          double atime,
 +                          double mtime,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_futime(uv_loop_t* loop,
 +                           uv_fs_t* req,
 +                           uv_file file,
 +                           double atime,
 +                           double mtime,
 +                           uv_fs_cb cb);
 +UV_EXTERN int uv_fs_lstat(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          const char* path,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_link(uv_loop_t* loop,
 +                         uv_fs_t* req,
 +                         const char* path,
 +                         const char* new_path,
 +                         uv_fs_cb cb);
 +
 +/*
 + * This flag can be used with uv_fs_symlink() on Windows to specify whether
 + * path argument points to a directory.
 + */
 +#define UV_FS_SYMLINK_DIR          0x0001
 +
 +/*
 + * This flag can be used with uv_fs_symlink() on Windows to specify whether
 + * the symlink is to be created using junction points.
 + */
 +#define UV_FS_SYMLINK_JUNCTION     0x0002
 +
 +UV_EXTERN int uv_fs_symlink(uv_loop_t* loop,
 +                            uv_fs_t* req,
 +                            const char* path,
 +                            const char* new_path,
 +                            int flags,
 +                            uv_fs_cb cb);
 +UV_EXTERN int uv_fs_readlink(uv_loop_t* loop,
 +                             uv_fs_t* req,
 +                             const char* path,
 +                             uv_fs_cb cb);
 +UV_EXTERN int uv_fs_realpath(uv_loop_t* loop,
 +                             uv_fs_t* req,
 +                             const char* path,
 +                             uv_fs_cb cb);
 +UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop,
 +                           uv_fs_t* req,
 +                           uv_file file,
 +                           int mode,
 +                           uv_fs_cb cb);
 +UV_EXTERN int uv_fs_chown(uv_loop_t* loop,
 +                          uv_fs_t* req,
 +                          const char* path,
 +                          uv_uid_t uid,
 +                          uv_gid_t gid,
 +                          uv_fs_cb cb);
 +UV_EXTERN int uv_fs_fchown(uv_loop_t* loop,
 +                           uv_fs_t* req,
 +                           uv_file file,
 +                           uv_uid_t uid,
 +                           uv_gid_t gid,
 +                           uv_fs_cb cb);
 +
 +
 +enum uv_fs_event {
 +  UV_RENAME = 1,
 +  UV_CHANGE = 2
 +};
 +
 +
 +struct uv_fs_event_s {
 +  UV_HANDLE_FIELDS
 +  /* private */
 +  char* path;
 +  UV_FS_EVENT_PRIVATE_FIELDS
 +};
 +
 +
 +/*
 + * uv_fs_stat() based polling file watcher.
 + */
 +struct uv_fs_poll_s {
 +  UV_HANDLE_FIELDS
 +  /* Private, don't touch. */
 +  void* poll_ctx;
 +};
 +
 +UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle);
 +UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle,
 +                               uv_fs_poll_cb poll_cb,
 +                               const char* path,
 +                               unsigned int interval);
 +UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle);
 +UV_EXTERN int uv_fs_poll_getpath(uv_fs_poll_t* handle,
 +                                 char* buffer,
 +                                 size_t* size);
 +
 +
 +struct uv_signal_s {
 +  UV_HANDLE_FIELDS
 +  uv_signal_cb signal_cb;
 +  int signum;
 +  UV_SIGNAL_PRIVATE_FIELDS
 +};
 +
 +UV_EXTERN int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle);
 +UV_EXTERN int uv_signal_start(uv_signal_t* handle,
 +                              uv_signal_cb signal_cb,
 +                              int signum);
 +UV_EXTERN int uv_signal_start_oneshot(uv_signal_t* handle,
 +                                      uv_signal_cb signal_cb,
 +                                      int signum);
 +UV_EXTERN int uv_signal_stop(uv_signal_t* handle);
 +
 +UV_EXTERN void uv_loadavg(double avg[3]);
 +
 +
 +/*
 + * Flags to be passed to uv_fs_event_start().
 + */
 +enum uv_fs_event_flags {
 +  /*
 +   * By default, if the fs event watcher is given a directory name, we will
 +   * watch for all events in that directory. This flags overrides this behavior
 +   * and makes fs_event report only changes to the directory entry itself. This
 +   * flag does not affect individual files watched.
 +   * This flag is currently not implemented yet on any backend.
 +   */
 +  UV_FS_EVENT_WATCH_ENTRY = 1,
 +
 +  /*
 +   * By default uv_fs_event will try to use a kernel interface such as inotify
 +   * or kqueue to detect events. This may not work on remote filesystems such
 +   * as NFS mounts. This flag makes fs_event fall back to calling stat() on a
 +   * regular interval.
 +   * This flag is currently not implemented yet on any backend.
 +   */
 +  UV_FS_EVENT_STAT = 2,
 +
 +  /*
 +   * By default, event watcher, when watching directory, is not registering
 +   * (is ignoring) changes in it's subdirectories.
 +   * This flag will override this behaviour on platforms that support it.
 +   */
 +  UV_FS_EVENT_RECURSIVE = 4
 +};
 +
 +
 +UV_EXTERN int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle);
 +UV_EXTERN int uv_fs_event_start(uv_fs_event_t* handle,
 +                                uv_fs_event_cb cb,
 +                                const char* path,
 +                                unsigned int flags);
 +UV_EXTERN int uv_fs_event_stop(uv_fs_event_t* handle);
 +UV_EXTERN int uv_fs_event_getpath(uv_fs_event_t* handle,
 +                                  char* buffer,
 +                                  size_t* size);
 +
 +UV_EXTERN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr);
 +UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr);
 +
 +UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size);
 +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);
 +
++#if defined(IF_NAMESIZE)
++# define UV_IF_NAMESIZE (IF_NAMESIZE + 1)
++#elif defined(IFNAMSIZ)
++# define UV_IF_NAMESIZE (IFNAMSIZ + 1)
++#else
++# define UV_IF_NAMESIZE (16 + 1)
++#endif
++
++UV_EXTERN int uv_if_indextoname(unsigned int ifindex,
++                                char* buffer,
++                                size_t* size);
++UV_EXTERN int uv_if_indextoiid(unsigned int ifindex,
++                               char* buffer,
++                               size_t* size);
++
 +UV_EXTERN int uv_exepath(char* buffer, size_t* size);
 +
 +UV_EXTERN int uv_cwd(char* buffer, size_t* size);
 +
 +UV_EXTERN int uv_chdir(const char* dir);
 +
 +UV_EXTERN uint64_t uv_get_free_memory(void);
 +UV_EXTERN uint64_t uv_get_total_memory(void);
 +
 +UV_EXTERN uint64_t uv_hrtime(void);
 +
 +UV_EXTERN void uv_disable_stdio_inheritance(void);
 +
 +UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib);
 +UV_EXTERN void uv_dlclose(uv_lib_t* lib);
 +UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr);
 +UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib);
 +
 +UV_EXTERN int uv_mutex_init(uv_mutex_t* handle);
++UV_EXTERN int uv_mutex_init_recursive(uv_mutex_t* handle);
 +UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle);
 +UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle);
 +UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle);
 +UV_EXTERN void uv_mutex_unlock(uv_mutex_t* handle);
 +
 +UV_EXTERN int uv_rwlock_init(uv_rwlock_t* rwlock);
 +UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t* rwlock);
 +UV_EXTERN void uv_rwlock_rdlock(uv_rwlock_t* rwlock);
 +UV_EXTERN int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock);
 +UV_EXTERN void uv_rwlock_rdunlock(uv_rwlock_t* rwlock);
 +UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock);
 +UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock);
 +UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock);
 +
 +UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value);
 +UV_EXTERN void uv_sem_destroy(uv_sem_t* sem);
 +UV_EXTERN void uv_sem_post(uv_sem_t* sem);
 +UV_EXTERN void uv_sem_wait(uv_sem_t* sem);
 +UV_EXTERN int uv_sem_trywait(uv_sem_t* sem);
 +
 +UV_EXTERN int uv_cond_init(uv_cond_t* cond);
 +UV_EXTERN void uv_cond_destroy(uv_cond_t* cond);
 +UV_EXTERN void uv_cond_signal(uv_cond_t* cond);
 +UV_EXTERN void uv_cond_broadcast(uv_cond_t* cond);
 +
 +UV_EXTERN int uv_barrier_init(uv_barrier_t* barrier, unsigned int count);
 +UV_EXTERN void uv_barrier_destroy(uv_barrier_t* barrier);
 +UV_EXTERN int uv_barrier_wait(uv_barrier_t* barrier);
 +
 +UV_EXTERN void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex);
 +UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond,
 +                                uv_mutex_t* mutex,
 +                                uint64_t timeout);
 +
 +UV_EXTERN void uv_once(uv_once_t* guard, void (*callback)(void));
 +
 +UV_EXTERN int uv_key_create(uv_key_t* key);
 +UV_EXTERN void uv_key_delete(uv_key_t* key);
 +UV_EXTERN void* uv_key_get(uv_key_t* key);
 +UV_EXTERN void uv_key_set(uv_key_t* key, void* value);
 +
 +typedef void (*uv_thread_cb)(void* arg);
 +
 +UV_EXTERN int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg);
 +UV_EXTERN uv_thread_t uv_thread_self(void);
 +UV_EXTERN int uv_thread_join(uv_thread_t *tid);
 +UV_EXTERN int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2);
 +
 +/* The presence of these unions force similar struct layout. */
 +#define XX(_, name) uv_ ## name ## _t name;
 +union uv_any_handle {
 +  UV_HANDLE_TYPE_MAP(XX)
 +};
 +
 +union uv_any_req {
 +  UV_REQ_TYPE_MAP(XX)
 +};
 +#undef XX
 +
 +
 +struct uv_loop_s {
 +  /* User data - use this for whatever. */
 +  void* data;
 +  /* Loop reference counting. */
 +  unsigned int active_handles;
 +  void* handle_queue[2];
 +  void* active_reqs[2];
 +  /* Internal flag to signal loop stop. */
 +  unsigned int stop_flag;
 +  UV_LOOP_PRIVATE_FIELDS
 +};
 +
++UV_EXTERN void* uv_loop_get_data(const uv_loop_t*);
++UV_EXTERN void uv_loop_set_data(uv_loop_t*, void* data);
 +
 +/* Don't export the private CPP symbols. */
 +#undef UV_HANDLE_TYPE_PRIVATE
 +#undef UV_REQ_TYPE_PRIVATE
 +#undef UV_REQ_PRIVATE_FIELDS
 +#undef UV_STREAM_PRIVATE_FIELDS
 +#undef UV_TCP_PRIVATE_FIELDS
 +#undef UV_PREPARE_PRIVATE_FIELDS
 +#undef UV_CHECK_PRIVATE_FIELDS
 +#undef UV_IDLE_PRIVATE_FIELDS
 +#undef UV_ASYNC_PRIVATE_FIELDS
 +#undef UV_TIMER_PRIVATE_FIELDS
 +#undef UV_GETADDRINFO_PRIVATE_FIELDS
 +#undef UV_GETNAMEINFO_PRIVATE_FIELDS
 +#undef UV_FS_REQ_PRIVATE_FIELDS
 +#undef UV_WORK_PRIVATE_FIELDS
 +#undef UV_FS_EVENT_PRIVATE_FIELDS
 +#undef UV_SIGNAL_PRIVATE_FIELDS
 +#undef UV_LOOP_PRIVATE_FIELDS
 +#undef UV_LOOP_PRIVATE_PLATFORM_FIELDS
 +
 +#ifdef __cplusplus
 +}
 +#endif
 +#endif /* UV_H */
diff --cc Utilities/cmlibuv/src/unix/aix-common.c
index 0000000,c2217fb..c2217fb
mode 000000,100644..100644
--- a/Utilities/cmlibuv/src/unix/aix-common.c
+++ b/Utilities/cmlibuv/src/unix/aix-common.c
diff --cc Utilities/cmlibuv/src/unix/fs.c
index 82c91ef,0000000..0a4c183
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/unix/fs.c
+++ b/Utilities/cmlibuv/src/unix/fs.c
@@@ -1,1379 -1,0 +1,1532 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +/* Caveat emptor: this file deviates from the libuv convention of returning
 + * negated errno codes. Most uv_fs_*() functions map directly to the system
 + * call of the same name. For more complex wrappers, it's easier to just
 + * return -1 with errno set. The dispatcher in uv__fs_work() takes care of
 + * getting the errno to the right place (req->result or as the return value.)
 + */
 +
 +#include "uv.h"
 +#include "internal.h"
 +
 +#include <errno.h>
 +#include <stdio.h>
 +#include <stdlib.h>
 +#include <string.h>
 +#include <limits.h> /* PATH_MAX */
 +
 +#include <sys/types.h>
 +#include <sys/socket.h>
 +#include <sys/stat.h>
 +#include <sys/time.h>
 +#include <sys/uio.h>
 +#include <pthread.h>
 +#include <unistd.h>
 +#include <fcntl.h>
 +#include <utime.h>
 +#include <poll.h>
 +
 +#if defined(__DragonFly__)        ||                                      \
 +    defined(__FreeBSD__)          ||                                      \
 +    defined(__FreeBSD_kernel_)    ||                                      \
 +    defined(__OpenBSD__)          ||                                      \
 +    defined(__NetBSD__)
 +# define HAVE_PREADV 1
 +#else
 +# define HAVE_PREADV 0
 +#endif
 +
 +#if defined(__linux__) || defined(__sun)
 +# include <sys/sendfile.h>
 +#endif
 +
++#if defined(__APPLE__)
++# include <copyfile.h>
++#endif
++
 +#define INIT(subtype)                                                         \
 +  do {                                                                        \
++    if (req == NULL)                                                          \
++      return -EINVAL;                                                         \
 +    req->type = UV_FS;                                                        \
 +    if (cb != NULL)                                                           \
 +      uv__req_init(loop, req, UV_FS);                                         \
 +    req->fs_type = UV_FS_ ## subtype;                                         \
 +    req->result = 0;                                                          \
 +    req->ptr = NULL;                                                          \
 +    req->loop = loop;                                                         \
 +    req->path = NULL;                                                         \
 +    req->new_path = NULL;                                                     \
 +    req->cb = cb;                                                             \
 +  }                                                                           \
 +  while (0)
 +
 +#define PATH                                                                  \
 +  do {                                                                        \
 +    assert(path != NULL);                                                     \
 +    if (cb == NULL) {                                                         \
 +      req->path = path;                                                       \
 +    } else {                                                                  \
 +      req->path = uv__strdup(path);                                           \
 +      if (req->path == NULL) {                                                \
 +        uv__req_unregister(loop, req);                                        \
 +        return -ENOMEM;                                                       \
 +      }                                                                       \
 +    }                                                                         \
 +  }                                                                           \
 +  while (0)
 +
 +#define PATH2                                                                 \
 +  do {                                                                        \
 +    if (cb == NULL) {                                                         \
 +      req->path = path;                                                       \
 +      req->new_path = new_path;                                               \
 +    } else {                                                                  \
 +      size_t path_len;                                                        \
 +      size_t new_path_len;                                                    \
 +      path_len = strlen(path) + 1;                                            \
 +      new_path_len = strlen(new_path) + 1;                                    \
 +      req->path = uv__malloc(path_len + new_path_len);                        \
 +      if (req->path == NULL) {                                                \
 +        uv__req_unregister(loop, req);                                        \
 +        return -ENOMEM;                                                       \
 +      }                                                                       \
 +      req->new_path = req->path + path_len;                                   \
 +      memcpy((void*) req->path, path, path_len);                              \
 +      memcpy((void*) req->new_path, new_path, new_path_len);                  \
 +    }                                                                         \
 +  }                                                                           \
 +  while (0)
 +
 +#define POST                                                                  \
 +  do {                                                                        \
 +    if (cb != NULL) {                                                         \
 +      uv__work_submit(loop, &req->work_req, uv__fs_work, uv__fs_done);        \
 +      return 0;                                                               \
 +    }                                                                         \
 +    else {                                                                    \
 +      uv__fs_work(&req->work_req);                                            \
 +      return req->result;                                                     \
 +    }                                                                         \
 +  }                                                                           \
 +  while (0)
 +
 +
- static ssize_t uv__fs_fdatasync(uv_fs_t* req) {
- #if defined(__linux__) || defined(__sun) || defined(__NetBSD__)
-   return fdatasync(req->file);
- #elif defined(__APPLE__)
++static ssize_t uv__fs_fsync(uv_fs_t* req) {
++#if defined(__APPLE__)
 +  /* Apple's fdatasync and fsync explicitly do NOT flush the drive write cache
 +   * to the drive platters. This is in contrast to Linux's fdatasync and fsync
 +   * which do, according to recent man pages. F_FULLFSYNC is Apple's equivalent
-    * for flushing buffered data to permanent storage.
++   * for flushing buffered data to permanent storage. If F_FULLFSYNC is not
++   * supported by the file system we should fall back to fsync(). This is the
++   * same approach taken by sqlite.
 +   */
-   return fcntl(req->file, F_FULLFSYNC);
++  int r;
++
++  r = fcntl(req->file, F_FULLFSYNC);
++  if (r != 0 && errno == ENOTTY)
++    r = fsync(req->file);
++  return r;
 +#else
 +  return fsync(req->file);
 +#endif
 +}
 +
 +
- static ssize_t uv__fs_fsync(uv_fs_t* req) {
- #if defined(__APPLE__)
-   /* See the comment in uv__fs_fdatasync. */
-   return fcntl(req->file, F_FULLFSYNC);
++static ssize_t uv__fs_fdatasync(uv_fs_t* req) {
++#if defined(__linux__) || defined(__sun) || defined(__NetBSD__)
++  return fdatasync(req->file);
++#elif defined(__APPLE__)
++  /* See the comment in uv__fs_fsync. */
++  return uv__fs_fsync(req);
 +#else
 +  return fsync(req->file);
 +#endif
 +}
 +
 +
 +static ssize_t uv__fs_futime(uv_fs_t* req) {
 +#if defined(__linux__)
 +  /* utimesat() has nanosecond resolution but we stick to microseconds
 +   * for the sake of consistency with other platforms.
 +   */
 +  static int no_utimesat;
 +  struct timespec ts[2];
 +  struct timeval tv[2];
 +  char path[sizeof("/proc/self/fd/") + 3 * sizeof(int)];
 +  int r;
 +
 +  if (no_utimesat)
 +    goto skip;
 +
 +  ts[0].tv_sec  = req->atime;
 +  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;
 +
 +  r = uv__utimesat(req->file, NULL, ts, 0);
 +  if (r == 0)
 +    return r;
 +
 +  if (errno != ENOSYS)
 +    return r;
 +
 +  no_utimesat = 1;
 +
 +skip:
 +
 +  tv[0].tv_sec  = req->atime;
 +  tv[0].tv_usec = (uint64_t)(req->atime * 1000000) % 1000000;
 +  tv[1].tv_sec  = req->mtime;
 +  tv[1].tv_usec = (uint64_t)(req->mtime * 1000000) % 1000000;
 +  snprintf(path, sizeof(path), "/proc/self/fd/%d", (int) req->file);
 +
 +  r = utimes(path, tv);
 +  if (r == 0)
 +    return r;
 +
 +  switch (errno) {
 +  case ENOENT:
 +    if (fcntl(req->file, F_GETFL) == -1 && errno == EBADF)
 +      break;
 +    /* Fall through. */
 +
 +  case EACCES:
 +  case ENOTDIR:
 +    errno = ENOSYS;
 +    break;
 +  }
 +
 +  return r;
 +
 +#elif defined(__APPLE__)                                                      \
 +    || defined(__DragonFly__)                                                 \
 +    || defined(__FreeBSD__)                                                   \
 +    || defined(__FreeBSD_kernel__)                                            \
 +    || defined(__NetBSD__)                                                    \
 +    || defined(__OpenBSD__)                                                   \
 +    || defined(__sun)
 +  struct timeval tv[2];
 +  tv[0].tv_sec  = req->atime;
 +  tv[0].tv_usec = (uint64_t)(req->atime * 1000000) % 1000000;
 +  tv[1].tv_sec  = req->mtime;
 +  tv[1].tv_usec = (uint64_t)(req->mtime * 1000000) % 1000000;
 +# if defined(__sun)
 +  return futimesat(req->file, NULL, tv);
 +# else
 +  return futimes(req->file, tv);
 +# endif
 +#elif defined(_AIX71)
 +  struct timespec ts[2];
 +  ts[0].tv_sec  = req->atime;
 +  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;
 +  return futimens(req->file, ts);
 +#elif defined(__MVS__)
 +  attrib_t atr;
 +  memset(&atr, 0, sizeof(atr));
 +  atr.att_mtimechg = 1;
 +  atr.att_atimechg = 1;
 +  atr.att_mtime = req->mtime;
 +  atr.att_atime = req->atime;
 +  return __fchattr(req->file, &atr, sizeof(atr));
 +#else
 +  errno = ENOSYS;
 +  return -1;
 +#endif
 +}
 +
 +#if defined(__sun) && (_XOPEN_SOURCE < 600 || defined(CMAKE_BOOTSTRAP))
 +static char* uv__mkdtemp(char *template)
 +{
 +  if (!mktemp(template) || mkdir(template, 0700))
 +    return NULL;
 +  return template;
 +}
 +#else
 +#define uv__mkdtemp mkdtemp
 +#endif
 +
 +static ssize_t uv__fs_mkdtemp(uv_fs_t* req) {
 +  return uv__mkdtemp((char*) req->path) ? 0 : -1;
 +}
 +
 +
 +static ssize_t uv__fs_open(uv_fs_t* req) {
 +  static int no_cloexec_support;
 +  int r;
 +
 +  /* Try O_CLOEXEC before entering locks */
 +  if (no_cloexec_support == 0) {
 +#ifdef O_CLOEXEC
 +    r = open(req->path, req->flags | O_CLOEXEC, req->mode);
 +    if (r >= 0)
 +      return r;
 +    if (errno != EINVAL)
 +      return r;
 +    no_cloexec_support = 1;
 +#endif  /* O_CLOEXEC */
 +  }
 +
 +  if (req->cb != NULL)
 +    uv_rwlock_rdlock(&req->loop->cloexec_lock);
 +
 +  r = open(req->path, req->flags, req->mode);
 +
 +  /* In case of failure `uv__cloexec` will leave error in `errno`,
 +   * so it is enough to just set `r` to `-1`.
 +   */
 +  if (r >= 0 && uv__cloexec(r, 1) != 0) {
 +    r = uv__close(r);
 +    if (r != 0)
 +      abort();
 +    r = -1;
 +  }
 +
 +  if (req->cb != NULL)
 +    uv_rwlock_rdunlock(&req->loop->cloexec_lock);
 +
 +  return r;
 +}
 +
 +
 +static ssize_t uv__fs_read(uv_fs_t* req) {
 +#if defined(__linux__)
 +  static int no_preadv;
 +#endif
 +  ssize_t result;
 +
 +#if defined(_AIX)
 +  struct stat buf;
 +  if(fstat(req->file, &buf))
 +    return -1;
 +  if(S_ISDIR(buf.st_mode)) {
 +    errno = EISDIR;
 +    return -1;
 +  }
 +#endif /* defined(_AIX) */
 +  if (req->off < 0) {
 +    if (req->nbufs == 1)
 +      result = read(req->file, req->bufs[0].base, req->bufs[0].len);
 +    else
 +      result = readv(req->file, (struct iovec*) req->bufs, req->nbufs);
 +  } else {
 +    if (req->nbufs == 1) {
 +      result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
 +      goto done;
 +    }
 +
 +#if HAVE_PREADV
 +    result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
 +#else
 +# if defined(__linux__)
 +    if (no_preadv) retry:
 +# endif
 +    {
 +      off_t nread;
 +      size_t index;
 +
 +      nread = 0;
 +      index = 0;
 +      result = 1;
 +      do {
 +        if (req->bufs[index].len > 0) {
 +          result = pread(req->file,
 +                         req->bufs[index].base,
 +                         req->bufs[index].len,
 +                         req->off + nread);
 +          if (result > 0)
 +            nread += result;
 +        }
 +        index++;
 +      } while (index < req->nbufs && result > 0);
 +      if (nread > 0)
 +        result = nread;
 +    }
 +# if defined(__linux__)
 +    else {
 +      result = uv__preadv(req->file,
 +                          (struct iovec*)req->bufs,
 +                          req->nbufs,
 +                          req->off);
 +      if (result == -1 && errno == ENOSYS) {
 +        no_preadv = 1;
 +        goto retry;
 +      }
 +    }
 +# endif
 +#endif
 +  }
 +
 +done:
 +  return result;
 +}
 +
 +
 +#if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_8)
 +#define UV_CONST_DIRENT uv__dirent_t
 +#else
 +#define UV_CONST_DIRENT const uv__dirent_t
 +#endif
 +
 +
 +static int uv__fs_scandir_filter(UV_CONST_DIRENT* dent) {
 +  return strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0;
 +}
 +
 +
 +static int uv__fs_scandir_sort(UV_CONST_DIRENT** a, UV_CONST_DIRENT** b) {
 +  return strcmp((*a)->d_name, (*b)->d_name);
 +}
 +
 +
 +static ssize_t uv__fs_scandir(uv_fs_t* req) {
 +  uv__dirent_t **dents;
 +  int n;
 +
 +  dents = NULL;
 +  n = scandir(req->path, &dents, uv__fs_scandir_filter, uv__fs_scandir_sort);
 +
 +  /* NOTE: We will use nbufs as an index field */
 +  req->nbufs = 0;
 +
 +  if (n == 0) {
 +    /* OS X still needs to deallocate some memory.
 +     * Memory was allocated using the system allocator, so use free() here.
 +     */
 +    free(dents);
 +    dents = NULL;
 +  } else if (n == -1) {
 +    return n;
 +  }
 +
 +  req->ptr = dents;
 +
 +  return n;
 +}
 +
 +
 +static ssize_t uv__fs_pathmax_size(const char* path) {
 +  ssize_t pathmax;
 +
 +  pathmax = pathconf(path, _PC_PATH_MAX);
 +
 +  if (pathmax == -1) {
 +#if defined(PATH_MAX)
 +    return PATH_MAX;
 +#else
 +#error "PATH_MAX undefined in the current platform"
 +#endif
 +  }
 +
 +  return pathmax;
 +}
 +
 +static ssize_t uv__fs_readlink(uv_fs_t* req) {
 +  ssize_t len;
 +  char* buf;
 +
 +  len = uv__fs_pathmax_size(req->path);
 +  buf = uv__malloc(len + 1);
 +
 +  if (buf == NULL) {
 +    errno = ENOMEM;
 +    return -1;
 +  }
 +
++#if defined(__MVS__)
++  len = os390_readlink(req->path, buf, len);
++#else
 +  len = readlink(req->path, buf, len);
++#endif
++
 +
 +  if (len == -1) {
 +    uv__free(buf);
 +    return -1;
 +  }
 +
 +  buf[len] = '\0';
 +  req->ptr = buf;
 +
 +  return 0;
 +}
 +
 +static ssize_t uv__fs_realpath(uv_fs_t* req) {
 +  ssize_t len;
 +  char* buf;
 +
 +  len = uv__fs_pathmax_size(req->path);
 +  buf = uv__malloc(len + 1);
 +
 +  if (buf == NULL) {
 +    errno = ENOMEM;
 +    return -1;
 +  }
 +
 +  if (realpath(req->path, buf) == NULL) {
 +    uv__free(buf);
 +    return -1;
 +  }
 +
 +  req->ptr = buf;
 +
 +  return 0;
 +}
 +
 +static ssize_t uv__fs_sendfile_emul(uv_fs_t* req) {
 +  struct pollfd pfd;
 +  int use_pread;
 +  off_t offset;
 +  ssize_t nsent;
 +  ssize_t nread;
 +  ssize_t nwritten;
 +  size_t buflen;
 +  size_t len;
 +  ssize_t n;
 +  int in_fd;
 +  int out_fd;
 +  char buf[8192];
 +
 +  len = req->bufsml[0].len;
 +  in_fd = req->flags;
 +  out_fd = req->file;
 +  offset = req->off;
 +  use_pread = 1;
 +
 +  /* Here are the rules regarding errors:
 +   *
 +   * 1. Read errors are reported only if nsent==0, otherwise we return nsent.
 +   *    The user needs to know that some data has already been sent, to stop
 +   *    them from sending it twice.
 +   *
 +   * 2. Write errors are always reported. Write errors are bad because they
 +   *    mean data loss: we've read data but now we can't write it out.
 +   *
 +   * We try to use pread() and fall back to regular read() if the source fd
 +   * doesn't support positional reads, for example when it's a pipe fd.
 +   *
 +   * If we get EAGAIN when writing to the target fd, we poll() on it until
 +   * it becomes writable again.
 +   *
 +   * FIXME: If we get a write error when use_pread==1, it should be safe to
 +   *        return the number of sent bytes instead of an error because pread()
 +   *        is, in theory, idempotent. However, special files in /dev or /proc
 +   *        may support pread() but not necessarily return the same data on
 +   *        successive reads.
 +   *
 +   * FIXME: There is no way now to signal that we managed to send *some* data
 +   *        before a write error.
 +   */
 +  for (nsent = 0; (size_t) nsent < len; ) {
 +    buflen = len - nsent;
 +
 +    if (buflen > sizeof(buf))
 +      buflen = sizeof(buf);
 +
 +    do
 +      if (use_pread)
 +        nread = pread(in_fd, buf, buflen, offset);
 +      else
 +        nread = read(in_fd, buf, buflen);
 +    while (nread == -1 && errno == EINTR);
 +
 +    if (nread == 0)
 +      goto out;
 +
 +    if (nread == -1) {
 +      if (use_pread && nsent == 0 && (errno == EIO || errno == ESPIPE)) {
 +        use_pread = 0;
 +        continue;
 +      }
 +
 +      if (nsent == 0)
 +        nsent = -1;
 +
 +      goto out;
 +    }
 +
 +    for (nwritten = 0; nwritten < nread; ) {
 +      do
 +        n = write(out_fd, buf + nwritten, nread - nwritten);
 +      while (n == -1 && errno == EINTR);
 +
 +      if (n != -1) {
 +        nwritten += n;
 +        continue;
 +      }
 +
 +      if (errno != EAGAIN && errno != EWOULDBLOCK) {
 +        nsent = -1;
 +        goto out;
 +      }
 +
 +      pfd.fd = out_fd;
 +      pfd.events = POLLOUT;
 +      pfd.revents = 0;
 +
 +      do
 +        n = poll(&pfd, 1, -1);
 +      while (n == -1 && errno == EINTR);
 +
 +      if (n == -1 || (pfd.revents & ~POLLOUT) != 0) {
 +        errno = EIO;
 +        nsent = -1;
 +        goto out;
 +      }
 +    }
 +
 +    offset += nread;
 +    nsent += nread;
 +  }
 +
 +out:
 +  if (nsent != -1)
 +    req->off = offset;
 +
 +  return nsent;
 +}
 +
 +
 +static ssize_t uv__fs_sendfile(uv_fs_t* req) {
 +  int in_fd;
 +  int out_fd;
 +
 +  in_fd = req->flags;
 +  out_fd = req->file;
 +
 +#if defined(__linux__) || defined(__sun)
 +  {
 +    off_t off;
 +    ssize_t r;
 +
 +    off = req->off;
 +    r = sendfile(out_fd, in_fd, &off, req->bufsml[0].len);
 +
 +    /* sendfile() on SunOS returns EINVAL if the target fd is not a socket but
 +     * it still writes out data. Fortunately, we can detect it by checking if
 +     * the offset has been updated.
 +     */
 +    if (r != -1 || off > req->off) {
 +      r = off - req->off;
 +      req->off = off;
 +      return r;
 +    }
 +
 +    if (errno == EINVAL ||
 +        errno == EIO ||
 +        errno == ENOTSOCK ||
 +        errno == EXDEV) {
 +      errno = 0;
 +      return uv__fs_sendfile_emul(req);
 +    }
 +
 +    return -1;
 +  }
 +#elif defined(__APPLE__)           || \
 +      defined(__DragonFly__)       || \
 +      defined(__FreeBSD__)         || \
 +      defined(__FreeBSD_kernel__)
 +  {
 +    off_t len;
 +    ssize_t r;
 +
 +    /* sendfile() on FreeBSD and Darwin returns EAGAIN if the target fd is in
 +     * non-blocking mode and not all data could be written. If a non-zero
 +     * number of bytes have been sent, we don't consider it an error.
 +     */
 +
 +#if defined(__FreeBSD__) || defined(__DragonFly__)
 +    len = 0;
 +    r = sendfile(in_fd, out_fd, req->off, req->bufsml[0].len, NULL, &len, 0);
 +#elif defined(__FreeBSD_kernel__)
 +    len = 0;
 +    r = bsd_sendfile(in_fd,
 +                     out_fd,
 +                     req->off,
 +                     req->bufsml[0].len,
 +                     NULL,
 +                     &len,
 +                     0);
 +#else
 +    /* The darwin sendfile takes len as an input for the length to send,
 +     * so make sure to initialize it with the caller's value. */
 +    len = req->bufsml[0].len;
 +    r = sendfile(in_fd, out_fd, req->off, &len, NULL, 0);
 +#endif
 +
 +     /*
 +     * The man page for sendfile(2) on DragonFly states that `len` contains
 +     * a meaningful value ONLY in case of EAGAIN and EINTR.
 +     * Nothing is said about it's value in case of other errors, so better
 +     * not depend on the potential wrong assumption that is was not modified
 +     * by the syscall.
 +     */
 +    if (r == 0 || ((errno == EAGAIN || errno == EINTR) && len != 0)) {
 +      req->off += len;
 +      return (ssize_t) len;
 +    }
 +
 +    if (errno == EINVAL ||
 +        errno == EIO ||
 +        errno == ENOTSOCK ||
 +        errno == EXDEV) {
 +      errno = 0;
 +      return uv__fs_sendfile_emul(req);
 +    }
 +
 +    return -1;
 +  }
 +#else
 +  /* Squelch compiler warnings. */
 +  (void) &in_fd;
 +  (void) &out_fd;
 +
 +  return uv__fs_sendfile_emul(req);
 +#endif
 +}
 +
 +
 +static ssize_t uv__fs_utime(uv_fs_t* req) {
 +  struct utimbuf buf;
 +  buf.actime = req->atime;
 +  buf.modtime = req->mtime;
 +  return utime(req->path, &buf); /* TODO use utimes() where available */
 +}
 +
 +
 +static ssize_t uv__fs_write(uv_fs_t* req) {
 +#if defined(__linux__)
 +  static int no_pwritev;
 +#endif
 +  ssize_t r;
 +
 +  /* Serialize writes on OS X, concurrent write() and pwrite() calls result in
 +   * data loss. We can't use a per-file descriptor lock, the descriptor may be
 +   * a dup().
 +   */
 +#if defined(__APPLE__)
 +  static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 +
 +  if (pthread_mutex_lock(&lock))
 +    abort();
 +#endif
 +
 +  if (req->off < 0) {
 +    if (req->nbufs == 1)
 +      r = write(req->file, req->bufs[0].base, req->bufs[0].len);
 +    else
 +      r = writev(req->file, (struct iovec*) req->bufs, req->nbufs);
 +  } else {
 +    if (req->nbufs == 1) {
 +      r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
 +      goto done;
 +    }
 +#if HAVE_PREADV
 +    r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
 +#else
 +# if defined(__linux__)
 +    if (no_pwritev) retry:
 +# endif
 +    {
 +      off_t written;
 +      size_t index;
 +
 +      written = 0;
 +      index = 0;
 +      r = 0;
 +      do {
 +        if (req->bufs[index].len > 0) {
 +          r = pwrite(req->file,
 +                     req->bufs[index].base,
 +                     req->bufs[index].len,
 +                     req->off + written);
 +          if (r > 0)
 +            written += r;
 +        }
 +        index++;
 +      } while (index < req->nbufs && r >= 0);
 +      if (written > 0)
 +        r = written;
 +    }
 +# if defined(__linux__)
 +    else {
 +      r = uv__pwritev(req->file,
 +                      (struct iovec*) req->bufs,
 +                      req->nbufs,
 +                      req->off);
 +      if (r == -1 && errno == ENOSYS) {
 +        no_pwritev = 1;
 +        goto retry;
 +      }
 +    }
 +# endif
 +#endif
 +  }
 +
 +done:
 +#if defined(__APPLE__)
 +  if (pthread_mutex_unlock(&lock))
 +    abort();
 +#endif
 +
 +  return r;
 +}
 +
++static ssize_t uv__fs_copyfile(uv_fs_t* req) {
++#if defined(__APPLE__) && !TARGET_OS_IPHONE
++  /* On macOS, use the native copyfile(3). */
++  copyfile_flags_t flags;
++
++  flags = COPYFILE_ALL;
++
++  if (req->flags & UV_FS_COPYFILE_EXCL)
++    flags |= COPYFILE_EXCL;
++
++  return copyfile(req->path, req->new_path, NULL, flags);
++#else
++  uv_fs_t fs_req;
++  uv_file srcfd;
++  uv_file dstfd;
++  struct stat statsbuf;
++  int dst_flags;
++  int result;
++  int err;
++  size_t bytes_to_send;
++  int64_t in_offset;
++
++  dstfd = -1;
++  err = 0;
++
++  /* Open the source file. */
++  srcfd = uv_fs_open(NULL, &fs_req, req->path, O_RDONLY, 0, NULL);
++  uv_fs_req_cleanup(&fs_req);
++
++  if (srcfd < 0)
++    return srcfd;
++
++  /* Get the source file's mode. */
++  if (fstat(srcfd, &statsbuf)) {
++    err = -errno;
++    goto out;
++  }
++
++  dst_flags = O_WRONLY | O_CREAT | O_TRUNC;
++
++  if (req->flags & UV_FS_COPYFILE_EXCL)
++    dst_flags |= O_EXCL;
++
++  /* Open the destination file. */
++  dstfd = uv_fs_open(NULL,
++                     &fs_req,
++                     req->new_path,
++                     dst_flags,
++                     statsbuf.st_mode,
++                     NULL);
++  uv_fs_req_cleanup(&fs_req);
++
++  if (dstfd < 0) {
++    err = dstfd;
++    goto out;
++  }
++
++  if (fchmod(dstfd, statsbuf.st_mode) == -1) {
++    err = -errno;
++    goto out;
++  }
++
++  bytes_to_send = statsbuf.st_size;
++  in_offset = 0;
++  while (bytes_to_send != 0) {
++    err = uv_fs_sendfile(NULL,
++                         &fs_req,
++                         dstfd,
++                         srcfd,
++                         in_offset,
++                         bytes_to_send,
++                         NULL);
++    uv_fs_req_cleanup(&fs_req);
++    if (err < 0)
++      break;
++    bytes_to_send -= fs_req.result;
++    in_offset += fs_req.result;
++  }
++
++out:
++  if (err < 0)
++    result = err;
++  else
++    result = 0;
++
++  /* Close the source file. */
++  err = uv__close_nocheckstdio(srcfd);
++
++  /* Don't overwrite any existing errors. */
++  if (err != 0 && result == 0)
++    result = err;
++
++  /* Close the destination file if it is open. */
++  if (dstfd >= 0) {
++    err = uv__close_nocheckstdio(dstfd);
++
++    /* Don't overwrite any existing errors. */
++    if (err != 0 && result == 0)
++      result = err;
++
++    /* Remove the destination file if something went wrong. */
++    if (result != 0) {
++      uv_fs_unlink(NULL, &fs_req, req->new_path, NULL);
++      /* Ignore the unlink return value, as an error already happened. */
++      uv_fs_req_cleanup(&fs_req);
++    }
++  }
++
++  return result;
++#endif
++}
++
 +static void uv__to_stat(struct stat* src, uv_stat_t* dst) {
 +  dst->st_dev = src->st_dev;
 +  dst->st_mode = src->st_mode;
 +  dst->st_nlink = src->st_nlink;
 +  dst->st_uid = src->st_uid;
 +  dst->st_gid = src->st_gid;
 +  dst->st_rdev = src->st_rdev;
 +  dst->st_ino = src->st_ino;
 +  dst->st_size = src->st_size;
 +  dst->st_blksize = src->st_blksize;
 +  dst->st_blocks = src->st_blocks;
 +
 +#if defined(__APPLE__)
 +  dst->st_atim.tv_sec = src->st_atimespec.tv_sec;
 +  dst->st_atim.tv_nsec = src->st_atimespec.tv_nsec;
 +  dst->st_mtim.tv_sec = src->st_mtimespec.tv_sec;
 +  dst->st_mtim.tv_nsec = src->st_mtimespec.tv_nsec;
 +  dst->st_ctim.tv_sec = src->st_ctimespec.tv_sec;
 +  dst->st_ctim.tv_nsec = src->st_ctimespec.tv_nsec;
 +  dst->st_birthtim.tv_sec = src->st_birthtimespec.tv_sec;
 +  dst->st_birthtim.tv_nsec = src->st_birthtimespec.tv_nsec;
 +  dst->st_flags = src->st_flags;
 +  dst->st_gen = src->st_gen;
 +#elif defined(__ANDROID__)
 +  dst->st_atim.tv_sec = src->st_atime;
 +  dst->st_atim.tv_nsec = src->st_atimensec;
 +  dst->st_mtim.tv_sec = src->st_mtime;
 +  dst->st_mtim.tv_nsec = src->st_mtimensec;
 +  dst->st_ctim.tv_sec = src->st_ctime;
 +  dst->st_ctim.tv_nsec = src->st_ctimensec;
 +  dst->st_birthtim.tv_sec = src->st_ctime;
 +  dst->st_birthtim.tv_nsec = src->st_ctimensec;
 +  dst->st_flags = 0;
 +  dst->st_gen = 0;
 +#elif !defined(_AIX) && (       \
 +    defined(__DragonFly__)   || \
 +    defined(__FreeBSD__)     || \
 +    defined(__OpenBSD__)     || \
 +    defined(__NetBSD__)      || \
 +    defined(_GNU_SOURCE)     || \
 +    defined(_BSD_SOURCE)     || \
 +    defined(_SVID_SOURCE)    || \
 +    defined(_XOPEN_SOURCE)   || \
 +    defined(_DEFAULT_SOURCE))
 +  dst->st_atim.tv_sec = src->st_atim.tv_sec;
 +  dst->st_atim.tv_nsec = src->st_atim.tv_nsec;
 +  dst->st_mtim.tv_sec = src->st_mtim.tv_sec;
 +  dst->st_mtim.tv_nsec = src->st_mtim.tv_nsec;
 +  dst->st_ctim.tv_sec = src->st_ctim.tv_sec;
 +  dst->st_ctim.tv_nsec = src->st_ctim.tv_nsec;
 +# if defined(__FreeBSD__)    || \
 +     defined(__NetBSD__)
 +  dst->st_birthtim.tv_sec = src->st_birthtim.tv_sec;
 +  dst->st_birthtim.tv_nsec = src->st_birthtim.tv_nsec;
 +  dst->st_flags = src->st_flags;
 +  dst->st_gen = src->st_gen;
 +# else
 +  dst->st_birthtim.tv_sec = src->st_ctim.tv_sec;
 +  dst->st_birthtim.tv_nsec = src->st_ctim.tv_nsec;
 +  dst->st_flags = 0;
 +  dst->st_gen = 0;
 +# endif
 +#else
 +  dst->st_atim.tv_sec = src->st_atime;
 +  dst->st_atim.tv_nsec = 0;
 +  dst->st_mtim.tv_sec = src->st_mtime;
 +  dst->st_mtim.tv_nsec = 0;
 +  dst->st_ctim.tv_sec = src->st_ctime;
 +  dst->st_ctim.tv_nsec = 0;
 +  dst->st_birthtim.tv_sec = src->st_ctime;
 +  dst->st_birthtim.tv_nsec = 0;
 +  dst->st_flags = 0;
 +  dst->st_gen = 0;
 +#endif
 +}
 +
 +
 +static int uv__fs_stat(const char *path, uv_stat_t *buf) {
 +  struct stat pbuf;
 +  int ret;
 +
 +  ret = stat(path, &pbuf);
 +  if (ret == 0)
 +    uv__to_stat(&pbuf, buf);
 +
 +  return ret;
 +}
 +
 +
 +static int uv__fs_lstat(const char *path, uv_stat_t *buf) {
 +  struct stat pbuf;
 +  int ret;
 +
 +  ret = lstat(path, &pbuf);
 +  if (ret == 0)
 +    uv__to_stat(&pbuf, buf);
 +
 +  return ret;
 +}
 +
 +
 +static int uv__fs_fstat(int fd, uv_stat_t *buf) {
 +  struct stat pbuf;
 +  int ret;
 +
 +  ret = fstat(fd, &pbuf);
 +  if (ret == 0)
 +    uv__to_stat(&pbuf, buf);
 +
 +  return ret;
 +}
 +
 +
 +typedef ssize_t (*uv__fs_buf_iter_processor)(uv_fs_t* req);
 +static ssize_t uv__fs_buf_iter(uv_fs_t* req, uv__fs_buf_iter_processor process) {
 +  unsigned int iovmax;
 +  unsigned int nbufs;
 +  uv_buf_t* bufs;
 +  ssize_t total;
 +  ssize_t result;
 +
 +  iovmax = uv__getiovmax();
 +  nbufs = req->nbufs;
 +  bufs = req->bufs;
 +  total = 0;
 +
 +  while (nbufs > 0) {
 +    req->nbufs = nbufs;
 +    if (req->nbufs > iovmax)
 +      req->nbufs = iovmax;
 +
 +    result = process(req);
 +    if (result <= 0) {
 +      if (total == 0)
 +        total = result;
 +      break;
 +    }
 +
 +    if (req->off >= 0)
 +      req->off += result;
 +
 +    req->bufs += req->nbufs;
 +    nbufs -= req->nbufs;
 +    total += result;
 +  }
 +
 +  if (errno == EINTR && total == -1)
 +    return total;
 +
 +  if (bufs != req->bufsml)
 +    uv__free(bufs);
 +
 +  req->bufs = NULL;
 +  req->nbufs = 0;
 +
 +  return total;
 +}
 +
 +
 +static void uv__fs_work(struct uv__work* w) {
 +  int retry_on_eintr;
 +  uv_fs_t* req;
 +  ssize_t r;
 +
 +  req = container_of(w, uv_fs_t, work_req);
 +  retry_on_eintr = !(req->fs_type == UV_FS_CLOSE);
 +
 +  do {
 +    errno = 0;
 +
 +#define X(type, action)                                                       \
 +  case UV_FS_ ## type:                                                        \
 +    r = action;                                                               \
 +    break;
 +
 +    switch (req->fs_type) {
 +    X(ACCESS, access(req->path, req->flags));
 +    X(CHMOD, chmod(req->path, req->mode));
 +    X(CHOWN, chown(req->path, req->uid, req->gid));
 +    X(CLOSE, close(req->file));
++    X(COPYFILE, uv__fs_copyfile(req));
 +    X(FCHMOD, fchmod(req->file, req->mode));
 +    X(FCHOWN, fchown(req->file, req->uid, req->gid));
 +    X(FDATASYNC, uv__fs_fdatasync(req));
 +    X(FSTAT, uv__fs_fstat(req->file, &req->statbuf));
 +    X(FSYNC, uv__fs_fsync(req));
 +    X(FTRUNCATE, ftruncate(req->file, req->off));
 +    X(FUTIME, uv__fs_futime(req));
 +    X(LSTAT, uv__fs_lstat(req->path, &req->statbuf));
 +    X(LINK, link(req->path, req->new_path));
 +    X(MKDIR, mkdir(req->path, req->mode));
 +    X(MKDTEMP, uv__fs_mkdtemp(req));
 +    X(OPEN, uv__fs_open(req));
 +    X(READ, uv__fs_buf_iter(req, uv__fs_read));
 +    X(SCANDIR, uv__fs_scandir(req));
 +    X(READLINK, uv__fs_readlink(req));
 +    X(REALPATH, uv__fs_realpath(req));
 +    X(RENAME, rename(req->path, req->new_path));
 +    X(RMDIR, rmdir(req->path));
 +    X(SENDFILE, uv__fs_sendfile(req));
 +    X(STAT, uv__fs_stat(req->path, &req->statbuf));
 +    X(SYMLINK, symlink(req->path, req->new_path));
 +    X(UNLINK, unlink(req->path));
 +    X(UTIME, uv__fs_utime(req));
 +    X(WRITE, uv__fs_buf_iter(req, uv__fs_write));
 +    default: abort();
 +    }
 +#undef X
 +  } while (r == -1 && errno == EINTR && retry_on_eintr);
 +
 +  if (r == -1)
 +    req->result = -errno;
 +  else
 +    req->result = r;
 +
 +  if (r == 0 && (req->fs_type == UV_FS_STAT ||
 +                 req->fs_type == UV_FS_FSTAT ||
 +                 req->fs_type == UV_FS_LSTAT)) {
 +    req->ptr = &req->statbuf;
 +  }
 +}
 +
 +
 +static void uv__fs_done(struct uv__work* w, int status) {
 +  uv_fs_t* req;
 +
 +  req = container_of(w, uv_fs_t, work_req);
 +  uv__req_unregister(req->loop, req);
 +
 +  if (status == -ECANCELED) {
 +    assert(req->result == 0);
 +    req->result = -ECANCELED;
 +  }
 +
 +  req->cb(req);
 +}
 +
 +
 +int uv_fs_access(uv_loop_t* loop,
 +                 uv_fs_t* req,
 +                 const char* path,
 +                 int flags,
 +                 uv_fs_cb cb) {
 +  INIT(ACCESS);
 +  PATH;
 +  req->flags = flags;
 +  POST;
 +}
 +
 +
 +int uv_fs_chmod(uv_loop_t* loop,
 +                uv_fs_t* req,
 +                const char* path,
 +                int mode,
 +                uv_fs_cb cb) {
 +  INIT(CHMOD);
 +  PATH;
 +  req->mode = mode;
 +  POST;
 +}
 +
 +
 +int uv_fs_chown(uv_loop_t* loop,
 +                uv_fs_t* req,
 +                const char* path,
 +                uv_uid_t uid,
 +                uv_gid_t gid,
 +                uv_fs_cb cb) {
 +  INIT(CHOWN);
 +  PATH;
 +  req->uid = uid;
 +  req->gid = gid;
 +  POST;
 +}
 +
 +
 +int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
 +  INIT(CLOSE);
 +  req->file = file;
 +  POST;
 +}
 +
 +
 +int uv_fs_fchmod(uv_loop_t* loop,
 +                 uv_fs_t* req,
 +                 uv_file file,
 +                 int mode,
 +                 uv_fs_cb cb) {
 +  INIT(FCHMOD);
 +  req->file = file;
 +  req->mode = mode;
 +  POST;
 +}
 +
 +
 +int uv_fs_fchown(uv_loop_t* loop,
 +                 uv_fs_t* req,
 +                 uv_file file,
 +                 uv_uid_t uid,
 +                 uv_gid_t gid,
 +                 uv_fs_cb cb) {
 +  INIT(FCHOWN);
 +  req->file = file;
 +  req->uid = uid;
 +  req->gid = gid;
 +  POST;
 +}
 +
 +
 +int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
 +  INIT(FDATASYNC);
 +  req->file = file;
 +  POST;
 +}
 +
 +
 +int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
 +  INIT(FSTAT);
 +  req->file = file;
 +  POST;
 +}
 +
 +
 +int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
 +  INIT(FSYNC);
 +  req->file = file;
 +  POST;
 +}
 +
 +
 +int uv_fs_ftruncate(uv_loop_t* loop,
 +                    uv_fs_t* req,
 +                    uv_file file,
 +                    int64_t off,
 +                    uv_fs_cb cb) {
 +  INIT(FTRUNCATE);
 +  req->file = file;
 +  req->off = off;
 +  POST;
 +}
 +
 +
 +int uv_fs_futime(uv_loop_t* loop,
 +                 uv_fs_t* req,
 +                 uv_file file,
 +                 double atime,
 +                 double mtime,
 +                 uv_fs_cb cb) {
 +  INIT(FUTIME);
 +  req->file = file;
 +  req->atime = atime;
 +  req->mtime = mtime;
 +  POST;
 +}
 +
 +
 +int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
 +  INIT(LSTAT);
 +  PATH;
 +  POST;
 +}
 +
 +
 +int uv_fs_link(uv_loop_t* loop,
 +               uv_fs_t* req,
 +               const char* path,
 +               const char* new_path,
 +               uv_fs_cb cb) {
 +  INIT(LINK);
 +  PATH2;
 +  POST;
 +}
 +
 +
 +int uv_fs_mkdir(uv_loop_t* loop,
 +                uv_fs_t* req,
 +                const char* path,
 +                int mode,
 +                uv_fs_cb cb) {
 +  INIT(MKDIR);
 +  PATH;
 +  req->mode = mode;
 +  POST;
 +}
 +
 +
 +int uv_fs_mkdtemp(uv_loop_t* loop,
 +                  uv_fs_t* req,
 +                  const char* tpl,
 +                  uv_fs_cb cb) {
 +  INIT(MKDTEMP);
 +  req->path = uv__strdup(tpl);
 +  if (req->path == NULL) {
 +    if (cb != NULL)
 +      uv__req_unregister(loop, req);
 +    return -ENOMEM;
 +  }
 +  POST;
 +}
 +
 +
 +int uv_fs_open(uv_loop_t* loop,
 +               uv_fs_t* req,
 +               const char* path,
 +               int flags,
 +               int mode,
 +               uv_fs_cb cb) {
 +  INIT(OPEN);
 +  PATH;
 +  req->flags = flags;
 +  req->mode = mode;
 +  POST;
 +}
 +
 +
 +int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
 +               uv_file file,
 +               const uv_buf_t bufs[],
 +               unsigned int nbufs,
 +               int64_t off,
 +               uv_fs_cb cb) {
++  INIT(READ);
++
 +  if (bufs == NULL || nbufs == 0)
 +    return -EINVAL;
 +
-   INIT(READ);
 +  req->file = file;
 +
 +  req->nbufs = nbufs;
 +  req->bufs = req->bufsml;
 +  if (nbufs > ARRAY_SIZE(req->bufsml))
 +    req->bufs = uv__malloc(nbufs * sizeof(*bufs));
 +
 +  if (req->bufs == NULL) {
 +    if (cb != NULL)
 +      uv__req_unregister(loop, req);
 +    return -ENOMEM;
 +  }
 +
 +  memcpy(req->bufs, bufs, nbufs * sizeof(*bufs));
 +
 +  req->off = off;
 +  POST;
 +}
 +
 +
 +int uv_fs_scandir(uv_loop_t* loop,
 +                  uv_fs_t* req,
 +                  const char* path,
 +                  int flags,
 +                  uv_fs_cb cb) {
 +  INIT(SCANDIR);
 +  PATH;
 +  req->flags = flags;
 +  POST;
 +}
 +
 +
 +int uv_fs_readlink(uv_loop_t* loop,
 +                   uv_fs_t* req,
 +                   const char* path,
 +                   uv_fs_cb cb) {
 +  INIT(READLINK);
 +  PATH;
 +  POST;
 +}
 +
 +
 +int uv_fs_realpath(uv_loop_t* loop,
 +                  uv_fs_t* req,
 +                  const char * path,
 +                  uv_fs_cb cb) {
 +  INIT(REALPATH);
 +  PATH;
 +  POST;
 +}
 +
 +
 +int uv_fs_rename(uv_loop_t* loop,
 +                 uv_fs_t* req,
 +                 const char* path,
 +                 const char* new_path,
 +                 uv_fs_cb cb) {
 +  INIT(RENAME);
 +  PATH2;
 +  POST;
 +}
 +
 +
 +int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
 +  INIT(RMDIR);
 +  PATH;
 +  POST;
 +}
 +
 +
 +int uv_fs_sendfile(uv_loop_t* loop,
 +                   uv_fs_t* req,
 +                   uv_file out_fd,
 +                   uv_file in_fd,
 +                   int64_t off,
 +                   size_t len,
 +                   uv_fs_cb cb) {
 +  INIT(SENDFILE);
 +  req->flags = in_fd; /* hack */
 +  req->file = out_fd;
 +  req->off = off;
 +  req->bufsml[0].len = len;
 +  POST;
 +}
 +
 +
 +int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
 +  INIT(STAT);
 +  PATH;
 +  POST;
 +}
 +
 +
 +int uv_fs_symlink(uv_loop_t* loop,
 +                  uv_fs_t* req,
 +                  const char* path,
 +                  const char* new_path,
 +                  int flags,
 +                  uv_fs_cb cb) {
 +  INIT(SYMLINK);
 +  PATH2;
 +  req->flags = flags;
 +  POST;
 +}
 +
 +
 +int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
 +  INIT(UNLINK);
 +  PATH;
 +  POST;
 +}
 +
 +
 +int uv_fs_utime(uv_loop_t* loop,
 +                uv_fs_t* req,
 +                const char* path,
 +                double atime,
 +                double mtime,
 +                uv_fs_cb cb) {
 +  INIT(UTIME);
 +  PATH;
 +  req->atime = atime;
 +  req->mtime = mtime;
 +  POST;
 +}
 +
 +
 +int uv_fs_write(uv_loop_t* loop,
 +                uv_fs_t* req,
 +                uv_file file,
 +                const uv_buf_t bufs[],
 +                unsigned int nbufs,
 +                int64_t off,
 +                uv_fs_cb cb) {
++  INIT(WRITE);
++
 +  if (bufs == NULL || nbufs == 0)
 +    return -EINVAL;
 +
-   INIT(WRITE);
 +  req->file = file;
 +
 +  req->nbufs = nbufs;
 +  req->bufs = req->bufsml;
 +  if (nbufs > ARRAY_SIZE(req->bufsml))
 +    req->bufs = uv__malloc(nbufs * sizeof(*bufs));
 +
 +  if (req->bufs == NULL) {
 +    if (cb != NULL)
 +      uv__req_unregister(loop, req);
 +    return -ENOMEM;
 +  }
 +
 +  memcpy(req->bufs, bufs, nbufs * sizeof(*bufs));
 +
 +  req->off = off;
 +  POST;
 +}
 +
 +
 +void uv_fs_req_cleanup(uv_fs_t* req) {
++  if (req == NULL)
++    return;
++
 +  /* Only necessary for asychronous requests, i.e., requests with a callback.
 +   * Synchronous ones don't copy their arguments and have req->path and
 +   * req->new_path pointing to user-owned memory.  UV_FS_MKDTEMP is the
 +   * exception to the rule, it always allocates memory.
 +   */
 +  if (req->path != NULL && (req->cb != NULL || req->fs_type == UV_FS_MKDTEMP))
 +    uv__free((void*) req->path);  /* Memory is shared with req->new_path. */
 +
 +  req->path = NULL;
 +  req->new_path = NULL;
 +
 +  if (req->fs_type == UV_FS_SCANDIR && req->ptr != NULL)
 +    uv__fs_scandir_cleanup(req);
 +
 +  if (req->ptr != &req->statbuf)
 +    uv__free(req->ptr);
 +  req->ptr = NULL;
 +}
++
++
++int uv_fs_copyfile(uv_loop_t* loop,
++                   uv_fs_t* req,
++                   const char* path,
++                   const char* new_path,
++                   int flags,
++                   uv_fs_cb cb) {
++  INIT(COPYFILE);
++
++  if (flags & ~UV_FS_COPYFILE_EXCL)
++    return -EINVAL;
++
++  PATH2;
++  req->flags = flags;
++  POST;
++}
diff --cc Utilities/cmlibuv/src/unix/ibmi.c
index 0000000,c19e2fc..c19e2fc
mode 000000,100644..100644
--- a/Utilities/cmlibuv/src/unix/ibmi.c
+++ b/Utilities/cmlibuv/src/unix/ibmi.c
diff --cc Utilities/cmlibuv/src/unix/internal.h
index e9f7908,0000000..9cc87f0
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/unix/internal.h
+++ b/Utilities/cmlibuv/src/unix/internal.h
@@@ -1,336 -1,0 +1,349 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#ifndef UV_UNIX_INTERNAL_H_
 +#define UV_UNIX_INTERNAL_H_
 +
 +#include "uv-common.h"
 +
 +#include <assert.h>
 +#include <stdlib.h> /* abort */
 +#include <string.h> /* strrchr */
 +#include <fcntl.h>  /* O_CLOEXEC, may be */
 +#include <stdio.h>
 +
 +#if defined(__STRICT_ANSI__)
 +# define inline __inline
 +#endif
 +
 +#if defined(__linux__)
 +# include "linux-syscalls.h"
 +#endif /* __linux__ */
 +
 +#if defined(__MVS__)
 +# include "os390-syscalls.h"
 +#endif /* __MVS__ */
 +
 +#if defined(__sun)
 +# include <sys/port.h>
 +# include <port.h>
 +#endif /* __sun */
 +
 +#if defined(_AIX)
 +# define reqevents events
 +# define rtnevents revents
 +# include <sys/poll.h>
 +#else
 +# include <poll.h>
 +#endif /* _AIX */
 +
 +#if defined(__APPLE__) && !TARGET_OS_IPHONE
 +# include <AvailabilityMacros.h>
 +#endif
 +
 +#if defined(CMAKE_BOOTSTRAP)
 +# undef pthread_atfork
 +# define pthread_atfork(prepare, parent, child) \
 +     uv__pthread_atfork(prepare, parent, child)
 +int uv__pthread_atfork(void (*prepare)(void), void (*parent)(void),
 +                       void (*child)(void));
 +# undef pthread_sigmask
 +# define pthread_sigmask(how, set, oldset) \
 +     uv__pthread_sigmask(how, set, oldset)
 +int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset);
 +#elif defined(__ANDROID__)
 +int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset);
 +# ifdef pthread_sigmask
 +# undef pthread_sigmask
 +# endif
 +# define pthread_sigmask(how, set, oldset) uv__pthread_sigmask(how, set, oldset)
 +#endif
 +
 +#define ACCESS_ONCE(type, var)                                                \
 +  (*(volatile type*) &(var))
 +
 +#define ROUND_UP(a, b)                                                        \
 +  ((a) % (b) ? ((a) + (b)) - ((a) % (b)) : (a))
 +
 +#define UNREACHABLE()                                                         \
 +  do {                                                                        \
 +    assert(0 && "unreachable code");                                          \
 +    abort();                                                                  \
 +  }                                                                           \
 +  while (0)
 +
 +#define SAVE_ERRNO(block)                                                     \
 +  do {                                                                        \
 +    int _saved_errno = errno;                                                 \
 +    do { block; } while (0);                                                  \
 +    errno = _saved_errno;                                                     \
 +  }                                                                           \
 +  while (0)
 +
 +/* The __clang__ and __INTEL_COMPILER checks are superfluous because they
 + * define __GNUC__. They are here to convey to you, dear reader, that these
 + * macros are enabled when compiling with clang or icc.
 + */
 +#if defined(__clang__) ||                                                     \
 +    defined(__GNUC__) ||                                                      \
 +    defined(__INTEL_COMPILER) ||                                              \
 +    defined(__SUNPRO_C)
 +# define UV_DESTRUCTOR(declaration) __attribute__((destructor)) declaration
 +# define UV_UNUSED(declaration)     __attribute__((unused)) declaration
 +#else
 +# define UV_DESTRUCTOR(declaration) declaration
 +# define UV_UNUSED(declaration)     declaration
 +#endif
 +
 +/* Leans on the fact that, on Linux, POLLRDHUP == EPOLLRDHUP. */
 +#ifdef POLLRDHUP
 +# define UV__POLLRDHUP POLLRDHUP
 +#else
 +# define UV__POLLRDHUP 0x2000
 +#endif
 +
++#ifdef POLLPRI
++# define UV__POLLPRI POLLPRI
++#else
++# define UV__POLLPRI 0
++#endif
++
 +#if !defined(O_CLOEXEC) && defined(__FreeBSD__)
 +/*
 + * It may be that we are just missing `__POSIX_VISIBLE >= 200809`.
 + * Try using fixed value const and give up, if it doesn't work
 + */
 +# define O_CLOEXEC 0x00100000
 +#endif
 +
 +typedef struct uv__stream_queued_fds_s uv__stream_queued_fds_t;
 +
 +/* handle flags */
 +enum {
 +  UV_CLOSING              = 0x01,   /* uv_close() called but not finished. */
 +  UV_CLOSED               = 0x02,   /* close(2) finished. */
 +  UV_STREAM_READING       = 0x04,   /* uv_read_start() called. */
 +  UV_STREAM_SHUTTING      = 0x08,   /* uv_shutdown() called but not complete. */
 +  UV_STREAM_SHUT          = 0x10,   /* Write side closed. */
 +  UV_STREAM_READABLE      = 0x20,   /* The stream is readable */
 +  UV_STREAM_WRITABLE      = 0x40,   /* The stream is writable */
 +  UV_STREAM_BLOCKING      = 0x80,   /* Synchronous writes. */
 +  UV_STREAM_READ_PARTIAL  = 0x100,  /* read(2) read less than requested. */
 +  UV_STREAM_READ_EOF      = 0x200,  /* read(2) read EOF. */
 +  UV_TCP_NODELAY          = 0x400,  /* Disable Nagle. */
 +  UV_TCP_KEEPALIVE        = 0x800,  /* Turn on keep-alive. */
 +  UV_TCP_SINGLE_ACCEPT    = 0x1000, /* Only accept() when idle. */
 +  UV_HANDLE_IPV6          = 0x10000, /* Handle is bound to a IPv6 socket. */
 +  UV_UDP_PROCESSING       = 0x20000, /* Handle is running the send callback queue. */
 +  UV_HANDLE_BOUND         = 0x40000  /* Handle is bound to an address and port */
 +};
 +
 +/* loop flags */
 +enum {
 +  UV_LOOP_BLOCK_SIGPROF = 1
 +};
 +
++/* flags of excluding ifaddr */
++enum {
++  UV__EXCLUDE_IFPHYS,
++  UV__EXCLUDE_IFADDR
++};
++
 +typedef enum {
 +  UV_CLOCK_PRECISE = 0,  /* Use the highest resolution clock available. */
 +  UV_CLOCK_FAST = 1      /* Use the fastest clock with <= 1ms granularity. */
 +} uv_clocktype_t;
 +
 +struct uv__stream_queued_fds_s {
 +  unsigned int size;
 +  unsigned int offset;
 +  int fds[1];
 +};
 +
 +
 +#if defined(_AIX) || \
 +    defined(__APPLE__) || \
 +    defined(__DragonFly__) || \
 +    defined(__FreeBSD__) || \
 +    defined(__FreeBSD_kernel__) || \
 +    defined(__linux__) || \
-     defined(__OpenBSD__)
++    defined(__OpenBSD__) || \
++    defined(__NetBSD__)
 +#define uv__cloexec uv__cloexec_ioctl
 +#define uv__nonblock uv__nonblock_ioctl
 +#else
 +#define uv__cloexec uv__cloexec_fcntl
 +#define uv__nonblock uv__nonblock_fcntl
 +#endif
 +
 +/* core */
 +int uv__cloexec_ioctl(int fd, int set);
 +int uv__cloexec_fcntl(int fd, int set);
 +int uv__nonblock_ioctl(int fd, int set);
 +int uv__nonblock_fcntl(int fd, int set);
 +int uv__close(int fd);
 +int uv__close_nocheckstdio(int fd);
 +int uv__socket(int domain, int type, int protocol);
 +int uv__dup(int fd);
 +ssize_t uv__recvmsg(int fd, struct msghdr *msg, int flags);
 +void uv__make_close_pending(uv_handle_t* handle);
 +int uv__getiovmax(void);
 +
 +void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd);
 +void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events);
 +void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events);
 +void uv__io_close(uv_loop_t* loop, uv__io_t* w);
 +void uv__io_feed(uv_loop_t* loop, uv__io_t* w);
 +int uv__io_active(const uv__io_t* w, unsigned int events);
 +int uv__io_check_fd(uv_loop_t* loop, int fd);
 +void uv__io_poll(uv_loop_t* loop, int timeout); /* in milliseconds or -1 */
 +int uv__io_fork(uv_loop_t* loop);
 +
 +/* async */
 +void uv__async_stop(uv_loop_t* loop);
 +int uv__async_fork(uv_loop_t* loop);
 +
 +
 +/* loop */
 +void uv__run_idle(uv_loop_t* loop);
 +void uv__run_check(uv_loop_t* loop);
 +void uv__run_prepare(uv_loop_t* loop);
 +
 +/* stream */
 +void uv__stream_init(uv_loop_t* loop, uv_stream_t* stream,
 +    uv_handle_type type);
 +int uv__stream_open(uv_stream_t*, int fd, int flags);
 +void uv__stream_destroy(uv_stream_t* stream);
 +#if defined(__APPLE__)
 +int uv__stream_try_select(uv_stream_t* stream, int* fd);
 +#endif /* defined(__APPLE__) */
 +void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events);
 +int uv__accept(int sockfd);
 +int uv__dup2_cloexec(int oldfd, int newfd);
 +int uv__open_cloexec(const char* path, int flags);
 +
 +/* tcp */
 +int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb);
 +int uv__tcp_nodelay(int fd, int on);
 +int uv__tcp_keepalive(int fd, int on, unsigned int delay);
 +
 +/* pipe */
 +int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb);
 +
 +/* timer */
 +void uv__run_timers(uv_loop_t* loop);
 +int uv__next_timeout(const uv_loop_t* loop);
 +
 +/* signal */
 +void uv__signal_close(uv_signal_t* handle);
 +void uv__signal_global_once_init(void);
 +void uv__signal_loop_cleanup(uv_loop_t* loop);
 +int uv__signal_loop_fork(uv_loop_t* loop);
 +
 +/* platform specific */
 +uint64_t uv__hrtime(uv_clocktype_t type);
 +int uv__kqueue_init(uv_loop_t* loop);
 +int uv__platform_loop_init(uv_loop_t* loop);
 +void uv__platform_loop_delete(uv_loop_t* loop);
 +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd);
 +
 +/* various */
 +void uv__async_close(uv_async_t* handle);
 +void uv__check_close(uv_check_t* handle);
 +void uv__fs_event_close(uv_fs_event_t* handle);
 +void uv__idle_close(uv_idle_t* handle);
 +void uv__pipe_close(uv_pipe_t* handle);
 +void uv__poll_close(uv_poll_t* handle);
 +void uv__prepare_close(uv_prepare_t* handle);
 +void uv__process_close(uv_process_t* handle);
 +void uv__stream_close(uv_stream_t* handle);
 +void uv__tcp_close(uv_tcp_t* handle);
 +void uv__timer_close(uv_timer_t* handle);
 +void uv__udp_close(uv_udp_t* handle);
 +void uv__udp_finish_close(uv_udp_t* handle);
 +uv_handle_type uv__handle_type(int fd);
 +FILE* uv__open_file(const char* path);
 +int uv__getpwuid_r(uv_passwd_t* pwd);
 +
 +
 +#if defined(__APPLE__) && !defined(CMAKE_BOOTSTRAP)
 +int uv___stream_fd(const uv_stream_t* handle);
 +#define uv__stream_fd(handle) (uv___stream_fd((const uv_stream_t*) (handle)))
 +#else
 +#define uv__stream_fd(handle) ((handle)->io_watcher.fd)
 +#endif /* defined(__APPLE__) */
 +
 +#ifdef UV__O_NONBLOCK
 +# define UV__F_NONBLOCK UV__O_NONBLOCK
 +#else
 +# define UV__F_NONBLOCK 1
 +#endif
 +
 +int uv__make_socketpair(int fds[2], int flags);
 +int uv__make_pipe(int fds[2], int flags);
 +
 +#if defined(__APPLE__)
 +
 +int uv__fsevents_init(uv_fs_event_t* handle);
 +int uv__fsevents_close(uv_fs_event_t* handle);
 +void uv__fsevents_loop_delete(uv_loop_t* loop);
 +
 +/* OSX < 10.7 has no file events, polyfill them */
 +#ifndef MAC_OS_X_VERSION_10_7
 +
 +static const int kFSEventStreamCreateFlagFileEvents = 0x00000010;
 +static const int kFSEventStreamEventFlagItemCreated = 0x00000100;
 +static const int kFSEventStreamEventFlagItemRemoved = 0x00000200;
 +static const int kFSEventStreamEventFlagItemInodeMetaMod = 0x00000400;
 +static const int kFSEventStreamEventFlagItemRenamed = 0x00000800;
 +static const int kFSEventStreamEventFlagItemModified = 0x00001000;
 +static const int kFSEventStreamEventFlagItemFinderInfoMod = 0x00002000;
 +static const int kFSEventStreamEventFlagItemChangeOwner = 0x00004000;
 +static const int kFSEventStreamEventFlagItemXattrMod = 0x00008000;
 +static const int kFSEventStreamEventFlagItemIsFile = 0x00010000;
 +static const int kFSEventStreamEventFlagItemIsDir = 0x00020000;
 +static const int kFSEventStreamEventFlagItemIsSymlink = 0x00040000;
 +
 +#endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070 */
 +
 +#endif /* defined(__APPLE__) */
 +
 +UV_UNUSED(static void uv__update_time(uv_loop_t* loop)) {
 +  /* Use a fast time source if available.  We only need millisecond precision.
 +   */
 +  loop->time = uv__hrtime(UV_CLOCK_FAST) / 1000000;
 +}
 +
 +UV_UNUSED(static char* uv__basename_r(const char* path)) {
 +  char* s;
 +
 +  s = strrchr(path, '/');
 +  if (s == NULL)
 +    return (char*) path;
 +
 +  return s + 1;
 +}
 +
 +#if defined(__linux__)
 +int uv__inotify_fork(uv_loop_t* loop, void* old_watchers);
 +#endif
 +
 +#endif /* UV_UNIX_INTERNAL_H_ */
diff --cc Utilities/cmlibuv/src/unix/pipe.c
index e3d436d,0000000..df3aad0
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/unix/pipe.c
+++ b/Utilities/cmlibuv/src/unix/pipe.c
@@@ -1,302 -1,0 +1,355 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#include "uv.h"
 +#include "internal.h"
 +
 +#include <assert.h>
 +#include <errno.h>
 +#include <string.h>
 +#include <sys/un.h>
 +#include <unistd.h>
 +#include <stdlib.h>
 +
 +
 +int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) {
 +  uv__stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE);
 +  handle->shutdown_req = NULL;
 +  handle->connect_req = NULL;
 +  handle->pipe_fname = NULL;
 +  handle->ipc = ipc;
 +  return 0;
 +}
 +
 +
 +int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
 +  struct sockaddr_un saddr;
 +  const char* pipe_fname = NULL;
 +  int sockfd = -1;
 +  int err;
 +
 +  /* Already bound? */
 +  if (uv__stream_fd(handle) >= 0)
 +    return -EINVAL;
 +
 +  /* Make a copy of the file name, it outlives this function's scope. */
 +  pipe_fname = uv__strdup(name);
 +  if (pipe_fname == NULL)
 +    return -ENOMEM;
 +
 +  /* We've got a copy, don't touch the original any more. */
 +  name = NULL;
 +
 +  err = uv__socket(AF_UNIX, SOCK_STREAM, 0);
 +  if (err < 0)
 +    goto err_socket;
 +  sockfd = err;
 +
 +  memset(&saddr, 0, sizeof saddr);
 +  strncpy(saddr.sun_path, pipe_fname, sizeof(saddr.sun_path) - 1);
 +  saddr.sun_path[sizeof(saddr.sun_path) - 1] = '\0';
 +  saddr.sun_family = AF_UNIX;
 +
 +  if (bind(sockfd, (struct sockaddr*)&saddr, sizeof saddr)) {
 +    err = -errno;
 +    /* Convert ENOENT to EACCES for compatibility with Windows. */
 +    if (err == -ENOENT)
 +      err = -EACCES;
 +
 +    uv__close(sockfd);
 +    goto err_socket;
 +  }
 +
 +  /* Success. */
 +  handle->flags |= UV_HANDLE_BOUND;
 +  handle->pipe_fname = pipe_fname; /* Is a strdup'ed copy. */
 +  handle->io_watcher.fd = sockfd;
 +  return 0;
 +
 +err_socket:
 +  uv__free((void*)pipe_fname);
 +  return err;
 +}
 +
 +
 +int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
 +  if (uv__stream_fd(handle) == -1)
 +    return -EINVAL;
 +
 +#if defined(__MVS__)
 +  /* On zOS, backlog=0 has undefined behaviour */
 +  if (backlog == 0)
 +    backlog = 1;
 +  else if (backlog < 0)
 +    backlog = SOMAXCONN;
 +#endif
 +
 +  if (listen(uv__stream_fd(handle), backlog))
 +    return -errno;
 +
 +  handle->connection_cb = cb;
 +  handle->io_watcher.cb = uv__server_io;
 +  uv__io_start(handle->loop, &handle->io_watcher, POLLIN);
 +  return 0;
 +}
 +
 +
 +void uv__pipe_close(uv_pipe_t* handle) {
 +  if (handle->pipe_fname) {
 +    /*
 +     * Unlink the file system entity before closing the file descriptor.
 +     * Doing it the other way around introduces a race where our process
 +     * unlinks a socket with the same name that's just been created by
 +     * another thread or process.
 +     */
 +    unlink(handle->pipe_fname);
 +    uv__free((void*)handle->pipe_fname);
 +    handle->pipe_fname = NULL;
 +  }
 +
 +  uv__stream_close((uv_stream_t*)handle);
 +}
 +
 +
 +int uv_pipe_open(uv_pipe_t* handle, uv_file fd) {
 +  int err;
 +
 +  err = uv__nonblock(fd, 1);
 +  if (err)
 +    return err;
 +
 +#if defined(__APPLE__) && !defined(CMAKE_BOOTSTRAP)
 +  err = uv__stream_try_select((uv_stream_t*) handle, &fd);
 +  if (err)
 +    return err;
 +#endif /* defined(__APPLE__) */
 +
 +  return uv__stream_open((uv_stream_t*)handle,
 +                         fd,
 +                         UV_STREAM_READABLE | UV_STREAM_WRITABLE);
 +}
 +
 +
 +void uv_pipe_connect(uv_connect_t* req,
 +                    uv_pipe_t* handle,
 +                    const char* name,
 +                    uv_connect_cb cb) {
 +  struct sockaddr_un saddr;
 +  int new_sock;
 +  int err;
 +  int r;
 +
 +  new_sock = (uv__stream_fd(handle) == -1);
 +
 +  if (new_sock) {
 +    err = uv__socket(AF_UNIX, SOCK_STREAM, 0);
 +    if (err < 0)
 +      goto out;
 +    handle->io_watcher.fd = err;
 +  }
 +
 +  memset(&saddr, 0, sizeof saddr);
 +  strncpy(saddr.sun_path, name, sizeof(saddr.sun_path) - 1);
 +  saddr.sun_path[sizeof(saddr.sun_path) - 1] = '\0';
 +  saddr.sun_family = AF_UNIX;
 +
 +  do {
 +    r = connect(uv__stream_fd(handle),
 +                (struct sockaddr*)&saddr, sizeof saddr);
 +  }
 +  while (r == -1 && errno == EINTR);
 +
 +  if (r == -1 && errno != EINPROGRESS) {
 +    err = -errno;
 +#if defined(__CYGWIN__) || defined(__MSYS__)
 +    /* EBADF is supposed to mean that the socket fd is bad, but
 +       Cygwin reports EBADF instead of ENOTSOCK when the file is
 +       not a socket.  We do not expect to see a bad fd here
 +       (e.g. due to new_sock), so translate the error.  */
 +    if (err == -EBADF)
 +      err = -ENOTSOCK;
 +#endif
 +    goto out;
 +  }
 +
 +  err = 0;
 +  if (new_sock) {
 +    err = uv__stream_open((uv_stream_t*)handle,
 +                          uv__stream_fd(handle),
 +                          UV_STREAM_READABLE | UV_STREAM_WRITABLE);
 +  }
 +
 +  if (err == 0)
 +    uv__io_start(handle->loop, &handle->io_watcher, POLLIN | POLLOUT);
 +
 +out:
 +  handle->delayed_error = err;
 +  handle->connect_req = req;
 +
 +  uv__req_init(handle->loop, req, UV_CONNECT);
 +  req->handle = (uv_stream_t*)handle;
 +  req->cb = cb;
 +  QUEUE_INIT(&req->queue);
 +
 +  /* Force callback to run on next tick in case of error. */
 +  if (err)
 +    uv__io_feed(handle->loop, &handle->io_watcher);
 +
 +}
 +
 +
 +typedef int (*uv__peersockfunc)(int, struct sockaddr*, socklen_t*);
 +
 +
 +static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
 +                                    uv__peersockfunc func,
 +                                    char* buffer,
 +                                    size_t* size) {
 +  struct sockaddr_un sa;
 +  socklen_t addrlen;
 +  int err;
 +
 +  addrlen = sizeof(sa);
 +  memset(&sa, 0, addrlen);
 +  err = func(uv__stream_fd(handle), (struct sockaddr*) &sa, &addrlen);
 +  if (err < 0) {
 +    *size = 0;
 +    return -errno;
 +  }
 +
 +#if defined(__linux__)
 +  if (sa.sun_path[0] == 0)
 +    /* Linux abstract namespace */
 +    addrlen -= offsetof(struct sockaddr_un, sun_path);
 +  else
 +#endif
 +    addrlen = strlen(sa.sun_path);
 +
 +
 +  if (addrlen >= *size) {
 +    *size = addrlen + 1;
 +    return UV_ENOBUFS;
 +  }
 +
 +  memcpy(buffer, sa.sun_path, addrlen);
 +  *size = addrlen;
 +
 +  /* only null-terminate if it's not an abstract socket */
 +  if (buffer[0] != '\0')
 +    buffer[addrlen] = '\0';
 +
 +  return 0;
 +}
 +
 +
 +int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) {
 +  return uv__pipe_getsockpeername(handle, getsockname, buffer, size);
 +}
 +
 +
 +int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) {
 +  return uv__pipe_getsockpeername(handle, getpeername, buffer, size);
 +}
 +
 +
 +void uv_pipe_pending_instances(uv_pipe_t* handle, int count) {
 +}
 +
 +
 +int uv_pipe_pending_count(uv_pipe_t* handle) {
 +  uv__stream_queued_fds_t* queued_fds;
 +
 +  if (!handle->ipc)
 +    return 0;
 +
 +  if (handle->accepted_fd == -1)
 +    return 0;
 +
 +  if (handle->queued_fds == NULL)
 +    return 1;
 +
 +  queued_fds = handle->queued_fds;
 +  return queued_fds->offset + 1;
 +}
 +
 +
 +uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) {
 +  if (!handle->ipc)
 +    return UV_UNKNOWN_HANDLE;
 +
 +  if (handle->accepted_fd == -1)
 +    return UV_UNKNOWN_HANDLE;
 +  else
 +    return uv__handle_type(handle->accepted_fd);
 +}
++
++
++int uv_pipe_chmod(uv_pipe_t* handle, int mode) {
++  unsigned desired_mode;
++  struct stat pipe_stat;
++  char* name_buffer;
++  size_t name_len;
++  int r;
++
++  if (handle == NULL || uv__stream_fd(handle) == -1)
++    return -EBADF;
++
++  if (mode != UV_READABLE &&
++      mode != UV_WRITABLE &&
++      mode != (UV_WRITABLE | UV_READABLE))
++    return -EINVAL;
++
++  if (fstat(uv__stream_fd(handle), &pipe_stat) == -1)
++    return -errno;
++
++  desired_mode = 0;
++  if (mode & UV_READABLE)
++    desired_mode |= S_IRUSR | S_IRGRP | S_IROTH;
++  if (mode & UV_WRITABLE)
++    desired_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
++
++  /* Exit early if pipe already has desired mode. */
++  if ((pipe_stat.st_mode & desired_mode) == desired_mode)
++    return 0;
++
++  pipe_stat.st_mode |= desired_mode;
++
++  /* Unfortunately fchmod does not work on all platforms, we will use chmod. */
++  name_len = 0;
++  r = uv_pipe_getsockname(handle, NULL, &name_len);
++  if (r != UV_ENOBUFS)
++    return r;
++
++  name_buffer = uv__malloc(name_len);
++  if (name_buffer == NULL)
++    return UV_ENOMEM;
++
++  r = uv_pipe_getsockname(handle, name_buffer, &name_len);
++  if (r != 0) {
++    uv__free(name_buffer);
++    return r;
++  }
++
++  r = chmod(name_buffer, pipe_stat.st_mode);
++  uv__free(name_buffer);
++
++  return r != -1 ? 0 : -errno;
++}
diff --cc Utilities/cmlibuv/src/unix/stream.c
index 3857bc8,0000000..931e5f1
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/unix/stream.c
+++ b/Utilities/cmlibuv/src/unix/stream.c
@@@ -1,1677 -1,0 +1,1690 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#include "uv.h"
 +#include "internal.h"
 +
 +#include <stdio.h>
 +#include <stdlib.h>
 +#include <string.h>
 +#include <assert.h>
 +#include <errno.h>
 +
 +#include <sys/types.h>
 +#include <sys/socket.h>
 +#include <sys/uio.h>
 +#include <sys/un.h>
 +#include <unistd.h>
 +#include <limits.h> /* IOV_MAX */
 +
 +#if defined(__APPLE__)
 +# include <sys/event.h>
 +# include <sys/time.h>
 +# include <sys/select.h>
 +
 +/* Forward declaration */
 +typedef struct uv__stream_select_s uv__stream_select_t;
 +
 +struct uv__stream_select_s {
 +  uv_stream_t* stream;
 +  uv_thread_t thread;
 +  uv_sem_t close_sem;
 +  uv_sem_t async_sem;
 +  uv_async_t async;
 +  int events;
 +  int fake_fd;
 +  int int_fd;
 +  int fd;
 +  fd_set* sread;
 +  size_t sread_sz;
 +  fd_set* swrite;
 +  size_t swrite_sz;
 +};
 +#endif /* defined(__APPLE__) */
 +
 +static void uv__stream_connect(uv_stream_t*);
 +static void uv__write(uv_stream_t* stream);
 +static void uv__read(uv_stream_t* stream);
 +static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events);
 +static void uv__write_callbacks(uv_stream_t* stream);
 +static size_t uv__write_req_size(uv_write_t* req);
 +
 +
 +void uv__stream_init(uv_loop_t* loop,
 +                     uv_stream_t* stream,
 +                     uv_handle_type type) {
 +  int err;
 +
 +  uv__handle_init(loop, (uv_handle_t*)stream, type);
 +  stream->read_cb = NULL;
 +  stream->alloc_cb = NULL;
 +  stream->close_cb = NULL;
 +  stream->connection_cb = NULL;
 +  stream->connect_req = NULL;
 +  stream->shutdown_req = NULL;
 +  stream->accepted_fd = -1;
 +  stream->queued_fds = NULL;
 +  stream->delayed_error = 0;
 +  QUEUE_INIT(&stream->write_queue);
 +  QUEUE_INIT(&stream->write_completed_queue);
 +  stream->write_queue_size = 0;
 +
 +  if (loop->emfile_fd == -1) {
 +    err = uv__open_cloexec("/dev/null", O_RDONLY);
 +    if (err < 0)
 +        /* In the rare case that "/dev/null" isn't mounted open "/"
 +         * instead.
 +         */
 +        err = uv__open_cloexec("/", O_RDONLY);
 +    if (err >= 0)
 +      loop->emfile_fd = err;
 +  }
 +
 +#if defined(__APPLE__) && !defined(CMAKE_BOOTSTRAP)
 +  stream->select = NULL;
 +#endif /* defined(__APPLE_) */
 +
 +  uv__io_init(&stream->io_watcher, uv__stream_io, -1);
 +}
 +
 +
 +static void uv__stream_osx_interrupt_select(uv_stream_t* stream) {
 +#if defined(__APPLE__) && !defined(CMAKE_BOOTSTRAP)
 +  /* Notify select() thread about state change */
 +  uv__stream_select_t* s;
 +  int r;
 +
 +  s = stream->select;
 +  if (s == NULL)
 +    return;
 +
 +  /* Interrupt select() loop
 +   * NOTE: fake_fd and int_fd are socketpair(), thus writing to one will
 +   * emit read event on other side
 +   */
 +  do
 +    r = write(s->fake_fd, "x", 1);
 +  while (r == -1 && errno == EINTR);
 +
 +  assert(r == 1);
 +#else  /* !defined(__APPLE__) */
 +  /* No-op on any other platform */
 +#endif  /* !defined(__APPLE__) */
 +}
 +
 +
 +#if defined(__APPLE__) && !defined(CMAKE_BOOTSTRAP)
 +static void uv__stream_osx_select(void* arg) {
 +  uv_stream_t* stream;
 +  uv__stream_select_t* s;
 +  char buf[1024];
 +  int events;
 +  int fd;
 +  int r;
 +  int max_fd;
 +
 +  stream = arg;
 +  s = stream->select;
 +  fd = s->fd;
 +
 +  if (fd > s->int_fd)
 +    max_fd = fd;
 +  else
 +    max_fd = s->int_fd;
 +
 +  while (1) {
 +    /* Terminate on semaphore */
 +    if (uv_sem_trywait(&s->close_sem) == 0)
 +      break;
 +
 +    /* Watch fd using select(2) */
 +    memset(s->sread, 0, s->sread_sz);
 +    memset(s->swrite, 0, s->swrite_sz);
 +
 +    if (uv__io_active(&stream->io_watcher, POLLIN))
 +      FD_SET(fd, s->sread);
 +    if (uv__io_active(&stream->io_watcher, POLLOUT))
 +      FD_SET(fd, s->swrite);
 +    FD_SET(s->int_fd, s->sread);
 +
 +    /* Wait indefinitely for fd events */
 +    r = select(max_fd + 1, s->sread, s->swrite, NULL, NULL);
 +    if (r == -1) {
 +      if (errno == EINTR)
 +        continue;
 +
 +      /* XXX: Possible?! */
 +      abort();
 +    }
 +
 +    /* Ignore timeouts */
 +    if (r == 0)
 +      continue;
 +
 +    /* Empty socketpair's buffer in case of interruption */
 +    if (FD_ISSET(s->int_fd, s->sread))
 +      while (1) {
 +        r = read(s->int_fd, buf, sizeof(buf));
 +
 +        if (r == sizeof(buf))
 +          continue;
 +
 +        if (r != -1)
 +          break;
 +
 +        if (errno == EAGAIN || errno == EWOULDBLOCK)
 +          break;
 +
 +        if (errno == EINTR)
 +          continue;
 +
 +        abort();
 +      }
 +
 +    /* Handle events */
 +    events = 0;
 +    if (FD_ISSET(fd, s->sread))
 +      events |= POLLIN;
 +    if (FD_ISSET(fd, s->swrite))
 +      events |= POLLOUT;
 +
 +    assert(events != 0 || FD_ISSET(s->int_fd, s->sread));
 +    if (events != 0) {
 +      ACCESS_ONCE(int, s->events) = events;
 +
 +      uv_async_send(&s->async);
 +      uv_sem_wait(&s->async_sem);
 +
 +      /* Should be processed at this stage */
 +      assert((s->events == 0) || (stream->flags & UV_CLOSING));
 +    }
 +  }
 +}
 +
 +
 +static void uv__stream_osx_select_cb(uv_async_t* handle) {
 +  uv__stream_select_t* s;
 +  uv_stream_t* stream;
 +  int events;
 +
 +  s = container_of(handle, uv__stream_select_t, async);
 +  stream = s->stream;
 +
 +  /* Get and reset stream's events */
 +  events = s->events;
 +  ACCESS_ONCE(int, s->events) = 0;
 +
 +  assert(events != 0);
 +  assert(events == (events & (POLLIN | POLLOUT)));
 +
 +  /* Invoke callback on event-loop */
 +  if ((events & POLLIN) && uv__io_active(&stream->io_watcher, POLLIN))
 +    uv__stream_io(stream->loop, &stream->io_watcher, POLLIN);
 +
 +  if ((events & POLLOUT) && uv__io_active(&stream->io_watcher, POLLOUT))
 +    uv__stream_io(stream->loop, &stream->io_watcher, POLLOUT);
 +
 +  if (stream->flags & UV_CLOSING)
 +    return;
 +
 +  /* NOTE: It is important to do it here, otherwise `select()` might be called
 +   * before the actual `uv__read()`, leading to the blocking syscall
 +   */
 +  uv_sem_post(&s->async_sem);
 +}
 +
 +
 +static void uv__stream_osx_cb_close(uv_handle_t* async) {
 +  uv__stream_select_t* s;
 +
 +  s = container_of(async, uv__stream_select_t, async);
 +  uv__free(s);
 +}
 +
 +
 +int uv__stream_try_select(uv_stream_t* stream, int* fd) {
 +  /*
 +   * kqueue doesn't work with some files from /dev mount on osx.
 +   * select(2) in separate thread for those fds
 +   */
 +
 +  struct kevent filter[1];
 +  struct kevent events[1];
 +  struct timespec timeout;
 +  uv__stream_select_t* s;
 +  int fds[2];
 +  int err;
 +  int ret;
 +  int kq;
 +  int old_fd;
 +  int max_fd;
 +  size_t sread_sz;
 +  size_t swrite_sz;
 +
 +  kq = kqueue();
 +  if (kq == -1) {
 +    perror("(libuv) kqueue()");
 +    return -errno;
 +  }
 +
 +  EV_SET(&filter[0], *fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0);
 +
 +  /* Use small timeout, because we only want to capture EINVALs */
 +  timeout.tv_sec = 0;
 +  timeout.tv_nsec = 1;
 +
 +  do
 +    ret = kevent(kq, filter, 1, events, 1, &timeout);
 +  while (ret == -1 && errno == EINTR);
 +
 +  uv__close(kq);
 +
 +  if (ret == -1)
 +    return -errno;
 +
 +  if (ret == 0 || (events[0].flags & EV_ERROR) == 0 || events[0].data != EINVAL)
 +    return 0;
 +
 +  /* At this point we definitely know that this fd won't work with kqueue */
 +
 +  /*
 +   * Create fds for io watcher and to interrupt the select() loop.
 +   * NOTE: do it ahead of malloc below to allocate enough space for fd_sets
 +   */
 +  if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds))
 +    return -errno;
 +
 +  max_fd = *fd;
 +  if (fds[1] > max_fd)
 +    max_fd = fds[1];
 +
 +  sread_sz = ROUND_UP(max_fd + 1, sizeof(uint32_t) * NBBY) / NBBY;
 +  swrite_sz = sread_sz;
 +
 +  s = uv__malloc(sizeof(*s) + sread_sz + swrite_sz);
 +  if (s == NULL) {
 +    err = -ENOMEM;
 +    goto failed_malloc;
 +  }
 +
 +  s->events = 0;
 +  s->fd = *fd;
 +  s->sread = (fd_set*) ((char*) s + sizeof(*s));
 +  s->sread_sz = sread_sz;
 +  s->swrite = (fd_set*) ((char*) s->sread + sread_sz);
 +  s->swrite_sz = swrite_sz;
 +
 +  err = uv_async_init(stream->loop, &s->async, uv__stream_osx_select_cb);
 +  if (err)
 +    goto failed_async_init;
 +
 +  s->async.flags |= UV__HANDLE_INTERNAL;
 +  uv__handle_unref(&s->async);
 +
 +  err = uv_sem_init(&s->close_sem, 0);
 +  if (err != 0)
 +    goto failed_close_sem_init;
 +
 +  err = uv_sem_init(&s->async_sem, 0);
 +  if (err != 0)
 +    goto failed_async_sem_init;
 +
 +  s->fake_fd = fds[0];
 +  s->int_fd = fds[1];
 +
 +  old_fd = *fd;
 +  s->stream = stream;
 +  stream->select = s;
 +  *fd = s->fake_fd;
 +
 +  err = uv_thread_create(&s->thread, uv__stream_osx_select, stream);
 +  if (err != 0)
 +    goto failed_thread_create;
 +
 +  return 0;
 +
 +failed_thread_create:
 +  s->stream = NULL;
 +  stream->select = NULL;
 +  *fd = old_fd;
 +
 +  uv_sem_destroy(&s->async_sem);
 +
 +failed_async_sem_init:
 +  uv_sem_destroy(&s->close_sem);
 +
 +failed_close_sem_init:
 +  uv__close(fds[0]);
 +  uv__close(fds[1]);
 +  uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close);
 +  return err;
 +
 +failed_async_init:
 +  uv__free(s);
 +
 +failed_malloc:
 +  uv__close(fds[0]);
 +  uv__close(fds[1]);
 +
 +  return err;
 +}
 +#endif /* defined(__APPLE__) */
 +
 +
 +int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
 +#if defined(__APPLE__)
 +  int enable;
 +#endif
 +
 +  if (!(stream->io_watcher.fd == -1 || stream->io_watcher.fd == fd))
 +    return -EBUSY;
 +
 +  assert(fd >= 0);
 +  stream->flags |= flags;
 +
 +  if (stream->type == UV_TCP) {
 +    if ((stream->flags & UV_TCP_NODELAY) && uv__tcp_nodelay(fd, 1))
 +      return -errno;
 +
 +    /* TODO Use delay the user passed in. */
 +    if ((stream->flags & UV_TCP_KEEPALIVE) && uv__tcp_keepalive(fd, 1, 60))
 +      return -errno;
 +  }
 +
 +#if defined(__APPLE__)
 +  enable = 1;
 +  if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &enable, sizeof(enable)) &&
 +      errno != ENOTSOCK &&
 +      errno != EINVAL) {
 +    return -errno;
 +  }
 +#endif
 +
 +  stream->io_watcher.fd = fd;
 +
 +  return 0;
 +}
 +
 +
 +void uv__stream_flush_write_queue(uv_stream_t* stream, int error) {
 +  uv_write_t* req;
 +  QUEUE* q;
 +  while (!QUEUE_EMPTY(&stream->write_queue)) {
 +    q = QUEUE_HEAD(&stream->write_queue);
 +    QUEUE_REMOVE(q);
 +
 +    req = QUEUE_DATA(q, uv_write_t, queue);
 +    req->error = error;
 +
 +    QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue);
 +  }
 +}
 +
 +
 +void uv__stream_destroy(uv_stream_t* stream) {
 +  assert(!uv__io_active(&stream->io_watcher, POLLIN | POLLOUT));
 +  assert(stream->flags & UV_CLOSED);
 +
 +  if (stream->connect_req) {
 +    uv__req_unregister(stream->loop, stream->connect_req);
 +    stream->connect_req->cb(stream->connect_req, -ECANCELED);
 +    stream->connect_req = NULL;
 +  }
 +
 +  uv__stream_flush_write_queue(stream, -ECANCELED);
 +  uv__write_callbacks(stream);
 +
 +  if (stream->shutdown_req) {
 +    /* The ECANCELED error code is a lie, the shutdown(2) syscall is a
 +     * fait accompli at this point. Maybe we should revisit this in v0.11.
 +     * A possible reason for leaving it unchanged is that it informs the
 +     * callee that the handle has been destroyed.
 +     */
 +    uv__req_unregister(stream->loop, stream->shutdown_req);
 +    stream->shutdown_req->cb(stream->shutdown_req, -ECANCELED);
 +    stream->shutdown_req = NULL;
 +  }
 +
 +  assert(stream->write_queue_size == 0);
 +}
 +
 +
 +/* Implements a best effort approach to mitigating accept() EMFILE errors.
 + * We have a spare file descriptor stashed away that we close to get below
 + * the EMFILE limit. Next, we accept all pending connections and close them
 + * immediately to signal the clients that we're overloaded - and we are, but
 + * we still keep on trucking.
 + *
 + * There is one caveat: it's not reliable in a multi-threaded environment.
 + * The file descriptor limit is per process. Our party trick fails if another
 + * thread opens a file or creates a socket in the time window between us
 + * calling close() and accept().
 + */
 +static int uv__emfile_trick(uv_loop_t* loop, int accept_fd) {
 +  int err;
 +  int emfile_fd;
 +
 +  if (loop->emfile_fd == -1)
 +    return -EMFILE;
 +
 +  uv__close(loop->emfile_fd);
 +  loop->emfile_fd = -1;
 +
 +  do {
 +    err = uv__accept(accept_fd);
 +    if (err >= 0)
 +      uv__close(err);
 +  } while (err >= 0 || err == -EINTR);
 +
 +  emfile_fd = uv__open_cloexec("/", O_RDONLY);
 +  if (emfile_fd >= 0)
 +    loop->emfile_fd = emfile_fd;
 +
 +  return err;
 +}
 +
 +
 +#if defined(UV_HAVE_KQUEUE)
 +# define UV_DEC_BACKLOG(w) w->rcount--;
 +#else
 +# define UV_DEC_BACKLOG(w) /* no-op */
 +#endif /* defined(UV_HAVE_KQUEUE) */
 +
 +
 +void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
 +  uv_stream_t* stream;
 +  int err;
 +
 +  stream = container_of(w, uv_stream_t, io_watcher);
-   assert(events == POLLIN);
++  assert(events & POLLIN);
 +  assert(stream->accepted_fd == -1);
 +  assert(!(stream->flags & UV_CLOSING));
 +
 +  uv__io_start(stream->loop, &stream->io_watcher, POLLIN);
 +
 +  /* connection_cb can close the server socket while we're
 +   * in the loop so check it on each iteration.
 +   */
 +  while (uv__stream_fd(stream) != -1) {
 +    assert(stream->accepted_fd == -1);
 +
 +#if defined(UV_HAVE_KQUEUE)
 +    if (w->rcount <= 0)
 +      return;
 +#endif /* defined(UV_HAVE_KQUEUE) */
 +
 +    err = uv__accept(uv__stream_fd(stream));
 +    if (err < 0) {
 +      if (err == -EAGAIN || err == -EWOULDBLOCK)
 +        return;  /* Not an error. */
 +
 +      if (err == -ECONNABORTED)
 +        continue;  /* Ignore. Nothing we can do about that. */
 +
 +      if (err == -EMFILE || err == -ENFILE) {
 +        err = uv__emfile_trick(loop, uv__stream_fd(stream));
 +        if (err == -EAGAIN || err == -EWOULDBLOCK)
 +          break;
 +      }
 +
 +      stream->connection_cb(stream, err);
 +      continue;
 +    }
 +
 +    UV_DEC_BACKLOG(w)
 +    stream->accepted_fd = err;
 +    stream->connection_cb(stream, 0);
 +
 +    if (stream->accepted_fd != -1) {
 +      /* The user hasn't yet accepted called uv_accept() */
 +      uv__io_stop(loop, &stream->io_watcher, POLLIN);
 +      return;
 +    }
 +
 +    if (stream->type == UV_TCP && (stream->flags & UV_TCP_SINGLE_ACCEPT)) {
 +      /* Give other processes a chance to accept connections. */
 +      struct timespec timeout = { 0, 1 };
 +      nanosleep(&timeout, NULL);
 +    }
 +  }
 +}
 +
 +
 +#undef UV_DEC_BACKLOG
 +
 +
 +int uv_accept(uv_stream_t* server, uv_stream_t* client) {
 +  int err;
 +
 +  assert(server->loop == client->loop);
 +
 +  if (server->accepted_fd == -1)
 +    return -EAGAIN;
 +
 +  switch (client->type) {
 +    case UV_NAMED_PIPE:
 +    case UV_TCP:
 +      err = uv__stream_open(client,
 +                            server->accepted_fd,
 +                            UV_STREAM_READABLE | UV_STREAM_WRITABLE);
 +      if (err) {
 +        /* TODO handle error */
 +        uv__close(server->accepted_fd);
 +        goto done;
 +      }
 +      break;
 +
 +    case UV_UDP:
 +      err = uv_udp_open((uv_udp_t*) client, server->accepted_fd);
 +      if (err) {
 +        uv__close(server->accepted_fd);
 +        goto done;
 +      }
 +      break;
 +
 +    default:
 +      return -EINVAL;
 +  }
 +
 +  client->flags |= UV_HANDLE_BOUND;
 +
 +done:
 +  /* Process queued fds */
 +  if (server->queued_fds != NULL) {
 +    uv__stream_queued_fds_t* queued_fds;
 +
 +    queued_fds = server->queued_fds;
 +
 +    /* Read first */
 +    server->accepted_fd = queued_fds->fds[0];
 +
 +    /* All read, free */
 +    assert(queued_fds->offset > 0);
 +    if (--queued_fds->offset == 0) {
 +      uv__free(queued_fds);
 +      server->queued_fds = NULL;
 +    } else {
 +      /* Shift rest */
 +      memmove(queued_fds->fds,
 +              queued_fds->fds + 1,
 +              queued_fds->offset * sizeof(*queued_fds->fds));
 +    }
 +  } else {
 +    server->accepted_fd = -1;
 +    if (err == 0)
 +      uv__io_start(server->loop, &server->io_watcher, POLLIN);
 +  }
 +  return err;
 +}
 +
 +
 +int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) {
 +  int err;
 +
 +  switch (stream->type) {
 +  case UV_TCP:
 +    err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb);
 +    break;
 +
 +  case UV_NAMED_PIPE:
 +    err = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb);
 +    break;
 +
 +  default:
 +    err = -EINVAL;
 +  }
 +
 +  if (err == 0)
 +    uv__handle_start(stream);
 +
 +  return err;
 +}
 +
 +
 +static void uv__drain(uv_stream_t* stream) {
 +  uv_shutdown_t* req;
 +  int err;
 +
 +  assert(QUEUE_EMPTY(&stream->write_queue));
 +  uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT);
 +  uv__stream_osx_interrupt_select(stream);
 +
 +  /* Shutdown? */
 +  if ((stream->flags & UV_STREAM_SHUTTING) &&
 +      !(stream->flags & UV_CLOSING) &&
 +      !(stream->flags & UV_STREAM_SHUT)) {
 +    assert(stream->shutdown_req);
 +
 +    req = stream->shutdown_req;
 +    stream->shutdown_req = NULL;
 +    stream->flags &= ~UV_STREAM_SHUTTING;
 +    uv__req_unregister(stream->loop, req);
 +
 +    err = 0;
 +    if (shutdown(uv__stream_fd(stream), SHUT_WR))
 +      err = -errno;
 +
 +    if (err == 0)
 +      stream->flags |= UV_STREAM_SHUT;
 +
 +    if (req->cb != NULL)
 +      req->cb(req, err);
 +  }
 +}
 +
 +
 +static size_t uv__write_req_size(uv_write_t* req) {
 +  size_t size;
 +
 +  assert(req->bufs != NULL);
 +  size = uv__count_bufs(req->bufs + req->write_index,
 +                        req->nbufs - req->write_index);
 +  assert(req->handle->write_queue_size >= size);
 +
 +  return size;
 +}
 +
 +
 +static void uv__write_req_finish(uv_write_t* req) {
 +  uv_stream_t* stream = req->handle;
 +
 +  /* Pop the req off tcp->write_queue. */
 +  QUEUE_REMOVE(&req->queue);
 +
 +  /* Only free when there was no error. On error, we touch up write_queue_size
 +   * right before making the callback. The reason we don't do that right away
 +   * is that a write_queue_size > 0 is our only way to signal to the user that
 +   * they should stop writing - which they should if we got an error. Something
 +   * to revisit in future revisions of the libuv API.
 +   */
 +  if (req->error == 0) {
 +    if (req->bufs != req->bufsml)
 +      uv__free(req->bufs);
 +    req->bufs = NULL;
 +  }
 +
 +  /* Add it to the write_completed_queue where it will have its
 +   * callback called in the near future.
 +   */
 +  QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue);
 +  uv__io_feed(stream->loop, &stream->io_watcher);
 +}
 +
 +
 +static int uv__handle_fd(uv_handle_t* handle) {
 +  switch (handle->type) {
 +    case UV_NAMED_PIPE:
 +    case UV_TCP:
 +      return ((uv_stream_t*) handle)->io_watcher.fd;
 +
 +    case UV_UDP:
 +      return ((uv_udp_t*) handle)->io_watcher.fd;
 +
 +    default:
 +      return -1;
 +  }
 +}
 +
 +static void uv__write(uv_stream_t* stream) {
 +  struct iovec* iov;
 +  QUEUE* q;
 +  uv_write_t* req;
 +  int iovmax;
 +  int iovcnt;
 +  ssize_t n;
++  int err;
 +
 +start:
 +
 +  assert(uv__stream_fd(stream) >= 0);
 +
 +  if (QUEUE_EMPTY(&stream->write_queue))
 +    return;
 +
 +  q = QUEUE_HEAD(&stream->write_queue);
 +  req = QUEUE_DATA(q, uv_write_t, queue);
 +  assert(req->handle == stream);
 +
 +  /*
 +   * Cast to iovec. We had to have our own uv_buf_t instead of iovec
 +   * because Windows's WSABUF is not an iovec.
 +   */
 +  assert(sizeof(uv_buf_t) == sizeof(struct iovec));
 +  iov = (struct iovec*) &(req->bufs[req->write_index]);
 +  iovcnt = req->nbufs - req->write_index;
 +
 +  iovmax = uv__getiovmax();
 +
 +  /* Limit iov count to avoid EINVALs from writev() */
 +  if (iovcnt > iovmax)
 +    iovcnt = iovmax;
 +
 +  /*
 +   * Now do the actual writev. Note that we've been updating the pointers
 +   * inside the iov each time we write. So there is no need to offset it.
 +   */
 +
 +  if (req->send_handle) {
++    int fd_to_send;
 +    struct msghdr msg;
 +    struct cmsghdr *cmsg;
-     int fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle);
 +    union {
 +      char data[64];
 +      struct cmsghdr alias;
 +    } scratch;
 +
++    if (uv__is_closing(req->send_handle)) {
++      err = -EBADF;
++      goto error;
++    }
++
++    fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle);
++
 +    memset(&scratch, 0, sizeof(scratch));
 +
 +    assert(fd_to_send >= 0);
 +
 +    msg.msg_name = NULL;
 +    msg.msg_namelen = 0;
 +    msg.msg_iov = iov;
 +    msg.msg_iovlen = iovcnt;
 +    msg.msg_flags = 0;
 +
 +    msg.msg_control = &scratch.alias;
 +    msg.msg_controllen = CMSG_SPACE(sizeof(fd_to_send));
 +
 +    cmsg = CMSG_FIRSTHDR(&msg);
 +    cmsg->cmsg_level = SOL_SOCKET;
 +    cmsg->cmsg_type = SCM_RIGHTS;
 +    cmsg->cmsg_len = CMSG_LEN(sizeof(fd_to_send));
 +
 +    /* silence aliasing warning */
 +    {
 +      void* pv = CMSG_DATA(cmsg);
 +      int* pi = pv;
 +      *pi = fd_to_send;
 +    }
 +
 +    do {
 +      n = sendmsg(uv__stream_fd(stream), &msg, 0);
 +    }
 +#if defined(__APPLE__)
 +    /*
 +     * Due to a possible kernel bug at least in OS X 10.10 "Yosemite",
 +     * EPROTOTYPE can be returned while trying to write to a socket that is
 +     * shutting down. If we retry the write, we should get the expected EPIPE
 +     * instead.
 +     */
 +    while (n == -1 && (errno == EINTR || errno == EPROTOTYPE));
 +#else
 +    while (n == -1 && errno == EINTR);
 +#endif
 +  } else {
 +    do {
 +      if (iovcnt == 1) {
 +        n = write(uv__stream_fd(stream), iov[0].iov_base, iov[0].iov_len);
 +      } else {
 +        n = writev(uv__stream_fd(stream), iov, iovcnt);
 +      }
 +    }
 +#if defined(__APPLE__)
 +    /*
 +     * Due to a possible kernel bug at least in OS X 10.10 "Yosemite",
 +     * EPROTOTYPE can be returned while trying to write to a socket that is
 +     * shutting down. If we retry the write, we should get the expected EPIPE
 +     * instead.
 +     */
 +    while (n == -1 && (errno == EINTR || errno == EPROTOTYPE));
 +#else
 +    while (n == -1 && errno == EINTR);
 +#endif
 +  }
 +
 +  if (n < 0) {
-     if (errno != EAGAIN && errno != EWOULDBLOCK) {
-       /* Error */
-       req->error = -errno;
-       uv__write_req_finish(req);
-       uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT);
-       if (!uv__io_active(&stream->io_watcher, POLLIN))
-         uv__handle_stop(stream);
-       uv__stream_osx_interrupt_select(stream);
-       return;
++    if (errno != EAGAIN && errno != EWOULDBLOCK && errno != ENOBUFS) {
++      err = -errno;
++      goto error;
 +    } else if (stream->flags & UV_STREAM_BLOCKING) {
 +      /* If this is a blocking stream, try again. */
 +      goto start;
 +    }
 +  } else {
 +    /* Successful write */
 +
 +    while (n >= 0) {
 +      uv_buf_t* buf = &(req->bufs[req->write_index]);
 +      size_t len = buf->len;
 +
 +      assert(req->write_index < req->nbufs);
 +
 +      if ((size_t)n < len) {
 +        buf->base += n;
 +        buf->len -= n;
 +        stream->write_queue_size -= n;
 +        n = 0;
 +
 +        /* There is more to write. */
 +        if (stream->flags & UV_STREAM_BLOCKING) {
 +          /*
 +           * If we're blocking then we should not be enabling the write
 +           * watcher - instead we need to try again.
 +           */
 +          goto start;
 +        } else {
 +          /* Break loop and ensure the watcher is pending. */
 +          break;
 +        }
 +
 +      } else {
 +        /* Finished writing the buf at index req->write_index. */
 +        req->write_index++;
 +
 +        assert((size_t)n >= len);
 +        n -= len;
 +
 +        assert(stream->write_queue_size >= len);
 +        stream->write_queue_size -= len;
 +
 +        if (req->write_index == req->nbufs) {
 +          /* Then we're done! */
 +          assert(n == 0);
 +          uv__write_req_finish(req);
 +          /* TODO: start trying to write the next request. */
 +          return;
 +        }
 +      }
 +    }
 +  }
 +
 +  /* Either we've counted n down to zero or we've got EAGAIN. */
 +  assert(n == 0 || n == -1);
 +
 +  /* Only non-blocking streams should use the write_watcher. */
 +  assert(!(stream->flags & UV_STREAM_BLOCKING));
 +
 +  /* We're not done. */
 +  uv__io_start(stream->loop, &stream->io_watcher, POLLOUT);
 +
 +  /* Notify select() thread about state change */
 +  uv__stream_osx_interrupt_select(stream);
++
++  return;
++
++error:
++  req->error = err;
++  uv__write_req_finish(req);
++  uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT);
++  if (!uv__io_active(&stream->io_watcher, POLLIN))
++    uv__handle_stop(stream);
++  uv__stream_osx_interrupt_select(stream);
 +}
 +
 +
 +static void uv__write_callbacks(uv_stream_t* stream) {
 +  uv_write_t* req;
 +  QUEUE* q;
 +
 +  while (!QUEUE_EMPTY(&stream->write_completed_queue)) {
 +    /* Pop a req off write_completed_queue. */
 +    q = QUEUE_HEAD(&stream->write_completed_queue);
 +    req = QUEUE_DATA(q, uv_write_t, queue);
 +    QUEUE_REMOVE(q);
 +    uv__req_unregister(stream->loop, req);
 +
 +    if (req->bufs != NULL) {
 +      stream->write_queue_size -= uv__write_req_size(req);
 +      if (req->bufs != req->bufsml)
 +        uv__free(req->bufs);
 +      req->bufs = NULL;
 +    }
 +
 +    /* NOTE: call callback AFTER freeing the request data. */
 +    if (req->cb)
 +      req->cb(req, req->error);
 +  }
 +
 +  assert(QUEUE_EMPTY(&stream->write_completed_queue));
 +}
 +
 +
 +uv_handle_type uv__handle_type(int fd) {
 +  struct sockaddr_storage ss;
 +  socklen_t sslen;
 +  socklen_t len;
 +  int type;
 +
 +  memset(&ss, 0, sizeof(ss));
 +  sslen = sizeof(ss);
 +
 +  if (getsockname(fd, (struct sockaddr*)&ss, &sslen))
 +    return UV_UNKNOWN_HANDLE;
 +
 +  len = sizeof type;
 +
 +  if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &len))
 +    return UV_UNKNOWN_HANDLE;
 +
 +  if (type == SOCK_STREAM) {
 +#if defined(_AIX) || defined(__DragonFly__)
 +    /* on AIX/DragonFly the getsockname call returns an empty sa structure
 +     * for sockets of type AF_UNIX.  For all other types it will
 +     * return a properly filled in structure.
 +     */
 +    if (sslen == 0)
 +      return UV_NAMED_PIPE;
 +#endif
 +    switch (ss.ss_family) {
 +      case AF_UNIX:
 +        return UV_NAMED_PIPE;
 +      case AF_INET:
 +      case AF_INET6:
 +        return UV_TCP;
 +      }
 +  }
 +
 +  if (type == SOCK_DGRAM &&
 +      (ss.ss_family == AF_INET || ss.ss_family == AF_INET6))
 +    return UV_UDP;
 +
 +  return UV_UNKNOWN_HANDLE;
 +}
 +
 +
 +static void uv__stream_eof(uv_stream_t* stream, const uv_buf_t* buf) {
 +  stream->flags |= UV_STREAM_READ_EOF;
 +  uv__io_stop(stream->loop, &stream->io_watcher, POLLIN);
 +  if (!uv__io_active(&stream->io_watcher, POLLOUT))
 +    uv__handle_stop(stream);
 +  uv__stream_osx_interrupt_select(stream);
 +  stream->read_cb(stream, UV_EOF, buf);
 +  stream->flags &= ~UV_STREAM_READING;
 +}
 +
 +
 +static int uv__stream_queue_fd(uv_stream_t* stream, int fd) {
 +  uv__stream_queued_fds_t* queued_fds;
 +  unsigned int queue_size;
 +
 +  queued_fds = stream->queued_fds;
 +  if (queued_fds == NULL) {
 +    queue_size = 8;
 +    queued_fds = uv__malloc((queue_size - 1) * sizeof(*queued_fds->fds) +
 +                            sizeof(*queued_fds));
 +    if (queued_fds == NULL)
 +      return -ENOMEM;
 +    queued_fds->size = queue_size;
 +    queued_fds->offset = 0;
 +    stream->queued_fds = queued_fds;
 +
 +    /* Grow */
 +  } else if (queued_fds->size == queued_fds->offset) {
 +    queue_size = queued_fds->size + 8;
 +    queued_fds = uv__realloc(queued_fds,
 +                             (queue_size - 1) * sizeof(*queued_fds->fds) +
 +                              sizeof(*queued_fds));
 +
 +    /*
 +     * Allocation failure, report back.
 +     * NOTE: if it is fatal - sockets will be closed in uv__stream_close
 +     */
 +    if (queued_fds == NULL)
 +      return -ENOMEM;
 +    queued_fds->size = queue_size;
 +    stream->queued_fds = queued_fds;
 +  }
 +
 +  /* Put fd in a queue */
 +  queued_fds->fds[queued_fds->offset++] = fd;
 +
 +  return 0;
 +}
 +
 +
 +#define UV__CMSG_FD_COUNT 64
 +#define UV__CMSG_FD_SIZE (UV__CMSG_FD_COUNT * sizeof(int))
 +
 +
 +static int uv__stream_recv_cmsg(uv_stream_t* stream, struct msghdr* msg) {
 +  struct cmsghdr* cmsg;
 +
 +  for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) {
 +    char* start;
 +    char* end;
 +    int err;
 +    void* pv;
 +    int* pi;
 +    unsigned int i;
 +    unsigned int count;
 +
 +    if (cmsg->cmsg_type != SCM_RIGHTS) {
 +      fprintf(stderr, "ignoring non-SCM_RIGHTS ancillary data: %d\n",
 +          cmsg->cmsg_type);
 +      continue;
 +    }
 +
 +    /* silence aliasing warning */
 +    pv = CMSG_DATA(cmsg);
 +    pi = pv;
 +
 +    /* Count available fds */
 +    start = (char*) cmsg;
 +    end = (char*) cmsg + cmsg->cmsg_len;
 +    count = 0;
 +    while (start + CMSG_LEN(count * sizeof(*pi)) < end)
 +      count++;
 +    assert(start + CMSG_LEN(count * sizeof(*pi)) == end);
 +
 +    for (i = 0; i < count; i++) {
 +      /* Already has accepted fd, queue now */
 +      if (stream->accepted_fd != -1) {
 +        err = uv__stream_queue_fd(stream, pi[i]);
 +        if (err != 0) {
 +          /* Close rest */
 +          for (; i < count; i++)
 +            uv__close(pi[i]);
 +          return err;
 +        }
 +      } else {
 +        stream->accepted_fd = pi[i];
 +      }
 +    }
 +  }
 +
 +  return 0;
 +}
 +
 +
 +#ifdef __clang__
 +# pragma clang diagnostic push
 +# pragma clang diagnostic ignored "-Wgnu-folding-constant"
 +#endif
 +
 +static void uv__read(uv_stream_t* stream) {
 +  uv_buf_t buf;
 +  ssize_t nread;
 +  struct msghdr msg;
 +  char cmsg_space[CMSG_SPACE(UV__CMSG_FD_SIZE)];
 +  int count;
 +  int err;
 +  int is_ipc;
 +
 +  stream->flags &= ~UV_STREAM_READ_PARTIAL;
 +
 +  /* Prevent loop starvation when the data comes in as fast as (or faster than)
 +   * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O.
 +   */
 +  count = 32;
 +
 +  is_ipc = stream->type == UV_NAMED_PIPE && ((uv_pipe_t*) stream)->ipc;
 +
 +  /* XXX: Maybe instead of having UV_STREAM_READING we just test if
 +   * tcp->read_cb is NULL or not?
 +   */
 +  while (stream->read_cb
 +      && (stream->flags & UV_STREAM_READING)
 +      && (count-- > 0)) {
 +    assert(stream->alloc_cb != NULL);
 +
 +    buf = uv_buf_init(NULL, 0);
 +    stream->alloc_cb((uv_handle_t*)stream, 64 * 1024, &buf);
 +    if (buf.base == NULL || buf.len == 0) {
 +      /* User indicates it can't or won't handle the read. */
 +      stream->read_cb(stream, UV_ENOBUFS, &buf);
 +      return;
 +    }
 +
 +    assert(buf.base != NULL);
 +    assert(uv__stream_fd(stream) >= 0);
 +
 +    if (!is_ipc) {
 +      do {
 +        nread = read(uv__stream_fd(stream), buf.base, buf.len);
 +      }
 +      while (nread < 0 && errno == EINTR);
 +    } else {
 +      /* ipc uses recvmsg */
 +      msg.msg_flags = 0;
 +      msg.msg_iov = (struct iovec*) &buf;
 +      msg.msg_iovlen = 1;
 +      msg.msg_name = NULL;
 +      msg.msg_namelen = 0;
 +      /* Set up to receive a descriptor even if one isn't in the message */
 +      msg.msg_controllen = sizeof(cmsg_space);
 +      msg.msg_control = cmsg_space;
 +
 +      do {
 +        nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0);
 +      }
 +      while (nread < 0 && errno == EINTR);
 +    }
 +
 +    if (nread < 0) {
 +      /* Error */
 +      if (errno == EAGAIN || errno == EWOULDBLOCK) {
 +        /* Wait for the next one. */
 +        if (stream->flags & UV_STREAM_READING) {
 +          uv__io_start(stream->loop, &stream->io_watcher, POLLIN);
 +          uv__stream_osx_interrupt_select(stream);
 +        }
 +        stream->read_cb(stream, 0, &buf);
 +#if defined(__CYGWIN__) || defined(__MSYS__)
 +      } else if (errno == ECONNRESET && stream->type == UV_NAMED_PIPE) {
 +        uv__stream_eof(stream, &buf);
 +        return;
 +#endif
 +      } else {
 +        /* Error. User should call uv_close(). */
 +        stream->read_cb(stream, -errno, &buf);
 +        if (stream->flags & UV_STREAM_READING) {
 +          stream->flags &= ~UV_STREAM_READING;
 +          uv__io_stop(stream->loop, &stream->io_watcher, POLLIN);
 +          if (!uv__io_active(&stream->io_watcher, POLLOUT))
 +            uv__handle_stop(stream);
 +          uv__stream_osx_interrupt_select(stream);
 +        }
 +      }
 +      return;
 +    } else if (nread == 0) {
 +      uv__stream_eof(stream, &buf);
 +      return;
 +    } else {
 +      /* Successful read */
 +      ssize_t buflen = buf.len;
 +
 +      if (is_ipc) {
 +        err = uv__stream_recv_cmsg(stream, &msg);
 +        if (err != 0) {
 +          stream->read_cb(stream, err, &buf);
 +          return;
 +        }
 +      }
 +
 +#if defined(__MVS__)
 +      if (is_ipc && msg.msg_controllen > 0) {
 +        uv_buf_t blankbuf;
 +        int nread;
 +        struct iovec *old;
 +
 +        blankbuf.base = 0;
 +        blankbuf.len = 0;
 +        old = msg.msg_iov;
 +        msg.msg_iov = (struct iovec*) &blankbuf;
 +        nread = 0;
 +        do {
 +          nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0);
 +          err = uv__stream_recv_cmsg(stream, &msg);
 +          if (err != 0) {
 +            stream->read_cb(stream, err, &buf);
 +            msg.msg_iov = old;
 +            return;
 +          }
 +        } while (nread == 0 && msg.msg_controllen > 0);
 +        msg.msg_iov = old;
 +      }
 +#endif
 +      stream->read_cb(stream, nread, &buf);
 +
 +      /* Return if we didn't fill the buffer, there is no more data to read. */
 +      if (nread < buflen) {
 +        stream->flags |= UV_STREAM_READ_PARTIAL;
 +        return;
 +      }
 +    }
 +  }
 +}
 +
 +
 +#ifdef __clang__
 +# pragma clang diagnostic pop
 +#endif
 +
 +#undef UV__CMSG_FD_COUNT
 +#undef UV__CMSG_FD_SIZE
 +
 +
 +int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
-   assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE) &&
-          "uv_shutdown (unix) only supports uv_handle_t right now");
++  assert(stream->type == UV_TCP ||
++         stream->type == UV_TTY ||
++         stream->type == UV_NAMED_PIPE);
 +
 +  if (!(stream->flags & UV_STREAM_WRITABLE) ||
 +      stream->flags & UV_STREAM_SHUT ||
 +      stream->flags & UV_STREAM_SHUTTING ||
 +      uv__is_closing(stream)) {
 +    return -ENOTCONN;
 +  }
 +
 +  assert(uv__stream_fd(stream) >= 0);
 +
 +  /* Initialize request */
 +  uv__req_init(stream->loop, req, UV_SHUTDOWN);
 +  req->handle = stream;
 +  req->cb = cb;
 +  stream->shutdown_req = req;
 +  stream->flags |= UV_STREAM_SHUTTING;
 +
 +  uv__io_start(stream->loop, &stream->io_watcher, POLLOUT);
 +  uv__stream_osx_interrupt_select(stream);
 +
 +  return 0;
 +}
 +
 +
 +static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
 +  uv_stream_t* stream;
 +
 +  stream = container_of(w, uv_stream_t, io_watcher);
 +
 +  assert(stream->type == UV_TCP ||
 +         stream->type == UV_NAMED_PIPE ||
 +         stream->type == UV_TTY);
 +  assert(!(stream->flags & UV_CLOSING));
 +
 +  if (stream->connect_req) {
 +    uv__stream_connect(stream);
 +    return;
 +  }
 +
 +  assert(uv__stream_fd(stream) >= 0);
 +
 +  /* Ignore POLLHUP here. Even it it's set, there may still be data to read. */
 +  if (events & (POLLIN | POLLERR | POLLHUP))
 +    uv__read(stream);
 +
 +  if (uv__stream_fd(stream) == -1)
 +    return;  /* read_cb closed stream. */
 +
 +  /* Short-circuit iff POLLHUP is set, the user is still interested in read
 +   * events and uv__read() reported a partial read but not EOF. If the EOF
 +   * flag is set, uv__read() called read_cb with err=UV_EOF and we don't
 +   * have to do anything. If the partial read flag is not set, we can't
 +   * report the EOF yet because there is still data to read.
 +   */
 +  if ((events & POLLHUP) &&
 +      (stream->flags & UV_STREAM_READING) &&
 +      (stream->flags & UV_STREAM_READ_PARTIAL) &&
 +      !(stream->flags & UV_STREAM_READ_EOF)) {
 +    uv_buf_t buf = { NULL, 0 };
 +    uv__stream_eof(stream, &buf);
 +  }
 +
 +  if (uv__stream_fd(stream) == -1)
 +    return;  /* read_cb closed stream. */
 +
 +  if (events & (POLLOUT | POLLERR | POLLHUP)) {
 +    uv__write(stream);
 +    uv__write_callbacks(stream);
 +
 +    /* Write queue drained. */
 +    if (QUEUE_EMPTY(&stream->write_queue))
 +      uv__drain(stream);
 +  }
 +}
 +
 +
 +/**
 + * We get called here from directly following a call to connect(2).
 + * In order to determine if we've errored out or succeeded must call
 + * getsockopt.
 + */
 +static void uv__stream_connect(uv_stream_t* stream) {
 +  int error;
 +  uv_connect_t* req = stream->connect_req;
 +  socklen_t errorsize = sizeof(int);
 +
 +  assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE);
 +  assert(req);
 +
 +  if (stream->delayed_error) {
 +    /* To smooth over the differences between unixes errors that
 +     * were reported synchronously on the first connect can be delayed
 +     * until the next tick--which is now.
 +     */
 +    error = stream->delayed_error;
 +    stream->delayed_error = 0;
 +  } else {
 +    /* Normal situation: we need to get the socket error from the kernel. */
 +    assert(uv__stream_fd(stream) >= 0);
 +    getsockopt(uv__stream_fd(stream),
 +               SOL_SOCKET,
 +               SO_ERROR,
 +               &error,
 +               &errorsize);
 +    error = -error;
 +  }
 +
 +  if (error == -EINPROGRESS)
 +    return;
 +
 +  stream->connect_req = NULL;
 +  uv__req_unregister(stream->loop, req);
 +
 +  if (error < 0 || QUEUE_EMPTY(&stream->write_queue)) {
 +    uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT);
 +  }
 +
 +  if (req->cb)
 +    req->cb(req, error);
 +
 +  if (uv__stream_fd(stream) == -1)
 +    return;
 +
 +  if (error < 0) {
 +    uv__stream_flush_write_queue(stream, -ECANCELED);
 +    uv__write_callbacks(stream);
 +  }
 +}
 +
 +
 +int uv_write2(uv_write_t* req,
 +              uv_stream_t* stream,
 +              const uv_buf_t bufs[],
 +              unsigned int nbufs,
 +              uv_stream_t* send_handle,
 +              uv_write_cb cb) {
 +  int empty_queue;
 +
 +  assert(nbufs > 0);
 +  assert((stream->type == UV_TCP ||
 +          stream->type == UV_NAMED_PIPE ||
 +          stream->type == UV_TTY) &&
 +         "uv_write (unix) does not yet support other types of streams");
 +
 +  if (uv__stream_fd(stream) < 0)
 +    return -EBADF;
 +
 +  if (send_handle) {
 +    if (stream->type != UV_NAMED_PIPE || !((uv_pipe_t*)stream)->ipc)
 +      return -EINVAL;
 +
 +    /* XXX We abuse uv_write2() to send over UDP handles to child processes.
 +     * Don't call uv__stream_fd() on those handles, it's a macro that on OS X
 +     * evaluates to a function that operates on a uv_stream_t with a couple of
 +     * OS X specific fields. On other Unices it does (handle)->io_watcher.fd,
 +     * which works but only by accident.
 +     */
 +    if (uv__handle_fd((uv_handle_t*) send_handle) < 0)
 +      return -EBADF;
 +
 +#if defined(__CYGWIN__) || defined(__MSYS__)
 +    /* Cygwin recvmsg always sets msg_controllen to zero, so we cannot send it.
 +       See https://github.com/mirror/newlib-cygwin/blob/86fc4bf0/winsup/cygwin/fhandler_socket.cc#L1736-L1743 */
 +    return -ENOSYS;
 +#endif
 +  }
 +
 +  /* It's legal for write_queue_size > 0 even when the write_queue is empty;
 +   * it means there are error-state requests in the write_completed_queue that
 +   * will touch up write_queue_size later, see also uv__write_req_finish().
 +   * We could check that write_queue is empty instead but that implies making
 +   * a write() syscall when we know that the handle is in error mode.
 +   */
 +  empty_queue = (stream->write_queue_size == 0);
 +
 +  /* Initialize the req */
 +  uv__req_init(stream->loop, req, UV_WRITE);
 +  req->cb = cb;
 +  req->handle = stream;
 +  req->error = 0;
 +  req->send_handle = send_handle;
 +  QUEUE_INIT(&req->queue);
 +
 +  req->bufs = req->bufsml;
 +  if (nbufs > ARRAY_SIZE(req->bufsml))
 +    req->bufs = uv__malloc(nbufs * sizeof(bufs[0]));
 +
 +  if (req->bufs == NULL)
 +    return -ENOMEM;
 +
 +  memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0]));
 +  req->nbufs = nbufs;
 +  req->write_index = 0;
 +  stream->write_queue_size += uv__count_bufs(bufs, nbufs);
 +
 +  /* Append the request to write_queue. */
 +  QUEUE_INSERT_TAIL(&stream->write_queue, &req->queue);
 +
 +  /* If the queue was empty when this function began, we should attempt to
 +   * do the write immediately. Otherwise start the write_watcher and wait
 +   * for the fd to become writable.
 +   */
 +  if (stream->connect_req) {
 +    /* Still connecting, do nothing. */
 +  }
 +  else if (empty_queue) {
 +    uv__write(stream);
 +  }
 +  else {
 +    /*
 +     * blocking streams should never have anything in the queue.
 +     * if this assert fires then somehow the blocking stream isn't being
 +     * sufficiently flushed in uv__write.
 +     */
 +    assert(!(stream->flags & UV_STREAM_BLOCKING));
 +    uv__io_start(stream->loop, &stream->io_watcher, POLLOUT);
 +    uv__stream_osx_interrupt_select(stream);
 +  }
 +
 +  return 0;
 +}
 +
 +
 +/* The buffers to be written must remain valid until the callback is called.
 + * This is not required for the uv_buf_t array.
 + */
 +int uv_write(uv_write_t* req,
 +             uv_stream_t* handle,
 +             const uv_buf_t bufs[],
 +             unsigned int nbufs,
 +             uv_write_cb cb) {
 +  return uv_write2(req, handle, bufs, nbufs, NULL, cb);
 +}
 +
 +
 +void uv_try_write_cb(uv_write_t* req, int status) {
 +  /* Should not be called */
 +  abort();
 +}
 +
 +
 +int uv_try_write(uv_stream_t* stream,
 +                 const uv_buf_t bufs[],
 +                 unsigned int nbufs) {
 +  int r;
 +  int has_pollout;
 +  size_t written;
 +  size_t req_size;
 +  uv_write_t req;
 +
 +  /* Connecting or already writing some data */
 +  if (stream->connect_req != NULL || stream->write_queue_size != 0)
 +    return -EAGAIN;
 +
 +  has_pollout = uv__io_active(&stream->io_watcher, POLLOUT);
 +
 +  r = uv_write(&req, stream, bufs, nbufs, uv_try_write_cb);
 +  if (r != 0)
 +    return r;
 +
 +  /* Remove not written bytes from write queue size */
 +  written = uv__count_bufs(bufs, nbufs);
 +  if (req.bufs != NULL)
 +    req_size = uv__write_req_size(&req);
 +  else
 +    req_size = 0;
 +  written -= req_size;
 +  stream->write_queue_size -= req_size;
 +
 +  /* Unqueue request, regardless of immediateness */
 +  QUEUE_REMOVE(&req.queue);
 +  uv__req_unregister(stream->loop, &req);
 +  if (req.bufs != req.bufsml)
 +    uv__free(req.bufs);
 +  req.bufs = NULL;
 +
 +  /* Do not poll for writable, if we wasn't before calling this */
 +  if (!has_pollout) {
 +    uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT);
 +    uv__stream_osx_interrupt_select(stream);
 +  }
 +
 +  if (written == 0 && req_size != 0)
 +    return -EAGAIN;
 +  else
 +    return written;
 +}
 +
 +
 +int uv_read_start(uv_stream_t* stream,
 +                  uv_alloc_cb alloc_cb,
 +                  uv_read_cb read_cb) {
 +  assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE ||
 +      stream->type == UV_TTY);
 +
 +  if (stream->flags & UV_CLOSING)
 +    return -EINVAL;
 +
 +  /* The UV_STREAM_READING flag is irrelevant of the state of the tcp - it just
 +   * expresses the desired state of the user.
 +   */
 +  stream->flags |= UV_STREAM_READING;
 +
 +  /* TODO: try to do the read inline? */
 +  /* TODO: keep track of tcp state. If we've gotten a EOF then we should
 +   * not start the IO watcher.
 +   */
 +  assert(uv__stream_fd(stream) >= 0);
 +  assert(alloc_cb);
 +
 +  stream->read_cb = read_cb;
 +  stream->alloc_cb = alloc_cb;
 +
 +  uv__io_start(stream->loop, &stream->io_watcher, POLLIN);
 +  uv__handle_start(stream);
 +  uv__stream_osx_interrupt_select(stream);
 +
 +  return 0;
 +}
 +
 +
 +int uv_read_stop(uv_stream_t* stream) {
 +  if (!(stream->flags & UV_STREAM_READING))
 +    return 0;
 +
 +  stream->flags &= ~UV_STREAM_READING;
 +  uv__io_stop(stream->loop, &stream->io_watcher, POLLIN);
 +  if (!uv__io_active(&stream->io_watcher, POLLOUT))
 +    uv__handle_stop(stream);
 +  uv__stream_osx_interrupt_select(stream);
 +
 +  stream->read_cb = NULL;
 +  stream->alloc_cb = NULL;
 +  return 0;
 +}
 +
 +
 +int uv_is_readable(const uv_stream_t* stream) {
 +  return !!(stream->flags & UV_STREAM_READABLE);
 +}
 +
 +
 +int uv_is_writable(const uv_stream_t* stream) {
 +  return !!(stream->flags & UV_STREAM_WRITABLE);
 +}
 +
 +
 +#if defined(__APPLE__) && !defined(CMAKE_BOOTSTRAP)
 +int uv___stream_fd(const uv_stream_t* handle) {
 +  const uv__stream_select_t* s;
 +
 +  assert(handle->type == UV_TCP ||
 +         handle->type == UV_TTY ||
 +         handle->type == UV_NAMED_PIPE);
 +
 +  s = handle->select;
 +  if (s != NULL)
 +    return s->fd;
 +
 +  return handle->io_watcher.fd;
 +}
 +#endif /* defined(__APPLE__) */
 +
 +
 +void uv__stream_close(uv_stream_t* handle) {
 +  unsigned int i;
 +  uv__stream_queued_fds_t* queued_fds;
 +
 +#if defined(__APPLE__) && !defined(CMAKE_BOOTSTRAP)
 +  /* Terminate select loop first */
 +  if (handle->select != NULL) {
 +    uv__stream_select_t* s;
 +
 +    s = handle->select;
 +
 +    uv_sem_post(&s->close_sem);
 +    uv_sem_post(&s->async_sem);
 +    uv__stream_osx_interrupt_select(handle);
 +    uv_thread_join(&s->thread);
 +    uv_sem_destroy(&s->close_sem);
 +    uv_sem_destroy(&s->async_sem);
 +    uv__close(s->fake_fd);
 +    uv__close(s->int_fd);
 +    uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close);
 +
 +    handle->select = NULL;
 +  }
 +#endif /* defined(__APPLE__) */
 +
 +  uv__io_close(handle->loop, &handle->io_watcher);
 +  uv_read_stop(handle);
 +  uv__handle_stop(handle);
 +
 +  if (handle->io_watcher.fd != -1) {
 +    /* Don't close stdio file descriptors.  Nothing good comes from it. */
 +    if (handle->io_watcher.fd > STDERR_FILENO)
 +      uv__close(handle->io_watcher.fd);
 +    handle->io_watcher.fd = -1;
 +  }
 +
 +  if (handle->accepted_fd != -1) {
 +    uv__close(handle->accepted_fd);
 +    handle->accepted_fd = -1;
 +  }
 +
 +  /* Close all queued fds */
 +  if (handle->queued_fds != NULL) {
 +    queued_fds = handle->queued_fds;
 +    for (i = 0; i < queued_fds->offset; i++)
 +      uv__close(queued_fds->fds[i]);
 +    uv__free(handle->queued_fds);
 +    handle->queued_fds = NULL;
 +  }
 +
 +  assert(!uv__io_active(&handle->io_watcher, POLLIN | POLLOUT));
 +}
 +
 +
 +int uv_stream_set_blocking(uv_stream_t* handle, int blocking) {
 +  /* Don't need to check the file descriptor, uv__nonblock()
 +   * will fail with EBADF if it's not valid.
 +   */
 +  return uv__nonblock(uv__stream_fd(handle), !blocking);
 +}
diff --cc Utilities/cmlibuv/src/unix/sunos.c
index 041f3f3,0000000..d6f9527
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/unix/sunos.c
+++ b/Utilities/cmlibuv/src/unix/sunos.c
@@@ -1,825 -1,0 +1,825 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#include "uv.h"
 +#include "internal.h"
 +
 +#include <stdio.h>
 +#include <stdint.h>
 +#include <stdlib.h>
 +#include <string.h>
 +#include <assert.h>
 +#include <errno.h>
 +
 +#if !defined(SUNOS_NO_IFADDRS) && _XOPEN_SOURCE < 600
 +#define SUNOS_NO_IFADDRS
 +#endif
 +
 +#ifndef SUNOS_NO_IFADDRS
 +# include <ifaddrs.h>
 +#endif
 +#include <net/if.h>
 +#include <net/if_dl.h>
 +#include <net/if_arp.h>
 +#include <sys/sockio.h>
 +
 +#include <sys/loadavg.h>
 +#include <sys/time.h>
 +#include <unistd.h>
 +#include <kstat.h>
 +#include <fcntl.h>
 +
 +#include <sys/port.h>
 +#include <port.h>
 +
 +#define PORT_FIRED 0x69
 +#define PORT_UNUSED 0x0
 +#define PORT_LOADED 0x99
 +#define PORT_DELETED -1
 +
 +#if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64)
 +#define PROCFS_FILE_OFFSET_BITS_HACK 1
 +#undef _FILE_OFFSET_BITS
 +#else
 +#define PROCFS_FILE_OFFSET_BITS_HACK 0
 +#endif
 +
 +#include <procfs.h>
 +
 +#if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1)
 +#define _FILE_OFFSET_BITS 64
 +#endif
 +
 +
 +int uv__platform_loop_init(uv_loop_t* loop) {
 +  int err;
 +  int fd;
 +
 +  loop->fs_fd = -1;
 +  loop->backend_fd = -1;
 +
 +  fd = port_create();
 +  if (fd == -1)
 +    return -errno;
 +
 +  err = uv__cloexec(fd, 1);
 +  if (err) {
 +    uv__close(fd);
 +    return err;
 +  }
 +  loop->backend_fd = fd;
 +
 +  return 0;
 +}
 +
 +
 +void uv__platform_loop_delete(uv_loop_t* loop) {
 +  if (loop->fs_fd != -1) {
 +    uv__close(loop->fs_fd);
 +    loop->fs_fd = -1;
 +  }
 +
 +  if (loop->backend_fd != -1) {
 +    uv__close(loop->backend_fd);
 +    loop->backend_fd = -1;
 +  }
 +}
 +
 +
 +int uv__io_fork(uv_loop_t* loop) {
 +#if defined(PORT_SOURCE_FILE)
 +  if (loop->fs_fd != -1) {
 +    /* stop the watcher before we blow away its fileno */
 +    uv__io_stop(loop, &loop->fs_event_watcher, POLLIN);
 +  }
 +#endif
 +  uv__platform_loop_delete(loop);
 +  return uv__platform_loop_init(loop);
 +}
 +
 +
 +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) {
 +  struct port_event* events;
 +  uintptr_t i;
 +  uintptr_t nfds;
 +
 +  assert(loop->watchers != NULL);
 +
 +  events = (struct port_event*) loop->watchers[loop->nwatchers];
 +  nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1];
 +  if (events == NULL)
 +    return;
 +
 +  /* Invalidate events with same file descriptor */
 +  for (i = 0; i < nfds; i++)
 +    if ((int) events[i].portev_object == fd)
 +      events[i].portev_object = -1;
 +}
 +
 +
 +int uv__io_check_fd(uv_loop_t* loop, int fd) {
 +  if (port_associate(loop->backend_fd, PORT_SOURCE_FD, fd, POLLIN, 0))
 +    return -errno;
 +
 +  if (port_dissociate(loop->backend_fd, PORT_SOURCE_FD, fd))
 +    abort();
 +
 +  return 0;
 +}
 +
 +
 +void uv__io_poll(uv_loop_t* loop, int timeout) {
 +  struct port_event events[1024];
 +  struct port_event* pe;
 +  struct timespec spec;
 +  QUEUE* q;
 +  uv__io_t* w;
 +  sigset_t* pset;
 +  sigset_t set;
 +  uint64_t base;
 +  uint64_t diff;
 +  unsigned int nfds;
 +  unsigned int i;
 +  int saved_errno;
 +  int have_signals;
 +  int nevents;
 +  int count;
 +  int err;
 +  int fd;
 +
 +  if (loop->nfds == 0) {
 +    assert(QUEUE_EMPTY(&loop->watcher_queue));
 +    return;
 +  }
 +
 +  while (!QUEUE_EMPTY(&loop->watcher_queue)) {
 +    q = QUEUE_HEAD(&loop->watcher_queue);
 +    QUEUE_REMOVE(q);
 +    QUEUE_INIT(q);
 +
 +    w = QUEUE_DATA(q, uv__io_t, watcher_queue);
 +    assert(w->pevents != 0);
 +
 +    if (port_associate(loop->backend_fd, PORT_SOURCE_FD, w->fd, w->pevents, 0))
 +      abort();
 +
 +    w->events = w->pevents;
 +  }
 +
 +  pset = NULL;
 +  if (loop->flags & UV_LOOP_BLOCK_SIGPROF) {
 +    pset = &set;
 +    sigemptyset(pset);
 +    sigaddset(pset, SIGPROF);
 +  }
 +
 +  assert(timeout >= -1);
 +  base = loop->time;
 +  count = 48; /* Benchmarks suggest this gives the best throughput. */
 +
 +  for (;;) {
 +    if (timeout != -1) {
 +      spec.tv_sec = timeout / 1000;
 +      spec.tv_nsec = (timeout % 1000) * 1000000;
 +    }
 +
 +    /* Work around a kernel bug where nfds is not updated. */
 +    events[0].portev_source = 0;
 +
 +    nfds = 1;
 +    saved_errno = 0;
 +
 +    if (pset != NULL)
 +      pthread_sigmask(SIG_BLOCK, pset, NULL);
 +
 +    err = port_getn(loop->backend_fd,
 +                    events,
 +                    ARRAY_SIZE(events),
 +                    &nfds,
 +                    timeout == -1 ? NULL : &spec);
 +
 +    if (pset != NULL)
 +      pthread_sigmask(SIG_UNBLOCK, pset, NULL);
 +
 +    if (err) {
 +      /* Work around another kernel bug: port_getn() may return events even
 +       * on error.
 +       */
 +      if (errno == EINTR || errno == ETIME)
 +        saved_errno = errno;
 +      else
 +        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
 +     * operating system didn't reschedule our process while in the syscall.
 +     */
 +    SAVE_ERRNO(uv__update_time(loop));
 +
 +    if (events[0].portev_source == 0) {
 +      if (timeout == 0)
 +        return;
 +
 +      if (timeout == -1)
 +        continue;
 +
 +      goto update_timeout;
 +    }
 +
 +    if (nfds == 0) {
 +      assert(timeout != -1);
 +      return;
 +    }
 +
 +    have_signals = 0;
 +    nevents = 0;
 +
 +    assert(loop->watchers != NULL);
 +    loop->watchers[loop->nwatchers] = (void*) events;
 +    loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds;
 +    for (i = 0; i < nfds; i++) {
 +      pe = events + i;
 +      fd = pe->portev_object;
 +
 +      /* Skip invalidated events, see uv__platform_invalidate_fd */
 +      if (fd == -1)
 +        continue;
 +
 +      assert(fd >= 0);
 +      assert((unsigned) fd < loop->nwatchers);
 +
 +      w = loop->watchers[fd];
 +
 +      /* File descriptor that we've stopped watching, ignore. */
 +      if (w == NULL)
 +        continue;
 +
 +      /* Run signal watchers last.  This also affects child process watchers
 +       * because those are implemented in terms of signal watchers.
 +       */
 +      if (w == &loop->signal_io_watcher)
 +        have_signals = 1;
 +      else
 +        w->cb(loop, w, pe->portev_events);
 +
 +      nevents++;
 +
 +      if (w != loop->watchers[fd])
 +        continue;  /* Disabled by callback. */
 +
 +      /* Events Ports operates in oneshot mode, rearm timer on next run. */
 +      if (w->pevents != 0 && QUEUE_EMPTY(&w->watcher_queue))
 +        QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue);
 +    }
 +
 +    if (have_signals != 0)
 +      loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN);
 +
 +    loop->watchers[loop->nwatchers] = NULL;
 +    loop->watchers[loop->nwatchers + 1] = NULL;
 +
 +    if (have_signals != 0)
 +      return;  /* Event loop should cycle now so don't poll again. */
 +
 +    if (nevents != 0) {
 +      if (nfds == ARRAY_SIZE(events) && --count != 0) {
 +        /* Poll for more events but don't block this time. */
 +        timeout = 0;
 +        continue;
 +      }
 +      return;
 +    }
 +
 +    if (saved_errno == ETIME) {
 +      assert(timeout != -1);
 +      return;
 +    }
 +
 +    if (timeout == 0)
 +      return;
 +
 +    if (timeout == -1)
 +      continue;
 +
 +update_timeout:
 +    assert(timeout > 0);
 +
 +    diff = loop->time - base;
 +    if (diff >= (uint64_t) timeout)
 +      return;
 +
 +    timeout -= diff;
 +  }
 +}
 +
 +
 +uint64_t uv__hrtime(uv_clocktype_t type) {
 +  return gethrtime();
 +}
 +
 +
 +/*
 + * We could use a static buffer for the path manipulations that we need outside
 + * of the function, but this function could be called by multiple consumers and
 + * we don't want to potentially create a race condition in the use of snprintf.
 + */
 +int uv_exepath(char* buffer, size_t* size) {
 +  ssize_t res;
 +  char buf[128];
 +
 +  if (buffer == NULL || size == NULL || *size == 0)
 +    return -EINVAL;
 +
 +  snprintf(buf, sizeof(buf), "/proc/%lu/path/a.out", (unsigned long) getpid());
 +
 +  res = *size - 1;
 +  if (res > 0)
 +    res = readlink(buf, buffer, res);
 +
 +  if (res == -1)
 +    return -errno;
 +
 +  buffer[res] = '\0';
 +  *size = res;
 +  return 0;
 +}
 +
 +
 +uint64_t uv_get_free_memory(void) {
 +  return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES);
 +}
 +
 +
 +uint64_t uv_get_total_memory(void) {
 +  return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES);
 +}
 +
 +
 +void uv_loadavg(double avg[3]) {
 +  (void) getloadavg(avg, 3);
 +}
 +
 +
 +#if defined(PORT_SOURCE_FILE)
 +
 +static int uv__fs_event_rearm(uv_fs_event_t *handle) {
 +  if (handle->fd == -1)
 +    return -EBADF;
 +
 +  if (port_associate(handle->loop->fs_fd,
 +                     PORT_SOURCE_FILE,
 +                     (uintptr_t) &handle->fo,
 +                     FILE_ATTRIB | FILE_MODIFIED,
 +                     handle) == -1) {
 +    return -errno;
 +  }
 +  handle->fd = PORT_LOADED;
 +
 +  return 0;
 +}
 +
 +
 +static void uv__fs_event_read(uv_loop_t* loop,
 +                              uv__io_t* w,
 +                              unsigned int revents) {
 +  uv_fs_event_t *handle = NULL;
 +  timespec_t timeout;
 +  port_event_t pe;
 +  int events;
 +  int r;
 +
 +  (void) w;
 +  (void) revents;
 +
 +  do {
 +    uint_t n = 1;
 +
 +    /*
 +     * Note that our use of port_getn() here (and not port_get()) is deliberate:
 +     * there is a bug in event ports (Sun bug 6456558) whereby a zeroed timeout
 +     * causes port_get() to return success instead of ETIME when there aren't
 +     * actually any events (!); by using port_getn() in lieu of port_get(),
 +     * we can at least workaround the bug by checking for zero returned events
 +     * and treating it as we would ETIME.
 +     */
 +    do {
 +      memset(&timeout, 0, sizeof timeout);
 +      r = port_getn(loop->fs_fd, &pe, 1, &n, &timeout);
 +    }
 +    while (r == -1 && errno == EINTR);
 +
 +    if ((r == -1 && errno == ETIME) || n == 0)
 +      break;
 +
 +    handle = (uv_fs_event_t*) pe.portev_user;
 +    assert((r == 0) && "unexpected port_get() error");
 +
 +    events = 0;
 +    if (pe.portev_events & (FILE_ATTRIB | FILE_MODIFIED))
 +      events |= UV_CHANGE;
 +    if (pe.portev_events & ~(FILE_ATTRIB | FILE_MODIFIED))
 +      events |= UV_RENAME;
 +    assert(events != 0);
 +    handle->fd = PORT_FIRED;
 +    handle->cb(handle, NULL, events, 0);
 +
 +    if (handle->fd != PORT_DELETED) {
 +      r = uv__fs_event_rearm(handle);
 +      if (r != 0)
 +        handle->cb(handle, NULL, 0, r);
 +    }
 +  }
 +  while (handle->fd != PORT_DELETED);
 +}
 +
 +
 +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) {
 +  uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT);
 +  return 0;
 +}
 +
 +
 +int uv_fs_event_start(uv_fs_event_t* handle,
 +                      uv_fs_event_cb cb,
 +                      const char* path,
 +                      unsigned int flags) {
 +  int portfd;
 +  int first_run;
 +  int err;
 +
 +  if (uv__is_active(handle))
 +    return -EINVAL;
 +
 +  first_run = 0;
 +  if (handle->loop->fs_fd == -1) {
 +    portfd = port_create();
 +    if (portfd == -1)
 +      return -errno;
 +    handle->loop->fs_fd = portfd;
 +    first_run = 1;
 +  }
 +
 +  uv__handle_start(handle);
 +  handle->path = uv__strdup(path);
 +  handle->fd = PORT_UNUSED;
 +  handle->cb = cb;
 +
 +  memset(&handle->fo, 0, sizeof handle->fo);
 +  handle->fo.fo_name = handle->path;
 +  err = uv__fs_event_rearm(handle);
 +  if (err != 0) {
 +    uv_fs_event_stop(handle);
 +    return err;
 +  }
 +
 +  if (first_run) {
 +    uv__io_init(&handle->loop->fs_event_watcher, uv__fs_event_read, portfd);
 +    uv__io_start(handle->loop, &handle->loop->fs_event_watcher, POLLIN);
 +  }
 +
 +  return 0;
 +}
 +
 +
 +int uv_fs_event_stop(uv_fs_event_t* handle) {
 +  if (!uv__is_active(handle))
 +    return 0;
 +
 +  if (handle->fd == PORT_FIRED || handle->fd == PORT_LOADED) {
 +    port_dissociate(handle->loop->fs_fd,
 +                    PORT_SOURCE_FILE,
 +                    (uintptr_t) &handle->fo);
 +  }
 +
 +  handle->fd = PORT_DELETED;
 +  uv__free(handle->path);
 +  handle->path = NULL;
 +  handle->fo.fo_name = NULL;
 +  uv__handle_stop(handle);
 +
 +  return 0;
 +}
 +
 +void uv__fs_event_close(uv_fs_event_t* handle) {
 +  uv_fs_event_stop(handle);
 +}
 +
 +#else /* !defined(PORT_SOURCE_FILE) */
 +
 +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) {
 +  return -ENOSYS;
 +}
 +
 +
 +int uv_fs_event_start(uv_fs_event_t* handle,
 +                      uv_fs_event_cb cb,
 +                      const char* filename,
 +                      unsigned int flags) {
 +  return -ENOSYS;
 +}
 +
 +
 +int uv_fs_event_stop(uv_fs_event_t* handle) {
 +  return -ENOSYS;
 +}
 +
 +
 +void uv__fs_event_close(uv_fs_event_t* handle) {
 +  UNREACHABLE();
 +}
 +
 +#endif /* defined(PORT_SOURCE_FILE) */
 +
 +
 +int uv_resident_set_memory(size_t* rss) {
 +  psinfo_t psinfo;
 +  int err;
 +  int fd;
 +
 +  fd = open("/proc/self/psinfo", O_RDONLY);
 +  if (fd == -1)
 +    return -errno;
 +
 +  /* FIXME(bnoordhuis) Handle EINTR. */
 +  err = -EINVAL;
 +  if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) {
 +    *rss = (size_t)psinfo.pr_rssize * 1024;
 +    err = 0;
 +  }
 +  uv__close(fd);
 +
 +  return err;
 +}
 +
 +
 +int uv_uptime(double* uptime) {
 +  kstat_ctl_t   *kc;
 +  kstat_t       *ksp;
 +  kstat_named_t *knp;
 +
 +  long hz = sysconf(_SC_CLK_TCK);
 +
 +  kc = kstat_open();
 +  if (kc == NULL)
 +    return -EPERM;
 +
 +  ksp = kstat_lookup(kc, (char*) "unix", 0, (char*) "system_misc");
 +  if (kstat_read(kc, ksp, NULL) == -1) {
 +    *uptime = -1;
 +  } else {
 +    knp = (kstat_named_t*)  kstat_data_lookup(ksp, (char*) "clk_intr");
 +    *uptime = knp->value.ul / hz;
 +  }
 +  kstat_close(kc);
 +
 +  return 0;
 +}
 +
 +
 +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
 +  int           lookup_instance;
 +  kstat_ctl_t   *kc;
 +  kstat_t       *ksp;
 +  kstat_named_t *knp;
 +  uv_cpu_info_t* cpu_info;
 +
 +  kc = kstat_open();
 +  if (kc == NULL)
 +    return -EPERM;
 +
 +  /* Get count of cpus */
 +  lookup_instance = 0;
 +  while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) {
 +    lookup_instance++;
 +  }
 +
 +  *cpu_infos = uv__malloc(lookup_instance * sizeof(**cpu_infos));
 +  if (!(*cpu_infos)) {
 +    kstat_close(kc);
 +    return -ENOMEM;
 +  }
 +
 +  *count = lookup_instance;
 +
 +  cpu_info = *cpu_infos;
 +  lookup_instance = 0;
 +  while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) {
 +    if (kstat_read(kc, ksp, NULL) == -1) {
 +      cpu_info->speed = 0;
 +      cpu_info->model = NULL;
 +    } else {
 +      knp = kstat_data_lookup(ksp, (char*) "clock_MHz");
 +      assert(knp->data_type == KSTAT_DATA_INT32 ||
 +             knp->data_type == KSTAT_DATA_INT64);
 +      cpu_info->speed = (knp->data_type == KSTAT_DATA_INT32) ? knp->value.i32
 +                                                             : knp->value.i64;
 +
 +      knp = kstat_data_lookup(ksp, (char*) "brand");
 +      assert(knp->data_type == KSTAT_DATA_STRING);
 +      cpu_info->model = uv__strdup(KSTAT_NAMED_STR_PTR(knp));
 +    }
 +
 +    lookup_instance++;
 +    cpu_info++;
 +  }
 +
 +  cpu_info = *cpu_infos;
 +  lookup_instance = 0;
 +  for (;;) {
 +    ksp = kstat_lookup(kc, (char*) "cpu", lookup_instance, (char*) "sys");
 +
 +    if (ksp == NULL)
 +      break;
 +
 +    if (kstat_read(kc, ksp, NULL) == -1) {
 +      cpu_info->cpu_times.user = 0;
 +      cpu_info->cpu_times.nice = 0;
 +      cpu_info->cpu_times.sys = 0;
 +      cpu_info->cpu_times.idle = 0;
 +      cpu_info->cpu_times.irq = 0;
 +    } else {
 +      knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_user");
 +      assert(knp->data_type == KSTAT_DATA_UINT64);
 +      cpu_info->cpu_times.user = knp->value.ui64;
 +
 +      knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_kernel");
 +      assert(knp->data_type == KSTAT_DATA_UINT64);
 +      cpu_info->cpu_times.sys = knp->value.ui64;
 +
 +      knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_idle");
 +      assert(knp->data_type == KSTAT_DATA_UINT64);
 +      cpu_info->cpu_times.idle = knp->value.ui64;
 +
 +      knp = kstat_data_lookup(ksp, (char*) "intr");
 +      assert(knp->data_type == KSTAT_DATA_UINT64);
 +      cpu_info->cpu_times.irq = knp->value.ui64;
 +      cpu_info->cpu_times.nice = 0;
 +    }
 +
 +    lookup_instance++;
 +    cpu_info++;
 +  }
 +
 +  kstat_close(kc);
 +
 +  return 0;
 +}
 +
 +
 +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
 +  int i;
 +
 +  for (i = 0; i < count; i++) {
 +    uv__free(cpu_infos[i].model);
 +  }
 +
 +  uv__free(cpu_infos);
 +}
 +
 +#ifdef SUNOS_NO_IFADDRS
 +int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
 +  return -ENOSYS;
 +}
 +#else  /* SUNOS_NO_IFADDRS */
 +/*
 + * Inspired By:
 + * https://blogs.oracle.com/paulie/entry/retrieving_mac_address_in_solaris
 + * http://www.pauliesworld.org/project/getmac.c
 + */
 +static int uv__set_phys_addr(uv_interface_address_t* address,
 +                             struct ifaddrs* ent) {
 +
 +  struct sockaddr_dl* sa_addr;
 +  int sockfd;
 +  int i;
 +  struct arpreq arpreq;
 +
 +  /* This appears to only work as root */
 +  sa_addr = (struct sockaddr_dl*)(ent->ifa_addr);
 +  memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr));
 +  for (i = 0; i < sizeof(address->phys_addr); i++) {
 +    if (address->phys_addr[i] != 0)
 +      return 0;
 +  }
 +  memset(&arpreq, 0, sizeof(arpreq));
 +  if (address->address.address4.sin_family == AF_INET) {
 +    struct sockaddr_in* sin = ((struct sockaddr_in*)&arpreq.arp_pa);
 +    sin->sin_addr.s_addr = address->address.address4.sin_addr.s_addr;
 +  } else if (address->address.address4.sin_family == AF_INET6) {
 +    struct sockaddr_in6* sin = ((struct sockaddr_in6*)&arpreq.arp_pa);
 +    memcpy(sin->sin6_addr.s6_addr,
 +           address->address.address6.sin6_addr.s6_addr,
 +           sizeof(address->address.address6.sin6_addr.s6_addr));
 +  } else {
 +    return 0;
 +  }
 +
 +  sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 +  if (sockfd < 0)
 +    return -errno;
 +
 +  if (ioctl(sockfd, SIOCGARP, (char*)&arpreq) == -1) {
 +    uv__close(sockfd);
 +    return -errno;
 +  }
 +  memcpy(address->phys_addr, arpreq.arp_ha.sa_data, sizeof(address->phys_addr));
 +  uv__close(sockfd);
 +  return 0;
 +}
 +
 +
 +static int uv__ifaddr_exclude(struct ifaddrs *ent) {
 +  if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)))
 +    return 1;
 +  if (ent->ifa_addr == NULL)
 +    return 1;
-   if (ent->ifa_addr->sa_family == PF_PACKET)
++  if (ent->ifa_addr->sa_family != AF_INET &&
++      ent->ifa_addr->sa_family != AF_INET6)
 +    return 1;
 +  return 0;
 +}
 +
 +int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
 +  uv_interface_address_t* address;
 +  struct ifaddrs* addrs;
 +  struct ifaddrs* ent;
-   int i;
 +
 +  if (getifaddrs(&addrs))
 +    return -errno;
 +
 +  *count = 0;
 +
 +  /* Count the number of interfaces */
 +  for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
 +    if (uv__ifaddr_exclude(ent))
 +      continue;
 +    (*count)++;
 +  }
 +
 +  *addresses = uv__malloc(*count * sizeof(**addresses));
 +  if (!(*addresses)) {
 +    freeifaddrs(addrs);
 +    return -ENOMEM;
 +  }
 +
 +  address = *addresses;
 +
 +  for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
 +    if (uv__ifaddr_exclude(ent))
 +      continue;
 +
 +    address->name = uv__strdup(ent->ifa_name);
 +
 +    if (ent->ifa_addr->sa_family == AF_INET6) {
 +      address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr);
 +    } else {
 +      address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr);
 +    }
 +
 +    if (ent->ifa_netmask->sa_family == AF_INET6) {
 +      address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask);
 +    } else {
 +      address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask);
 +    }
 +
 +    address->is_internal = !!((ent->ifa_flags & IFF_PRIVATE) ||
 +                           (ent->ifa_flags & IFF_LOOPBACK));
 +
 +    uv__set_phys_addr(address, ent);
 +    address++;
 +  }
 +
 +  freeifaddrs(addrs);
 +
 +  return 0;
 +}
 +#endif  /* SUNOS_NO_IFADDRS */
 +
 +void uv_free_interface_addresses(uv_interface_address_t* addresses,
 +  int count) {
 +  int i;
 +
 +  for (i = 0; i < count; i++) {
 +    uv__free(addresses[i].name);
 +  }
 +
 +  uv__free(addresses);
 +}
diff --cc Utilities/cmlibuv/src/unix/tty.c
index ae1018f,0000000..fc8c3ab
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/unix/tty.c
+++ b/Utilities/cmlibuv/src/unix/tty.c
@@@ -1,333 -1,0 +1,369 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#include "uv.h"
 +#include "internal.h"
 +#include "spinlock.h"
 +
 +#include <stdlib.h>
 +#include <assert.h>
 +#include <unistd.h>
 +#include <termios.h>
 +#include <errno.h>
 +#include <sys/ioctl.h>
 +
 +#if defined(__MVS__) && !defined(IMAXBEL)
 +#define IMAXBEL 0
 +#endif
 +
 +static int orig_termios_fd = -1;
 +static struct termios orig_termios;
 +static uv_spinlock_t termios_spinlock = UV_SPINLOCK_INITIALIZER;
 +
 +static int uv__tty_is_slave(const int fd) {
 +  int result;
 +#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
 +  int dummy;
 +
 +  result = ioctl(fd, TIOCGPTN, &dummy) != 0;
 +#elif defined(__APPLE__)
 +  char dummy[256];
 +
 +  result = ioctl(fd, TIOCPTYGNAME, &dummy) != 0;
++#elif defined(__NetBSD__)
++  /*
++   * NetBSD as an extension returns with ptsname(3) and ptsname_r(3) the slave
++   * device name for both descriptors, the master one and slave one.
++   *
++   * Implement function to compare major device number with pts devices.
++   *
++   * The major numbers are machine-dependent, on NetBSD/amd64 they are
++   * respectively:
++   *  - master tty: ptc - major 6
++   *  - slave tty:  pts - major 5
++   */
++
++  struct stat sb;
++  /* Lookup device's major for the pts driver and cache it. */
++  static devmajor_t pts = NODEVMAJOR;
++
++  if (pts == NODEVMAJOR) {
++    pts = getdevmajor("pts", S_IFCHR);
++    if (pts == NODEVMAJOR)
++      abort();
++  }
++
++  /* Lookup stat structure behind the file descriptor. */
++  if (fstat(fd, &sb) != 0)
++    abort();
++
++  /* Assert character device. */
++  if (!S_ISCHR(sb.st_mode))
++    abort();
++
++  /* Assert valid major. */
++  if (major(sb.st_rdev) == NODEVMAJOR)
++    abort();
++
++  result = (pts == major(sb.st_rdev));
 +#else
 +  /* Fallback to ptsname
 +   */
 +  result = ptsname(fd) == NULL;
 +#endif
 +  return result;
 +}
 +
 +int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) {
 +  uv_handle_type type;
 +  int flags = 0;
 +  int newfd = -1;
 +  int r;
 +  int saved_flags;
 +  char path[256];
 +
 +  /* File descriptors that refer to files cannot be monitored with epoll.
 +   * That restriction also applies to character devices like /dev/random
 +   * (but obviously not /dev/tty.)
 +   */
 +  type = uv_guess_handle(fd);
 +  if (type == UV_FILE || type == UV_UNKNOWN_HANDLE)
 +    return -EINVAL;
 +
 +  /* Reopen the file descriptor when it refers to a tty. This lets us put the
 +   * tty in non-blocking mode without affecting other processes that share it
 +   * with us.
 +   *
 +   * Example: `node | cat` - if we put our fd 0 in non-blocking mode, it also
 +   * affects fd 1 of `cat` because both file descriptors refer to the same
 +   * struct file in the kernel. When we reopen our fd 0, it points to a
 +   * different struct file, hence changing its properties doesn't affect
 +   * other processes.
 +   */
 +  if (type == UV_TTY) {
 +    /* Reopening a pty in master mode won't work either because the reopened
 +     * pty will be in slave mode (*BSD) or reopening will allocate a new
 +     * master/slave pair (Linux). Therefore check if the fd points to a
 +     * slave device.
 +     */
 +    if (uv__tty_is_slave(fd) && ttyname_r(fd, path, sizeof(path)) == 0)
 +      r = uv__open_cloexec(path, O_RDWR);
 +    else
 +      r = -1;
 +
 +    if (r < 0) {
 +      /* fallback to using blocking writes */
 +      if (!readable)
 +        flags |= UV_STREAM_BLOCKING;
 +      goto skip;
 +    }
 +
 +    newfd = r;
 +
 +    r = uv__dup2_cloexec(newfd, fd);
 +    if (r < 0 && r != -EINVAL) {
 +      /* EINVAL means newfd == fd which could conceivably happen if another
 +       * thread called close(fd) between our calls to isatty() and open().
 +       * That's a rather unlikely event but let's handle it anyway.
 +       */
 +      uv__close(newfd);
 +      return r;
 +    }
 +
 +    fd = newfd;
 +  }
 +
 +#if defined(__APPLE__)
 +  /* Save the fd flags in case we need to restore them due to an error. */
 +  do
 +    saved_flags = fcntl(fd, F_GETFL);
 +  while (saved_flags == -1 && errno == EINTR);
 +
 +  if (saved_flags == -1) {
 +    if (newfd != -1)
 +      uv__close(newfd);
 +    return -errno;
 +  }
 +#endif
 +
 +  /* Pacify the compiler. */
 +  (void) &saved_flags;
 +
 +skip:
 +  uv__stream_init(loop, (uv_stream_t*) tty, UV_TTY);
 +
 +  /* If anything fails beyond this point we need to remove the handle from
 +   * the handle queue, since it was added by uv__handle_init in uv_stream_init.
 +   */
 +
 +  if (!(flags & UV_STREAM_BLOCKING))
 +    uv__nonblock(fd, 1);
 +
 +#if defined(__APPLE__)
 +  r = uv__stream_try_select((uv_stream_t*) tty, &fd);
 +  if (r) {
 +    int rc = r;
 +    if (newfd != -1)
 +      uv__close(newfd);
 +    QUEUE_REMOVE(&tty->handle_queue);
 +    do
 +      r = fcntl(fd, F_SETFL, saved_flags);
 +    while (r == -1 && errno == EINTR);
 +    return rc;
 +  }
 +#endif
 +
 +  if (readable)
 +    flags |= UV_STREAM_READABLE;
 +  else
 +    flags |= UV_STREAM_WRITABLE;
 +
 +  uv__stream_open((uv_stream_t*) tty, fd, flags);
 +  tty->mode = UV_TTY_MODE_NORMAL;
 +
 +  return 0;
 +}
 +
 +static void uv__tty_make_raw(struct termios* tio) {
 +  assert(tio != NULL);
 +
 +#if defined __sun || defined __MVS__
 +  /*
 +   * This implementation of cfmakeraw for Solaris and derivatives is taken from
 +   * http://www.perkin.org.uk/posts/solaris-portability-cfmakeraw.html.
 +   */
 +  tio->c_iflag &= ~(IMAXBEL | IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR |
 +                    IGNCR | ICRNL | IXON);
 +  tio->c_oflag &= ~OPOST;
 +  tio->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
 +  tio->c_cflag &= ~(CSIZE | PARENB);
 +  tio->c_cflag |= CS8;
 +#else
 +  cfmakeraw(tio);
 +#endif /* #ifdef __sun */
 +}
 +
 +int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) {
 +  struct termios tmp;
 +  int fd;
 +
 +  if (tty->mode == (int) mode)
 +    return 0;
 +
 +  fd = uv__stream_fd(tty);
 +  if (tty->mode == UV_TTY_MODE_NORMAL && mode != UV_TTY_MODE_NORMAL) {
 +    if (tcgetattr(fd, &tty->orig_termios))
 +      return -errno;
 +
 +    /* This is used for uv_tty_reset_mode() */
 +    uv_spinlock_lock(&termios_spinlock);
 +    if (orig_termios_fd == -1) {
 +      orig_termios = tty->orig_termios;
 +      orig_termios_fd = fd;
 +    }
 +    uv_spinlock_unlock(&termios_spinlock);
 +  }
 +
 +  tmp = tty->orig_termios;
 +  switch (mode) {
 +    case UV_TTY_MODE_NORMAL:
 +      break;
 +    case UV_TTY_MODE_RAW:
 +      tmp.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
 +      tmp.c_oflag |= (ONLCR);
 +      tmp.c_cflag |= (CS8);
 +      tmp.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
 +      tmp.c_cc[VMIN] = 1;
 +      tmp.c_cc[VTIME] = 0;
 +      break;
 +    case UV_TTY_MODE_IO:
 +      uv__tty_make_raw(&tmp);
 +      break;
 +  }
 +
 +  /* Apply changes after draining */
 +  if (tcsetattr(fd, TCSADRAIN, &tmp))
 +    return -errno;
 +
 +  tty->mode = mode;
 +  return 0;
 +}
 +
 +
 +int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) {
 +  struct winsize ws;
 +  int err;
 +
 +  do
 +    err = ioctl(uv__stream_fd(tty), TIOCGWINSZ, &ws);
 +  while (err == -1 && errno == EINTR);
 +
 +  if (err == -1)
 +    return -errno;
 +
 +  *width = ws.ws_col;
 +  *height = ws.ws_row;
 +
 +  return 0;
 +}
 +
 +
 +uv_handle_type uv_guess_handle(uv_file file) {
 +  struct sockaddr sa;
 +  struct stat s;
 +  socklen_t len;
 +  int type;
 +
 +  if (file < 0)
 +    return UV_UNKNOWN_HANDLE;
 +
 +  if (isatty(file))
 +    return UV_TTY;
 +
 +  if (fstat(file, &s))
 +    return UV_UNKNOWN_HANDLE;
 +
 +  if (S_ISREG(s.st_mode))
 +    return UV_FILE;
 +
 +  if (S_ISCHR(s.st_mode))
 +    return UV_FILE;  /* XXX UV_NAMED_PIPE? */
 +
 +  if (S_ISFIFO(s.st_mode))
 +    return UV_NAMED_PIPE;
 +
 +  if (!S_ISSOCK(s.st_mode))
 +    return UV_UNKNOWN_HANDLE;
 +
 +  len = sizeof(type);
 +  if (getsockopt(file, SOL_SOCKET, SO_TYPE, &type, &len))
 +    return UV_UNKNOWN_HANDLE;
 +
 +  len = sizeof(sa);
 +  if (getsockname(file, &sa, &len))
 +    return UV_UNKNOWN_HANDLE;
 +
 +  if (type == SOCK_DGRAM)
 +    if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6)
 +      return UV_UDP;
 +
 +  if (type == SOCK_STREAM) {
 +#if defined(_AIX) || defined(__DragonFly__)
 +    /* on AIX/DragonFly the getsockname call returns an empty sa structure
 +     * for sockets of type AF_UNIX.  For all other types it will
 +     * return a properly filled in structure.
 +     */
 +    if (len == 0)
 +      return UV_NAMED_PIPE;
 +#endif /* defined(_AIX) || defined(__DragonFly__) */
 +
 +    if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6)
 +      return UV_TCP;
 +    if (sa.sa_family == AF_UNIX)
 +      return UV_NAMED_PIPE;
 +  }
 +
 +  return UV_UNKNOWN_HANDLE;
 +}
 +
 +
 +/* This function is async signal-safe, meaning that it's safe to call from
 + * inside a signal handler _unless_ execution was inside uv_tty_set_mode()'s
 + * critical section when the signal was raised.
 + */
 +int uv_tty_reset_mode(void) {
 +  int saved_errno;
 +  int err;
 +
 +  saved_errno = errno;
 +  if (!uv_spinlock_trylock(&termios_spinlock))
 +    return -EBUSY;  /* In uv_tty_set_mode(). */
 +
 +  err = 0;
 +  if (orig_termios_fd != -1)
 +    if (tcsetattr(orig_termios_fd, TCSANOW, &orig_termios))
 +      err = -errno;
 +
 +  uv_spinlock_unlock(&termios_spinlock);
 +  errno = saved_errno;
 +
 +  return err;
 +}
diff --cc Utilities/cmlibuv/src/uv-data-getter-setters.c
index 0000000,533e4a2..533e4a2
mode 000000,100644..100644
--- a/Utilities/cmlibuv/src/uv-data-getter-setters.c
+++ b/Utilities/cmlibuv/src/uv-data-getter-setters.c
diff --cc Utilities/cmlibuv/src/win/internal.h
index 83601d5,0000000..9f28f77
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/win/internal.h
+++ b/Utilities/cmlibuv/src/win/internal.h
@@@ -1,399 -1,0 +1,398 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#ifndef UV_WIN_INTERNAL_H_
 +#define UV_WIN_INTERNAL_H_
 +
 +#if defined(_MSC_VER)
 +# pragma warning(push,1)
 +#endif
 +
 +#include "uv.h"
 +#include "../uv-common.h"
 +
 +#include "tree.h"
 +#include "winapi.h"
 +#include "winsock.h"
 +
 +#ifdef _MSC_VER
 +# define INLINE __inline
 +# define UV_THREAD_LOCAL __declspec( thread )
 +#else
 +# define INLINE inline
 +# define UV_THREAD_LOCAL __thread
 +#endif
 +
 +
 +#ifdef _DEBUG
 +
 +extern UV_THREAD_LOCAL int uv__crt_assert_enabled;
 +
 +#define UV_BEGIN_DISABLE_CRT_ASSERT()                           \
 +  {                                                             \
 +    int uv__saved_crt_assert_enabled = uv__crt_assert_enabled;  \
 +    uv__crt_assert_enabled = FALSE;
 +
 +
 +#define UV_END_DISABLE_CRT_ASSERT()                             \
 +    uv__crt_assert_enabled = uv__saved_crt_assert_enabled;      \
 +  }
 +
 +#else
 +#define UV_BEGIN_DISABLE_CRT_ASSERT()
 +#define UV_END_DISABLE_CRT_ASSERT()
 +#endif
 +
 +/*
 + * Handles
 + * (also see handle-inl.h)
 + */
 +
 +/* Used by all handles. */
 +#define UV_HANDLE_CLOSED                        0x00000002
 +#define UV_HANDLE_ENDGAME_QUEUED                0x00000008
 +
 +/* uv-common.h: #define UV__HANDLE_CLOSING      0x00000001 */
 +/* uv-common.h: #define UV__HANDLE_ACTIVE       0x00000040 */
 +/* uv-common.h: #define UV__HANDLE_REF          0x00000020 */
 +/* uv-common.h: #define UV_HANDLE_INTERNAL      0x00000080 */
 +
 +/* Used by streams and UDP handles. */
 +#define UV_HANDLE_READING                       0x00000100
 +#define UV_HANDLE_BOUND                         0x00000200
 +#define UV_HANDLE_LISTENING                     0x00000800
 +#define UV_HANDLE_CONNECTION                    0x00001000
 +#define UV_HANDLE_READABLE                      0x00008000
 +#define UV_HANDLE_WRITABLE                      0x00010000
 +#define UV_HANDLE_READ_PENDING                  0x00020000
 +#define UV_HANDLE_SYNC_BYPASS_IOCP              0x00040000
 +#define UV_HANDLE_ZERO_READ                     0x00080000
 +#define UV_HANDLE_EMULATE_IOCP                  0x00100000
 +#define UV_HANDLE_BLOCKING_WRITES               0x00200000
 +#define UV_HANDLE_CANCELLATION_PENDING          0x00400000
 +
 +/* Used by uv_tcp_t and uv_udp_t handles */
 +#define UV_HANDLE_IPV6                          0x01000000
 +
 +/* Only used by uv_tcp_t handles. */
 +#define UV_HANDLE_TCP_NODELAY                   0x02000000
 +#define UV_HANDLE_TCP_KEEPALIVE                 0x04000000
 +#define UV_HANDLE_TCP_SINGLE_ACCEPT             0x08000000
 +#define UV_HANDLE_TCP_ACCEPT_STATE_CHANGING     0x10000000
 +#define UV_HANDLE_TCP_SOCKET_CLOSED             0x20000000
 +#define UV_HANDLE_SHARED_TCP_SOCKET             0x40000000
 +
 +/* Only used by uv_pipe_t handles. */
 +#define UV_HANDLE_NON_OVERLAPPED_PIPE           0x01000000
 +#define UV_HANDLE_PIPESERVER                    0x02000000
 +#define UV_HANDLE_PIPE_READ_CANCELABLE          0x04000000
 +
 +/* Only used by uv_tty_t handles. */
 +#define UV_HANDLE_TTY_READABLE                  0x01000000
 +#define UV_HANDLE_TTY_RAW                       0x02000000
 +#define UV_HANDLE_TTY_SAVED_POSITION            0x04000000
 +#define UV_HANDLE_TTY_SAVED_ATTRIBUTES          0x08000000
 +
 +/* Only used by uv_poll_t handles. */
 +#define UV_HANDLE_POLL_SLOW                     0x02000000
 +
 +
 +/*
 + * Requests: see req-inl.h
 + */
 +
 +
 +/*
 + * Streams: see stream-inl.h
 + */
 +
 +
 +/*
 + * TCP
 + */
 +
 +typedef struct {
 +  WSAPROTOCOL_INFOW socket_info;
 +  int delayed_error;
 +} uv__ipc_socket_info_ex;
 +
 +int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb);
 +int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client);
 +int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb,
 +    uv_read_cb read_cb);
 +int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle,
 +    const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb);
 +int uv__tcp_try_write(uv_tcp_t* handle, const uv_buf_t bufs[],
 +    unsigned int nbufs);
 +
 +void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req);
 +void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle,
 +    uv_write_t* req);
 +void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle,
 +    uv_req_t* req);
 +void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle,
 +    uv_connect_t* req);
 +
 +void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp);
 +void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle);
 +
 +int uv_tcp_import(uv_tcp_t* tcp, uv__ipc_socket_info_ex* socket_info_ex,
 +    int tcp_connection);
 +
 +int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid,
 +    LPWSAPROTOCOL_INFOW protocol_info);
 +
 +
 +/*
 + * UDP
 + */
 +void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req);
 +void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle,
 +    uv_udp_send_t* req);
 +
 +void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle);
 +void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle);
 +
 +
 +/*
 + * Pipes
 + */
 +int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access,
 +    char* name, size_t nameSize);
 +
 +int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb);
 +int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client);
 +int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb,
 +    uv_read_cb read_cb);
 +int uv_pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle,
 +    const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb);
 +int uv_pipe_write2(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle,
 +    const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle,
 +    uv_write_cb cb);
 +void uv__pipe_pause_read(uv_pipe_t* handle);
 +void uv__pipe_unpause_read(uv_pipe_t* handle);
 +void uv__pipe_stop_read(uv_pipe_t* handle);
 +
 +void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle,
 +    uv_req_t* req);
 +void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle,
 +    uv_write_t* req);
 +void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle,
 +    uv_req_t* raw_req);
 +void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle,
 +    uv_connect_t* req);
 +void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle,
 +    uv_shutdown_t* req);
 +
 +void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle);
 +void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle);
 +void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle);
 +
 +
 +/*
 + * TTY
 + */
 +void uv_console_init(void);
 +
 +int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb,
 +    uv_read_cb read_cb);
 +int uv_tty_read_stop(uv_tty_t* handle);
 +int uv_tty_write(uv_loop_t* loop, uv_write_t* req, uv_tty_t* handle,
 +    const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb);
 +int uv__tty_try_write(uv_tty_t* handle, const uv_buf_t bufs[],
 +    unsigned int nbufs);
 +void uv_tty_close(uv_tty_t* handle);
 +
 +void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle,
 +    uv_req_t* req);
 +void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle,
 +    uv_write_t* req);
 +/* TODO: remove me */
 +void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle,
 +    uv_req_t* raw_req);
 +/* TODO: remove me */
 +void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle,
 +    uv_connect_t* req);
 +
 +void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle);
 +
 +
 +/*
 + * Poll watchers
 + */
 +void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
 +    uv_req_t* req);
 +
 +int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle);
 +void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle);
 +
 +
 +/*
 + * Timers
 + */
 +void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle);
 +
 +DWORD uv__next_timeout(const uv_loop_t* loop);
 +void uv_process_timers(uv_loop_t* loop);
 +
 +
 +/*
 + * Loop watchers
 + */
 +void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle);
 +
 +void uv_prepare_invoke(uv_loop_t* loop);
 +void uv_check_invoke(uv_loop_t* loop);
 +void uv_idle_invoke(uv_loop_t* loop);
 +
 +void uv__once_init(void);
 +
 +
 +/*
 + * Async watcher
 + */
 +void uv_async_close(uv_loop_t* loop, uv_async_t* handle);
 +void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle);
 +
 +void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle,
 +    uv_req_t* req);
 +
 +
 +/*
 + * Signal watcher
 + */
 +void uv_signals_init(void);
 +int uv__signal_dispatch(int signum);
 +
 +void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle);
 +void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle);
 +
 +void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle,
 +    uv_req_t* req);
 +
 +
 +/*
 + * Spawn
 + */
 +void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle);
 +void uv_process_close(uv_loop_t* loop, uv_process_t* handle);
 +void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle);
 +
 +
 +/*
 + * Error
 + */
 +int uv_translate_sys_error(int sys_errno);
 +
 +
 +/*
 + * FS
 + */
 +void uv_fs_init(void);
 +
 +
 +/*
 + * FS Event
 + */
 +void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req,
 +    uv_fs_event_t* handle);
 +void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle);
 +void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle);
 +
 +
 +/*
 + * Stat poller.
 + */
 +void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle);
 +
 +
 +/*
 + * Utilities.
 + */
 +void uv__util_init(void);
 +
 +uint64_t uv__hrtime(double scale);
- int uv_parent_pid(void);
 +int uv_current_pid(void);
 +__declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall);
 +int uv__getpwuid_r(uv_passwd_t* pwd);
 +int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8);
 +int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16);
 +
 +
 +/*
 + * Process stdio handles.
 + */
 +int uv__stdio_create(uv_loop_t* loop,
 +                     const uv_process_options_t* options,
 +                     BYTE** buffer_ptr);
 +void uv__stdio_destroy(BYTE* buffer);
 +void uv__stdio_noinherit(BYTE* buffer);
 +int uv__stdio_verify(BYTE* buffer, WORD size);
 +WORD uv__stdio_size(BYTE* buffer);
 +HANDLE uv__stdio_handle(BYTE* buffer, int fd);
 +
 +
 +/*
 + * Winapi and ntapi utility functions
 + */
 +void uv_winapi_init(void);
 +
 +
 +/*
 + * Winsock utility functions
 + */
 +void uv_winsock_init(void);
 +
 +int uv_ntstatus_to_winsock_error(NTSTATUS status);
 +
 +BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target);
 +BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target);
 +
 +int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers,
 +    DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped,
 +    LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
 +int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers,
 +    DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr,
 +    int* addr_len, WSAOVERLAPPED *overlapped,
 +    LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
 +
 +int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in,
 +    AFD_POLL_INFO* info_out, OVERLAPPED* overlapped);
 +
 +/* Whether there are any non-IFS LSPs stacked on TCP */
 +extern int uv_tcp_non_ifs_lsp_ipv4;
 +extern int uv_tcp_non_ifs_lsp_ipv6;
 +
 +/* Ip address used to bind to any port at any interface */
 +extern struct sockaddr_in uv_addr_ip4_any_;
 +extern struct sockaddr_in6 uv_addr_ip6_any_;
 +
 +/*
 + * Wake all loops with fake message
 + */
 +void uv__wake_all_loops(void);
 +
 +/*
 + * Init system wake-up detection
 + */
 +void uv__init_detect_system_wakeup(void);
 +
 +#endif /* UV_WIN_INTERNAL_H_ */
diff --cc Utilities/cmlibuv/src/win/winapi.h
index 4b0eeca,0000000..8993c65
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/win/winapi.h
+++ b/Utilities/cmlibuv/src/win/winapi.h
@@@ -1,4761 -1,0 +1,4787 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#ifndef UV_WIN_WINAPI_H_
 +#define UV_WIN_WINAPI_H_
 +
 +#include <windows.h>
 +
 +
 +/*
 + * Ntdll headers
 + */
 +#ifndef STATUS_SEVERITY_SUCCESS
 +# define STATUS_SEVERITY_SUCCESS 0x0
 +#endif
 +
 +#ifndef STATUS_SEVERITY_INFORMATIONAL
 +# define STATUS_SEVERITY_INFORMATIONAL 0x1
 +#endif
 +
 +#ifndef STATUS_SEVERITY_WARNING
 +# define STATUS_SEVERITY_WARNING 0x2
 +#endif
 +
 +#ifndef STATUS_SEVERITY_ERROR
 +# define STATUS_SEVERITY_ERROR 0x3
 +#endif
 +
 +#ifndef FACILITY_NTWIN32
 +# define FACILITY_NTWIN32 0x7
 +#endif
 +
 +#ifndef NT_SUCCESS
 +# define NT_SUCCESS(status) (((NTSTATUS) (status)) >= 0)
 +#endif
 +
 +#ifndef NT_INFORMATION
 +# define NT_INFORMATION(status) ((((ULONG) (status)) >> 30) == 1)
 +#endif
 +
 +#ifndef NT_WARNING
 +# define NT_WARNING(status) ((((ULONG) (status)) >> 30) == 2)
 +#endif
 +
 +#ifndef NT_ERROR
 +# define NT_ERROR(status) ((((ULONG) (status)) >> 30) == 3)
 +#endif
 +
 +#ifndef STATUS_SUCCESS
 +# define STATUS_SUCCESS ((NTSTATUS) 0x00000000L)
 +#endif
 +
 +#ifndef STATUS_WAIT_0
 +# define STATUS_WAIT_0 ((NTSTATUS) 0x00000000L)
 +#endif
 +
 +#ifndef STATUS_WAIT_1
 +# define STATUS_WAIT_1 ((NTSTATUS) 0x00000001L)
 +#endif
 +
 +#ifndef STATUS_WAIT_2
 +# define STATUS_WAIT_2 ((NTSTATUS) 0x00000002L)
 +#endif
 +
 +#ifndef STATUS_WAIT_3
 +# define STATUS_WAIT_3 ((NTSTATUS) 0x00000003L)
 +#endif
 +
 +#ifndef STATUS_WAIT_63
 +# define STATUS_WAIT_63 ((NTSTATUS) 0x0000003FL)
 +#endif
 +
 +#ifndef STATUS_ABANDONED
 +# define STATUS_ABANDONED ((NTSTATUS) 0x00000080L)
 +#endif
 +
 +#ifndef STATUS_ABANDONED_WAIT_0
 +# define STATUS_ABANDONED_WAIT_0 ((NTSTATUS) 0x00000080L)
 +#endif
 +
 +#ifndef STATUS_ABANDONED_WAIT_63
 +# define STATUS_ABANDONED_WAIT_63 ((NTSTATUS) 0x000000BFL)
 +#endif
 +
 +#ifndef STATUS_USER_APC
 +# define STATUS_USER_APC ((NTSTATUS) 0x000000C0L)
 +#endif
 +
 +#ifndef STATUS_KERNEL_APC
 +# define STATUS_KERNEL_APC ((NTSTATUS) 0x00000100L)
 +#endif
 +
 +#ifndef STATUS_ALERTED
 +# define STATUS_ALERTED ((NTSTATUS) 0x00000101L)
 +#endif
 +
 +#ifndef STATUS_TIMEOUT
 +# define STATUS_TIMEOUT ((NTSTATUS) 0x00000102L)
 +#endif
 +
 +#ifndef STATUS_PENDING
 +# define STATUS_PENDING ((NTSTATUS) 0x00000103L)
 +#endif
 +
 +#ifndef STATUS_REPARSE
 +# define STATUS_REPARSE ((NTSTATUS) 0x00000104L)
 +#endif
 +
 +#ifndef STATUS_MORE_ENTRIES
 +# define STATUS_MORE_ENTRIES ((NTSTATUS) 0x00000105L)
 +#endif
 +
 +#ifndef STATUS_NOT_ALL_ASSIGNED
 +# define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS) 0x00000106L)
 +#endif
 +
 +#ifndef STATUS_SOME_NOT_MAPPED
 +# define STATUS_SOME_NOT_MAPPED ((NTSTATUS) 0x00000107L)
 +#endif
 +
 +#ifndef STATUS_OPLOCK_BREAK_IN_PROGRESS
 +# define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS) 0x00000108L)
 +#endif
 +
 +#ifndef STATUS_VOLUME_MOUNTED
 +# define STATUS_VOLUME_MOUNTED ((NTSTATUS) 0x00000109L)
 +#endif
 +
 +#ifndef STATUS_RXACT_COMMITTED
 +# define STATUS_RXACT_COMMITTED ((NTSTATUS) 0x0000010AL)
 +#endif
 +
 +#ifndef STATUS_NOTIFY_CLEANUP
 +# define STATUS_NOTIFY_CLEANUP ((NTSTATUS) 0x0000010BL)
 +#endif
 +
 +#ifndef STATUS_NOTIFY_ENUM_DIR
 +# define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS) 0x0000010CL)
 +#endif
 +
 +#ifndef STATUS_NO_QUOTAS_FOR_ACCOUNT
 +# define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS) 0x0000010DL)
 +#endif
 +
 +#ifndef STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED
 +# define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS) 0x0000010EL)
 +#endif
 +
 +#ifndef STATUS_PAGE_FAULT_TRANSITION
 +# define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS) 0x00000110L)
 +#endif
 +
 +#ifndef STATUS_PAGE_FAULT_DEMAND_ZERO
 +# define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS) 0x00000111L)
 +#endif
 +
 +#ifndef STATUS_PAGE_FAULT_COPY_ON_WRITE
 +# define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS) 0x00000112L)
 +#endif
 +
 +#ifndef STATUS_PAGE_FAULT_GUARD_PAGE
 +# define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS) 0x00000113L)
 +#endif
 +
 +#ifndef STATUS_PAGE_FAULT_PAGING_FILE
 +# define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS) 0x00000114L)
 +#endif
 +
 +#ifndef STATUS_CACHE_PAGE_LOCKED
 +# define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS) 0x00000115L)
 +#endif
 +
 +#ifndef STATUS_CRASH_DUMP
 +# define STATUS_CRASH_DUMP ((NTSTATUS) 0x00000116L)
 +#endif
 +
 +#ifndef STATUS_BUFFER_ALL_ZEROS
 +# define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS) 0x00000117L)
 +#endif
 +
 +#ifndef STATUS_REPARSE_OBJECT
 +# define STATUS_REPARSE_OBJECT ((NTSTATUS) 0x00000118L)
 +#endif
 +
 +#ifndef STATUS_RESOURCE_REQUIREMENTS_CHANGED
 +# define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS) 0x00000119L)
 +#endif
 +
 +#ifndef STATUS_TRANSLATION_COMPLETE
 +# define STATUS_TRANSLATION_COMPLETE ((NTSTATUS) 0x00000120L)
 +#endif
 +
 +#ifndef STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY
 +# define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS) 0x00000121L)
 +#endif
 +
 +#ifndef STATUS_NOTHING_TO_TERMINATE
 +# define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS) 0x00000122L)
 +#endif
 +
 +#ifndef STATUS_PROCESS_NOT_IN_JOB
 +# define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS) 0x00000123L)
 +#endif
 +
 +#ifndef STATUS_PROCESS_IN_JOB
 +# define STATUS_PROCESS_IN_JOB ((NTSTATUS) 0x00000124L)
 +#endif
 +
 +#ifndef STATUS_VOLSNAP_HIBERNATE_READY
 +# define STATUS_VOLSNAP_HIBERNATE_READY ((NTSTATUS) 0x00000125L)
 +#endif
 +
 +#ifndef STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY
 +# define STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY ((NTSTATUS) 0x00000126L)
 +#endif
 +
 +#ifndef STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED
 +# define STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED ((NTSTATUS) 0x00000127L)
 +#endif
 +
 +#ifndef STATUS_INTERRUPT_STILL_CONNECTED
 +# define STATUS_INTERRUPT_STILL_CONNECTED ((NTSTATUS) 0x00000128L)
 +#endif
 +
 +#ifndef STATUS_PROCESS_CLONED
 +# define STATUS_PROCESS_CLONED ((NTSTATUS) 0x00000129L)
 +#endif
 +
 +#ifndef STATUS_FILE_LOCKED_WITH_ONLY_READERS
 +# define STATUS_FILE_LOCKED_WITH_ONLY_READERS ((NTSTATUS) 0x0000012AL)
 +#endif
 +
 +#ifndef STATUS_FILE_LOCKED_WITH_WRITERS
 +# define STATUS_FILE_LOCKED_WITH_WRITERS ((NTSTATUS) 0x0000012BL)
 +#endif
 +
 +#ifndef STATUS_RESOURCEMANAGER_READ_ONLY
 +# define STATUS_RESOURCEMANAGER_READ_ONLY ((NTSTATUS) 0x00000202L)
 +#endif
 +
 +#ifndef STATUS_RING_PREVIOUSLY_EMPTY
 +# define STATUS_RING_PREVIOUSLY_EMPTY ((NTSTATUS) 0x00000210L)
 +#endif
 +
 +#ifndef STATUS_RING_PREVIOUSLY_FULL
 +# define STATUS_RING_PREVIOUSLY_FULL ((NTSTATUS) 0x00000211L)
 +#endif
 +
 +#ifndef STATUS_RING_PREVIOUSLY_ABOVE_QUOTA
 +# define STATUS_RING_PREVIOUSLY_ABOVE_QUOTA ((NTSTATUS) 0x00000212L)
 +#endif
 +
 +#ifndef STATUS_RING_NEWLY_EMPTY
 +# define STATUS_RING_NEWLY_EMPTY ((NTSTATUS) 0x00000213L)
 +#endif
 +
 +#ifndef STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT
 +# define STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT ((NTSTATUS) 0x00000214L)
 +#endif
 +
 +#ifndef STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE
 +# define STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE ((NTSTATUS) 0x00000215L)
 +#endif
 +
 +#ifndef STATUS_OPLOCK_HANDLE_CLOSED
 +# define STATUS_OPLOCK_HANDLE_CLOSED ((NTSTATUS) 0x00000216L)
 +#endif
 +
 +#ifndef STATUS_WAIT_FOR_OPLOCK
 +# define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS) 0x00000367L)
 +#endif
 +
 +#ifndef STATUS_OBJECT_NAME_EXISTS
 +# define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS) 0x40000000L)
 +#endif
 +
 +#ifndef STATUS_THREAD_WAS_SUSPENDED
 +# define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS) 0x40000001L)
 +#endif
 +
 +#ifndef STATUS_WORKING_SET_LIMIT_RANGE
 +# define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS) 0x40000002L)
 +#endif
 +
 +#ifndef STATUS_IMAGE_NOT_AT_BASE
 +# define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS) 0x40000003L)
 +#endif
 +
 +#ifndef STATUS_RXACT_STATE_CREATED
 +# define STATUS_RXACT_STATE_CREATED ((NTSTATUS) 0x40000004L)
 +#endif
 +
 +#ifndef STATUS_SEGMENT_NOTIFICATION
 +# define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS) 0x40000005L)
 +#endif
 +
 +#ifndef STATUS_LOCAL_USER_SESSION_KEY
 +# define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS) 0x40000006L)
 +#endif
 +
 +#ifndef STATUS_BAD_CURRENT_DIRECTORY
 +# define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS) 0x40000007L)
 +#endif
 +
 +#ifndef STATUS_SERIAL_MORE_WRITES
 +# define STATUS_SERIAL_MORE_WRITES ((NTSTATUS) 0x40000008L)
 +#endif
 +
 +#ifndef STATUS_REGISTRY_RECOVERED
 +# define STATUS_REGISTRY_RECOVERED ((NTSTATUS) 0x40000009L)
 +#endif
 +
 +#ifndef STATUS_FT_READ_RECOVERY_FROM_BACKUP
 +# define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS) 0x4000000AL)
 +#endif
 +
 +#ifndef STATUS_FT_WRITE_RECOVERY
 +# define STATUS_FT_WRITE_RECOVERY ((NTSTATUS) 0x4000000BL)
 +#endif
 +
 +#ifndef STATUS_SERIAL_COUNTER_TIMEOUT
 +# define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS) 0x4000000CL)
 +#endif
 +
 +#ifndef STATUS_NULL_LM_PASSWORD
 +# define STATUS_NULL_LM_PASSWORD ((NTSTATUS) 0x4000000DL)
 +#endif
 +
 +#ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH
 +# define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS) 0x4000000EL)
 +#endif
 +
 +#ifndef STATUS_RECEIVE_PARTIAL
 +# define STATUS_RECEIVE_PARTIAL ((NTSTATUS) 0x4000000FL)
 +#endif
 +
 +#ifndef STATUS_RECEIVE_EXPEDITED
 +# define STATUS_RECEIVE_EXPEDITED ((NTSTATUS) 0x40000010L)
 +#endif
 +
 +#ifndef STATUS_RECEIVE_PARTIAL_EXPEDITED
 +# define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS) 0x40000011L)
 +#endif
 +
 +#ifndef STATUS_EVENT_DONE
 +# define STATUS_EVENT_DONE ((NTSTATUS) 0x40000012L)
 +#endif
 +
 +#ifndef STATUS_EVENT_PENDING
 +# define STATUS_EVENT_PENDING ((NTSTATUS) 0x40000013L)
 +#endif
 +
 +#ifndef STATUS_CHECKING_FILE_SYSTEM
 +# define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS) 0x40000014L)
 +#endif
 +
 +#ifndef STATUS_FATAL_APP_EXIT
 +# define STATUS_FATAL_APP_EXIT ((NTSTATUS) 0x40000015L)
 +#endif
 +
 +#ifndef STATUS_PREDEFINED_HANDLE
 +# define STATUS_PREDEFINED_HANDLE ((NTSTATUS) 0x40000016L)
 +#endif
 +
 +#ifndef STATUS_WAS_UNLOCKED
 +# define STATUS_WAS_UNLOCKED ((NTSTATUS) 0x40000017L)
 +#endif
 +
 +#ifndef STATUS_SERVICE_NOTIFICATION
 +# define STATUS_SERVICE_NOTIFICATION ((NTSTATUS) 0x40000018L)
 +#endif
 +
 +#ifndef STATUS_WAS_LOCKED
 +# define STATUS_WAS_LOCKED ((NTSTATUS) 0x40000019L)
 +#endif
 +
 +#ifndef STATUS_LOG_HARD_ERROR
 +# define STATUS_LOG_HARD_ERROR ((NTSTATUS) 0x4000001AL)
 +#endif
 +
 +#ifndef STATUS_ALREADY_WIN32
 +# define STATUS_ALREADY_WIN32 ((NTSTATUS) 0x4000001BL)
 +#endif
 +
 +#ifndef STATUS_WX86_UNSIMULATE
 +# define STATUS_WX86_UNSIMULATE ((NTSTATUS) 0x4000001CL)
 +#endif
 +
 +#ifndef STATUS_WX86_CONTINUE
 +# define STATUS_WX86_CONTINUE ((NTSTATUS) 0x4000001DL)
 +#endif
 +
 +#ifndef STATUS_WX86_SINGLE_STEP
 +# define STATUS_WX86_SINGLE_STEP ((NTSTATUS) 0x4000001EL)
 +#endif
 +
 +#ifndef STATUS_WX86_BREAKPOINT
 +# define STATUS_WX86_BREAKPOINT ((NTSTATUS) 0x4000001FL)
 +#endif
 +
 +#ifndef STATUS_WX86_EXCEPTION_CONTINUE
 +# define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS) 0x40000020L)
 +#endif
 +
 +#ifndef STATUS_WX86_EXCEPTION_LASTCHANCE
 +# define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS) 0x40000021L)
 +#endif
 +
 +#ifndef STATUS_WX86_EXCEPTION_CHAIN
 +# define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS) 0x40000022L)
 +#endif
 +
 +#ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE
 +# define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS) 0x40000023L)
 +#endif
 +
 +#ifndef STATUS_NO_YIELD_PERFORMED
 +# define STATUS_NO_YIELD_PERFORMED ((NTSTATUS) 0x40000024L)
 +#endif
 +
 +#ifndef STATUS_TIMER_RESUME_IGNORED
 +# define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS) 0x40000025L)
 +#endif
 +
 +#ifndef STATUS_ARBITRATION_UNHANDLED
 +# define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS) 0x40000026L)
 +#endif
 +
 +#ifndef STATUS_CARDBUS_NOT_SUPPORTED
 +# define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS) 0x40000027L)
 +#endif
 +
 +#ifndef STATUS_WX86_CREATEWX86TIB
 +# define STATUS_WX86_CREATEWX86TIB ((NTSTATUS) 0x40000028L)
 +#endif
 +
 +#ifndef STATUS_MP_PROCESSOR_MISMATCH
 +# define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS) 0x40000029L)
 +#endif
 +
 +#ifndef STATUS_HIBERNATED
 +# define STATUS_HIBERNATED ((NTSTATUS) 0x4000002AL)
 +#endif
 +
 +#ifndef STATUS_RESUME_HIBERNATION
 +# define STATUS_RESUME_HIBERNATION ((NTSTATUS) 0x4000002BL)
 +#endif
 +
 +#ifndef STATUS_FIRMWARE_UPDATED
 +# define STATUS_FIRMWARE_UPDATED ((NTSTATUS) 0x4000002CL)
 +#endif
 +
 +#ifndef STATUS_DRIVERS_LEAKING_LOCKED_PAGES
 +# define STATUS_DRIVERS_LEAKING_LOCKED_PAGES ((NTSTATUS) 0x4000002DL)
 +#endif
 +
 +#ifndef STATUS_MESSAGE_RETRIEVED
 +# define STATUS_MESSAGE_RETRIEVED ((NTSTATUS) 0x4000002EL)
 +#endif
 +
 +#ifndef STATUS_SYSTEM_POWERSTATE_TRANSITION
 +# define STATUS_SYSTEM_POWERSTATE_TRANSITION ((NTSTATUS) 0x4000002FL)
 +#endif
 +
 +#ifndef STATUS_ALPC_CHECK_COMPLETION_LIST
 +# define STATUS_ALPC_CHECK_COMPLETION_LIST ((NTSTATUS) 0x40000030L)
 +#endif
 +
 +#ifndef STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION
 +# define STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION ((NTSTATUS) 0x40000031L)
 +#endif
 +
 +#ifndef STATUS_ACCESS_AUDIT_BY_POLICY
 +# define STATUS_ACCESS_AUDIT_BY_POLICY ((NTSTATUS) 0x40000032L)
 +#endif
 +
 +#ifndef STATUS_ABANDON_HIBERFILE
 +# define STATUS_ABANDON_HIBERFILE ((NTSTATUS) 0x40000033L)
 +#endif
 +
 +#ifndef STATUS_BIZRULES_NOT_ENABLED
 +# define STATUS_BIZRULES_NOT_ENABLED ((NTSTATUS) 0x40000034L)
 +#endif
 +
 +#ifndef STATUS_GUARD_PAGE_VIOLATION
 +# define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS) 0x80000001L)
 +#endif
 +
 +#ifndef STATUS_DATATYPE_MISALIGNMENT
 +# define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS) 0x80000002L)
 +#endif
 +
 +#ifndef STATUS_BREAKPOINT
 +# define STATUS_BREAKPOINT ((NTSTATUS) 0x80000003L)
 +#endif
 +
 +#ifndef STATUS_SINGLE_STEP
 +# define STATUS_SINGLE_STEP ((NTSTATUS) 0x80000004L)
 +#endif
 +
 +#ifndef STATUS_BUFFER_OVERFLOW
 +# define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005L)
 +#endif
 +
 +#ifndef STATUS_NO_MORE_FILES
 +# define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006L)
 +#endif
 +
 +#ifndef STATUS_WAKE_SYSTEM_DEBUGGER
 +# define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS) 0x80000007L)
 +#endif
 +
 +#ifndef STATUS_HANDLES_CLOSED
 +# define STATUS_HANDLES_CLOSED ((NTSTATUS) 0x8000000AL)
 +#endif
 +
 +#ifndef STATUS_NO_INHERITANCE
 +# define STATUS_NO_INHERITANCE ((NTSTATUS) 0x8000000BL)
 +#endif
 +
 +#ifndef STATUS_GUID_SUBSTITUTION_MADE
 +# define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS) 0x8000000CL)
 +#endif
 +
 +#ifndef STATUS_PARTIAL_COPY
 +# define STATUS_PARTIAL_COPY ((NTSTATUS) 0x8000000DL)
 +#endif
 +
 +#ifndef STATUS_DEVICE_PAPER_EMPTY
 +# define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS) 0x8000000EL)
 +#endif
 +
 +#ifndef STATUS_DEVICE_POWERED_OFF
 +# define STATUS_DEVICE_POWERED_OFF ((NTSTATUS) 0x8000000FL)
 +#endif
 +
 +#ifndef STATUS_DEVICE_OFF_LINE
 +# define STATUS_DEVICE_OFF_LINE ((NTSTATUS) 0x80000010L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_BUSY
 +# define STATUS_DEVICE_BUSY ((NTSTATUS) 0x80000011L)
 +#endif
 +
 +#ifndef STATUS_NO_MORE_EAS
 +# define STATUS_NO_MORE_EAS ((NTSTATUS) 0x80000012L)
 +#endif
 +
 +#ifndef STATUS_INVALID_EA_NAME
 +# define STATUS_INVALID_EA_NAME ((NTSTATUS) 0x80000013L)
 +#endif
 +
 +#ifndef STATUS_EA_LIST_INCONSISTENT
 +# define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS) 0x80000014L)
 +#endif
 +
 +#ifndef STATUS_INVALID_EA_FLAG
 +# define STATUS_INVALID_EA_FLAG ((NTSTATUS) 0x80000015L)
 +#endif
 +
 +#ifndef STATUS_VERIFY_REQUIRED
 +# define STATUS_VERIFY_REQUIRED ((NTSTATUS) 0x80000016L)
 +#endif
 +
 +#ifndef STATUS_EXTRANEOUS_INFORMATION
 +# define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS) 0x80000017L)
 +#endif
 +
 +#ifndef STATUS_RXACT_COMMIT_NECESSARY
 +# define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS) 0x80000018L)
 +#endif
 +
 +#ifndef STATUS_NO_MORE_ENTRIES
 +# define STATUS_NO_MORE_ENTRIES ((NTSTATUS) 0x8000001AL)
 +#endif
 +
 +#ifndef STATUS_FILEMARK_DETECTED
 +# define STATUS_FILEMARK_DETECTED ((NTSTATUS) 0x8000001BL)
 +#endif
 +
 +#ifndef STATUS_MEDIA_CHANGED
 +# define STATUS_MEDIA_CHANGED ((NTSTATUS) 0x8000001CL)
 +#endif
 +
 +#ifndef STATUS_BUS_RESET
 +# define STATUS_BUS_RESET ((NTSTATUS) 0x8000001DL)
 +#endif
 +
 +#ifndef STATUS_END_OF_MEDIA
 +# define STATUS_END_OF_MEDIA ((NTSTATUS) 0x8000001EL)
 +#endif
 +
 +#ifndef STATUS_BEGINNING_OF_MEDIA
 +# define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS) 0x8000001FL)
 +#endif
 +
 +#ifndef STATUS_MEDIA_CHECK
 +# define STATUS_MEDIA_CHECK ((NTSTATUS) 0x80000020L)
 +#endif
 +
 +#ifndef STATUS_SETMARK_DETECTED
 +# define STATUS_SETMARK_DETECTED ((NTSTATUS) 0x80000021L)
 +#endif
 +
 +#ifndef STATUS_NO_DATA_DETECTED
 +# define STATUS_NO_DATA_DETECTED ((NTSTATUS) 0x80000022L)
 +#endif
 +
 +#ifndef STATUS_REDIRECTOR_HAS_OPEN_HANDLES
 +# define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000023L)
 +#endif
 +
 +#ifndef STATUS_SERVER_HAS_OPEN_HANDLES
 +# define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000024L)
 +#endif
 +
 +#ifndef STATUS_ALREADY_DISCONNECTED
 +# define STATUS_ALREADY_DISCONNECTED ((NTSTATUS) 0x80000025L)
 +#endif
 +
 +#ifndef STATUS_LONGJUMP
 +# define STATUS_LONGJUMP ((NTSTATUS) 0x80000026L)
 +#endif
 +
 +#ifndef STATUS_CLEANER_CARTRIDGE_INSTALLED
 +# define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS) 0x80000027L)
 +#endif
 +
 +#ifndef STATUS_PLUGPLAY_QUERY_VETOED
 +# define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS) 0x80000028L)
 +#endif
 +
 +#ifndef STATUS_UNWIND_CONSOLIDATE
 +# define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS) 0x80000029L)
 +#endif
 +
 +#ifndef STATUS_REGISTRY_HIVE_RECOVERED
 +# define STATUS_REGISTRY_HIVE_RECOVERED ((NTSTATUS) 0x8000002AL)
 +#endif
 +
 +#ifndef STATUS_DLL_MIGHT_BE_INSECURE
 +# define STATUS_DLL_MIGHT_BE_INSECURE ((NTSTATUS) 0x8000002BL)
 +#endif
 +
 +#ifndef STATUS_DLL_MIGHT_BE_INCOMPATIBLE
 +# define STATUS_DLL_MIGHT_BE_INCOMPATIBLE ((NTSTATUS) 0x8000002CL)
 +#endif
 +
 +#ifndef STATUS_STOPPED_ON_SYMLINK
 +# define STATUS_STOPPED_ON_SYMLINK ((NTSTATUS) 0x8000002DL)
 +#endif
 +
 +#ifndef STATUS_CANNOT_GRANT_REQUESTED_OPLOCK
 +# define STATUS_CANNOT_GRANT_REQUESTED_OPLOCK ((NTSTATUS) 0x8000002EL)
 +#endif
 +
 +#ifndef STATUS_NO_ACE_CONDITION
 +# define STATUS_NO_ACE_CONDITION ((NTSTATUS) 0x8000002FL)
 +#endif
 +
 +#ifndef STATUS_UNSUCCESSFUL
 +# define STATUS_UNSUCCESSFUL ((NTSTATUS) 0xC0000001L)
 +#endif
 +
 +#ifndef STATUS_NOT_IMPLEMENTED
 +# define STATUS_NOT_IMPLEMENTED ((NTSTATUS) 0xC0000002L)
 +#endif
 +
 +#ifndef STATUS_INVALID_INFO_CLASS
 +# define STATUS_INVALID_INFO_CLASS ((NTSTATUS) 0xC0000003L)
 +#endif
 +
 +#ifndef STATUS_INFO_LENGTH_MISMATCH
 +# define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004L)
 +#endif
 +
 +#ifndef STATUS_ACCESS_VIOLATION
 +# define STATUS_ACCESS_VIOLATION ((NTSTATUS) 0xC0000005L)
 +#endif
 +
 +#ifndef STATUS_IN_PAGE_ERROR
 +# define STATUS_IN_PAGE_ERROR ((NTSTATUS) 0xC0000006L)
 +#endif
 +
 +#ifndef STATUS_PAGEFILE_QUOTA
 +# define STATUS_PAGEFILE_QUOTA ((NTSTATUS) 0xC0000007L)
 +#endif
 +
 +#ifndef STATUS_INVALID_HANDLE
 +# define STATUS_INVALID_HANDLE ((NTSTATUS) 0xC0000008L)
 +#endif
 +
 +#ifndef STATUS_BAD_INITIAL_STACK
 +# define STATUS_BAD_INITIAL_STACK ((NTSTATUS) 0xC0000009L)
 +#endif
 +
 +#ifndef STATUS_BAD_INITIAL_PC
 +# define STATUS_BAD_INITIAL_PC ((NTSTATUS) 0xC000000AL)
 +#endif
 +
 +#ifndef STATUS_INVALID_CID
 +# define STATUS_INVALID_CID ((NTSTATUS) 0xC000000BL)
 +#endif
 +
 +#ifndef STATUS_TIMER_NOT_CANCELED
 +# define STATUS_TIMER_NOT_CANCELED ((NTSTATUS) 0xC000000CL)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER
 +# define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xC000000DL)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_DEVICE
 +# define STATUS_NO_SUCH_DEVICE ((NTSTATUS) 0xC000000EL)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_FILE
 +# define STATUS_NO_SUCH_FILE ((NTSTATUS) 0xC000000FL)
 +#endif
 +
 +#ifndef STATUS_INVALID_DEVICE_REQUEST
 +# define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xC0000010L)
 +#endif
 +
 +#ifndef STATUS_END_OF_FILE
 +# define STATUS_END_OF_FILE ((NTSTATUS) 0xC0000011L)
 +#endif
 +
 +#ifndef STATUS_WRONG_VOLUME
 +# define STATUS_WRONG_VOLUME ((NTSTATUS) 0xC0000012L)
 +#endif
 +
 +#ifndef STATUS_NO_MEDIA_IN_DEVICE
 +# define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS) 0xC0000013L)
 +#endif
 +
 +#ifndef STATUS_UNRECOGNIZED_MEDIA
 +# define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS) 0xC0000014L)
 +#endif
 +
 +#ifndef STATUS_NONEXISTENT_SECTOR
 +# define STATUS_NONEXISTENT_SECTOR ((NTSTATUS) 0xC0000015L)
 +#endif
 +
 +#ifndef STATUS_MORE_PROCESSING_REQUIRED
 +# define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS) 0xC0000016L)
 +#endif
 +
 +#ifndef STATUS_NO_MEMORY
 +# define STATUS_NO_MEMORY ((NTSTATUS) 0xC0000017L)
 +#endif
 +
 +#ifndef STATUS_CONFLICTING_ADDRESSES
 +# define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS) 0xC0000018L)
 +#endif
 +
 +#ifndef STATUS_NOT_MAPPED_VIEW
 +# define STATUS_NOT_MAPPED_VIEW ((NTSTATUS) 0xC0000019L)
 +#endif
 +
 +#ifndef STATUS_UNABLE_TO_FREE_VM
 +# define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS) 0xC000001AL)
 +#endif
 +
 +#ifndef STATUS_UNABLE_TO_DELETE_SECTION
 +# define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS) 0xC000001BL)
 +#endif
 +
 +#ifndef STATUS_INVALID_SYSTEM_SERVICE
 +# define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS) 0xC000001CL)
 +#endif
 +
 +#ifndef STATUS_ILLEGAL_INSTRUCTION
 +# define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS) 0xC000001DL)
 +#endif
 +
 +#ifndef STATUS_INVALID_LOCK_SEQUENCE
 +# define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS) 0xC000001EL)
 +#endif
 +
 +#ifndef STATUS_INVALID_VIEW_SIZE
 +# define STATUS_INVALID_VIEW_SIZE ((NTSTATUS) 0xC000001FL)
 +#endif
 +
 +#ifndef STATUS_INVALID_FILE_FOR_SECTION
 +# define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS) 0xC0000020L)
 +#endif
 +
 +#ifndef STATUS_ALREADY_COMMITTED
 +# define STATUS_ALREADY_COMMITTED ((NTSTATUS) 0xC0000021L)
 +#endif
 +
 +#ifndef STATUS_ACCESS_DENIED
 +# define STATUS_ACCESS_DENIED ((NTSTATUS) 0xC0000022L)
 +#endif
 +
 +#ifndef STATUS_BUFFER_TOO_SMALL
 +# define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xC0000023L)
 +#endif
 +
 +#ifndef STATUS_OBJECT_TYPE_MISMATCH
 +# define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS) 0xC0000024L)
 +#endif
 +
 +#ifndef STATUS_NONCONTINUABLE_EXCEPTION
 +# define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS) 0xC0000025L)
 +#endif
 +
 +#ifndef STATUS_INVALID_DISPOSITION
 +# define STATUS_INVALID_DISPOSITION ((NTSTATUS) 0xC0000026L)
 +#endif
 +
 +#ifndef STATUS_UNWIND
 +# define STATUS_UNWIND ((NTSTATUS) 0xC0000027L)
 +#endif
 +
 +#ifndef STATUS_BAD_STACK
 +# define STATUS_BAD_STACK ((NTSTATUS) 0xC0000028L)
 +#endif
 +
 +#ifndef STATUS_INVALID_UNWIND_TARGET
 +# define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS) 0xC0000029L)
 +#endif
 +
 +#ifndef STATUS_NOT_LOCKED
 +# define STATUS_NOT_LOCKED ((NTSTATUS) 0xC000002AL)
 +#endif
 +
 +#ifndef STATUS_PARITY_ERROR
 +# define STATUS_PARITY_ERROR ((NTSTATUS) 0xC000002BL)
 +#endif
 +
 +#ifndef STATUS_UNABLE_TO_DECOMMIT_VM
 +# define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS) 0xC000002CL)
 +#endif
 +
 +#ifndef STATUS_NOT_COMMITTED
 +# define STATUS_NOT_COMMITTED ((NTSTATUS) 0xC000002DL)
 +#endif
 +
 +#ifndef STATUS_INVALID_PORT_ATTRIBUTES
 +# define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS) 0xC000002EL)
 +#endif
 +
 +#ifndef STATUS_PORT_MESSAGE_TOO_LONG
 +# define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS) 0xC000002FL)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_MIX
 +# define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS) 0xC0000030L)
 +#endif
 +
 +#ifndef STATUS_INVALID_QUOTA_LOWER
 +# define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS) 0xC0000031L)
 +#endif
 +
 +#ifndef STATUS_DISK_CORRUPT_ERROR
 +# define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS) 0xC0000032L)
 +#endif
 +
 +#ifndef STATUS_OBJECT_NAME_INVALID
 +# define STATUS_OBJECT_NAME_INVALID ((NTSTATUS) 0xC0000033L)
 +#endif
 +
 +#ifndef STATUS_OBJECT_NAME_NOT_FOUND
 +# define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS) 0xC0000034L)
 +#endif
 +
 +#ifndef STATUS_OBJECT_NAME_COLLISION
 +# define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS) 0xC0000035L)
 +#endif
 +
 +#ifndef STATUS_PORT_DISCONNECTED
 +# define STATUS_PORT_DISCONNECTED ((NTSTATUS) 0xC0000037L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_ALREADY_ATTACHED
 +# define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS) 0xC0000038L)
 +#endif
 +
 +#ifndef STATUS_OBJECT_PATH_INVALID
 +# define STATUS_OBJECT_PATH_INVALID ((NTSTATUS) 0xC0000039L)
 +#endif
 +
 +#ifndef STATUS_OBJECT_PATH_NOT_FOUND
 +# define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS) 0xC000003AL)
 +#endif
 +
 +#ifndef STATUS_OBJECT_PATH_SYNTAX_BAD
 +# define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS) 0xC000003BL)
 +#endif
 +
 +#ifndef STATUS_DATA_OVERRUN
 +# define STATUS_DATA_OVERRUN ((NTSTATUS) 0xC000003CL)
 +#endif
 +
 +#ifndef STATUS_DATA_LATE_ERROR
 +# define STATUS_DATA_LATE_ERROR ((NTSTATUS) 0xC000003DL)
 +#endif
 +
 +#ifndef STATUS_DATA_ERROR
 +# define STATUS_DATA_ERROR ((NTSTATUS) 0xC000003EL)
 +#endif
 +
 +#ifndef STATUS_CRC_ERROR
 +# define STATUS_CRC_ERROR ((NTSTATUS) 0xC000003FL)
 +#endif
 +
 +#ifndef STATUS_SECTION_TOO_BIG
 +# define STATUS_SECTION_TOO_BIG ((NTSTATUS) 0xC0000040L)
 +#endif
 +
 +#ifndef STATUS_PORT_CONNECTION_REFUSED
 +# define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS) 0xC0000041L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PORT_HANDLE
 +# define STATUS_INVALID_PORT_HANDLE ((NTSTATUS) 0xC0000042L)
 +#endif
 +
 +#ifndef STATUS_SHARING_VIOLATION
 +# define STATUS_SHARING_VIOLATION ((NTSTATUS) 0xC0000043L)
 +#endif
 +
 +#ifndef STATUS_QUOTA_EXCEEDED
 +# define STATUS_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000044L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PAGE_PROTECTION
 +# define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS) 0xC0000045L)
 +#endif
 +
 +#ifndef STATUS_MUTANT_NOT_OWNED
 +# define STATUS_MUTANT_NOT_OWNED ((NTSTATUS) 0xC0000046L)
 +#endif
 +
 +#ifndef STATUS_SEMAPHORE_LIMIT_EXCEEDED
 +# define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000047L)
 +#endif
 +
 +#ifndef STATUS_PORT_ALREADY_SET
 +# define STATUS_PORT_ALREADY_SET ((NTSTATUS) 0xC0000048L)
 +#endif
 +
 +#ifndef STATUS_SECTION_NOT_IMAGE
 +# define STATUS_SECTION_NOT_IMAGE ((NTSTATUS) 0xC0000049L)
 +#endif
 +
 +#ifndef STATUS_SUSPEND_COUNT_EXCEEDED
 +# define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS) 0xC000004AL)
 +#endif
 +
 +#ifndef STATUS_THREAD_IS_TERMINATING
 +# define STATUS_THREAD_IS_TERMINATING ((NTSTATUS) 0xC000004BL)
 +#endif
 +
 +#ifndef STATUS_BAD_WORKING_SET_LIMIT
 +# define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS) 0xC000004CL)
 +#endif
 +
 +#ifndef STATUS_INCOMPATIBLE_FILE_MAP
 +# define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS) 0xC000004DL)
 +#endif
 +
 +#ifndef STATUS_SECTION_PROTECTION
 +# define STATUS_SECTION_PROTECTION ((NTSTATUS) 0xC000004EL)
 +#endif
 +
 +#ifndef STATUS_EAS_NOT_SUPPORTED
 +# define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS) 0xC000004FL)
 +#endif
 +
 +#ifndef STATUS_EA_TOO_LARGE
 +# define STATUS_EA_TOO_LARGE ((NTSTATUS) 0xC0000050L)
 +#endif
 +
 +#ifndef STATUS_NONEXISTENT_EA_ENTRY
 +# define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS) 0xC0000051L)
 +#endif
 +
 +#ifndef STATUS_NO_EAS_ON_FILE
 +# define STATUS_NO_EAS_ON_FILE ((NTSTATUS) 0xC0000052L)
 +#endif
 +
 +#ifndef STATUS_EA_CORRUPT_ERROR
 +# define STATUS_EA_CORRUPT_ERROR ((NTSTATUS) 0xC0000053L)
 +#endif
 +
 +#ifndef STATUS_FILE_LOCK_CONFLICT
 +# define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS) 0xC0000054L)
 +#endif
 +
 +#ifndef STATUS_LOCK_NOT_GRANTED
 +# define STATUS_LOCK_NOT_GRANTED ((NTSTATUS) 0xC0000055L)
 +#endif
 +
 +#ifndef STATUS_DELETE_PENDING
 +# define STATUS_DELETE_PENDING ((NTSTATUS) 0xC0000056L)
 +#endif
 +
 +#ifndef STATUS_CTL_FILE_NOT_SUPPORTED
 +# define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS) 0xC0000057L)
 +#endif
 +
 +#ifndef STATUS_UNKNOWN_REVISION
 +# define STATUS_UNKNOWN_REVISION ((NTSTATUS) 0xC0000058L)
 +#endif
 +
 +#ifndef STATUS_REVISION_MISMATCH
 +# define STATUS_REVISION_MISMATCH ((NTSTATUS) 0xC0000059L)
 +#endif
 +
 +#ifndef STATUS_INVALID_OWNER
 +# define STATUS_INVALID_OWNER ((NTSTATUS) 0xC000005AL)
 +#endif
 +
 +#ifndef STATUS_INVALID_PRIMARY_GROUP
 +# define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS) 0xC000005BL)
 +#endif
 +
 +#ifndef STATUS_NO_IMPERSONATION_TOKEN
 +# define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS) 0xC000005CL)
 +#endif
 +
 +#ifndef STATUS_CANT_DISABLE_MANDATORY
 +# define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS) 0xC000005DL)
 +#endif
 +
 +#ifndef STATUS_NO_LOGON_SERVERS
 +# define STATUS_NO_LOGON_SERVERS ((NTSTATUS) 0xC000005EL)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_LOGON_SESSION
 +# define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS) 0xC000005FL)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_PRIVILEGE
 +# define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS) 0xC0000060L)
 +#endif
 +
 +#ifndef STATUS_PRIVILEGE_NOT_HELD
 +# define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS) 0xC0000061L)
 +#endif
 +
 +#ifndef STATUS_INVALID_ACCOUNT_NAME
 +# define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS) 0xC0000062L)
 +#endif
 +
 +#ifndef STATUS_USER_EXISTS
 +# define STATUS_USER_EXISTS ((NTSTATUS) 0xC0000063L)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_USER
 +# define STATUS_NO_SUCH_USER ((NTSTATUS) 0xC0000064L)
 +#endif
 +
 +#ifndef STATUS_GROUP_EXISTS
 +# define STATUS_GROUP_EXISTS ((NTSTATUS) 0xC0000065L)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_GROUP
 +# define STATUS_NO_SUCH_GROUP ((NTSTATUS) 0xC0000066L)
 +#endif
 +
 +#ifndef STATUS_MEMBER_IN_GROUP
 +# define STATUS_MEMBER_IN_GROUP ((NTSTATUS) 0xC0000067L)
 +#endif
 +
 +#ifndef STATUS_MEMBER_NOT_IN_GROUP
 +# define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS) 0xC0000068L)
 +#endif
 +
 +#ifndef STATUS_LAST_ADMIN
 +# define STATUS_LAST_ADMIN ((NTSTATUS) 0xC0000069L)
 +#endif
 +
 +#ifndef STATUS_WRONG_PASSWORD
 +# define STATUS_WRONG_PASSWORD ((NTSTATUS) 0xC000006AL)
 +#endif
 +
 +#ifndef STATUS_ILL_FORMED_PASSWORD
 +# define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS) 0xC000006BL)
 +#endif
 +
 +#ifndef STATUS_PASSWORD_RESTRICTION
 +# define STATUS_PASSWORD_RESTRICTION ((NTSTATUS) 0xC000006CL)
 +#endif
 +
 +#ifndef STATUS_LOGON_FAILURE
 +# define STATUS_LOGON_FAILURE ((NTSTATUS) 0xC000006DL)
 +#endif
 +
 +#ifndef STATUS_ACCOUNT_RESTRICTION
 +# define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS) 0xC000006EL)
 +#endif
 +
 +#ifndef STATUS_INVALID_LOGON_HOURS
 +# define STATUS_INVALID_LOGON_HOURS ((NTSTATUS) 0xC000006FL)
 +#endif
 +
 +#ifndef STATUS_INVALID_WORKSTATION
 +# define STATUS_INVALID_WORKSTATION ((NTSTATUS) 0xC0000070L)
 +#endif
 +
 +#ifndef STATUS_PASSWORD_EXPIRED
 +# define STATUS_PASSWORD_EXPIRED ((NTSTATUS) 0xC0000071L)
 +#endif
 +
 +#ifndef STATUS_ACCOUNT_DISABLED
 +# define STATUS_ACCOUNT_DISABLED ((NTSTATUS) 0xC0000072L)
 +#endif
 +
 +#ifndef STATUS_NONE_MAPPED
 +# define STATUS_NONE_MAPPED ((NTSTATUS) 0xC0000073L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_LUIDS_REQUESTED
 +# define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS) 0xC0000074L)
 +#endif
 +
 +#ifndef STATUS_LUIDS_EXHAUSTED
 +# define STATUS_LUIDS_EXHAUSTED ((NTSTATUS) 0xC0000075L)
 +#endif
 +
 +#ifndef STATUS_INVALID_SUB_AUTHORITY
 +# define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS) 0xC0000076L)
 +#endif
 +
 +#ifndef STATUS_INVALID_ACL
 +# define STATUS_INVALID_ACL ((NTSTATUS) 0xC0000077L)
 +#endif
 +
 +#ifndef STATUS_INVALID_SID
 +# define STATUS_INVALID_SID ((NTSTATUS) 0xC0000078L)
 +#endif
 +
 +#ifndef STATUS_INVALID_SECURITY_DESCR
 +# define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS) 0xC0000079L)
 +#endif
 +
 +#ifndef STATUS_PROCEDURE_NOT_FOUND
 +# define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS) 0xC000007AL)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_FORMAT
 +# define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS) 0xC000007BL)
 +#endif
 +
 +#ifndef STATUS_NO_TOKEN
 +# define STATUS_NO_TOKEN ((NTSTATUS) 0xC000007CL)
 +#endif
 +
 +#ifndef STATUS_BAD_INHERITANCE_ACL
 +# define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS) 0xC000007DL)
 +#endif
 +
 +#ifndef STATUS_RANGE_NOT_LOCKED
 +# define STATUS_RANGE_NOT_LOCKED ((NTSTATUS) 0xC000007EL)
 +#endif
 +
 +#ifndef STATUS_DISK_FULL
 +# define STATUS_DISK_FULL ((NTSTATUS) 0xC000007FL)
 +#endif
 +
 +#ifndef STATUS_SERVER_DISABLED
 +# define STATUS_SERVER_DISABLED ((NTSTATUS) 0xC0000080L)
 +#endif
 +
 +#ifndef STATUS_SERVER_NOT_DISABLED
 +# define STATUS_SERVER_NOT_DISABLED ((NTSTATUS) 0xC0000081L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_GUIDS_REQUESTED
 +# define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS) 0xC0000082L)
 +#endif
 +
 +#ifndef STATUS_GUIDS_EXHAUSTED
 +# define STATUS_GUIDS_EXHAUSTED ((NTSTATUS) 0xC0000083L)
 +#endif
 +
 +#ifndef STATUS_INVALID_ID_AUTHORITY
 +# define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS) 0xC0000084L)
 +#endif
 +
 +#ifndef STATUS_AGENTS_EXHAUSTED
 +# define STATUS_AGENTS_EXHAUSTED ((NTSTATUS) 0xC0000085L)
 +#endif
 +
 +#ifndef STATUS_INVALID_VOLUME_LABEL
 +# define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS) 0xC0000086L)
 +#endif
 +
 +#ifndef STATUS_SECTION_NOT_EXTENDED
 +# define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS) 0xC0000087L)
 +#endif
 +
 +#ifndef STATUS_NOT_MAPPED_DATA
 +# define STATUS_NOT_MAPPED_DATA ((NTSTATUS) 0xC0000088L)
 +#endif
 +
 +#ifndef STATUS_RESOURCE_DATA_NOT_FOUND
 +# define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS) 0xC0000089L)
 +#endif
 +
 +#ifndef STATUS_RESOURCE_TYPE_NOT_FOUND
 +# define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS) 0xC000008AL)
 +#endif
 +
 +#ifndef STATUS_RESOURCE_NAME_NOT_FOUND
 +# define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS) 0xC000008BL)
 +#endif
 +
 +#ifndef STATUS_ARRAY_BOUNDS_EXCEEDED
 +# define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS) 0xC000008CL)
 +#endif
 +
 +#ifndef STATUS_FLOAT_DENORMAL_OPERAND
 +# define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS) 0xC000008DL)
 +#endif
 +
 +#ifndef STATUS_FLOAT_DIVIDE_BY_ZERO
 +# define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS) 0xC000008EL)
 +#endif
 +
 +#ifndef STATUS_FLOAT_INEXACT_RESULT
 +# define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS) 0xC000008FL)
 +#endif
 +
 +#ifndef STATUS_FLOAT_INVALID_OPERATION
 +# define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS) 0xC0000090L)
 +#endif
 +
 +#ifndef STATUS_FLOAT_OVERFLOW
 +# define STATUS_FLOAT_OVERFLOW ((NTSTATUS) 0xC0000091L)
 +#endif
 +
 +#ifndef STATUS_FLOAT_STACK_CHECK
 +# define STATUS_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000092L)
 +#endif
 +
 +#ifndef STATUS_FLOAT_UNDERFLOW
 +# define STATUS_FLOAT_UNDERFLOW ((NTSTATUS) 0xC0000093L)
 +#endif
 +
 +#ifndef STATUS_INTEGER_DIVIDE_BY_ZERO
 +# define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS) 0xC0000094L)
 +#endif
 +
 +#ifndef STATUS_INTEGER_OVERFLOW
 +# define STATUS_INTEGER_OVERFLOW ((NTSTATUS) 0xC0000095L)
 +#endif
 +
 +#ifndef STATUS_PRIVILEGED_INSTRUCTION
 +# define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS) 0xC0000096L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_PAGING_FILES
 +# define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS) 0xC0000097L)
 +#endif
 +
 +#ifndef STATUS_FILE_INVALID
 +# define STATUS_FILE_INVALID ((NTSTATUS) 0xC0000098L)
 +#endif
 +
 +#ifndef STATUS_ALLOTTED_SPACE_EXCEEDED
 +# define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS) 0xC0000099L)
 +#endif
 +
 +#ifndef STATUS_INSUFFICIENT_RESOURCES
 +# define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS) 0xC000009AL)
 +#endif
 +
 +#ifndef STATUS_DFS_EXIT_PATH_FOUND
 +# define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS) 0xC000009BL)
 +#endif
 +
 +#ifndef STATUS_DEVICE_DATA_ERROR
 +# define STATUS_DEVICE_DATA_ERROR ((NTSTATUS) 0xC000009CL)
 +#endif
 +
 +#ifndef STATUS_DEVICE_NOT_CONNECTED
 +# define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS) 0xC000009DL)
 +#endif
 +
 +#ifndef STATUS_DEVICE_POWER_FAILURE
 +# define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS) 0xC000009EL)
 +#endif
 +
 +#ifndef STATUS_FREE_VM_NOT_AT_BASE
 +# define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS) 0xC000009FL)
 +#endif
 +
 +#ifndef STATUS_MEMORY_NOT_ALLOCATED
 +# define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS) 0xC00000A0L)
 +#endif
 +
 +#ifndef STATUS_WORKING_SET_QUOTA
 +# define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xC00000A1L)
 +#endif
 +
 +#ifndef STATUS_MEDIA_WRITE_PROTECTED
 +# define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS) 0xC00000A2L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_NOT_READY
 +# define STATUS_DEVICE_NOT_READY ((NTSTATUS) 0xC00000A3L)
 +#endif
 +
 +#ifndef STATUS_INVALID_GROUP_ATTRIBUTES
 +# define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS) 0xC00000A4L)
 +#endif
 +
 +#ifndef STATUS_BAD_IMPERSONATION_LEVEL
 +# define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS) 0xC00000A5L)
 +#endif
 +
 +#ifndef STATUS_CANT_OPEN_ANONYMOUS
 +# define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS) 0xC00000A6L)
 +#endif
 +
 +#ifndef STATUS_BAD_VALIDATION_CLASS
 +# define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS) 0xC00000A7L)
 +#endif
 +
 +#ifndef STATUS_BAD_TOKEN_TYPE
 +# define STATUS_BAD_TOKEN_TYPE ((NTSTATUS) 0xC00000A8L)
 +#endif
 +
 +#ifndef STATUS_BAD_MASTER_BOOT_RECORD
 +# define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS) 0xC00000A9L)
 +#endif
 +
 +#ifndef STATUS_INSTRUCTION_MISALIGNMENT
 +# define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS) 0xC00000AAL)
 +#endif
 +
 +#ifndef STATUS_INSTANCE_NOT_AVAILABLE
 +# define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ABL)
 +#endif
 +
 +#ifndef STATUS_PIPE_NOT_AVAILABLE
 +# define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ACL)
 +#endif
 +
 +#ifndef STATUS_INVALID_PIPE_STATE
 +# define STATUS_INVALID_PIPE_STATE ((NTSTATUS) 0xC00000ADL)
 +#endif
 +
 +#ifndef STATUS_PIPE_BUSY
 +# define STATUS_PIPE_BUSY ((NTSTATUS) 0xC00000AEL)
 +#endif
 +
 +#ifndef STATUS_ILLEGAL_FUNCTION
 +# define STATUS_ILLEGAL_FUNCTION ((NTSTATUS) 0xC00000AFL)
 +#endif
 +
 +#ifndef STATUS_PIPE_DISCONNECTED
 +# define STATUS_PIPE_DISCONNECTED ((NTSTATUS) 0xC00000B0L)
 +#endif
 +
 +#ifndef STATUS_PIPE_CLOSING
 +# define STATUS_PIPE_CLOSING ((NTSTATUS) 0xC00000B1L)
 +#endif
 +
 +#ifndef STATUS_PIPE_CONNECTED
 +# define STATUS_PIPE_CONNECTED ((NTSTATUS) 0xC00000B2L)
 +#endif
 +
 +#ifndef STATUS_PIPE_LISTENING
 +# define STATUS_PIPE_LISTENING ((NTSTATUS) 0xC00000B3L)
 +#endif
 +
 +#ifndef STATUS_INVALID_READ_MODE
 +# define STATUS_INVALID_READ_MODE ((NTSTATUS) 0xC00000B4L)
 +#endif
 +
 +#ifndef STATUS_IO_TIMEOUT
 +# define STATUS_IO_TIMEOUT ((NTSTATUS) 0xC00000B5L)
 +#endif
 +
 +#ifndef STATUS_FILE_FORCED_CLOSED
 +# define STATUS_FILE_FORCED_CLOSED ((NTSTATUS) 0xC00000B6L)
 +#endif
 +
 +#ifndef STATUS_PROFILING_NOT_STARTED
 +# define STATUS_PROFILING_NOT_STARTED ((NTSTATUS) 0xC00000B7L)
 +#endif
 +
 +#ifndef STATUS_PROFILING_NOT_STOPPED
 +# define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS) 0xC00000B8L)
 +#endif
 +
 +#ifndef STATUS_COULD_NOT_INTERPRET
 +# define STATUS_COULD_NOT_INTERPRET ((NTSTATUS) 0xC00000B9L)
 +#endif
 +
 +#ifndef STATUS_FILE_IS_A_DIRECTORY
 +# define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS) 0xC00000BAL)
 +#endif
 +
 +#ifndef STATUS_NOT_SUPPORTED
 +# define STATUS_NOT_SUPPORTED ((NTSTATUS) 0xC00000BBL)
 +#endif
 +
 +#ifndef STATUS_REMOTE_NOT_LISTENING
 +# define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS) 0xC00000BCL)
 +#endif
 +
 +#ifndef STATUS_DUPLICATE_NAME
 +# define STATUS_DUPLICATE_NAME ((NTSTATUS) 0xC00000BDL)
 +#endif
 +
 +#ifndef STATUS_BAD_NETWORK_PATH
 +# define STATUS_BAD_NETWORK_PATH ((NTSTATUS) 0xC00000BEL)
 +#endif
 +
 +#ifndef STATUS_NETWORK_BUSY
 +# define STATUS_NETWORK_BUSY ((NTSTATUS) 0xC00000BFL)
 +#endif
 +
 +#ifndef STATUS_DEVICE_DOES_NOT_EXIST
 +# define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS) 0xC00000C0L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_COMMANDS
 +# define STATUS_TOO_MANY_COMMANDS ((NTSTATUS) 0xC00000C1L)
 +#endif
 +
 +#ifndef STATUS_ADAPTER_HARDWARE_ERROR
 +# define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS) 0xC00000C2L)
 +#endif
 +
 +#ifndef STATUS_INVALID_NETWORK_RESPONSE
 +# define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS) 0xC00000C3L)
 +#endif
 +
 +#ifndef STATUS_UNEXPECTED_NETWORK_ERROR
 +# define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS) 0xC00000C4L)
 +#endif
 +
 +#ifndef STATUS_BAD_REMOTE_ADAPTER
 +# define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS) 0xC00000C5L)
 +#endif
 +
 +#ifndef STATUS_PRINT_QUEUE_FULL
 +# define STATUS_PRINT_QUEUE_FULL ((NTSTATUS) 0xC00000C6L)
 +#endif
 +
 +#ifndef STATUS_NO_SPOOL_SPACE
 +# define STATUS_NO_SPOOL_SPACE ((NTSTATUS) 0xC00000C7L)
 +#endif
 +
 +#ifndef STATUS_PRINT_CANCELLED
 +# define STATUS_PRINT_CANCELLED ((NTSTATUS) 0xC00000C8L)
 +#endif
 +
 +#ifndef STATUS_NETWORK_NAME_DELETED
 +# define STATUS_NETWORK_NAME_DELETED ((NTSTATUS) 0xC00000C9L)
 +#endif
 +
 +#ifndef STATUS_NETWORK_ACCESS_DENIED
 +# define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS) 0xC00000CAL)
 +#endif
 +
 +#ifndef STATUS_BAD_DEVICE_TYPE
 +# define STATUS_BAD_DEVICE_TYPE ((NTSTATUS) 0xC00000CBL)
 +#endif
 +
 +#ifndef STATUS_BAD_NETWORK_NAME
 +# define STATUS_BAD_NETWORK_NAME ((NTSTATUS) 0xC00000CCL)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_NAMES
 +# define STATUS_TOO_MANY_NAMES ((NTSTATUS) 0xC00000CDL)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_SESSIONS
 +# define STATUS_TOO_MANY_SESSIONS ((NTSTATUS) 0xC00000CEL)
 +#endif
 +
 +#ifndef STATUS_SHARING_PAUSED
 +# define STATUS_SHARING_PAUSED ((NTSTATUS) 0xC00000CFL)
 +#endif
 +
 +#ifndef STATUS_REQUEST_NOT_ACCEPTED
 +# define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS) 0xC00000D0L)
 +#endif
 +
 +#ifndef STATUS_REDIRECTOR_PAUSED
 +# define STATUS_REDIRECTOR_PAUSED ((NTSTATUS) 0xC00000D1L)
 +#endif
 +
 +#ifndef STATUS_NET_WRITE_FAULT
 +# define STATUS_NET_WRITE_FAULT ((NTSTATUS) 0xC00000D2L)
 +#endif
 +
 +#ifndef STATUS_PROFILING_AT_LIMIT
 +# define STATUS_PROFILING_AT_LIMIT ((NTSTATUS) 0xC00000D3L)
 +#endif
 +
 +#ifndef STATUS_NOT_SAME_DEVICE
 +# define STATUS_NOT_SAME_DEVICE ((NTSTATUS) 0xC00000D4L)
 +#endif
 +
 +#ifndef STATUS_FILE_RENAMED
 +# define STATUS_FILE_RENAMED ((NTSTATUS) 0xC00000D5L)
 +#endif
 +
 +#ifndef STATUS_VIRTUAL_CIRCUIT_CLOSED
 +# define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS) 0xC00000D6L)
 +#endif
 +
 +#ifndef STATUS_NO_SECURITY_ON_OBJECT
 +# define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS) 0xC00000D7L)
 +#endif
 +
 +#ifndef STATUS_CANT_WAIT
 +# define STATUS_CANT_WAIT ((NTSTATUS) 0xC00000D8L)
 +#endif
 +
 +#ifndef STATUS_PIPE_EMPTY
 +# define STATUS_PIPE_EMPTY ((NTSTATUS) 0xC00000D9L)
 +#endif
 +
 +#ifndef STATUS_CANT_ACCESS_DOMAIN_INFO
 +# define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS) 0xC00000DAL)
 +#endif
 +
 +#ifndef STATUS_CANT_TERMINATE_SELF
 +# define STATUS_CANT_TERMINATE_SELF ((NTSTATUS) 0xC00000DBL)
 +#endif
 +
 +#ifndef STATUS_INVALID_SERVER_STATE
 +# define STATUS_INVALID_SERVER_STATE ((NTSTATUS) 0xC00000DCL)
 +#endif
 +
 +#ifndef STATUS_INVALID_DOMAIN_STATE
 +# define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS) 0xC00000DDL)
 +#endif
 +
 +#ifndef STATUS_INVALID_DOMAIN_ROLE
 +# define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS) 0xC00000DEL)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_DOMAIN
 +# define STATUS_NO_SUCH_DOMAIN ((NTSTATUS) 0xC00000DFL)
 +#endif
 +
 +#ifndef STATUS_DOMAIN_EXISTS
 +# define STATUS_DOMAIN_EXISTS ((NTSTATUS) 0xC00000E0L)
 +#endif
 +
 +#ifndef STATUS_DOMAIN_LIMIT_EXCEEDED
 +# define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00000E1L)
 +#endif
 +
 +#ifndef STATUS_OPLOCK_NOT_GRANTED
 +# define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS) 0xC00000E2L)
 +#endif
 +
 +#ifndef STATUS_INVALID_OPLOCK_PROTOCOL
 +# define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS) 0xC00000E3L)
 +#endif
 +
 +#ifndef STATUS_INTERNAL_DB_CORRUPTION
 +# define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS) 0xC00000E4L)
 +#endif
 +
 +#ifndef STATUS_INTERNAL_ERROR
 +# define STATUS_INTERNAL_ERROR ((NTSTATUS) 0xC00000E5L)
 +#endif
 +
 +#ifndef STATUS_GENERIC_NOT_MAPPED
 +# define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS) 0xC00000E6L)
 +#endif
 +
 +#ifndef STATUS_BAD_DESCRIPTOR_FORMAT
 +# define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS) 0xC00000E7L)
 +#endif
 +
 +#ifndef STATUS_INVALID_USER_BUFFER
 +# define STATUS_INVALID_USER_BUFFER ((NTSTATUS) 0xC00000E8L)
 +#endif
 +
 +#ifndef STATUS_UNEXPECTED_IO_ERROR
 +# define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS) 0xC00000E9L)
 +#endif
 +
 +#ifndef STATUS_UNEXPECTED_MM_CREATE_ERR
 +# define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS) 0xC00000EAL)
 +#endif
 +
 +#ifndef STATUS_UNEXPECTED_MM_MAP_ERROR
 +# define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS) 0xC00000EBL)
 +#endif
 +
 +#ifndef STATUS_UNEXPECTED_MM_EXTEND_ERR
 +# define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS) 0xC00000ECL)
 +#endif
 +
 +#ifndef STATUS_NOT_LOGON_PROCESS
 +# define STATUS_NOT_LOGON_PROCESS ((NTSTATUS) 0xC00000EDL)
 +#endif
 +
 +#ifndef STATUS_LOGON_SESSION_EXISTS
 +# define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS) 0xC00000EEL)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_1
 +# define STATUS_INVALID_PARAMETER_1 ((NTSTATUS) 0xC00000EFL)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_2
 +# define STATUS_INVALID_PARAMETER_2 ((NTSTATUS) 0xC00000F0L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_3
 +# define STATUS_INVALID_PARAMETER_3 ((NTSTATUS) 0xC00000F1L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_4
 +# define STATUS_INVALID_PARAMETER_4 ((NTSTATUS) 0xC00000F2L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_5
 +# define STATUS_INVALID_PARAMETER_5 ((NTSTATUS) 0xC00000F3L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_6
 +# define STATUS_INVALID_PARAMETER_6 ((NTSTATUS) 0xC00000F4L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_7
 +# define STATUS_INVALID_PARAMETER_7 ((NTSTATUS) 0xC00000F5L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_8
 +# define STATUS_INVALID_PARAMETER_8 ((NTSTATUS) 0xC00000F6L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_9
 +# define STATUS_INVALID_PARAMETER_9 ((NTSTATUS) 0xC00000F7L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_10
 +# define STATUS_INVALID_PARAMETER_10 ((NTSTATUS) 0xC00000F8L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_11
 +# define STATUS_INVALID_PARAMETER_11 ((NTSTATUS) 0xC00000F9L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PARAMETER_12
 +# define STATUS_INVALID_PARAMETER_12 ((NTSTATUS) 0xC00000FAL)
 +#endif
 +
 +#ifndef STATUS_REDIRECTOR_NOT_STARTED
 +# define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS) 0xC00000FBL)
 +#endif
 +
 +#ifndef STATUS_REDIRECTOR_STARTED
 +# define STATUS_REDIRECTOR_STARTED ((NTSTATUS) 0xC00000FCL)
 +#endif
 +
 +#ifndef STATUS_STACK_OVERFLOW
 +# define STATUS_STACK_OVERFLOW ((NTSTATUS) 0xC00000FDL)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_PACKAGE
 +# define STATUS_NO_SUCH_PACKAGE ((NTSTATUS) 0xC00000FEL)
 +#endif
 +
 +#ifndef STATUS_BAD_FUNCTION_TABLE
 +# define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS) 0xC00000FFL)
 +#endif
 +
 +#ifndef STATUS_VARIABLE_NOT_FOUND
 +# define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS) 0xC0000100L)
 +#endif
 +
 +#ifndef STATUS_DIRECTORY_NOT_EMPTY
 +# define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS) 0xC0000101L)
 +#endif
 +
 +#ifndef STATUS_FILE_CORRUPT_ERROR
 +# define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS) 0xC0000102L)
 +#endif
 +
 +#ifndef STATUS_NOT_A_DIRECTORY
 +# define STATUS_NOT_A_DIRECTORY ((NTSTATUS) 0xC0000103L)
 +#endif
 +
 +#ifndef STATUS_BAD_LOGON_SESSION_STATE
 +# define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS) 0xC0000104L)
 +#endif
 +
 +#ifndef STATUS_LOGON_SESSION_COLLISION
 +# define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS) 0xC0000105L)
 +#endif
 +
 +#ifndef STATUS_NAME_TOO_LONG
 +# define STATUS_NAME_TOO_LONG ((NTSTATUS) 0xC0000106L)
 +#endif
 +
 +#ifndef STATUS_FILES_OPEN
 +# define STATUS_FILES_OPEN ((NTSTATUS) 0xC0000107L)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_IN_USE
 +# define STATUS_CONNECTION_IN_USE ((NTSTATUS) 0xC0000108L)
 +#endif
 +
 +#ifndef STATUS_MESSAGE_NOT_FOUND
 +# define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS) 0xC0000109L)
 +#endif
 +
 +#ifndef STATUS_PROCESS_IS_TERMINATING
 +# define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS) 0xC000010AL)
 +#endif
 +
 +#ifndef STATUS_INVALID_LOGON_TYPE
 +# define STATUS_INVALID_LOGON_TYPE ((NTSTATUS) 0xC000010BL)
 +#endif
 +
 +#ifndef STATUS_NO_GUID_TRANSLATION
 +# define STATUS_NO_GUID_TRANSLATION ((NTSTATUS) 0xC000010CL)
 +#endif
 +
 +#ifndef STATUS_CANNOT_IMPERSONATE
 +# define STATUS_CANNOT_IMPERSONATE ((NTSTATUS) 0xC000010DL)
 +#endif
 +
 +#ifndef STATUS_IMAGE_ALREADY_LOADED
 +# define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS) 0xC000010EL)
 +#endif
 +
 +#ifndef STATUS_ABIOS_NOT_PRESENT
 +# define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS) 0xC000010FL)
 +#endif
 +
 +#ifndef STATUS_ABIOS_LID_NOT_EXIST
 +# define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS) 0xC0000110L)
 +#endif
 +
 +#ifndef STATUS_ABIOS_LID_ALREADY_OWNED
 +# define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS) 0xC0000111L)
 +#endif
 +
 +#ifndef STATUS_ABIOS_NOT_LID_OWNER
 +# define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS) 0xC0000112L)
 +#endif
 +
 +#ifndef STATUS_ABIOS_INVALID_COMMAND
 +# define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS) 0xC0000113L)
 +#endif
 +
 +#ifndef STATUS_ABIOS_INVALID_LID
 +# define STATUS_ABIOS_INVALID_LID ((NTSTATUS) 0xC0000114L)
 +#endif
 +
 +#ifndef STATUS_ABIOS_SELECTOR_NOT_AVAILABLE
 +# define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS) 0xC0000115L)
 +#endif
 +
 +#ifndef STATUS_ABIOS_INVALID_SELECTOR
 +# define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS) 0xC0000116L)
 +#endif
 +
 +#ifndef STATUS_NO_LDT
 +# define STATUS_NO_LDT ((NTSTATUS) 0xC0000117L)
 +#endif
 +
 +#ifndef STATUS_INVALID_LDT_SIZE
 +# define STATUS_INVALID_LDT_SIZE ((NTSTATUS) 0xC0000118L)
 +#endif
 +
 +#ifndef STATUS_INVALID_LDT_OFFSET
 +# define STATUS_INVALID_LDT_OFFSET ((NTSTATUS) 0xC0000119L)
 +#endif
 +
 +#ifndef STATUS_INVALID_LDT_DESCRIPTOR
 +# define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS) 0xC000011AL)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_NE_FORMAT
 +# define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS) 0xC000011BL)
 +#endif
 +
 +#ifndef STATUS_RXACT_INVALID_STATE
 +# define STATUS_RXACT_INVALID_STATE ((NTSTATUS) 0xC000011CL)
 +#endif
 +
 +#ifndef STATUS_RXACT_COMMIT_FAILURE
 +# define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS) 0xC000011DL)
 +#endif
 +
 +#ifndef STATUS_MAPPED_FILE_SIZE_ZERO
 +# define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS) 0xC000011EL)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_OPENED_FILES
 +# define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS) 0xC000011FL)
 +#endif
 +
 +#ifndef STATUS_CANCELLED
 +# define STATUS_CANCELLED ((NTSTATUS) 0xC0000120L)
 +#endif
 +
 +#ifndef STATUS_CANNOT_DELETE
 +# define STATUS_CANNOT_DELETE ((NTSTATUS) 0xC0000121L)
 +#endif
 +
 +#ifndef STATUS_INVALID_COMPUTER_NAME
 +# define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS) 0xC0000122L)
 +#endif
 +
 +#ifndef STATUS_FILE_DELETED
 +# define STATUS_FILE_DELETED ((NTSTATUS) 0xC0000123L)
 +#endif
 +
 +#ifndef STATUS_SPECIAL_ACCOUNT
 +# define STATUS_SPECIAL_ACCOUNT ((NTSTATUS) 0xC0000124L)
 +#endif
 +
 +#ifndef STATUS_SPECIAL_GROUP
 +# define STATUS_SPECIAL_GROUP ((NTSTATUS) 0xC0000125L)
 +#endif
 +
 +#ifndef STATUS_SPECIAL_USER
 +# define STATUS_SPECIAL_USER ((NTSTATUS) 0xC0000126L)
 +#endif
 +
 +#ifndef STATUS_MEMBERS_PRIMARY_GROUP
 +# define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS) 0xC0000127L)
 +#endif
 +
 +#ifndef STATUS_FILE_CLOSED
 +# define STATUS_FILE_CLOSED ((NTSTATUS) 0xC0000128L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_THREADS
 +# define STATUS_TOO_MANY_THREADS ((NTSTATUS) 0xC0000129L)
 +#endif
 +
 +#ifndef STATUS_THREAD_NOT_IN_PROCESS
 +# define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS) 0xC000012AL)
 +#endif
 +
 +#ifndef STATUS_TOKEN_ALREADY_IN_USE
 +# define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS) 0xC000012BL)
 +#endif
 +
 +#ifndef STATUS_PAGEFILE_QUOTA_EXCEEDED
 +# define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS) 0xC000012CL)
 +#endif
 +
 +#ifndef STATUS_COMMITMENT_LIMIT
 +# define STATUS_COMMITMENT_LIMIT ((NTSTATUS) 0xC000012DL)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_LE_FORMAT
 +# define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS) 0xC000012EL)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_NOT_MZ
 +# define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS) 0xC000012FL)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_PROTECT
 +# define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS) 0xC0000130L)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_WIN_16
 +# define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS) 0xC0000131L)
 +#endif
 +
 +#ifndef STATUS_LOGON_SERVER_CONFLICT
 +# define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS) 0xC0000132L)
 +#endif
 +
 +#ifndef STATUS_TIME_DIFFERENCE_AT_DC
 +# define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS) 0xC0000133L)
 +#endif
 +
 +#ifndef STATUS_SYNCHRONIZATION_REQUIRED
 +# define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS) 0xC0000134L)
 +#endif
 +
 +#ifndef STATUS_DLL_NOT_FOUND
 +# define STATUS_DLL_NOT_FOUND ((NTSTATUS) 0xC0000135L)
 +#endif
 +
 +#ifndef STATUS_OPEN_FAILED
 +# define STATUS_OPEN_FAILED ((NTSTATUS) 0xC0000136L)
 +#endif
 +
 +#ifndef STATUS_IO_PRIVILEGE_FAILED
 +# define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS) 0xC0000137L)
 +#endif
 +
 +#ifndef STATUS_ORDINAL_NOT_FOUND
 +# define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000138L)
 +#endif
 +
 +#ifndef STATUS_ENTRYPOINT_NOT_FOUND
 +# define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000139L)
 +#endif
 +
 +#ifndef STATUS_CONTROL_C_EXIT
 +# define STATUS_CONTROL_C_EXIT ((NTSTATUS) 0xC000013AL)
 +#endif
 +
 +#ifndef STATUS_LOCAL_DISCONNECT
 +# define STATUS_LOCAL_DISCONNECT ((NTSTATUS) 0xC000013BL)
 +#endif
 +
 +#ifndef STATUS_REMOTE_DISCONNECT
 +# define STATUS_REMOTE_DISCONNECT ((NTSTATUS) 0xC000013CL)
 +#endif
 +
 +#ifndef STATUS_REMOTE_RESOURCES
 +# define STATUS_REMOTE_RESOURCES ((NTSTATUS) 0xC000013DL)
 +#endif
 +
 +#ifndef STATUS_LINK_FAILED
 +# define STATUS_LINK_FAILED ((NTSTATUS) 0xC000013EL)
 +#endif
 +
 +#ifndef STATUS_LINK_TIMEOUT
 +# define STATUS_LINK_TIMEOUT ((NTSTATUS) 0xC000013FL)
 +#endif
 +
 +#ifndef STATUS_INVALID_CONNECTION
 +# define STATUS_INVALID_CONNECTION ((NTSTATUS) 0xC0000140L)
 +#endif
 +
 +#ifndef STATUS_INVALID_ADDRESS
 +# define STATUS_INVALID_ADDRESS ((NTSTATUS) 0xC0000141L)
 +#endif
 +
 +#ifndef STATUS_DLL_INIT_FAILED
 +# define STATUS_DLL_INIT_FAILED ((NTSTATUS) 0xC0000142L)
 +#endif
 +
 +#ifndef STATUS_MISSING_SYSTEMFILE
 +# define STATUS_MISSING_SYSTEMFILE ((NTSTATUS) 0xC0000143L)
 +#endif
 +
 +#ifndef STATUS_UNHANDLED_EXCEPTION
 +# define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS) 0xC0000144L)
 +#endif
 +
 +#ifndef STATUS_APP_INIT_FAILURE
 +# define STATUS_APP_INIT_FAILURE ((NTSTATUS) 0xC0000145L)
 +#endif
 +
 +#ifndef STATUS_PAGEFILE_CREATE_FAILED
 +# define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS) 0xC0000146L)
 +#endif
 +
 +#ifndef STATUS_NO_PAGEFILE
 +# define STATUS_NO_PAGEFILE ((NTSTATUS) 0xC0000147L)
 +#endif
 +
 +#ifndef STATUS_INVALID_LEVEL
 +# define STATUS_INVALID_LEVEL ((NTSTATUS) 0xC0000148L)
 +#endif
 +
 +#ifndef STATUS_WRONG_PASSWORD_CORE
 +# define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS) 0xC0000149L)
 +#endif
 +
 +#ifndef STATUS_ILLEGAL_FLOAT_CONTEXT
 +# define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS) 0xC000014AL)
 +#endif
 +
 +#ifndef STATUS_PIPE_BROKEN
 +# define STATUS_PIPE_BROKEN ((NTSTATUS) 0xC000014BL)
 +#endif
 +
 +#ifndef STATUS_REGISTRY_CORRUPT
 +# define STATUS_REGISTRY_CORRUPT ((NTSTATUS) 0xC000014CL)
 +#endif
 +
 +#ifndef STATUS_REGISTRY_IO_FAILED
 +# define STATUS_REGISTRY_IO_FAILED ((NTSTATUS) 0xC000014DL)
 +#endif
 +
 +#ifndef STATUS_NO_EVENT_PAIR
 +# define STATUS_NO_EVENT_PAIR ((NTSTATUS) 0xC000014EL)
 +#endif
 +
 +#ifndef STATUS_UNRECOGNIZED_VOLUME
 +# define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS) 0xC000014FL)
 +#endif
 +
 +#ifndef STATUS_SERIAL_NO_DEVICE_INITED
 +# define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS) 0xC0000150L)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_ALIAS
 +# define STATUS_NO_SUCH_ALIAS ((NTSTATUS) 0xC0000151L)
 +#endif
 +
 +#ifndef STATUS_MEMBER_NOT_IN_ALIAS
 +# define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS) 0xC0000152L)
 +#endif
 +
 +#ifndef STATUS_MEMBER_IN_ALIAS
 +# define STATUS_MEMBER_IN_ALIAS ((NTSTATUS) 0xC0000153L)
 +#endif
 +
 +#ifndef STATUS_ALIAS_EXISTS
 +# define STATUS_ALIAS_EXISTS ((NTSTATUS) 0xC0000154L)
 +#endif
 +
 +#ifndef STATUS_LOGON_NOT_GRANTED
 +# define STATUS_LOGON_NOT_GRANTED ((NTSTATUS) 0xC0000155L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_SECRETS
 +# define STATUS_TOO_MANY_SECRETS ((NTSTATUS) 0xC0000156L)
 +#endif
 +
 +#ifndef STATUS_SECRET_TOO_LONG
 +# define STATUS_SECRET_TOO_LONG ((NTSTATUS) 0xC0000157L)
 +#endif
 +
 +#ifndef STATUS_INTERNAL_DB_ERROR
 +# define STATUS_INTERNAL_DB_ERROR ((NTSTATUS) 0xC0000158L)
 +#endif
 +
 +#ifndef STATUS_FULLSCREEN_MODE
 +# define STATUS_FULLSCREEN_MODE ((NTSTATUS) 0xC0000159L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_CONTEXT_IDS
 +# define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS) 0xC000015AL)
 +#endif
 +
 +#ifndef STATUS_LOGON_TYPE_NOT_GRANTED
 +# define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS) 0xC000015BL)
 +#endif
 +
 +#ifndef STATUS_NOT_REGISTRY_FILE
 +# define STATUS_NOT_REGISTRY_FILE ((NTSTATUS) 0xC000015CL)
 +#endif
 +
 +#ifndef STATUS_NT_CROSS_ENCRYPTION_REQUIRED
 +# define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000015DL)
 +#endif
 +
 +#ifndef STATUS_DOMAIN_CTRLR_CONFIG_ERROR
 +# define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS) 0xC000015EL)
 +#endif
 +
 +#ifndef STATUS_FT_MISSING_MEMBER
 +# define STATUS_FT_MISSING_MEMBER ((NTSTATUS) 0xC000015FL)
 +#endif
 +
 +#ifndef STATUS_ILL_FORMED_SERVICE_ENTRY
 +# define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS) 0xC0000160L)
 +#endif
 +
 +#ifndef STATUS_ILLEGAL_CHARACTER
 +# define STATUS_ILLEGAL_CHARACTER ((NTSTATUS) 0xC0000161L)
 +#endif
 +
 +#ifndef STATUS_UNMAPPABLE_CHARACTER
 +# define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS) 0xC0000162L)
 +#endif
 +
 +#ifndef STATUS_UNDEFINED_CHARACTER
 +# define STATUS_UNDEFINED_CHARACTER ((NTSTATUS) 0xC0000163L)
 +#endif
 +
 +#ifndef STATUS_FLOPPY_VOLUME
 +# define STATUS_FLOPPY_VOLUME ((NTSTATUS) 0xC0000164L)
 +#endif
 +
 +#ifndef STATUS_FLOPPY_ID_MARK_NOT_FOUND
 +# define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS) 0xC0000165L)
 +#endif
 +
 +#ifndef STATUS_FLOPPY_WRONG_CYLINDER
 +# define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS) 0xC0000166L)
 +#endif
 +
 +#ifndef STATUS_FLOPPY_UNKNOWN_ERROR
 +# define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS) 0xC0000167L)
 +#endif
 +
 +#ifndef STATUS_FLOPPY_BAD_REGISTERS
 +# define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS) 0xC0000168L)
 +#endif
 +
 +#ifndef STATUS_DISK_RECALIBRATE_FAILED
 +# define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS) 0xC0000169L)
 +#endif
 +
 +#ifndef STATUS_DISK_OPERATION_FAILED
 +# define STATUS_DISK_OPERATION_FAILED ((NTSTATUS) 0xC000016AL)
 +#endif
 +
 +#ifndef STATUS_DISK_RESET_FAILED
 +# define STATUS_DISK_RESET_FAILED ((NTSTATUS) 0xC000016BL)
 +#endif
 +
 +#ifndef STATUS_SHARED_IRQ_BUSY
 +# define STATUS_SHARED_IRQ_BUSY ((NTSTATUS) 0xC000016CL)
 +#endif
 +
 +#ifndef STATUS_FT_ORPHANING
 +# define STATUS_FT_ORPHANING ((NTSTATUS) 0xC000016DL)
 +#endif
 +
 +#ifndef STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT
 +# define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS) 0xC000016EL)
 +#endif
 +
 +#ifndef STATUS_PARTITION_FAILURE
 +# define STATUS_PARTITION_FAILURE ((NTSTATUS) 0xC0000172L)
 +#endif
 +
 +#ifndef STATUS_INVALID_BLOCK_LENGTH
 +# define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS) 0xC0000173L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_NOT_PARTITIONED
 +# define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS) 0xC0000174L)
 +#endif
 +
 +#ifndef STATUS_UNABLE_TO_LOCK_MEDIA
 +# define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS) 0xC0000175L)
 +#endif
 +
 +#ifndef STATUS_UNABLE_TO_UNLOAD_MEDIA
 +# define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS) 0xC0000176L)
 +#endif
 +
 +#ifndef STATUS_EOM_OVERFLOW
 +# define STATUS_EOM_OVERFLOW ((NTSTATUS) 0xC0000177L)
 +#endif
 +
 +#ifndef STATUS_NO_MEDIA
 +# define STATUS_NO_MEDIA ((NTSTATUS) 0xC0000178L)
 +#endif
 +
 +#ifndef STATUS_NO_SUCH_MEMBER
 +# define STATUS_NO_SUCH_MEMBER ((NTSTATUS) 0xC000017AL)
 +#endif
 +
 +#ifndef STATUS_INVALID_MEMBER
 +# define STATUS_INVALID_MEMBER ((NTSTATUS) 0xC000017BL)
 +#endif
 +
 +#ifndef STATUS_KEY_DELETED
 +# define STATUS_KEY_DELETED ((NTSTATUS) 0xC000017CL)
 +#endif
 +
 +#ifndef STATUS_NO_LOG_SPACE
 +# define STATUS_NO_LOG_SPACE ((NTSTATUS) 0xC000017DL)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_SIDS
 +# define STATUS_TOO_MANY_SIDS ((NTSTATUS) 0xC000017EL)
 +#endif
 +
 +#ifndef STATUS_LM_CROSS_ENCRYPTION_REQUIRED
 +# define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000017FL)
 +#endif
 +
 +#ifndef STATUS_KEY_HAS_CHILDREN
 +# define STATUS_KEY_HAS_CHILDREN ((NTSTATUS) 0xC0000180L)
 +#endif
 +
 +#ifndef STATUS_CHILD_MUST_BE_VOLATILE
 +# define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS) 0xC0000181L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_CONFIGURATION_ERROR
 +# define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS) 0xC0000182L)
 +#endif
 +
 +#ifndef STATUS_DRIVER_INTERNAL_ERROR
 +# define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS) 0xC0000183L)
 +#endif
 +
 +#ifndef STATUS_INVALID_DEVICE_STATE
 +# define STATUS_INVALID_DEVICE_STATE ((NTSTATUS) 0xC0000184L)
 +#endif
 +
 +#ifndef STATUS_IO_DEVICE_ERROR
 +# define STATUS_IO_DEVICE_ERROR ((NTSTATUS) 0xC0000185L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_PROTOCOL_ERROR
 +# define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS) 0xC0000186L)
 +#endif
 +
 +#ifndef STATUS_BACKUP_CONTROLLER
 +# define STATUS_BACKUP_CONTROLLER ((NTSTATUS) 0xC0000187L)
 +#endif
 +
 +#ifndef STATUS_LOG_FILE_FULL
 +# define STATUS_LOG_FILE_FULL ((NTSTATUS) 0xC0000188L)
 +#endif
 +
 +#ifndef STATUS_TOO_LATE
 +# define STATUS_TOO_LATE ((NTSTATUS) 0xC0000189L)
 +#endif
 +
 +#ifndef STATUS_NO_TRUST_LSA_SECRET
 +# define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS) 0xC000018AL)
 +#endif
 +
 +#ifndef STATUS_NO_TRUST_SAM_ACCOUNT
 +# define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS) 0xC000018BL)
 +#endif
 +
 +#ifndef STATUS_TRUSTED_DOMAIN_FAILURE
 +# define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS) 0xC000018CL)
 +#endif
 +
 +#ifndef STATUS_TRUSTED_RELATIONSHIP_FAILURE
 +# define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS) 0xC000018DL)
 +#endif
 +
 +#ifndef STATUS_EVENTLOG_FILE_CORRUPT
 +# define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS) 0xC000018EL)
 +#endif
 +
 +#ifndef STATUS_EVENTLOG_CANT_START
 +# define STATUS_EVENTLOG_CANT_START ((NTSTATUS) 0xC000018FL)
 +#endif
 +
 +#ifndef STATUS_TRUST_FAILURE
 +# define STATUS_TRUST_FAILURE ((NTSTATUS) 0xC0000190L)
 +#endif
 +
 +#ifndef STATUS_MUTANT_LIMIT_EXCEEDED
 +# define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000191L)
 +#endif
 +
 +#ifndef STATUS_NETLOGON_NOT_STARTED
 +# define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS) 0xC0000192L)
 +#endif
 +
 +#ifndef STATUS_ACCOUNT_EXPIRED
 +# define STATUS_ACCOUNT_EXPIRED ((NTSTATUS) 0xC0000193L)
 +#endif
 +
 +#ifndef STATUS_POSSIBLE_DEADLOCK
 +# define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS) 0xC0000194L)
 +#endif
 +
 +#ifndef STATUS_NETWORK_CREDENTIAL_CONFLICT
 +# define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS) 0xC0000195L)
 +#endif
 +
 +#ifndef STATUS_REMOTE_SESSION_LIMIT
 +# define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS) 0xC0000196L)
 +#endif
 +
 +#ifndef STATUS_EVENTLOG_FILE_CHANGED
 +# define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS) 0xC0000197L)
 +#endif
 +
 +#ifndef STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT
 +# define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS) 0xC0000198L)
 +#endif
 +
 +#ifndef STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT
 +# define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS) 0xC0000199L)
 +#endif
 +
 +#ifndef STATUS_NOLOGON_SERVER_TRUST_ACCOUNT
 +# define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS) 0xC000019AL)
 +#endif
 +
 +#ifndef STATUS_DOMAIN_TRUST_INCONSISTENT
 +# define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS) 0xC000019BL)
 +#endif
 +
 +#ifndef STATUS_FS_DRIVER_REQUIRED
 +# define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS) 0xC000019CL)
 +#endif
 +
 +#ifndef STATUS_IMAGE_ALREADY_LOADED_AS_DLL
 +# define STATUS_IMAGE_ALREADY_LOADED_AS_DLL ((NTSTATUS) 0xC000019DL)
 +#endif
 +
 +#ifndef STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING
 +# define STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING ((NTSTATUS) 0xC000019EL)
 +#endif
 +
 +#ifndef STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME
 +# define STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME ((NTSTATUS) 0xC000019FL)
 +#endif
 +
 +#ifndef STATUS_SECURITY_STREAM_IS_INCONSISTENT
 +# define STATUS_SECURITY_STREAM_IS_INCONSISTENT ((NTSTATUS) 0xC00001A0L)
 +#endif
 +
 +#ifndef STATUS_INVALID_LOCK_RANGE
 +# define STATUS_INVALID_LOCK_RANGE ((NTSTATUS) 0xC00001A1L)
 +#endif
 +
 +#ifndef STATUS_INVALID_ACE_CONDITION
 +# define STATUS_INVALID_ACE_CONDITION ((NTSTATUS) 0xC00001A2L)
 +#endif
 +
 +#ifndef STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT
 +# define STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT ((NTSTATUS) 0xC00001A3L)
 +#endif
 +
 +#ifndef STATUS_NOTIFICATION_GUID_ALREADY_DEFINED
 +# define STATUS_NOTIFICATION_GUID_ALREADY_DEFINED ((NTSTATUS) 0xC00001A4L)
 +#endif
 +
 +#ifndef STATUS_NETWORK_OPEN_RESTRICTION
 +# define STATUS_NETWORK_OPEN_RESTRICTION ((NTSTATUS) 0xC0000201L)
 +#endif
 +
 +#ifndef STATUS_NO_USER_SESSION_KEY
 +# define STATUS_NO_USER_SESSION_KEY ((NTSTATUS) 0xC0000202L)
 +#endif
 +
 +#ifndef STATUS_USER_SESSION_DELETED
 +# define STATUS_USER_SESSION_DELETED ((NTSTATUS) 0xC0000203L)
 +#endif
 +
 +#ifndef STATUS_RESOURCE_LANG_NOT_FOUND
 +# define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS) 0xC0000204L)
 +#endif
 +
 +#ifndef STATUS_INSUFF_SERVER_RESOURCES
 +# define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS) 0xC0000205L)
 +#endif
 +
 +#ifndef STATUS_INVALID_BUFFER_SIZE
 +# define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS) 0xC0000206L)
 +#endif
 +
 +#ifndef STATUS_INVALID_ADDRESS_COMPONENT
 +# define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS) 0xC0000207L)
 +#endif
 +
 +#ifndef STATUS_INVALID_ADDRESS_WILDCARD
 +# define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS) 0xC0000208L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_ADDRESSES
 +# define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS) 0xC0000209L)
 +#endif
 +
 +#ifndef STATUS_ADDRESS_ALREADY_EXISTS
 +# define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS) 0xC000020AL)
 +#endif
 +
 +#ifndef STATUS_ADDRESS_CLOSED
 +# define STATUS_ADDRESS_CLOSED ((NTSTATUS) 0xC000020BL)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_DISCONNECTED
 +# define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS) 0xC000020CL)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_RESET
 +# define STATUS_CONNECTION_RESET ((NTSTATUS) 0xC000020DL)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_NODES
 +# define STATUS_TOO_MANY_NODES ((NTSTATUS) 0xC000020EL)
 +#endif
 +
 +#ifndef STATUS_TRANSACTION_ABORTED
 +# define STATUS_TRANSACTION_ABORTED ((NTSTATUS) 0xC000020FL)
 +#endif
 +
 +#ifndef STATUS_TRANSACTION_TIMED_OUT
 +# define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS) 0xC0000210L)
 +#endif
 +
 +#ifndef STATUS_TRANSACTION_NO_RELEASE
 +# define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS) 0xC0000211L)
 +#endif
 +
 +#ifndef STATUS_TRANSACTION_NO_MATCH
 +# define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS) 0xC0000212L)
 +#endif
 +
 +#ifndef STATUS_TRANSACTION_RESPONDED
 +# define STATUS_TRANSACTION_RESPONDED ((NTSTATUS) 0xC0000213L)
 +#endif
 +
 +#ifndef STATUS_TRANSACTION_INVALID_ID
 +# define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS) 0xC0000214L)
 +#endif
 +
 +#ifndef STATUS_TRANSACTION_INVALID_TYPE
 +# define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS) 0xC0000215L)
 +#endif
 +
 +#ifndef STATUS_NOT_SERVER_SESSION
 +# define STATUS_NOT_SERVER_SESSION ((NTSTATUS) 0xC0000216L)
 +#endif
 +
 +#ifndef STATUS_NOT_CLIENT_SESSION
 +# define STATUS_NOT_CLIENT_SESSION ((NTSTATUS) 0xC0000217L)
 +#endif
 +
 +#ifndef STATUS_CANNOT_LOAD_REGISTRY_FILE
 +# define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS) 0xC0000218L)
 +#endif
 +
 +#ifndef STATUS_DEBUG_ATTACH_FAILED
 +# define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS) 0xC0000219L)
 +#endif
 +
 +#ifndef STATUS_SYSTEM_PROCESS_TERMINATED
 +# define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS) 0xC000021AL)
 +#endif
 +
 +#ifndef STATUS_DATA_NOT_ACCEPTED
 +# define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS) 0xC000021BL)
 +#endif
 +
 +#ifndef STATUS_NO_BROWSER_SERVERS_FOUND
 +# define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS) 0xC000021CL)
 +#endif
 +
 +#ifndef STATUS_VDM_HARD_ERROR
 +# define STATUS_VDM_HARD_ERROR ((NTSTATUS) 0xC000021DL)
 +#endif
 +
 +#ifndef STATUS_DRIVER_CANCEL_TIMEOUT
 +# define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS) 0xC000021EL)
 +#endif
 +
 +#ifndef STATUS_REPLY_MESSAGE_MISMATCH
 +# define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS) 0xC000021FL)
 +#endif
 +
 +#ifndef STATUS_MAPPED_ALIGNMENT
 +# define STATUS_MAPPED_ALIGNMENT ((NTSTATUS) 0xC0000220L)
 +#endif
 +
 +#ifndef STATUS_IMAGE_CHECKSUM_MISMATCH
 +# define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS) 0xC0000221L)
 +#endif
 +
 +#ifndef STATUS_LOST_WRITEBEHIND_DATA
 +# define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS) 0xC0000222L)
 +#endif
 +
 +#ifndef STATUS_CLIENT_SERVER_PARAMETERS_INVALID
 +# define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS) 0xC0000223L)
 +#endif
 +
 +#ifndef STATUS_PASSWORD_MUST_CHANGE
 +# define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS) 0xC0000224L)
 +#endif
 +
 +#ifndef STATUS_NOT_FOUND
 +# define STATUS_NOT_FOUND ((NTSTATUS) 0xC0000225L)
 +#endif
 +
 +#ifndef STATUS_NOT_TINY_STREAM
 +# define STATUS_NOT_TINY_STREAM ((NTSTATUS) 0xC0000226L)
 +#endif
 +
 +#ifndef STATUS_RECOVERY_FAILURE
 +# define STATUS_RECOVERY_FAILURE ((NTSTATUS) 0xC0000227L)
 +#endif
 +
 +#ifndef STATUS_STACK_OVERFLOW_READ
 +# define STATUS_STACK_OVERFLOW_READ ((NTSTATUS) 0xC0000228L)
 +#endif
 +
 +#ifndef STATUS_FAIL_CHECK
 +# define STATUS_FAIL_CHECK ((NTSTATUS) 0xC0000229L)
 +#endif
 +
 +#ifndef STATUS_DUPLICATE_OBJECTID
 +# define STATUS_DUPLICATE_OBJECTID ((NTSTATUS) 0xC000022AL)
 +#endif
 +
 +#ifndef STATUS_OBJECTID_EXISTS
 +# define STATUS_OBJECTID_EXISTS ((NTSTATUS) 0xC000022BL)
 +#endif
 +
 +#ifndef STATUS_CONVERT_TO_LARGE
 +# define STATUS_CONVERT_TO_LARGE ((NTSTATUS) 0xC000022CL)
 +#endif
 +
 +#ifndef STATUS_RETRY
 +# define STATUS_RETRY ((NTSTATUS) 0xC000022DL)
 +#endif
 +
 +#ifndef STATUS_FOUND_OUT_OF_SCOPE
 +# define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS) 0xC000022EL)
 +#endif
 +
 +#ifndef STATUS_ALLOCATE_BUCKET
 +# define STATUS_ALLOCATE_BUCKET ((NTSTATUS) 0xC000022FL)
 +#endif
 +
 +#ifndef STATUS_PROPSET_NOT_FOUND
 +# define STATUS_PROPSET_NOT_FOUND ((NTSTATUS) 0xC0000230L)
 +#endif
 +
 +#ifndef STATUS_MARSHALL_OVERFLOW
 +# define STATUS_MARSHALL_OVERFLOW ((NTSTATUS) 0xC0000231L)
 +#endif
 +
 +#ifndef STATUS_INVALID_VARIANT
 +# define STATUS_INVALID_VARIANT ((NTSTATUS) 0xC0000232L)
 +#endif
 +
 +#ifndef STATUS_DOMAIN_CONTROLLER_NOT_FOUND
 +# define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS) 0xC0000233L)
 +#endif
 +
 +#ifndef STATUS_ACCOUNT_LOCKED_OUT
 +# define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS) 0xC0000234L)
 +#endif
 +
 +#ifndef STATUS_HANDLE_NOT_CLOSABLE
 +# define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS) 0xC0000235L)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_REFUSED
 +# define STATUS_CONNECTION_REFUSED ((NTSTATUS) 0xC0000236L)
 +#endif
 +
 +#ifndef STATUS_GRACEFUL_DISCONNECT
 +# define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS) 0xC0000237L)
 +#endif
 +
 +#ifndef STATUS_ADDRESS_ALREADY_ASSOCIATED
 +# define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS) 0xC0000238L)
 +#endif
 +
 +#ifndef STATUS_ADDRESS_NOT_ASSOCIATED
 +# define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS) 0xC0000239L)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_INVALID
 +# define STATUS_CONNECTION_INVALID ((NTSTATUS) 0xC000023AL)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_ACTIVE
 +# define STATUS_CONNECTION_ACTIVE ((NTSTATUS) 0xC000023BL)
 +#endif
 +
 +#ifndef STATUS_NETWORK_UNREACHABLE
 +# define STATUS_NETWORK_UNREACHABLE ((NTSTATUS) 0xC000023CL)
 +#endif
 +
 +#ifndef STATUS_HOST_UNREACHABLE
 +# define STATUS_HOST_UNREACHABLE ((NTSTATUS) 0xC000023DL)
 +#endif
 +
 +#ifndef STATUS_PROTOCOL_UNREACHABLE
 +# define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS) 0xC000023EL)
 +#endif
 +
 +#ifndef STATUS_PORT_UNREACHABLE
 +# define STATUS_PORT_UNREACHABLE ((NTSTATUS) 0xC000023FL)
 +#endif
 +
 +#ifndef STATUS_REQUEST_ABORTED
 +# define STATUS_REQUEST_ABORTED ((NTSTATUS) 0xC0000240L)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_ABORTED
 +# define STATUS_CONNECTION_ABORTED ((NTSTATUS) 0xC0000241L)
 +#endif
 +
 +#ifndef STATUS_BAD_COMPRESSION_BUFFER
 +# define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS) 0xC0000242L)
 +#endif
 +
 +#ifndef STATUS_USER_MAPPED_FILE
 +# define STATUS_USER_MAPPED_FILE ((NTSTATUS) 0xC0000243L)
 +#endif
 +
 +#ifndef STATUS_AUDIT_FAILED
 +# define STATUS_AUDIT_FAILED ((NTSTATUS) 0xC0000244L)
 +#endif
 +
 +#ifndef STATUS_TIMER_RESOLUTION_NOT_SET
 +# define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS) 0xC0000245L)
 +#endif
 +
 +#ifndef STATUS_CONNECTION_COUNT_LIMIT
 +# define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS) 0xC0000246L)
 +#endif
 +
 +#ifndef STATUS_LOGIN_TIME_RESTRICTION
 +# define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS) 0xC0000247L)
 +#endif
 +
 +#ifndef STATUS_LOGIN_WKSTA_RESTRICTION
 +# define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS) 0xC0000248L)
 +#endif
 +
 +#ifndef STATUS_IMAGE_MP_UP_MISMATCH
 +# define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS) 0xC0000249L)
 +#endif
 +
 +#ifndef STATUS_INSUFFICIENT_LOGON_INFO
 +# define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS) 0xC0000250L)
 +#endif
 +
 +#ifndef STATUS_BAD_DLL_ENTRYPOINT
 +# define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS) 0xC0000251L)
 +#endif
 +
 +#ifndef STATUS_BAD_SERVICE_ENTRYPOINT
 +# define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS) 0xC0000252L)
 +#endif
 +
 +#ifndef STATUS_LPC_REPLY_LOST
 +# define STATUS_LPC_REPLY_LOST ((NTSTATUS) 0xC0000253L)
 +#endif
 +
 +#ifndef STATUS_IP_ADDRESS_CONFLICT1
 +# define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS) 0xC0000254L)
 +#endif
 +
 +#ifndef STATUS_IP_ADDRESS_CONFLICT2
 +# define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS) 0xC0000255L)
 +#endif
 +
 +#ifndef STATUS_REGISTRY_QUOTA_LIMIT
 +# define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS) 0xC0000256L)
 +#endif
 +
 +#ifndef STATUS_PATH_NOT_COVERED
 +# define STATUS_PATH_NOT_COVERED ((NTSTATUS) 0xC0000257L)
 +#endif
 +
 +#ifndef STATUS_NO_CALLBACK_ACTIVE
 +# define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS) 0xC0000258L)
 +#endif
 +
 +#ifndef STATUS_LICENSE_QUOTA_EXCEEDED
 +# define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000259L)
 +#endif
 +
 +#ifndef STATUS_PWD_TOO_SHORT
 +# define STATUS_PWD_TOO_SHORT ((NTSTATUS) 0xC000025AL)
 +#endif
 +
 +#ifndef STATUS_PWD_TOO_RECENT
 +# define STATUS_PWD_TOO_RECENT ((NTSTATUS) 0xC000025BL)
 +#endif
 +
 +#ifndef STATUS_PWD_HISTORY_CONFLICT
 +# define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS) 0xC000025CL)
 +#endif
 +
 +#ifndef STATUS_PLUGPLAY_NO_DEVICE
 +# define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS) 0xC000025EL)
 +#endif
 +
 +#ifndef STATUS_UNSUPPORTED_COMPRESSION
 +# define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS) 0xC000025FL)
 +#endif
 +
 +#ifndef STATUS_INVALID_HW_PROFILE
 +# define STATUS_INVALID_HW_PROFILE ((NTSTATUS) 0xC0000260L)
 +#endif
 +
 +#ifndef STATUS_INVALID_PLUGPLAY_DEVICE_PATH
 +# define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS) 0xC0000261L)
 +#endif
 +
 +#ifndef STATUS_DRIVER_ORDINAL_NOT_FOUND
 +# define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000262L)
 +#endif
 +
 +#ifndef STATUS_DRIVER_ENTRYPOINT_NOT_FOUND
 +# define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000263L)
 +#endif
 +
 +#ifndef STATUS_RESOURCE_NOT_OWNED
 +# define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS) 0xC0000264L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_LINKS
 +# define STATUS_TOO_MANY_LINKS ((NTSTATUS) 0xC0000265L)
 +#endif
 +
 +#ifndef STATUS_QUOTA_LIST_INCONSISTENT
 +# define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS) 0xC0000266L)
 +#endif
 +
 +#ifndef STATUS_FILE_IS_OFFLINE
 +# define STATUS_FILE_IS_OFFLINE ((NTSTATUS) 0xC0000267L)
 +#endif
 +
 +#ifndef STATUS_EVALUATION_EXPIRATION
 +# define STATUS_EVALUATION_EXPIRATION ((NTSTATUS) 0xC0000268L)
 +#endif
 +
 +#ifndef STATUS_ILLEGAL_DLL_RELOCATION
 +# define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xC0000269L)
 +#endif
 +
 +#ifndef STATUS_LICENSE_VIOLATION
 +# define STATUS_LICENSE_VIOLATION ((NTSTATUS) 0xC000026AL)
 +#endif
 +
 +#ifndef STATUS_DLL_INIT_FAILED_LOGOFF
 +# define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS) 0xC000026BL)
 +#endif
 +
 +#ifndef STATUS_DRIVER_UNABLE_TO_LOAD
 +# define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS) 0xC000026CL)
 +#endif
 +
 +#ifndef STATUS_DFS_UNAVAILABLE
 +# define STATUS_DFS_UNAVAILABLE ((NTSTATUS) 0xC000026DL)
 +#endif
 +
 +#ifndef STATUS_VOLUME_DISMOUNTED
 +# define STATUS_VOLUME_DISMOUNTED ((NTSTATUS) 0xC000026EL)
 +#endif
 +
 +#ifndef STATUS_WX86_INTERNAL_ERROR
 +# define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS) 0xC000026FL)
 +#endif
 +
 +#ifndef STATUS_WX86_FLOAT_STACK_CHECK
 +# define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000270L)
 +#endif
 +
 +#ifndef STATUS_VALIDATE_CONTINUE
 +# define STATUS_VALIDATE_CONTINUE ((NTSTATUS) 0xC0000271L)
 +#endif
 +
 +#ifndef STATUS_NO_MATCH
 +# define STATUS_NO_MATCH ((NTSTATUS) 0xC0000272L)
 +#endif
 +
 +#ifndef STATUS_NO_MORE_MATCHES
 +# define STATUS_NO_MORE_MATCHES ((NTSTATUS) 0xC0000273L)
 +#endif
 +
 +#ifndef STATUS_NOT_A_REPARSE_POINT
 +# define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS) 0xC0000275L)
 +#endif
 +
 +#ifndef STATUS_IO_REPARSE_TAG_INVALID
 +# define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS) 0xC0000276L)
 +#endif
 +
 +#ifndef STATUS_IO_REPARSE_TAG_MISMATCH
 +# define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS) 0xC0000277L)
 +#endif
 +
 +#ifndef STATUS_IO_REPARSE_DATA_INVALID
 +# define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS) 0xC0000278L)
 +#endif
 +
 +#ifndef STATUS_IO_REPARSE_TAG_NOT_HANDLED
 +# define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS) 0xC0000279L)
 +#endif
 +
 +#ifndef STATUS_REPARSE_POINT_NOT_RESOLVED
 +# define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000280L)
 +#endif
 +
 +#ifndef STATUS_DIRECTORY_IS_A_REPARSE_POINT
 +# define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS) 0xC0000281L)
 +#endif
 +
 +#ifndef STATUS_RANGE_LIST_CONFLICT
 +# define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS) 0xC0000282L)
 +#endif
 +
 +#ifndef STATUS_SOURCE_ELEMENT_EMPTY
 +# define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS) 0xC0000283L)
 +#endif
 +
 +#ifndef STATUS_DESTINATION_ELEMENT_FULL
 +# define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS) 0xC0000284L)
 +#endif
 +
 +#ifndef STATUS_ILLEGAL_ELEMENT_ADDRESS
 +# define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS) 0xC0000285L)
 +#endif
 +
 +#ifndef STATUS_MAGAZINE_NOT_PRESENT
 +# define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS) 0xC0000286L)
 +#endif
 +
 +#ifndef STATUS_REINITIALIZATION_NEEDED
 +# define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS) 0xC0000287L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_REQUIRES_CLEANING
 +# define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS) 0x80000288L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_DOOR_OPEN
 +# define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS) 0x80000289L)
 +#endif
 +
 +#ifndef STATUS_ENCRYPTION_FAILED
 +# define STATUS_ENCRYPTION_FAILED ((NTSTATUS) 0xC000028AL)
 +#endif
 +
 +#ifndef STATUS_DECRYPTION_FAILED
 +# define STATUS_DECRYPTION_FAILED ((NTSTATUS) 0xC000028BL)
 +#endif
 +
 +#ifndef STATUS_RANGE_NOT_FOUND
 +# define STATUS_RANGE_NOT_FOUND ((NTSTATUS) 0xC000028CL)
 +#endif
 +
 +#ifndef STATUS_NO_RECOVERY_POLICY
 +# define STATUS_NO_RECOVERY_POLICY ((NTSTATUS) 0xC000028DL)
 +#endif
 +
 +#ifndef STATUS_NO_EFS
 +# define STATUS_NO_EFS ((NTSTATUS) 0xC000028EL)
 +#endif
 +
 +#ifndef STATUS_WRONG_EFS
 +# define STATUS_WRONG_EFS ((NTSTATUS) 0xC000028FL)
 +#endif
 +
 +#ifndef STATUS_NO_USER_KEYS
 +# define STATUS_NO_USER_KEYS ((NTSTATUS) 0xC0000290L)
 +#endif
 +
 +#ifndef STATUS_FILE_NOT_ENCRYPTED
 +# define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS) 0xC0000291L)
 +#endif
 +
 +#ifndef STATUS_NOT_EXPORT_FORMAT
 +# define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS) 0xC0000292L)
 +#endif
 +
 +#ifndef STATUS_FILE_ENCRYPTED
 +# define STATUS_FILE_ENCRYPTED ((NTSTATUS) 0xC0000293L)
 +#endif
 +
 +#ifndef STATUS_WAKE_SYSTEM
 +# define STATUS_WAKE_SYSTEM ((NTSTATUS) 0x40000294L)
 +#endif
 +
 +#ifndef STATUS_WMI_GUID_NOT_FOUND
 +# define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS) 0xC0000295L)
 +#endif
 +
 +#ifndef STATUS_WMI_INSTANCE_NOT_FOUND
 +# define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS) 0xC0000296L)
 +#endif
 +
 +#ifndef STATUS_WMI_ITEMID_NOT_FOUND
 +# define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS) 0xC0000297L)
 +#endif
 +
 +#ifndef STATUS_WMI_TRY_AGAIN
 +# define STATUS_WMI_TRY_AGAIN ((NTSTATUS) 0xC0000298L)
 +#endif
 +
 +#ifndef STATUS_SHARED_POLICY
 +# define STATUS_SHARED_POLICY ((NTSTATUS) 0xC0000299L)
 +#endif
 +
 +#ifndef STATUS_POLICY_OBJECT_NOT_FOUND
 +# define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS) 0xC000029AL)
 +#endif
 +
 +#ifndef STATUS_POLICY_ONLY_IN_DS
 +# define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS) 0xC000029BL)
 +#endif
 +
 +#ifndef STATUS_VOLUME_NOT_UPGRADED
 +# define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS) 0xC000029CL)
 +#endif
 +
 +#ifndef STATUS_REMOTE_STORAGE_NOT_ACTIVE
 +# define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS) 0xC000029DL)
 +#endif
 +
 +#ifndef STATUS_REMOTE_STORAGE_MEDIA_ERROR
 +# define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS) 0xC000029EL)
 +#endif
 +
 +#ifndef STATUS_NO_TRACKING_SERVICE
 +# define STATUS_NO_TRACKING_SERVICE ((NTSTATUS) 0xC000029FL)
 +#endif
 +
 +#ifndef STATUS_SERVER_SID_MISMATCH
 +# define STATUS_SERVER_SID_MISMATCH ((NTSTATUS) 0xC00002A0L)
 +#endif
 +
 +#ifndef STATUS_DS_NO_ATTRIBUTE_OR_VALUE
 +# define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS) 0xC00002A1L)
 +#endif
 +
 +#ifndef STATUS_DS_INVALID_ATTRIBUTE_SYNTAX
 +# define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS) 0xC00002A2L)
 +#endif
 +
 +#ifndef STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED
 +# define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS) 0xC00002A3L)
 +#endif
 +
 +#ifndef STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS
 +# define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS) 0xC00002A4L)
 +#endif
 +
 +#ifndef STATUS_DS_BUSY
 +# define STATUS_DS_BUSY ((NTSTATUS) 0xC00002A5L)
 +#endif
 +
 +#ifndef STATUS_DS_UNAVAILABLE
 +# define STATUS_DS_UNAVAILABLE ((NTSTATUS) 0xC00002A6L)
 +#endif
 +
 +#ifndef STATUS_DS_NO_RIDS_ALLOCATED
 +# define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS) 0xC00002A7L)
 +#endif
 +
 +#ifndef STATUS_DS_NO_MORE_RIDS
 +# define STATUS_DS_NO_MORE_RIDS ((NTSTATUS) 0xC00002A8L)
 +#endif
 +
 +#ifndef STATUS_DS_INCORRECT_ROLE_OWNER
 +# define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS) 0xC00002A9L)
 +#endif
 +
 +#ifndef STATUS_DS_RIDMGR_INIT_ERROR
 +# define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS) 0xC00002AAL)
 +#endif
 +
 +#ifndef STATUS_DS_OBJ_CLASS_VIOLATION
 +# define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS) 0xC00002ABL)
 +#endif
 +
 +#ifndef STATUS_DS_CANT_ON_NON_LEAF
 +# define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS) 0xC00002ACL)
 +#endif
 +
 +#ifndef STATUS_DS_CANT_ON_RDN
 +# define STATUS_DS_CANT_ON_RDN ((NTSTATUS) 0xC00002ADL)
 +#endif
 +
 +#ifndef STATUS_DS_CANT_MOD_OBJ_CLASS
 +# define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS) 0xC00002AEL)
 +#endif
 +
 +#ifndef STATUS_DS_CROSS_DOM_MOVE_FAILED
 +# define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS) 0xC00002AFL)
 +#endif
 +
 +#ifndef STATUS_DS_GC_NOT_AVAILABLE
 +# define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS) 0xC00002B0L)
 +#endif
 +
 +#ifndef STATUS_DIRECTORY_SERVICE_REQUIRED
 +# define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS) 0xC00002B1L)
 +#endif
 +
 +#ifndef STATUS_REPARSE_ATTRIBUTE_CONFLICT
 +# define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS) 0xC00002B2L)
 +#endif
 +
 +#ifndef STATUS_CANT_ENABLE_DENY_ONLY
 +# define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS) 0xC00002B3L)
 +#endif
 +
 +#ifndef STATUS_FLOAT_MULTIPLE_FAULTS
 +# define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS) 0xC00002B4L)
 +#endif
 +
 +#ifndef STATUS_FLOAT_MULTIPLE_TRAPS
 +# define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS) 0xC00002B5L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_REMOVED
 +# define STATUS_DEVICE_REMOVED ((NTSTATUS) 0xC00002B6L)
 +#endif
 +
 +#ifndef STATUS_JOURNAL_DELETE_IN_PROGRESS
 +# define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS) 0xC00002B7L)
 +#endif
 +
 +#ifndef STATUS_JOURNAL_NOT_ACTIVE
 +# define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS) 0xC00002B8L)
 +#endif
 +
 +#ifndef STATUS_NOINTERFACE
 +# define STATUS_NOINTERFACE ((NTSTATUS) 0xC00002B9L)
 +#endif
 +
 +#ifndef STATUS_DS_ADMIN_LIMIT_EXCEEDED
 +# define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00002C1L)
 +#endif
 +
 +#ifndef STATUS_DRIVER_FAILED_SLEEP
 +# define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS) 0xC00002C2L)
 +#endif
 +
 +#ifndef STATUS_MUTUAL_AUTHENTICATION_FAILED
 +# define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS) 0xC00002C3L)
 +#endif
 +
 +#ifndef STATUS_CORRUPT_SYSTEM_FILE
 +# define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS) 0xC00002C4L)
 +#endif
 +
 +#ifndef STATUS_DATATYPE_MISALIGNMENT_ERROR
 +# define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS) 0xC00002C5L)
 +#endif
 +
 +#ifndef STATUS_WMI_READ_ONLY
 +# define STATUS_WMI_READ_ONLY ((NTSTATUS) 0xC00002C6L)
 +#endif
 +
 +#ifndef STATUS_WMI_SET_FAILURE
 +# define STATUS_WMI_SET_FAILURE ((NTSTATUS) 0xC00002C7L)
 +#endif
 +
 +#ifndef STATUS_COMMITMENT_MINIMUM
 +# define STATUS_COMMITMENT_MINIMUM ((NTSTATUS) 0xC00002C8L)
 +#endif
 +
 +#ifndef STATUS_REG_NAT_CONSUMPTION
 +# define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS) 0xC00002C9L)
 +#endif
 +
 +#ifndef STATUS_TRANSPORT_FULL
 +# define STATUS_TRANSPORT_FULL ((NTSTATUS) 0xC00002CAL)
 +#endif
 +
 +#ifndef STATUS_DS_SAM_INIT_FAILURE
 +# define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002CBL)
 +#endif
 +
 +#ifndef STATUS_ONLY_IF_CONNECTED
 +# define STATUS_ONLY_IF_CONNECTED ((NTSTATUS) 0xC00002CCL)
 +#endif
 +
 +#ifndef STATUS_DS_SENSITIVE_GROUP_VIOLATION
 +# define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS) 0xC00002CDL)
 +#endif
 +
 +#ifndef STATUS_PNP_RESTART_ENUMERATION
 +# define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS) 0xC00002CEL)
 +#endif
 +
 +#ifndef STATUS_JOURNAL_ENTRY_DELETED
 +# define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS) 0xC00002CFL)
 +#endif
 +
 +#ifndef STATUS_DS_CANT_MOD_PRIMARYGROUPID
 +# define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS) 0xC00002D0L)
 +#endif
 +
 +#ifndef STATUS_SYSTEM_IMAGE_BAD_SIGNATURE
 +# define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS) 0xC00002D1L)
 +#endif
 +
 +#ifndef STATUS_PNP_REBOOT_REQUIRED
 +# define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS) 0xC00002D2L)
 +#endif
 +
 +#ifndef STATUS_POWER_STATE_INVALID
 +# define STATUS_POWER_STATE_INVALID ((NTSTATUS) 0xC00002D3L)
 +#endif
 +
 +#ifndef STATUS_DS_INVALID_GROUP_TYPE
 +# define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS) 0xC00002D4L)
 +#endif
 +
 +#ifndef STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN
 +# define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D5L)
 +#endif
 +
 +#ifndef STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN
 +# define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D6L)
 +#endif
 +
 +#ifndef STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER
 +# define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D7L)
 +#endif
 +
 +#ifndef STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER
 +# define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC00002D8L)
 +#endif
 +
 +#ifndef STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER
 +# define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D9L)
 +#endif
 +
 +#ifndef STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER
 +# define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS) 0xC00002DAL)
 +#endif
 +
 +#ifndef STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER
 +# define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS) 0xC00002DBL)
 +#endif
 +
 +#ifndef STATUS_DS_HAVE_PRIMARY_MEMBERS
 +# define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS) 0xC00002DCL)
 +#endif
 +
 +#ifndef STATUS_WMI_NOT_SUPPORTED
 +# define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS) 0xC00002DDL)
 +#endif
 +
 +#ifndef STATUS_INSUFFICIENT_POWER
 +# define STATUS_INSUFFICIENT_POWER ((NTSTATUS) 0xC00002DEL)
 +#endif
 +
 +#ifndef STATUS_SAM_NEED_BOOTKEY_PASSWORD
 +# define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS) 0xC00002DFL)
 +#endif
 +
 +#ifndef STATUS_SAM_NEED_BOOTKEY_FLOPPY
 +# define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS) 0xC00002E0L)
 +#endif
 +
 +#ifndef STATUS_DS_CANT_START
 +# define STATUS_DS_CANT_START ((NTSTATUS) 0xC00002E1L)
 +#endif
 +
 +#ifndef STATUS_DS_INIT_FAILURE
 +# define STATUS_DS_INIT_FAILURE ((NTSTATUS) 0xC00002E2L)
 +#endif
 +
 +#ifndef STATUS_SAM_INIT_FAILURE
 +# define STATUS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002E3L)
 +#endif
 +
 +#ifndef STATUS_DS_GC_REQUIRED
 +# define STATUS_DS_GC_REQUIRED ((NTSTATUS) 0xC00002E4L)
 +#endif
 +
 +#ifndef STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY
 +# define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS) 0xC00002E5L)
 +#endif
 +
 +#ifndef STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS
 +# define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS) 0xC00002E6L)
 +#endif
 +
 +#ifndef STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED
 +# define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS) 0xC00002E7L)
 +#endif
 +
 +#ifndef STATUS_MULTIPLE_FAULT_VIOLATION
 +# define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS) 0xC00002E8L)
 +#endif
 +
 +#ifndef STATUS_CURRENT_DOMAIN_NOT_ALLOWED
 +# define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS) 0xC00002E9L)
 +#endif
 +
 +#ifndef STATUS_CANNOT_MAKE
 +# define STATUS_CANNOT_MAKE ((NTSTATUS) 0xC00002EAL)
 +#endif
 +
 +#ifndef STATUS_SYSTEM_SHUTDOWN
 +# define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS) 0xC00002EBL)
 +#endif
 +
 +#ifndef STATUS_DS_INIT_FAILURE_CONSOLE
 +# define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002ECL)
 +#endif
 +
 +#ifndef STATUS_DS_SAM_INIT_FAILURE_CONSOLE
 +# define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002EDL)
 +#endif
 +
 +#ifndef STATUS_UNFINISHED_CONTEXT_DELETED
 +# define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS) 0xC00002EEL)
 +#endif
 +
 +#ifndef STATUS_NO_TGT_REPLY
 +# define STATUS_NO_TGT_REPLY ((NTSTATUS) 0xC00002EFL)
 +#endif
 +
 +#ifndef STATUS_OBJECTID_NOT_FOUND
 +# define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS) 0xC00002F0L)
 +#endif
 +
 +#ifndef STATUS_NO_IP_ADDRESSES
 +# define STATUS_NO_IP_ADDRESSES ((NTSTATUS) 0xC00002F1L)
 +#endif
 +
 +#ifndef STATUS_WRONG_CREDENTIAL_HANDLE
 +# define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS) 0xC00002F2L)
 +#endif
 +
 +#ifndef STATUS_CRYPTO_SYSTEM_INVALID
 +# define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS) 0xC00002F3L)
 +#endif
 +
 +#ifndef STATUS_MAX_REFERRALS_EXCEEDED
 +# define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS) 0xC00002F4L)
 +#endif
 +
 +#ifndef STATUS_MUST_BE_KDC
 +# define STATUS_MUST_BE_KDC ((NTSTATUS) 0xC00002F5L)
 +#endif
 +
 +#ifndef STATUS_STRONG_CRYPTO_NOT_SUPPORTED
 +# define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS) 0xC00002F6L)
 +#endif
 +
 +#ifndef STATUS_TOO_MANY_PRINCIPALS
 +# define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS) 0xC00002F7L)
 +#endif
 +
 +#ifndef STATUS_NO_PA_DATA
 +# define STATUS_NO_PA_DATA ((NTSTATUS) 0xC00002F8L)
 +#endif
 +
 +#ifndef STATUS_PKINIT_NAME_MISMATCH
 +# define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS) 0xC00002F9L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_LOGON_REQUIRED
 +# define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS) 0xC00002FAL)
 +#endif
 +
 +#ifndef STATUS_KDC_INVALID_REQUEST
 +# define STATUS_KDC_INVALID_REQUEST ((NTSTATUS) 0xC00002FBL)
 +#endif
 +
 +#ifndef STATUS_KDC_UNABLE_TO_REFER
 +# define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS) 0xC00002FCL)
 +#endif
 +
 +#ifndef STATUS_KDC_UNKNOWN_ETYPE
 +# define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS) 0xC00002FDL)
 +#endif
 +
 +#ifndef STATUS_SHUTDOWN_IN_PROGRESS
 +# define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FEL)
 +#endif
 +
 +#ifndef STATUS_SERVER_SHUTDOWN_IN_PROGRESS
 +# define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FFL)
 +#endif
 +
 +#ifndef STATUS_NOT_SUPPORTED_ON_SBS
 +# define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS) 0xC0000300L)
 +#endif
 +
 +#ifndef STATUS_WMI_GUID_DISCONNECTED
 +# define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS) 0xC0000301L)
 +#endif
 +
 +#ifndef STATUS_WMI_ALREADY_DISABLED
 +# define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS) 0xC0000302L)
 +#endif
 +
 +#ifndef STATUS_WMI_ALREADY_ENABLED
 +# define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS) 0xC0000303L)
 +#endif
 +
 +#ifndef STATUS_MFT_TOO_FRAGMENTED
 +# define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS) 0xC0000304L)
 +#endif
 +
 +#ifndef STATUS_COPY_PROTECTION_FAILURE
 +# define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS) 0xC0000305L)
 +#endif
 +
 +#ifndef STATUS_CSS_AUTHENTICATION_FAILURE
 +# define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS) 0xC0000306L)
 +#endif
 +
 +#ifndef STATUS_CSS_KEY_NOT_PRESENT
 +# define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS) 0xC0000307L)
 +#endif
 +
 +#ifndef STATUS_CSS_KEY_NOT_ESTABLISHED
 +# define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS) 0xC0000308L)
 +#endif
 +
 +#ifndef STATUS_CSS_SCRAMBLED_SECTOR
 +# define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS) 0xC0000309L)
 +#endif
 +
 +#ifndef STATUS_CSS_REGION_MISMATCH
 +# define STATUS_CSS_REGION_MISMATCH ((NTSTATUS) 0xC000030AL)
 +#endif
 +
 +#ifndef STATUS_CSS_RESETS_EXHAUSTED
 +# define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS) 0xC000030BL)
 +#endif
 +
 +#ifndef STATUS_PKINIT_FAILURE
 +# define STATUS_PKINIT_FAILURE ((NTSTATUS) 0xC0000320L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_SUBSYSTEM_FAILURE
 +# define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS) 0xC0000321L)
 +#endif
 +
 +#ifndef STATUS_NO_KERB_KEY
 +# define STATUS_NO_KERB_KEY ((NTSTATUS) 0xC0000322L)
 +#endif
 +
 +#ifndef STATUS_HOST_DOWN
 +# define STATUS_HOST_DOWN ((NTSTATUS) 0xC0000350L)
 +#endif
 +
 +#ifndef STATUS_UNSUPPORTED_PREAUTH
 +# define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS) 0xC0000351L)
 +#endif
 +
 +#ifndef STATUS_EFS_ALG_BLOB_TOO_BIG
 +# define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS) 0xC0000352L)
 +#endif
 +
 +#ifndef STATUS_PORT_NOT_SET
 +# define STATUS_PORT_NOT_SET ((NTSTATUS) 0xC0000353L)
 +#endif
 +
 +#ifndef STATUS_DEBUGGER_INACTIVE
 +# define STATUS_DEBUGGER_INACTIVE ((NTSTATUS) 0xC0000354L)
 +#endif
 +
 +#ifndef STATUS_DS_VERSION_CHECK_FAILURE
 +# define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS) 0xC0000355L)
 +#endif
 +
 +#ifndef STATUS_AUDITING_DISABLED
 +# define STATUS_AUDITING_DISABLED ((NTSTATUS) 0xC0000356L)
 +#endif
 +
 +#ifndef STATUS_PRENT4_MACHINE_ACCOUNT
 +# define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS) 0xC0000357L)
 +#endif
 +
 +#ifndef STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER
 +# define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC0000358L)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_WIN_32
 +# define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS) 0xC0000359L)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_WIN_64
 +# define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS) 0xC000035AL)
 +#endif
 +
 +#ifndef STATUS_BAD_BINDINGS
 +# define STATUS_BAD_BINDINGS ((NTSTATUS) 0xC000035BL)
 +#endif
 +
 +#ifndef STATUS_NETWORK_SESSION_EXPIRED
 +# define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS) 0xC000035CL)
 +#endif
 +
 +#ifndef STATUS_APPHELP_BLOCK
 +# define STATUS_APPHELP_BLOCK ((NTSTATUS) 0xC000035DL)
 +#endif
 +
 +#ifndef STATUS_ALL_SIDS_FILTERED
 +# define STATUS_ALL_SIDS_FILTERED ((NTSTATUS) 0xC000035EL)
 +#endif
 +
 +#ifndef STATUS_NOT_SAFE_MODE_DRIVER
 +# define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS) 0xC000035FL)
 +#endif
 +
 +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT
 +# define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS) 0xC0000361L)
 +#endif
 +
 +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PATH
 +# define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS) 0xC0000362L)
 +#endif
 +
 +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER
 +# define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS) 0xC0000363L)
 +#endif
 +
 +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_OTHER
 +# define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS) 0xC0000364L)
 +#endif
 +
 +#ifndef STATUS_FAILED_DRIVER_ENTRY
 +# define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS) 0xC0000365L)
 +#endif
 +
 +#ifndef STATUS_DEVICE_ENUMERATION_ERROR
 +# define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS) 0xC0000366L)
 +#endif
 +
 +#ifndef STATUS_MOUNT_POINT_NOT_RESOLVED
 +# define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000368L)
 +#endif
 +
 +#ifndef STATUS_INVALID_DEVICE_OBJECT_PARAMETER
 +# define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS) 0xC0000369L)
 +#endif
 +
 +#ifndef STATUS_MCA_OCCURED
 +# define STATUS_MCA_OCCURED ((NTSTATUS) 0xC000036AL)
 +#endif
 +
 +#ifndef STATUS_DRIVER_BLOCKED_CRITICAL
 +# define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS) 0xC000036BL)
 +#endif
 +
 +#ifndef STATUS_DRIVER_BLOCKED
 +# define STATUS_DRIVER_BLOCKED ((NTSTATUS) 0xC000036CL)
 +#endif
 +
 +#ifndef STATUS_DRIVER_DATABASE_ERROR
 +# define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS) 0xC000036DL)
 +#endif
 +
 +#ifndef STATUS_SYSTEM_HIVE_TOO_LARGE
 +# define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS) 0xC000036EL)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMPORT_OF_NON_DLL
 +# define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS) 0xC000036FL)
 +#endif
 +
 +#ifndef STATUS_DS_SHUTTING_DOWN
 +# define STATUS_DS_SHUTTING_DOWN ((NTSTATUS) 0x40000370L)
 +#endif
 +
 +#ifndef STATUS_NO_SECRETS
 +# define STATUS_NO_SECRETS ((NTSTATUS) 0xC0000371L)
 +#endif
 +
 +#ifndef STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY
 +# define STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY ((NTSTATUS) 0xC0000372L)
 +#endif
 +
 +#ifndef STATUS_FAILED_STACK_SWITCH
 +# define STATUS_FAILED_STACK_SWITCH ((NTSTATUS) 0xC0000373L)
 +#endif
 +
 +#ifndef STATUS_HEAP_CORRUPTION
 +# define STATUS_HEAP_CORRUPTION ((NTSTATUS) 0xC0000374L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_WRONG_PIN
 +# define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS) 0xC0000380L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_CARD_BLOCKED
 +# define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS) 0xC0000381L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED
 +# define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS) 0xC0000382L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_NO_CARD
 +# define STATUS_SMARTCARD_NO_CARD ((NTSTATUS) 0xC0000383L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_NO_KEY_CONTAINER
 +# define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS) 0xC0000384L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_NO_CERTIFICATE
 +# define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS) 0xC0000385L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_NO_KEYSET
 +# define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS) 0xC0000386L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_IO_ERROR
 +# define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS) 0xC0000387L)
 +#endif
 +
 +#ifndef STATUS_DOWNGRADE_DETECTED
 +# define STATUS_DOWNGRADE_DETECTED ((NTSTATUS) 0xC0000388L)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_CERT_REVOKED
 +# define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS) 0xC0000389L)
 +#endif
 +
 +#ifndef STATUS_ISSUING_CA_UNTRUSTED
 +# define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS) 0xC000038AL)
 +#endif
 +
 +#ifndef STATUS_REVOCATION_OFFLINE_C
 +# define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS) 0xC000038BL)
 +#endif
 +
 +#ifndef STATUS_PKINIT_CLIENT_FAILURE
 +# define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS) 0xC000038CL)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_CERT_EXPIRED
 +# define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS) 0xC000038DL)
 +#endif
 +
 +#ifndef STATUS_DRIVER_FAILED_PRIOR_UNLOAD
 +# define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS) 0xC000038EL)
 +#endif
 +
 +#ifndef STATUS_SMARTCARD_SILENT_CONTEXT
 +# define STATUS_SMARTCARD_SILENT_CONTEXT ((NTSTATUS) 0xC000038FL)
 +#endif
 +
 +#ifndef STATUS_PER_USER_TRUST_QUOTA_EXCEEDED
 +# define STATUS_PER_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000401L)
 +#endif
 +
 +#ifndef STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED
 +# define STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000402L)
 +#endif
 +
 +#ifndef STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED
 +# define STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000403L)
 +#endif
 +
 +#ifndef STATUS_DS_NAME_NOT_UNIQUE
 +# define STATUS_DS_NAME_NOT_UNIQUE ((NTSTATUS) 0xC0000404L)
 +#endif
 +
 +#ifndef STATUS_DS_DUPLICATE_ID_FOUND
 +# define STATUS_DS_DUPLICATE_ID_FOUND ((NTSTATUS) 0xC0000405L)
 +#endif
 +
 +#ifndef STATUS_DS_GROUP_CONVERSION_ERROR
 +# define STATUS_DS_GROUP_CONVERSION_ERROR ((NTSTATUS) 0xC0000406L)
 +#endif
 +
 +#ifndef STATUS_VOLSNAP_PREPARE_HIBERNATE
 +# define STATUS_VOLSNAP_PREPARE_HIBERNATE ((NTSTATUS) 0xC0000407L)
 +#endif
 +
 +#ifndef STATUS_USER2USER_REQUIRED
 +# define STATUS_USER2USER_REQUIRED ((NTSTATUS) 0xC0000408L)
 +#endif
 +
 +#ifndef STATUS_STACK_BUFFER_OVERRUN
 +# define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS) 0xC0000409L)
 +#endif
 +
 +#ifndef STATUS_NO_S4U_PROT_SUPPORT
 +# define STATUS_NO_S4U_PROT_SUPPORT ((NTSTATUS) 0xC000040AL)
 +#endif
 +
 +#ifndef STATUS_CROSSREALM_DELEGATION_FAILURE
 +# define STATUS_CROSSREALM_DELEGATION_FAILURE ((NTSTATUS) 0xC000040BL)
 +#endif
 +
 +#ifndef STATUS_REVOCATION_OFFLINE_KDC
 +# define STATUS_REVOCATION_OFFLINE_KDC ((NTSTATUS) 0xC000040CL)
 +#endif
 +
 +#ifndef STATUS_ISSUING_CA_UNTRUSTED_KDC
 +# define STATUS_ISSUING_CA_UNTRUSTED_KDC ((NTSTATUS) 0xC000040DL)
 +#endif
 +
 +#ifndef STATUS_KDC_CERT_EXPIRED
 +# define STATUS_KDC_CERT_EXPIRED ((NTSTATUS) 0xC000040EL)
 +#endif
 +
 +#ifndef STATUS_KDC_CERT_REVOKED
 +# define STATUS_KDC_CERT_REVOKED ((NTSTATUS) 0xC000040FL)
 +#endif
 +
 +#ifndef STATUS_PARAMETER_QUOTA_EXCEEDED
 +# define STATUS_PARAMETER_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000410L)
 +#endif
 +
 +#ifndef STATUS_HIBERNATION_FAILURE
 +# define STATUS_HIBERNATION_FAILURE ((NTSTATUS) 0xC0000411L)
 +#endif
 +
 +#ifndef STATUS_DELAY_LOAD_FAILED
 +# define STATUS_DELAY_LOAD_FAILED ((NTSTATUS) 0xC0000412L)
 +#endif
 +
 +#ifndef STATUS_AUTHENTICATION_FIREWALL_FAILED
 +# define STATUS_AUTHENTICATION_FIREWALL_FAILED ((NTSTATUS) 0xC0000413L)
 +#endif
 +
 +#ifndef STATUS_VDM_DISALLOWED
 +# define STATUS_VDM_DISALLOWED ((NTSTATUS) 0xC0000414L)
 +#endif
 +
 +#ifndef STATUS_HUNG_DISPLAY_DRIVER_THREAD
 +# define STATUS_HUNG_DISPLAY_DRIVER_THREAD ((NTSTATUS) 0xC0000415L)
 +#endif
 +
 +#ifndef STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE
 +# define STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE ((NTSTATUS) 0xC0000416L)
 +#endif
 +
 +#ifndef STATUS_INVALID_CRUNTIME_PARAMETER
 +# define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS) 0xC0000417L)
 +#endif
 +
 +#ifndef STATUS_NTLM_BLOCKED
 +# define STATUS_NTLM_BLOCKED ((NTSTATUS) 0xC0000418L)
 +#endif
 +
 +#ifndef STATUS_DS_SRC_SID_EXISTS_IN_FOREST
 +# define STATUS_DS_SRC_SID_EXISTS_IN_FOREST ((NTSTATUS) 0xC0000419L)
 +#endif
 +
 +#ifndef STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST
 +# define STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041AL)
 +#endif
 +
 +#ifndef STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST
 +# define STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041BL)
 +#endif
 +
 +#ifndef STATUS_INVALID_USER_PRINCIPAL_NAME
 +# define STATUS_INVALID_USER_PRINCIPAL_NAME ((NTSTATUS) 0xC000041CL)
 +#endif
 +
 +#ifndef STATUS_FATAL_USER_CALLBACK_EXCEPTION
 +# define STATUS_FATAL_USER_CALLBACK_EXCEPTION ((NTSTATUS) 0xC000041DL)
 +#endif
 +
 +#ifndef STATUS_ASSERTION_FAILURE
 +# define STATUS_ASSERTION_FAILURE ((NTSTATUS) 0xC0000420L)
 +#endif
 +
 +#ifndef STATUS_VERIFIER_STOP
 +# define STATUS_VERIFIER_STOP ((NTSTATUS) 0xC0000421L)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_POP_STACK
 +# define STATUS_CALLBACK_POP_STACK ((NTSTATUS) 0xC0000423L)
 +#endif
 +
 +#ifndef STATUS_INCOMPATIBLE_DRIVER_BLOCKED
 +# define STATUS_INCOMPATIBLE_DRIVER_BLOCKED ((NTSTATUS) 0xC0000424L)
 +#endif
 +
 +#ifndef STATUS_HIVE_UNLOADED
 +# define STATUS_HIVE_UNLOADED ((NTSTATUS) 0xC0000425L)
 +#endif
 +
 +#ifndef STATUS_COMPRESSION_DISABLED
 +# define STATUS_COMPRESSION_DISABLED ((NTSTATUS) 0xC0000426L)
 +#endif
 +
 +#ifndef STATUS_FILE_SYSTEM_LIMITATION
 +# define STATUS_FILE_SYSTEM_LIMITATION ((NTSTATUS) 0xC0000427L)
 +#endif
 +
 +#ifndef STATUS_INVALID_IMAGE_HASH
 +# define STATUS_INVALID_IMAGE_HASH ((NTSTATUS) 0xC0000428L)
 +#endif
 +
 +#ifndef STATUS_NOT_CAPABLE
 +# define STATUS_NOT_CAPABLE ((NTSTATUS) 0xC0000429L)
 +#endif
 +
 +#ifndef STATUS_REQUEST_OUT_OF_SEQUENCE
 +# define STATUS_REQUEST_OUT_OF_SEQUENCE ((NTSTATUS) 0xC000042AL)
 +#endif
 +
 +#ifndef STATUS_IMPLEMENTATION_LIMIT
 +# define STATUS_IMPLEMENTATION_LIMIT ((NTSTATUS) 0xC000042BL)
 +#endif
 +
 +#ifndef STATUS_ELEVATION_REQUIRED
 +# define STATUS_ELEVATION_REQUIRED ((NTSTATUS) 0xC000042CL)
 +#endif
 +
 +#ifndef STATUS_NO_SECURITY_CONTEXT
 +# define STATUS_NO_SECURITY_CONTEXT ((NTSTATUS) 0xC000042DL)
 +#endif
 +
 +#ifndef STATUS_PKU2U_CERT_FAILURE
 +# define STATUS_PKU2U_CERT_FAILURE ((NTSTATUS) 0xC000042FL)
 +#endif
 +
 +#ifndef STATUS_BEYOND_VDL
 +# define STATUS_BEYOND_VDL ((NTSTATUS) 0xC0000432L)
 +#endif
 +
 +#ifndef STATUS_ENCOUNTERED_WRITE_IN_PROGRESS
 +# define STATUS_ENCOUNTERED_WRITE_IN_PROGRESS ((NTSTATUS) 0xC0000433L)
 +#endif
 +
 +#ifndef STATUS_PTE_CHANGED
 +# define STATUS_PTE_CHANGED ((NTSTATUS) 0xC0000434L)
 +#endif
 +
 +#ifndef STATUS_PURGE_FAILED
 +# define STATUS_PURGE_FAILED ((NTSTATUS) 0xC0000435L)
 +#endif
 +
 +#ifndef STATUS_CRED_REQUIRES_CONFIRMATION
 +# define STATUS_CRED_REQUIRES_CONFIRMATION ((NTSTATUS) 0xC0000440L)
 +#endif
 +
 +#ifndef STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE
 +# define STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE ((NTSTATUS) 0xC0000441L)
 +#endif
 +
 +#ifndef STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER
 +# define STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER ((NTSTATUS) 0xC0000442L)
 +#endif
 +
 +#ifndef STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE
 +# define STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE ((NTSTATUS) 0xC0000443L)
 +#endif
 +
 +#ifndef STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE
 +# define STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE ((NTSTATUS) 0xC0000444L)
 +#endif
 +
 +#ifndef STATUS_CS_ENCRYPTION_FILE_NOT_CSE
 +# define STATUS_CS_ENCRYPTION_FILE_NOT_CSE ((NTSTATUS) 0xC0000445L)
 +#endif
 +
 +#ifndef STATUS_INVALID_LABEL
 +# define STATUS_INVALID_LABEL ((NTSTATUS) 0xC0000446L)
 +#endif
 +
 +#ifndef STATUS_DRIVER_PROCESS_TERMINATED
 +# define STATUS_DRIVER_PROCESS_TERMINATED ((NTSTATUS) 0xC0000450L)
 +#endif
 +
 +#ifndef STATUS_AMBIGUOUS_SYSTEM_DEVICE
 +# define STATUS_AMBIGUOUS_SYSTEM_DEVICE ((NTSTATUS) 0xC0000451L)
 +#endif
 +
 +#ifndef STATUS_SYSTEM_DEVICE_NOT_FOUND
 +# define STATUS_SYSTEM_DEVICE_NOT_FOUND ((NTSTATUS) 0xC0000452L)
 +#endif
 +
 +#ifndef STATUS_RESTART_BOOT_APPLICATION
 +# define STATUS_RESTART_BOOT_APPLICATION ((NTSTATUS) 0xC0000453L)
 +#endif
 +
 +#ifndef STATUS_INSUFFICIENT_NVRAM_RESOURCES
 +# define STATUS_INSUFFICIENT_NVRAM_RESOURCES ((NTSTATUS) 0xC0000454L)
 +#endif
 +
 +#ifndef STATUS_INVALID_TASK_NAME
 +# define STATUS_INVALID_TASK_NAME ((NTSTATUS) 0xC0000500L)
 +#endif
 +
 +#ifndef STATUS_INVALID_TASK_INDEX
 +# define STATUS_INVALID_TASK_INDEX ((NTSTATUS) 0xC0000501L)
 +#endif
 +
 +#ifndef STATUS_THREAD_ALREADY_IN_TASK
 +# define STATUS_THREAD_ALREADY_IN_TASK ((NTSTATUS) 0xC0000502L)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_BYPASS
 +# define STATUS_CALLBACK_BYPASS ((NTSTATUS) 0xC0000503L)
 +#endif
 +
 +#ifndef STATUS_FAIL_FAST_EXCEPTION
 +# define STATUS_FAIL_FAST_EXCEPTION ((NTSTATUS) 0xC0000602L)
 +#endif
 +
 +#ifndef STATUS_IMAGE_CERT_REVOKED
 +# define STATUS_IMAGE_CERT_REVOKED ((NTSTATUS) 0xC0000603L)
 +#endif
 +
 +#ifndef STATUS_PORT_CLOSED
 +# define STATUS_PORT_CLOSED ((NTSTATUS) 0xC0000700L)
 +#endif
 +
 +#ifndef STATUS_MESSAGE_LOST
 +# define STATUS_MESSAGE_LOST ((NTSTATUS) 0xC0000701L)
 +#endif
 +
 +#ifndef STATUS_INVALID_MESSAGE
 +# define STATUS_INVALID_MESSAGE ((NTSTATUS) 0xC0000702L)
 +#endif
 +
 +#ifndef STATUS_REQUEST_CANCELED
 +# define STATUS_REQUEST_CANCELED ((NTSTATUS) 0xC0000703L)
 +#endif
 +
 +#ifndef STATUS_RECURSIVE_DISPATCH
 +# define STATUS_RECURSIVE_DISPATCH ((NTSTATUS) 0xC0000704L)
 +#endif
 +
 +#ifndef STATUS_LPC_RECEIVE_BUFFER_EXPECTED
 +# define STATUS_LPC_RECEIVE_BUFFER_EXPECTED ((NTSTATUS) 0xC0000705L)
 +#endif
 +
 +#ifndef STATUS_LPC_INVALID_CONNECTION_USAGE
 +# define STATUS_LPC_INVALID_CONNECTION_USAGE ((NTSTATUS) 0xC0000706L)
 +#endif
 +
 +#ifndef STATUS_LPC_REQUESTS_NOT_ALLOWED
 +# define STATUS_LPC_REQUESTS_NOT_ALLOWED ((NTSTATUS) 0xC0000707L)
 +#endif
 +
 +#ifndef STATUS_RESOURCE_IN_USE
 +# define STATUS_RESOURCE_IN_USE ((NTSTATUS) 0xC0000708L)
 +#endif
 +
 +#ifndef STATUS_HARDWARE_MEMORY_ERROR
 +# define STATUS_HARDWARE_MEMORY_ERROR ((NTSTATUS) 0xC0000709L)
 +#endif
 +
 +#ifndef STATUS_THREADPOOL_HANDLE_EXCEPTION
 +# define STATUS_THREADPOOL_HANDLE_EXCEPTION ((NTSTATUS) 0xC000070AL)
 +#endif
 +
 +#ifndef STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED
 +# define STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070BL)
 +#endif
 +
 +#ifndef STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED
 +# define STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070CL)
 +#endif
 +
 +#ifndef STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED
 +# define STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070DL)
 +#endif
 +
 +#ifndef STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED
 +# define STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070EL)
 +#endif
 +
 +#ifndef STATUS_THREADPOOL_RELEASED_DURING_OPERATION
 +# define STATUS_THREADPOOL_RELEASED_DURING_OPERATION ((NTSTATUS) 0xC000070FL)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING
 +# define STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000710L)
 +#endif
 +
 +#ifndef STATUS_APC_RETURNED_WHILE_IMPERSONATING
 +# define STATUS_APC_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000711L)
 +#endif
 +
 +#ifndef STATUS_PROCESS_IS_PROTECTED
 +# define STATUS_PROCESS_IS_PROTECTED ((NTSTATUS) 0xC0000712L)
 +#endif
 +
 +#ifndef STATUS_MCA_EXCEPTION
 +# define STATUS_MCA_EXCEPTION ((NTSTATUS) 0xC0000713L)
 +#endif
 +
 +#ifndef STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE
 +# define STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE ((NTSTATUS) 0xC0000714L)
 +#endif
 +
 +#ifndef STATUS_SYMLINK_CLASS_DISABLED
 +# define STATUS_SYMLINK_CLASS_DISABLED ((NTSTATUS) 0xC0000715L)
 +#endif
 +
 +#ifndef STATUS_INVALID_IDN_NORMALIZATION
 +# define STATUS_INVALID_IDN_NORMALIZATION ((NTSTATUS) 0xC0000716L)
 +#endif
 +
 +#ifndef STATUS_NO_UNICODE_TRANSLATION
 +# define STATUS_NO_UNICODE_TRANSLATION ((NTSTATUS) 0xC0000717L)
 +#endif
 +
 +#ifndef STATUS_ALREADY_REGISTERED
 +# define STATUS_ALREADY_REGISTERED ((NTSTATUS) 0xC0000718L)
 +#endif
 +
 +#ifndef STATUS_CONTEXT_MISMATCH
 +# define STATUS_CONTEXT_MISMATCH ((NTSTATUS) 0xC0000719L)
 +#endif
 +
 +#ifndef STATUS_PORT_ALREADY_HAS_COMPLETION_LIST
 +# define STATUS_PORT_ALREADY_HAS_COMPLETION_LIST ((NTSTATUS) 0xC000071AL)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_RETURNED_THREAD_PRIORITY
 +# define STATUS_CALLBACK_RETURNED_THREAD_PRIORITY ((NTSTATUS) 0xC000071BL)
 +#endif
 +
 +#ifndef STATUS_INVALID_THREAD
 +# define STATUS_INVALID_THREAD ((NTSTATUS) 0xC000071CL)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_RETURNED_TRANSACTION
 +# define STATUS_CALLBACK_RETURNED_TRANSACTION ((NTSTATUS) 0xC000071DL)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_RETURNED_LDR_LOCK
 +# define STATUS_CALLBACK_RETURNED_LDR_LOCK ((NTSTATUS) 0xC000071EL)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_RETURNED_LANG
 +# define STATUS_CALLBACK_RETURNED_LANG ((NTSTATUS) 0xC000071FL)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_RETURNED_PRI_BACK
 +# define STATUS_CALLBACK_RETURNED_PRI_BACK ((NTSTATUS) 0xC0000720L)
 +#endif
 +
 +#ifndef STATUS_CALLBACK_RETURNED_THREAD_AFFINITY
 +# define STATUS_CALLBACK_RETURNED_THREAD_AFFINITY ((NTSTATUS) 0xC0000721L)
 +#endif
 +
 +#ifndef STATUS_DISK_REPAIR_DISABLED
 +# define STATUS_DISK_REPAIR_DISABLED ((NTSTATUS) 0xC0000800L)
 +#endif
 +
 +#ifndef STATUS_DS_DOMAIN_RENAME_IN_PROGRESS
 +# define STATUS_DS_DOMAIN_RENAME_IN_PROGRESS ((NTSTATUS) 0xC0000801L)
 +#endif
 +
 +#ifndef STATUS_DISK_QUOTA_EXCEEDED
 +# define STATUS_DISK_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000802L)
 +#endif
 +
 +#ifndef STATUS_DATA_LOST_REPAIR
 +# define STATUS_DATA_LOST_REPAIR ((NTSTATUS) 0x80000803L)
 +#endif
 +
 +#ifndef STATUS_CONTENT_BLOCKED
 +# define STATUS_CONTENT_BLOCKED ((NTSTATUS) 0xC0000804L)
 +#endif
 +
 +#ifndef STATUS_BAD_CLUSTERS
 +# define STATUS_BAD_CLUSTERS ((NTSTATUS) 0xC0000805L)
 +#endif
 +
 +#ifndef STATUS_VOLUME_DIRTY
 +# define STATUS_VOLUME_DIRTY ((NTSTATUS) 0xC0000806L)
 +#endif
 +
 +#ifndef STATUS_FILE_CHECKED_OUT
 +# define STATUS_FILE_CHECKED_OUT ((NTSTATUS) 0xC0000901L)
 +#endif
 +
 +#ifndef STATUS_CHECKOUT_REQUIRED
 +# define STATUS_CHECKOUT_REQUIRED ((NTSTATUS) 0xC0000902L)
 +#endif
 +
 +#ifndef STATUS_BAD_FILE_TYPE
 +# define STATUS_BAD_FILE_TYPE ((NTSTATUS) 0xC0000903L)
 +#endif
 +
 +#ifndef STATUS_FILE_TOO_LARGE
 +# define STATUS_FILE_TOO_LARGE ((NTSTATUS) 0xC0000904L)
 +#endif
 +
 +#ifndef STATUS_FORMS_AUTH_REQUIRED
 +# define STATUS_FORMS_AUTH_REQUIRED ((NTSTATUS) 0xC0000905L)
 +#endif
 +
 +#ifndef STATUS_VIRUS_INFECTED
 +# define STATUS_VIRUS_INFECTED ((NTSTATUS) 0xC0000906L)
 +#endif
 +
 +#ifndef STATUS_VIRUS_DELETED
 +# define STATUS_VIRUS_DELETED ((NTSTATUS) 0xC0000907L)
 +#endif
 +
 +#ifndef STATUS_BAD_MCFG_TABLE
 +# define STATUS_BAD_MCFG_TABLE ((NTSTATUS) 0xC0000908L)
 +#endif
 +
 +#ifndef STATUS_CANNOT_BREAK_OPLOCK
 +# define STATUS_CANNOT_BREAK_OPLOCK ((NTSTATUS) 0xC0000909L)
 +#endif
 +
 +#ifndef STATUS_WOW_ASSERTION
 +# define STATUS_WOW_ASSERTION ((NTSTATUS) 0xC0009898L)
 +#endif
 +
 +#ifndef STATUS_INVALID_SIGNATURE
 +# define STATUS_INVALID_SIGNATURE ((NTSTATUS) 0xC000A000L)
 +#endif
 +
 +#ifndef STATUS_HMAC_NOT_SUPPORTED
 +# define STATUS_HMAC_NOT_SUPPORTED ((NTSTATUS) 0xC000A001L)
 +#endif
 +
 +#ifndef STATUS_AUTH_TAG_MISMATCH
 +# define STATUS_AUTH_TAG_MISMATCH ((NTSTATUS) 0xC000A002L)
 +#endif
 +
 +#ifndef STATUS_IPSEC_QUEUE_OVERFLOW
 +# define STATUS_IPSEC_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A010L)
 +#endif
 +
 +#ifndef STATUS_ND_QUEUE_OVERFLOW
 +# define STATUS_ND_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A011L)
 +#endif
 +
 +#ifndef STATUS_HOPLIMIT_EXCEEDED
 +# define STATUS_HOPLIMIT_EXCEEDED ((NTSTATUS) 0xC000A012L)
 +#endif
 +
 +#ifndef STATUS_PROTOCOL_NOT_SUPPORTED
 +# define STATUS_PROTOCOL_NOT_SUPPORTED ((NTSTATUS) 0xC000A013L)
 +#endif
 +
 +#ifndef STATUS_FASTPATH_REJECTED
 +# define STATUS_FASTPATH_REJECTED ((NTSTATUS) 0xC000A014L)
 +#endif
 +
 +#ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED
 +# define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED ((NTSTATUS) 0xC000A080L)
 +#endif
 +
 +#ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR
 +# define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR ((NTSTATUS) 0xC000A081L)
 +#endif
 +
 +#ifndef STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR
 +# define STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR ((NTSTATUS) 0xC000A082L)
 +#endif
 +
 +#ifndef STATUS_XML_PARSE_ERROR
 +# define STATUS_XML_PARSE_ERROR ((NTSTATUS) 0xC000A083L)
 +#endif
 +
 +#ifndef STATUS_XMLDSIG_ERROR
 +# define STATUS_XMLDSIG_ERROR ((NTSTATUS) 0xC000A084L)
 +#endif
 +
 +#ifndef STATUS_WRONG_COMPARTMENT
 +# define STATUS_WRONG_COMPARTMENT ((NTSTATUS) 0xC000A085L)
 +#endif
 +
 +#ifndef STATUS_AUTHIP_FAILURE
 +# define STATUS_AUTHIP_FAILURE ((NTSTATUS) 0xC000A086L)
 +#endif
 +
 +#ifndef STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS
 +# define STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS ((NTSTATUS) 0xC000A087L)
 +#endif
 +
 +#ifndef STATUS_DS_OID_NOT_FOUND
 +# define STATUS_DS_OID_NOT_FOUND ((NTSTATUS) 0xC000A088L)
 +#endif
 +
 +#ifndef STATUS_HASH_NOT_SUPPORTED
 +# define STATUS_HASH_NOT_SUPPORTED ((NTSTATUS) 0xC000A100L)
 +#endif
 +
 +#ifndef STATUS_HASH_NOT_PRESENT
 +# define STATUS_HASH_NOT_PRESENT ((NTSTATUS) 0xC000A101L)
 +#endif
 +
 +/* This is not the NTSTATUS_FROM_WIN32 that the DDK provides, because the */
 +/* DDK got it wrong! */
 +#ifdef NTSTATUS_FROM_WIN32
 +# undef NTSTATUS_FROM_WIN32
 +#endif
 +#define NTSTATUS_FROM_WIN32(error) ((NTSTATUS) (error) <= 0 ? \
 +        ((NTSTATUS) (error)) : ((NTSTATUS) (((error) & 0x0000FFFF) | \
 +        (FACILITY_NTWIN32 << 16) | ERROR_SEVERITY_WARNING)))
 +
 +#ifndef JOB_OBJECT_LIMIT_PROCESS_MEMORY
 +# define JOB_OBJECT_LIMIT_PROCESS_MEMORY             0x00000100
 +#endif
 +#ifndef JOB_OBJECT_LIMIT_JOB_MEMORY
 +# define JOB_OBJECT_LIMIT_JOB_MEMORY                 0x00000200
 +#endif
 +#ifndef JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION
 +# define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400
 +#endif
 +#ifndef JOB_OBJECT_LIMIT_BREAKAWAY_OK
 +# define JOB_OBJECT_LIMIT_BREAKAWAY_OK               0x00000800
 +#endif
 +#ifndef JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK
 +# define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK        0x00001000
 +#endif
 +#ifndef JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
 +# define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          0x00002000
 +#endif
 +
++#ifndef SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
++# define SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE 0x00000002
++#endif
++
 +/* from winternl.h */
 +typedef struct _UNICODE_STRING {
 +  USHORT Length;
 +  USHORT MaximumLength;
 +  PWSTR  Buffer;
 +} UNICODE_STRING, *PUNICODE_STRING;
 +
 +typedef const UNICODE_STRING *PCUNICODE_STRING;
 +
 +/* from ntifs.h */
 +#ifndef DEVICE_TYPE
 +# define DEVICE_TYPE DWORD
 +#endif
 +
 +#ifndef VOLUME_NAME_DOS
 +# define VOLUME_NAME_DOS 0x0
 +#endif
 +
 +#ifndef MAPVK_VK_TO_VSC
 +# define MAPVK_VK_TO_VSC (0)
 +#endif
 +
 +/* MinGW already has a definition for REPARSE_DATA_BUFFER, but mingw-w64 does
 + * not.
 + */
 +#if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)
 +  typedef struct _REPARSE_DATA_BUFFER {
 +    ULONG  ReparseTag;
 +    USHORT ReparseDataLength;
 +    USHORT Reserved;
 +    union {
 +      struct {
 +        USHORT SubstituteNameOffset;
 +        USHORT SubstituteNameLength;
 +        USHORT PrintNameOffset;
 +        USHORT PrintNameLength;
 +        ULONG Flags;
 +        WCHAR PathBuffer[1];
 +      } SymbolicLinkReparseBuffer;
 +      struct {
 +        USHORT SubstituteNameOffset;
 +        USHORT SubstituteNameLength;
 +        USHORT PrintNameOffset;
 +        USHORT PrintNameLength;
 +        WCHAR PathBuffer[1];
 +      } MountPointReparseBuffer;
 +      struct {
 +        UCHAR  DataBuffer[1];
 +      } GenericReparseBuffer;
 +    };
 +  } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
 +#endif
 +
 +typedef struct _IO_STATUS_BLOCK {
 +  union {
 +    NTSTATUS Status;
 +    PVOID Pointer;
 +  };
 +  ULONG_PTR Information;
 +} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
 +
 +typedef enum _FILE_INFORMATION_CLASS {
 +  FileDirectoryInformation = 1,
 +  FileFullDirectoryInformation,
 +  FileBothDirectoryInformation,
 +  FileBasicInformation,
 +  FileStandardInformation,
 +  FileInternalInformation,
 +  FileEaInformation,
 +  FileAccessInformation,
 +  FileNameInformation,
 +  FileRenameInformation,
 +  FileLinkInformation,
 +  FileNamesInformation,
 +  FileDispositionInformation,
 +  FilePositionInformation,
 +  FileFullEaInformation,
 +  FileModeInformation,
 +  FileAlignmentInformation,
 +  FileAllInformation,
 +  FileAllocationInformation,
 +  FileEndOfFileInformation,
 +  FileAlternateNameInformation,
 +  FileStreamInformation,
 +  FilePipeInformation,
 +  FilePipeLocalInformation,
 +  FilePipeRemoteInformation,
 +  FileMailslotQueryInformation,
 +  FileMailslotSetInformation,
 +  FileCompressionInformation,
 +  FileObjectIdInformation,
 +  FileCompletionInformation,
 +  FileMoveClusterInformation,
 +  FileQuotaInformation,
 +  FileReparsePointInformation,
 +  FileNetworkOpenInformation,
 +  FileAttributeTagInformation,
 +  FileTrackingInformation,
 +  FileIdBothDirectoryInformation,
 +  FileIdFullDirectoryInformation,
 +  FileValidDataLengthInformation,
 +  FileShortNameInformation,
 +  FileIoCompletionNotificationInformation,
 +  FileIoStatusBlockRangeInformation,
 +  FileIoPriorityHintInformation,
 +  FileSfioReserveInformation,
 +  FileSfioVolumeInformation,
 +  FileHardLinkInformation,
 +  FileProcessIdsUsingFileInformation,
 +  FileNormalizedNameInformation,
 +  FileNetworkPhysicalNameInformation,
 +  FileIdGlobalTxDirectoryInformation,
 +  FileIsRemoteDeviceInformation,
 +  FileAttributeCacheInformation,
 +  FileNumaNodeInformation,
 +  FileStandardLinkInformation,
 +  FileRemoteProtocolInformation,
 +  FileMaximumInformation
 +} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
 +
 +typedef struct _FILE_DIRECTORY_INFORMATION {
 +  ULONG NextEntryOffset;
 +  ULONG FileIndex;
 +  LARGE_INTEGER CreationTime;
 +  LARGE_INTEGER LastAccessTime;
 +  LARGE_INTEGER LastWriteTime;
 +  LARGE_INTEGER ChangeTime;
 +  LARGE_INTEGER EndOfFile;
 +  LARGE_INTEGER AllocationSize;
 +  ULONG FileAttributes;
 +  ULONG FileNameLength;
 +  WCHAR FileName[1];
 +} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
 +
 +typedef struct _FILE_BOTH_DIR_INFORMATION {
 +  ULONG NextEntryOffset;
 +  ULONG FileIndex;
 +  LARGE_INTEGER CreationTime;
 +  LARGE_INTEGER LastAccessTime;
 +  LARGE_INTEGER LastWriteTime;
 +  LARGE_INTEGER ChangeTime;
 +  LARGE_INTEGER EndOfFile;
 +  LARGE_INTEGER AllocationSize;
 +  ULONG FileAttributes;
 +  ULONG FileNameLength;
 +  ULONG EaSize;
 +  CCHAR ShortNameLength;
 +  WCHAR ShortName[12];
 +  WCHAR FileName[1];
 +} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
 +
 +typedef struct _FILE_BASIC_INFORMATION {
 +  LARGE_INTEGER CreationTime;
 +  LARGE_INTEGER LastAccessTime;
 +  LARGE_INTEGER LastWriteTime;
 +  LARGE_INTEGER ChangeTime;
 +  DWORD FileAttributes;
 +} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
 +
 +typedef struct _FILE_STANDARD_INFORMATION {
 +  LARGE_INTEGER AllocationSize;
 +  LARGE_INTEGER EndOfFile;
 +  ULONG         NumberOfLinks;
 +  BOOLEAN       DeletePending;
 +  BOOLEAN       Directory;
 +} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
 +
 +typedef struct _FILE_INTERNAL_INFORMATION {
 +  LARGE_INTEGER IndexNumber;
 +} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
 +
 +typedef struct _FILE_EA_INFORMATION {
 +  ULONG EaSize;
 +} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
 +
 +typedef struct _FILE_ACCESS_INFORMATION {
 +  ACCESS_MASK AccessFlags;
 +} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
 +
 +typedef struct _FILE_POSITION_INFORMATION {
 +  LARGE_INTEGER CurrentByteOffset;
 +} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
 +
 +typedef struct _FILE_MODE_INFORMATION {
 +  ULONG Mode;
 +} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
 +
 +typedef struct _FILE_ALIGNMENT_INFORMATION {
 +  ULONG AlignmentRequirement;
 +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
 +
 +typedef struct _FILE_NAME_INFORMATION {
 +  ULONG FileNameLength;
 +  WCHAR FileName[1];
 +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
 +
 +typedef struct _FILE_END_OF_FILE_INFORMATION {
 +  LARGE_INTEGER  EndOfFile;
 +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
 +
 +typedef struct _FILE_ALL_INFORMATION {
 +  FILE_BASIC_INFORMATION     BasicInformation;
 +  FILE_STANDARD_INFORMATION  StandardInformation;
 +  FILE_INTERNAL_INFORMATION  InternalInformation;
 +  FILE_EA_INFORMATION        EaInformation;
 +  FILE_ACCESS_INFORMATION    AccessInformation;
 +  FILE_POSITION_INFORMATION  PositionInformation;
 +  FILE_MODE_INFORMATION      ModeInformation;
 +  FILE_ALIGNMENT_INFORMATION AlignmentInformation;
 +  FILE_NAME_INFORMATION      NameInformation;
 +} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
 +
 +typedef struct _FILE_DISPOSITION_INFORMATION {
 +  BOOLEAN DeleteFile;
 +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
 +
 +typedef struct _FILE_PIPE_LOCAL_INFORMATION {
 +  ULONG NamedPipeType;
 +  ULONG NamedPipeConfiguration;
 +  ULONG MaximumInstances;
 +  ULONG CurrentInstances;
 +  ULONG InboundQuota;
 +  ULONG ReadDataAvailable;
 +  ULONG OutboundQuota;
 +  ULONG WriteQuotaAvailable;
 +  ULONG NamedPipeState;
 +  ULONG NamedPipeEnd;
 +} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
 +
 +#define FILE_SYNCHRONOUS_IO_ALERT               0x00000010
 +#define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020
 +
 +typedef enum _FS_INFORMATION_CLASS {
 +  FileFsVolumeInformation       = 1,
 +  FileFsLabelInformation        = 2,
 +  FileFsSizeInformation         = 3,
 +  FileFsDeviceInformation       = 4,
 +  FileFsAttributeInformation    = 5,
 +  FileFsControlInformation      = 6,
 +  FileFsFullSizeInformation     = 7,
 +  FileFsObjectIdInformation     = 8,
 +  FileFsDriverPathInformation   = 9,
 +  FileFsVolumeFlagsInformation  = 10,
 +  FileFsSectorSizeInformation   = 11
 +} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
 +
 +typedef struct _FILE_FS_VOLUME_INFORMATION {
 +  LARGE_INTEGER VolumeCreationTime;
 +  ULONG         VolumeSerialNumber;
 +  ULONG         VolumeLabelLength;
 +  BOOLEAN       SupportsObjects;
 +  WCHAR         VolumeLabel[1];
 +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
 +
 +typedef struct _FILE_FS_LABEL_INFORMATION {
 +  ULONG VolumeLabelLength;
 +  WCHAR VolumeLabel[1];
 +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
 +
 +typedef struct _FILE_FS_SIZE_INFORMATION {
 +  LARGE_INTEGER TotalAllocationUnits;
 +  LARGE_INTEGER AvailableAllocationUnits;
 +  ULONG         SectorsPerAllocationUnit;
 +  ULONG         BytesPerSector;
 +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
 +
 +typedef struct _FILE_FS_DEVICE_INFORMATION {
 +  DEVICE_TYPE DeviceType;
 +  ULONG       Characteristics;
 +} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
 +
 +typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
 +  ULONG FileSystemAttributes;
 +  LONG  MaximumComponentNameLength;
 +  ULONG FileSystemNameLength;
 +  WCHAR FileSystemName[1];
 +} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
 +
 +typedef struct _FILE_FS_CONTROL_INFORMATION {
 +  LARGE_INTEGER FreeSpaceStartFiltering;
 +  LARGE_INTEGER FreeSpaceThreshold;
 +  LARGE_INTEGER FreeSpaceStopFiltering;
 +  LARGE_INTEGER DefaultQuotaThreshold;
 +  LARGE_INTEGER DefaultQuotaLimit;
 +  ULONG         FileSystemControlFlags;
 +} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
 +
 +typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
 +  LARGE_INTEGER TotalAllocationUnits;
 +  LARGE_INTEGER CallerAvailableAllocationUnits;
 +  LARGE_INTEGER ActualAvailableAllocationUnits;
 +  ULONG         SectorsPerAllocationUnit;
 +  ULONG         BytesPerSector;
 +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
 +
 +typedef struct _FILE_FS_OBJECTID_INFORMATION {
 +  UCHAR ObjectId[16];
 +  UCHAR ExtendedInfo[48];
 +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
 +
 +typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
 +  BOOLEAN DriverInPath;
 +  ULONG   DriverNameLength;
 +  WCHAR   DriverName[1];
 +} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
 +
 +typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
 +  ULONG Flags;
 +} FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
 +
 +typedef struct _FILE_FS_SECTOR_SIZE_INFORMATION {
 +  ULONG LogicalBytesPerSector;
 +  ULONG PhysicalBytesPerSectorForAtomicity;
 +  ULONG PhysicalBytesPerSectorForPerformance;
 +  ULONG FileSystemEffectivePhysicalBytesPerSectorForAtomicity;
 +  ULONG Flags;
 +  ULONG ByteOffsetForSectorAlignment;
 +  ULONG ByteOffsetForPartitionAlignment;
 +} FILE_FS_SECTOR_SIZE_INFORMATION, *PFILE_FS_SECTOR_SIZE_INFORMATION;
 +
 +typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
 +    LARGE_INTEGER IdleTime;
 +    LARGE_INTEGER KernelTime;
 +    LARGE_INTEGER UserTime;
 +    LARGE_INTEGER DpcTime;
 +    LARGE_INTEGER InterruptTime;
 +    ULONG InterruptCount;
 +} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
 +
 +#ifndef SystemProcessorPerformanceInformation
 +# define SystemProcessorPerformanceInformation 8
 +#endif
 +
 +#ifndef FILE_DEVICE_FILE_SYSTEM
 +# define FILE_DEVICE_FILE_SYSTEM 0x00000009
 +#endif
 +
 +#ifndef FILE_DEVICE_NETWORK
 +# define FILE_DEVICE_NETWORK 0x00000012
 +#endif
 +
 +#ifndef METHOD_BUFFERED
 +# define METHOD_BUFFERED 0
 +#endif
 +
 +#ifndef METHOD_IN_DIRECT
 +# define METHOD_IN_DIRECT 1
 +#endif
 +
 +#ifndef METHOD_OUT_DIRECT
 +# define METHOD_OUT_DIRECT 2
 +#endif
 +
 +#ifndef METHOD_NEITHER
 +#define METHOD_NEITHER 3
 +#endif
 +
 +#ifndef METHOD_DIRECT_TO_HARDWARE
 +# define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
 +#endif
 +
 +#ifndef METHOD_DIRECT_FROM_HARDWARE
 +# define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
 +#endif
 +
 +#ifndef FILE_ANY_ACCESS
 +# define FILE_ANY_ACCESS 0
 +#endif
 +
 +#ifndef FILE_SPECIAL_ACCESS
 +# define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS)
 +#endif
 +
 +#ifndef FILE_READ_ACCESS
 +# define FILE_READ_ACCESS 0x0001
 +#endif
 +
 +#ifndef FILE_WRITE_ACCESS
 +# define FILE_WRITE_ACCESS 0x0002
 +#endif
 +
 +#ifndef CTL_CODE
 +# define CTL_CODE(device_type, function, method, access)                      \
 +    (((device_type) << 16) | ((access) << 14) | ((function) << 2) | (method))
 +#endif
 +
 +#ifndef FSCTL_SET_REPARSE_POINT
 +# define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,            \
 +                                          41,                                 \
 +                                          METHOD_BUFFERED,                    \
 +                                          FILE_SPECIAL_ACCESS)
 +#endif
 +
 +#ifndef FSCTL_GET_REPARSE_POINT
 +# define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,            \
 +                                          42,                                 \
 +                                          METHOD_BUFFERED,                    \
 +                                          FILE_ANY_ACCESS)
 +#endif
 +
 +#ifndef FSCTL_DELETE_REPARSE_POINT
 +# define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,         \
 +                                             43,                              \
 +                                             METHOD_BUFFERED,                 \
 +                                             FILE_SPECIAL_ACCESS)
 +#endif
 +
 +#ifndef IO_REPARSE_TAG_SYMLINK
 +# define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
 +#endif
 +
 +typedef VOID (NTAPI *PIO_APC_ROUTINE)
 +             (PVOID ApcContext,
 +              PIO_STATUS_BLOCK IoStatusBlock,
 +              ULONG Reserved);
 +
 +typedef ULONG (NTAPI *sRtlNtStatusToDosError)
 +              (NTSTATUS Status);
 +
 +typedef NTSTATUS (NTAPI *sNtDeviceIoControlFile)
 +                 (HANDLE FileHandle,
 +                  HANDLE Event,
 +                  PIO_APC_ROUTINE ApcRoutine,
 +                  PVOID ApcContext,
 +                  PIO_STATUS_BLOCK IoStatusBlock,
 +                  ULONG IoControlCode,
 +                  PVOID InputBuffer,
 +                  ULONG InputBufferLength,
 +                  PVOID OutputBuffer,
 +                  ULONG OutputBufferLength);
 +
 +typedef NTSTATUS (NTAPI *sNtQueryInformationFile)
 +                 (HANDLE FileHandle,
 +                  PIO_STATUS_BLOCK IoStatusBlock,
 +                  PVOID FileInformation,
 +                  ULONG Length,
 +                  FILE_INFORMATION_CLASS FileInformationClass);
 +
 +typedef NTSTATUS (NTAPI *sNtSetInformationFile)
 +                 (HANDLE FileHandle,
 +                  PIO_STATUS_BLOCK IoStatusBlock,
 +                  PVOID FileInformation,
 +                  ULONG Length,
 +                  FILE_INFORMATION_CLASS FileInformationClass);
 +
 +typedef NTSTATUS (NTAPI *sNtQueryVolumeInformationFile)
 +                 (HANDLE FileHandle,
 +                  PIO_STATUS_BLOCK IoStatusBlock,
 +                  PVOID FsInformation,
 +                  ULONG Length,
 +                  FS_INFORMATION_CLASS FsInformationClass);
 +
 +typedef NTSTATUS (NTAPI *sNtQuerySystemInformation)
 +                 (UINT SystemInformationClass,
 +                  PVOID SystemInformation,
 +                  ULONG SystemInformationLength,
 +                  PULONG ReturnLength);
 +
 +typedef NTSTATUS (NTAPI *sNtQueryDirectoryFile)
 +                 (HANDLE FileHandle,
 +                  HANDLE Event,
 +                  PIO_APC_ROUTINE ApcRoutine,
 +                  PVOID ApcContext,
 +                  PIO_STATUS_BLOCK IoStatusBlock,
 +                  PVOID FileInformation,
 +                  ULONG Length,
 +                  FILE_INFORMATION_CLASS FileInformationClass,
 +                  BOOLEAN ReturnSingleEntry,
 +                  PUNICODE_STRING FileName,
 +                  BOOLEAN RestartScan
 +                );
 +
 +/*
 + * Kernel32 headers
 + */
 +#ifndef FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
 +# define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
 +#endif
 +
 +#ifndef FILE_SKIP_SET_EVENT_ON_HANDLE
 +# define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
 +#endif
 +
 +#ifndef SYMBOLIC_LINK_FLAG_DIRECTORY
 +# define SYMBOLIC_LINK_FLAG_DIRECTORY 0x1
 +#endif
 +
 +#if (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) \
 + || (defined(_MSC_VER) && _MSC_VER < 1500)
 +  typedef struct _OVERLAPPED_ENTRY {
 +      ULONG_PTR lpCompletionKey;
 +      LPOVERLAPPED lpOverlapped;
 +      ULONG_PTR Internal;
 +      DWORD dwNumberOfBytesTransferred;
 +  } OVERLAPPED_ENTRY, *LPOVERLAPPED_ENTRY;
 +#endif
 +
 +/* from wincon.h */
 +#ifndef ENABLE_INSERT_MODE
 +# define ENABLE_INSERT_MODE 0x20
 +#endif
 +
 +#ifndef ENABLE_QUICK_EDIT_MODE
 +# define ENABLE_QUICK_EDIT_MODE 0x40
 +#endif
 +
 +#ifndef ENABLE_EXTENDED_FLAGS
 +# define ENABLE_EXTENDED_FLAGS 0x80
 +#endif
 +
 +/* from winerror.h */
 +#ifndef ERROR_ELEVATION_REQUIRED
 +# define ERROR_ELEVATION_REQUIRED 740
 +#endif
 +
 +#ifndef ERROR_SYMLINK_NOT_SUPPORTED
 +# define ERROR_SYMLINK_NOT_SUPPORTED 1464
 +#endif
 +
 +#ifndef ERROR_MUI_FILE_NOT_FOUND
 +# define ERROR_MUI_FILE_NOT_FOUND 15100
 +#endif
 +
 +#ifndef ERROR_MUI_INVALID_FILE
 +# define ERROR_MUI_INVALID_FILE 15101
 +#endif
 +
 +#ifndef ERROR_MUI_INVALID_RC_CONFIG
 +# define ERROR_MUI_INVALID_RC_CONFIG 15102
 +#endif
 +
 +#ifndef ERROR_MUI_INVALID_LOCALE_NAME
 +# define ERROR_MUI_INVALID_LOCALE_NAME 15103
 +#endif
 +
 +#ifndef ERROR_MUI_INVALID_ULTIMATEFALLBACK_NAME
 +# define ERROR_MUI_INVALID_ULTIMATEFALLBACK_NAME 15104
 +#endif
 +
 +#ifndef ERROR_MUI_FILE_NOT_LOADED
 +# define ERROR_MUI_FILE_NOT_LOADED 15105
 +#endif
 +
 +typedef BOOL (WINAPI *sGetQueuedCompletionStatusEx)
 +             (HANDLE CompletionPort,
 +              LPOVERLAPPED_ENTRY lpCompletionPortEntries,
 +              ULONG ulCount,
 +              PULONG ulNumEntriesRemoved,
 +              DWORD dwMilliseconds,
 +              BOOL fAlertable);
 +
 +typedef BOOL (WINAPI* sSetFileCompletionNotificationModes)
 +             (HANDLE FileHandle,
 +              UCHAR Flags);
 +
 +typedef BOOLEAN (WINAPI* sCreateSymbolicLinkW)
 +                (LPCWSTR lpSymlinkFileName,
 +                 LPCWSTR lpTargetFileName,
 +                 DWORD dwFlags);
 +
 +typedef BOOL (WINAPI* sCancelIoEx)
 +             (HANDLE hFile,
 +              LPOVERLAPPED lpOverlapped);
 +
 +typedef VOID (WINAPI* sInitializeConditionVariable)
 +             (PCONDITION_VARIABLE ConditionVariable);
 +
 +typedef BOOL (WINAPI* sSleepConditionVariableCS)
 +             (PCONDITION_VARIABLE ConditionVariable,
 +              PCRITICAL_SECTION CriticalSection,
 +              DWORD dwMilliseconds);
 +
 +typedef BOOL (WINAPI* sSleepConditionVariableSRW)
 +             (PCONDITION_VARIABLE ConditionVariable,
 +              PSRWLOCK SRWLock,
 +              DWORD dwMilliseconds,
 +              ULONG Flags);
 +
 +typedef VOID (WINAPI* sWakeAllConditionVariable)
 +             (PCONDITION_VARIABLE ConditionVariable);
 +
 +typedef VOID (WINAPI* sWakeConditionVariable)
 +             (PCONDITION_VARIABLE ConditionVariable);
 +
 +typedef BOOL (WINAPI* sCancelSynchronousIo)
 +             (HANDLE hThread);
 +
 +typedef DWORD (WINAPI* sGetFinalPathNameByHandleW)
 +             (HANDLE hFile,
 +              LPWSTR lpszFilePath,
 +              DWORD cchFilePath,
 +              DWORD dwFlags);
 +
 +/* from powerbase.h */
 +#ifndef DEVICE_NOTIFY_CALLBACK
 +# define DEVICE_NOTIFY_CALLBACK 2
 +#endif
 +
 +#ifndef PBT_APMRESUMEAUTOMATIC
 +# define PBT_APMRESUMEAUTOMATIC 18
 +#endif
 +
 +#ifndef PBT_APMRESUMESUSPEND
 +# define PBT_APMRESUMESUSPEND 7
 +#endif
 +
 +typedef ULONG CALLBACK _DEVICE_NOTIFY_CALLBACK_ROUTINE(
 +  PVOID Context,
 +  ULONG Type,
 +  PVOID Setting
 +);
 +typedef _DEVICE_NOTIFY_CALLBACK_ROUTINE* _PDEVICE_NOTIFY_CALLBACK_ROUTINE;
 +
 +typedef struct _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS {
 +  _PDEVICE_NOTIFY_CALLBACK_ROUTINE Callback;
 +  PVOID Context;
 +} _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS, *_PDEVICE_NOTIFY_SUBSCRIBE_PARAMETERS;
 +
 +typedef PVOID _HPOWERNOTIFY;
 +typedef _HPOWERNOTIFY *_PHPOWERNOTIFY;
 +
 +typedef DWORD (WINAPI *sPowerRegisterSuspendResumeNotification)
 +              (DWORD         Flags,
 +               HANDLE        Recipient,
 +               _PHPOWERNOTIFY RegistrationHandle);
 +
++/* from Winuser.h */
++typedef VOID (CALLBACK* WINEVENTPROC)
++             (HWINEVENTHOOK hWinEventHook,
++              DWORD         event,
++              HWND          hwnd,
++              LONG          idObject,
++              LONG          idChild,
++              DWORD         idEventThread,
++              DWORD         dwmsEventTime);
++
++typedef HWINEVENTHOOK (WINAPI *sSetWinEventHook)
++                      (UINT         eventMin,
++                       UINT         eventMax,
++                       HMODULE      hmodWinEventProc,
++                       WINEVENTPROC lpfnWinEventProc,
++                       DWORD        idProcess,
++                       DWORD        idThread,
++                       UINT         dwflags);
++
 +
 +/* Ntdll function pointers */
 +extern sRtlNtStatusToDosError pRtlNtStatusToDosError;
 +extern sNtDeviceIoControlFile pNtDeviceIoControlFile;
 +extern sNtQueryInformationFile pNtQueryInformationFile;
 +extern sNtSetInformationFile pNtSetInformationFile;
 +extern sNtQueryVolumeInformationFile pNtQueryVolumeInformationFile;
 +extern sNtQueryDirectoryFile pNtQueryDirectoryFile;
 +extern sNtQuerySystemInformation pNtQuerySystemInformation;
 +
 +
 +/* Kernel32 function pointers */
 +extern sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx;
 +extern sSetFileCompletionNotificationModes pSetFileCompletionNotificationModes;
 +extern sCreateSymbolicLinkW pCreateSymbolicLinkW;
 +extern sCancelIoEx pCancelIoEx;
 +extern sInitializeConditionVariable pInitializeConditionVariable;
 +extern sSleepConditionVariableCS pSleepConditionVariableCS;
 +extern sSleepConditionVariableSRW pSleepConditionVariableSRW;
 +extern sWakeAllConditionVariable pWakeAllConditionVariable;
 +extern sWakeConditionVariable pWakeConditionVariable;
 +extern sCancelSynchronousIo pCancelSynchronousIo;
 +extern sGetFinalPathNameByHandleW pGetFinalPathNameByHandleW;
 +
 +
 +/* Powrprof.dll function pointer */
 +extern sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification;
 +
++/* User32.dll function pointer */
++extern sSetWinEventHook pSetWinEventHook;
++
 +#endif /* UV_WIN_WINAPI_H_ */
diff --cc Utilities/cmlibuv/src/win/winsock.h
index 3115fe3,0000000..e8b274e
mode 100644,000000..100644
--- a/Utilities/cmlibuv/src/win/winsock.h
+++ b/Utilities/cmlibuv/src/win/winsock.h
@@@ -1,191 -1,0 +1,194 @@@
 +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#ifndef UV_WIN_WINSOCK_H_
 +#define UV_WIN_WINSOCK_H_
 +
 +#include <winsock2.h>
 +#include <iptypes.h>
 +#include <mswsock.h>
 +#include <ws2tcpip.h>
 +#include <windows.h>
 +
 +#include "winapi.h"
 +
 +
 +/*
 + * MinGW is missing these too
 + */
 +#ifndef SO_UPDATE_CONNECT_CONTEXT
 +# define SO_UPDATE_CONNECT_CONTEXT 0x7010
 +#endif
 +
 +#ifndef TCP_KEEPALIVE
 +# define TCP_KEEPALIVE 3
 +#endif
 +
 +#ifndef IPV6_V6ONLY
 +# define IPV6_V6ONLY 27
 +#endif
 +
 +#ifndef IPV6_HOPLIMIT
 +# define IPV6_HOPLIMIT 21
 +#endif
 +
 +#ifndef SIO_BASE_HANDLE
 +# define SIO_BASE_HANDLE 0x48000022
 +#endif
 +
 +/*
 + * TDI defines that are only in the DDK.
 + * We only need receive flags so far.
 + */
 +#ifndef TDI_RECEIVE_NORMAL
 +  #define TDI_RECEIVE_BROADCAST           0x00000004
 +  #define TDI_RECEIVE_MULTICAST           0x00000008
 +  #define TDI_RECEIVE_PARTIAL             0x00000010
 +  #define TDI_RECEIVE_NORMAL              0x00000020
 +  #define TDI_RECEIVE_EXPEDITED           0x00000040
 +  #define TDI_RECEIVE_PEEK                0x00000080
 +  #define TDI_RECEIVE_NO_RESPONSE_EXP     0x00000100
 +  #define TDI_RECEIVE_COPY_LOOKAHEAD      0x00000200
 +  #define TDI_RECEIVE_ENTIRE_MESSAGE      0x00000400
 +  #define TDI_RECEIVE_AT_DISPATCH_LEVEL   0x00000800
 +  #define TDI_RECEIVE_CONTROL_INFO        0x00001000
 +  #define TDI_RECEIVE_FORCE_INDICATION    0x00002000
 +  #define TDI_RECEIVE_NO_PUSH             0x00004000
 +#endif
 +
 +/*
 + * The "Auxiliary Function Driver" is the windows kernel-mode driver that does
 + * TCP, UDP etc. Winsock is just a layer that dispatches requests to it.
 + * Having these definitions allows us to bypass winsock and make an AFD kernel
 + * call directly, avoiding a bug in winsock's recvfrom implementation.
 + */
 +
 +#define AFD_NO_FAST_IO   0x00000001
 +#define AFD_OVERLAPPED   0x00000002
 +#define AFD_IMMEDIATE    0x00000004
 +
 +#define AFD_POLL_RECEIVE_BIT            0
 +#define AFD_POLL_RECEIVE                (1 << AFD_POLL_RECEIVE_BIT)
 +#define AFD_POLL_RECEIVE_EXPEDITED_BIT  1
 +#define AFD_POLL_RECEIVE_EXPEDITED      (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT)
 +#define AFD_POLL_SEND_BIT               2
 +#define AFD_POLL_SEND                   (1 << AFD_POLL_SEND_BIT)
 +#define AFD_POLL_DISCONNECT_BIT         3
 +#define AFD_POLL_DISCONNECT             (1 << AFD_POLL_DISCONNECT_BIT)
 +#define AFD_POLL_ABORT_BIT              4
 +#define AFD_POLL_ABORT                  (1 << AFD_POLL_ABORT_BIT)
 +#define AFD_POLL_LOCAL_CLOSE_BIT        5
 +#define AFD_POLL_LOCAL_CLOSE            (1 << AFD_POLL_LOCAL_CLOSE_BIT)
 +#define AFD_POLL_CONNECT_BIT            6
 +#define AFD_POLL_CONNECT                (1 << AFD_POLL_CONNECT_BIT)
 +#define AFD_POLL_ACCEPT_BIT             7
 +#define AFD_POLL_ACCEPT                 (1 << AFD_POLL_ACCEPT_BIT)
 +#define AFD_POLL_CONNECT_FAIL_BIT       8
 +#define AFD_POLL_CONNECT_FAIL           (1 << AFD_POLL_CONNECT_FAIL_BIT)
 +#define AFD_POLL_QOS_BIT                9
 +#define AFD_POLL_QOS                    (1 << AFD_POLL_QOS_BIT)
 +#define AFD_POLL_GROUP_QOS_BIT          10
 +#define AFD_POLL_GROUP_QOS              (1 << AFD_POLL_GROUP_QOS_BIT)
 +
 +#define AFD_NUM_POLL_EVENTS             11
 +#define AFD_POLL_ALL                    ((1 << AFD_NUM_POLL_EVENTS) - 1)
 +
 +typedef struct _AFD_RECV_DATAGRAM_INFO {
 +    LPWSABUF BufferArray;
 +    ULONG BufferCount;
 +    ULONG AfdFlags;
 +    ULONG TdiFlags;
 +    struct sockaddr* Address;
 +    int* AddressLength;
 +} AFD_RECV_DATAGRAM_INFO, *PAFD_RECV_DATAGRAM_INFO;
 +
 +typedef struct _AFD_RECV_INFO {
 +    LPWSABUF BufferArray;
 +    ULONG BufferCount;
 +    ULONG AfdFlags;
 +    ULONG TdiFlags;
 +} AFD_RECV_INFO, *PAFD_RECV_INFO;
 +
 +
 +#define _AFD_CONTROL_CODE(operation, method) \
 +    ((FSCTL_AFD_BASE) << 12 | (operation << 2) | method)
 +
 +#define FSCTL_AFD_BASE FILE_DEVICE_NETWORK
 +
 +#define AFD_RECEIVE            5
 +#define AFD_RECEIVE_DATAGRAM   6
 +#define AFD_POLL               9
 +
 +#define IOCTL_AFD_RECEIVE \
 +    _AFD_CONTROL_CODE(AFD_RECEIVE, METHOD_NEITHER)
 +
 +#define IOCTL_AFD_RECEIVE_DATAGRAM \
 +    _AFD_CONTROL_CODE(AFD_RECEIVE_DATAGRAM, METHOD_NEITHER)
 +
 +#define IOCTL_AFD_POLL \
 +    _AFD_CONTROL_CODE(AFD_POLL, METHOD_BUFFERED)
 +
 +#if (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) \
 + || (defined(_MSC_VER) && _MSC_VER < 1500)
 +typedef struct _IP_ADAPTER_UNICAST_ADDRESS_XP {
 +  /* FIXME: __C89_NAMELESS was removed */
 +  /* __C89_NAMELESS */ union {
 +    ULONGLONG Alignment;
 +    /* __C89_NAMELESS */ struct {
 +      ULONG Length;
 +      DWORD Flags;
 +    };
 +  };
 +  struct _IP_ADAPTER_UNICAST_ADDRESS_XP *Next;
 +  SOCKET_ADDRESS Address;
 +  IP_PREFIX_ORIGIN PrefixOrigin;
 +  IP_SUFFIX_ORIGIN SuffixOrigin;
 +  IP_DAD_STATE DadState;
 +  ULONG ValidLifetime;
 +  ULONG PreferredLifetime;
 +  ULONG LeaseLifetime;
 +} IP_ADAPTER_UNICAST_ADDRESS_XP,*PIP_ADAPTER_UNICAST_ADDRESS_XP;
 +
 +typedef struct _IP_ADAPTER_UNICAST_ADDRESS_LH {
 +  union {
 +    ULONGLONG Alignment;
 +    struct {
 +      ULONG Length;
 +      DWORD Flags;
 +    };
 +  };
 +  struct _IP_ADAPTER_UNICAST_ADDRESS_LH *Next;
 +  SOCKET_ADDRESS Address;
 +  IP_PREFIX_ORIGIN PrefixOrigin;
 +  IP_SUFFIX_ORIGIN SuffixOrigin;
 +  IP_DAD_STATE DadState;
 +  ULONG ValidLifetime;
 +  ULONG PreferredLifetime;
 +  ULONG LeaseLifetime;
 +  UINT8 OnLinkPrefixLength;
 +} IP_ADAPTER_UNICAST_ADDRESS_LH,*PIP_ADAPTER_UNICAST_ADDRESS_LH;
 +
 +#endif
 +
++int uv__convert_to_localhost_if_unspecified(const struct sockaddr* addr,
++                                            struct sockaddr_storage* storage);
++
 +#endif /* UV_WIN_WINSOCK_H_ */

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=f4a26c748b5ea2cafecdf5490b744a2b167c01ae
commit f4a26c748b5ea2cafecdf5490b744a2b167c01ae
Author:     libuv upstream <libuv at googlegroups.com>
AuthorDate: Fri Jan 19 17:57:06 2018 +0100
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Jan 19 13:03:03 2018 -0500

    libuv 2018-01-19 (63de1eca)
    
    Code extracted from:
    
        https://github.com/libuv/libuv.git
    
    at commit 63de1ecad3252d3e9ed2fe960c21d9387615fa45 (v1.x).

diff --git a/LICENSE b/LICENSE
index 41ba44c..28f1733 100644
--- a/LICENSE
+++ b/LICENSE
@@ -62,8 +62,8 @@ The externally maintained libraries used by libuv are:
   - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three
     clause BSD license.
 
-  - pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile
-    Communications AB. Three clause BSD license.
+  - pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB.
+    Three clause BSD license.
 
   - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design
     Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement
diff --git a/include/pthread-barrier.h b/include/pthread-barrier.h
index 900ebed..07db9b8a 100644
--- a/include/pthread-barrier.h
+++ b/include/pthread-barrier.h
@@ -23,6 +23,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #endif
 
 #define PTHREAD_BARRIER_SERIAL_THREAD  0x12345
+#define UV__PTHREAD_BARRIER_FALLBACK   1
 
 /*
  * To maintain ABI compatibility with
diff --git a/include/uv-errno.h b/include/uv-errno.h
index f137151..8a41533 100644
--- a/include/uv-errno.h
+++ b/include/uv-errno.h
@@ -416,4 +416,16 @@
 # define UV__EHOSTDOWN (-4031)
 #endif
 
+#if defined(EREMOTEIO) && !defined(_WIN32)
+# define UV__EREMOTEIO (-EREMOTEIO)
+#else
+# define UV__EREMOTEIO (-4030)
+#endif
+
+#if defined(ENOTTY) && !defined(_WIN32)
+# define UV__ENOTTY (-ENOTTY)
+#else
+# define UV__ENOTTY (-4029)
+#endif
+
 #endif /* UV_ERRNO_H_ */
diff --git a/include/uv-os390.h b/include/uv-os390.h
index 58f9261..39e7384 100644
--- a/include/uv-os390.h
+++ b/include/uv-os390.h
@@ -27,4 +27,7 @@
 #define UV_PLATFORM_LOOP_FIELDS                                               \
   void* ep;                                                                   \
 
+#define UV_PLATFORM_FS_EVENT_FIELDS                                           \
+  char rfis_rftok[8];                                                         \
+
 #endif /* UV_MVS_H */
diff --git a/include/uv-unix.h b/include/uv-unix.h
index d775450..da32f86 100644
--- a/include/uv-unix.h
+++ b/include/uv-unix.h
@@ -48,6 +48,8 @@
 # include "uv-linux.h"
 #elif defined (__MVS__)
 # include "uv-os390.h"
+#elif defined(_PASE)
+# include "uv-posix.h"
 #elif defined(_AIX)
 # include "uv-aix.h"
 #elif defined(__sun)
@@ -123,6 +125,7 @@ typedef struct uv_buf_t {
 typedef int uv_file;
 typedef int uv_os_sock_t;
 typedef int uv_os_fd_t;
+typedef pid_t uv_pid_t;
 
 #define UV_ONCE_INIT PTHREAD_ONCE_INIT
 
@@ -365,4 +368,97 @@ typedef struct {
   uv_fs_event_cb cb;                                                          \
   UV_PLATFORM_FS_EVENT_FIELDS                                                 \
 
+/* fs open() flags supported on this platform: */
+#if defined(O_APPEND)
+# define UV_FS_O_APPEND       O_APPEND
+#else
+# define UV_FS_O_APPEND       0
+#endif
+#if defined(O_CREAT)
+# define UV_FS_O_CREAT        O_CREAT
+#else
+# define UV_FS_O_CREAT        0
+#endif
+#if defined(O_DIRECT)
+# define UV_FS_O_DIRECT       O_DIRECT
+#else
+# define UV_FS_O_DIRECT       0
+#endif
+#if defined(O_DIRECTORY)
+# define UV_FS_O_DIRECTORY    O_DIRECTORY
+#else
+# define UV_FS_O_DIRECTORY    0
+#endif
+#if defined(O_DSYNC)
+# define UV_FS_O_DSYNC        O_DSYNC
+#else
+# define UV_FS_O_DSYNC        0
+#endif
+#if defined(O_EXCL)
+# define UV_FS_O_EXCL         O_EXCL
+#else
+# define UV_FS_O_EXCL         0
+#endif
+#if defined(O_EXLOCK)
+# define UV_FS_O_EXLOCK       O_EXLOCK
+#else
+# define UV_FS_O_EXLOCK       0
+#endif
+#if defined(O_NOATIME)
+# define UV_FS_O_NOATIME      O_NOATIME
+#else
+# define UV_FS_O_NOATIME      0
+#endif
+#if defined(O_NOCTTY)
+# define UV_FS_O_NOCTTY       O_NOCTTY
+#else
+# define UV_FS_O_NOCTTY       0
+#endif
+#if defined(O_NOFOLLOW)
+# define UV_FS_O_NOFOLLOW     O_NOFOLLOW
+#else
+# define UV_FS_O_NOFOLLOW     0
+#endif
+#if defined(O_NONBLOCK)
+# define UV_FS_O_NONBLOCK     O_NONBLOCK
+#else
+# define UV_FS_O_NONBLOCK     0
+#endif
+#if defined(O_RDONLY)
+# define UV_FS_O_RDONLY       O_RDONLY
+#else
+# define UV_FS_O_RDONLY       0
+#endif
+#if defined(O_RDWR)
+# define UV_FS_O_RDWR         O_RDWR
+#else
+# define UV_FS_O_RDWR         0
+#endif
+#if defined(O_SYMLINK)
+# define UV_FS_O_SYMLINK      O_SYMLINK
+#else
+# define UV_FS_O_SYMLINK      0
+#endif
+#if defined(O_SYNC)
+# define UV_FS_O_SYNC         O_SYNC
+#else
+# define UV_FS_O_SYNC         0
+#endif
+#if defined(O_TRUNC)
+# define UV_FS_O_TRUNC        O_TRUNC
+#else
+# define UV_FS_O_TRUNC        0
+#endif
+#if defined(O_WRONLY)
+# define UV_FS_O_WRONLY       O_WRONLY
+#else
+# define UV_FS_O_WRONLY       0
+#endif
+
+/* fs open() flags supported on other platforms: */
+#define UV_FS_O_RANDOM        0
+#define UV_FS_O_SHORT_LIVED   0
+#define UV_FS_O_SEQUENTIAL    0
+#define UV_FS_O_TEMPORARY     0
+
 #endif /* UV_UNIX_H */
diff --git a/include/uv-version.h b/include/uv-version.h
index e165809..1dc63e5 100644
--- a/include/uv-version.h
+++ b/include/uv-version.h
@@ -31,7 +31,7 @@
  */
 
 #define UV_VERSION_MAJOR 1
-#define UV_VERSION_MINOR 11
+#define UV_VERSION_MINOR 19
 #define UV_VERSION_PATCH 1
 #define UV_VERSION_IS_RELEASE 0
 #define UV_VERSION_SUFFIX "dev"
diff --git a/include/uv-win.h b/include/uv-win.h
index 9677ff1..4c6c50a 100644
--- a/include/uv-win.h
+++ b/include/uv-win.h
@@ -20,7 +20,7 @@
  */
 
 #ifndef _WIN32_WINNT
-# define _WIN32_WINNT   0x0502
+# define _WIN32_WINNT   0x0600
 #endif
 
 #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
@@ -222,6 +222,7 @@ typedef struct uv_buf_t {
 typedef int uv_file;
 typedef SOCKET uv_os_sock_t;
 typedef HANDLE uv_os_fd_t;
+typedef int uv_pid_t;
 
 typedef HANDLE uv_thread_t;
 
@@ -648,3 +649,28 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s);
 #ifndef X_OK
 #define X_OK 1
 #endif
+
+/* fs open() flags supported on this platform: */
+#define UV_FS_O_APPEND       _O_APPEND
+#define UV_FS_O_CREAT        _O_CREAT
+#define UV_FS_O_EXCL         _O_EXCL
+#define UV_FS_O_RANDOM       _O_RANDOM
+#define UV_FS_O_RDONLY       _O_RDONLY
+#define UV_FS_O_RDWR         _O_RDWR
+#define UV_FS_O_SEQUENTIAL   _O_SEQUENTIAL
+#define UV_FS_O_SHORT_LIVED  _O_SHORT_LIVED
+#define UV_FS_O_TEMPORARY    _O_TEMPORARY
+#define UV_FS_O_TRUNC        _O_TRUNC
+#define UV_FS_O_WRONLY       _O_WRONLY
+
+/* fs open() flags supported on other platforms (or mapped on this platform): */
+#define UV_FS_O_DIRECT       0x02000000 /* FILE_FLAG_NO_BUFFERING */
+#define UV_FS_O_DIRECTORY    0
+#define UV_FS_O_DSYNC        0x04000000 /* FILE_FLAG_WRITE_THROUGH */
+#define UV_FS_O_EXLOCK       0x10000000 /* EXCLUSIVE SHARING MODE */
+#define UV_FS_O_NOATIME      0
+#define UV_FS_O_NOCTTY       0
+#define UV_FS_O_NOFOLLOW     0
+#define UV_FS_O_NONBLOCK     0
+#define UV_FS_O_SYMLINK      0
+#define UV_FS_O_SYNC         0x08000000 /* FILE_FLAG_WRITE_THROUGH */
diff --git a/include/uv.h b/include/uv.h
index 40f5a4b..3a06113 100644
--- a/include/uv.h
+++ b/include/uv.h
@@ -140,6 +140,8 @@ extern "C" {
   XX(ENXIO, "no such device or address")                                      \
   XX(EMLINK, "too many links")                                                \
   XX(EHOSTDOWN, "host is down")                                               \
+  XX(EREMOTEIO, "remote I/O error")                                           \
+  XX(ENOTTY, "inappropriate ioctl for device")                                \
 
 #define UV_HANDLE_TYPE_MAP(XX)                                                \
   XX(ASYNC, async)                                                            \
@@ -423,7 +425,17 @@ struct uv_handle_s {
 };
 
 UV_EXTERN size_t uv_handle_size(uv_handle_type type);
+UV_EXTERN uv_handle_type uv_handle_get_type(const uv_handle_t* handle);
+UV_EXTERN const char* uv_handle_type_name(uv_handle_type type);
+UV_EXTERN void* uv_handle_get_data(const uv_handle_t* handle);
+UV_EXTERN uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle);
+UV_EXTERN void uv_handle_set_data(uv_handle_t* handle, void* data);
+
 UV_EXTERN size_t uv_req_size(uv_req_type type);
+UV_EXTERN void* uv_req_get_data(const uv_req_t* req);
+UV_EXTERN void uv_req_set_data(uv_req_t* req, void* data);
+UV_EXTERN uv_req_type uv_req_get_type(const uv_req_t* req);
+UV_EXTERN const char* uv_req_type_name(uv_req_type type);
 
 UV_EXTERN int uv_is_active(const uv_handle_t* handle);
 
@@ -463,6 +475,8 @@ struct uv_stream_s {
   UV_STREAM_FIELDS
 };
 
+UV_EXTERN size_t uv_stream_get_write_queue_size(const uv_stream_t* stream);
+
 UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb);
 UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client);
 
@@ -640,6 +654,8 @@ UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle,
                                 uv_alloc_cb alloc_cb,
                                 uv_udp_recv_cb recv_cb);
 UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle);
+UV_EXTERN size_t uv_udp_get_send_queue_size(const uv_udp_t* handle);
+UV_EXTERN size_t uv_udp_get_send_queue_count(const uv_udp_t* handle);
 
 
 /*
@@ -708,6 +724,7 @@ UV_EXTERN int uv_pipe_getpeername(const uv_pipe_t* handle,
 UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count);
 UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle);
 UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle);
+UV_EXTERN int uv_pipe_chmod(uv_pipe_t* handle, int flags);
 
 
 struct uv_poll_s {
@@ -719,7 +736,8 @@ struct uv_poll_s {
 enum uv_poll_event {
   UV_READABLE = 1,
   UV_WRITABLE = 2,
-  UV_DISCONNECT = 4
+  UV_DISCONNECT = 4,
+  UV_PRIORITIZED = 8
 };
 
 UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd);
@@ -958,6 +976,7 @@ UV_EXTERN int uv_spawn(uv_loop_t* loop,
                        const uv_process_options_t* options);
 UV_EXTERN int uv_process_kill(uv_process_t*, int signum);
 UV_EXTERN int uv_kill(int pid, int signum);
+UV_EXTERN uv_pid_t uv_process_get_pid(const uv_process_t*);
 
 
 /*
@@ -1034,6 +1053,7 @@ UV_EXTERN int uv_get_process_title(char* buffer, size_t size);
 UV_EXTERN int uv_set_process_title(const char* title);
 UV_EXTERN int uv_resident_set_memory(size_t* rss);
 UV_EXTERN int uv_uptime(double* uptime);
+UV_EXTERN uv_os_fd_t uv_get_osfhandle(int fd);
 
 typedef struct {
   long tv_sec;
@@ -1065,6 +1085,8 @@ UV_EXTERN int uv_os_homedir(char* buffer, size_t* size);
 UV_EXTERN int uv_os_tmpdir(char* buffer, size_t* size);
 UV_EXTERN int uv_os_get_passwd(uv_passwd_t* pwd);
 UV_EXTERN void uv_os_free_passwd(uv_passwd_t* pwd);
+UV_EXTERN uv_pid_t uv_os_getpid(void);
+UV_EXTERN uv_pid_t uv_os_getppid(void);
 
 UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count);
 UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count);
@@ -1111,7 +1133,8 @@ typedef enum {
   UV_FS_READLINK,
   UV_FS_CHOWN,
   UV_FS_FCHOWN,
-  UV_FS_REALPATH
+  UV_FS_REALPATH,
+  UV_FS_COPYFILE
 } uv_fs_type;
 
 /* uv_fs_t is a subclass of uv_req_t. */
@@ -1127,6 +1150,12 @@ struct uv_fs_s {
   UV_FS_PRIVATE_FIELDS
 };
 
+UV_EXTERN uv_fs_type uv_fs_get_type(const uv_fs_t*);
+UV_EXTERN ssize_t uv_fs_get_result(const uv_fs_t*);
+UV_EXTERN void* uv_fs_get_ptr(const uv_fs_t*);
+UV_EXTERN const char* uv_fs_get_path(const uv_fs_t*);
+UV_EXTERN uv_stat_t* uv_fs_get_statbuf(uv_fs_t*);
+
 UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req);
 UV_EXTERN int uv_fs_close(uv_loop_t* loop,
                           uv_fs_t* req,
@@ -1156,6 +1185,18 @@ UV_EXTERN int uv_fs_write(uv_loop_t* loop,
                           unsigned int nbufs,
                           int64_t offset,
                           uv_fs_cb cb);
+/*
+ * This flag can be used with uv_fs_copyfile() to return an error if the
+ * destination already exists.
+ */
+#define UV_FS_COPYFILE_EXCL   0x0001
+
+UV_EXTERN int uv_fs_copyfile(uv_loop_t* loop,
+                             uv_fs_t* req,
+                             const char* path,
+                             const char* new_path,
+                             int flags,
+                             uv_fs_cb cb);
 UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop,
                           uv_fs_t* req,
                           const char* path,
@@ -1389,6 +1430,21 @@ 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);
 
+#if defined(IF_NAMESIZE)
+# define UV_IF_NAMESIZE (IF_NAMESIZE + 1)
+#elif defined(IFNAMSIZ)
+# define UV_IF_NAMESIZE (IFNAMSIZ + 1)
+#else
+# define UV_IF_NAMESIZE (16 + 1)
+#endif
+
+UV_EXTERN int uv_if_indextoname(unsigned int ifindex,
+                                char* buffer,
+                                size_t* size);
+UV_EXTERN int uv_if_indextoiid(unsigned int ifindex,
+                               char* buffer,
+                               size_t* size);
+
 UV_EXTERN int uv_exepath(char* buffer, size_t* size);
 
 UV_EXTERN int uv_cwd(char* buffer, size_t* size);
@@ -1408,6 +1464,7 @@ UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr);
 UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib);
 
 UV_EXTERN int uv_mutex_init(uv_mutex_t* handle);
+UV_EXTERN int uv_mutex_init_recursive(uv_mutex_t* handle);
 UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle);
 UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle);
 UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle);
@@ -1480,6 +1537,8 @@ struct uv_loop_s {
   UV_LOOP_PRIVATE_FIELDS
 };
 
+UV_EXTERN void* uv_loop_get_data(const uv_loop_t*);
+UV_EXTERN void uv_loop_set_data(uv_loop_t*, void* data);
 
 /* Don't export the private CPP symbols. */
 #undef UV_HANDLE_TYPE_PRIVATE
diff --git a/src/threadpool.c b/src/threadpool.c
index 1089341..413d1c2 100644
--- a/src/threadpool.c
+++ b/src/threadpool.c
@@ -38,7 +38,6 @@ static uv_thread_t* threads;
 static uv_thread_t default_threads[4];
 static QUEUE exit_message;
 static QUEUE wq;
-static volatile int initialized;
 
 
 static void uv__cancelled(struct uv__work* w) {
@@ -53,7 +52,8 @@ static void worker(void* arg) {
   struct uv__work* w;
   QUEUE* q;
 
-  (void) arg;
+  uv_sem_post((uv_sem_t*) arg);
+  arg = NULL;
 
   for (;;) {
     uv_mutex_lock(&mutex);
@@ -105,7 +105,7 @@ static void post(QUEUE* q) {
 UV_DESTRUCTOR(static void cleanup(void)) {
   unsigned int i;
 
-  if (initialized == 0)
+  if (nthreads == 0)
     return;
 
   post(&exit_message);
@@ -122,7 +122,6 @@ UV_DESTRUCTOR(static void cleanup(void)) {
 
   threads = NULL;
   nthreads = 0;
-  initialized = 0;
 }
 #endif
 
@@ -130,6 +129,7 @@ UV_DESTRUCTOR(static void cleanup(void)) {
 static void init_threads(void) {
   unsigned int i;
   const char* val;
+  uv_sem_t sem;
 
   nthreads = ARRAY_SIZE(default_threads);
   val = getenv("UV_THREADPOOL_SIZE");
@@ -157,11 +157,17 @@ static void init_threads(void) {
 
   QUEUE_INIT(&wq);
 
+  if (uv_sem_init(&sem, 0))
+    abort();
+
   for (i = 0; i < nthreads; i++)
-    if (uv_thread_create(threads + i, worker, NULL))
+    if (uv_thread_create(threads + i, worker, &sem))
       abort();
 
-  initialized = 1;
+  for (i = 0; i < nthreads; i++)
+    uv_sem_wait(&sem);
+
+  uv_sem_destroy(&sem);
 }
 
 
diff --git a/src/unix/aix-common.c b/src/unix/aix-common.c
new file mode 100644
index 0000000..c2217fb
--- /dev/null
+++ b/src/unix/aix-common.c
@@ -0,0 +1,292 @@
+/* Copyright libuv project 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 <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <sys/time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <utmp.h>
+#include <libgen.h>
+
+#include <sys/protosw.h>
+#include <procinfo.h>
+#include <sys/proc.h>
+#include <sys/procfs.h>
+
+#include <sys/poll.h>
+
+#include <sys/pollset.h>
+#include <ctype.h>
+
+#include <sys/mntctl.h>
+#include <sys/vmount.h>
+#include <limits.h>
+#include <strings.h>
+#include <sys/vnode.h>
+
+uint64_t uv__hrtime(uv_clocktype_t type) {
+  uint64_t G = 1000000000;
+  timebasestruct_t t;
+  read_wall_time(&t, TIMEBASE_SZ);
+  time_base_to_time(&t, TIMEBASE_SZ);
+  return (uint64_t) t.tb_high * G + t.tb_low;
+}
+
+
+/*
+ * We could use a static buffer for the path manipulations that we need outside
+ * of the function, but this function could be called by multiple consumers and
+ * we don't want to potentially create a race condition in the use of snprintf.
+ * There is no direct way of getting the exe path in AIX - either through /procfs
+ * or through some libc APIs. The below approach is to parse the argv[0]'s pattern
+ * and use it in conjunction with PATH environment variable to craft one.
+ */
+int uv_exepath(char* buffer, size_t* size) {
+  int res;
+  char args[PATH_MAX];
+  char abspath[PATH_MAX];
+  size_t abspath_size;
+  struct procsinfo pi;
+
+  if (buffer == NULL || size == NULL || *size == 0)
+    return -EINVAL;
+
+  pi.pi_pid = getpid();
+  res = getargs(&pi, sizeof(pi), args, sizeof(args));
+  if (res < 0)
+    return -EINVAL;
+
+  /*
+   * Possibilities for args:
+   * i) an absolute path such as: /home/user/myprojects/nodejs/node
+   * ii) a relative path such as: ./node or ../myprojects/nodejs/node
+   * iii) a bare filename such as "node", after exporting PATH variable
+   *     to its location.
+   */
+
+  /* Case i) and ii) absolute or relative paths */
+  if (strchr(args, '/') != NULL) {
+    if (realpath(args, abspath) != abspath)
+      return -errno;
+
+    abspath_size = strlen(abspath);
+
+    *size -= 1;
+    if (*size > abspath_size)
+      *size = abspath_size;
+
+    memcpy(buffer, abspath, *size);
+    buffer[*size] = '\0';
+
+    return 0;
+  } else {
+    /* Case iii). Search PATH environment variable */
+    char trypath[PATH_MAX];
+    char *clonedpath = NULL;
+    char *token = NULL;
+    char *path = getenv("PATH");
+
+    if (path == NULL)
+      return -EINVAL;
+
+    clonedpath = uv__strdup(path);
+    if (clonedpath == NULL)
+      return -ENOMEM;
+
+    token = strtok(clonedpath, ":");
+    while (token != NULL) {
+      snprintf(trypath, sizeof(trypath) - 1, "%s/%s", token, args);
+      if (realpath(trypath, abspath) == abspath) {
+        /* Check the match is executable */
+        if (access(abspath, X_OK) == 0) {
+          abspath_size = strlen(abspath);
+
+          *size -= 1;
+          if (*size > abspath_size)
+            *size = abspath_size;
+
+          memcpy(buffer, abspath, *size);
+          buffer[*size] = '\0';
+
+          uv__free(clonedpath);
+          return 0;
+        }
+      }
+      token = strtok(NULL, ":");
+    }
+    uv__free(clonedpath);
+
+    /* Out of tokens (path entries), and no match found */
+    return -EINVAL;
+  }
+}
+
+void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
+  int i;
+
+  for (i = 0; i < count; ++i) {
+    uv__free(cpu_infos[i].model);
+  }
+
+  uv__free(cpu_infos);
+}
+
+
+int uv_interface_addresses(uv_interface_address_t** addresses,
+  int* count) {
+  uv_interface_address_t* address;
+  int sockfd, inet6, size = 1;
+  struct ifconf ifc;
+  struct ifreq *ifr, *p, flg;
+  struct sockaddr_dl* sa_addr;
+
+  *count = 0;
+
+  if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) {
+    return -errno;
+  }
+
+  if (ioctl(sockfd, SIOCGSIZIFCONF, &size) == -1) {
+    uv__close(sockfd);
+    return -errno;
+  }
+
+  ifc.ifc_req = (struct ifreq*)uv__malloc(size);
+  ifc.ifc_len = size;
+  if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) {
+    uv__close(sockfd);
+    return -errno;
+  }
+
+#define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p))
+
+  /* Count all up and running ipv4/ipv6 addresses */
+  ifr = ifc.ifc_req;
+  while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) {
+    p = ifr;
+    ifr = (struct ifreq*)
+      ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr));
+
+    if (!(p->ifr_addr.sa_family == AF_INET6 ||
+          p->ifr_addr.sa_family == AF_INET))
+      continue;
+
+    memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
+    if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
+      uv__close(sockfd);
+      return -errno;
+    }
+
+    if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
+      continue;
+
+    (*count)++;
+  }
+
+  /* Alloc the return interface structs */
+  *addresses = uv__malloc(*count * sizeof(uv_interface_address_t));
+  if (!(*addresses)) {
+    uv__close(sockfd);
+    return -ENOMEM;
+  }
+  address = *addresses;
+
+  ifr = ifc.ifc_req;
+  while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) {
+    p = ifr;
+    ifr = (struct ifreq*)
+      ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr));
+
+    if (!(p->ifr_addr.sa_family == AF_INET6 ||
+          p->ifr_addr.sa_family == AF_INET))
+      continue;
+
+    inet6 = (p->ifr_addr.sa_family == AF_INET6);
+
+    memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
+    if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
+      uv__close(sockfd);
+      return -ENOSYS;
+    }
+
+    if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
+      continue;
+
+    /* All conditions above must match count loop */
+
+    address->name = uv__strdup(p->ifr_name);
+
+    if (inet6)
+      address->address.address6 = *((struct sockaddr_in6*) &p->ifr_addr);
+    else
+      address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr);
+
+    sa_addr = (struct sockaddr_dl*) &p->ifr_addr;
+    memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr));
+
+    if (ioctl(sockfd, SIOCGIFNETMASK, p) == -1) {
+      uv__close(sockfd);
+      return -ENOSYS;
+    }
+
+    if (inet6)
+      address->netmask.netmask6 = *((struct sockaddr_in6*) &p->ifr_addr);
+    else
+      address->netmask.netmask4 = *((struct sockaddr_in*) &p->ifr_addr);
+
+    address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0;
+
+    address++;
+  }
+
+#undef ADDR_SIZE
+
+  uv__close(sockfd);
+  return 0;
+}
+
+
+void uv_free_interface_addresses(uv_interface_address_t* addresses,
+  int count) {
+  int i;
+
+  for (i = 0; i < count; ++i) {
+    uv__free(addresses[i].name);
+  }
+
+  uv__free(addresses);
+}
diff --git a/src/unix/aix.c b/src/unix/aix.c
index 388c9cc..fd41309 100644
--- a/src/unix/aix.c
+++ b/src/unix/aix.c
@@ -1,4 +1,5 @@
 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to
  * deal in the Software without restriction, including without limitation the
@@ -64,11 +65,18 @@
 #define RDWR_BUF_SIZE   4096
 #define EQ(a,b)         (strcmp(a,b) == 0)
 
+static uv_mutex_t process_title_mutex;
+static uv_once_t process_title_mutex_once = UV_ONCE_INIT;
 static void* args_mem = NULL;
 static char** process_argv = NULL;
 static int process_argc = 0;
 static char* process_title_ptr = NULL;
 
+static void init_process_title_mutex_once(void) {
+  uv_mutex_init(&process_title_mutex);
+}
+
+
 int uv__platform_loop_init(uv_loop_t* loop) {
   loop->fs_fd = -1;
 
@@ -316,104 +324,6 @@ update_timeout:
 }
 
 
-uint64_t uv__hrtime(uv_clocktype_t type) {
-  uint64_t G = 1000000000;
-  timebasestruct_t t;
-  read_wall_time(&t, TIMEBASE_SZ);
-  time_base_to_time(&t, TIMEBASE_SZ);
-  return (uint64_t) t.tb_high * G + t.tb_low;
-}
-
-
-/*
- * We could use a static buffer for the path manipulations that we need outside
- * of the function, but this function could be called by multiple consumers and
- * we don't want to potentially create a race condition in the use of snprintf.
- * There is no direct way of getting the exe path in AIX - either through /procfs
- * or through some libc APIs. The below approach is to parse the argv[0]'s pattern
- * and use it in conjunction with PATH environment variable to craft one.
- */
-int uv_exepath(char* buffer, size_t* size) {
-  int res;
-  char args[PATH_MAX];
-  char abspath[PATH_MAX];
-  size_t abspath_size;
-  struct procsinfo pi;
-
-  if (buffer == NULL || size == NULL || *size == 0)
-    return -EINVAL;
-
-  pi.pi_pid = getpid();
-  res = getargs(&pi, sizeof(pi), args, sizeof(args));
-  if (res < 0)
-    return -EINVAL;
-
-  /*
-   * Possibilities for args:
-   * i) an absolute path such as: /home/user/myprojects/nodejs/node
-   * ii) a relative path such as: ./node or ../myprojects/nodejs/node
-   * iii) a bare filename such as "node", after exporting PATH variable
-   *     to its location.
-   */
-
-  /* Case i) and ii) absolute or relative paths */
-  if (strchr(args, '/') != NULL) {
-    if (realpath(args, abspath) != abspath)
-      return -errno;
-
-    abspath_size = strlen(abspath);
-
-    *size -= 1;
-    if (*size > abspath_size)
-      *size = abspath_size;
-
-    memcpy(buffer, abspath, *size);
-    buffer[*size] = '\0';
-
-    return 0;
-  } else {
-  /* Case iii). Search PATH environment variable */
-    char trypath[PATH_MAX];
-    char *clonedpath = NULL;
-    char *token = NULL;
-    char *path = getenv("PATH");
-
-    if (path == NULL)
-      return -EINVAL;
-
-    clonedpath = uv__strdup(path);
-    if (clonedpath == NULL)
-      return -ENOMEM;
-
-    token = strtok(clonedpath, ":");
-    while (token != NULL) {
-      snprintf(trypath, sizeof(trypath) - 1, "%s/%s", token, args);
-      if (realpath(trypath, abspath) == abspath) {
-        /* Check the match is executable */
-        if (access(abspath, X_OK) == 0) {
-          abspath_size = strlen(abspath);
-
-          *size -= 1;
-          if (*size > abspath_size)
-            *size = abspath_size;
-
-          memcpy(buffer, abspath, *size);
-          buffer[*size] = '\0';
-
-          uv__free(clonedpath);
-          return 0;
-        }
-      }
-      token = strtok(NULL, ":");
-    }
-    uv__free(clonedpath);
-
-    /* Out of tokens (path entries), and no match found */
-    return -EINVAL;
-  }
-}
-
-
 uint64_t uv_get_free_memory(void) {
   perfstat_memory_total_t mem_total;
   int result = perfstat_memory_total(NULL, &mem_total, sizeof(mem_total), 1);
@@ -855,6 +765,7 @@ int uv_fs_event_start(uv_fs_event_t* handle,
   uv__io_init(&handle->event_watcher, uv__ahafs_event, fd);
   handle->path = uv__strdup(filename);
   handle->cb = cb;
+  handle->dir_filename = NULL;
 
   uv__io_start(handle->loop, &handle->event_watcher, POLLIN);
 
@@ -952,6 +863,9 @@ int uv_set_process_title(const char* title) {
   if (new_title == NULL)
     return -ENOMEM;
 
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
   /* If this is the first time this is set,
    * don't free and set argv[1] to NULL.
    */
@@ -964,6 +878,8 @@ int uv_set_process_title(const char* title) {
   if (process_argc > 1)
      process_argv[1] = NULL;
 
+  uv_mutex_unlock(&process_title_mutex);
+
   return 0;
 }
 
@@ -976,8 +892,13 @@ int uv_get_process_title(char* buffer, size_t size) {
   else if (size <= len)
     return -ENOBUFS;
 
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
   memcpy(buffer, process_argv[0], len + 1);
 
+  uv_mutex_unlock(&process_title_mutex);
+
   return 0;
 }
 
@@ -1017,6 +938,7 @@ int uv_uptime(double* uptime) {
   size_t entries = 0;
   time_t boot_time;
 
+  boot_time = 0;
   utmpname(UTMP_FILE);
 
   setutent();
@@ -1093,130 +1015,6 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
 }
 
 
-void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
-  int i;
-
-  for (i = 0; i < count; ++i) {
-    uv__free(cpu_infos[i].model);
-  }
-
-  uv__free(cpu_infos);
-}
-
-
-int uv_interface_addresses(uv_interface_address_t** addresses,
-  int* count) {
-  uv_interface_address_t* address;
-  int sockfd, size = 1;
-  struct ifconf ifc;
-  struct ifreq *ifr, *p, flg;
-
-  *count = 0;
-
-  if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) {
-    return -errno;
-  }
-
-  if (ioctl(sockfd, SIOCGSIZIFCONF, &size) == -1) {
-    uv__close(sockfd);
-    return -errno;
-  }
-
-  ifc.ifc_req = (struct ifreq*)uv__malloc(size);
-  ifc.ifc_len = size;
-  if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) {
-    uv__close(sockfd);
-    return -errno;
-  }
-
-#define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p))
-
-  /* Count all up and running ipv4/ipv6 addresses */
-  ifr = ifc.ifc_req;
-  while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) {
-    p = ifr;
-    ifr = (struct ifreq*)
-      ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr));
-
-    if (!(p->ifr_addr.sa_family == AF_INET6 ||
-          p->ifr_addr.sa_family == AF_INET))
-      continue;
-
-    memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
-    if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
-      uv__close(sockfd);
-      return -errno;
-    }
-
-    if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
-      continue;
-
-    (*count)++;
-  }
-
-  /* Alloc the return interface structs */
-  *addresses = (uv_interface_address_t*)
-    uv__malloc(*count * sizeof(uv_interface_address_t));
-  if (!(*addresses)) {
-    uv__close(sockfd);
-    return -ENOMEM;
-  }
-  address = *addresses;
-
-  ifr = ifc.ifc_req;
-  while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) {
-    p = ifr;
-    ifr = (struct ifreq*)
-      ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr));
-
-    if (!(p->ifr_addr.sa_family == AF_INET6 ||
-          p->ifr_addr.sa_family == AF_INET))
-      continue;
-
-    memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
-    if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
-      uv__close(sockfd);
-      return -ENOSYS;
-    }
-
-    if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
-      continue;
-
-    /* All conditions above must match count loop */
-
-    address->name = uv__strdup(p->ifr_name);
-
-    if (p->ifr_addr.sa_family == AF_INET6) {
-      address->address.address6 = *((struct sockaddr_in6*) &p->ifr_addr);
-    } else {
-      address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr);
-    }
-
-    /* TODO: Retrieve netmask using SIOCGIFNETMASK ioctl */
-
-    address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0;
-
-    address++;
-  }
-
-#undef ADDR_SIZE
-
-  uv__close(sockfd);
-  return 0;
-}
-
-
-void uv_free_interface_addresses(uv_interface_address_t* addresses,
-  int count) {
-  int i;
-
-  for (i = 0; i < count; ++i) {
-    uv__free(addresses[i].name);
-  }
-
-  uv__free(addresses);
-}
-
 void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) {
   struct pollfd* events;
   uintptr_t i;
diff --git a/src/unix/android-ifaddrs.c b/src/unix/android-ifaddrs.c
index 30f681b..bf30b14 100644
--- a/src/unix/android-ifaddrs.c
+++ b/src/unix/android-ifaddrs.c
@@ -43,9 +43,10 @@ typedef struct NetlinkList
     unsigned int m_size;
 } NetlinkList;
 
-static int netlink_socket(void)
+static int netlink_socket(pid_t *p_pid)
 {
     struct sockaddr_nl l_addr;
+    socklen_t l_len;
 
     int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
     if(l_socket < 0)
@@ -61,6 +62,14 @@ static int netlink_socket(void)
         return -1;
     }
 
+    l_len = sizeof(l_addr);
+    if(getsockname(l_socket, (struct sockaddr *)&l_addr, &l_len) < 0)
+    {
+        close(l_socket);
+        return -1;
+    }
+    *p_pid = l_addr.nl_pid;
+
     return l_socket;
 }
 
@@ -128,7 +137,7 @@ static int netlink_recv(int p_socket, void *p_buffer, size_t p_len)
     }
 }
 
-static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_done)
+static struct nlmsghdr *getNetlinkResponse(int p_socket, pid_t p_pid, int *p_size, int *p_done)
 {
     size_t l_size = 4096;
     void *l_buffer = NULL;
@@ -153,11 +162,10 @@ static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_don
         }
         if(l_read >= 0)
         {
-            pid_t l_pid = getpid();
             struct nlmsghdr *l_hdr;
             for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read))
             {
-                if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket)
+                if((pid_t)l_hdr->nlmsg_pid != p_pid || (int)l_hdr->nlmsg_seq != p_socket)
                 {
                     continue;
                 }
@@ -207,7 +215,7 @@ static void freeResultList(NetlinkList *p_list)
     }
 }
 
-static NetlinkList *getResultList(int p_socket, int p_request)
+static NetlinkList *getResultList(int p_socket, int p_request, pid_t p_pid)
 {
     int l_size;
     int l_done;
@@ -227,7 +235,7 @@ static NetlinkList *getResultList(int p_socket, int p_request)
     {
         NetlinkList *l_item;
 
-        struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, &l_size, &l_done);
+        struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, p_pid, &l_size, &l_done);
         /* Error */
         if(!l_hdr)
         {
@@ -449,7 +457,7 @@ static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList,
     char *l_name;
     char *l_addr;
 
-    for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
+    for(l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
     {
         size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
         if(l_info->ifa_family == AF_PACKET)
@@ -471,7 +479,7 @@ static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList,
                 l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize));
                 break;
             case IFA_LABEL:
-                l_nameSize += NLMSG_ALIGN(l_rtaSize + 1);
+                l_nameSize += NLMSG_ALIGN(l_rtaDataSize + 1);
                 break;
             default:
                 break;
@@ -496,7 +504,7 @@ static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList,
     }
 
     l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg));
-    for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
+    for(l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
     {
         void *l_rtaData = RTA_DATA(l_rta);
         size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
@@ -559,7 +567,7 @@ static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList,
     {
         unsigned l_maxPrefix = (l_entry->ifa_addr->sa_family == AF_INET ? 32 : 128);
         unsigned l_prefix = (l_info->ifa_prefixlen > l_maxPrefix ? l_maxPrefix : l_info->ifa_prefixlen);
-        char l_mask[16] = {0};
+        unsigned char l_mask[16] = {0};
         unsigned i;
         for(i=0; i<(l_prefix/8); ++i)
         {
@@ -578,18 +586,17 @@ static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList,
     return 0;
 }
 
-static int interpretLinks(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList)
+static int interpretLinks(int p_socket, pid_t p_pid, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList)
 {
 
     int l_numLinks = 0;
-    pid_t l_pid = getpid();
     for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next)
     {
         unsigned int l_nlsize = p_netlinkList->m_size;
         struct nlmsghdr *l_hdr;
         for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize))
         {
-            if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket)
+            if((pid_t)l_hdr->nlmsg_pid != p_pid || (int)l_hdr->nlmsg_seq != p_socket)
             {
                 continue;
             }
@@ -612,16 +619,15 @@ static int interpretLinks(int p_socket, NetlinkList *p_netlinkList, struct ifadd
     return l_numLinks;
 }
 
-static int interpretAddrs(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList, int p_numLinks)
+static int interpretAddrs(int p_socket, pid_t p_pid, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList, int p_numLinks)
 {
-    pid_t l_pid = getpid();
     for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next)
     {
         unsigned int l_nlsize = p_netlinkList->m_size;
         struct nlmsghdr *l_hdr;
         for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize))
         {
-            if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket)
+            if((pid_t)l_hdr->nlmsg_pid != p_pid || (int)l_hdr->nlmsg_seq != p_socket)
             {
                 continue;
             }
@@ -648,6 +654,7 @@ int getifaddrs(struct ifaddrs **ifap)
     int l_socket;
     int l_result;
     int l_numLinks;
+    pid_t l_pid;
     NetlinkList *l_linkResults;
     NetlinkList *l_addrResults;
 
@@ -657,20 +664,20 @@ int getifaddrs(struct ifaddrs **ifap)
     }
     *ifap = NULL;
 
-    l_socket = netlink_socket();
+    l_socket = netlink_socket(&l_pid);
     if(l_socket < 0)
     {
         return -1;
     }
 
-    l_linkResults = getResultList(l_socket, RTM_GETLINK);
+    l_linkResults = getResultList(l_socket, RTM_GETLINK, l_pid);
     if(!l_linkResults)
     {
         close(l_socket);
         return -1;
     }
 
-    l_addrResults = getResultList(l_socket, RTM_GETADDR);
+    l_addrResults = getResultList(l_socket, RTM_GETADDR, l_pid);
     if(!l_addrResults)
     {
         close(l_socket);
@@ -679,8 +686,8 @@ int getifaddrs(struct ifaddrs **ifap)
     }
 
     l_result = 0;
-    l_numLinks = interpretLinks(l_socket, l_linkResults, ifap);
-    if(l_numLinks == -1 || interpretAddrs(l_socket, l_addrResults, ifap, l_numLinks) == -1)
+    l_numLinks = interpretLinks(l_socket, l_pid, l_linkResults, ifap);
+    if(l_numLinks == -1 || interpretAddrs(l_socket, l_pid, l_addrResults, ifap, l_numLinks) == -1)
     {
         l_result = -1;
     }
diff --git a/src/unix/atomic-ops.h b/src/unix/atomic-ops.h
index 9dac255..7cac1f9 100644
--- a/src/unix/atomic-ops.h
+++ b/src/unix/atomic-ops.h
@@ -20,7 +20,6 @@
 
 #if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
 #include <atomic.h>
-#define __sync_val_compare_and_swap(p, o, n) atomic_cas_ptr(p, o, n)
 #endif
 
 UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval));
@@ -49,6 +48,8 @@ UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) {
     return oldval;
   else
     return op4;
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+  return atomic_cas_uint(ptr, oldval, newval);
 #else
   return __sync_val_compare_and_swap(ptr, oldval, newval);
 #endif
@@ -83,6 +84,8 @@ UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)) {
     return oldval;
   else
     return op4;
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+  return atomic_cas_ulong(ptr, oldval, newval);
 #else
   return __sync_val_compare_and_swap(ptr, oldval, newval);
 #endif
diff --git a/src/unix/bsd-ifaddrs.c b/src/unix/bsd-ifaddrs.c
index 4147894..ea3166c 100644
--- a/src/unix/bsd-ifaddrs.c
+++ b/src/unix/bsd-ifaddrs.c
@@ -31,11 +31,20 @@
 #include <net/if_dl.h>
 #endif
 
-static int uv__ifaddr_exclude(struct ifaddrs *ent) {
+static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) {
   if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)))
     return 1;
   if (ent->ifa_addr == NULL)
     return 1;
+#if !defined(__CYGWIN__) && !defined(__MSYS__)
+  /*
+   * If `exclude_type` is `UV__EXCLUDE_IFPHYS`, just see whether `sa_family`
+   * equals to `AF_LINK` or not. Otherwise, the result depends on the operation
+   * system with `AF_LINK` or `PF_INET`.
+   */
+  if (exclude_type == UV__EXCLUDE_IFPHYS)
+    return (ent->ifa_addr->sa_family != AF_LINK);
+#endif
 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__)
   /*
    * On BSD getifaddrs returns information related to the raw underlying
@@ -43,7 +52,11 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent) {
    */
   if (ent->ifa_addr->sa_family == AF_LINK)
     return 1;
-#elif defined(__NetBSD__) || defined(__OpenBSD__)
+#elif defined(__NetBSD__)
+  if (ent->ifa_addr->sa_family != PF_INET &&
+      ent->ifa_addr->sa_family != PF_INET6)
+    return 1;
+#elif defined(__OpenBSD__)
   if (ent->ifa_addr->sa_family != PF_INET)
     return 1;
 #endif
@@ -63,7 +76,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
 
   /* Count the number of interfaces */
   for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
-    if (uv__ifaddr_exclude(ent))
+    if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR))
       continue;
     (*count)++;
   }
@@ -78,7 +91,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
   address = *addresses;
 
   for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
-    if (uv__ifaddr_exclude(ent))
+    if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR))
       continue;
 
     address->name = uv__strdup(ent->ifa_name);
@@ -102,7 +115,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
 
   /* Fill in physical addresses for each interface */
   for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
-    if (uv__ifaddr_exclude(ent))
+    if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS))
       continue;
 
     address = *addresses;
diff --git a/src/unix/core.c b/src/unix/core.c
index 30cdaef..c7e431e 100644
--- a/src/unix/core.c
+++ b/src/unix/core.c
@@ -28,7 +28,6 @@
 #include <errno.h>
 #include <assert.h>
 #include <unistd.h>
-#include <sys/param.h> /* MAXHOSTNAMELEN on Linux and the BSDs */
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -59,13 +58,19 @@
 
 #if defined(__DragonFly__)      || \
     defined(__FreeBSD__)        || \
-    defined(__FreeBSD_kernel__)
+    defined(__FreeBSD_kernel__) || \
+    defined(__NetBSD__)
 # include <sys/sysctl.h>
 # include <sys/filio.h>
 # include <sys/wait.h>
 # define UV__O_CLOEXEC O_CLOEXEC
 # if defined(__FreeBSD__) && __FreeBSD__ >= 10
 #  define uv__accept4 accept4
+# endif
+# if defined(__NetBSD__)
+#  define uv__accept4(a, b, c, d) paccept((a), (b), (c), NULL, (d))
+# endif
+# if (defined(__FreeBSD__) && __FreeBSD__ >= 10) || defined(__NetBSD__)
 #  define UV__SOCK_NONBLOCK SOCK_NONBLOCK
 #  define UV__SOCK_CLOEXEC  SOCK_CLOEXEC
 # endif
@@ -82,6 +87,10 @@
 #include <sys/ioctl.h>
 #endif
 
+#if !defined(__MVS__)
+#include <sys/param.h> /* MAXHOSTNAMELEN on Linux and the BSDs */
+#endif
+
 /* Fallback for the maximum hostname length */
 #ifndef MAXHOSTNAMELEN
 # define MAXHOSTNAMELEN 256
@@ -459,7 +468,9 @@ int uv__accept(int sockfd) {
   assert(sockfd >= 0);
 
   while (1) {
-#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD__ >= 10)
+#if defined(__linux__)                          || \
+    (defined(__FreeBSD__) && __FreeBSD__ >= 10) || \
+    defined(__NetBSD__)
     static int no_accept4;
 
     if (no_accept4)
@@ -835,7 +846,7 @@ void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd) {
 
 
 void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
-  assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP)));
+  assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI)));
   assert(0 != events);
   assert(w->fd >= 0);
   assert(w->fd < INT_MAX);
@@ -863,7 +874,7 @@ void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
 
 
 void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
-  assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP)));
+  assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI)));
   assert(0 != events);
 
   if (w->fd == -1)
@@ -895,7 +906,7 @@ void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
 
 
 void uv__io_close(uv_loop_t* loop, uv__io_t* w) {
-  uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP);
+  uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI);
   QUEUE_REMOVE(&w->pending_queue);
 
   /* Remove stale events for this file descriptor */
@@ -910,7 +921,7 @@ void uv__io_feed(uv_loop_t* loop, uv__io_t* w) {
 
 
 int uv__io_active(const uv__io_t* w, unsigned int events) {
-  assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP)));
+  assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI)));
   assert(0 != events);
   return 0 != (w->pevents & events);
 }
@@ -985,7 +996,7 @@ int uv__open_cloexec(const char* path, int flags) {
 
 int uv__dup2_cloexec(int oldfd, int newfd) {
   int r;
-#if defined(__FreeBSD__) && __FreeBSD__ >= 10
+#if (defined(__FreeBSD__) && __FreeBSD__ >= 10) || defined(__NetBSD__)
   r = dup3(oldfd, newfd, O_CLOEXEC);
   if (r == -1)
     return -errno;
@@ -1289,6 +1300,9 @@ int uv_os_setenv(const char* name, const char* value) {
 
 
 int uv_os_unsetenv(const char* name) {
+  if (name == NULL)
+    return -EINVAL;
+
   if (unsetenv(name) != 0)
     return -errno;
 
@@ -1324,3 +1338,18 @@ int uv_os_gethostname(char* buffer, size_t* size) {
   *size = len;
   return 0;
 }
+
+
+uv_os_fd_t uv_get_osfhandle(int fd) {
+  return fd;
+}
+
+
+uv_pid_t uv_os_getpid(void) {
+  return getpid();
+}
+
+
+uv_pid_t uv_os_getppid(void) {
+  return getppid();
+}
diff --git a/src/unix/freebsd.c b/src/unix/freebsd.c
index e52ae99..f2b3f24 100644
--- a/src/unix/freebsd.c
+++ b/src/unix/freebsd.c
@@ -25,7 +25,6 @@
 #include <string.h>
 #include <errno.h>
 
-#include <kvm.h>
 #include <paths.h>
 #include <sys/user.h>
 #include <sys/types.h>
@@ -48,9 +47,16 @@
 # define CP_INTR 4
 #endif
 
+static uv_mutex_t process_title_mutex;
+static uv_once_t process_title_mutex_once = UV_ONCE_INIT;
 static char *process_title;
 
 
+static void init_process_title_mutex_once(void) {
+  uv_mutex_init(&process_title_mutex);
+}
+
+
 int uv__platform_loop_init(uv_loop_t* loop) {
   return uv__kqueue_init(loop);
 }
@@ -161,9 +167,20 @@ char** uv_setup_args(int argc, char** argv) {
 
 int uv_set_process_title(const char* title) {
   int oid[4];
+  char* new_title;
+
+  new_title = uv__strdup(title);
+
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
+  if (process_title == NULL) {
+    uv_mutex_unlock(&process_title_mutex);
+    return -ENOMEM;
+  }
 
   uv__free(process_title);
-  process_title = uv__strdup(title);
+  process_title = new_title;
 
   oid[0] = CTL_KERN;
   oid[1] = KERN_PROC;
@@ -177,6 +194,8 @@ int uv_set_process_title(const char* title) {
          process_title,
          strlen(process_title) + 1);
 
+  uv_mutex_unlock(&process_title_mutex);
+
   return 0;
 }
 
@@ -187,51 +206,54 @@ int uv_get_process_title(char* buffer, size_t size) {
   if (buffer == NULL || size == 0)
     return -EINVAL;
 
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
   if (process_title) {
     len = strlen(process_title) + 1;
 
-    if (size < len)
+    if (size < len) {
+      uv_mutex_unlock(&process_title_mutex);
       return -ENOBUFS;
+    }
 
     memcpy(buffer, process_title, len);
   } else {
     len = 0;
   }
 
+  uv_mutex_unlock(&process_title_mutex);
+
   buffer[len] = '\0';
 
   return 0;
 }
 
-
 int uv_resident_set_memory(size_t* rss) {
-  kvm_t *kd = NULL;
-  struct kinfo_proc *kinfo = NULL;
-  pid_t pid;
-  int nprocs;
-  size_t page_size = getpagesize();
+  struct kinfo_proc kinfo;
+  size_t page_size;
+  size_t kinfo_size;
+  int mib[4];
+
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_PROC;
+  mib[2] = KERN_PROC_PID;
+  mib[3] = getpid();
 
-  pid = getpid();
+  kinfo_size = sizeof(kinfo);
 
-  kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open");
-  if (kd == NULL) goto error;
+  if (sysctl(mib, 4, &kinfo, &kinfo_size, NULL, 0))
+    return -errno;
 
-  kinfo = kvm_getprocs(kd, KERN_PROC_PID, pid, &nprocs);
-  if (kinfo == NULL) goto error;
+  page_size = getpagesize();
 
 #ifdef __DragonFly__
-  *rss = kinfo->kp_vm_rssize * page_size;
+  *rss = kinfo.kp_vm_rssize * page_size;
 #else
-  *rss = kinfo->ki_rssize * page_size;
+  *rss = kinfo.ki_rssize * page_size;
 #endif
 
-  kvm_close(kd);
-
   return 0;
-
-error:
-  if (kd) kvm_close(kd);
-  return -EPERM;
 }
 
 
@@ -254,6 +276,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
   uv_cpu_info_t* cpu_info;
   const char* maxcpus_key;
   const char* cptimes_key;
+  const char* model_key;
   char model[512];
   long* cp_times;
   int numcpus;
@@ -272,8 +295,20 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
   cptimes_key = "kern.cp_times";
 #endif
 
+#if defined(__arm__) || defined(__aarch64__)
+  /* The key hw.model and hw.clockrate are not available on FreeBSD ARM. */
+  model_key = "hw.machine";
+  cpuspeed = 0;
+#else
+  model_key = "hw.model";
+
+  size = sizeof(cpuspeed);
+  if (sysctlbyname("hw.clockrate", &cpuspeed, &size, NULL, 0))
+    return -errno;
+#endif
+
   size = sizeof(model);
-  if (sysctlbyname("hw.model", &model, &size, NULL, 0))
+  if (sysctlbyname(model_key, &model, &size, NULL, 0))
     return -errno;
 
   size = sizeof(numcpus);
@@ -286,12 +321,6 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
 
   *count = numcpus;
 
-  size = sizeof(cpuspeed);
-  if (sysctlbyname("hw.clockrate", &cpuspeed, &size, NULL, 0)) {
-    uv__free(*cpu_infos);
-    return -errno;
-  }
-
   /* kern.cp_times on FreeBSD i386 gives an array up to maxcpus instead of
    * ncpu.
    */
diff --git a/src/unix/fs.c b/src/unix/fs.c
index f9513ea..e0969a4 100644
--- a/src/unix/fs.c
+++ b/src/unix/fs.c
@@ -60,8 +60,14 @@
 # include <sys/sendfile.h>
 #endif
 
+#if defined(__APPLE__)
+# include <copyfile.h>
+#endif
+
 #define INIT(subtype)                                                         \
   do {                                                                        \
+    if (req == NULL)                                                          \
+      return -EINVAL;                                                         \
     req->type = UV_FS;                                                        \
     if (cb != NULL)                                                           \
       uv__req_init(loop, req, UV_FS);                                         \
@@ -126,26 +132,33 @@
   while (0)
 
 
-static ssize_t uv__fs_fdatasync(uv_fs_t* req) {
-#if defined(__linux__) || defined(__sun) || defined(__NetBSD__)
-  return fdatasync(req->file);
-#elif defined(__APPLE__)
+static ssize_t uv__fs_fsync(uv_fs_t* req) {
+#if defined(__APPLE__)
   /* Apple's fdatasync and fsync explicitly do NOT flush the drive write cache
    * to the drive platters. This is in contrast to Linux's fdatasync and fsync
    * which do, according to recent man pages. F_FULLFSYNC is Apple's equivalent
-   * for flushing buffered data to permanent storage.
+   * for flushing buffered data to permanent storage. If F_FULLFSYNC is not
+   * supported by the file system we should fall back to fsync(). This is the
+   * same approach taken by sqlite.
    */
-  return fcntl(req->file, F_FULLFSYNC);
+  int r;
+
+  r = fcntl(req->file, F_FULLFSYNC);
+  if (r != 0 && errno == ENOTTY)
+    r = fsync(req->file);
+  return r;
 #else
   return fsync(req->file);
 #endif
 }
 
 
-static ssize_t uv__fs_fsync(uv_fs_t* req) {
-#if defined(__APPLE__)
-  /* See the comment in uv__fs_fdatasync. */
-  return fcntl(req->file, F_FULLFSYNC);
+static ssize_t uv__fs_fdatasync(uv_fs_t* req) {
+#if defined(__linux__) || defined(__sun) || defined(__NetBSD__)
+  return fdatasync(req->file);
+#elif defined(__APPLE__)
+  /* See the comment in uv__fs_fsync. */
+  return uv__fs_fsync(req);
 #else
   return fsync(req->file);
 #endif
@@ -432,7 +445,12 @@ static ssize_t uv__fs_readlink(uv_fs_t* req) {
     return -1;
   }
 
+#if defined(__MVS__)
+  len = os390_readlink(req->path, buf, len);
+#else
   len = readlink(req->path, buf, len);
+#endif
+
 
   if (len == -1) {
     uv__free(buf);
@@ -766,6 +784,118 @@ done:
   return r;
 }
 
+static ssize_t uv__fs_copyfile(uv_fs_t* req) {
+#if defined(__APPLE__) && !TARGET_OS_IPHONE
+  /* On macOS, use the native copyfile(3). */
+  copyfile_flags_t flags;
+
+  flags = COPYFILE_ALL;
+
+  if (req->flags & UV_FS_COPYFILE_EXCL)
+    flags |= COPYFILE_EXCL;
+
+  return copyfile(req->path, req->new_path, NULL, flags);
+#else
+  uv_fs_t fs_req;
+  uv_file srcfd;
+  uv_file dstfd;
+  struct stat statsbuf;
+  int dst_flags;
+  int result;
+  int err;
+  size_t bytes_to_send;
+  int64_t in_offset;
+
+  dstfd = -1;
+  err = 0;
+
+  /* Open the source file. */
+  srcfd = uv_fs_open(NULL, &fs_req, req->path, O_RDONLY, 0, NULL);
+  uv_fs_req_cleanup(&fs_req);
+
+  if (srcfd < 0)
+    return srcfd;
+
+  /* Get the source file's mode. */
+  if (fstat(srcfd, &statsbuf)) {
+    err = -errno;
+    goto out;
+  }
+
+  dst_flags = O_WRONLY | O_CREAT | O_TRUNC;
+
+  if (req->flags & UV_FS_COPYFILE_EXCL)
+    dst_flags |= O_EXCL;
+
+  /* Open the destination file. */
+  dstfd = uv_fs_open(NULL,
+                     &fs_req,
+                     req->new_path,
+                     dst_flags,
+                     statsbuf.st_mode,
+                     NULL);
+  uv_fs_req_cleanup(&fs_req);
+
+  if (dstfd < 0) {
+    err = dstfd;
+    goto out;
+  }
+
+  if (fchmod(dstfd, statsbuf.st_mode) == -1) {
+    err = -errno;
+    goto out;
+  }
+
+  bytes_to_send = statsbuf.st_size;
+  in_offset = 0;
+  while (bytes_to_send != 0) {
+    err = uv_fs_sendfile(NULL,
+                         &fs_req,
+                         dstfd,
+                         srcfd,
+                         in_offset,
+                         bytes_to_send,
+                         NULL);
+    uv_fs_req_cleanup(&fs_req);
+    if (err < 0)
+      break;
+    bytes_to_send -= fs_req.result;
+    in_offset += fs_req.result;
+  }
+
+out:
+  if (err < 0)
+    result = err;
+  else
+    result = 0;
+
+  /* Close the source file. */
+  err = uv__close_nocheckstdio(srcfd);
+
+  /* Don't overwrite any existing errors. */
+  if (err != 0 && result == 0)
+    result = err;
+
+  /* Close the destination file if it is open. */
+  if (dstfd >= 0) {
+    err = uv__close_nocheckstdio(dstfd);
+
+    /* Don't overwrite any existing errors. */
+    if (err != 0 && result == 0)
+      result = err;
+
+    /* Remove the destination file if something went wrong. */
+    if (result != 0) {
+      uv_fs_unlink(NULL, &fs_req, req->new_path, NULL);
+      /* Ignore the unlink return value, as an error already happened. */
+      uv_fs_req_cleanup(&fs_req);
+    }
+  }
+
+  return result;
+#endif
+}
+
 static void uv__to_stat(struct stat* src, uv_stat_t* dst) {
   dst->st_dev = src->st_dev;
   dst->st_mode = src->st_mode;
@@ -946,6 +1076,7 @@ static void uv__fs_work(struct uv__work* w) {
     X(CHMOD, chmod(req->path, req->mode));
     X(CHOWN, chown(req->path, req->uid, req->gid));
     X(CLOSE, close(req->file));
+    X(COPYFILE, uv__fs_copyfile(req));
     X(FCHMOD, fchmod(req->file, req->mode));
     X(FCHOWN, fchown(req->file, req->uid, req->gid));
     X(FDATASYNC, uv__fs_fdatasync(req));
@@ -1186,10 +1317,11 @@ int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
                unsigned int nbufs,
                int64_t off,
                uv_fs_cb cb) {
+  INIT(READ);
+
   if (bufs == NULL || nbufs == 0)
     return -EINVAL;
 
-  INIT(READ);
   req->file = file;
 
   req->nbufs = nbufs;
@@ -1324,10 +1456,11 @@ int uv_fs_write(uv_loop_t* loop,
                 unsigned int nbufs,
                 int64_t off,
                 uv_fs_cb cb) {
+  INIT(WRITE);
+
   if (bufs == NULL || nbufs == 0)
     return -EINVAL;
 
-  INIT(WRITE);
   req->file = file;
 
   req->nbufs = nbufs;
@@ -1349,6 +1482,9 @@ int uv_fs_write(uv_loop_t* loop,
 
 
 void uv_fs_req_cleanup(uv_fs_t* req) {
+  if (req == NULL)
+    return;
+
   /* Only necessary for asychronous requests, i.e., requests with a callback.
    * Synchronous ones don't copy their arguments and have req->path and
    * req->new_path pointing to user-owned memory.  UV_FS_MKDTEMP is the
@@ -1367,3 +1503,20 @@ void uv_fs_req_cleanup(uv_fs_t* req) {
     uv__free(req->ptr);
   req->ptr = NULL;
 }
+
+
+int uv_fs_copyfile(uv_loop_t* loop,
+                   uv_fs_t* req,
+                   const char* path,
+                   const char* new_path,
+                   int flags,
+                   uv_fs_cb cb) {
+  INIT(COPYFILE);
+
+  if (flags & ~UV_FS_COPYFILE_EXCL)
+    return -EINVAL;
+
+  PATH2;
+  req->flags = flags;
+  POST;
+}
diff --git a/src/unix/fsevents.c b/src/unix/fsevents.c
index 643e233..3883740 100644
--- a/src/unix/fsevents.c
+++ b/src/unix/fsevents.c
@@ -230,6 +230,7 @@ static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef,
   uv_loop_t* loop;
   uv__cf_loop_state_t* state;
   uv__fsevents_event_t* event;
+  FSEventStreamEventFlags flags;
   QUEUE head;
 
   loop = info;
@@ -245,8 +246,10 @@ static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef,
 
     /* Process and filter out events */
     for (i = 0; i < numEvents; i++) {
+      flags = eventFlags[i];
+
       /* Ignore system events */
-      if (eventFlags[i] & kFSEventsSystem)
+      if (flags & kFSEventsSystem)
         continue;
 
       path = paths[i];
@@ -271,6 +274,9 @@ static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef,
       /* Ignore events with path equal to directory itself */
       if (len == 0)
         continue;
+#else
+      if (len == 0 && (flags & kFSEventStreamEventFlagItemIsDir))
+        continue;
 #endif /* MAC_OS_X_VERSION_10_7 */
 
       /* Do not emit events from subdirectories (without option set) */
@@ -291,12 +297,24 @@ static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef,
 
       memset(event, 0, sizeof(*event));
       memcpy(event->path, path, len + 1);
+      event->events = UV_RENAME;
 
-      if ((eventFlags[i] & kFSEventsModified) != 0 &&
-          (eventFlags[i] & kFSEventsRenamed) == 0)
+#ifdef MAC_OS_X_VERSION_10_7
+      if (0 != (flags & kFSEventsModified) &&
+          0 == (flags & kFSEventsRenamed)) {
+        event->events = UV_CHANGE;
+      }
+#else
+      if (0 != (flags & kFSEventsModified) &&
+          0 != (flags & kFSEventStreamEventFlagItemIsDir) &&
+          0 == (flags & kFSEventStreamEventFlagItemRenamed)) {
         event->events = UV_CHANGE;
-      else
-        event->events = UV_RENAME;
+      }
+      if (0 == (flags & kFSEventStreamEventFlagItemIsDir) &&
+          0 == (flags & kFSEventStreamEventFlagItemRenamed)) {
+        event->events = UV_CHANGE;
+      }
+#endif /* MAC_OS_X_VERSION_10_7 */
 
       QUEUE_INSERT_TAIL(&head, &event->member);
     }
diff --git a/src/unix/getaddrinfo.c b/src/unix/getaddrinfo.c
index 2049aea..0185971 100644
--- a/src/unix/getaddrinfo.c
+++ b/src/unix/getaddrinfo.c
@@ -32,6 +32,7 @@
 #include <stddef.h> /* NULL */
 #include <stdlib.h>
 #include <string.h>
+#include <net/if.h> /* if_indextoname() */
 
 /* EAI_* constants. */
 #include <netdb.h>
@@ -200,3 +201,32 @@ void uv_freeaddrinfo(struct addrinfo* ai) {
   if (ai)
     freeaddrinfo(ai);
 }
+
+
+int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) {
+  char ifname_buf[UV_IF_NAMESIZE];
+  size_t len;
+
+  if (buffer == NULL || size == NULL || *size == 0)
+    return UV_EINVAL;
+
+  if (if_indextoname(ifindex, ifname_buf) == NULL)
+    return -errno;
+
+  len = strnlen(ifname_buf, sizeof(ifname_buf));
+
+  if (*size <= len) {
+    *size = len + 1;
+    return UV_ENOBUFS;
+  }
+
+  memcpy(buffer, ifname_buf, len);
+  buffer[len] = '\0';
+  *size = len;
+
+  return 0;
+}
+
+int uv_if_indextoiid(unsigned int ifindex, char* buffer, size_t* size) {
+  return uv_if_indextoname(ifindex, buffer, size);
+}
diff --git a/src/unix/ibmi.c b/src/unix/ibmi.c
new file mode 100644
index 0000000..c19e2fc
--- /dev/null
+++ b/src/unix/ibmi.c
@@ -0,0 +1,112 @@
+/* Copyright libuv project 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 <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <sys/time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <utmp.h>
+#include <libgen.h>
+
+#include <sys/protosw.h>
+#include <procinfo.h>
+#include <sys/proc.h>
+#include <sys/procfs.h>
+
+#include <ctype.h>
+
+#include <sys/mntctl.h>
+#include <sys/vmount.h>
+#include <limits.h>
+#include <strings.h>
+#include <sys/vnode.h>
+
+uint64_t uv_get_free_memory(void) {
+  return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES);
+}
+
+
+uint64_t uv_get_total_memory(void) {
+  return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES);
+}
+
+
+void uv_loadavg(double avg[3]) {
+    avg[0] = avg[1] = avg[2] = 0;
+    return;
+}
+
+
+int uv_resident_set_memory(size_t* rss) {
+  return UV_ENOSYS;
+}
+
+
+int uv_uptime(double* uptime) {
+  return UV_ENOSYS;
+}
+
+
+int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
+  unsigned int numcpus, idx = 0;
+  uv_cpu_info_t* cpu_info;
+
+  *cpu_infos = NULL;
+  *count = 0;
+
+  numcpus = sysconf(_SC_NPROCESSORS_ONLN);
+
+  *cpu_infos = uv__malloc(numcpus * sizeof(uv_cpu_info_t));
+  if (!*cpu_infos) {
+    return -ENOMEM;
+  }
+
+  cpu_info = *cpu_infos;
+  for (idx = 0; idx < numcpus; idx++) {
+    cpu_info->speed = 0;
+    cpu_info->model = uv__strdup("unknown");
+    cpu_info->cpu_times.user = 0;
+    cpu_info->cpu_times.sys = 0;
+    cpu_info->cpu_times.idle = 0;
+    cpu_info->cpu_times.irq = 0;
+    cpu_info->cpu_times.nice = 0;
+    cpu_info++;
+  }
+  *count = numcpus;
+
+  return 0;
+}
diff --git a/src/unix/internal.h b/src/unix/internal.h
index 2e3afa6..3df5c4c 100644
--- a/src/unix/internal.h
+++ b/src/unix/internal.h
@@ -110,6 +110,12 @@ int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset);
 # define UV__POLLRDHUP 0x2000
 #endif
 
+#ifdef POLLPRI
+# define UV__POLLPRI POLLPRI
+#else
+# define UV__POLLPRI 0
+#endif
+
 #if !defined(O_CLOEXEC) && defined(__FreeBSD__)
 /*
  * It may be that we are just missing `__POSIX_VISIBLE >= 200809`.
@@ -145,6 +151,12 @@ enum {
   UV_LOOP_BLOCK_SIGPROF = 1
 };
 
+/* flags of excluding ifaddr */
+enum {
+  UV__EXCLUDE_IFPHYS,
+  UV__EXCLUDE_IFADDR
+};
+
 typedef enum {
   UV_CLOCK_PRECISE = 0,  /* Use the highest resolution clock available. */
   UV_CLOCK_FAST = 1      /* Use the fastest clock with <= 1ms granularity. */
@@ -163,7 +175,8 @@ struct uv__stream_queued_fds_s {
     defined(__FreeBSD__) || \
     defined(__FreeBSD_kernel__) || \
     defined(__linux__) || \
-    defined(__OpenBSD__)
+    defined(__OpenBSD__) || \
+    defined(__NetBSD__)
 #define uv__cloexec uv__cloexec_ioctl
 #define uv__nonblock uv__nonblock_ioctl
 #else
diff --git a/src/unix/kqueue.c b/src/unix/kqueue.c
index 6bc60bb..5e89bdc 100644
--- a/src/unix/kqueue.c
+++ b/src/unix/kqueue.c
@@ -34,6 +34,17 @@
 #include <fcntl.h>
 #include <time.h>
 
+/*
+ * Required on
+ * - Until at least FreeBSD 11.0
+ * - Older versions of Mac OS X
+ *
+ * http://www.boost.org/doc/libs/1_61_0/boost/asio/detail/kqueue_reactor.hpp
+ */
+#ifndef EV_OOBAND
+#define EV_OOBAND  EV_FLAG1
+#endif
+
 static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags);
 
 
@@ -48,11 +59,12 @@ int uv__kqueue_init(uv_loop_t* loop) {
 }
 
 
+#if defined(__APPLE__)
 static int uv__has_forked_with_cfrunloop;
+#endif
 
 int uv__io_fork(uv_loop_t* loop) {
   int err;
-  uv__close(loop->backend_fd);
   loop->backend_fd = -1;
   err = uv__kqueue_init(loop);
   if (err)
@@ -166,6 +178,16 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
       }
     }
 
+   if ((w->events & UV__POLLPRI) == 0 && (w->pevents & UV__POLLPRI) != 0) {
+      EV_SET(events + nevents, w->fd, EV_OOBAND, EV_ADD, 0, 0, 0);
+
+      if (++nevents == ARRAY_SIZE(events)) {
+        if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL))
+          abort();
+        nevents = 0;
+      }
+    }
+
     w->events = w->pevents;
   }
 
@@ -275,6 +297,20 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
         }
       }
 
+      if (ev->filter == EV_OOBAND) {
+        if (w->pevents & UV__POLLPRI) {
+          revents |= UV__POLLPRI;
+          w->rcount = ev->data;
+        } else {
+          /* TODO batch up */
+          struct kevent events[1];
+          EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0);
+          if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL))
+            if (errno != ENOENT)
+              abort();
+        }
+      }
+
       if (ev->filter == EVFILT_WRITE) {
         if (w->pevents & POLLOUT) {
           revents |= POLLOUT;
diff --git a/src/unix/linux-core.c b/src/unix/linux-core.c
index 2866e93..4d480ce 100644
--- a/src/unix/linux-core.c
+++ b/src/unix/linux-core.c
@@ -388,7 +388,7 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
        * free when we switch over to edge-triggered I/O.
        */
       if (pe->events == POLLERR || pe->events == POLLHUP)
-        pe->events |= w->pevents & (POLLIN | POLLOUT);
+        pe->events |= w->pevents & (POLLIN | POLLOUT | UV__POLLPRI);
 
       if (pe->events != 0) {
         /* Run signal watchers last.  This also affects child process watchers
@@ -837,7 +837,7 @@ void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
   uv__free(cpu_infos);
 }
 
-static int uv__ifaddr_exclude(struct ifaddrs *ent) {
+static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) {
   if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)))
     return 1;
   if (ent->ifa_addr == NULL)
@@ -847,8 +847,8 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent) {
    * devices. We're not interested in this information yet.
    */
   if (ent->ifa_addr->sa_family == PF_PACKET)
-    return 1;
-  return 0;
+    return exclude_type;
+  return !exclude_type;
 }
 
 int uv_interface_addresses(uv_interface_address_t** addresses,
@@ -869,7 +869,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
 
   /* Count the number of interfaces */
   for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
-    if (uv__ifaddr_exclude(ent))
+    if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR))
       continue;
 
     (*count)++;
@@ -887,7 +887,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
   address = *addresses;
 
   for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
-    if (uv__ifaddr_exclude(ent))
+    if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR))
       continue;
 
     address->name = uv__strdup(ent->ifa_name);
@@ -911,7 +911,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
 
   /* Fill in physical addresses for each interface */
   for (ent = addrs; ent != NULL; ent = ent->ifa_next) {
-    if (uv__ifaddr_exclude(ent))
+    if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS))
       continue;
 
     address = *addresses;
diff --git a/src/unix/loop.c b/src/unix/loop.c
index bcd4924..5b5b0e0 100644
--- a/src/unix/loop.c
+++ b/src/unix/loop.c
@@ -31,7 +31,6 @@ int uv_loop_init(uv_loop_t* loop) {
   void* saved_data;
   int err;
 
-  uv__signal_global_once_init();
 
   saved_data = loop->data;
   memset(loop, 0, sizeof(*loop));
@@ -68,6 +67,7 @@ int uv_loop_init(uv_loop_t* loop) {
   if (err)
     return err;
 
+  uv__signal_global_once_init();
   err = uv_signal_init(loop, &loop->child_watcher);
   if (err)
     goto fail_signal_init;
diff --git a/src/unix/netbsd.c b/src/unix/netbsd.c
index 9b5546b..7425072 100644
--- a/src/unix/netbsd.c
+++ b/src/unix/netbsd.c
@@ -40,9 +40,16 @@
 #include <unistd.h>
 #include <time.h>
 
+static uv_mutex_t process_title_mutex;
+static uv_once_t process_title_mutex_once = UV_ONCE_INIT;
 static char *process_title;
 
 
+static void init_process_title_mutex_once(void) {
+  uv_mutex_init(&process_title_mutex);
+}
+
+
 int uv__platform_loop_init(uv_loop_t* loop) {
   return uv__kqueue_init(loop);
 }
@@ -66,22 +73,32 @@ void uv_loadavg(double avg[3]) {
 
 
 int uv_exepath(char* buffer, size_t* size) {
+  /* Intermediate buffer, retrieving partial path name does not work
+   * As of NetBSD-8(beta), vnode->path translator does not handle files
+   * with longer names than 31 characters.
+   */
+  char int_buf[PATH_MAX];
+  size_t int_size;
   int mib[4];
-  size_t cb;
-  pid_t mypid;
 
   if (buffer == NULL || size == NULL || *size == 0)
     return -EINVAL;
 
-  mypid = getpid();
   mib[0] = CTL_KERN;
   mib[1] = KERN_PROC_ARGS;
-  mib[2] = mypid;
-  mib[3] = KERN_PROC_ARGV;
+  mib[2] = -1;
+  mib[3] = KERN_PROC_PATHNAME;
+  int_size = ARRAY_SIZE(int_buf);
 
-  cb = *size;
-  if (sysctl(mib, 4, buffer, &cb, NULL, 0))
+  if (sysctl(mib, 4, int_buf, &int_size, NULL, 0))
     return -errno;
+
+  /* Copy string from the intermediate buffer to outer one with appropriate
+   * length.
+   */
+  strlcpy(buffer, int_buf, *size);
+
+  /* Set new size. */
   *size = strlen(buffer);
 
   return 0;
@@ -124,11 +141,24 @@ char** uv_setup_args(int argc, char** argv) {
 
 
 int uv_set_process_title(const char* title) {
-  if (process_title) uv__free(process_title);
+  char* new_title;
+
+  new_title = uv__strdup(title);
+
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
 
-  process_title = uv__strdup(title);
+  if (process_title == NULL) {
+    uv_mutex_unlock(&process_title_mutex);
+    return -ENOMEM;
+  }
+
+  uv__free(process_title);
+  process_title = new_title;
   setproctitle("%s", title);
 
+  uv_mutex_unlock(&process_title_mutex);
+
   return 0;
 }
 
@@ -139,17 +169,24 @@ int uv_get_process_title(char* buffer, size_t size) {
   if (buffer == NULL || size == 0)
     return -EINVAL;
 
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
   if (process_title) {
     len = strlen(process_title) + 1;
 
-    if (size < len)
+    if (size < len) {
+      uv_mutex_unlock(&process_title_mutex);
       return -ENOBUFS;
+    }
 
     memcpy(buffer, process_title, len);
   } else {
     len = 0;
   }
 
+  uv_mutex_unlock(&process_title_mutex);
+
   buffer[len] = '\0';
 
   return 0;
diff --git a/src/unix/openbsd.c b/src/unix/openbsd.c
index 56f0af1..c0ffa56 100644
--- a/src/unix/openbsd.c
+++ b/src/unix/openbsd.c
@@ -36,9 +36,16 @@
 #include <unistd.h>
 
 
+static uv_mutex_t process_title_mutex;
+static uv_once_t process_title_mutex_once = UV_ONCE_INIT;
 static char *process_title;
 
 
+static void init_process_title_mutex_once(void) {
+  uv_mutex_init(&process_title_mutex);
+}
+
+
 int uv__platform_loop_init(uv_loop_t* loop) {
   return uv__kqueue_init(loop);
 }
@@ -146,9 +153,24 @@ char** uv_setup_args(int argc, char** argv) {
 
 
 int uv_set_process_title(const char* title) {
+  char* new_title;
+
+  new_title = uv__strdup(title);
+
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
+  if (process_title == NULL) {
+    uv_mutex_unlock(&process_title_mutex);
+    return -ENOMEM;
+  }
+
   uv__free(process_title);
-  process_title = uv__strdup(title);
+  process_title = new_title;
   setproctitle("%s", title);
+
+  uv_mutex_unlock(&process_title_mutex);
+
   return 0;
 }
 
@@ -159,17 +181,24 @@ int uv_get_process_title(char* buffer, size_t size) {
   if (buffer == NULL || size == 0)
     return -EINVAL;
 
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
   if (process_title) {
     len = strlen(process_title) + 1;
 
-    if (size < len)
+    if (size < len) {
+      uv_mutex_unlock(&process_title_mutex);
       return -ENOBUFS;
+    }
 
     memcpy(buffer, process_title, len);
   } else {
     len = 0;
   }
 
+  uv_mutex_unlock(&process_title_mutex);
+
   buffer[len] = '\0';
 
   return 0;
diff --git a/src/unix/os390-syscalls.c b/src/unix/os390-syscalls.c
index 7edf235..21558ea 100644
--- a/src/unix/os390-syscalls.c
+++ b/src/unix/os390-syscalls.c
@@ -25,6 +25,8 @@
 #include <stdlib.h>
 #include <assert.h>
 #include <search.h>
+#include <termios.h>
+#include <sys/msg.h>
 
 #define CW_CONDVAR 32
 
@@ -103,10 +105,19 @@ static void maybe_resize(uv__os390_epoll* lst, unsigned int len) {
   unsigned int newsize;
   unsigned int i;
   struct pollfd* newlst;
+  struct pollfd event;
 
   if (len <= lst->size)
     return;
 
+  if (lst->size == 0)
+    event.fd = -1;
+  else {
+    /* Extract the message queue at the end. */
+    event = lst->items[lst->size - 1];
+    lst->items[lst->size - 1].fd = -1;
+  }
+
   newsize = next_power_of_two(len);
   newlst = uv__realloc(lst->items, newsize * sizeof(lst->items[0]));
 
@@ -115,32 +126,101 @@ static void maybe_resize(uv__os390_epoll* lst, unsigned int len) {
   for (i = lst->size; i < newsize; ++i)
     newlst[i].fd = -1;
 
+  /* Restore the message queue at the end */
+  newlst[newsize - 1] = event;
+
   lst->items = newlst;
   lst->size = newsize;
 }
 
 
+static void init_message_queue(uv__os390_epoll* lst) {
+  struct {
+    long int header;
+    char body;
+  } msg;
+
+  /* initialize message queue */
+  lst->msg_queue = msgget(IPC_PRIVATE, 0622 | IPC_CREAT);
+  if (lst->msg_queue == -1)
+    abort();
+
+  /*
+     On z/OS, the message queue will be affiliated with the process only
+     when a send is performed on it. Once this is done, the system
+     can be queried for all message queues belonging to our process id.
+  */
+  msg.header = 1;
+  if (msgsnd(lst->msg_queue, &msg, sizeof(msg.body), 0) != 0)
+    abort();
+
+  /* Clean up the dummy message sent above */
+  if (msgrcv(lst->msg_queue, &msg, sizeof(msg.body), 0, 0) != sizeof(msg.body))
+    abort();
+}
+
+
+static void before_fork(void) {
+  uv_mutex_lock(&global_epoll_lock);
+}
+
+
+static void after_fork(void) {
+  uv_mutex_unlock(&global_epoll_lock);
+}
+
+
+static void child_fork(void) {
+  QUEUE* q;
+  uv_once_t child_once = UV_ONCE_INIT;
+
+  /* reset once */
+  memcpy(&once, &child_once, sizeof(child_once));
+
+  /* reset epoll list */
+  while (!QUEUE_EMPTY(&global_epoll_queue)) {
+    uv__os390_epoll* lst;
+    q = QUEUE_HEAD(&global_epoll_queue);
+    QUEUE_REMOVE(q);
+    lst = QUEUE_DATA(q, uv__os390_epoll, member);
+    uv__free(lst->items);
+    lst->items = NULL;
+    lst->size = 0;
+  }
+
+  uv_mutex_unlock(&global_epoll_lock);
+  uv_mutex_destroy(&global_epoll_lock);
+}
+
+
 static void epoll_init(void) {
   QUEUE_INIT(&global_epoll_queue);
   if (uv_mutex_init(&global_epoll_lock))
     abort();
+
+  if (pthread_atfork(&before_fork, &after_fork, &child_fork))
+    abort();
 }
 
 
 uv__os390_epoll* epoll_create1(int flags) {
   uv__os390_epoll* lst;
 
-  uv_once(&once, epoll_init);
-  uv_mutex_lock(&global_epoll_lock);
   lst = uv__malloc(sizeof(*lst));
-  if (lst == -1)
-    return NULL;
-  QUEUE_INSERT_TAIL(&global_epoll_queue, &lst->member);
-  uv_mutex_unlock(&global_epoll_lock);
+  if (lst != NULL) {
+    /* initialize list */
+    lst->size = 0;
+    lst->items = NULL;
+    init_message_queue(lst);
+    maybe_resize(lst, 1);
+    lst->items[lst->size - 1].fd = lst->msg_queue;
+    lst->items[lst->size - 1].events = POLLIN;
+    uv_once(&once, epoll_init);
+    uv_mutex_lock(&global_epoll_lock);
+    QUEUE_INSERT_TAIL(&global_epoll_queue, &lst->member);
+    uv_mutex_unlock(&global_epoll_lock);
+  }
 
-  /* initialize list */
-  lst->size = 0;
-  lst->items = NULL;
   return lst;
 }
 
@@ -149,22 +229,32 @@ int epoll_ctl(uv__os390_epoll* lst,
               int op,
               int fd,
               struct epoll_event *event) {
-  if(op == EPOLL_CTL_DEL) {
+  uv_mutex_lock(&global_epoll_lock);
+
+  if (op == EPOLL_CTL_DEL) {
     if (fd >= lst->size || lst->items[fd].fd == -1) {
+      uv_mutex_unlock(&global_epoll_lock);
       errno = ENOENT;
       return -1;
     }
     lst->items[fd].fd = -1;
-  } else if(op == EPOLL_CTL_ADD) {
-    maybe_resize(lst, fd + 1);
+  } else if (op == EPOLL_CTL_ADD) {
+
+    /* Resizing to 'fd + 1' would expand the list to contain at least
+     * 'fd'. But we need to guarantee that the last index on the list 
+     * is reserved for the message queue. So specify 'fd + 2' instead.
+     */
+    maybe_resize(lst, fd + 2);
     if (lst->items[fd].fd != -1) {
+      uv_mutex_unlock(&global_epoll_lock);
       errno = EEXIST;
       return -1;
     }
     lst->items[fd].fd = fd;
     lst->items[fd].events = event->events;
-  } else if(op == EPOLL_CTL_MOD) {
+  } else if (op == EPOLL_CTL_MOD) {
     if (fd >= lst->size || lst->items[fd].fd == -1) {
+      uv_mutex_unlock(&global_epoll_lock);
       errno = ENOENT;
       return -1;
     }
@@ -172,44 +262,36 @@ int epoll_ctl(uv__os390_epoll* lst,
   } else
     abort();
 
+  uv_mutex_unlock(&global_epoll_lock);
   return 0;
 }
 
 
 int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events,
                int maxevents, int timeout) {
-  size_t size;
+  nmsgsfds_t size;
   struct pollfd* pfds;
   int pollret;
   int reventcount;
 
-  uv_mutex_lock(&global_epoll_lock);
-  uv_mutex_unlock(&global_epoll_lock);
-  size = lst->size;
+  size = _SET_FDS_MSGS(size, 1, lst->size - 1);
   pfds = lst->items;
   pollret = poll(pfds, size, timeout);
-  if(pollret == -1)
+  if (pollret <= 0)
     return pollret;
 
+  pollret = _NFDS(pollret) + _NMSGS(pollret);
+
   reventcount = 0;
-  for (int i = 0; i < lst->size && i < maxevents; ++i) {
+  for (int i = 0; 
+       i < lst->size && i < maxevents && reventcount < pollret; ++i) {
     struct epoll_event ev;
 
-    ev.events = 0;
-    ev.fd = pfds[i].fd;
-    if(!pfds[i].revents)
+    if (pfds[i].fd == -1 || pfds[i].revents == 0)
       continue;
 
-    if(pfds[i].revents & POLLRDNORM)
-      ev.events = ev.events | POLLIN;
-
-    if(pfds[i].revents & POLLWRNORM)
-      ev.events = ev.events | POLLOUT;
-
-    if(pfds[i].revents & POLLHUP)
-      ev.events = ev.events | POLLHUP;
-
-    pfds[i].revents = 0;
+    ev.fd = pfds[i].fd;
+    ev.events = pfds[i].revents;
     events[reventcount++] = ev;
   }
 
@@ -235,9 +317,14 @@ int epoll_file_close(int fd) {
 }
 
 void epoll_queue_close(uv__os390_epoll* lst) {
+  /* Remove epoll instance from global queue */
   uv_mutex_lock(&global_epoll_lock);
   QUEUE_REMOVE(&lst->member);
   uv_mutex_unlock(&global_epoll_lock);
+
+  /* Free resources */
+  msgctl(lst->msg_queue, IPC_RMID, NULL);
+  lst->msg_queue = -1;
   uv__free(lst->items);
   lst->items = NULL;
 }
@@ -332,3 +419,81 @@ char* mkdtemp(char* path) {
 
   return path;
 }
+
+
+ssize_t os390_readlink(const char* path, char* buf, size_t len) {
+  ssize_t rlen;
+  ssize_t vlen;
+  ssize_t plen;
+  char* delimiter;
+  char old_delim;
+  char* tmpbuf;
+  char realpathstr[PATH_MAX + 1];
+
+  tmpbuf = uv__malloc(len + 1);
+  if (tmpbuf == NULL) {
+    errno = ENOMEM;
+    return -1;
+  }
+
+  rlen = readlink(path, tmpbuf, len);
+  if (rlen < 0) {
+    uv__free(tmpbuf);
+    return rlen;
+  }
+
+  if (rlen < 3 || strncmp("/$", tmpbuf, 2) != 0) {
+    /* Straightforward readlink. */
+    memcpy(buf, tmpbuf, rlen);
+    uv__free(tmpbuf);
+    return rlen;
+  }
+
+  /*
+   * There is a parmlib variable at the beginning
+   * which needs interpretation.
+   */
+  tmpbuf[rlen] = '\0';
+  delimiter = strchr(tmpbuf + 2, '/');
+  if (delimiter == NULL)
+    /* No slash at the end */
+    delimiter = strchr(tmpbuf + 2, '\0');
+
+  /* Read real path of the variable. */
+  old_delim = *delimiter;
+  *delimiter = '\0';
+  if (realpath(tmpbuf, realpathstr) == NULL) {
+    uv__free(tmpbuf);
+    return -1;
+  }
+
+  /* realpathstr is not guaranteed to end with null byte.*/
+  realpathstr[PATH_MAX] = '\0';
+
+  /* Reset the delimiter and fill up the buffer. */
+  *delimiter = old_delim;
+  plen = strlen(delimiter);
+  vlen = strlen(realpathstr);
+  rlen = plen + vlen;
+  if (rlen > len) {
+    uv__free(tmpbuf);
+    errno = ENAMETOOLONG;
+    return -1;
+  }
+  memcpy(buf, realpathstr, vlen);
+  memcpy(buf + vlen, delimiter, plen);
+
+  /* Done using temporary buffer. */
+  uv__free(tmpbuf);
+
+  return rlen;
+}
+
+
+size_t strnlen(const char* str, size_t maxlen) {
+  void* p = memchr(str, 0, maxlen);
+  if (p == NULL)
+    return maxlen;
+  else
+    return p - str;
+}
diff --git a/src/unix/os390-syscalls.h b/src/unix/os390-syscalls.h
index 61a7cee..6e34a88 100644
--- a/src/unix/os390-syscalls.h
+++ b/src/unix/os390-syscalls.h
@@ -50,6 +50,7 @@ typedef struct {
   QUEUE member;
   struct pollfd* items;
   unsigned long size;
+  int msg_queue;
 } uv__os390_epoll;
 
 /* epoll api */
@@ -65,5 +66,7 @@ int scandir(const char* maindir, struct dirent*** namelist,
             int (*compar)(const struct dirent **,
             const struct dirent **));
 char *mkdtemp(char* path);
+ssize_t os390_readlink(const char* path, char* buf, size_t len);
+size_t strnlen(const char* str, size_t maxlen);
 
 #endif /* UV_OS390_SYSCALL_H_ */
diff --git a/src/unix/os390.c b/src/unix/os390.c
index 2ba5abf..081438e 100644
--- a/src/unix/os390.c
+++ b/src/unix/os390.c
@@ -25,6 +25,9 @@
 #include <utmpx.h>
 #include <unistd.h>
 #include <sys/ps.h>
+#include <builtins.h>
+#include <termios.h>
+#include <sys/msg.h>
 #if defined(__clang__)
 #include "csrsic.h"
 #else
@@ -32,6 +35,7 @@
 #endif
 
 #define CVT_PTR           0x10
+#define PSA_PTR           0x00
 #define CSD_OFFSET        0x294
 
 /*
@@ -69,6 +73,18 @@
 /* CPC model length from the CSRSI Service. */
 #define CPCMODEL_LENGTH   16
 
+/* Pointer to the home (current) ASCB. */
+#define PSAAOLD           0x224
+
+/* Pointer to rsm address space block extension. */
+#define ASCBRSME          0x16C
+
+/*
+    NUMBER OF FRAMES CURRENTLY IN USE BY THIS ADDRESS SPACE.
+    It does not include 2G frames.
+*/
+#define RAXFMCT           0x2C
+
 /* Thread Entry constants */
 #define PGTH_CURRENT  1
 #define PGTH_LEN      26
@@ -76,6 +92,9 @@
 #pragma linkage(BPX4GTH, OS)
 #pragma linkage(BPX1GTH, OS)
 
+/* TOD Clock resolution in nanoseconds */
+#define TOD_RES 4.096
+
 typedef unsigned data_area_ptr_assign_type;
 
 typedef union {
@@ -100,7 +119,7 @@ void uv_loadavg(double avg[3]) {
 int uv__platform_loop_init(uv_loop_t* loop) {
   uv__os390_epoll* ep;
 
-  ep = epoll_create1(UV__EPOLL_CLOEXEC);
+  ep = epoll_create1(0);
   loop->ep = ep;
   if (ep == NULL)
     return -errno;
@@ -118,9 +137,10 @@ void uv__platform_loop_delete(uv_loop_t* loop) {
 
 
 uint64_t uv__hrtime(uv_clocktype_t type) {
-  struct timeval time;
-  gettimeofday(&time, NULL);
-  return (uint64_t) time.tv_sec * 1e9 + time.tv_usec * 1e3;
+  unsigned long long timestamp;
+  __stckf(&timestamp);
+  /* Convert to nanoseconds */
+  return timestamp / TOD_RES;
 }
 
 
@@ -337,13 +357,17 @@ uint64_t uv_get_total_memory(void) {
 
 
 int uv_resident_set_memory(size_t* rss) {
-  W_PSPROC buf;
+  char* psa;
+  char* ascb;
+  char* rax;
+  size_t nframes;
 
-  memset(&buf, 0, sizeof(buf));
-  if (w_getpsent(0, &buf, sizeof(W_PSPROC)) == -1)
-    return -EINVAL;
+  psa = PSA_PTR;
+  ascb  = *(char* __ptr32 *)(psa + PSAAOLD);
+  rax = *(char* __ptr32 *)(ascb + ASCBRSME);
+  nframes = *(unsigned int*)(rax + RAXFMCT);
 
-  *rss = buf.ps_size;
+  *rss = nframes * sysconf(_SC_PAGESIZE);
   return 0;
 }
 
@@ -364,7 +388,6 @@ int uv_uptime(double* uptime) {
 
 int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
   uv_cpu_info_t* cpu_info;
-  int result;
   int idx;
   siv1v2 info;
   data_area_ptr cvt = {0};
@@ -663,11 +686,124 @@ int uv__io_check_fd(uv_loop_t* loop, int fd) {
   return 0;
 }
 
+
+void uv__fs_event_close(uv_fs_event_t* handle) {
+  uv_fs_event_stop(handle);
+}
+
+
+int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) {
+  uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT);
+  return 0;
+}
+
+
+int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb,
+                      const char* filename, unsigned int flags) {
+  uv__os390_epoll* ep;
+  _RFIS reg_struct;
+  char* path;
+  int rc;
+
+  if (uv__is_active(handle))
+    return -EINVAL;
+
+  ep = handle->loop->ep;
+  assert(ep->msg_queue != -1);
+
+  reg_struct.__rfis_cmd  = _RFIS_REG;
+  reg_struct.__rfis_qid  = ep->msg_queue;
+  reg_struct.__rfis_type = 1;
+  memcpy(reg_struct.__rfis_utok, &handle, sizeof(handle));
+
+  path = uv__strdup(filename);
+  if (path == NULL)
+    return -ENOMEM;
+
+  rc = __w_pioctl(path, _IOCC_REGFILEINT, sizeof(reg_struct), &reg_struct);
+  if (rc != 0)
+    return -errno;
+
+  uv__handle_start(handle);
+  handle->path = path;
+  handle->cb = cb;
+  memcpy(handle->rfis_rftok, reg_struct.__rfis_rftok,
+         sizeof(handle->rfis_rftok));
+
+  return 0;
+}
+
+
+int uv_fs_event_stop(uv_fs_event_t* handle) {
+  uv__os390_epoll* ep;
+  _RFIS reg_struct;
+  int rc;
+
+  if (!uv__is_active(handle))
+    return 0;
+
+  ep = handle->loop->ep;
+  assert(ep->msg_queue != -1);
+
+  reg_struct.__rfis_cmd  = _RFIS_UNREG;
+  reg_struct.__rfis_qid  = ep->msg_queue;
+  reg_struct.__rfis_type = 1;
+  memcpy(reg_struct.__rfis_rftok, handle->rfis_rftok,
+         sizeof(handle->rfis_rftok));
+
+  /* 
+   * This call will take "/" as the path argument in case we
+   * don't care to supply the correct path. The system will simply
+   * ignore it.
+   */
+  rc = __w_pioctl("/", _IOCC_REGFILEINT, sizeof(reg_struct), &reg_struct);
+  if (rc != 0 && errno != EALREADY && errno != ENOENT)
+    abort();
+
+  uv__handle_stop(handle);
+
+  return 0;
+}
+
+
+static int os390_message_queue_handler(uv__os390_epoll* ep) {
+  uv_fs_event_t* handle;
+  int msglen;
+  int events;
+  _RFIM msg;
+
+  if (ep->msg_queue == -1)
+    return 0;
+
+  msglen = msgrcv(ep->msg_queue, &msg, sizeof(msg), 0, IPC_NOWAIT);
+
+  if (msglen == -1 && errno == ENOMSG)
+    return 0;
+
+  if (msglen == -1)
+    abort();
+
+  events = 0;
+  if (msg.__rfim_event == _RFIM_ATTR || msg.__rfim_event == _RFIM_WRITE)
+    events = UV_CHANGE;
+  else if (msg.__rfim_event == _RFIM_RENAME)
+    events = UV_RENAME;
+  else
+    /* Some event that we are not interested in. */
+    return 0;
+
+  handle = *(uv_fs_event_t**)(msg.__rfim_utok);
+  handle->cb(handle, uv__basename_r(handle->path), events, 0);
+  return 1;
+}
+
+
 void uv__io_poll(uv_loop_t* loop, int timeout) {
   static const int max_safe_timeout = 1789569;
   struct epoll_event events[1024];
   struct epoll_event* pe;
   struct epoll_event e;
+  uv__os390_epoll* ep;
   int real_timeout;
   QUEUE* q;
   uv__io_t* w;
@@ -745,9 +881,11 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
     SAVE_ERRNO(uv__update_time(loop));
     if (nfds == 0) {
       assert(timeout != -1);
-      timeout = real_timeout - timeout;
-      if (timeout > 0)
+
+      if (timeout > 0) {
+        timeout = real_timeout - timeout;
         continue;
+      }
 
       return;
     }
@@ -779,6 +917,12 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
       if (fd == -1)
         continue;
 
+      ep = loop->ep;
+      if (fd == ep->msg_queue) {
+        os390_message_queue_handler(ep);
+        continue;
+      }
+
       assert(fd >= 0);
       assert((unsigned) fd < loop->nwatchers);
 
@@ -843,7 +987,12 @@ void uv__set_process_title(const char* title) {
 }
 
 int uv__io_fork(uv_loop_t* loop) {
-  uv__platform_loop_delete(loop);
+  /* 
+    Nullify the msg queue but don't close it because
+    it is still being used by the parent.
+  */
+  loop->ep = NULL;
 
+  uv__platform_loop_delete(loop);
   return uv__platform_loop_init(loop);
 }
diff --git a/src/unix/pipe.c b/src/unix/pipe.c
index 4a81295..ac7cfb4 100644
--- a/src/unix/pipe.c
+++ b/src/unix/pipe.c
@@ -302,3 +302,56 @@ uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) {
   else
     return uv__handle_type(handle->accepted_fd);
 }
+
+
+int uv_pipe_chmod(uv_pipe_t* handle, int mode) {
+  unsigned desired_mode;
+  struct stat pipe_stat;
+  char* name_buffer;
+  size_t name_len;
+  int r;
+
+  if (handle == NULL || uv__stream_fd(handle) == -1)
+    return -EBADF;
+
+  if (mode != UV_READABLE &&
+      mode != UV_WRITABLE &&
+      mode != (UV_WRITABLE | UV_READABLE))
+    return -EINVAL;
+
+  if (fstat(uv__stream_fd(handle), &pipe_stat) == -1)
+    return -errno;
+
+  desired_mode = 0;
+  if (mode & UV_READABLE)
+    desired_mode |= S_IRUSR | S_IRGRP | S_IROTH;
+  if (mode & UV_WRITABLE)
+    desired_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+
+  /* Exit early if pipe already has desired mode. */
+  if ((pipe_stat.st_mode & desired_mode) == desired_mode)
+    return 0;
+
+  pipe_stat.st_mode |= desired_mode;
+
+  /* Unfortunately fchmod does not work on all platforms, we will use chmod. */
+  name_len = 0;
+  r = uv_pipe_getsockname(handle, NULL, &name_len);
+  if (r != UV_ENOBUFS)
+    return r;
+
+  name_buffer = uv__malloc(name_len);
+  if (name_buffer == NULL)
+    return UV_ENOMEM;
+
+  r = uv_pipe_getsockname(handle, name_buffer, &name_len);
+  if (r != 0) {
+    uv__free(name_buffer);
+    return r;
+  }
+
+  r = chmod(name_buffer, pipe_stat.st_mode);
+  uv__free(name_buffer);
+
+  return r != -1 ? 0 : -errno;
+}
diff --git a/src/unix/poll.c b/src/unix/poll.c
index 370994b..816c7dc 100644
--- a/src/unix/poll.c
+++ b/src/unix/poll.c
@@ -33,8 +33,19 @@ static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
 
   handle = container_of(w, uv_poll_t, io_watcher);
 
-  if (events & POLLERR) {
-    uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP);
+  /*
+   * As documented in the kernel source fs/kernfs/file.c #780
+   * poll will return POLLERR|POLLPRI in case of sysfs
+   * polling. This does not happen in case of out-of-band
+   * TCP messages.
+   *
+   * The above is the case on (at least) FreeBSD and Linux.
+   *
+   * So to properly determine a POLLPRI or a POLLERR we need
+   * to check for both.
+   */
+  if ((events & POLLERR) && !(events & UV__POLLPRI)) {
+    uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI);
     uv__handle_stop(handle);
     handle->poll_cb(handle, -EBADF, 0);
     return;
@@ -43,6 +54,8 @@ static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
   pevents = 0;
   if (events & POLLIN)
     pevents |= UV_READABLE;
+  if (events & UV__POLLPRI)
+    pevents |= UV_PRIORITIZED;
   if (events & POLLOUT)
     pevents |= UV_WRITABLE;
   if (events & UV__POLLRDHUP)
@@ -86,8 +99,9 @@ int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle,
 static void uv__poll_stop(uv_poll_t* handle) {
   uv__io_stop(handle->loop,
               &handle->io_watcher,
-              POLLIN | POLLOUT | UV__POLLRDHUP);
+              POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI);
   uv__handle_stop(handle);
+  uv__platform_invalidate_fd(handle->loop, handle->io_watcher.fd);
 }
 
 
@@ -101,7 +115,8 @@ int uv_poll_stop(uv_poll_t* handle) {
 int uv_poll_start(uv_poll_t* handle, int pevents, uv_poll_cb poll_cb) {
   int events;
 
-  assert((pevents & ~(UV_READABLE | UV_WRITABLE | UV_DISCONNECT)) == 0);
+  assert((pevents & ~(UV_READABLE | UV_WRITABLE | UV_DISCONNECT |
+                      UV_PRIORITIZED)) == 0);
   assert(!uv__is_closing(handle));
 
   uv__poll_stop(handle);
@@ -112,6 +127,8 @@ int uv_poll_start(uv_poll_t* handle, int pevents, uv_poll_cb poll_cb) {
   events = 0;
   if (pevents & UV_READABLE)
     events |= POLLIN;
+  if (pevents & UV_PRIORITIZED)
+    events |= UV__POLLPRI;
   if (pevents & UV_WRITABLE)
     events |= POLLOUT;
   if (pevents & UV_DISCONNECT)
diff --git a/src/unix/process.c b/src/unix/process.c
index f2fe305..9842710 100644
--- a/src/unix/process.c
+++ b/src/unix/process.c
@@ -279,9 +279,12 @@ static void uv__process_child_init(const uv_process_options_t* options,
                                    int stdio_count,
                                    int (*pipes)[2],
                                    int error_fd) {
+  sigset_t set;
   int close_fd;
   int use_fd;
+  int err;
   int fd;
+  int n;
 
   if (options->flags & UV_PROCESS_DETACHED)
     setsid();
@@ -376,6 +379,31 @@ static void uv__process_child_init(const uv_process_options_t* options,
     environ = options->env;
   }
 
+  /* Reset signal disposition.  Use a hard-coded limit because NSIG
+   * is not fixed on Linux: it's either 32, 34 or 64, depending on
+   * whether RT signals are enabled.  We are not allowed to touch
+   * RT signal handlers, glibc uses them internally.
+   */
+  for (n = 1; n < 32; n += 1) {
+    if (n == SIGKILL || n == SIGSTOP)
+      continue;  /* Can't be changed. */
+
+    if (SIG_ERR != signal(n, SIG_DFL))
+      continue;
+
+    uv__write_int(error_fd, -errno);
+    _exit(127);
+  }
+
+  /* Reset signal mask. */
+  sigemptyset(&set);
+  err = pthread_sigmask(SIG_SETMASK, &set, NULL);
+
+  if (err != 0) {
+    uv__write_int(error_fd, -err);
+    _exit(127);
+  }
+
   execvp(options->file, options->args);
   uv__write_int(error_fd, -errno);
   _exit(127);
@@ -391,6 +419,7 @@ int uv_spawn(uv_loop_t* loop,
   return -ENOSYS;
 #else
   int signal_pipe[2] = { -1, -1 };
+  int pipes_storage[8][2];
   int (*pipes)[2];
   int stdio_count;
   ssize_t r;
@@ -415,7 +444,10 @@ int uv_spawn(uv_loop_t* loop,
     stdio_count = 3;
 
   err = -ENOMEM;
-  pipes = uv__malloc(stdio_count * sizeof(*pipes));
+  pipes = pipes_storage;
+  if (stdio_count > (int) ARRAY_SIZE(pipes_storage))
+    pipes = uv__malloc(stdio_count * sizeof(*pipes));
+
   if (pipes == NULL)
     goto error;
 
@@ -520,7 +552,9 @@ int uv_spawn(uv_loop_t* loop,
   process->pid = pid;
   process->exit_cb = options->exit_cb;
 
-  uv__free(pipes);
+  if (pipes != pipes_storage)
+    uv__free(pipes);
+
   return exec_errorno;
 
 error:
@@ -534,7 +568,9 @@ error:
       if (pipes[i][1] != -1)
         uv__close_nocheckstdio(pipes[i][1]);
     }
-    uv__free(pipes);
+
+    if (pipes != pipes_storage)
+      uv__free(pipes);
   }
 
   return err;
diff --git a/src/unix/proctitle.c b/src/unix/proctitle.c
index 9160f7e..1b3a798 100644
--- a/src/unix/proctitle.c
+++ b/src/unix/proctitle.c
@@ -26,6 +26,8 @@
 
 extern void uv__set_process_title(const char* title);
 
+static uv_mutex_t process_title_mutex;
+static uv_once_t process_title_mutex_once = UV_ONCE_INIT;
 static void* args_mem;
 
 static struct {
@@ -34,6 +36,11 @@ static struct {
 } process_title;
 
 
+static void init_process_title_mutex_once(void) {
+  uv_mutex_init(&process_title_mutex);
+}
+
+
 char** uv_setup_args(int argc, char** argv) {
   char** new_argv;
   size_t size;
@@ -81,12 +88,16 @@ char** uv_setup_args(int argc, char** argv) {
 
 
 int uv_set_process_title(const char* title) {
-  if (process_title.len == 0)
-    return 0;
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
+  if (process_title.len != 0) {
+    /* No need to terminate, byte after is always '\0'. */
+    strncpy(process_title.str, title, process_title.len);
+    uv__set_process_title(title);
+  }
 
-  /* No need to terminate, byte after is always '\0'. */
-  strncpy(process_title.str, title, process_title.len);
-  uv__set_process_title(title);
+  uv_mutex_unlock(&process_title_mutex);
 
   return 0;
 }
@@ -95,12 +106,22 @@ int uv_set_process_title(const char* title) {
 int uv_get_process_title(char* buffer, size_t size) {
   if (buffer == NULL || size == 0)
     return -EINVAL;
-  else if (size <= process_title.len)
+
+  uv_once(&process_title_mutex_once, init_process_title_mutex_once);
+  uv_mutex_lock(&process_title_mutex);
+
+  if (size <= process_title.len) {
+    uv_mutex_unlock(&process_title_mutex);
     return -ENOBUFS;
+  }
+
+  if (process_title.len != 0)
+    memcpy(buffer, process_title.str, process_title.len + 1);
 
-  memcpy(buffer, process_title.str, process_title.len + 1);
   buffer[process_title.len] = '\0';
 
+  uv_mutex_unlock(&process_title_mutex);
+
   return 0;
 }
 
diff --git a/src/unix/pthread-barrier.c b/src/unix/pthread-barrier.c
deleted file mode 100644
index b6e604d..0000000
--- a/src/unix/pthread-barrier.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
-Copyright (c) 2016, Kari Tristan Helgason <kthelgason at gmail.com>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-*/
-#include "uv-common.h"
-#include "pthread-barrier.h"
-
-#include <stdlib.h>
-#include <assert.h>
-
-/* TODO: support barrier_attr */
-int pthread_barrier_init(pthread_barrier_t* barrier,
-                         const void* barrier_attr,
-                         unsigned count) {
-  int rc;
-  _uv_barrier* b;
-
-  if (barrier == NULL || count == 0)
-    return EINVAL;
-
-  if (barrier_attr != NULL)
-    return ENOTSUP;
-
-  b = uv__malloc(sizeof(*b));
-  if (b == NULL)
-    return ENOMEM;
-
-  b->in = 0;
-  b->out = 0;
-  b->threshold = count;
-
-  if ((rc = pthread_mutex_init(&b->mutex, NULL)) != 0)
-    goto error2;
-  if ((rc = pthread_cond_init(&b->cond, NULL)) != 0)
-    goto error;
-
-  barrier->b = b;
-  return 0;
-
-error:
-  pthread_mutex_destroy(&b->mutex);
-error2:
-  uv__free(b);
-  return rc;
-}
-
-int pthread_barrier_wait(pthread_barrier_t* barrier) {
-  int rc;
-  _uv_barrier* b;
-
-  if (barrier == NULL || barrier->b == NULL)
-    return EINVAL;
-
-  b = barrier->b;
-  /* Lock the mutex*/
-  if ((rc = pthread_mutex_lock(&b->mutex)) != 0)
-    return rc;
-
-  /* Increment the count. If this is the first thread to reach the threshold,
-     wake up waiters, unlock the mutex, then return
-     PTHREAD_BARRIER_SERIAL_THREAD. */
-  if (++b->in == b->threshold) {
-    b->in = 0;
-    b->out = b->threshold - 1;
-    rc = pthread_cond_signal(&b->cond);
-    assert(rc == 0);
-
-    pthread_mutex_unlock(&b->mutex);
-    return PTHREAD_BARRIER_SERIAL_THREAD;
-  }
-  /* Otherwise, wait for other threads until in is set to 0,
-     then return 0 to indicate this is not the first thread. */
-  do {
-    if ((rc = pthread_cond_wait(&b->cond, &b->mutex)) != 0)
-      break;
-  } while (b->in != 0);
-
-  /* mark thread exit */
-  b->out--;
-  pthread_cond_signal(&b->cond);
-  pthread_mutex_unlock(&b->mutex);
-  return rc;
-}
-
-int pthread_barrier_destroy(pthread_barrier_t* barrier) {
-  int rc;
-  _uv_barrier* b;
-
-  if (barrier == NULL || barrier->b == NULL)
-    return EINVAL;
-
-  b = barrier->b;
-
-  if ((rc = pthread_mutex_lock(&b->mutex)) != 0)
-    return rc;
-
-  if (b->in > 0 || b->out > 0)
-    rc = EBUSY;
-
-  pthread_mutex_unlock(&b->mutex);
-
-  if (rc)
-    return rc;
-
-  pthread_cond_destroy(&b->cond);
-  pthread_mutex_destroy(&b->mutex);
-  uv__free(barrier->b);
-  barrier->b = NULL;
-  return 0;
-}
diff --git a/src/unix/signal.c b/src/unix/signal.c
index cb09ead..3759778 100644
--- a/src/unix/signal.c
+++ b/src/unix/signal.c
@@ -28,6 +28,9 @@
 #include <string.h>
 #include <unistd.h>
 
+#ifndef SA_RESTART
+# define SA_RESTART 0
+#endif
 
 typedef struct {
   uv_signal_t* handle;
@@ -216,7 +219,9 @@ static int uv__signal_register_handler(int signum, int oneshot) {
   if (sigfillset(&sa.sa_mask))
     abort();
   sa.sa_handler = uv__signal_handler;
-  sa.sa_flags = oneshot ? SA_RESETHAND : 0;
+  sa.sa_flags = SA_RESTART;
+  if (oneshot)
+    sa.sa_flags |= SA_RESETHAND;
 
   /* XXX save old action so we can restore it later on? */
   if (sigaction(signum, &sa, NULL))
diff --git a/src/unix/stream.c b/src/unix/stream.c
index 7b23d16..6fc0a01 100644
--- a/src/unix/stream.c
+++ b/src/unix/stream.c
@@ -514,7 +514,7 @@ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
   int err;
 
   stream = container_of(w, uv_stream_t, io_watcher);
-  assert(events == POLLIN);
+  assert(events & POLLIN);
   assert(stream->accepted_fd == -1);
   assert(!(stream->flags & UV_CLOSING));
 
@@ -750,6 +750,7 @@ static void uv__write(uv_stream_t* stream) {
   int iovmax;
   int iovcnt;
   ssize_t n;
+  int err;
 
 start:
 
@@ -782,14 +783,21 @@ start:
    */
 
   if (req->send_handle) {
+    int fd_to_send;
     struct msghdr msg;
     struct cmsghdr *cmsg;
-    int fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle);
     union {
       char data[64];
       struct cmsghdr alias;
     } scratch;
 
+    if (uv__is_closing(req->send_handle)) {
+      err = -EBADF;
+      goto error;
+    }
+
+    fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle);
+
     memset(&scratch, 0, sizeof(scratch));
 
     assert(fd_to_send >= 0);
@@ -851,15 +859,9 @@ start:
   }
 
   if (n < 0) {
-    if (errno != EAGAIN && errno != EWOULDBLOCK) {
-      /* Error */
-      req->error = -errno;
-      uv__write_req_finish(req);
-      uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT);
-      if (!uv__io_active(&stream->io_watcher, POLLIN))
-        uv__handle_stop(stream);
-      uv__stream_osx_interrupt_select(stream);
-      return;
+    if (errno != EAGAIN && errno != EWOULDBLOCK && errno != ENOBUFS) {
+      err = -errno;
+      goto error;
     } else if (stream->flags & UV_STREAM_BLOCKING) {
       /* If this is a blocking stream, try again. */
       goto start;
@@ -923,6 +925,16 @@ start:
 
   /* Notify select() thread about state change */
   uv__stream_osx_interrupt_select(stream);
+
+  return;
+
+error:
+  req->error = err;
+  uv__write_req_finish(req);
+  uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT);
+  if (!uv__io_active(&stream->io_watcher, POLLIN))
+    uv__handle_stop(stream);
+  uv__stream_osx_interrupt_select(stream);
 }
 
 
@@ -1249,8 +1261,9 @@ static void uv__read(uv_stream_t* stream) {
 
 
 int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
-  assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE) &&
-         "uv_shutdown (unix) only supports uv_handle_t right now");
+  assert(stream->type == UV_TCP ||
+         stream->type == UV_TTY ||
+         stream->type == UV_NAMED_PIPE);
 
   if (!(stream->flags & UV_STREAM_WRITABLE) ||
       stream->flags & UV_STREAM_SHUT ||
diff --git a/src/unix/sunos.c b/src/unix/sunos.c
index 2dc02ae..a72c26a 100644
--- a/src/unix/sunos.c
+++ b/src/unix/sunos.c
@@ -747,7 +747,8 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent) {
     return 1;
   if (ent->ifa_addr == NULL)
     return 1;
-  if (ent->ifa_addr->sa_family == PF_PACKET)
+  if (ent->ifa_addr->sa_family != AF_INET &&
+      ent->ifa_addr->sa_family != AF_INET6)
     return 1;
   return 0;
 }
@@ -756,7 +757,6 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
   uv_interface_address_t* address;
   struct ifaddrs* addrs;
   struct ifaddrs* ent;
-  int i;
 
   if (getifaddrs(&addrs))
     return -errno;
diff --git a/src/unix/tcp.c b/src/unix/tcp.c
index c423dcb..c7c8d21 100644
--- a/src/unix/tcp.c
+++ b/src/unix/tcp.c
@@ -28,15 +28,12 @@
 #include <errno.h>
 
 
-static int maybe_new_socket(uv_tcp_t* handle, int domain, int flags) {
+static int new_socket(uv_tcp_t* handle, int domain, unsigned long flags) {
+  struct sockaddr_storage saddr;
+  socklen_t slen;
   int sockfd;
   int err;
 
-  if (domain == AF_UNSPEC || uv__stream_fd(handle) != -1) {
-    handle->flags |= flags;
-    return 0;
-  }
-
   err = uv__socket(domain, SOCK_STREAM, 0);
   if (err < 0)
     return err;
@@ -48,10 +45,74 @@ static int maybe_new_socket(uv_tcp_t* handle, int domain, int flags) {
     return err;
   }
 
+  if (flags & UV_HANDLE_BOUND) {
+    /* Bind this new socket to an arbitrary port */
+    slen = sizeof(saddr);
+    memset(&saddr, 0, sizeof(saddr));
+    err = getsockname(uv__stream_fd(handle), (struct sockaddr*) &saddr, &slen);
+    if (err) {
+      uv__close(sockfd);
+      return err;
+    }
+
+    err = bind(uv__stream_fd(handle), (struct sockaddr*) &saddr, slen);
+    if (err) {
+      uv__close(sockfd);
+      return err;
+    }
+  }
+
   return 0;
 }
 
 
+static int maybe_new_socket(uv_tcp_t* handle, int domain, unsigned long flags) {
+  struct sockaddr_storage saddr;
+  socklen_t slen;
+
+  if (domain == AF_UNSPEC) {
+    handle->flags |= flags;
+    return 0;
+  }
+
+  if (uv__stream_fd(handle) != -1) {
+
+    if (flags & UV_HANDLE_BOUND) {
+
+      if (handle->flags & UV_HANDLE_BOUND) {
+        /* It is already bound to a port. */
+        handle->flags |= flags;
+        return 0;
+      }
+      
+      /* Query to see if tcp socket is bound. */
+      slen = sizeof(saddr);
+      memset(&saddr, 0, sizeof(saddr));
+      if (getsockname(uv__stream_fd(handle), (struct sockaddr*) &saddr, &slen))
+        return -errno;
+
+      if ((saddr.ss_family == AF_INET6 &&
+          ((struct sockaddr_in6*) &saddr)->sin6_port != 0) ||
+          (saddr.ss_family == AF_INET &&
+          ((struct sockaddr_in*) &saddr)->sin_port != 0)) {
+        /* Handle is already bound to a port. */
+        handle->flags |= flags;
+        return 0;
+      }
+
+      /* Bind to arbitrary port */
+      if (bind(uv__stream_fd(handle), (struct sockaddr*) &saddr, slen))
+        return -errno;
+    }
+
+    handle->flags |= flags;
+    return 0;
+  }
+
+  return new_socket(handle, domain, flags);
+}
+
+
 int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* tcp, unsigned int flags) {
   int domain;
 
@@ -260,6 +321,7 @@ int uv_tcp_getpeername(const uv_tcp_t* handle,
 
 int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) {
   static int single_accept = -1;
+  unsigned long flags;
   int err;
 
   if (tcp->delayed_error)
@@ -273,30 +335,17 @@ int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) {
   if (single_accept)
     tcp->flags |= UV_TCP_SINGLE_ACCEPT;
 
-  err = maybe_new_socket(tcp, AF_INET, UV_STREAM_READABLE);
-  if (err)
-    return err;
-
-#ifdef __MVS__
+  flags = UV_STREAM_READABLE;
+#if defined(__MVS__)
   /* on zOS the listen call does not bind automatically
      if the socket is unbound. Hence the manual binding to
      an arbitrary port is required to be done manually
   */
-
-  if (!(tcp->flags & UV_HANDLE_BOUND)) {
-    struct sockaddr_storage saddr;
-    socklen_t slen  = sizeof(saddr);
-    memset(&saddr, 0, sizeof(saddr));
-
-    if (getsockname(tcp->io_watcher.fd, (struct sockaddr*) &saddr, &slen))
-      return -errno;
-
-    if (bind(tcp->io_watcher.fd, (struct sockaddr*) &saddr, slen))
-      return -errno;
-
-    tcp->flags |= UV_HANDLE_BOUND;
-  }
-#endif
+  flags |= UV_HANDLE_BOUND;
+#endif  
+  err = maybe_new_socket(tcp, AF_INET, flags);
+  if (err)
+    return err;
 
   if (listen(tcp->io_watcher.fd, backlog))
     return -errno;
diff --git a/src/unix/thread.c b/src/unix/thread.c
index a9b5e4c..abaca29 100644
--- a/src/unix/thread.c
+++ b/src/unix/thread.c
@@ -41,36 +41,159 @@
 #define NANOSEC ((uint64_t) 1e9)
 
 
-int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) {
-  int err;
-  pthread_attr_t* attr;
-#if defined(__APPLE__)
-  pthread_attr_t attr_storage;
-  struct rlimit lim;
+#if defined(UV__PTHREAD_BARRIER_FALLBACK)
+/* TODO: support barrier_attr */
+int pthread_barrier_init(pthread_barrier_t* barrier,
+                         const void* barrier_attr,
+                         unsigned count) {
+  int rc;
+  _uv_barrier* b;
+
+  if (barrier == NULL || count == 0)
+    return EINVAL;
+
+  if (barrier_attr != NULL)
+    return ENOTSUP;
+
+  b = uv__malloc(sizeof(*b));
+  if (b == NULL)
+    return ENOMEM;
+
+  b->in = 0;
+  b->out = 0;
+  b->threshold = count;
+
+  if ((rc = pthread_mutex_init(&b->mutex, NULL)) != 0)
+    goto error2;
+  if ((rc = pthread_cond_init(&b->cond, NULL)) != 0)
+    goto error;
+
+  barrier->b = b;
+  return 0;
+
+error:
+  pthread_mutex_destroy(&b->mutex);
+error2:
+  uv__free(b);
+  return rc;
+}
+
+int pthread_barrier_wait(pthread_barrier_t* barrier) {
+  int rc;
+  _uv_barrier* b;
+
+  if (barrier == NULL || barrier->b == NULL)
+    return EINVAL;
+
+  b = barrier->b;
+  /* Lock the mutex*/
+  if ((rc = pthread_mutex_lock(&b->mutex)) != 0)
+    return rc;
+
+  /* Increment the count. If this is the first thread to reach the threshold,
+     wake up waiters, unlock the mutex, then return
+     PTHREAD_BARRIER_SERIAL_THREAD. */
+  if (++b->in == b->threshold) {
+    b->in = 0;
+    b->out = b->threshold - 1;
+    rc = pthread_cond_signal(&b->cond);
+    assert(rc == 0);
+
+    pthread_mutex_unlock(&b->mutex);
+    return PTHREAD_BARRIER_SERIAL_THREAD;
+  }
+  /* Otherwise, wait for other threads until in is set to 0,
+     then return 0 to indicate this is not the first thread. */
+  do {
+    if ((rc = pthread_cond_wait(&b->cond, &b->mutex)) != 0)
+      break;
+  } while (b->in != 0);
+
+  /* mark thread exit */
+  b->out--;
+  pthread_cond_signal(&b->cond);
+  pthread_mutex_unlock(&b->mutex);
+  return rc;
+}
+
+int pthread_barrier_destroy(pthread_barrier_t* barrier) {
+  int rc;
+  _uv_barrier* b;
+
+  if (barrier == NULL || barrier->b == NULL)
+    return EINVAL;
+
+  b = barrier->b;
+
+  if ((rc = pthread_mutex_lock(&b->mutex)) != 0)
+    return rc;
+
+  if (b->in > 0 || b->out > 0)
+    rc = EBUSY;
+
+  pthread_mutex_unlock(&b->mutex);
+
+  if (rc)
+    return rc;
+
+  pthread_cond_destroy(&b->cond);
+  pthread_mutex_destroy(&b->mutex);
+  uv__free(barrier->b);
+  barrier->b = NULL;
+  return 0;
+}
 #endif
 
-  /* On OSX threads other than the main thread are created with a reduced stack
-   * size by default, adjust it to RLIMIT_STACK.
-   */
-#if defined(__APPLE__)
-  if (getrlimit(RLIMIT_STACK, &lim))
-    abort();
 
-  attr = &attr_storage;
-  if (pthread_attr_init(attr))
+/* On MacOS, threads other than the main thread are created with a reduced
+ * stack size by default.  Adjust to RLIMIT_STACK aligned to the page size.
+ *
+ * On Linux, threads created by musl have a much smaller stack than threads
+ * created by glibc (80 vs. 2048 or 4096 kB.)  Follow glibc for consistency.
+ */
+static size_t thread_stack_size(void) {
+#if defined(__APPLE__) || defined(__linux__)
+  struct rlimit lim;
+
+  if (getrlimit(RLIMIT_STACK, &lim))
     abort();
 
   if (lim.rlim_cur != RLIM_INFINITY) {
     /* pthread_attr_setstacksize() expects page-aligned values. */
     lim.rlim_cur -= lim.rlim_cur % (rlim_t) getpagesize();
-
     if (lim.rlim_cur >= PTHREAD_STACK_MIN)
-      if (pthread_attr_setstacksize(attr, lim.rlim_cur))
-        abort();
+      return lim.rlim_cur;
   }
+#endif
+
+#if !defined(__linux__)
+  return 0;
+#elif defined(__PPC__) || defined(__ppc__) || defined(__powerpc__)
+  return 4 << 20;  /* glibc default. */
 #else
-  attr = NULL;
+  return 2 << 20;  /* glibc default. */
 #endif
+}
+
+
+int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) {
+  int err;
+  size_t stack_size;
+  pthread_attr_t* attr;
+  pthread_attr_t attr_storage;
+
+  attr = NULL;
+  stack_size = thread_stack_size();
+
+  if (stack_size > 0) {
+    attr = &attr_storage;
+
+    if (pthread_attr_init(attr))
+      abort();
+
+    if (pthread_attr_setstacksize(attr, stack_size))
+      abort();
+  }
 
   err = pthread_create(tid, attr, (void*(*)(void*)) entry, arg);
 
@@ -118,6 +241,25 @@ int uv_mutex_init(uv_mutex_t* mutex) {
 }
 
 
+int uv_mutex_init_recursive(uv_mutex_t* mutex) {
+  pthread_mutexattr_t attr;
+  int err;
+
+  if (pthread_mutexattr_init(&attr))
+    abort();
+
+  if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))
+    abort();
+
+  err = pthread_mutex_init(mutex, &attr);
+
+  if (pthread_mutexattr_destroy(&attr))
+    abort();
+
+  return -err;
+}
+
+
 void uv_mutex_destroy(uv_mutex_t* mutex) {
   if (pthread_mutex_destroy(mutex))
     abort();
@@ -281,18 +423,20 @@ int uv_sem_trywait(uv_sem_t* sem) {
 
 int uv_sem_init(uv_sem_t* sem, unsigned int value) {
   uv_sem_t semid;
-  struct sembuf buf;
   int err;
+  union {
+    int val;
+    struct semid_ds* buf;
+    unsigned short* array;
+  } arg;
 
-  buf.sem_num = 0;
-  buf.sem_op = value;
-  buf.sem_flg = 0;
 
   semid = semget(IPC_PRIVATE, 1, S_IRUSR | S_IWUSR);
   if (semid == -1)
     return -errno;
 
-  if (-1 == semop(semid, &buf, 1)) {
+  arg.val = value;
+  if (-1 == semctl(semid, 0, SETVAL, arg)) {
     err = errno;
     if (-1 == semctl(*sem, 0, IPC_RMID))
       abort();
@@ -424,7 +568,7 @@ int uv_cond_init(uv_cond_t* cond) {
   if (err)
     return -err;
 
-#if !(defined(__ANDROID__) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC))
+#if !(defined(__ANDROID_API__) && __ANDROID_API__ < 21)
   err = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
   if (err)
     goto error2;
@@ -511,7 +655,8 @@ int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) {
   timeout += uv__hrtime(UV_CLOCK_PRECISE);
   ts.tv_sec = timeout / NANOSEC;
   ts.tv_nsec = timeout % NANOSEC;
-#if defined(__ANDROID__) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC)
+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+
   /*
    * The bionic pthread implementation doesn't support CLOCK_MONOTONIC,
    * but has this alternative function instead.
@@ -519,7 +664,7 @@ int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) {
   r = pthread_cond_timedwait_monotonic_np(cond, mutex, &ts);
 #else
   r = pthread_cond_timedwait(cond, mutex, &ts);
-#endif /* __ANDROID__ */
+#endif /* __ANDROID_API__ */
 #endif
 
 
diff --git a/src/unix/tty.c b/src/unix/tty.c
index b2d37f4..357f974 100644
--- a/src/unix/tty.c
+++ b/src/unix/tty.c
@@ -48,6 +48,42 @@ static int uv__tty_is_slave(const int fd) {
   char dummy[256];
 
   result = ioctl(fd, TIOCPTYGNAME, &dummy) != 0;
+#elif defined(__NetBSD__)
+  /*
+   * NetBSD as an extension returns with ptsname(3) and ptsname_r(3) the slave
+   * device name for both descriptors, the master one and slave one.
+   *
+   * Implement function to compare major device number with pts devices.
+   *
+   * The major numbers are machine-dependent, on NetBSD/amd64 they are
+   * respectively:
+   *  - master tty: ptc - major 6
+   *  - slave tty:  pts - major 5
+   */
+
+  struct stat sb;
+  /* Lookup device's major for the pts driver and cache it. */
+  static devmajor_t pts = NODEVMAJOR;
+
+  if (pts == NODEVMAJOR) {
+    pts = getdevmajor("pts", S_IFCHR);
+    if (pts == NODEVMAJOR)
+      abort();
+  }
+
+  /* Lookup stat structure behind the file descriptor. */
+  if (fstat(fd, &sb) != 0)
+    abort();
+
+  /* Assert character device. */
+  if (!S_ISCHR(sb.st_mode))
+    abort();
+
+  /* Assert valid major. */
+  if (major(sb.st_rdev) == NODEVMAJOR)
+    abort();
+
+  result = (pts == major(sb.st_rdev));
 #else
   /* Fallback to ptsname
    */
diff --git a/src/unix/udp.c b/src/unix/udp.c
index c556325..a475bf5 100644
--- a/src/unix/udp.c
+++ b/src/unix/udp.c
@@ -237,8 +237,10 @@ static void uv__udp_sendmsg(uv_udp_t* handle) {
       size = sendmsg(handle->io_watcher.fd, &h, 0);
     } while (size == -1 && errno == EINTR);
 
-    if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
-      break;
+    if (size == -1) {
+      if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
+        break;
+    }
 
     req->status = (size == -1 ? -errno : size);
 
@@ -472,7 +474,7 @@ int uv__udp_try_send(uv_udp_t* handle,
   } while (size == -1 && errno == EINTR);
 
   if (size == -1) {
-    if (errno == EAGAIN || errno == EWOULDBLOCK)
+    if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
       return -EAGAIN;
     else
       return -errno;
diff --git a/src/uv-data-getter-setters.c b/src/uv-data-getter-setters.c
new file mode 100644
index 0000000..533e4a2
--- /dev/null
+++ b/src/uv-data-getter-setters.c
@@ -0,0 +1,96 @@
+#include "uv.h"
+
+const char* uv_handle_type_name(uv_handle_type type) {
+  switch (type) {
+#define XX(uc,lc) case UV_##uc: return #lc;
+    UV_HANDLE_TYPE_MAP(XX)
+#undef XX
+    case UV_FILE: return "file";
+    case UV_HANDLE_TYPE_MAX:
+    case UV_UNKNOWN_HANDLE: return NULL;
+  }
+  return NULL;
+}
+
+uv_handle_type uv_handle_get_type(const uv_handle_t* handle) {
+  return handle->type;
+}
+
+void* uv_handle_get_data(const uv_handle_t* handle) {
+  return handle->data;
+}
+
+uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle) {
+  return handle->loop;
+}
+
+void uv_handle_set_data(uv_handle_t* handle, void* data) {
+  handle->data = data;
+}
+
+const char* uv_req_type_name(uv_req_type type) {
+  switch (type) {
+#define XX(uc,lc) case UV_##uc: return #lc;
+    UV_REQ_TYPE_MAP(XX)
+#undef XX
+    case UV_REQ_TYPE_MAX:
+    case UV_UNKNOWN_REQ: return NULL;
+  }
+  return NULL;
+}
+
+uv_req_type uv_req_get_type(const uv_req_t* req) {
+  return req->type;
+}
+
+void* uv_req_get_data(const uv_req_t* req) {
+  return req->data;
+}
+
+void uv_req_set_data(uv_req_t* req, void* data) {
+  req->data = data;
+}
+
+size_t uv_stream_get_write_queue_size(const uv_stream_t* stream) {
+  return stream->write_queue_size;
+}
+
+size_t uv_udp_get_send_queue_size(const uv_udp_t* handle) {
+  return handle->send_queue_size;
+}
+
+size_t uv_udp_get_send_queue_count(const uv_udp_t* handle) {
+  return handle->send_queue_count;
+}
+
+uv_pid_t uv_process_get_pid(const uv_process_t* proc) {
+  return proc->pid;
+}
+
+uv_fs_type uv_fs_get_type(const uv_fs_t* req) {
+  return req->fs_type;
+}
+
+ssize_t uv_fs_get_result(const uv_fs_t* req) {
+  return req->result;
+}
+
+void* uv_fs_get_ptr(const uv_fs_t* req) {
+  return req->ptr;
+}
+
+const char* uv_fs_get_path(const uv_fs_t* req) {
+  return req->path;
+}
+
+uv_stat_t* uv_fs_get_statbuf(uv_fs_t* req) {
+  return &req->statbuf;
+}
+
+void* uv_loop_get_data(const uv_loop_t* loop) {
+  return loop->data;
+}
+
+void uv_loop_set_data(uv_loop_t* loop, void* data) {
+  loop->data = data;
+}
diff --git a/src/win/dl.c b/src/win/dl.c
index 39e400a..97ac1c1 100644
--- a/src/win/dl.c
+++ b/src/win/dl.c
@@ -22,7 +22,7 @@
 #include "uv.h"
 #include "internal.h"
 
-static int uv__dlerror(uv_lib_t* lib, int errorno);
+static int uv__dlerror(uv_lib_t* lib, const char* filename, DWORD errorno);
 
 
 int uv_dlopen(const char* filename, uv_lib_t* lib) {
@@ -37,12 +37,12 @@ int uv_dlopen(const char* filename, uv_lib_t* lib) {
                            -1,
                            filename_w,
                            ARRAY_SIZE(filename_w))) {
-    return uv__dlerror(lib, GetLastError());
+    return uv__dlerror(lib, filename, GetLastError());
   }
 
   lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
   if (lib->handle == NULL) {
-    return uv__dlerror(lib, GetLastError());
+    return uv__dlerror(lib, filename, GetLastError());
   }
 
   return 0;
@@ -65,7 +65,7 @@ void uv_dlclose(uv_lib_t* lib) {
 
 int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) {
   *ptr = (void*) GetProcAddress(lib->handle, name);
-  return uv__dlerror(lib, *ptr ? 0 : GetLastError());
+  return uv__dlerror(lib, "", *ptr ? 0 : GetLastError());
 }
 
 
@@ -88,31 +88,46 @@ static void uv__format_fallback_error(uv_lib_t* lib, int errorno){
 
 
 
-static int uv__dlerror(uv_lib_t* lib, int errorno) {
+static int uv__dlerror(uv_lib_t* lib, const char* filename, DWORD errorno) {
+  DWORD_PTR arg;
   DWORD res;
+  char* msg;
 
   if (lib->errmsg) {
-    LocalFree((void*)lib->errmsg);
+    LocalFree(lib->errmsg);
     lib->errmsg = NULL;
   }
 
-  if (errorno) {
+  if (errorno == 0)
+    return 0;
+
+  res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                       FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
+                       MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
+                       (LPSTR) &lib->errmsg, 0, NULL);
+
+  if (!res && GetLastError() == ERROR_MUI_FILE_NOT_FOUND) {
     res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                          FORMAT_MESSAGE_FROM_SYSTEM |
                          FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
-                         MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
-                         (LPSTR) &lib->errmsg, 0, NULL);
-    if (!res && GetLastError() == ERROR_MUI_FILE_NOT_FOUND) {
-      res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-                           FORMAT_MESSAGE_FROM_SYSTEM |
-                           FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
-                           0, (LPSTR) &lib->errmsg, 0, NULL);
-    }
-
-    if (!res) {
-      uv__format_fallback_error(lib, errorno);
-    }
+                         0, (LPSTR) &lib->errmsg, 0, NULL);
+  }
+
+  if (res && errorno == ERROR_BAD_EXE_FORMAT && strstr(lib->errmsg, "%1")) {
+    msg = lib->errmsg;
+    lib->errmsg = NULL;
+    arg = (DWORD_PTR) filename;
+    res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                         FORMAT_MESSAGE_ARGUMENT_ARRAY |
+                         FORMAT_MESSAGE_FROM_STRING,
+                         msg,
+                         0, 0, (LPSTR) &lib->errmsg, 0, (va_list*) &arg);
+    LocalFree(msg);
   }
 
-  return errorno ? -1 : 0;
+  if (!res)
+    uv__format_fallback_error(lib, errorno);
+
+  return -1;
 }
diff --git a/src/win/error.c b/src/win/error.c
index 642d111..9b03bfe 100644
--- a/src/win/error.c
+++ b/src/win/error.c
@@ -58,7 +58,7 @@ void uv_fatal_error(const int errorno, const char* syscall) {
     LocalFree(buf);
   }
 
-  *((char*)NULL) = 0xff; /* Force debug break */
+  DebugBreak();
   abort();
 }
 
diff --git a/src/win/fs.c b/src/win/fs.c
index 2d72cdc..097b00e 100644
--- a/src/win/fs.c
+++ b/src/win/fs.c
@@ -43,11 +43,26 @@
 #define UV_FS_CLEANEDUP          0x0010
 
 
-#define QUEUE_FS_TP_JOB(loop, req)                                          \
-  do {                                                                      \
-    uv__req_register(loop, req);                                            \
-    uv__work_submit((loop), &(req)->work_req, uv__fs_work, uv__fs_done);    \
-  } while (0)
+#define INIT(subtype)                                                         \
+  do {                                                                        \
+    if (req == NULL)                                                          \
+      return UV_EINVAL;                                                       \
+    uv_fs_req_init(loop, req, subtype, cb);                                   \
+  }                                                                           \
+  while (0)
+
+#define POST                                                                  \
+  do {                                                                        \
+    if (cb != NULL) {                                                         \
+      uv__req_register(loop, req);                                            \
+      uv__work_submit(loop, &req->work_req, uv__fs_work, uv__fs_done);        \
+      return 0;                                                               \
+    } else {                                                                  \
+      uv__fs_work(&req->work_req);                                            \
+      return req->result;                                                     \
+    }                                                                         \
+  }                                                                           \
+  while (0)
 
 #define SET_REQ_RESULT(req, result_value)                                   \
   do {                                                                      \
@@ -113,6 +128,7 @@ const WCHAR LONG_PATH_PREFIX_LEN = 4;
 const WCHAR UNC_PATH_PREFIX[] = L"\\\\?\\UNC\\";
 const WCHAR UNC_PATH_PREFIX_LEN = 8;
 
+static int uv__file_symlink_usermode_flag = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE;
 
 void uv_fs_init(void) {
   _fmode = _O_BINARY;
@@ -220,6 +236,7 @@ INLINE static int fs__capture_path(uv_fs_t* req, const char* path,
 
 INLINE static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req,
     uv_fs_type fs_type, const uv_fs_cb cb) {
+  uv__once_init();
   UV_REQ_INIT(req, UV_FS);
   req->loop = loop;
   req->flags = 0;
@@ -398,21 +415,21 @@ void fs__open(uv_fs_t* req) {
   umask(current_umask);
 
   /* convert flags and mode to CreateFile parameters */
-  switch (flags & (_O_RDONLY | _O_WRONLY | _O_RDWR)) {
-  case _O_RDONLY:
+  switch (flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR)) {
+  case UV_FS_O_RDONLY:
     access = FILE_GENERIC_READ;
     break;
-  case _O_WRONLY:
+  case UV_FS_O_WRONLY:
     access = FILE_GENERIC_WRITE;
     break;
-  case _O_RDWR:
+  case UV_FS_O_RDWR:
     access = FILE_GENERIC_READ | FILE_GENERIC_WRITE;
     break;
   default:
     goto einval;
   }
 
-  if (flags & _O_APPEND) {
+  if (flags & UV_FS_O_APPEND) {
     access &= ~FILE_WRITE_DATA;
     access |= FILE_APPEND_DATA;
   }
@@ -422,26 +439,33 @@ void fs__open(uv_fs_t* req) {
    * does. We indiscriminately use all the sharing modes, to match
    * UNIX semantics. In particular, this ensures that the file can
    * be deleted even whilst it's open, fixing issue #1449.
+   * We still support exclusive sharing mode, since it is necessary
+   * for opening raw block devices, otherwise Windows will prevent
+   * any attempt to write past the master boot record.
    */
-  share = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
+  if (flags & UV_FS_O_EXLOCK) {
+    share = 0;
+  } else {
+    share = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
+  }
 
-  switch (flags & (_O_CREAT | _O_EXCL | _O_TRUNC)) {
+  switch (flags & (UV_FS_O_CREAT | UV_FS_O_EXCL | UV_FS_O_TRUNC)) {
   case 0:
-  case _O_EXCL:
+  case UV_FS_O_EXCL:
     disposition = OPEN_EXISTING;
     break;
-  case _O_CREAT:
+  case UV_FS_O_CREAT:
     disposition = OPEN_ALWAYS;
     break;
-  case _O_CREAT | _O_EXCL:
-  case _O_CREAT | _O_TRUNC | _O_EXCL:
+  case UV_FS_O_CREAT | UV_FS_O_EXCL:
+  case UV_FS_O_CREAT | UV_FS_O_TRUNC | UV_FS_O_EXCL:
     disposition = CREATE_NEW;
     break;
-  case _O_TRUNC:
-  case _O_TRUNC | _O_EXCL:
+  case UV_FS_O_TRUNC:
+  case UV_FS_O_TRUNC | UV_FS_O_EXCL:
     disposition = TRUNCATE_EXISTING;
     break;
-  case _O_CREAT | _O_TRUNC:
+  case UV_FS_O_CREAT | UV_FS_O_TRUNC:
     disposition = CREATE_ALWAYS;
     break;
   default:
@@ -449,34 +473,49 @@ void fs__open(uv_fs_t* req) {
   }
 
   attributes |= FILE_ATTRIBUTE_NORMAL;
-  if (flags & _O_CREAT) {
+  if (flags & UV_FS_O_CREAT) {
     if (!((req->fs.info.mode & ~current_umask) & _S_IWRITE)) {
       attributes |= FILE_ATTRIBUTE_READONLY;
     }
   }
 
-  if (flags & _O_TEMPORARY ) {
+  if (flags & UV_FS_O_TEMPORARY ) {
     attributes |= FILE_FLAG_DELETE_ON_CLOSE | FILE_ATTRIBUTE_TEMPORARY;
     access |= DELETE;
   }
 
-  if (flags & _O_SHORT_LIVED) {
+  if (flags & UV_FS_O_SHORT_LIVED) {
     attributes |= FILE_ATTRIBUTE_TEMPORARY;
   }
 
-  switch (flags & (_O_SEQUENTIAL | _O_RANDOM)) {
+  switch (flags & (UV_FS_O_SEQUENTIAL | UV_FS_O_RANDOM)) {
   case 0:
     break;
-  case _O_SEQUENTIAL:
+  case UV_FS_O_SEQUENTIAL:
     attributes |= FILE_FLAG_SEQUENTIAL_SCAN;
     break;
-  case _O_RANDOM:
+  case UV_FS_O_RANDOM:
     attributes |= FILE_FLAG_RANDOM_ACCESS;
     break;
   default:
     goto einval;
   }
 
+  if (flags & UV_FS_O_DIRECT) {
+    attributes |= FILE_FLAG_NO_BUFFERING;
+  }
+
+  switch (flags & (UV_FS_O_DSYNC | UV_FS_O_SYNC)) {
+  case 0:
+    break;
+  case UV_FS_O_DSYNC:
+  case UV_FS_O_SYNC:
+    attributes |= FILE_FLAG_WRITE_THROUGH;
+    break;
+  default:
+    goto einval;
+  }
+
   /* Setting this flag makes it possible to open a directory. */
   attributes |= FILE_FLAG_BACKUP_SEMANTICS;
 
@@ -489,9 +528,9 @@ void fs__open(uv_fs_t* req) {
                      NULL);
   if (file == INVALID_HANDLE_VALUE) {
     DWORD error = GetLastError();
-    if (error == ERROR_FILE_EXISTS && (flags & _O_CREAT) &&
-        !(flags & _O_EXCL)) {
-      /* Special case: when ERROR_FILE_EXISTS happens and O_CREAT was */
+    if (error == ERROR_FILE_EXISTS && (flags & UV_FS_O_CREAT) &&
+        !(flags & UV_FS_O_EXCL)) {
+      /* Special case: when ERROR_FILE_EXISTS happens and UV_FS_O_CREAT was */
       /* specified, it means the path referred to a directory. */
       SET_REQ_UV_ERROR(req, UV_EISDIR, error);
     } else {
@@ -556,9 +595,14 @@ void fs__read(uv_fs_t* req) {
   DWORD error;
   int result;
   unsigned int index;
+  LARGE_INTEGER original_position;
+  LARGE_INTEGER zero_offset;
+  int restore_position;
 
   VERIFY_FD(fd, req);
 
+  zero_offset.QuadPart = 0;
+  restore_position = 0;
   handle = uv__get_osfhandle(fd);
 
   if (handle == INVALID_HANDLE_VALUE) {
@@ -569,6 +613,10 @@ void fs__read(uv_fs_t* req) {
   if (offset != -1) {
     memset(&overlapped, 0, sizeof overlapped);
     overlapped_ptr = &overlapped;
+    if (SetFilePointerEx(handle, zero_offset, &original_position,
+                         FILE_CURRENT)) {
+      restore_position = 1;
+    }
   } else {
     overlapped_ptr = NULL;
   }
@@ -593,6 +641,9 @@ void fs__read(uv_fs_t* req) {
     ++index;
   } while (result && index < req->fs.info.nbufs);
 
+  if (restore_position)
+    SetFilePointerEx(handle, original_position, NULL, FILE_BEGIN);
+
   if (result || bytes > 0) {
     SET_REQ_RESULT(req, bytes);
   } else {
@@ -615,9 +666,14 @@ void fs__write(uv_fs_t* req) {
   DWORD bytes;
   int result;
   unsigned int index;
+  LARGE_INTEGER original_position;
+  LARGE_INTEGER zero_offset;
+  int restore_position;
 
   VERIFY_FD(fd, req);
 
+  zero_offset.QuadPart = 0;
+  restore_position = 0;
   handle = uv__get_osfhandle(fd);
   if (handle == INVALID_HANDLE_VALUE) {
     SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE);
@@ -627,6 +683,10 @@ void fs__write(uv_fs_t* req) {
   if (offset != -1) {
     memset(&overlapped, 0, sizeof overlapped);
     overlapped_ptr = &overlapped;
+    if (SetFilePointerEx(handle, zero_offset, &original_position,
+                         FILE_CURRENT)) {
+      restore_position = 1;
+    }
   } else {
     overlapped_ptr = NULL;
   }
@@ -651,6 +711,9 @@ void fs__write(uv_fs_t* req) {
     ++index;
   } while (result && index < req->fs.info.nbufs);
 
+  if (restore_position)
+    SetFilePointerEx(handle, original_position, NULL, FILE_BEGIN);
+
   if (result || bytes > 0) {
     SET_REQ_RESULT(req, bytes);
   } else {
@@ -1029,7 +1092,8 @@ cleanup:
 }
 
 
-INLINE static int fs__stat_handle(HANDLE handle, uv_stat_t* statbuf) {
+INLINE static int fs__stat_handle(HANDLE handle, uv_stat_t* statbuf,
+    int do_lstat) {
   FILE_ALL_INFORMATION file_info;
   FILE_FS_VOLUME_INFORMATION volume_info;
   NTSTATUS nt_status;
@@ -1084,19 +1148,25 @@ INLINE static int fs__stat_handle(HANDLE handle, uv_stat_t* statbuf) {
    */
   statbuf->st_mode = 0;
 
-  if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
+  /*
+  * On Windows, FILE_ATTRIBUTE_REPARSE_POINT is a general purpose mechanism
+  * by which filesystem drivers can intercept and alter file system requests.
+  *
+  * The only reparse points we care about are symlinks and mount points, both
+  * of which are treated as POSIX symlinks. Further, we only care when
+  * invoked via lstat, which seeks information about the link instead of its
+  * target. Otherwise, reparse points must be treated as regular files.
+  */
+  if (do_lstat &&
+      (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
     /*
-     * It is possible for a file to have FILE_ATTRIBUTE_REPARSE_POINT but not have
-     * any link data. In that case DeviceIoControl() in fs__readlink_handle() sets
-     * the last error to ERROR_NOT_A_REPARSE_POINT. Then the stat result mode
-     * calculated below will indicate a normal directory or file, as if
-     * FILE_ATTRIBUTE_REPARSE_POINT was not present.
+     * If reading the link fails, the reparse point is not a symlink and needs
+     * to be treated as a regular file. The higher level lstat function will
+     * detect this failure and retry without do_lstat if appropriate.
      */
-    if (fs__readlink_handle(handle, NULL, &statbuf->st_size) == 0) {
-      statbuf->st_mode |= S_IFLNK;
-    } else if (GetLastError() != ERROR_NOT_A_REPARSE_POINT) {
+    if (fs__readlink_handle(handle, NULL, &statbuf->st_size) != 0)
       return -1;
-    }
+    statbuf->st_mode |= S_IFLNK;
   }
 
   if (statbuf->st_mode == 0) {
@@ -1139,8 +1209,12 @@ INLINE static int fs__stat_handle(HANDLE handle, uv_stat_t* statbuf) {
    *
    * Therefore we'll just report a sensible value that's quite commonly okay
    * on modern hardware.
+   *
+   * 4096 is the minimum required to be compatible with newer Advanced Format
+   * drives (which have 4096 bytes per physical sector), and to be backwards
+   * compatible with older drives (which have 512 bytes per physical sector).
    */
-  statbuf->st_blksize = 2048;
+  statbuf->st_blksize = 4096;
 
   /* Todo: set st_flags to something meaningful. Also provide a wrapper for
    * chattr(2).
@@ -1191,9 +1265,11 @@ INLINE static void fs__stat_impl(uv_fs_t* req, int do_lstat) {
     return;
   }
 
-  if (fs__stat_handle(handle, &req->statbuf) != 0) {
+  if (fs__stat_handle(handle, &req->statbuf, do_lstat) != 0) {
     DWORD error = GetLastError();
-    if (do_lstat && error == ERROR_SYMLINK_NOT_SUPPORTED) {
+    if (do_lstat &&
+        (error == ERROR_SYMLINK_NOT_SUPPORTED ||
+         error == ERROR_NOT_A_REPARSE_POINT)) {
       /* We opened a reparse point but it was not a symlink. Try again. */
       fs__stat_impl(req, 0);
 
@@ -1237,7 +1313,7 @@ static void fs__fstat(uv_fs_t* req) {
     return;
   }
 
-  if (fs__stat_handle(handle, &req->statbuf) != 0) {
+  if (fs__stat_handle(handle, &req->statbuf, 0) != 0) {
     SET_REQ_WIN32_ERROR(req, GetLastError());
     return;
   }
@@ -1309,6 +1385,22 @@ static void fs__ftruncate(uv_fs_t* req) {
 }
 
 
+static void fs__copyfile(uv_fs_t* req) {
+  int flags;
+  int overwrite;
+
+  flags = req->fs.info.file_flags;
+  overwrite = flags & UV_FS_COPYFILE_EXCL;
+
+  if (CopyFileW(req->file.pathw, req->fs.info.new_pathw, overwrite) == 0) {
+    SET_REQ_WIN32_ERROR(req, GetLastError());
+    return;
+  }
+
+  SET_REQ_RESULT(req, 0);
+}
+
+
 static void fs__sendfile(uv_fs_t* req) {
   int fd_in = req->file.fd, fd_out = req->fs.info.fd_out;
   size_t length = req->fs.info.bufsml[0].len;
@@ -1675,25 +1767,46 @@ error:
 
 
 static void fs__symlink(uv_fs_t* req) {
-  WCHAR* pathw = req->file.pathw;
-  WCHAR* new_pathw = req->fs.info.new_pathw;
-  int flags = req->fs.info.file_flags;
-  int result;
+  WCHAR* pathw;
+  WCHAR* new_pathw;
+  int flags;
+  int err;
 
+  pathw = req->file.pathw;
+  new_pathw = req->fs.info.new_pathw;
 
-  if (flags & UV_FS_SYMLINK_JUNCTION) {
+  if (req->fs.info.file_flags & UV_FS_SYMLINK_JUNCTION) {
     fs__create_junction(req, pathw, new_pathw);
-  } else if (pCreateSymbolicLinkW) {
-    result = pCreateSymbolicLinkW(new_pathw,
-                                  pathw,
-                                  flags & UV_FS_SYMLINK_DIR ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0) ? 0 : -1;
-    if (result == -1) {
-      SET_REQ_WIN32_ERROR(req, GetLastError());
-    } else {
-      SET_REQ_RESULT(req, result);
-    }
-  } else {
+    return;
+  }
+  if (!pCreateSymbolicLinkW) {
     SET_REQ_UV_ERROR(req, UV_ENOSYS, ERROR_NOT_SUPPORTED);
+    return;
+  }
+
+  if (req->fs.info.file_flags & UV_FS_SYMLINK_DIR)
+    flags = SYMBOLIC_LINK_FLAG_DIRECTORY | uv__file_symlink_usermode_flag;
+  else
+    flags = uv__file_symlink_usermode_flag;
+
+  if (pCreateSymbolicLinkW(new_pathw, pathw, flags)) {
+    SET_REQ_RESULT(req, 0);
+    return;
+  }
+
+  /* Something went wrong. We will test if it is because of user-mode
+   * symlinks.
+   */
+  err = GetLastError();
+  if (err == ERROR_INVALID_PARAMETER &&
+      flags & SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE) {
+    /* This system does not support user-mode symlinks. We will clear the
+     * unsupported flag and retry.
+     */
+    uv__file_symlink_usermode_flag = 0;
+    fs__symlink(req);
+  } else {
+    SET_REQ_WIN32_ERROR(req, err);
   }
 }
 
@@ -1831,6 +1944,7 @@ static void uv__fs_work(struct uv__work* w) {
     XX(CLOSE, close)
     XX(READ, read)
     XX(WRITE, write)
+    XX(COPYFILE, copyfile)
     XX(SENDFILE, sendfile)
     XX(STAT, stat)
     XX(LSTAT, lstat)
@@ -1877,6 +1991,9 @@ static void uv__fs_done(struct uv__work* w, int status) {
 
 
 void uv_fs_req_cleanup(uv_fs_t* req) {
+  if (req == NULL)
+    return;
+
   if (req->flags & UV_FS_CLEANEDUP)
     return;
 
@@ -1907,8 +2024,7 @@ int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
     int mode, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_OPEN, cb);
-
+  INIT(UV_FS_OPEN);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
@@ -1916,28 +2032,14 @@ int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
 
   req->fs.info.file_flags = flags;
   req->fs.info.mode = mode;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__open(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_CLOSE, cb);
+  INIT(UV_FS_CLOSE);
   req->file.fd = fd;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__close(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -1948,11 +2050,11 @@ int uv_fs_read(uv_loop_t* loop,
                unsigned int nbufs,
                int64_t offset,
                uv_fs_cb cb) {
+  INIT(UV_FS_READ);
+
   if (bufs == NULL || nbufs == 0)
     return UV_EINVAL;
 
-  uv_fs_req_init(loop, req, UV_FS_READ, cb);
-
   req->file.fd = fd;
 
   req->fs.info.nbufs = nbufs;
@@ -1966,14 +2068,7 @@ int uv_fs_read(uv_loop_t* loop,
   memcpy(req->fs.info.bufs, bufs, nbufs * sizeof(*bufs));
 
   req->fs.info.offset = offset;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__read(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -1984,11 +2079,11 @@ int uv_fs_write(uv_loop_t* loop,
                 unsigned int nbufs,
                 int64_t offset,
                 uv_fs_cb cb) {
+  INIT(UV_FS_WRITE);
+
   if (bufs == NULL || nbufs == 0)
     return UV_EINVAL;
 
-  uv_fs_req_init(loop, req, UV_FS_WRITE, cb);
-
   req->file.fd = fd;
 
   req->fs.info.nbufs = nbufs;
@@ -2002,14 +2097,7 @@ int uv_fs_write(uv_loop_t* loop,
   memcpy(req->fs.info.bufs, bufs, nbufs * sizeof(*bufs));
 
   req->fs.info.offset = offset;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__write(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2017,20 +2105,13 @@ int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
     uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_UNLINK, cb);
-
+  INIT(UV_FS_UNLINK);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__unlink(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2038,22 +2119,14 @@ int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode,
     uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_MKDIR, cb);
-
+  INIT(UV_FS_MKDIR);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
   req->fs.info.mode = mode;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__mkdir(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2061,39 +2134,25 @@ int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl,
     uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_MKDTEMP, cb);
-
+  INIT(UV_FS_MKDTEMP);
   err = fs__capture_path(req, tpl, NULL, TRUE);
   if (err)
     return uv_translate_sys_error(err);
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__mkdtemp(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_RMDIR, cb);
-
+  INIT(UV_FS_RMDIR);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__rmdir(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2101,22 +2160,14 @@ int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
     uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_SCANDIR, cb);
-
+  INIT(UV_FS_SCANDIR);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
   req->fs.info.file_flags = flags;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__scandir(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2124,20 +2175,13 @@ int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path,
     const char* new_path, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_LINK, cb);
-
+  INIT(UV_FS_LINK);
   err = fs__capture_path(req, path, new_path, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__link(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2145,22 +2189,14 @@ int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
     const char* new_path, int flags, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_SYMLINK, cb);
-
+  INIT(UV_FS_SYMLINK);
   err = fs__capture_path(req, path, new_path, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
   req->fs.info.file_flags = flags;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__symlink(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2168,20 +2204,13 @@ int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
     uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_READLINK, cb);
-
+  INIT(UV_FS_READLINK);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__readlink(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2189,24 +2218,18 @@ int uv_fs_realpath(uv_loop_t* loop, uv_fs_t* req, const char* path,
     uv_fs_cb cb) {
   int err;
 
-  if (!req || !path) {
+  INIT(UV_FS_REALPATH);
+
+  if (!path) {
     return UV_EINVAL;
   }
 
-  uv_fs_req_init(loop, req, UV_FS_REALPATH, cb);
-
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__realpath(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2214,88 +2237,53 @@ int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid,
     uv_gid_t gid, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_CHOWN, cb);
-
+  INIT(UV_FS_CHOWN);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__chown(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_uid_t uid,
     uv_gid_t gid, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_FCHOWN, cb);
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__fchown(req);
-    return req->result;
-  }
+  INIT(UV_FS_FCHOWN);
+  POST;
 }
 
 
 int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_STAT, cb);
-
+  INIT(UV_FS_STAT);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__stat(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_LSTAT, cb);
-
+  INIT(UV_FS_LSTAT);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__lstat(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_FSTAT, cb);
+  INIT(UV_FS_FSTAT);
   req->file.fd = fd;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__fstat(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2303,85 +2291,70 @@ int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path,
     const char* new_path, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_RENAME, cb);
-
+  INIT(UV_FS_RENAME);
   err = fs__capture_path(req, path, new_path, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__rename(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_FSYNC, cb);
+  INIT(UV_FS_FSYNC);
   req->file.fd = fd;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__fsync(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_FDATASYNC, cb);
+  INIT(UV_FS_FDATASYNC);
   req->file.fd = fd;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__fdatasync(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file fd,
     int64_t offset, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_FTRUNCATE, cb);
-
+  INIT(UV_FS_FTRUNCATE);
   req->file.fd = fd;
   req->fs.info.offset = offset;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__ftruncate(req);
-    return req->result;
-  }
+  POST;
 }
 
 
+int uv_fs_copyfile(uv_loop_t* loop,
+                   uv_fs_t* req,
+                   const char* path,
+                   const char* new_path,
+                   int flags,
+                   uv_fs_cb cb) {
+  int err;
+
+  INIT(UV_FS_COPYFILE);
+
+  if (flags & ~UV_FS_COPYFILE_EXCL)
+    return UV_EINVAL;
+
+  err = fs__capture_path(req, path, new_path, cb != NULL);
+
+  if (err)
+    return uv_translate_sys_error(err);
+
+  req->fs.info.file_flags = flags;
+  POST;
+}
+
 
 int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file fd_out,
     uv_file fd_in, int64_t in_offset, size_t length, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_SENDFILE, cb);
-
+  INIT(UV_FS_SENDFILE);
   req->file.fd = fd_in;
   req->fs.info.fd_out = fd_out;
   req->fs.info.offset = in_offset;
   req->fs.info.bufsml[0].len = length;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__sendfile(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2392,21 +2365,13 @@ int uv_fs_access(uv_loop_t* loop,
                  uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_ACCESS, cb);
-
+  INIT(UV_FS_ACCESS);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err)
     return uv_translate_sys_error(err);
 
   req->fs.info.mode = flags;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  }
-
-  fs__access(req);
-  return req->result;
+  POST;
 }
 
 
@@ -2414,39 +2379,23 @@ int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode,
     uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_CHMOD, cb);
-
+  INIT(UV_FS_CHMOD);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
   }
 
   req->fs.info.mode = mode;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__chmod(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file fd, int mode,
     uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_FCHMOD, cb);
-
+  INIT(UV_FS_FCHMOD);
   req->file.fd = fd;
   req->fs.info.mode = mode;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__fchmod(req);
-    return req->result;
-  }
+  POST;
 }
 
 
@@ -2454,8 +2403,7 @@ int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime,
     double mtime, uv_fs_cb cb) {
   int err;
 
-  uv_fs_req_init(loop, req, UV_FS_UTIME, cb);
-
+  INIT(UV_FS_UTIME);
   err = fs__capture_path(req, path, NULL, cb != NULL);
   if (err) {
     return uv_translate_sys_error(err);
@@ -2463,30 +2411,15 @@ int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime,
 
   req->fs.time.atime = atime;
   req->fs.time.mtime = mtime;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__utime(req);
-    return req->result;
-  }
+  POST;
 }
 
 
 int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file fd, double atime,
     double mtime, uv_fs_cb cb) {
-  uv_fs_req_init(loop, req, UV_FS_FUTIME, cb);
-
+  INIT(UV_FS_FUTIME);
   req->file.fd = fd;
   req->fs.time.atime = atime;
   req->fs.time.mtime = mtime;
-
-  if (cb) {
-    QUEUE_FS_TP_JOB(loop, req);
-    return 0;
-  } else {
-    fs__futime(req);
-    return req->result;
-  }
+  POST;
 }
diff --git a/src/win/getaddrinfo.c b/src/win/getaddrinfo.c
index baab838..282d919 100644
--- a/src/win/getaddrinfo.c
+++ b/src/win/getaddrinfo.c
@@ -28,6 +28,8 @@
 /* EAI_* constants. */
 #include <winsock2.h>
 
+/* Needed for ConvertInterfaceIndexToLuid and ConvertInterfaceLuidToNameA */
+#include <iphlpapi.h>
 
 int uv__getaddrinfo_translate_error(int sys_err) {
   switch (sys_err) {
@@ -73,6 +75,9 @@ int uv__getaddrinfo_translate_error(int sys_err) {
 /* Do we need different versions of this for different architectures? */
 #define ALIGNED_SIZE(X)     ((((X) + 3) >> 2) << 2)
 
+#ifndef NDIS_IF_MAX_STRING_SIZE
+#define NDIS_IF_MAX_STRING_SIZE IF_MAX_STRING_SIZE
+#endif
 
 static void uv__getaddrinfo_work(struct uv__work* w) {
   uv_getaddrinfo_t* req;
@@ -380,3 +385,69 @@ error:
   }
   return uv_translate_sys_error(err);
 }
+
+int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) {
+  NET_LUID luid;
+  wchar_t wname[NDIS_IF_MAX_STRING_SIZE + 1]; /* Add one for the NUL. */
+  DWORD bufsize;
+  int r;
+
+  if (buffer == NULL || size == NULL || *size == 0)
+    return UV_EINVAL;
+
+  r = ConvertInterfaceIndexToLuid(ifindex, &luid);
+
+  if (r != 0)
+    return uv_translate_sys_error(r);
+
+  r = ConvertInterfaceLuidToNameW(&luid, wname, ARRAY_SIZE(wname));
+
+  if (r != 0)
+    return uv_translate_sys_error(r);
+
+  /* Check how much space we need */
+  bufsize = WideCharToMultiByte(CP_UTF8, 0, wname, -1, NULL, 0, NULL, NULL);
+
+  if (bufsize == 0) {
+    return uv_translate_sys_error(GetLastError());
+  } else if (bufsize > *size) {
+    *size = bufsize;
+    return UV_ENOBUFS;
+  }
+
+  /* Convert to UTF-8 */
+  bufsize = WideCharToMultiByte(CP_UTF8,
+                                0,
+                                wname,
+                                -1,
+                                buffer,
+                                *size,
+                                NULL,
+                                NULL);
+
+  if (bufsize == 0)
+    return uv_translate_sys_error(GetLastError());
+
+  *size = bufsize - 1;
+  return 0;
+}
+
+int uv_if_indextoiid(unsigned int ifindex, char* buffer, size_t* size) {
+  int r;
+
+  if (buffer == NULL || size == NULL || *size == 0)
+    return UV_EINVAL;
+
+  r = snprintf(buffer, *size, "%d", ifindex);
+
+  if (r < 0)
+    return uv_translate_sys_error(r);
+
+  if (r >= (int) *size) {
+    *size = r + 1;
+    return UV_ENOBUFS;
+  }
+
+  *size = r;
+  return 0;
+}
diff --git a/src/win/handle.c b/src/win/handle.c
index 72b49d9..3915070 100644
--- a/src/win/handle.c
+++ b/src/win/handle.c
@@ -152,3 +152,8 @@ void uv_close(uv_handle_t* handle, uv_close_cb cb) {
 int uv_is_closing(const uv_handle_t* handle) {
   return !!(handle->flags & (UV__HANDLE_CLOSING | UV_HANDLE_CLOSED));
 }
+
+
+uv_os_fd_t uv_get_osfhandle(int fd) {
+  return uv__get_osfhandle(fd);
+}
diff --git a/src/win/internal.h b/src/win/internal.h
index 444327d..217fcdb 100644
--- a/src/win/internal.h
+++ b/src/win/internal.h
@@ -326,7 +326,6 @@ void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle);
 void uv__util_init(void);
 
 uint64_t uv__hrtime(double scale);
-int uv_parent_pid(void);
 int uv_current_pid(void);
 __declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall);
 int uv__getpwuid_r(uv_passwd_t* pwd);
diff --git a/src/win/pipe.c b/src/win/pipe.c
index edf3002..1a7c4dc 100644
--- a/src/win/pipe.c
+++ b/src/win/pipe.c
@@ -31,6 +31,9 @@
 #include "stream-inl.h"
 #include "req-inl.h"
 
+#include <aclapi.h>
+#include <accctrl.h>
+
 typedef struct uv__ipc_queue_item_s uv__ipc_queue_item_t;
 
 struct uv__ipc_queue_item_s {
@@ -202,7 +205,7 @@ int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access,
     uv_unique_pipe_name(ptr, name, nameSize);
 
     pipeHandle = CreateNamedPipeA(name,
-      access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE,
+      access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE | WRITE_DAC,
       PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 65536, 65536, 0,
       NULL);
 
@@ -534,7 +537,7 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
    */
   handle->pipe.serv.accept_reqs[0].pipeHandle = CreateNamedPipeW(handle->name,
       PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
-      FILE_FLAG_FIRST_PIPE_INSTANCE,
+      FILE_FLAG_FIRST_PIPE_INSTANCE | WRITE_DAC,
       PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
       PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL);
 
@@ -803,7 +806,7 @@ static void uv_pipe_queue_accept(uv_loop_t* loop, uv_pipe_t* handle,
     assert(req->pipeHandle == INVALID_HANDLE_VALUE);
 
     req->pipeHandle = CreateNamedPipeW(handle->name,
-        PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
+        PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | WRITE_DAC,
         PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
         PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL);
 
@@ -968,27 +971,31 @@ static DWORD WINAPI uv_pipe_zero_readfile_thread_proc(void* parameter) {
     uv_mutex_unlock(m);
   }
 restart_readfile:
-  result = ReadFile(handle->handle,
-                    &uv_zero_,
-                    0,
-                    &bytes,
-                    NULL);
-  if (!result) {
-    err = GetLastError();
-    if (err == ERROR_OPERATION_ABORTED &&
-        handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) {
-      if (handle->flags & UV_HANDLE_READING) {
-        /* just a brief break to do something else */
-        handle->pipe.conn.readfile_thread = NULL;
-        /* resume after it is finished */
-        uv_mutex_lock(m);
-        handle->pipe.conn.readfile_thread = hThread;
-        uv_mutex_unlock(m);
-        goto restart_readfile;
-      } else {
-        result = 1; /* successfully stopped reading */
+  if (handle->flags & UV_HANDLE_READING) {
+    result = ReadFile(handle->handle,
+                      &uv_zero_,
+                      0,
+                      &bytes,
+                      NULL);
+    if (!result) {
+      err = GetLastError();
+      if (err == ERROR_OPERATION_ABORTED &&
+          handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) {
+        if (handle->flags & UV_HANDLE_READING) {
+          /* just a brief break to do something else */
+          handle->pipe.conn.readfile_thread = NULL;
+          /* resume after it is finished */
+          uv_mutex_lock(m);
+          handle->pipe.conn.readfile_thread = hThread;
+          uv_mutex_unlock(m);
+          goto restart_readfile;
+        } else {
+          result = 1; /* successfully stopped reading */
+        }
       }
     }
+  } else {
+    result = 1; /* successfully aborted read before it even started */
   }
   if (hThread) {
     assert(hThread == handle->pipe.conn.readfile_thread);
@@ -1515,7 +1522,10 @@ static void uv_pipe_read_error(uv_loop_t* loop, uv_pipe_t* handle, int error,
 
 static void uv_pipe_read_error_or_eof(uv_loop_t* loop, uv_pipe_t* handle,
     int error, uv_buf_t buf) {
-  if (error == ERROR_BROKEN_PIPE) {
+  if (error == ERROR_OPERATION_ABORTED) {
+    /* do nothing (equivalent to EINTR) */
+  }
+  else if (error == ERROR_BROKEN_PIPE) {
     uv_pipe_read_eof(loop, handle, buf);
   } else {
     uv_pipe_read_error(loop, handle, error, buf);
@@ -1906,6 +1916,7 @@ int uv_pipe_open(uv_pipe_t* pipe, uv_file file) {
   if (os_handle == INVALID_HANDLE_VALUE)
     return UV_EBADF;
 
+  uv__once_init();
   /* In order to avoid closing a stdio file descriptor 0-2, duplicate the
    * underlying OS handle and forget about the original fd.
    * We could also opt to use the original OS handle and just never close it,
@@ -1961,7 +1972,7 @@ int uv_pipe_open(uv_pipe_t* pipe, uv_file file) {
 
   if (pipe->ipc) {
     assert(!(pipe->flags & UV_HANDLE_NON_OVERLAPPED_PIPE));
-    pipe->pipe.conn.ipc_pid = uv_parent_pid();
+    pipe->pipe.conn.ipc_pid = uv_os_getppid();
     assert(pipe->pipe.conn.ipc_pid != -1);
   }
   return 0;
@@ -1979,6 +1990,7 @@ static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size)
   unsigned int name_len;
   int err;
 
+  uv__once_init();
   name_info = NULL;
 
   if (handle->handle == INVALID_HANDLE_VALUE) {
@@ -2123,3 +2135,80 @@ uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) {
   else
     return UV_TCP;
 }
+
+int uv_pipe_chmod(uv_pipe_t* handle, int mode) {
+  SID_IDENTIFIER_AUTHORITY sid_world = SECURITY_WORLD_SID_AUTHORITY;
+  PACL old_dacl, new_dacl;
+  PSECURITY_DESCRIPTOR sd;
+  EXPLICIT_ACCESS ea;
+  PSID everyone;
+  int error;
+
+  if (handle == NULL || handle->handle == INVALID_HANDLE_VALUE)
+    return UV_EBADF;
+
+  if (mode != UV_READABLE &&
+      mode != UV_WRITABLE &&
+      mode != (UV_WRITABLE | UV_READABLE))
+    return UV_EINVAL;
+
+  if (!AllocateAndInitializeSid(&sid_world,
+                                1,
+                                SECURITY_WORLD_RID,
+                                0, 0, 0, 0, 0, 0, 0,
+                                &everyone)) {
+    error = GetLastError();
+    goto done;
+  }
+
+  if (GetSecurityInfo(handle->handle,
+                      SE_KERNEL_OBJECT,
+                      DACL_SECURITY_INFORMATION,
+                      NULL,
+                      NULL,
+                      &old_dacl,
+                      NULL,
+                      &sd)) {
+    error = GetLastError();
+    goto clean_sid;
+  }
+ 
+  memset(&ea, 0, sizeof(EXPLICIT_ACCESS));
+  if (mode & UV_READABLE)
+    ea.grfAccessPermissions |= GENERIC_READ | FILE_WRITE_ATTRIBUTES;
+  if (mode & UV_WRITABLE)
+    ea.grfAccessPermissions |= GENERIC_WRITE | FILE_READ_ATTRIBUTES;
+  ea.grfAccessPermissions |= SYNCHRONIZE;
+  ea.grfAccessMode = SET_ACCESS;
+  ea.grfInheritance = NO_INHERITANCE;
+  ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
+  ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
+  ea.Trustee.ptstrName = (LPTSTR)everyone;
+
+  if (SetEntriesInAcl(1, &ea, old_dacl, &new_dacl)) {
+    error = GetLastError();
+    goto clean_sd;
+  }
+
+  if (SetSecurityInfo(handle->handle,
+                      SE_KERNEL_OBJECT,
+                      DACL_SECURITY_INFORMATION,
+                      NULL,
+                      NULL,
+                      new_dacl,
+                      NULL)) {
+    error = GetLastError();
+    goto clean_dacl;
+  }
+
+  error = 0;
+
+clean_dacl:
+  LocalFree((HLOCAL) new_dacl);
+clean_sd:
+  LocalFree((HLOCAL) sd);
+clean_sid:
+  FreeSid(everyone);
+done:
+  return uv_translate_sys_error(error);
+}
diff --git a/src/win/process.c b/src/win/process.c
index d141601..cc06d9e 100644
--- a/src/win/process.c
+++ b/src/win/process.c
@@ -405,8 +405,15 @@ static WCHAR* search_path(const WCHAR *file,
       /* Next slice starts just after where the previous one ended */
       dir_start = dir_end;
 
+      /* If path is quoted, find quote end */
+      if (*dir_start == L'"' || *dir_start == L'\'') {
+        dir_end = wcschr(dir_start + 1, *dir_start);
+        if (dir_end == NULL) {
+          dir_end = wcschr(dir_start, L'\0');
+        }
+      }
       /* Slice until the next ; or \0 is found */
-      dir_end = wcschr(dir_start, L';');
+      dir_end = wcschr(dir_end, L';');
       if (dir_end == NULL) {
         dir_end = wcschr(dir_start, L'\0');
       }
@@ -1051,15 +1058,18 @@ int uv_spawn(uv_loop_t* loop,
   startup.hStdOutput = uv__stdio_handle(process->child_stdio_buffer, 1);
   startup.hStdError = uv__stdio_handle(process->child_stdio_buffer, 2);
 
+  process_flags = CREATE_UNICODE_ENVIRONMENT;
+
   if (options->flags & UV_PROCESS_WINDOWS_HIDE) {
     /* Use SW_HIDE to avoid any potential process window. */
     startup.wShowWindow = SW_HIDE;
+
+    /* Hide console windows. */
+    process_flags |= CREATE_NO_WINDOW;
   } else {
     startup.wShowWindow = SW_SHOWDEFAULT;
   }
 
-  process_flags = CREATE_UNICODE_ENVIRONMENT;
-
   if (options->flags & UV_PROCESS_DETACHED) {
     /* Note that we're not setting the CREATE_BREAKAWAY_FROM_JOB flag. That
      * means that libuv might not let you create a fully daemonized process
@@ -1163,6 +1173,10 @@ int uv_spawn(uv_loop_t* loop,
 
 
 static int uv__kill(HANDLE process_handle, int signum) {
+  if (signum < 0 || signum >= NSIG) {
+    return UV_EINVAL;
+  }
+
   switch (signum) {
     case SIGTERM:
     case SIGKILL:
@@ -1227,8 +1241,15 @@ int uv_process_kill(uv_process_t* process, int signum) {
 
 int uv_kill(int pid, int signum) {
   int err;
-  HANDLE process_handle = OpenProcess(PROCESS_TERMINATE |
-    PROCESS_QUERY_INFORMATION, FALSE, pid);
+  HANDLE process_handle;
+
+  if (pid == 0) {
+    process_handle = GetCurrentProcess();
+  } else {
+    process_handle = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION,
+                                 FALSE,
+                                 pid);
+  }
 
   if (process_handle == NULL) {
     err = GetLastError();
diff --git a/src/win/signal.c b/src/win/signal.c
index 7b42dd9..a174da1 100644
--- a/src/win/signal.c
+++ b/src/win/signal.c
@@ -64,7 +64,7 @@ static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) {
 }
 
 
-RB_GENERATE_STATIC(uv_signal_tree_s, uv_signal_s, tree_entry, uv__signal_compare);
+RB_GENERATE_STATIC(uv_signal_tree_s, uv_signal_s, tree_entry, uv__signal_compare)
 
 
 /*
diff --git a/src/win/stream-inl.h b/src/win/stream-inl.h
index bf12148..dba0374 100644
--- a/src/win/stream-inl.h
+++ b/src/win/stream-inl.h
@@ -36,6 +36,7 @@ INLINE static void uv_stream_init(uv_loop_t* loop,
   uv__handle_init(loop, (uv_handle_t*) handle, type);
   handle->write_queue_size = 0;
   handle->activecnt = 0;
+  handle->stream.conn.shutdown_req = NULL;
 }
 
 
@@ -47,8 +48,6 @@ INLINE static void uv_connection_init(uv_stream_t* handle) {
   handle->read_req.event_handle = NULL;
   handle->read_req.wait_handle = INVALID_HANDLE_VALUE;
   handle->read_req.data = handle;
-
-  handle->stream.conn.shutdown_req = NULL;
 }
 
 
diff --git a/src/win/tcp.c b/src/win/tcp.c
index 972539f..fd6efba 100644
--- a/src/win/tcp.c
+++ b/src/win/tcp.c
@@ -747,10 +747,15 @@ static int uv_tcp_try_connect(uv_connect_t* req,
                               uv_connect_cb cb) {
   uv_loop_t* loop = handle->loop;
   const struct sockaddr* bind_addr;
+  struct sockaddr_storage converted;
   BOOL success;
   DWORD bytes;
   int err;
 
+  err = uv__convert_to_localhost_if_unspecified(addr, &converted);
+  if (err)
+    return err;
+
   if (handle->delayed_error) {
     return handle->delayed_error;
   }
@@ -782,12 +787,12 @@ static int uv_tcp_try_connect(uv_connect_t* req,
   memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped));
 
   success = handle->tcp.conn.func_connectex(handle->socket,
-                                           addr,
-                                           addrlen,
-                                           NULL,
-                                           0,
-                                           &bytes,
-                                           &req->u.io.overlapped);
+                                            (const struct sockaddr*) &converted,
+                                            addrlen,
+                                            NULL,
+                                            0,
+                                            &bytes,
+                                            &req->u.io.overlapped);
 
   if (UV_SUCCEEDED_WITHOUT_IOCP(success)) {
     /* Process the req without IOCP. */
@@ -1446,6 +1451,8 @@ int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) {
   WSAPROTOCOL_INFOW protocol_info;
   int opt_len;
   int err;
+  struct sockaddr_storage saddr;
+  int saddr_len;
 
   /* Detect the address family of the socket. */
   opt_len = (int) sizeof protocol_info;
@@ -1466,6 +1473,19 @@ int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) {
     return uv_translate_sys_error(err);
   }
 
+  /* Support already active socket. */
+  saddr_len = sizeof(saddr);
+  if (!uv_tcp_getsockname(handle, (struct sockaddr*) &saddr, &saddr_len)) {
+    /* Socket is already bound. */
+    handle->flags |= UV_HANDLE_BOUND;
+    saddr_len = sizeof(saddr);
+    if (!uv_tcp_getpeername(handle, (struct sockaddr*) &saddr, &saddr_len)) {
+      /* Socket is already connected. */
+      uv_connection_init((uv_stream_t*) handle);
+      handle->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE;
+    }
+  }
+
   return 0;
 }
 
diff --git a/src/win/thread.c b/src/win/thread.c
index 91684e9..9eaad77 100644
--- a/src/win/thread.c
+++ b/src/win/thread.c
@@ -182,6 +182,7 @@ int uv_thread_join(uv_thread_t *tid) {
   else {
     CloseHandle(*tid);
     *tid = 0;
+    MemoryBarrier();  /* For feature parity with pthread_join(). */
     return 0;
   }
 }
@@ -198,6 +199,11 @@ int uv_mutex_init(uv_mutex_t* mutex) {
 }
 
 
+int uv_mutex_init_recursive(uv_mutex_t* mutex) {
+  return uv_mutex_init(mutex);
+}
+
+
 void uv_mutex_destroy(uv_mutex_t* mutex) {
   DeleteCriticalSection(mutex);
 }
diff --git a/src/win/timer.c b/src/win/timer.c
index 27ca771..7e006fe 100644
--- a/src/win/timer.c
+++ b/src/win/timer.c
@@ -56,7 +56,7 @@ static int uv_timer_compare(uv_timer_t* a, uv_timer_t* b) {
 }
 
 
-RB_GENERATE_STATIC(uv_timer_tree_s, uv_timer_s, tree_entry, uv_timer_compare);
+RB_GENERATE_STATIC(uv_timer_tree_s, uv_timer_s, tree_entry, uv_timer_compare)
 
 
 int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) {
diff --git a/src/win/tty.c b/src/win/tty.c
index a6f5839..05a11e8 100644
--- a/src/win/tty.c
+++ b/src/win/tty.c
@@ -112,14 +112,30 @@ static int uv_tty_virtual_offset = -1;
 static int uv_tty_virtual_height = -1;
 static int uv_tty_virtual_width = -1;
 
+/* The console window size
+ * We keep this separate from uv_tty_virtual_*. We use those values to only
+ * handle signalling SIGWINCH
+ */
+
+static HANDLE uv__tty_console_handle = INVALID_HANDLE_VALUE;
+static int uv__tty_console_height = -1;
+static int uv__tty_console_width = -1;
+
+static DWORD WINAPI uv__tty_console_resize_message_loop_thread(void* param);
+static void CALLBACK uv__tty_console_resize_event(HWINEVENTHOOK hWinEventHook,
+                                                  DWORD event,
+                                                  HWND hwnd,
+                                                  LONG idObject,
+                                                  LONG idChild,
+                                                  DWORD dwEventThread,
+                                                  DWORD dwmsEventTime);
+
 /* We use a semaphore rather than a mutex or critical section because in some
    cases (uv__cancel_read_console) we need take the lock in the main thread and
    release it in another thread. Using a semaphore ensures that in such
    scenario the main thread will still block when trying to acquire the lock. */
 static uv_sem_t uv_tty_output_lock;
 
-static HANDLE uv_tty_output_handle = INVALID_HANDLE_VALUE;
-
 static WORD uv_tty_default_text_attributes =
     FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
 
@@ -141,6 +157,18 @@ static void uv__determine_vterm_state(HANDLE handle);
 void uv_console_init(void) {
   if (uv_sem_init(&uv_tty_output_lock, 1))
     abort();
+  uv__tty_console_handle = CreateFileW(L"CONOUT$",
+                                       GENERIC_READ | GENERIC_WRITE,
+                                       FILE_SHARE_WRITE,
+                                       0,
+                                       OPEN_EXISTING,
+                                       0,
+                                       0);
+  if (uv__tty_console_handle != NULL) {
+    QueueUserWorkItem(uv__tty_console_resize_message_loop_thread,
+                      NULL,
+                      WT_EXECUTELONGFUNCTION);
+  }
 }
 
 
@@ -148,6 +176,7 @@ int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd, int readable) {
   HANDLE handle;
   CONSOLE_SCREEN_BUFFER_INFO screen_buffer_info;
 
+  uv__once_init();
   handle = (HANDLE) uv__get_osfhandle(fd);
   if (handle == INVALID_HANDLE_VALUE)
     return UV_EBADF;
@@ -183,11 +212,6 @@ int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd, int readable) {
     if (uv__vterm_state == UV_UNCHECKED)
       uv__determine_vterm_state(handle);
 
-    /* Store the global tty output handle. This handle is used by TTY read */
-    /* streams to update the virtual window when a CONSOLE_BUFFER_SIZE_EVENT */
-    /* is received. */
-    uv_tty_output_handle = handle;
-
     /* Remember the original console text attributes. */
     uv_tty_capture_initial_style(&screen_buffer_info);
 
@@ -704,25 +728,7 @@ void uv_process_tty_read_raw_req(uv_loop_t* loop, uv_tty_t* handle,
       }
       records_left--;
 
-      /* If the window was resized, recompute the virtual window size. This */
-      /* will trigger a SIGWINCH signal if the window size changed in an */
-      /* way that matters to libuv. */
-      if (handle->tty.rd.last_input_record.EventType == WINDOW_BUFFER_SIZE_EVENT) {
-        CONSOLE_SCREEN_BUFFER_INFO info;
-
-        uv_sem_wait(&uv_tty_output_lock);
-
-        if (uv_tty_output_handle != INVALID_HANDLE_VALUE &&
-            GetConsoleScreenBufferInfo(uv_tty_output_handle, &info)) {
-          uv_tty_update_virtual_window(&info);
-        }
-
-        uv_sem_post(&uv_tty_output_lock);
-
-        continue;
-      }
-
-      /* Ignore other events that are not key or resize events. */
+      /* Ignore other events that are not key events. */
       if (handle->tty.rd.last_input_record.EventType != KEY_EVENT) {
         continue;
       }
@@ -1102,9 +1108,6 @@ static int uv__cancel_read_console(uv_tty_t* handle) {
 
 
 static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info) {
-  int old_virtual_width = uv_tty_virtual_width;
-  int old_virtual_height = uv_tty_virtual_height;
-
   uv_tty_virtual_width = info->dwSize.X;
   uv_tty_virtual_height = info->srWindow.Bottom - info->srWindow.Top + 1;
 
@@ -1124,14 +1127,6 @@ static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info) {
   if (uv_tty_virtual_offset < 0) {
     uv_tty_virtual_offset = 0;
   }
-
-  /* If the virtual window size changed, emit a SIGWINCH signal. Don't emit */
-  /* if this was the first time the virtual window size was computed. */
-  if (old_virtual_width != -1 && old_virtual_height != -1 &&
-      (uv_tty_virtual_width != old_virtual_width ||
-       uv_tty_virtual_height != old_virtual_height)) {
-    uv__signal_dispatch(SIGWINCH);
-  }
 }
 
 
@@ -2279,3 +2274,55 @@ static void uv__determine_vterm_state(HANDLE handle) {
 
   uv__vterm_state = UV_SUPPORTED;
 }
+
+static DWORD WINAPI uv__tty_console_resize_message_loop_thread(void* param) {
+  CONSOLE_SCREEN_BUFFER_INFO sb_info;
+  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)
+    return 0;
+
+  if (!pSetWinEventHook(EVENT_CONSOLE_LAYOUT,
+                        EVENT_CONSOLE_LAYOUT,
+                        NULL,
+                        uv__tty_console_resize_event,
+                        0,
+                        0,
+                        WINEVENT_OUTOFCONTEXT))
+    return 0;
+
+  while (GetMessage(&msg, NULL, 0, 0)) {
+    TranslateMessage(&msg);
+    DispatchMessage(&msg);
+  }
+  return 0;
+}
+
+static void CALLBACK uv__tty_console_resize_event(HWINEVENTHOOK hWinEventHook,
+                                                  DWORD event,
+                                                  HWND hwnd,
+                                                  LONG idObject,
+                                                  LONG idChild,
+                                                  DWORD dwEventThread,
+                                                  DWORD dwmsEventTime) {
+  CONSOLE_SCREEN_BUFFER_INFO sb_info;
+  int width, height;
+
+  if (!GetConsoleScreenBufferInfo(uv__tty_console_handle, &sb_info))
+    return;
+
+  width = sb_info.dwSize.X;
+  height = sb_info.srWindow.Bottom - sb_info.srWindow.Top + 1;
+
+  if (width != uv__tty_console_width || height != uv__tty_console_height) {
+    uv__tty_console_width = width;
+    uv__tty_console_height = height;
+    uv__signal_dispatch(SIGWINCH);
+  }
+}
diff --git a/src/win/udp.c b/src/win/udp.c
index 2fd15cf..cd1d0e0 100644
--- a/src/win/udp.c
+++ b/src/win/udp.c
@@ -897,13 +897,12 @@ int uv__udp_send(uv_udp_send_t* req,
   int err;
 
   if (!(handle->flags & UV_HANDLE_BOUND)) {
-    if (addrlen == sizeof(uv_addr_ip4_any_)) {
+    if (addrlen == sizeof(uv_addr_ip4_any_))
       bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_;
-    } else if (addrlen == sizeof(uv_addr_ip6_any_)) {
+    else if (addrlen == sizeof(uv_addr_ip6_any_))
       bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_;
-    } else {
-      abort();
-    }
+    else
+      return UV_EINVAL;
     err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0);
     if (err)
       return uv_translate_sys_error(err);
@@ -922,5 +921,45 @@ int uv__udp_try_send(uv_udp_t* handle,
                      unsigned int nbufs,
                      const struct sockaddr* addr,
                      unsigned int addrlen) {
-  return UV_ENOSYS;
+  DWORD bytes;
+  const struct sockaddr* bind_addr;
+  struct sockaddr_storage converted;
+  int err;
+
+  assert(nbufs > 0);
+
+  err = uv__convert_to_localhost_if_unspecified(addr, &converted);
+  if (err)
+    return err;
+
+  /* Already sending a message.*/
+  if (handle->send_queue_count != 0)
+    return UV_EAGAIN;
+
+  if (!(handle->flags & UV_HANDLE_BOUND)) {
+    if (addrlen == sizeof(uv_addr_ip4_any_))
+      bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_;
+    else if (addrlen == sizeof(uv_addr_ip6_any_))
+      bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_;
+    else
+      return UV_EINVAL;
+    err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0);
+    if (err)
+      return uv_translate_sys_error(err);
+  }
+
+  err = WSASendTo(handle->socket,
+                  (WSABUF*)bufs,
+                  nbufs,
+                  &bytes,
+                  0,
+                  (const struct sockaddr*) &converted,
+                  addrlen,
+                  NULL,
+                  NULL);
+
+  if (err)
+    return uv_translate_sys_error(WSAGetLastError());
+
+  return bytes;
 }
diff --git a/src/win/util.c b/src/win/util.c
index d2e7f77..3100bc2 100644
--- a/src/win/util.c
+++ b/src/win/util.c
@@ -331,7 +331,12 @@ uint64_t uv_get_total_memory(void) {
 }
 
 
-int uv_parent_pid(void) {
+uv_pid_t uv_os_getpid(void) {
+  return GetCurrentProcessId();
+}
+
+
+uv_pid_t uv_os_getppid(void) {
   int parent_pid = -1;
   HANDLE handle;
   PROCESSENTRY32 pe;
@@ -1388,7 +1393,7 @@ int uv__getpwuid_r(uv_passwd_t* pwd) {
   if (OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &token) == 0)
     return uv_translate_sys_error(GetLastError());
 
-  bufsize = sizeof(path);
+  bufsize = ARRAY_SIZE(path);
   if (!GetUserProfileDirectoryW(token, path, &bufsize)) {
     r = GetLastError();
     CloseHandle(token);
@@ -1403,7 +1408,7 @@ int uv__getpwuid_r(uv_passwd_t* pwd) {
   CloseHandle(token);
 
   /* Get the username using GetUserNameW() */
-  bufsize = sizeof(username);
+  bufsize = ARRAY_SIZE(username);
   if (!GetUserNameW(username, &bufsize)) {
     r = GetLastError();
 
diff --git a/src/win/winapi.c b/src/win/winapi.c
index aa5d719..4ccdf0a 100644
--- a/src/win/winapi.c
+++ b/src/win/winapi.c
@@ -52,11 +52,15 @@ sGetFinalPathNameByHandleW pGetFinalPathNameByHandleW;
 /* Powrprof.dll function pointer */
 sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification;
 
+/* User32.dll function pointer */
+sSetWinEventHook pSetWinEventHook;
+
 
 void uv_winapi_init(void) {
   HMODULE ntdll_module;
   HMODULE kernel32_module;
   HMODULE powrprof_module;
+  HMODULE user32_module;
 
   ntdll_module = GetModuleHandleA("ntdll.dll");
   if (ntdll_module == NULL) {
@@ -156,4 +160,10 @@ void uv_winapi_init(void) {
       GetProcAddress(powrprof_module, "PowerRegisterSuspendResumeNotification");
   }
 
+  user32_module = LoadLibraryA("user32.dll");
+  if (user32_module != NULL) {
+    pSetWinEventHook = (sSetWinEventHook)
+      GetProcAddress(user32_module, "SetWinEventHook");
+  }
+
 }
diff --git a/src/win/winapi.h b/src/win/winapi.h
index 9401676..cc54b79 100644
--- a/src/win/winapi.h
+++ b/src/win/winapi.h
@@ -4104,6 +4104,10 @@
 # define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          0x00002000
 #endif
 
+#ifndef SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
+# define SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE 0x00000002
+#endif
+
 /* from winternl.h */
 typedef struct _UNICODE_STRING {
   USHORT Length;
@@ -4721,6 +4725,25 @@ typedef DWORD (WINAPI *sPowerRegisterSuspendResumeNotification)
                HANDLE        Recipient,
                _PHPOWERNOTIFY RegistrationHandle);
 
+/* from Winuser.h */
+typedef VOID (CALLBACK* WINEVENTPROC)
+             (HWINEVENTHOOK hWinEventHook,
+              DWORD         event,
+              HWND          hwnd,
+              LONG          idObject,
+              LONG          idChild,
+              DWORD         idEventThread,
+              DWORD         dwmsEventTime);
+
+typedef HWINEVENTHOOK (WINAPI *sSetWinEventHook)
+                      (UINT         eventMin,
+                       UINT         eventMax,
+                       HMODULE      hmodWinEventProc,
+                       WINEVENTPROC lpfnWinEventProc,
+                       DWORD        idProcess,
+                       DWORD        idThread,
+                       UINT         dwflags);
+
 
 /* Ntdll function pointers */
 extern sRtlNtStatusToDosError pRtlNtStatusToDosError;
@@ -4749,4 +4772,7 @@ extern sGetFinalPathNameByHandleW pGetFinalPathNameByHandleW;
 /* Powrprof.dll function pointer */
 extern sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification;
 
+/* User32.dll function pointer */
+extern sSetWinEventHook pSetWinEventHook;
+
 #endif /* UV_WIN_WINAPI_H_ */
diff --git a/src/win/winsock.c b/src/win/winsock.c
index e86d76b..7cfa90f 100644
--- a/src/win/winsock.c
+++ b/src/win/winsock.c
@@ -559,3 +559,31 @@ int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in,
     return SOCKET_ERROR;
   }
 }
+
+int uv__convert_to_localhost_if_unspecified(const struct sockaddr* addr,
+                                            struct sockaddr_storage* storage) {
+  struct sockaddr_in* dest4;
+  struct sockaddr_in6* dest6;
+
+  if (addr == NULL)
+    return UV_EINVAL;
+
+  switch (addr->sa_family) {
+  case AF_INET:
+    dest4 = (struct sockaddr_in*) storage;
+    memcpy(dest4, addr, sizeof(*dest4));
+    if (dest4->sin_addr.s_addr == 0)
+      dest4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+    return 0;
+  case AF_INET6:
+    dest6 = (struct sockaddr_in6*) storage;
+    memcpy(dest6, addr, sizeof(*dest6));
+    if (memcmp(&dest6->sin6_addr,
+               &uv_addr_ip6_any_.sin6_addr,
+               sizeof(uv_addr_ip6_any_.sin6_addr)) == 0)
+      dest6->sin6_addr = (struct in6_addr) IN6ADDR_LOOPBACK_INIT;
+    return 0;
+  default:
+    return UV_EINVAL;
+  }
+}
diff --git a/src/win/winsock.h b/src/win/winsock.h
index 7c007ab..7ecb755 100644
--- a/src/win/winsock.h
+++ b/src/win/winsock.h
@@ -187,4 +187,7 @@ typedef struct _IP_ADAPTER_UNICAST_ADDRESS_LH {
 
 #endif
 
+int uv__convert_to_localhost_if_unspecified(const struct sockaddr* addr,
+                                            struct sockaddr_storage* storage);
+
 #endif /* UV_WIN_WINSOCK_H_ */

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3c08d2075fae7ef62838f18e1af5d398c6401572
commit 3c08d2075fae7ef62838f18e1af5d398c6401572
Author:     Stefan Brüns <stefan.bruens at rwth-aachen.de>
AuthorDate: Mon Jan 8 13:45:37 2018 +0100
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Jan 19 11:15:11 2018 -0500

    FindJava: ignore javah for JDK 10, it has been removed
    
    The standalone javah tool has been removed, header generation happens
    during execution of javac.  `javac -h` allows generation of headers
    only.  See http://openjdk.java.net/projects/jdk/10/ and
    http://openjdk.java.net/jeps/313 for details.
    
    Fixes: #17613

diff --git a/Modules/FindJava.cmake b/Modules/FindJava.cmake
index b913e17..e3f5af6 100644
--- a/Modules/FindJava.cmake
+++ b/Modules/FindJava.cmake
@@ -237,10 +237,18 @@ if(Java_FIND_COMPONENTS)
       endif()
     elseif(component STREQUAL "Development")
       list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAVAC_EXECUTABLE
-                                      Java_JAVAH_EXECUTABLE Java_JAVADOC_EXECUTABLE)
-      if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
-          AND Java_JAVAH_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
-        set(Java_Development_FOUND TRUE)
+                                      Java_JAVADOC_EXECUTABLE)
+      if(Java_VERSION VERSION_LESS "1.10")
+        list(APPEND _JAVA_REQUIRED_VARS Java_JAVAH_EXECUTABLE)
+        if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
+            AND Java_JAVAH_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
+          set(Java_Development_FOUND TRUE)
+        endif()
+      else()
+        if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
+            AND Java_JAVADOC_EXECUTABLE)
+          set(Java_Development_FOUND TRUE)
+        endif()
       endif()
     elseif(component STREQUAL "IdlJ")
       list(APPEND _JAVA_REQUIRED_VARS Java_IDLJ_EXECUTABLE)
@@ -268,11 +276,19 @@ if(Java_FIND_COMPONENTS)
   endif()
 else()
   # Check for Development
-  find_package_handle_standard_args(Java
-    REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
-                  Java_JAVAH_EXECUTABLE Java_JAVADOC_EXECUTABLE
-    VERSION_VAR Java_VERSION_STRING
-    )
+  if(Java_VERSION VERSION_LESS "1.10")
+    find_package_handle_standard_args(Java
+      REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
+                    Java_JAVAH_EXECUTABLE Java_JAVADOC_EXECUTABLE
+      VERSION_VAR Java_VERSION_STRING
+      )
+  else()
+    find_package_handle_standard_args(Java
+      REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
+                    Java_JAVADOC_EXECUTABLE
+      VERSION_VAR Java_VERSION_STRING
+      )
+  endif()
 endif()
 
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2557cad5ec5084f86d4bb56c82939a49fc9d3071
commit 2557cad5ec5084f86d4bb56c82939a49fc9d3071
Author:     Sergiu Deitsch <sergiu.deitsch at gmail.com>
AuthorDate: Sun Jan 14 11:42:48 2018 +0100
Commit:     Sergiu Deitsch <sergiu.deitsch at th-nuernberg.de>
CommitDate: Fri Jan 19 17:00:44 2018 +0100

    FindBoost: support OPTIONAL_COMPONENTS

diff --git a/Modules/FindBoost.cmake b/Modules/FindBoost.cmake
index ca2a9c5..4a55588 100644
--- a/Modules/FindBoost.cmake
+++ b/Modules/FindBoost.cmake
@@ -13,6 +13,9 @@
 #     [version] [EXACT]      # Minimum or EXACT version e.g. 1.36.0
 #     [REQUIRED]             # Fail with error if Boost is not found
 #     [COMPONENTS <libs>...] # Boost libraries by their canonical name
+#                            # e.g. "date_time" for "libboost_date_time"
+#     [OPTIONAL_COMPONENTS <libs>...]
+#                            # Optional Boost libraries by their canonical name)
 #     )                      # e.g. "date_time" for "libboost_date_time"
 #
 # This module finds headers and requested component libraries OR a CMake
@@ -1777,10 +1780,9 @@ if(Boost_FOUND)
   set(_boost_CHECKED_COMPONENT FALSE)
   set(_Boost_MISSING_COMPONENTS "")
   foreach(COMPONENT ${Boost_FIND_COMPONENTS})
-    string(TOUPPER ${COMPONENT} COMPONENT)
+    string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
     set(_boost_CHECKED_COMPONENT TRUE)
-    if(NOT Boost_${COMPONENT}_FOUND)
-      string(TOLOWER ${COMPONENT} COMPONENT)
+    if(NOT Boost_${UPPERCOMPONENT}_FOUND AND Boost_FIND_REQUIRED_${COMPONENT})
       list(APPEND _Boost_MISSING_COMPONENTS ${COMPONENT})
     endif()
   endforeach()
diff --git a/Tests/FindBoost/CMakeLists.txt b/Tests/FindBoost/CMakeLists.txt
index 0e9527d..17a8ec7 100644
--- a/Tests/FindBoost/CMakeLists.txt
+++ b/Tests/FindBoost/CMakeLists.txt
@@ -9,6 +9,20 @@ add_test(NAME FindBoost.Test COMMAND
   --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
   )
 
+add_test(NAME FindBoost.TestFail COMMAND
+  ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+  --build-and-test
+  "${CMake_SOURCE_DIR}/Tests/FindBoost/TestFail"
+  "${CMake_BINARY_DIR}/Tests/FindBoost/TestFail"
+  ${build_generator_args}
+  --build-project TestFailFindBoost
+  --build-options ${build_options}
+  --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+  )
+
+set_tests_properties(FindBoost.TestFail PROPERTIES
+  PASS_REGULAR_EXPRESSION "Could not find the following Boost libraries:[ \t\n]+boost_foobar")
+
 add_test(NAME FindBoost.TestHeaders COMMAND
   ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
   --build-and-test
diff --git a/Tests/FindBoost/Test/CMakeLists.txt b/Tests/FindBoost/Test/CMakeLists.txt
index ce50fc7..663f414 100644
--- a/Tests/FindBoost/Test/CMakeLists.txt
+++ b/Tests/FindBoost/Test/CMakeLists.txt
@@ -2,7 +2,16 @@ cmake_minimum_required(VERSION 3.1)
 project(TestFindBoost CXX)
 include(CTest)
 
-find_package(Boost REQUIRED COMPONENTS filesystem thread)
+find_package(Boost REQUIRED COMPONENTS filesystem thread
+                   OPTIONAL_COMPONENTS program_options foobar)
+
+if(Boost_FOOBAR_FOUND)
+  message(FATAL_ERROR "Optional inexistent Boost component \"foobar\" found which is unexpected")
+endif(Boost_FOOBAR_FOUND)
+
+if(NOT Boost_PROGRAM_OPTIONS_FOUND)
+  message(FATAL_ERROR "Optional Boost component \"program_options\" not found which is unexpected")
+endif(NOT Boost_PROGRAM_OPTIONS_FOUND)
 
 add_executable(test_boost_tgt main.cxx)
 target_link_libraries(test_boost_tgt
diff --git a/Tests/FindBoost/Test/CMakeLists.txt b/Tests/FindBoost/TestFail/CMakeLists.txt
similarity index 91%
copy from Tests/FindBoost/Test/CMakeLists.txt
copy to Tests/FindBoost/TestFail/CMakeLists.txt
index ce50fc7..7c14a59 100644
--- a/Tests/FindBoost/Test/CMakeLists.txt
+++ b/Tests/FindBoost/TestFail/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.1)
 project(TestFindBoost CXX)
 include(CTest)
 
-find_package(Boost REQUIRED COMPONENTS filesystem thread)
+find_package(Boost REQUIRED COMPONENTS foobar filesystem thread)
 
 add_executable(test_boost_tgt main.cxx)
 target_link_libraries(test_boost_tgt
diff --git a/Tests/FindBoost/TestFail/main.cxx b/Tests/FindBoost/TestFail/main.cxx
new file mode 100644
index 0000000..6e8b5da
--- /dev/null
+++ b/Tests/FindBoost/TestFail/main.cxx
@@ -0,0 +1,24 @@
+#include <boost/filesystem.hpp>
+#include <boost/thread.hpp>
+
+namespace {
+
+boost::mutex m1;
+boost::recursive_mutex m2;
+
+void threadmain()
+{
+  boost::lock_guard<boost::mutex> lock1(m1);
+  boost::lock_guard<boost::recursive_mutex> lock2(m2);
+
+  boost::filesystem::path p(boost::filesystem::current_path());
+}
+}
+
+int main()
+{
+  boost::thread foo(threadmain);
+  foo.join();
+
+  return 0;
+}

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a7d344be712cddd906f066809896c208ae99702c
commit a7d344be712cddd906f066809896c208ae99702c
Author:     Werner Palfinger <werner.palfinger at gmail.com>
AuthorDate: Fri Jan 19 06:13:03 2018 -0500
Commit:     Werner Palfinger <werner.palfinger at gmail.com>
CommitDate: Fri Jan 19 06:13:03 2018 -0500

    FindPythonInterp: support single-user installs on Windows
    
    CMake currently searches in HKEY_LOCAL_MACHINE.
    According to PEP 514, single-user installs are registered in HKEY_CURRENT_USER
    See also FindPythonLibs.cmake

diff --git a/Modules/FindPythonInterp.cmake b/Modules/FindPythonInterp.cmake
index 64b98a8..3ef8e9f 100644
--- a/Modules/FindPythonInterp.cmake
+++ b/Modules/FindPythonInterp.cmake
@@ -100,6 +100,9 @@ if(NOT PYTHON_EXECUTABLE)
             [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]
             [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}-32\\InstallPath]
             [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}-64\\InstallPath]
+            [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]
+            [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}-32\\InstallPath]
+            [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}-64\\InstallPath]
         )
     endforeach()
 endif()

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=33802b316855b69f2a542574caa4dd2fbe569b11
commit 33802b316855b69f2a542574caa4dd2fbe569b11
Author:     Justin Goshi <jgoshi at microsoft.com>
AuthorDate: Thu Jan 18 17:35:15 2018 -0800
Commit:     Justin Goshi <jgoshi at microsoft.com>
CommitDate: Thu Jan 18 20:54:02 2018 -0800

    server: fix crash if no min version specified
    
    If a CMakeLists.txt file doesn't contain cmake_minimum_required then the
    server was crashing. The root cause was the json object model does not
    support null and was crashing. Add the null check and use an empty
    string in this case.

diff --git a/Source/cmServerProtocol.cxx b/Source/cmServerProtocol.cxx
index 6b7143b..4c0a354 100644
--- a/Source/cmServerProtocol.cxx
+++ b/Source/cmServerProtocol.cxx
@@ -1034,8 +1034,8 @@ static Json::Value DumpProjectList(const cmake* cm, std::string const& config)
 
     // Project structure information:
     const cmMakefile* mf = lg->GetMakefile();
-    pObj[kMINIMUM_CMAKE_VERSION] =
-      mf->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION");
+    auto minVersion = mf->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION");
+    pObj[kMINIMUM_CMAKE_VERSION] = minVersion ? minVersion : "";
     pObj[kSOURCE_DIRECTORY_KEY] = mf->GetCurrentSourceDirectory();
     pObj[kBUILD_DIRECTORY_KEY] = mf->GetCurrentBinaryDirectory();
     pObj[kTARGETS_KEY] = DumpTargetsList(projectIt.second, config);

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ff91a5d54b5458eaebab6be814624925a02eccd7
commit ff91a5d54b5458eaebab6be814624925a02eccd7
Author:     Sebastian Holtermann <sebholt at xwmw.org>
AuthorDate: Thu Jan 18 10:31:49 2018 +0100
Commit:     Sebastian Holtermann <sebholt at xwmw.org>
CommitDate: Thu Jan 18 18:38:45 2018 +0100

    Autogen: Tests: Extend AUTOMOC include patterns test

diff --git a/Tests/QtAutogen/MocOnly/CMakeLists.txt b/Tests/QtAutogen/MocOnly/CMakeLists.txt
index 33feadf..a37a2ae 100644
--- a/Tests/QtAutogen/MocOnly/CMakeLists.txt
+++ b/Tests/QtAutogen/MocOnly/CMakeLists.txt
@@ -2,7 +2,14 @@ cmake_minimum_required(VERSION 3.10)
 project(MocOnly)
 include("../AutogenTest.cmake")
 
-# Test different Q_OBJECT position styles
-add_executable(mocOnly StyleA.cpp StyleB.cpp main.cpp)
+add_executable(mocOnly
+  main.cpp
+  # Test different Q_OBJECT position styles
+  StyleA.cpp
+  StyleB.cpp
+  # Test different moc_/.moc include positions
+  IncA.cpp
+  IncB.cpp
+)
 set_property(TARGET mocOnly PROPERTY AUTOMOC ON)
 target_link_libraries(mocOnly ${QT_LIBRARIES})
diff --git a/Tests/QtAutogen/MocOnly/IncA.cpp b/Tests/QtAutogen/MocOnly/IncA.cpp
new file mode 100644
index 0000000..94610cd
--- /dev/null
+++ b/Tests/QtAutogen/MocOnly/IncA.cpp
@@ -0,0 +1,19 @@
+#include "moc_IncA.cpp"
+/// AUTOMOC moc_ include on the first line of the file!
+#include "IncA.hpp"
+
+/// @brief Source local QObject
+///
+class IncAPrivate : public QObject
+{
+  Q_OBJECT
+public:
+  IncAPrivate(){};
+};
+
+IncA::IncA()
+{
+  IncAPrivate priv;
+}
+
+#include "IncA.moc"
diff --git a/Tests/QtAutogen/MocOnly/IncA.hpp b/Tests/QtAutogen/MocOnly/IncA.hpp
new file mode 100644
index 0000000..ecc889f
--- /dev/null
+++ b/Tests/QtAutogen/MocOnly/IncA.hpp
@@ -0,0 +1,15 @@
+#ifndef INCA_HPP
+#define INCA_HPP
+
+#include <QObject>
+
+/// @brief Test moc include pattern in the source file
+///
+class IncA : public QObject
+{
+  Q_OBJECT
+public:
+  IncA();
+};
+
+#endif
diff --git a/Tests/QtAutogen/MocOnly/IncB.cpp b/Tests/QtAutogen/MocOnly/IncB.cpp
new file mode 100644
index 0000000..bd441a9
--- /dev/null
+++ b/Tests/QtAutogen/MocOnly/IncB.cpp
@@ -0,0 +1,19 @@
+#include "IncB.hpp"
+
+/// @brief Source local QObject
+///
+class IncBPrivate : public QObject
+{
+  Q_OBJECT
+public:
+  IncBPrivate(){};
+};
+
+IncB::IncB()
+{
+  IncBPrivate priv;
+}
+
+/// AUTOMOC moc_ include on the last line of the file!
+#include "IncB.moc"
+#include "moc_IncB.cpp"
diff --git a/Tests/QtAutogen/MocOnly/IncB.hpp b/Tests/QtAutogen/MocOnly/IncB.hpp
new file mode 100644
index 0000000..8331ea2
--- /dev/null
+++ b/Tests/QtAutogen/MocOnly/IncB.hpp
@@ -0,0 +1,15 @@
+#ifndef INCB_HPP
+#define INCB_HPP
+
+#include <QObject>
+
+/// @brief Test moc include pattern in the source file
+///
+class IncB : public QObject
+{
+  Q_OBJECT
+public:
+  IncB();
+};
+
+#endif
diff --git a/Tests/QtAutogen/MocOnly/main.cpp b/Tests/QtAutogen/MocOnly/main.cpp
index 06f8d81..1611f97 100644
--- a/Tests/QtAutogen/MocOnly/main.cpp
+++ b/Tests/QtAutogen/MocOnly/main.cpp
@@ -1,3 +1,5 @@
+#include "IncA.hpp"
+#include "IncB.hpp"
 #include "StyleA.hpp"
 #include "StyleB.hpp"
 
@@ -5,5 +7,8 @@ int main(int argv, char** args)
 {
   StyleA styleA;
   StyleB styleB;
+  IncA incA;
+  IncB incB;
+
   return 0;
 }

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a1d491ca2721d234eb10553a9e336f51752aa2a0
commit a1d491ca2721d234eb10553a9e336f51752aa2a0
Author:     Sebastian Holtermann <sebholt at xwmw.org>
AuthorDate: Thu Jan 18 11:45:54 2018 +0100
Commit:     Sebastian Holtermann <sebholt at xwmw.org>
CommitDate: Thu Jan 18 18:37:49 2018 +0100

    Autogen: AUTOMOC/UIC fix for moc/uic include on the first line
    
    When moc/uic include was found on the first line of
    a file it was ignored. This fixes the issue by extending
    the regular expression for include detection.
    
    Closes #17655

diff --git a/Source/cmQtAutoGeneratorMocUic.cxx b/Source/cmQtAutoGeneratorMocUic.cxx
index 4b02e0b..037279a 100644
--- a/Source/cmQtAutoGeneratorMocUic.cxx
+++ b/Source/cmQtAutoGeneratorMocUic.cxx
@@ -221,7 +221,7 @@ bool cmQtAutoGeneratorMocUic::JobParseT::ParseMocSource(WorkerT& wrk,
       const char* contentChars = meta.Content.c_str();
       cmsys::RegularExpressionMatch match;
       while (wrk.Moc().RegExpInclude.find(contentChars, match)) {
-        std::string incString = match.match(1);
+        std::string incString = match.match(2);
         std::string incDir(SubDirPrefix(incString));
         std::string incBase =
           cmSystemTools::GetFilenameWithoutLastExtension(incString);
@@ -500,7 +500,7 @@ bool cmQtAutoGeneratorMocUic::JobParseT::ParseUic(WorkerT& wrk,
     const char* contentChars = meta.Content.c_str();
     cmsys::RegularExpressionMatch match;
     while (wrk.Uic().RegExpInclude.find(contentChars, match)) {
-      if (!ParseUicInclude(wrk, meta, match.match(1))) {
+      if (!ParseUicInclude(wrk, meta, match.match(2))) {
         success = false;
         break;
       }
@@ -1124,9 +1124,9 @@ cmQtAutoGeneratorMocUic::cmQtAutoGeneratorMocUic()
 {
   // Precompile regular expressions
   Moc_.RegExpInclude.compile(
-    "[\n][ \t]*#[ \t]*include[ \t]+"
+    "(^|\n)[ \t]*#[ \t]*include[ \t]+"
     "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]");
-  Uic_.RegExpInclude.compile("[\n][ \t]*#[ \t]*include[ \t]+"
+  Uic_.RegExpInclude.compile("(^|\n)[ \t]*#[ \t]*include[ \t]+"
                              "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]");
 
   // Initialize libuv asynchronous iteration request

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=7c525c84166d2d45933fb9907682d4f834392520
commit 7c525c84166d2d45933fb9907682d4f834392520
Author:     Ben Boeckel <ben.boeckel at kitware.com>
AuthorDate: Wed Jan 17 13:49:30 2018 -0500
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Thu Jan 18 11:11:19 2018 -0500

    genex: generated files have known extensions

diff --git a/Source/cmGeneratorExpressionEvaluationFile.cxx b/Source/cmGeneratorExpressionEvaluationFile.cxx
index 87b6b34..c988969 100644
--- a/Source/cmGeneratorExpressionEvaluationFile.cxx
+++ b/Source/cmGeneratorExpressionEvaluationFile.cxx
@@ -13,6 +13,7 @@
 #include "cmLocalGenerator.h"
 #include "cmMakefile.h"
 #include "cmSourceFile.h"
+#include "cmSourceFileLocationKind.h"
 #include "cmSystemTools.h"
 #include "cmake.h"
 
@@ -102,7 +103,8 @@ void cmGeneratorExpressionEvaluationFile::CreateOutputFile(
   for (std::string const& le : enabledLanguages) {
     std::string name = this->OutputFileExpr->Evaluate(
       lg, config, false, nullptr, nullptr, nullptr, le);
-    cmSourceFile* sf = lg->GetMakefile()->GetOrCreateSource(name);
+    cmSourceFile* sf = lg->GetMakefile()->GetOrCreateSource(
+      name, false, cmSourceFileLocationKind::Known);
     sf->SetProperty("GENERATED", "1");
 
     gg->SetFilenameTargetDepends(

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e8b57c2283f731f42b4c7eece0531dab67df3d41
commit e8b57c2283f731f42b4c7eece0531dab67df3d41
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Tue Jan 16 13:27:23 2018 -0500
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Tue Jan 16 13:27:23 2018 -0500

    libuv: Teach import script to add missing newlines

diff --git a/Utilities/Scripts/update-libuv.bash b/Utilities/Scripts/update-libuv.bash
index d7a7d1f..6d423a7 100755
--- a/Utilities/Scripts/update-libuv.bash
+++ b/Utilities/Scripts/update-libuv.bash
@@ -20,6 +20,8 @@ extract_source () {
     git_archive
     pushd "${extractdir}/${name}-reduced"
     echo "* -whitespace" > .gitattributes
+    echo >> src/unix/aix-common.c
+    echo >> src/unix/ibmi.c
     popd
 }
 

-----------------------------------------------------------------------

Summary of changes:
 Modules/FindBoost.cmake                           |    8 +-
 Modules/FindJava.cmake                            |   34 +-
 Modules/FindPythonInterp.cmake                    |    3 +
 Source/cmGeneratorExpressionEvaluationFile.cxx    |    4 +-
 Source/cmQtAutoGeneratorMocUic.cxx                |    8 +-
 Source/cmServerProtocol.cxx                       |    4 +-
 Tests/FindBoost/CMakeLists.txt                    |   14 +
 Tests/FindBoost/Test/CMakeLists.txt               |   11 +-
 Tests/FindBoost/{Test => TestFail}/CMakeLists.txt |    2 +-
 Tests/FindBoost/{Test => TestFail}/main.cxx       |    0
 Tests/QtAutogen/CommonTests.cmake                 |    4 +-
 Tests/QtAutogen/MocOnly/CMakeLists.txt            |   11 +-
 Tests/QtAutogen/MocOnly/IncA.cpp                  |   19 +
 Tests/QtAutogen/MocOnly/IncA.hpp                  |   15 +
 Tests/QtAutogen/MocOnly/IncB.cpp                  |   19 +
 Tests/QtAutogen/MocOnly/IncB.hpp                  |   15 +
 Tests/QtAutogen/MocOnly/main.cpp                  |    5 +
 Tests/QtAutogen/UicOnly/CMakeLists.txt            |    4 +-
 Tests/QtAutogen/UicOnly/UicOnly.cpp               |   18 +
 Tests/QtAutogen/UicOnly/UicOnly.hpp               |   15 +
 Tests/QtAutogen/UicOnly/main.cpp                  |    7 +
 Tests/QtAutogen/UicOnly/{uiconly.ui => uiA.ui}    |    4 +-
 Tests/QtAutogen/UicOnly/{uiconly.ui => uiB.ui}    |    4 +-
 Tests/QtAutogen/UicOnly/{uiconly.ui => uiC.ui}    |    4 +-
 Tests/QtAutogen/UicOnly/{uiconly.ui => uiD.ui}    |    4 +-
 Tests/QtAutogen/UicOnly/uiconly.cpp               |   18 -
 Tests/QtAutogen/UicOnly/uiconly.h                 |   20 -
 Utilities/Scripts/update-libuv.bash               |    2 +
 Utilities/cmlibuv/CMakeLists.txt                  |    3 +-
 Utilities/cmlibuv/LICENSE                         |    4 +-
 Utilities/cmlibuv/include/pthread-barrier.h       |    1 +
 Utilities/cmlibuv/include/uv-errno.h              |   12 +
 Utilities/cmlibuv/include/uv-os390.h              |    3 +
 Utilities/cmlibuv/include/uv-unix.h               |   96 ++++
 Utilities/cmlibuv/include/uv-version.h            |    2 +-
 Utilities/cmlibuv/include/uv-win.h                |   28 +-
 Utilities/cmlibuv/include/uv.h                    |   63 ++-
 Utilities/cmlibuv/src/threadpool.c                |   18 +-
 Utilities/cmlibuv/src/unix/aix-common.c           |  292 +++++++++++
 Utilities/cmlibuv/src/unix/aix.c                  |  242 +--------
 Utilities/cmlibuv/src/unix/android-ifaddrs.c      |   49 +-
 Utilities/cmlibuv/src/unix/atomic-ops.h           |    5 +-
 Utilities/cmlibuv/src/unix/bsd-ifaddrs.c          |   23 +-
 Utilities/cmlibuv/src/unix/core.c                 |   45 +-
 Utilities/cmlibuv/src/unix/freebsd.c              |   87 ++-
 Utilities/cmlibuv/src/unix/fs.c                   |  177 ++++++-
 Utilities/cmlibuv/src/unix/fsevents.c             |   28 +-
 Utilities/cmlibuv/src/unix/getaddrinfo.c          |   30 ++
 Utilities/cmlibuv/src/unix/ibmi.c                 |  112 ++++
 Utilities/cmlibuv/src/unix/internal.h             |   15 +-
 Utilities/cmlibuv/src/unix/kqueue.c               |   38 +-
 Utilities/cmlibuv/src/unix/linux-core.c           |   14 +-
 Utilities/cmlibuv/src/unix/loop.c                 |    2 +-
 Utilities/cmlibuv/src/unix/netbsd.c               |   57 +-
 Utilities/cmlibuv/src/unix/openbsd.c              |   33 +-
 Utilities/cmlibuv/src/unix/os390-syscalls.c       |  229 ++++++--
 Utilities/cmlibuv/src/unix/os390-syscalls.h       |    3 +
 Utilities/cmlibuv/src/unix/os390.c                |  175 ++++++-
 Utilities/cmlibuv/src/unix/pipe.c                 |   53 ++
 Utilities/cmlibuv/src/unix/poll.c                 |   25 +-
 Utilities/cmlibuv/src/unix/process.c              |   42 +-
 Utilities/cmlibuv/src/unix/proctitle.c            |   35 +-
 Utilities/cmlibuv/src/unix/pthread-barrier.c      |  121 -----
 Utilities/cmlibuv/src/unix/stream.c               |   39 +-
 Utilities/cmlibuv/src/unix/sunos.c                |    4 +-
 Utilities/cmlibuv/src/unix/tcp.c                  |  101 +++-
 Utilities/cmlibuv/src/unix/thread.c               |  197 ++++++-
 Utilities/cmlibuv/src/unix/tty.c                  |   36 ++
 Utilities/cmlibuv/src/unix/udp.c                  |    8 +-
 Utilities/cmlibuv/src/uv-data-getter-setters.c    |   96 ++++
 Utilities/cmlibuv/src/win/dl.c                    |   55 +-
 Utilities/cmlibuv/src/win/error.c                 |    2 +-
 Utilities/cmlibuv/src/win/fs.c                    |  581 +++++++++------------
 Utilities/cmlibuv/src/win/getaddrinfo.c           |   71 +++
 Utilities/cmlibuv/src/win/handle.c                |    5 +
 Utilities/cmlibuv/src/win/internal.h              |    1 -
 Utilities/cmlibuv/src/win/pipe.c                  |  137 ++++-
 Utilities/cmlibuv/src/win/process.c               |   31 +-
 Utilities/cmlibuv/src/win/signal.c                |    2 +-
 Utilities/cmlibuv/src/win/stream-inl.h            |    3 +-
 Utilities/cmlibuv/src/win/tcp.c                   |   32 +-
 Utilities/cmlibuv/src/win/thread.c                |    6 +
 Utilities/cmlibuv/src/win/timer.c                 |    2 +-
 Utilities/cmlibuv/src/win/tty.c                   |  121 +++--
 Utilities/cmlibuv/src/win/udp.c                   |   51 +-
 Utilities/cmlibuv/src/win/util.c                  |   11 +-
 Utilities/cmlibuv/src/win/winapi.c                |   10 +
 Utilities/cmlibuv/src/win/winapi.h                |   26 +
 Utilities/cmlibuv/src/win/winsock.c               |   28 +
 Utilities/cmlibuv/src/win/winsock.h               |    3 +
 90 files changed, 3003 insertions(+), 1094 deletions(-)
 copy Tests/FindBoost/{Test => TestFail}/CMakeLists.txt (91%)
 copy Tests/FindBoost/{Test => TestFail}/main.cxx (100%)
 create mode 100644 Tests/QtAutogen/MocOnly/IncA.cpp
 create mode 100644 Tests/QtAutogen/MocOnly/IncA.hpp
 create mode 100644 Tests/QtAutogen/MocOnly/IncB.cpp
 create mode 100644 Tests/QtAutogen/MocOnly/IncB.hpp
 create mode 100644 Tests/QtAutogen/UicOnly/UicOnly.cpp
 create mode 100644 Tests/QtAutogen/UicOnly/UicOnly.hpp
 create mode 100644 Tests/QtAutogen/UicOnly/main.cpp
 copy Tests/QtAutogen/UicOnly/{uiconly.ui => uiA.ui} (87%)
 copy Tests/QtAutogen/UicOnly/{uiconly.ui => uiB.ui} (87%)
 copy Tests/QtAutogen/UicOnly/{uiconly.ui => uiC.ui} (87%)
 rename Tests/QtAutogen/UicOnly/{uiconly.ui => uiD.ui} (87%)
 delete mode 100644 Tests/QtAutogen/UicOnly/uiconly.cpp
 delete mode 100644 Tests/QtAutogen/UicOnly/uiconly.h
 create mode 100644 Utilities/cmlibuv/src/unix/aix-common.c
 create mode 100644 Utilities/cmlibuv/src/unix/ibmi.c
 delete mode 100644 Utilities/cmlibuv/src/unix/pthread-barrier.c
 create mode 100644 Utilities/cmlibuv/src/uv-data-getter-setters.c


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list