noderb 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/noderb_extension/extconf.rb +15 -11
- data/ext/noderb_extension/libuv/AUTHORS +3 -0
- data/ext/noderb_extension/libuv/{README → README.md} +48 -6
- data/ext/noderb_extension/libuv/common.gypi +6 -1
- data/ext/noderb_extension/libuv/config-unix.mk +1 -1
- data/ext/noderb_extension/libuv/include/uv-private/uv-linux.h +29 -0
- data/ext/noderb_extension/libuv/include/uv-private/uv-unix.h +9 -0
- data/ext/noderb_extension/libuv/include/uv-private/uv-win.h +38 -3
- data/ext/noderb_extension/libuv/include/uv.h +55 -3
- data/ext/noderb_extension/libuv/src/unix/cares.c +1 -0
- data/ext/noderb_extension/libuv/src/unix/core.c +20 -4
- data/ext/noderb_extension/libuv/src/unix/cygwin.c +16 -0
- data/ext/noderb_extension/libuv/src/unix/darwin.c +18 -0
- data/ext/noderb_extension/libuv/src/unix/freebsd.c +18 -1
- data/ext/noderb_extension/libuv/src/unix/fs.c +18 -9
- data/ext/noderb_extension/libuv/src/unix/internal.h +24 -0
- data/ext/noderb_extension/libuv/src/unix/linux.c +133 -1
- data/ext/noderb_extension/libuv/src/unix/netbsd.c +18 -1
- data/ext/noderb_extension/libuv/src/unix/stream.c +21 -7
- data/ext/noderb_extension/libuv/src/unix/sunos.c +18 -1
- data/ext/noderb_extension/libuv/src/unix/tty.c +41 -0
- data/ext/noderb_extension/libuv/src/unix/udp.c +1 -0
- data/ext/noderb_extension/libuv/src/win/core.c +3 -0
- data/ext/noderb_extension/libuv/src/win/fs-event.c +384 -0
- data/ext/noderb_extension/libuv/src/win/getaddrinfo.c +7 -2
- data/ext/noderb_extension/libuv/src/win/handle.c +41 -0
- data/ext/noderb_extension/libuv/src/win/internal.h +36 -0
- data/ext/noderb_extension/libuv/src/win/pipe.c +3 -0
- data/ext/noderb_extension/libuv/src/win/process.c +7 -2
- data/ext/noderb_extension/libuv/src/win/req.c +10 -0
- data/ext/noderb_extension/libuv/src/win/stream.c +10 -3
- data/ext/noderb_extension/libuv/src/win/tcp.c +3 -1
- data/ext/noderb_extension/libuv/src/win/tty.c +1559 -5
- data/ext/noderb_extension/libuv/test/benchmark-getaddrinfo.c +2 -0
- data/ext/noderb_extension/libuv/test/runner-unix.c +2 -0
- data/ext/noderb_extension/libuv/test/test-fs-event.c +217 -0
- data/ext/noderb_extension/libuv/test/test-fs.c +0 -4
- data/ext/noderb_extension/libuv/test/test-getaddrinfo.c +7 -3
- data/ext/noderb_extension/libuv/test/test-list.h +23 -0
- data/ext/noderb_extension/libuv/test/test-tcp-close.c +47 -0
- data/ext/noderb_extension/libuv/test/test-tcp-write-error.c +168 -0
- data/ext/noderb_extension/libuv/test/test-timer.c +40 -0
- data/ext/noderb_extension/libuv/test/test-tty.c +56 -0
- data/ext/noderb_extension/libuv/uv.gyp +17 -18
- data/ext/noderb_extension/noderb.c +0 -2
- data/ext/noderb_extension/noderb_dns.c +6 -7
- data/ext/noderb_extension/noderb_fs.c +11 -10
- data/ext/noderb_extension/noderb_timers.c +5 -5
- data/lib/noderb/version.rb +1 -1
- metadata +8 -3
| @@ -19,15 +19,29 @@ | |
| 19 19 | 
             
             */
         | 
| 20 20 |  | 
| 21 21 | 
             
            #include "uv.h"
         | 
| 22 | 
            +
            #include "internal.h"
         | 
| 22 23 |  | 
| 23 24 | 
             
            #include <stdint.h>
         | 
| 24 | 
            -
            #include < | 
| 25 | 
            +
            #include <stdlib.h>
         | 
| 26 | 
            +
            #include <string.h>
         | 
| 27 | 
            +
            #include <assert.h>
         | 
| 28 | 
            +
            #include <errno.h>
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            #include <sys/inotify.h>
         | 
| 25 31 | 
             
            #include <unistd.h>
         | 
| 26 32 | 
             
            #include <time.h>
         | 
| 27 33 |  | 
| 28 34 | 
             
            #undef NANOSEC
         | 
| 29 35 | 
             
            #define NANOSEC 1000000000
         | 
| 30 36 |  | 
| 37 | 
            +
             | 
| 38 | 
            +
            /* Don't look aghast, this is exactly how glibc's basename() works. */
         | 
| 39 | 
            +
            static char* basename_r(const char* path) {
         | 
| 40 | 
            +
              char* s = strrchr(path, '/');
         | 
| 41 | 
            +
              return s ? (s + 1) : (char*)path;
         | 
| 42 | 
            +
            }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
             | 
| 31 45 | 
             
            /*
         | 
| 32 46 | 
             
             * There's probably some way to get time from Linux than gettimeofday(). What
         | 
| 33 47 | 
             
             * it is, I don't know.
         | 
| @@ -49,3 +63,121 @@ int uv_exepath(char* buffer, size_t* size) { | |
| 49 63 | 
             
              buffer[*size] = '\0';
         | 
| 50 64 | 
             
              return 0;
         | 
| 51 65 | 
             
            }
         | 
| 66 | 
            +
             | 
| 67 | 
            +
             | 
| 68 | 
            +
            static int new_inotify_fd(void) {
         | 
| 69 | 
            +
            #if defined(IN_NONBLOCK) && defined(IN_CLOEXEC)
         | 
| 70 | 
            +
              return inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
         | 
| 71 | 
            +
            #else
         | 
| 72 | 
            +
              int fd;
         | 
| 73 | 
            +
             | 
| 74 | 
            +
              if ((fd = inotify_init()) == -1)
         | 
| 75 | 
            +
                return -1;
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              if (uv__cloexec(fd, 1) || uv__nonblock(fd, 1)) {
         | 
| 78 | 
            +
                SAVE_ERRNO(uv__close(fd));
         | 
| 79 | 
            +
                fd = -1;
         | 
| 80 | 
            +
              }
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              return fd;
         | 
| 83 | 
            +
            #endif
         | 
| 84 | 
            +
            }
         | 
| 85 | 
            +
             | 
| 86 | 
            +
             | 
| 87 | 
            +
            static void uv__inotify_read(EV_P_ ev_io* w, int revents) {
         | 
| 88 | 
            +
              struct inotify_event* e;
         | 
| 89 | 
            +
              uv_fs_event_t* handle;
         | 
| 90 | 
            +
              const char* filename;
         | 
| 91 | 
            +
              ssize_t size;
         | 
| 92 | 
            +
              int events;
         | 
| 93 | 
            +
              char *p;
         | 
| 94 | 
            +
              /* needs to be large enough for sizeof(inotify_event) + strlen(filename) */
         | 
| 95 | 
            +
              char buf[4096];
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              handle = container_of(w, uv_fs_event_t, read_watcher);
         | 
| 98 | 
            +
             | 
| 99 | 
            +
              do {
         | 
| 100 | 
            +
                do {
         | 
| 101 | 
            +
                  size = read(handle->fd, buf, sizeof buf);
         | 
| 102 | 
            +
                }
         | 
| 103 | 
            +
                while (size == -1 && errno == EINTR);
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                if (size == -1) {
         | 
| 106 | 
            +
                  assert(errno == EAGAIN || errno == EWOULDBLOCK);
         | 
| 107 | 
            +
                  break;
         | 
| 108 | 
            +
                }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                assert(size > 0); /* pre-2.6.21 thing, size=0 == read buffer too small */
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                /* Now we have one or more inotify_event structs. */
         | 
| 113 | 
            +
                for (p = buf; p < buf + size; p += sizeof(*e) + e->len) {
         | 
| 114 | 
            +
                  e = (void*)p;
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  events = 0;
         | 
| 117 | 
            +
                  if (e->mask & (IN_ATTRIB|IN_MODIFY))
         | 
| 118 | 
            +
                    events |= UV_CHANGE;
         | 
| 119 | 
            +
                  if (e->mask & ~(IN_ATTRIB|IN_MODIFY))
         | 
| 120 | 
            +
                    events |= UV_RENAME;
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  /* inotify does not return the filename when monitoring a single file
         | 
| 123 | 
            +
                   * for modifications. Repurpose the filename for API compatibility.
         | 
| 124 | 
            +
                   * I'm not convinced this is a good thing, maybe it should go.
         | 
| 125 | 
            +
                   */
         | 
| 126 | 
            +
                  filename = e->len ? e->name : basename_r(handle->filename);
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                  handle->cb(handle, filename, events, 0);
         | 
| 129 | 
            +
                }
         | 
| 130 | 
            +
              }
         | 
| 131 | 
            +
              while (handle->fd != -1); /* handle might've been closed by callback */
         | 
| 132 | 
            +
            }
         | 
| 133 | 
            +
             | 
| 134 | 
            +
             | 
| 135 | 
            +
            int uv_fs_event_init(uv_loop_t* loop,
         | 
| 136 | 
            +
                                 uv_fs_event_t* handle,
         | 
| 137 | 
            +
                                 const char* filename,
         | 
| 138 | 
            +
                                 uv_fs_event_cb cb) {
         | 
| 139 | 
            +
              int flags;
         | 
| 140 | 
            +
              int fd;
         | 
| 141 | 
            +
             | 
| 142 | 
            +
              /*
         | 
| 143 | 
            +
               * TODO share a single inotify fd across the event loop?
         | 
| 144 | 
            +
               * We'll run into fs.inotify.max_user_instances if we
         | 
| 145 | 
            +
               * keep creating new inotify fds.
         | 
| 146 | 
            +
               */
         | 
| 147 | 
            +
              if ((fd = new_inotify_fd()) == -1) {
         | 
| 148 | 
            +
                uv_err_new(loop, errno);
         | 
| 149 | 
            +
                return -1;
         | 
| 150 | 
            +
              }
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              flags = IN_ATTRIB
         | 
| 153 | 
            +
                    | IN_CREATE
         | 
| 154 | 
            +
                    | IN_MODIFY
         | 
| 155 | 
            +
                    | IN_DELETE
         | 
| 156 | 
            +
                    | IN_DELETE_SELF
         | 
| 157 | 
            +
                    | IN_MOVED_FROM
         | 
| 158 | 
            +
                    | IN_MOVED_TO;
         | 
| 159 | 
            +
             | 
| 160 | 
            +
              if (inotify_add_watch(fd, filename, flags) == -1) {
         | 
| 161 | 
            +
                uv_err_new(loop, errno);
         | 
| 162 | 
            +
                uv__close(fd);
         | 
| 163 | 
            +
                return -1;
         | 
| 164 | 
            +
              }
         | 
| 165 | 
            +
             | 
| 166 | 
            +
              uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT);
         | 
| 167 | 
            +
              handle->filename = strdup(filename); /* this should go! */
         | 
| 168 | 
            +
              handle->cb = cb;
         | 
| 169 | 
            +
              handle->fd = fd;
         | 
| 170 | 
            +
             | 
| 171 | 
            +
              ev_io_init(&handle->read_watcher, uv__inotify_read, fd, EV_READ);
         | 
| 172 | 
            +
              ev_io_start(loop->ev, &handle->read_watcher);
         | 
| 173 | 
            +
             | 
| 174 | 
            +
              return 0;
         | 
| 175 | 
            +
            }
         | 
| 176 | 
            +
             | 
| 177 | 
            +
             | 
| 178 | 
            +
            void uv__fs_event_destroy(uv_fs_event_t* handle) {
         | 
| 179 | 
            +
              ev_io_stop(handle->loop->ev, &handle->read_watcher);
         | 
| 180 | 
            +
              uv__close(handle->fd);
         | 
| 181 | 
            +
              handle->fd = -1;
         | 
| 182 | 
            +
              free(handle->filename);
         | 
| 183 | 
            +
            }
         | 
| @@ -20,17 +20,20 @@ | |
| 20 20 |  | 
| 21 21 | 
             
            #include "uv.h"
         | 
| 22 22 |  | 
| 23 | 
            +
            #include <assert.h>
         | 
| 23 24 | 
             
            #include <string.h>
         | 
| 24 | 
            -
            #include < | 
| 25 | 
            +
            #include <errno.h>
         | 
| 25 26 |  | 
| 26 27 | 
             
            #include <sys/types.h>
         | 
| 27 28 | 
             
            #include <sys/sysctl.h>
         | 
| 28 29 |  | 
| 29 30 | 
             
            #include <unistd.h>
         | 
| 31 | 
            +
            #include <time.h>
         | 
| 30 32 |  | 
| 31 33 | 
             
            #undef NANOSEC
         | 
| 32 34 | 
             
            #define NANOSEC 1000000000
         | 
| 33 35 |  | 
| 36 | 
            +
             | 
| 34 37 | 
             
            uint64_t uv_hrtime(void) {
         | 
| 35 38 | 
             
              struct timespec ts;
         | 
| 36 39 | 
             
              clock_gettime(CLOCK_MONOTONIC, &ts);
         | 
| @@ -66,3 +69,17 @@ int uv_exepath(char* buffer, size_t* size) { | |
| 66 69 |  | 
| 67 70 | 
             
              return 0;
         | 
| 68 71 | 
             
            }
         | 
| 72 | 
            +
             | 
| 73 | 
            +
             | 
| 74 | 
            +
            int uv_fs_event_init(uv_loop_t* loop,
         | 
| 75 | 
            +
                                 uv_fs_event_t* handle,
         | 
| 76 | 
            +
                                 const char* filename,
         | 
| 77 | 
            +
                                 uv_fs_event_cb cb) {
         | 
| 78 | 
            +
              uv_err_new(loop, ENOSYS);
         | 
| 79 | 
            +
              return -1;
         | 
| 80 | 
            +
            }
         | 
| 81 | 
            +
             | 
| 82 | 
            +
             | 
| 83 | 
            +
            void uv__fs_event_destroy(uv_fs_event_t* handle) {
         | 
| 84 | 
            +
              assert(0 && "implement me");
         | 
| 85 | 
            +
            }
         | 
| @@ -129,8 +129,8 @@ void uv__stream_destroy(uv_stream_t* stream) { | |
| 129 129 |  | 
| 130 130 | 
             
                req = ngx_queue_data(q, uv_write_t, queue);
         | 
| 131 131 | 
             
                if (req->cb) {
         | 
| 132 | 
            -
                  uv_err_new_artificial( | 
| 133 | 
            -
                  req->cb(req, 0);
         | 
| 132 | 
            +
                  uv_err_new_artificial(stream->loop, req->error);
         | 
| 133 | 
            +
                  req->cb(req, req->error ? -1 : 0);
         | 
| 134 134 | 
             
                }
         | 
| 135 135 | 
             
              }
         | 
| 136 136 | 
             
            }
         | 
| @@ -287,6 +287,17 @@ static void uv__drain(uv_stream_t* stream) { | |
| 287 287 | 
             
            }
         | 
| 288 288 |  | 
| 289 289 |  | 
| 290 | 
            +
            static size_t uv__write_req_size(uv_write_t* req) {
         | 
| 291 | 
            +
              size_t size;
         | 
| 292 | 
            +
             | 
| 293 | 
            +
              size = uv__buf_count(req->bufs + req->write_index,
         | 
| 294 | 
            +
                                   req->bufcnt - req->write_index);
         | 
| 295 | 
            +
              assert(req->handle->write_queue_size >= size);
         | 
| 296 | 
            +
             | 
| 297 | 
            +
              return size;
         | 
| 298 | 
            +
            }
         | 
| 299 | 
            +
             | 
| 300 | 
            +
             | 
| 290 301 | 
             
            static void uv__write_req_finish(uv_write_t* req) {
         | 
| 291 302 | 
             
              uv_stream_t* stream = req->handle;
         | 
| 292 303 |  | 
| @@ -351,6 +362,7 @@ static void uv__write(uv_stream_t* stream) { | |
| 351 362 | 
             
                if (errno != EAGAIN) {
         | 
| 352 363 | 
             
                  /* Error */
         | 
| 353 364 | 
             
                  req->error = errno;
         | 
| 365 | 
            +
                  stream->write_queue_size -= uv__write_req_size(req);
         | 
| 354 366 | 
             
                  uv__write_req_finish(req);
         | 
| 355 367 | 
             
                  return;
         | 
| 356 368 | 
             
                }
         | 
| @@ -517,8 +529,8 @@ int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) { | |
| 517 529 | 
             
            void uv__stream_io(EV_P_ ev_io* watcher, int revents) {
         | 
| 518 530 | 
             
              uv_stream_t* stream = watcher->data;
         | 
| 519 531 |  | 
| 520 | 
            -
              assert(stream->type == UV_TCP ||
         | 
| 521 | 
            -
             | 
| 532 | 
            +
              assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE ||
         | 
| 533 | 
            +
                  stream->type == UV_TTY);
         | 
| 522 534 | 
             
              assert(watcher == &stream->read_watcher ||
         | 
| 523 535 | 
             
                     watcher == &stream->write_watcher);
         | 
| 524 536 | 
             
              assert(!(stream->flags & UV_CLOSING));
         | 
| @@ -667,8 +679,9 @@ int uv_write(uv_write_t* req, uv_stream_t* stream, uv_buf_t bufs[], int bufcnt, | |
| 667 679 | 
             
                uv_write_cb cb) {
         | 
| 668 680 | 
             
              int empty_queue;
         | 
| 669 681 |  | 
| 670 | 
            -
              assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE | 
| 671 | 
            -
                   | 
| 682 | 
            +
              assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE ||
         | 
| 683 | 
            +
                  stream->type == UV_TTY) &&
         | 
| 684 | 
            +
                  "uv_write (unix) does not yet support other types of streams");
         | 
| 672 685 |  | 
| 673 686 | 
             
              if (stream->fd < 0) {
         | 
| 674 687 | 
             
                uv_err_new(stream->loop, EBADF);
         | 
| @@ -725,7 +738,8 @@ int uv_write(uv_write_t* req, uv_stream_t* stream, uv_buf_t bufs[], int bufcnt, | |
| 725 738 |  | 
| 726 739 |  | 
| 727 740 | 
             
            int uv_read_start(uv_stream_t* stream, uv_alloc_cb alloc_cb, uv_read_cb read_cb) {
         | 
| 728 | 
            -
              assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE | 
| 741 | 
            +
              assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE ||
         | 
| 742 | 
            +
                  stream->type == UV_TTY);
         | 
| 729 743 |  | 
| 730 744 | 
             
              if (stream->flags & UV_CLOSING) {
         | 
| 731 745 | 
             
                uv_err_new(stream->loop, EINVAL);
         | 
| @@ -22,8 +22,11 @@ | |
| 22 22 |  | 
| 23 23 | 
             
            #include <stdio.h>
         | 
| 24 24 | 
             
            #include <stdint.h>
         | 
| 25 | 
            -
            #include < | 
| 25 | 
            +
            #include <assert.h>
         | 
| 26 | 
            +
            #include <errno.h>
         | 
| 27 | 
            +
             | 
| 26 28 | 
             
            #include <sys/time.h>
         | 
| 29 | 
            +
            #include <unistd.h>
         | 
| 27 30 |  | 
| 28 31 |  | 
| 29 32 | 
             
            uint64_t uv_hrtime() {
         | 
| @@ -58,3 +61,17 @@ int uv_exepath(char* buffer, size_t* size) { | |
| 58 61 | 
             
              *size = res;
         | 
| 59 62 | 
             
              return (0);
         | 
| 60 63 | 
             
            }
         | 
| 64 | 
            +
             | 
| 65 | 
            +
             | 
| 66 | 
            +
            int uv_fs_event_init(uv_loop_t* loop,
         | 
| 67 | 
            +
                                 uv_fs_event_t* handle,
         | 
| 68 | 
            +
                                 const char* filename,
         | 
| 69 | 
            +
                                 uv_fs_event_cb cb) {
         | 
| 70 | 
            +
              uv_err_new(loop, ENOSYS);
         | 
| 71 | 
            +
              return -1;
         | 
| 72 | 
            +
            }
         | 
| 73 | 
            +
             | 
| 74 | 
            +
             | 
| 75 | 
            +
            void uv__fs_event_destroy(uv_fs_event_t* handle) {
         | 
| 76 | 
            +
              assert(0 && "implement me");
         | 
| 77 | 
            +
            }
         | 
| @@ -23,8 +23,10 @@ | |
| 23 23 | 
             
            #include "internal.h"
         | 
| 24 24 |  | 
| 25 25 | 
             
            #include <assert.h>
         | 
| 26 | 
            +
            #include <unistd.h>
         | 
| 26 27 | 
             
            #include <termios.h>
         | 
| 27 28 | 
             
            #include <errno.h>
         | 
| 29 | 
            +
            #include <sys/ioctl.h>
         | 
| 28 30 |  | 
| 29 31 |  | 
| 30 32 | 
             
            int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd) {
         | 
| @@ -67,3 +69,42 @@ fatal: | |
| 67 69 | 
             
              return -1;
         | 
| 68 70 | 
             
            }
         | 
| 69 71 |  | 
| 72 | 
            +
             | 
| 73 | 
            +
            int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) {
         | 
| 74 | 
            +
              struct winsize ws;
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              if (ioctl(tty->fd, TIOCGWINSZ, &ws) < 0) {
         | 
| 77 | 
            +
                uv_err_new(tty->loop, errno);
         | 
| 78 | 
            +
                return -1;
         | 
| 79 | 
            +
              }
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              *width = ws.ws_col;
         | 
| 82 | 
            +
              *height = ws.ws_row;
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              return 0;
         | 
| 85 | 
            +
            }
         | 
| 86 | 
            +
             | 
| 87 | 
            +
             | 
| 88 | 
            +
            uv_handle_type uv_guess_handle(uv_file file) {
         | 
| 89 | 
            +
              struct stat s;
         | 
| 90 | 
            +
             | 
| 91 | 
            +
              if (file < 0) {
         | 
| 92 | 
            +
                uv_err_new(NULL, EINVAL); /* XXX Need loop? */
         | 
| 93 | 
            +
                return -1;
         | 
| 94 | 
            +
              }
         | 
| 95 | 
            +
             | 
| 96 | 
            +
              if (isatty(file)) {
         | 
| 97 | 
            +
                return UV_TTY;
         | 
| 98 | 
            +
              }
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              if (fstat(file, &s)) {
         | 
| 101 | 
            +
                uv_err_new(NULL, errno); /* XXX Need loop? */
         | 
| 102 | 
            +
                return -1;
         | 
| 103 | 
            +
              }
         | 
| 104 | 
            +
             | 
| 105 | 
            +
              if (!S_ISSOCK(s.st_mode) && !S_ISFIFO(s.st_mode)) {
         | 
| 106 | 
            +
                return UV_FILE;
         | 
| 107 | 
            +
              }
         | 
| 108 | 
            +
             | 
| 109 | 
            +
              return UV_NAMED_PIPE;
         | 
| 110 | 
            +
            }
         |