noderb 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/noderb_extension/extconf.rb +4 -2
- data/ext/noderb_extension/libuv/AUTHORS +2 -0
- data/ext/noderb_extension/libuv/Makefile +1 -1
- data/ext/noderb_extension/libuv/common.gypi +51 -51
- data/ext/noderb_extension/libuv/config-mingw.mk +3 -9
- data/ext/noderb_extension/libuv/config-unix.mk +10 -1
- data/ext/noderb_extension/libuv/include/uv-private/uv-unix.h +3 -2
- data/ext/noderb_extension/libuv/include/uv-private/uv-win.h +7 -6
- data/ext/noderb_extension/libuv/include/uv.h +47 -13
- data/ext/noderb_extension/libuv/src/ares/config_netbsd/ares_config.h +510 -0
- data/ext/noderb_extension/libuv/src/unix/core.c +20 -65
- data/ext/noderb_extension/libuv/src/unix/darwin.c +1 -0
- data/ext/noderb_extension/libuv/src/unix/eio/config_netbsd.h +81 -0
- data/ext/noderb_extension/libuv/src/unix/error.c +9 -1
- data/ext/noderb_extension/libuv/src/unix/ev/config_netbsd.h +120 -0
- data/ext/noderb_extension/libuv/src/unix/fs.c +151 -21
- data/ext/noderb_extension/libuv/src/unix/internal.h +30 -0
- data/ext/noderb_extension/libuv/src/unix/netbsd.c +68 -0
- data/ext/noderb_extension/libuv/src/unix/pipe.c +20 -30
- data/ext/noderb_extension/libuv/src/unix/process.c +13 -0
- data/ext/noderb_extension/libuv/src/unix/stream.c +105 -63
- data/ext/noderb_extension/libuv/src/unix/tcp.c +75 -21
- data/ext/noderb_extension/libuv/src/unix/tty.c +69 -0
- data/ext/noderb_extension/libuv/src/unix/udp.c +31 -0
- data/ext/noderb_extension/libuv/src/uv-common.c +2 -0
- data/ext/noderb_extension/libuv/src/uv-common.h +0 -6
- data/ext/noderb_extension/libuv/src/win/cares.c +7 -7
- data/ext/noderb_extension/libuv/src/win/core.c +25 -17
- data/ext/noderb_extension/libuv/src/win/error.c +7 -0
- data/ext/noderb_extension/libuv/src/win/fs.c +587 -92
- data/ext/noderb_extension/libuv/src/win/getaddrinfo.c +3 -1
- data/ext/noderb_extension/libuv/src/win/handle.c +0 -17
- data/ext/noderb_extension/libuv/src/win/internal.h +15 -5
- data/ext/noderb_extension/libuv/src/win/loop-watcher.c +1 -1
- data/ext/noderb_extension/libuv/src/win/pipe.c +6 -0
- data/ext/noderb_extension/libuv/src/win/process.c +90 -43
- data/ext/noderb_extension/libuv/src/win/tcp.c +37 -4
- data/ext/noderb_extension/libuv/src/win/threads.c +81 -0
- data/ext/noderb_extension/libuv/src/win/timer.c +15 -15
- data/ext/noderb_extension/libuv/src/win/tty.c +37 -0
- data/ext/noderb_extension/libuv/src/win/udp.c +8 -2
- data/ext/noderb_extension/libuv/src/win/winapi.c +12 -0
- data/ext/noderb_extension/libuv/src/win/winapi.h +1146 -1015
- data/ext/noderb_extension/libuv/test/benchmark-ares.c +0 -1
- data/ext/noderb_extension/libuv/test/benchmark-getaddrinfo.c +0 -1
- data/ext/noderb_extension/libuv/test/benchmark-ping-pongs.c +0 -1
- data/ext/noderb_extension/libuv/test/benchmark-pound.c +0 -1
- data/ext/noderb_extension/libuv/test/benchmark-pump.c +4 -6
- data/ext/noderb_extension/libuv/test/benchmark-spawn.c +0 -1
- data/ext/noderb_extension/libuv/test/benchmark-udp-packet-storm.c +0 -1
- data/ext/noderb_extension/libuv/test/dns-server.c +2 -2
- data/ext/noderb_extension/libuv/test/echo-server.c +4 -5
- data/ext/noderb_extension/libuv/test/run-tests.c +0 -2
- data/ext/noderb_extension/libuv/test/test-async.c +0 -2
- data/ext/noderb_extension/libuv/test/test-callback-stack.c +0 -2
- data/ext/noderb_extension/libuv/test/test-connection-fail.c +3 -5
- data/ext/noderb_extension/libuv/test/test-delayed-accept.c +2 -3
- data/ext/noderb_extension/libuv/test/test-fs.c +578 -42
- data/ext/noderb_extension/libuv/test/test-get-currentexe.c +12 -2
- data/ext/noderb_extension/libuv/test/test-getaddrinfo.c +10 -5
- data/ext/noderb_extension/libuv/test/test-gethostbyname.c +0 -2
- data/ext/noderb_extension/libuv/test/test-getsockname.c +92 -72
- data/ext/noderb_extension/libuv/test/test-idle.c +0 -3
- data/ext/noderb_extension/libuv/test/test-list.h +13 -0
- data/ext/noderb_extension/libuv/test/test-loop-handles.c +0 -3
- data/ext/noderb_extension/libuv/test/test-ping-pong.c +13 -19
- data/ext/noderb_extension/libuv/test/test-pipe-bind-error.c +0 -12
- data/ext/noderb_extension/libuv/test/test-ref.c +0 -7
- data/ext/noderb_extension/libuv/test/test-shutdown-eof.c +3 -3
- data/ext/noderb_extension/libuv/test/test-spawn.c +2 -11
- data/ext/noderb_extension/libuv/test/test-tcp-bind-error.c +0 -19
- data/ext/noderb_extension/libuv/test/test-tcp-bind6-error.c +0 -15
- data/ext/noderb_extension/libuv/test/test-tcp-close.c +129 -0
- data/ext/noderb_extension/libuv/test/test-tcp-writealot.c +0 -3
- data/ext/noderb_extension/libuv/test/test-threadpool.c +0 -2
- data/ext/noderb_extension/libuv/test/test-timer-again.c +0 -3
- data/ext/noderb_extension/libuv/test/test-timer.c +0 -2
- data/ext/noderb_extension/libuv/test/test-udp-dgram-too-big.c +0 -2
- data/ext/noderb_extension/libuv/test/test-udp-ipv6.c +0 -2
- data/ext/noderb_extension/libuv/test/test-udp-send-and-recv.c +0 -2
- data/ext/noderb_extension/libuv/uv.gyp +18 -2
- data/ext/noderb_extension/noderb_fs.c +1 -2
- data/lib/noderb/version.rb +1 -1
- metadata +10 -2
@@ -18,10 +18,6 @@
|
|
18
18
|
* IN THE SOFTWARE.
|
19
19
|
*/
|
20
20
|
|
21
|
-
#ifndef _GNU_SOURCE
|
22
|
-
#define _GNU_SOURCE /* O_CLOEXEC, accept4(), etc. */
|
23
|
-
#endif
|
24
|
-
|
25
21
|
#include "uv.h"
|
26
22
|
#include "unix/internal.h"
|
27
23
|
|
@@ -42,26 +38,6 @@
|
|
42
38
|
#include <limits.h> /* PATH_MAX */
|
43
39
|
#include <sys/uio.h> /* writev */
|
44
40
|
|
45
|
-
#if defined(__linux__)
|
46
|
-
|
47
|
-
#include <linux/version.h>
|
48
|
-
#include <features.h>
|
49
|
-
|
50
|
-
#undef HAVE_PIPE2
|
51
|
-
#undef HAVE_ACCEPT4
|
52
|
-
|
53
|
-
/* pipe2() requires linux >= 2.6.27 and glibc >= 2.9 */
|
54
|
-
#if LINUX_VERSION_CODE >= 0x2061B && __GLIBC_PREREQ(2, 9)
|
55
|
-
#define HAVE_PIPE2
|
56
|
-
#endif
|
57
|
-
|
58
|
-
/* accept4() requires linux >= 2.6.28 and glib >= 2.10 */
|
59
|
-
#if LINUX_VERSION_CODE >= 0x2061C && __GLIBC_PREREQ(2, 10)
|
60
|
-
#define HAVE_ACCEPT4
|
61
|
-
#endif
|
62
|
-
|
63
|
-
#endif /* __linux__ */
|
64
|
-
|
65
41
|
#ifdef __sun
|
66
42
|
# include <sys/types.h>
|
67
43
|
# include <sys/wait.h>
|
@@ -89,17 +65,6 @@ static void uv__finish_close(uv_handle_t* handle);
|
|
89
65
|
#endif
|
90
66
|
|
91
67
|
|
92
|
-
void uv_init() {
|
93
|
-
default_loop_ptr = &default_loop_struct;
|
94
|
-
#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
|
95
|
-
default_loop_struct.ev = ev_default_loop(EVBACKEND_KQUEUE);
|
96
|
-
#else
|
97
|
-
default_loop_struct.ev = ev_default_loop(EVFLAG_AUTO);
|
98
|
-
#endif
|
99
|
-
ev_set_userdata(default_loop_struct.ev, default_loop_ptr);
|
100
|
-
}
|
101
|
-
|
102
|
-
|
103
68
|
void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
|
104
69
|
uv_udp_t* udp;
|
105
70
|
uv_async_t* async;
|
@@ -200,6 +165,15 @@ void uv_loop_delete(uv_loop_t* loop) {
|
|
200
165
|
|
201
166
|
|
202
167
|
uv_loop_t* uv_default_loop() {
|
168
|
+
if (!default_loop_ptr) {
|
169
|
+
default_loop_ptr = &default_loop_struct;
|
170
|
+
#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
|
171
|
+
default_loop_struct.ev = ev_default_loop(EVBACKEND_KQUEUE);
|
172
|
+
#else
|
173
|
+
default_loop_struct.ev = ev_default_loop(EVFLAG_AUTO);
|
174
|
+
#endif
|
175
|
+
ev_set_userdata(default_loop_struct.ev, default_loop_ptr);
|
176
|
+
}
|
203
177
|
assert(default_loop_ptr->ev == EV_DEFAULT_UC);
|
204
178
|
return default_loop_ptr;
|
205
179
|
}
|
@@ -259,6 +233,8 @@ void uv__finish_close(uv_handle_t* handle) {
|
|
259
233
|
case UV_TCP:
|
260
234
|
assert(!ev_is_active(&((uv_stream_t*)handle)->read_watcher));
|
261
235
|
assert(!ev_is_active(&((uv_stream_t*)handle)->write_watcher));
|
236
|
+
assert(((uv_stream_t*)handle)->fd == -1);
|
237
|
+
uv__stream_destroy((uv_stream_t*)handle);
|
262
238
|
break;
|
263
239
|
|
264
240
|
case UV_UDP:
|
@@ -300,27 +276,6 @@ void uv__next(EV_P_ ev_idle* watcher, int revents) {
|
|
300
276
|
}
|
301
277
|
|
302
278
|
|
303
|
-
int uv_getsockname(uv_handle_t* handle, struct sockaddr* name, int* namelen) {
|
304
|
-
socklen_t socklen;
|
305
|
-
int saved_errno;
|
306
|
-
|
307
|
-
/* Don't clobber errno. */
|
308
|
-
saved_errno = errno;
|
309
|
-
|
310
|
-
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
311
|
-
socklen = (socklen_t)*namelen;
|
312
|
-
|
313
|
-
if (getsockname(handle->fd, name, &socklen) == -1) {
|
314
|
-
uv_err_new(handle->loop, errno);
|
315
|
-
} else {
|
316
|
-
*namelen = (int)socklen;
|
317
|
-
}
|
318
|
-
|
319
|
-
errno = saved_errno;
|
320
|
-
return 0;
|
321
|
-
}
|
322
|
-
|
323
|
-
|
324
279
|
void uv_ref(uv_loop_t* loop) {
|
325
280
|
ev_ref(loop->ev);
|
326
281
|
}
|
@@ -344,7 +299,6 @@ int64_t uv_now(uv_loop_t* loop) {
|
|
344
299
|
void uv__req_init(uv_req_t* req) {
|
345
300
|
/* loop->counters.req_init++; */
|
346
301
|
req->type = UV_UNKNOWN_REQ;
|
347
|
-
req->data = NULL;
|
348
302
|
}
|
349
303
|
|
350
304
|
|
@@ -653,7 +607,7 @@ static void getaddrinfo_thread_proc(eio_req *req) {
|
|
653
607
|
|
654
608
|
|
655
609
|
/* stub implementation of uv_getaddrinfo */
|
656
|
-
int uv_getaddrinfo(uv_loop_t* loop,
|
610
|
+
int uv_getaddrinfo(uv_loop_t* loop,
|
657
611
|
uv_getaddrinfo_t* handle,
|
658
612
|
uv_getaddrinfo_cb cb,
|
659
613
|
const char* hostname,
|
@@ -668,7 +622,10 @@ int uv_getaddrinfo(uv_loop_t* loop,
|
|
668
622
|
return -1;
|
669
623
|
}
|
670
624
|
|
671
|
-
|
625
|
+
uv__req_init((uv_req_t*)handle);
|
626
|
+
handle->type = UV_GETADDRINFO;
|
627
|
+
handle->loop = loop;
|
628
|
+
handle->cb = cb;
|
672
629
|
|
673
630
|
/* TODO don't alloc so much. */
|
674
631
|
|
@@ -679,10 +636,10 @@ int uv_getaddrinfo(uv_loop_t* loop,
|
|
679
636
|
|
680
637
|
/* TODO security! check lengths, check return values. */
|
681
638
|
|
682
|
-
handle->loop = loop;
|
683
|
-
handle->cb = cb;
|
684
639
|
handle->hostname = hostname ? strdup(hostname) : NULL;
|
685
640
|
handle->service = service ? strdup(service) : NULL;
|
641
|
+
handle->res = NULL;
|
642
|
+
handle->retcode = 0;
|
686
643
|
|
687
644
|
/* TODO check handle->hostname == NULL */
|
688
645
|
/* TODO check handle->service == NULL */
|
@@ -810,10 +767,8 @@ size_t uv__strlcpy(char* dst, const char* src, size_t size) {
|
|
810
767
|
}
|
811
768
|
|
812
769
|
org = src;
|
813
|
-
while (size
|
814
|
-
|
815
|
-
return org - src;
|
816
|
-
}
|
770
|
+
while (--size && *src) {
|
771
|
+
*dst++ = *src++;
|
817
772
|
}
|
818
773
|
*dst = '\0';
|
819
774
|
|
@@ -0,0 +1,81 @@
|
|
1
|
+
/* config.h. Generated from config.h.in by configure. */
|
2
|
+
/* config.h.in. Generated from configure.ac by autoheader. */
|
3
|
+
|
4
|
+
/* Define to 1 if you have the <dlfcn.h> header file. */
|
5
|
+
#define HAVE_DLFCN_H 1
|
6
|
+
|
7
|
+
/* fdatasync(2) is available */
|
8
|
+
/* #undef HAVE_FDATASYNC */
|
9
|
+
|
10
|
+
/* utimes(2) is available */
|
11
|
+
#define HAVE_UTIMES 1
|
12
|
+
|
13
|
+
/* futimes(2) is available */
|
14
|
+
#define HAVE_FUTIMES 1
|
15
|
+
|
16
|
+
/* Define to 1 if you have the <inttypes.h> header file. */
|
17
|
+
#define HAVE_INTTYPES_H 1
|
18
|
+
|
19
|
+
/* Define to 1 if you have the <memory.h> header file. */
|
20
|
+
#define HAVE_MEMORY_H 1
|
21
|
+
|
22
|
+
/* pread(2) and pwrite(2) are available */
|
23
|
+
#define HAVE_PREADWRITE 1
|
24
|
+
|
25
|
+
/* readahead(2) is available (linux) */
|
26
|
+
/* #undef HAVE_READAHEAD */
|
27
|
+
|
28
|
+
/* sendfile(2) is available and supported */
|
29
|
+
#define HAVE_SENDFILE 0
|
30
|
+
|
31
|
+
/* Define to 1 if you have the <stdint.h> header file. */
|
32
|
+
#define HAVE_STDINT_H 1
|
33
|
+
|
34
|
+
/* Define to 1 if you have the <stdlib.h> header file. */
|
35
|
+
#define HAVE_STDLIB_H 1
|
36
|
+
|
37
|
+
/* Define to 1 if you have the <strings.h> header file. */
|
38
|
+
#define HAVE_STRINGS_H 1
|
39
|
+
|
40
|
+
/* Define to 1 if you have the <string.h> header file. */
|
41
|
+
#define HAVE_STRING_H 1
|
42
|
+
|
43
|
+
/* sync_file_range(2) is available */
|
44
|
+
/* #undef HAVE_SYNC_FILE_RANGE */
|
45
|
+
|
46
|
+
/* Define to 1 if you have the <sys/stat.h> header file. */
|
47
|
+
#define HAVE_SYS_STAT_H 1
|
48
|
+
|
49
|
+
/* Define to 1 if you have the <sys/types.h> header file. */
|
50
|
+
#define HAVE_SYS_TYPES_H 1
|
51
|
+
|
52
|
+
/* Define to 1 if you have the <unistd.h> header file. */
|
53
|
+
#define HAVE_UNISTD_H 1
|
54
|
+
|
55
|
+
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
56
|
+
*/
|
57
|
+
#define LT_OBJDIR ".libs/"
|
58
|
+
|
59
|
+
/* Name of package */
|
60
|
+
#define PACKAGE "libeio"
|
61
|
+
|
62
|
+
/* Define to the address where bug reports for this package should be sent. */
|
63
|
+
#define PACKAGE_BUGREPORT ""
|
64
|
+
|
65
|
+
/* Define to the full name of this package. */
|
66
|
+
#define PACKAGE_NAME ""
|
67
|
+
|
68
|
+
/* Define to the full name and version of this package. */
|
69
|
+
#define PACKAGE_STRING ""
|
70
|
+
|
71
|
+
/* Define to the one symbol short name of this package. */
|
72
|
+
#define PACKAGE_TARNAME ""
|
73
|
+
|
74
|
+
/* Define to the version of this package. */
|
75
|
+
#define PACKAGE_VERSION ""
|
76
|
+
|
77
|
+
/* Define to 1 if you have the ANSI C header files. */
|
78
|
+
#define STDC_HEADERS 1
|
79
|
+
|
80
|
+
/* Version number of package */
|
81
|
+
#define VERSION "1.0"
|
@@ -30,6 +30,8 @@
|
|
30
30
|
#include <errno.h>
|
31
31
|
#include <stdio.h>
|
32
32
|
#include <stdlib.h>
|
33
|
+
#include <string.h>
|
34
|
+
#include <assert.h>
|
33
35
|
|
34
36
|
|
35
37
|
/* TODO Expose callback to user to handle fatal error like V8 does. */
|
@@ -64,9 +66,10 @@ char* uv_strerror(uv_err_t err) {
|
|
64
66
|
}
|
65
67
|
|
66
68
|
|
67
|
-
|
69
|
+
uv_err_code uv_translate_sys_error(int sys_errno) {
|
68
70
|
switch (sys_errno) {
|
69
71
|
case 0: return UV_OK;
|
72
|
+
case ENOENT: return UV_ENOENT;
|
70
73
|
case EACCES: return UV_EACCESS;
|
71
74
|
case EBADF: return UV_EBADF;
|
72
75
|
case EPIPE: return UV_EPIPE;
|
@@ -79,8 +82,13 @@ static uv_err_code uv_translate_sys_error(int sys_errno) {
|
|
79
82
|
case ECONNREFUSED: return UV_ECONNREFUSED;
|
80
83
|
case EADDRINUSE: return UV_EADDRINUSE;
|
81
84
|
case EADDRNOTAVAIL: return UV_EADDRNOTAVAIL;
|
85
|
+
case ENOTCONN: return UV_ENOTCONN;
|
86
|
+
case EEXIST: return UV_EEXIST;
|
82
87
|
default: return UV_UNKNOWN;
|
83
88
|
}
|
89
|
+
|
90
|
+
assert(0 && "unreachable");
|
91
|
+
return -1;
|
84
92
|
}
|
85
93
|
|
86
94
|
|
@@ -0,0 +1,120 @@
|
|
1
|
+
/* config.h. Generated from config.h.in by configure. */
|
2
|
+
/* config.h.in. Generated from configure.ac by autoheader. */
|
3
|
+
|
4
|
+
/* Define to 1 if you have the `clock_gettime' function. */
|
5
|
+
/* #undef HAVE_CLOCK_GETTIME */
|
6
|
+
|
7
|
+
/* "use syscall interface for clock_gettime" */
|
8
|
+
/* #undef HAVE_CLOCK_SYSCALL */
|
9
|
+
|
10
|
+
/* Define to 1 if you have the <dlfcn.h> header file. */
|
11
|
+
#define HAVE_DLFCN_H 1
|
12
|
+
|
13
|
+
/* Define to 1 if you have the `epoll_ctl' function. */
|
14
|
+
/* #undef HAVE_EPOLL_CTL */
|
15
|
+
|
16
|
+
/* Define to 1 if you have the `eventfd' function. */
|
17
|
+
/* #undef HAVE_EVENTFD */
|
18
|
+
|
19
|
+
/* Define to 1 if you have the `inotify_init' function. */
|
20
|
+
/* #undef HAVE_INOTIFY_INIT */
|
21
|
+
|
22
|
+
/* Define to 1 if you have the <inttypes.h> header file. */
|
23
|
+
#define HAVE_INTTYPES_H 1
|
24
|
+
|
25
|
+
/* Define to 1 if you have the `kqueue' function. */
|
26
|
+
#define HAVE_KQUEUE 1
|
27
|
+
|
28
|
+
/* Define to 1 if you have the `m' library (-lm). */
|
29
|
+
#define HAVE_LIBM 1
|
30
|
+
|
31
|
+
/* Define to 1 if you have the `rt' library (-lrt). */
|
32
|
+
/* #undef HAVE_LIBRT */
|
33
|
+
|
34
|
+
/* Define to 1 if you have the <memory.h> header file. */
|
35
|
+
#define HAVE_MEMORY_H 1
|
36
|
+
|
37
|
+
/* Define to 1 if you have the `nanosleep' function. */
|
38
|
+
/* #undef HAVE_NANOSLEEP */
|
39
|
+
|
40
|
+
/* Define to 1 if you have the `poll' function. */
|
41
|
+
#define HAVE_POLL 1
|
42
|
+
|
43
|
+
/* Define to 1 if you have the <poll.h> header file. */
|
44
|
+
#define HAVE_POLL_H 1
|
45
|
+
|
46
|
+
/* Define to 1 if you have the `port_create' function. */
|
47
|
+
/* #undef HAVE_PORT_CREATE */
|
48
|
+
|
49
|
+
/* Define to 1 if you have the <port.h> header file. */
|
50
|
+
/* #undef HAVE_PORT_H */
|
51
|
+
|
52
|
+
/* Define to 1 if you have the `select' function. */
|
53
|
+
#define HAVE_SELECT 1
|
54
|
+
|
55
|
+
/* Define to 1 if you have the <stdint.h> header file. */
|
56
|
+
#define HAVE_STDINT_H 1
|
57
|
+
|
58
|
+
/* Define to 1 if you have the <stdlib.h> header file. */
|
59
|
+
#define HAVE_STDLIB_H 1
|
60
|
+
|
61
|
+
/* Define to 1 if you have the <strings.h> header file. */
|
62
|
+
#define HAVE_STRINGS_H 1
|
63
|
+
|
64
|
+
/* Define to 1 if you have the <string.h> header file. */
|
65
|
+
#define HAVE_STRING_H 1
|
66
|
+
|
67
|
+
/* Define to 1 if you have the <sys/epoll.h> header file. */
|
68
|
+
/* #undef HAVE_SYS_EPOLL_H */
|
69
|
+
|
70
|
+
/* Define to 1 if you have the <sys/eventfd.h> header file. */
|
71
|
+
/* #undef HAVE_SYS_EVENTFD_H */
|
72
|
+
|
73
|
+
/* Define to 1 if you have the <sys/event.h> header file. */
|
74
|
+
#define HAVE_SYS_EVENT_H 1
|
75
|
+
|
76
|
+
/* Define to 1 if you have the <sys/inotify.h> header file. */
|
77
|
+
/* #undef HAVE_SYS_INOTIFY_H */
|
78
|
+
|
79
|
+
/* Define to 1 if you have the <sys/queue.h> header file. */
|
80
|
+
#define HAVE_SYS_QUEUE_H 1
|
81
|
+
|
82
|
+
/* Define to 1 if you have the <sys/select.h> header file. */
|
83
|
+
#define HAVE_SYS_SELECT_H 1
|
84
|
+
|
85
|
+
/* Define to 1 if you have the <sys/stat.h> header file. */
|
86
|
+
#define HAVE_SYS_STAT_H 1
|
87
|
+
|
88
|
+
/* Define to 1 if you have the <sys/types.h> header file. */
|
89
|
+
#define HAVE_SYS_TYPES_H 1
|
90
|
+
|
91
|
+
/* Define to 1 if you have the <unistd.h> header file. */
|
92
|
+
#define HAVE_UNISTD_H 1
|
93
|
+
|
94
|
+
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
95
|
+
*/
|
96
|
+
#define LT_OBJDIR ".libs/"
|
97
|
+
|
98
|
+
/* Name of package */
|
99
|
+
#define PACKAGE "libev"
|
100
|
+
|
101
|
+
/* Define to the address where bug reports for this package should be sent. */
|
102
|
+
#define PACKAGE_BUGREPORT ""
|
103
|
+
|
104
|
+
/* Define to the full name of this package. */
|
105
|
+
#define PACKAGE_NAME ""
|
106
|
+
|
107
|
+
/* Define to the full name and version of this package. */
|
108
|
+
#define PACKAGE_STRING ""
|
109
|
+
|
110
|
+
/* Define to the one symbol short name of this package. */
|
111
|
+
#define PACKAGE_TARNAME ""
|
112
|
+
|
113
|
+
/* Define to the version of this package. */
|
114
|
+
#define PACKAGE_VERSION ""
|
115
|
+
|
116
|
+
/* Define to 1 if you have the ANSI C header files. */
|
117
|
+
#define STDC_HEADERS 1
|
118
|
+
|
119
|
+
/* Version number of package */
|
120
|
+
#define VERSION "3.9"
|
@@ -32,6 +32,7 @@
|
|
32
32
|
#include <fcntl.h>
|
33
33
|
#include <unistd.h>
|
34
34
|
#include <utime.h>
|
35
|
+
#include <sys/time.h>
|
35
36
|
|
36
37
|
|
37
38
|
#define ARGS1(a) (a)
|
@@ -40,28 +41,28 @@
|
|
40
41
|
#define ARGS4(a,b,c,d) (a), (b), (c), (d)
|
41
42
|
|
42
43
|
#define WRAP_EIO(type, eiofunc, func, args) \
|
43
|
-
uv_fs_req_init(loop, req, type, cb); \
|
44
|
+
uv_fs_req_init(loop, req, type, path, cb); \
|
44
45
|
if (cb) { \
|
45
46
|
/* async */ \
|
46
|
-
uv_ref(loop); \
|
47
47
|
req->eio = eiofunc(args, EIO_PRI_DEFAULT, uv__fs_after, req); \
|
48
48
|
if (!req->eio) { \
|
49
49
|
uv_err_new(loop, ENOMEM); \
|
50
50
|
return -1; \
|
51
51
|
} \
|
52
|
+
uv_ref(loop); \
|
52
53
|
} else { \
|
53
54
|
/* sync */ \
|
54
55
|
req->result = func(args); \
|
55
56
|
if (req->result) { \
|
56
57
|
uv_err_new(loop, errno); \
|
57
|
-
return -1; \
|
58
58
|
} \
|
59
|
+
return req->result; \
|
59
60
|
} \
|
60
61
|
return 0;
|
61
62
|
|
62
63
|
|
63
64
|
static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req, uv_fs_type fs_type,
|
64
|
-
uv_fs_cb cb) {
|
65
|
+
const char* path, uv_fs_cb cb) {
|
65
66
|
/* Make sure the thread pool is initialized. */
|
66
67
|
uv_eio_init(loop);
|
67
68
|
|
@@ -72,15 +73,20 @@ static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req, uv_fs_type fs_type,
|
|
72
73
|
req->cb = cb;
|
73
74
|
req->result = 0;
|
74
75
|
req->ptr = NULL;
|
76
|
+
req->path = path ? strdup(path) : NULL;
|
75
77
|
req->errorno = 0;
|
76
78
|
req->eio = NULL;
|
77
79
|
}
|
78
80
|
|
79
81
|
|
80
82
|
void uv_fs_req_cleanup(uv_fs_t* req) {
|
83
|
+
free(req->path);
|
84
|
+
req->path = NULL;
|
85
|
+
|
81
86
|
switch (req->fs_type) {
|
82
87
|
case UV_FS_READDIR:
|
83
|
-
assert(req->ptr)
|
88
|
+
assert((req->result == -1 && req->ptr == NULL)
|
89
|
+
|| (req->result >= 0 && req->ptr != NULL));
|
84
90
|
free(req->ptr);
|
85
91
|
req->ptr = NULL;
|
86
92
|
break;
|
@@ -106,13 +112,16 @@ static int uv__fs_after(eio_req* eio) {
|
|
106
112
|
assert(req->cb);
|
107
113
|
|
108
114
|
req->result = req->eio->result;
|
109
|
-
req->errorno = req->eio->errorno;
|
115
|
+
req->errorno = uv_translate_sys_error(req->eio->errorno);
|
110
116
|
|
111
117
|
switch (req->fs_type) {
|
112
118
|
case UV_FS_READDIR:
|
119
|
+
if (req->eio->result == -1)
|
120
|
+
break; /* opendir() or readdir() operation failed. */
|
121
|
+
|
113
122
|
/*
|
114
123
|
* XXX This is pretty bad.
|
115
|
-
* We alloc and copy the large null
|
124
|
+
* We alloc and copy the large null terminated string list from libeio.
|
116
125
|
* This is done because libeio is going to free eio->ptr2 after this
|
117
126
|
* callback. We must keep it until uv_fs_req_cleanup. If we get rid of
|
118
127
|
* libeio this can be avoided.
|
@@ -130,12 +139,31 @@ static int uv__fs_after(eio_req* eio) {
|
|
130
139
|
req->ptr = malloc(buflen);
|
131
140
|
memcpy(req->ptr, req->eio->ptr2, buflen);
|
132
141
|
break;
|
142
|
+
|
133
143
|
case UV_FS_STAT:
|
134
144
|
case UV_FS_LSTAT:
|
135
145
|
case UV_FS_FSTAT:
|
136
146
|
req->ptr = req->eio->ptr2;
|
137
147
|
break;
|
138
148
|
|
149
|
+
case UV_FS_READLINK:
|
150
|
+
if (req->result == -1) {
|
151
|
+
req->ptr = NULL;
|
152
|
+
} else {
|
153
|
+
assert(req->result > 0);
|
154
|
+
|
155
|
+
if ((name = realloc(req->eio->ptr2, req->result + 1)) == NULL) {
|
156
|
+
/* Not enough memory. Reuse buffer, chop off last byte. */
|
157
|
+
name = req->eio->ptr2;
|
158
|
+
req->result--;
|
159
|
+
}
|
160
|
+
|
161
|
+
name[req->result] = '\0';
|
162
|
+
req->ptr = name;
|
163
|
+
req->result = 0;
|
164
|
+
}
|
165
|
+
break;
|
166
|
+
|
139
167
|
default:
|
140
168
|
break;
|
141
169
|
}
|
@@ -149,13 +177,14 @@ static int uv__fs_after(eio_req* eio) {
|
|
149
177
|
|
150
178
|
|
151
179
|
int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
|
180
|
+
char* path = NULL;
|
152
181
|
WRAP_EIO(UV_FS_CLOSE, eio_close, close, ARGS1(file));
|
153
182
|
}
|
154
183
|
|
155
184
|
|
156
185
|
int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
|
157
186
|
int mode, uv_fs_cb cb) {
|
158
|
-
uv_fs_req_init(loop, req, UV_FS_OPEN, cb);
|
187
|
+
uv_fs_req_init(loop, req, UV_FS_OPEN, path, cb);
|
159
188
|
|
160
189
|
if (cb) {
|
161
190
|
/* async */
|
@@ -175,6 +204,8 @@ int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
|
|
175
204
|
}
|
176
205
|
|
177
206
|
uv__cloexec(req->result, 1);
|
207
|
+
|
208
|
+
return req->result;
|
178
209
|
}
|
179
210
|
|
180
211
|
return 0;
|
@@ -183,7 +214,7 @@ int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
|
|
183
214
|
|
184
215
|
int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file fd, void* buf,
|
185
216
|
size_t length, off_t offset, uv_fs_cb cb) {
|
186
|
-
uv_fs_req_init(loop, req, UV_FS_READ, cb);
|
217
|
+
uv_fs_req_init(loop, req, UV_FS_READ, NULL, cb);
|
187
218
|
|
188
219
|
if (cb) {
|
189
220
|
/* async */
|
@@ -206,6 +237,8 @@ int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file fd, void* buf,
|
|
206
237
|
uv_err_new(loop, errno);
|
207
238
|
return -1;
|
208
239
|
}
|
240
|
+
|
241
|
+
return req->result;
|
209
242
|
}
|
210
243
|
|
211
244
|
return 0;
|
@@ -219,7 +252,7 @@ int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
|
|
219
252
|
|
220
253
|
int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf,
|
221
254
|
size_t length, off_t offset, uv_fs_cb cb) {
|
222
|
-
uv_fs_req_init(loop, req, UV_FS_WRITE, cb);
|
255
|
+
uv_fs_req_init(loop, req, UV_FS_WRITE, NULL, cb);
|
223
256
|
|
224
257
|
if (cb) {
|
225
258
|
/* async */
|
@@ -241,6 +274,8 @@ int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf,
|
|
241
274
|
uv_err_new(loop, errno);
|
242
275
|
return -1;
|
243
276
|
}
|
277
|
+
|
278
|
+
return req->result;
|
244
279
|
}
|
245
280
|
|
246
281
|
return 0;
|
@@ -265,7 +300,7 @@ int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
|
|
265
300
|
size_t size = 0;
|
266
301
|
size_t d_namlen = 0;
|
267
302
|
|
268
|
-
uv_fs_req_init(loop, req, UV_FS_READDIR, cb);
|
303
|
+
uv_fs_req_init(loop, req, UV_FS_READDIR, path, cb);
|
269
304
|
|
270
305
|
if (cb) {
|
271
306
|
/* async */
|
@@ -281,25 +316,40 @@ int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
|
|
281
316
|
DIR* dir = opendir(path);
|
282
317
|
if (!dir) {
|
283
318
|
uv_err_new(loop, errno);
|
319
|
+
req->result = -1;
|
284
320
|
return -1;
|
285
321
|
}
|
286
322
|
|
323
|
+
/* req->result stores number of entries */
|
324
|
+
req->result = 0;
|
325
|
+
|
287
326
|
while ((entry = readdir(dir))) {
|
288
327
|
d_namlen = strlen(entry->d_name);
|
328
|
+
|
329
|
+
/* Skip . and .. */
|
330
|
+
if ((d_namlen == 1 && entry->d_name[0] == '.') ||
|
331
|
+
(d_namlen == 2 && entry->d_name[0] == '.' &&
|
332
|
+
entry->d_name[1] == '.')) {
|
333
|
+
continue;
|
334
|
+
}
|
335
|
+
|
289
336
|
req->ptr = realloc(req->ptr, size + d_namlen + 1);
|
290
337
|
/* TODO check ENOMEM */
|
291
|
-
/* TODO skip . and .. */
|
292
338
|
memcpy((char*)req->ptr + size, entry->d_name, d_namlen);
|
293
339
|
size += d_namlen;
|
294
340
|
((char*)req->ptr)[size] = '\0';
|
295
341
|
size++;
|
342
|
+
req->result++;
|
296
343
|
}
|
297
344
|
|
298
345
|
r = closedir(dir);
|
299
346
|
if (r) {
|
300
347
|
uv_err_new(loop, errno);
|
348
|
+
req->result = -1;
|
301
349
|
return -1;
|
302
350
|
}
|
351
|
+
|
352
|
+
return req->result;
|
303
353
|
}
|
304
354
|
|
305
355
|
return 0;
|
@@ -307,10 +357,10 @@ int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
|
|
307
357
|
|
308
358
|
|
309
359
|
int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
|
310
|
-
char* pathdup
|
360
|
+
char* pathdup;
|
311
361
|
int pathlen;
|
312
362
|
|
313
|
-
uv_fs_req_init(loop, req, UV_FS_STAT, cb);
|
363
|
+
uv_fs_req_init(loop, req, UV_FS_STAT, path, cb);
|
314
364
|
|
315
365
|
/* TODO do this without duplicating the string. */
|
316
366
|
/* TODO security */
|
@@ -346,6 +396,7 @@ int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
|
|
346
396
|
}
|
347
397
|
|
348
398
|
req->ptr = &req->statbuf;
|
399
|
+
return req->result;
|
349
400
|
}
|
350
401
|
|
351
402
|
return 0;
|
@@ -353,7 +404,7 @@ int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
|
|
353
404
|
|
354
405
|
|
355
406
|
int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
|
356
|
-
uv_fs_req_init(loop, req, UV_FS_FSTAT, cb);
|
407
|
+
uv_fs_req_init(loop, req, UV_FS_FSTAT, NULL, cb);
|
357
408
|
|
358
409
|
if (cb) {
|
359
410
|
/* async */
|
@@ -375,6 +426,7 @@ int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
|
|
375
426
|
}
|
376
427
|
|
377
428
|
req->ptr = &req->statbuf;
|
429
|
+
return req->result;
|
378
430
|
}
|
379
431
|
|
380
432
|
return 0;
|
@@ -388,23 +440,27 @@ int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* ne
|
|
388
440
|
|
389
441
|
|
390
442
|
int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
|
443
|
+
char* path = NULL;
|
391
444
|
WRAP_EIO(UV_FS_FSYNC, eio_fsync, fsync, ARGS1(file))
|
392
445
|
}
|
393
446
|
|
394
447
|
|
395
448
|
int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
|
449
|
+
char* path = NULL;
|
396
450
|
WRAP_EIO(UV_FS_FDATASYNC, eio_fdatasync, fdatasync, ARGS1(file))
|
397
451
|
}
|
398
452
|
|
399
453
|
|
400
454
|
int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, off_t offset,
|
401
455
|
uv_fs_cb cb) {
|
456
|
+
char* path = NULL;
|
402
457
|
WRAP_EIO(UV_FS_FTRUNCATE, eio_ftruncate, ftruncate, ARGS2(file, offset))
|
403
458
|
}
|
404
459
|
|
405
460
|
|
406
461
|
int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd,
|
407
462
|
off_t in_offset, size_t length, uv_fs_cb cb) {
|
463
|
+
char* path = NULL;
|
408
464
|
WRAP_EIO(UV_FS_SENDFILE, eio_sendfile, eio_sendfile_sync,
|
409
465
|
ARGS4(out_fd, in_fd, in_offset, length))
|
410
466
|
}
|
@@ -430,18 +486,42 @@ int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime,
|
|
430
486
|
}
|
431
487
|
|
432
488
|
|
489
|
+
#if defined(HAVE_FUTIMES)
|
490
|
+
static int _futime(const uv_file file, double atime, double mtime) {
|
491
|
+
struct timeval tv[2];
|
492
|
+
|
493
|
+
/* FIXME possible loss of precision in floating-point arithmetic? */
|
494
|
+
tv[0].tv_sec = atime;
|
495
|
+
tv[0].tv_usec = (unsigned long)(atime * 1000000) % 1000000;
|
496
|
+
|
497
|
+
tv[1].tv_sec = mtime;
|
498
|
+
tv[1].tv_usec = (unsigned long)(mtime * 1000000) % 1000000;
|
499
|
+
|
500
|
+
return futimes(file, tv);
|
501
|
+
}
|
502
|
+
#endif
|
503
|
+
|
504
|
+
|
433
505
|
int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime,
|
434
506
|
double mtime, uv_fs_cb cb) {
|
435
|
-
|
507
|
+
#if defined(HAVE_FUTIMES)
|
508
|
+
const char* path = NULL;
|
509
|
+
|
510
|
+
uv_fs_req_init(loop, req, UV_FS_FUTIME, path, cb);
|
511
|
+
|
512
|
+
WRAP_EIO(UV_FS_FUTIME, eio_futime, _futime, ARGS3(file, atime, mtime))
|
513
|
+
#else
|
514
|
+
uv_err_new(loop, ENOSYS);
|
436
515
|
return -1;
|
516
|
+
#endif
|
437
517
|
}
|
438
518
|
|
439
519
|
|
440
520
|
int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
|
441
|
-
char* pathdup
|
521
|
+
char* pathdup;
|
442
522
|
int pathlen;
|
443
523
|
|
444
|
-
uv_fs_req_init(loop, req, UV_FS_LSTAT, cb);
|
524
|
+
uv_fs_req_init(loop, req, UV_FS_LSTAT, path, cb);
|
445
525
|
|
446
526
|
/* TODO do this without duplicating the string. */
|
447
527
|
/* TODO security */
|
@@ -477,6 +557,7 @@ int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
|
|
477
557
|
}
|
478
558
|
|
479
559
|
req->ptr = &req->statbuf;
|
560
|
+
return req->result;
|
480
561
|
}
|
481
562
|
|
482
563
|
return 0;
|
@@ -490,20 +571,68 @@ int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path,
|
|
490
571
|
|
491
572
|
|
492
573
|
int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
|
493
|
-
const char* new_path, uv_fs_cb cb) {
|
574
|
+
const char* new_path, int flags, uv_fs_cb cb) {
|
494
575
|
WRAP_EIO(UV_FS_SYMLINK, eio_symlink, symlink, ARGS2(path, new_path))
|
495
576
|
}
|
496
577
|
|
497
578
|
|
498
579
|
int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
|
499
580
|
uv_fs_cb cb) {
|
500
|
-
|
501
|
-
|
581
|
+
ssize_t size;
|
582
|
+
int status;
|
583
|
+
char* buf;
|
584
|
+
|
585
|
+
status = -1;
|
586
|
+
|
587
|
+
uv_fs_req_init(loop, req, UV_FS_READLINK, path, cb);
|
588
|
+
|
589
|
+
if (cb) {
|
590
|
+
if ((req->eio = eio_readlink(path, EIO_PRI_DEFAULT, uv__fs_after, req))) {
|
591
|
+
uv_ref(loop);
|
592
|
+
return 0;
|
593
|
+
} else {
|
594
|
+
uv_err_new(loop, ENOMEM);
|
595
|
+
return -1;
|
596
|
+
}
|
597
|
+
} else {
|
598
|
+
/* pathconf(_PC_PATH_MAX) may return -1 to signify that path
|
599
|
+
* lengths have no upper limit or aren't suitable for malloc'ing.
|
600
|
+
*/
|
601
|
+
if ((size = pathconf(path, _PC_PATH_MAX)) == -1) {
|
602
|
+
#if defined(PATH_MAX)
|
603
|
+
size = PATH_MAX;
|
604
|
+
#else
|
605
|
+
size = 4096;
|
606
|
+
#endif
|
607
|
+
}
|
608
|
+
|
609
|
+
if ((buf = malloc(size + 1)) == NULL) {
|
610
|
+
uv_err_new(loop, ENOMEM);
|
611
|
+
return -1;
|
612
|
+
}
|
613
|
+
|
614
|
+
if ((size = readlink(path, buf, size)) == -1) {
|
615
|
+
req->errorno = errno;
|
616
|
+
req->result = -1;
|
617
|
+
free(buf);
|
618
|
+
} else {
|
619
|
+
/* Cannot conceivably fail since it shrinks the buffer. */
|
620
|
+
buf = realloc(buf, size + 1);
|
621
|
+
buf[size] = '\0';
|
622
|
+
req->result = 0;
|
623
|
+
req->ptr = buf;
|
624
|
+
}
|
625
|
+
|
626
|
+
return req->result;
|
627
|
+
}
|
628
|
+
|
629
|
+
assert(0 && "unreachable");
|
502
630
|
}
|
503
631
|
|
504
632
|
|
505
633
|
int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode,
|
506
634
|
uv_fs_cb cb) {
|
635
|
+
char* path = NULL;
|
507
636
|
WRAP_EIO(UV_FS_FCHMOD, eio_fchmod, fchmod, ARGS2(file, mode))
|
508
637
|
}
|
509
638
|
|
@@ -516,6 +645,7 @@ int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, int uid,
|
|
516
645
|
|
517
646
|
int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, int uid, int gid,
|
518
647
|
uv_fs_cb cb) {
|
648
|
+
char* path = NULL;
|
519
649
|
WRAP_EIO(UV_FS_FCHOWN, eio_fchown, fchown, ARGS3(file, uid, gid))
|
520
650
|
}
|
521
651
|
|