noderb 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/ext/noderb_extension/extconf.rb +15 -11
  2. data/ext/noderb_extension/libuv/AUTHORS +3 -0
  3. data/ext/noderb_extension/libuv/{README → README.md} +48 -6
  4. data/ext/noderb_extension/libuv/common.gypi +6 -1
  5. data/ext/noderb_extension/libuv/config-unix.mk +1 -1
  6. data/ext/noderb_extension/libuv/include/uv-private/uv-linux.h +29 -0
  7. data/ext/noderb_extension/libuv/include/uv-private/uv-unix.h +9 -0
  8. data/ext/noderb_extension/libuv/include/uv-private/uv-win.h +38 -3
  9. data/ext/noderb_extension/libuv/include/uv.h +55 -3
  10. data/ext/noderb_extension/libuv/src/unix/cares.c +1 -0
  11. data/ext/noderb_extension/libuv/src/unix/core.c +20 -4
  12. data/ext/noderb_extension/libuv/src/unix/cygwin.c +16 -0
  13. data/ext/noderb_extension/libuv/src/unix/darwin.c +18 -0
  14. data/ext/noderb_extension/libuv/src/unix/freebsd.c +18 -1
  15. data/ext/noderb_extension/libuv/src/unix/fs.c +18 -9
  16. data/ext/noderb_extension/libuv/src/unix/internal.h +24 -0
  17. data/ext/noderb_extension/libuv/src/unix/linux.c +133 -1
  18. data/ext/noderb_extension/libuv/src/unix/netbsd.c +18 -1
  19. data/ext/noderb_extension/libuv/src/unix/stream.c +21 -7
  20. data/ext/noderb_extension/libuv/src/unix/sunos.c +18 -1
  21. data/ext/noderb_extension/libuv/src/unix/tty.c +41 -0
  22. data/ext/noderb_extension/libuv/src/unix/udp.c +1 -0
  23. data/ext/noderb_extension/libuv/src/win/core.c +3 -0
  24. data/ext/noderb_extension/libuv/src/win/fs-event.c +384 -0
  25. data/ext/noderb_extension/libuv/src/win/getaddrinfo.c +7 -2
  26. data/ext/noderb_extension/libuv/src/win/handle.c +41 -0
  27. data/ext/noderb_extension/libuv/src/win/internal.h +36 -0
  28. data/ext/noderb_extension/libuv/src/win/pipe.c +3 -0
  29. data/ext/noderb_extension/libuv/src/win/process.c +7 -2
  30. data/ext/noderb_extension/libuv/src/win/req.c +10 -0
  31. data/ext/noderb_extension/libuv/src/win/stream.c +10 -3
  32. data/ext/noderb_extension/libuv/src/win/tcp.c +3 -1
  33. data/ext/noderb_extension/libuv/src/win/tty.c +1559 -5
  34. data/ext/noderb_extension/libuv/test/benchmark-getaddrinfo.c +2 -0
  35. data/ext/noderb_extension/libuv/test/runner-unix.c +2 -0
  36. data/ext/noderb_extension/libuv/test/test-fs-event.c +217 -0
  37. data/ext/noderb_extension/libuv/test/test-fs.c +0 -4
  38. data/ext/noderb_extension/libuv/test/test-getaddrinfo.c +7 -3
  39. data/ext/noderb_extension/libuv/test/test-list.h +23 -0
  40. data/ext/noderb_extension/libuv/test/test-tcp-close.c +47 -0
  41. data/ext/noderb_extension/libuv/test/test-tcp-write-error.c +168 -0
  42. data/ext/noderb_extension/libuv/test/test-timer.c +40 -0
  43. data/ext/noderb_extension/libuv/test/test-tty.c +56 -0
  44. data/ext/noderb_extension/libuv/uv.gyp +17 -18
  45. data/ext/noderb_extension/noderb.c +0 -2
  46. data/ext/noderb_extension/noderb_dns.c +6 -7
  47. data/ext/noderb_extension/noderb_fs.c +11 -10
  48. data/ext/noderb_extension/noderb_timers.c +5 -5
  49. data/lib/noderb/version.rb +1 -1
  50. metadata +8 -3
@@ -1,20 +1,24 @@
1
1
  require "mkmf"
2
2
 
3
- cflags = " -shared -fPIC "
3
+ cflags = "-shared -fPIC"
4
+ ldflags = ""
4
5
 
5
- if $solaris
6
- cflags = " -G -fPIC "
7
- # From EventMachine
8
- CONFIG['LDSHARED'] = "$(CXX) -G -fPIC"
9
- if CONFIG['CC'] == 'cc'
10
- cflags = "-g -O2 -fPIC"
11
- CONFIG['CCDLFLAGS'] = "-fPIC"
12
- end
6
+ case RUBY_PLATFORM
7
+ when /solaris/
8
+ cflags = " -G -fPIC "
9
+ CONFIG['LDSHARED'] = "$(CXX) -G -fPIC"
10
+ if CONFIG['CC'] == 'cc'
11
+ cflags = "-g -O2 -fPIC"
12
+ CONFIG['CCDLFLAGS'] = "-fPIC"
13
+ end
14
+ when /darwin/
15
+ ldflags = "-framework CoreServices"
13
16
  end
14
17
 
15
- $CFLAGS = CONFIG['CFLAGS'] = cflags
18
+ $CFLAGS = CONFIG['CFLAGS'] = " #{cflags} "
19
+ $LDFLAGS = CONFIG['LDFLAGS'] = " #{ldflags} "
16
20
 
17
- `cd libuv; CPPFLAGS="#{cflags}" make; cd ..; cp libuv/uv.a libuv.a` # libuv does not respond to CFLAGS anymore
21
+ `cd libuv; CFLAGS="#{cflags}" make; cd ..; cp libuv/uv.a libuv.a`
18
22
 
19
23
  dir_config("uv", File.expand_path("../libuv/include", __FILE__), File.expand_path("../libuv", __FILE__))
20
24
 
@@ -21,3 +21,6 @@ Clifford Heath <clifford.heath@gmail.com>
21
21
  Jorge Chamorro Bieling <jorge@jorgechamorro.com>
22
22
  Luis Lavena <luislavena@gmail.com>
23
23
  Matthew Sporleder <msporleder@gmail.com>
24
+ Erick Tryzelaar <erick.tryzelaar@gmail.com>
25
+ Isaac Z. Schlueter <i@izs.me>
26
+ Pieter Noordhuis <pcnoordhuis@gmail.com>
@@ -1,10 +1,52 @@
1
- This is the new networking layer for Node. Its purpose is to abstract
2
- IOCP on windows and libev on Unix systems. We intend to eventually contain
3
- all platform differences in this library.
1
+ # libuv
2
+
3
+ libuv is a new platform layer for Node. Its purpose is to abstract IOCP on
4
+ windows and libev on Unix systems. We intend to eventually contain all
5
+ platform differences in this library.
4
6
 
5
7
  http://nodejs.org/
6
8
 
7
- = Build Instructions
9
+ ## Features
10
+
11
+ Implemented:
12
+
13
+ * Non-blocking TCP sockets
14
+
15
+ * Non-blocking named pipes
16
+
17
+ * UDP
18
+
19
+ * Timers
20
+
21
+ * Child process spawning
22
+
23
+ * Asynchronous DNS via c-ares or `uv_getaddrinfo`.
24
+
25
+ * Asynchronous file system APIs `uv_fs_*`
26
+
27
+ * High resolution time `uv_hrtime`
28
+
29
+ * Current executable path look up `uv_exepath`
30
+
31
+ * Thread pool scheduling `uv_queue_work`
32
+
33
+ In-progress:
34
+
35
+ * File system events (Currently supports inotify, `ReadDirectoryChangesW`
36
+ and will support kqueue and event ports in the near future.)
37
+ `uv_fs_event_t`
38
+
39
+ * VT100 TTY `uv_tty_t`
40
+
41
+ * Socket sharing between processes `uv_ipc_t`
42
+
43
+
44
+ ## Documentation
45
+
46
+ See `include/uv.h`.
47
+
48
+
49
+ ## Build Instructions
8
50
 
9
51
  For GCC (including MinGW) there are two methods building: via normal
10
52
  makefiles or via GYP. GYP is a meta-build system which can generate MSVS,
@@ -19,7 +61,7 @@ To build with Visual Studio run the vcbuilds.bat file which will
19
61
  checkout the GYP code into build/gyp and generate the uv.sln and
20
62
  related files.
21
63
 
22
- Windows users can also build from cmd-line using msbuild. This is
64
+ Windows users can also build from cmd-line using msbuild. This is
23
65
  done by running vcbuild.bat from Visual Studio command prompt.
24
66
 
25
67
  To have GYP generate build script for another system you will need to
@@ -38,7 +80,7 @@ Macintosh users run
38
80
  xcodebuild -project uv.xcodeproj -configuration Release -target All
39
81
 
40
82
 
41
- = Supported Platforms
83
+ ## Supported Platforms
42
84
 
43
85
  Microsoft Windows operating systems since Windows XP SP2. It can be built
44
86
  with either Visual Studio or MinGW.
@@ -32,6 +32,11 @@
32
32
  'LinkIncremental': 2, # enable incremental linking
33
33
  },
34
34
  },
35
+ 'conditions': [
36
+ ['OS != "win"', {
37
+ 'defines': [ 'EV_VERIFY=2' ],
38
+ }],
39
+ ]
35
40
  },
36
41
  'Release': {
37
42
  'defines': [ 'NDEBUG' ],
@@ -113,7 +118,7 @@
113
118
  'cflags_cc': [ '-fno-rtti', '-fno-exceptions' ],
114
119
  'ldflags': [ '-pthread', ],
115
120
  'conditions': [
116
- [ 'target_arch=="ia32"', {
121
+ [ 'host_arch != target_arch and target_arch=="ia32"', {
117
122
  'cflags': [ '-m32' ],
118
123
  'ldflags': [ '-m32' ],
119
124
  }],
@@ -22,7 +22,7 @@ CC = $(PREFIX)gcc
22
22
  AR = $(PREFIX)ar
23
23
  E=
24
24
  CSTDFLAG=--std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter
25
- CFLAGS=-g
25
+ CFLAGS += -g
26
26
  CPPFLAGS += -Isrc/unix/ev
27
27
  LINKFLAGS=-lm
28
28
 
@@ -0,0 +1,29 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ *
3
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ * of this software and associated documentation files (the "Software"), to
5
+ * deal in the Software without restriction, including without limitation the
6
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ * sell copies of the Software, and to permit persons to whom the Software is
8
+ * furnished to do so, subject to the following conditions:
9
+ *
10
+ * The above copyright notice and this permission notice shall be included in
11
+ * all copies or substantial portions of the Software.
12
+ *
13
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ * IN THE SOFTWARE.
20
+ */
21
+
22
+ #ifndef UV_LINUX_H
23
+ #define UV_LINUX_H
24
+
25
+ #define UV_FS_EVENT_PRIVATE_FIELDS \
26
+ ev_io read_watcher; \
27
+ uv_fs_event_cb cb; \
28
+
29
+ #endif /* UV_LINUX_H */
@@ -27,6 +27,10 @@
27
27
  #include "ev.h"
28
28
  #include "eio.h"
29
29
 
30
+ #if defined(__linux__)
31
+ #include "uv-private/uv-linux.h"
32
+ #endif
33
+
30
34
  #include <sys/types.h>
31
35
  #include <sys/socket.h>
32
36
  #include <netdb.h>
@@ -42,6 +46,11 @@ typedef struct {
42
46
 
43
47
  typedef int uv_file;
44
48
 
49
+ /* Stub. Remove it once all platforms support the file watcher API. */
50
+ #ifndef UV_FS_EVENT_PRIVATE_FIELDS
51
+ #define UV_FS_EVENT_PRIVATE_FIELDS /* empty */
52
+ #endif
53
+
45
54
  #define UV_LOOP_PRIVATE_FIELDS \
46
55
  ares_channel channel; \
47
56
  /* \
@@ -86,7 +86,8 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s);
86
86
  UV_GETADDRINFO_REQ, \
87
87
  UV_PROCESS_EXIT, \
88
88
  UV_PROCESS_CLOSE, \
89
- UV_UDP_RECV
89
+ UV_UDP_RECV, \
90
+ UV_FS_EVENT_REQ
90
91
 
91
92
  #define UV_REQ_PRIVATE_FIELDS \
92
93
  union { \
@@ -116,6 +117,7 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s);
116
117
  HANDLE pipeHandle; \
117
118
  struct uv_pipe_accept_s* next_pending; \
118
119
  } uv_pipe_accept_t; \
120
+ \
119
121
  typedef struct uv_tcp_accept_s { \
120
122
  UV_REQ_FIELDS \
121
123
  SOCKET accept_socket; \
@@ -180,6 +182,31 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s);
180
182
  struct { uv_pipe_connection_fields }; \
181
183
  };
182
184
 
185
+ /* TODO: put the parser states in an union - TTY handles are always */
186
+ /* half-duplex so read-state can safely overlap write-state. */
187
+ #define UV_TTY_PRIVATE_FIELDS \
188
+ HANDLE handle; \
189
+ HANDLE read_line_handle; \
190
+ uv_buf_t read_line_buffer; \
191
+ HANDLE read_raw_wait; \
192
+ DWORD original_console_mode; \
193
+ /* Fields used for translating win */ \
194
+ /* keystrokes into vt100 characters */ \
195
+ char last_key[8]; \
196
+ unsigned char last_key_offset; \
197
+ unsigned char last_key_len; \
198
+ INPUT_RECORD last_input_record; \
199
+ WCHAR last_utf16_high_surrogate; \
200
+ /* utf8-to-utf16 conversion state */ \
201
+ unsigned char utf8_bytes_left; \
202
+ unsigned int utf8_codepoint; \
203
+ /* eol conversion state */ \
204
+ unsigned char previous_eol; \
205
+ /* ansi parser state */ \
206
+ unsigned char ansi_parser_state; \
207
+ unsigned char ansi_csi_argc; \
208
+ unsigned short ansi_csi_argv[4];
209
+
183
210
  #define UV_TIMER_PRIVATE_FIELDS \
184
211
  RB_ENTRY(uv_timer_s) tree_entry; \
185
212
  int64_t due; \
@@ -261,8 +288,16 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s);
261
288
 
262
289
  #define UV_WORK_PRIVATE_FIELDS \
263
290
 
264
-
265
- #define UV_TTY_PRIVATE_FIELDS /* empty */
291
+ #define UV_FS_EVENT_PRIVATE_FIELDS \
292
+ struct uv_fs_event_req_s { \
293
+ UV_REQ_FIELDS \
294
+ } req; \
295
+ HANDLE dir_handle; \
296
+ int req_pending; \
297
+ uv_fs_event_cb cb; \
298
+ wchar_t* filew; \
299
+ int is_path_dir; \
300
+ char* buffer;
266
301
 
267
302
  int uv_utf16_to_utf8(const wchar_t* utf16Buffer, size_t utf16Size,
268
303
  char* utf8Buffer, size_t utf8Size);
@@ -65,6 +65,8 @@ typedef struct uv_write_s uv_write_t;
65
65
  typedef struct uv_connect_s uv_connect_t;
66
66
  typedef struct uv_udp_send_s uv_udp_send_t;
67
67
  typedef struct uv_fs_s uv_fs_t;
68
+ /* uv_fs_event_t is a subclass of uv_handle_t. */
69
+ typedef struct uv_fs_event_s uv_fs_event_t;
68
70
  typedef struct uv_work_s uv_work_t;
69
71
 
70
72
  #if defined(__unix__) || defined(__POSIX__) || defined(__APPLE__)
@@ -137,6 +139,15 @@ typedef void (*uv_fs_cb)(uv_fs_t* req);
137
139
  typedef void (*uv_work_cb)(uv_work_t* req);
138
140
  typedef void (*uv_after_work_cb)(uv_work_t* req);
139
141
 
142
+ /*
143
+ * This will be called repeatedly after the uv_fs_event_t is initialized.
144
+ * If uv_fs_event_t was initialized with a directory the filename parameter
145
+ * will be a relative path to a file contained in the directory.
146
+ * The events paramenter is an ORed mask of enum uv_fs_event elements.
147
+ */
148
+ typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename,
149
+ int events, int status);
150
+
140
151
 
141
152
  /* Expand this list if necessary. */
142
153
  typedef enum {
@@ -201,7 +212,8 @@ typedef enum {
201
212
  UV_ASYNC,
202
213
  UV_ARES_TASK,
203
214
  UV_ARES_EVENT,
204
- UV_PROCESS
215
+ UV_PROCESS,
216
+ UV_FS_EVENT
205
217
  } uv_handle_type;
206
218
 
207
219
  typedef enum {
@@ -607,6 +619,18 @@ int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd);
607
619
  */
608
620
  int uv_tty_set_mode(uv_tty_t*, int mode);
609
621
 
622
+ /*
623
+ * Gets the current Window size. On success zero is returned.
624
+ */
625
+ int uv_tty_get_winsize(uv_tty_t*, int* width, int* height);
626
+
627
+ /*
628
+ * Used to detect what type of stream should be used with a given file
629
+ * descriptor. Usually this will be used during initialization to guess the
630
+ * type of the stdio streams.
631
+ * For isatty() functionality use this function and test for UV_TTY.
632
+ */
633
+ uv_handle_type uv_guess_handle(uv_file file);
610
634
 
611
635
  /*
612
636
  * uv_pipe_t is a subclass of uv_stream_t
@@ -779,8 +803,10 @@ struct uv_getaddrinfo_s {
779
803
  *
780
804
  * Return code 0 means that request is accepted and callback will be called
781
805
  * with result. Other return codes mean that there will not be a callback.
782
- * Input arguments may be released after return from this call. Callback
783
- * must not call freeaddrinfo.
806
+ * Input arguments may be released after return from this call.
807
+ *
808
+ * uv_freeaddrinfo() must be called after completion to free the addrinfo
809
+ * structure.
784
810
  */
785
811
  int uv_getaddrinfo(uv_loop_t*,
786
812
  uv_getaddrinfo_t* handle,
@@ -789,6 +815,8 @@ struct uv_getaddrinfo_s {
789
815
  const char* service,
790
816
  const struct addrinfo* hints);
791
817
 
818
+ void uv_freeaddrinfo(struct addrinfo* ai);
819
+
792
820
  /* uv_spawn() options */
793
821
  typedef struct uv_process_options_s {
794
822
  uv_exit_cb exit_cb; /* Called after the process exits. */
@@ -997,6 +1025,27 @@ int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, int uid,
997
1025
  int gid, uv_fs_cb cb);
998
1026
 
999
1027
 
1028
+ enum uv_fs_event {
1029
+ UV_RENAME = 1,
1030
+ UV_CHANGE = 2
1031
+ };
1032
+
1033
+
1034
+ struct uv_fs_event_s {
1035
+ UV_HANDLE_FIELDS
1036
+ char* filename;
1037
+ UV_FS_EVENT_PRIVATE_FIELDS
1038
+ };
1039
+
1040
+
1041
+ /*
1042
+ * If filename is a directory then we will watch for all events in that
1043
+ * directory. If filename is a file - we will only get events from that
1044
+ * file. Subdirectories are not watched.
1045
+ */
1046
+ int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle,
1047
+ const char* filename, uv_fs_event_cb cb);
1048
+
1000
1049
  /* Utility */
1001
1050
 
1002
1051
  /* Convert string ip addresses to binary structures */
@@ -1032,6 +1081,7 @@ union uv_any_handle {
1032
1081
  uv_async_t async;
1033
1082
  uv_timer_t timer;
1034
1083
  uv_getaddrinfo_t getaddrinfo;
1084
+ uv_fs_event_t fs_event;
1035
1085
  };
1036
1086
 
1037
1087
  union uv_any_req {
@@ -1059,6 +1109,7 @@ struct uv_counters_s {
1059
1109
  uint64_t async_init;
1060
1110
  uint64_t timer_init;
1061
1111
  uint64_t process_init;
1112
+ uint64_t fs_event_init;
1062
1113
  };
1063
1114
 
1064
1115
 
@@ -1092,6 +1143,7 @@ struct uv_loop_s {
1092
1143
  #undef UV_GETADDRINFO_PRIVATE_FIELDS
1093
1144
  #undef UV_FS_REQ_PRIVATE_FIELDS
1094
1145
  #undef UV_WORK_PRIVATE_FIELDS
1146
+ #undef UV_FS_EVENT_PRIVATE_FIELDS
1095
1147
 
1096
1148
  #ifdef __cplusplus
1097
1149
  }
@@ -67,6 +67,7 @@ static uv_ares_task_t* uv__ares_task_create(int fd) {
67
67
 
68
68
  if (h == NULL) {
69
69
  uv_fatal_error(ENOMEM, "malloc");
70
+ return NULL;
70
71
  }
71
72
 
72
73
  h->sock = fd;
@@ -79,6 +79,7 @@ void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
79
79
  uv_pipe_cleanup((uv_pipe_t*)handle);
80
80
  /* Fall through. */
81
81
 
82
+ case UV_TTY:
82
83
  case UV_TCP:
83
84
  stream = (uv_stream_t*)handle;
84
85
 
@@ -136,6 +137,10 @@ void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
136
137
  ev_child_stop(process->loop->ev, &process->child_watcher);
137
138
  break;
138
139
 
140
+ case UV_FS_EVENT:
141
+ uv__fs_event_destroy((uv_fs_event_t*)handle);
142
+ break;
143
+
139
144
  default:
140
145
  assert(0);
141
146
  }
@@ -231,6 +236,7 @@ void uv__finish_close(uv_handle_t* handle) {
231
236
 
232
237
  case UV_NAMED_PIPE:
233
238
  case UV_TCP:
239
+ case UV_TTY:
234
240
  assert(!ev_is_active(&((uv_stream_t*)handle)->read_watcher));
235
241
  assert(!ev_is_active(&((uv_stream_t*)handle)->write_watcher));
236
242
  assert(((uv_stream_t*)handle)->fd == -1);
@@ -248,6 +254,9 @@ void uv__finish_close(uv_handle_t* handle) {
248
254
  assert(!ev_is_active(&((uv_process_t*)handle)->child_watcher));
249
255
  break;
250
256
 
257
+ case UV_FS_EVENT:
258
+ break;
259
+
251
260
  default:
252
261
  assert(0);
253
262
  break;
@@ -575,6 +584,8 @@ int64_t uv_timer_get_repeat(uv_timer_t* timer) {
575
584
 
576
585
  static int uv_getaddrinfo_done(eio_req* req) {
577
586
  uv_getaddrinfo_t* handle = req->data;
587
+ struct addrinfo *res = handle->res;
588
+ handle->res = NULL;
578
589
 
579
590
  uv_unref(handle->loop);
580
591
 
@@ -587,10 +598,7 @@ static int uv_getaddrinfo_done(eio_req* req) {
587
598
  uv_err_new(handle->loop, handle->retcode);
588
599
  }
589
600
 
590
- handle->cb(handle, handle->retcode, handle->res);
591
-
592
- freeaddrinfo(handle->res);
593
- handle->res = NULL;
601
+ handle->cb(handle, handle->retcode, res);
594
602
 
595
603
  return 0;
596
604
  }
@@ -633,6 +641,9 @@ int uv_getaddrinfo(uv_loop_t* loop,
633
641
  handle->hints = malloc(sizeof(struct addrinfo));
634
642
  memcpy(&handle->hints, hints, sizeof(struct addrinfo));
635
643
  }
644
+ else {
645
+ handle->hints = NULL;
646
+ }
636
647
 
637
648
  /* TODO security! check lengths, check return values. */
638
649
 
@@ -655,6 +666,11 @@ int uv_getaddrinfo(uv_loop_t* loop,
655
666
  }
656
667
 
657
668
 
669
+ void uv_freeaddrinfo(struct addrinfo* ai) {
670
+ freeaddrinfo(ai);
671
+ }
672
+
673
+
658
674
  /* Open a socket in non-blocking close-on-exec mode, atomically if possible. */
659
675
  int uv__socket(int domain, int type, int protocol) {
660
676
  #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC)
@@ -20,8 +20,10 @@
20
20
 
21
21
  #include "uv.h"
22
22
 
23
+ #include <assert.h>
23
24
  #include <stdint.h>
24
25
  #include <stddef.h>
26
+ #include <errno.h>
25
27
  #include <time.h>
26
28
 
27
29
  #undef NANOSEC
@@ -50,3 +52,17 @@ int uv_exepath(char* buffer, size_t* size) {
50
52
  buffer[*size] = '\0';
51
53
  return 0;
52
54
  }
55
+
56
+
57
+ int uv_fs_event_init(uv_loop_t* loop,
58
+ uv_fs_event_t* handle,
59
+ const char* filename,
60
+ uv_fs_event_cb cb) {
61
+ uv_err_new(loop, ENOSYS);
62
+ return -1;
63
+ }
64
+
65
+
66
+ void uv__fs_event_destroy(uv_fs_event_t* handle) {
67
+ assert(0 && "implement me");
68
+ }
@@ -19,8 +19,12 @@
19
19
  */
20
20
 
21
21
  #include "uv.h"
22
+ #include "internal.h"
22
23
 
24
+ #include <assert.h>
23
25
  #include <stdint.h>
26
+ #include <errno.h>
27
+
24
28
  #include <CoreServices/CoreServices.h>
25
29
  #include <mach/mach.h>
26
30
  #include <mach/mach_time.h>
@@ -63,3 +67,17 @@ int uv_exepath(char* buffer, size_t* size) {
63
67
  *size = strlen(buffer);
64
68
  return 0;
65
69
  }
70
+
71
+
72
+ int uv_fs_event_init(uv_loop_t* loop,
73
+ uv_fs_event_t* handle,
74
+ const char* filename,
75
+ uv_fs_event_cb cb) {
76
+ uv_err_new(loop, ENOSYS);
77
+ return -1;
78
+ }
79
+
80
+
81
+ void uv__fs_event_destroy(uv_fs_event_t* handle) {
82
+ assert(0 && "implement me");
83
+ }
@@ -20,15 +20,18 @@
20
20
 
21
21
  #include "uv.h"
22
22
 
23
+ #include <assert.h>
23
24
  #include <string.h>
24
- #include <time.h>
25
+ #include <errno.h>
25
26
 
26
27
  #include <sys/types.h>
27
28
  #include <sys/sysctl.h>
29
+ #include <time.h>
28
30
 
29
31
  #undef NANOSEC
30
32
  #define NANOSEC 1000000000
31
33
 
34
+
32
35
  uint64_t uv_hrtime(void) {
33
36
  struct timespec ts;
34
37
  clock_gettime(CLOCK_MONOTONIC, &ts);
@@ -63,3 +66,17 @@ int uv_exepath(char* buffer, size_t* size) {
63
66
 
64
67
  return 0;
65
68
  }
69
+
70
+
71
+ int uv_fs_event_init(uv_loop_t* loop,
72
+ uv_fs_event_t* handle,
73
+ const char* filename,
74
+ uv_fs_event_cb cb) {
75
+ uv_err_new(loop, ENOSYS);
76
+ return -1;
77
+ }
78
+
79
+
80
+ void uv__fs_event_destroy(uv_fs_event_t* handle) {
81
+ assert(0 && "implement me");
82
+ }
@@ -149,19 +149,20 @@ static int uv__fs_after(eio_req* eio) {
149
149
  case UV_FS_READLINK:
150
150
  if (req->result == -1) {
151
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
- }
152
+ break;
153
+ }
154
+ assert(req->result > 0);
160
155
 
156
+ /* Make zero-terminated copy of req->eio->ptr2 */
157
+ if ((req->ptr = name = malloc(req->result + 1))) {
158
+ memcpy(name, req->eio->ptr2, req->result);
161
159
  name[req->result] = '\0';
162
- req->ptr = name;
163
160
  req->result = 0;
164
161
  }
162
+ else {
163
+ req->errorno = ENOMEM;
164
+ req->result = -1;
165
+ }
165
166
  break;
166
167
 
167
168
  default:
@@ -447,7 +448,15 @@ int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
447
448
 
448
449
  int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
449
450
  char* path = NULL;
451
+ #if defined(__FreeBSD__) \
452
+ || (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060)
453
+ /* freebsd and pre-10.6 darwin don't have fdatasync,
454
+ * do a full fsync instead.
455
+ */
456
+ WRAP_EIO(UV_FS_FDATASYNC, eio_fdatasync, fsync, ARGS1(file))
457
+ #else
450
458
  WRAP_EIO(UV_FS_FDATASYNC, eio_fdatasync, fdatasync, ARGS1(file))
459
+ #endif
451
460
  }
452
461
 
453
462
 
@@ -25,6 +25,8 @@
25
25
  #include "uv-common.h"
26
26
  #include "uv-eio.h"
27
27
 
28
+ #include <stddef.h> /* offsetof */
29
+
28
30
  #if defined(__linux__)
29
31
 
30
32
  #include <linux/version.h>
@@ -51,6 +53,25 @@
51
53
 
52
54
  #endif /* __linux__ */
53
55
 
56
+ #ifdef __APPLE__
57
+ # define HAVE_FUTIMES
58
+ #endif
59
+
60
+ #ifdef __FreeBSD__
61
+ # define HAVE_FUTIMES
62
+ #endif
63
+
64
+ #define container_of(ptr, type, member) \
65
+ ((type *) ((char *) (ptr) - offsetof(type, member)))
66
+
67
+ #define SAVE_ERRNO(block) \
68
+ do { \
69
+ int _saved_errno = errno; \
70
+ do { block; } while (0); \
71
+ errno = _saved_errno; \
72
+ } \
73
+ while (0);
74
+
54
75
  /* flags */
55
76
  enum {
56
77
  UV_CLOSING = 0x00000001, /* uv_close() called but not finished. */
@@ -102,4 +123,7 @@ int uv_pipe_cleanup(uv_pipe_t* handle);
102
123
  void uv__udp_destroy(uv_udp_t* handle);
103
124
  void uv__udp_watcher_stop(uv_udp_t* handle, ev_io* w);
104
125
 
126
+ /* fs */
127
+ void uv__fs_event_destroy(uv_fs_event_t* handle);
128
+
105
129
  #endif /* UV_UNIX_INTERNAL_H_ */