noderb 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/README.md +157 -7
  2. data/ext/noderb_extension/extconf.rb +1 -3
  3. data/ext/noderb_extension/libuv/BSDmakefile +2 -0
  4. data/ext/noderb_extension/libuv/all.gyp +326 -0
  5. data/ext/noderb_extension/libuv/config-mingw.mk +0 -1
  6. data/ext/noderb_extension/libuv/config-unix.mk +7 -1
  7. data/ext/noderb_extension/libuv/create-msvs-files.bat +13 -6
  8. data/ext/noderb_extension/libuv/{build/gyp_uv → gyp_uv} +1 -2
  9. data/ext/noderb_extension/libuv/include/uv.h +5 -0
  10. data/ext/noderb_extension/libuv/src/eio/config_cygwin.h +3 -0
  11. data/ext/noderb_extension/libuv/src/eio/config_freebsd.h +3 -0
  12. data/ext/noderb_extension/libuv/src/eio/config_sunos.h +3 -0
  13. data/ext/noderb_extension/libuv/src/eio/ecb.h +1 -1
  14. data/ext/noderb_extension/libuv/src/eio/eio.c +8 -1
  15. data/ext/noderb_extension/libuv/src/uv-common.c +1 -0
  16. data/ext/noderb_extension/libuv/src/uv-sunos.c +1 -1
  17. data/ext/noderb_extension/libuv/src/uv-unix.c +72 -59
  18. data/ext/noderb_extension/libuv/src/win/core.c +3 -0
  19. data/ext/noderb_extension/libuv/src/win/internal.h +11 -0
  20. data/ext/noderb_extension/libuv/src/win/ntdll.h +130 -0
  21. data/ext/noderb_extension/libuv/src/win/pipe.c +105 -27
  22. data/ext/noderb_extension/libuv/src/win/process.c +76 -5
  23. data/ext/noderb_extension/libuv/src/win/req.c +7 -0
  24. data/ext/noderb_extension/libuv/src/win/winapi.c +52 -0
  25. data/ext/noderb_extension/libuv/test/benchmark-pound.c +50 -48
  26. data/ext/noderb_extension/libuv/test/echo-server.c +2 -2
  27. data/ext/noderb_extension/libuv/test/test-list.h +2 -0
  28. data/ext/noderb_extension/libuv/test/test-spawn.c +48 -1
  29. data/ext/noderb_extension/noderb.c +38 -339
  30. data/ext/noderb_extension/noderb.h +18 -2
  31. data/ext/noderb_extension/noderb_common.h +13 -0
  32. data/ext/noderb_extension/noderb_dns.c +37 -0
  33. data/ext/noderb_extension/noderb_dns.h +15 -0
  34. data/ext/noderb_extension/noderb_process.c +126 -0
  35. data/ext/noderb_extension/noderb_process.h +17 -0
  36. data/ext/noderb_extension/noderb_tcp.c +127 -0
  37. data/ext/noderb_extension/noderb_tcp.h +19 -0
  38. data/ext/noderb_extension/noderb_timers.c +58 -0
  39. data/ext/noderb_extension/noderb_timers.h +16 -0
  40. data/ext/noderb_extension/noderb_tools.c +127 -0
  41. data/ext/noderb_extension/noderb_tools.h +33 -0
  42. data/lib/noderb/dns.rb +11 -0
  43. data/lib/noderb/next_tick.rb +2 -1
  44. data/lib/noderb/tcp.rb +27 -0
  45. data/lib/noderb/timers.rb +24 -0
  46. data/lib/noderb/version.rb +1 -1
  47. data/lib/noderb.rb +6 -1
  48. metadata +23 -7
  49. data/ext/noderb_extension/libuv/build/all.gyp +0 -254
  50. data/ext/noderb_extension/libuv/doc/desired-api.md +0 -159
  51. /data/ext/noderb_extension/libuv/{build/common.gypi → common.gypi} +0 -0
@@ -48,9 +48,13 @@
48
48
  #include <linux/version.h>
49
49
  /* pipe2() requires linux >= 2.6.27 and glibc >= 2.9 */
50
50
  #define HAVE_PIPE2 \
51
- defined(LINUX_VERSION_CODE) && defined(__GLIBC_PREREQ) && LINUX_VERSION_CODE >= 0x2061B && __GLIBC_PREREQ(2, 9))
51
+ defined(LINUX_VERSION_CODE) && defined(__GLIBC_PREREQ) && \
52
+ LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) && __GLIBC_PREREQ(2, 9))
52
53
  #endif
53
54
 
55
+ /* XXX disabling HAVE_PIPE2 for now can't compile on 2.6.18 */
56
+ #undef HAVE_PIPE2
57
+
54
58
  #ifdef __sun
55
59
  # include <sys/types.h>
56
60
  # include <sys/wait.h>
@@ -167,6 +171,7 @@ static uv_err_code uv_translate_sys_error(int sys_errno) {
167
171
  case 0: return UV_OK;
168
172
  case EACCES: return UV_EACCESS;
169
173
  case EBADF: return UV_EBADF;
174
+ case EPIPE: return UV_EPIPE;
170
175
  case EAGAIN: return UV_EAGAIN;
171
176
  case ECONNRESET: return UV_ECONNRESET;
172
177
  case EFAULT: return UV_EFAULT;
@@ -199,19 +204,31 @@ static uv_err_t uv_err_new(uv_handle_t* handle, int sys_error) {
199
204
 
200
205
 
201
206
  void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
202
- uv_tcp_t* tcp;
203
- uv_pipe_t* pipe;
204
207
  uv_async_t* async;
205
208
  uv_timer_t* timer;
209
+ uv_stream_t* stream;
206
210
  uv_process_t* process;
207
211
 
208
212
  handle->close_cb = close_cb;
209
213
 
210
214
  switch (handle->type) {
215
+ case UV_NAMED_PIPE:
216
+ uv_pipe_cleanup((uv_pipe_t*)handle);
217
+ /* Fall through. */
218
+
211
219
  case UV_TCP:
212
- tcp = (uv_tcp_t*) handle;
213
- uv_read_stop((uv_stream_t*)tcp);
214
- ev_io_stop(EV_DEFAULT_ &tcp->write_watcher);
220
+ stream = (uv_stream_t*)handle;
221
+
222
+ uv_read_stop(stream);
223
+ ev_io_stop(EV_DEFAULT_ &stream->write_watcher);
224
+
225
+ uv__close(stream->fd);
226
+ stream->fd = -1;
227
+
228
+ if (stream->accepted_fd >= 0) {
229
+ uv__close(stream->accepted_fd);
230
+ stream->accepted_fd = -1;
231
+ }
215
232
  break;
216
233
 
217
234
  case UV_PREPARE:
@@ -240,13 +257,6 @@ void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
240
257
  ev_timer_stop(EV_DEFAULT_ &timer->timer_watcher);
241
258
  break;
242
259
 
243
- case UV_NAMED_PIPE:
244
- pipe = (uv_pipe_t*)handle;
245
- uv_pipe_cleanup(pipe);
246
- uv_read_stop((uv_stream_t*)handle);
247
- ev_io_stop(EV_DEFAULT_ &pipe->write_watcher);
248
- break;
249
-
250
260
  case UV_PROCESS:
251
261
  process = (uv_process_t*)handle;
252
262
  ev_child_stop(EV_DEFAULT_UC_ &process->child_watcher);
@@ -326,20 +336,20 @@ static int uv__bind(uv_tcp_t* tcp, int domain, struct sockaddr* addr,
326
336
  int addrsize) {
327
337
  int saved_errno;
328
338
  int status;
329
- int fd;
330
339
 
331
340
  saved_errno = errno;
332
341
  status = -1;
333
342
 
334
- if (tcp->fd <= 0) {
335
- if ((fd = uv__socket(domain, SOCK_STREAM, 0)) == -1) {
343
+ if (tcp->fd < 0) {
344
+ if ((tcp->fd = uv__socket(domain, SOCK_STREAM, 0)) == -1) {
336
345
  uv_err_new((uv_handle_t*)tcp, errno);
337
346
  goto out;
338
347
  }
339
348
 
340
- if (uv__stream_open((uv_stream_t*)tcp, fd, UV_READABLE | UV_WRITABLE)) {
349
+ if (uv__stream_open((uv_stream_t*)tcp, tcp->fd, UV_READABLE | UV_WRITABLE)) {
350
+ uv__close(tcp->fd);
351
+ tcp->fd = -1;
341
352
  status = -2;
342
- uv__close(fd);
343
353
  goto out;
344
354
  }
345
355
  }
@@ -422,14 +432,17 @@ void uv__server_io(EV_P_ ev_io* watcher, int revents) {
422
432
  watcher == &stream->write_watcher);
423
433
  assert(revents == EV_READ);
424
434
 
425
- assert(!(((uv_handle_t*)stream)->flags & UV_CLOSING));
435
+ assert(!(stream->flags & UV_CLOSING));
426
436
 
427
437
  if (stream->accepted_fd >= 0) {
428
438
  ev_io_stop(EV_DEFAULT_ &stream->read_watcher);
429
439
  return;
430
440
  }
431
441
 
432
- while (1) {
442
+ /* connection_cb can close the server socket while we're
443
+ * in the loop so check it on each iteration.
444
+ */
445
+ while (stream->fd != -1) {
433
446
  assert(stream->accepted_fd < 0);
434
447
  fd = uv__accept(stream->fd, (struct sockaddr*)&addr, sizeof addr);
435
448
 
@@ -444,7 +457,6 @@ void uv__server_io(EV_P_ ev_io* watcher, int revents) {
444
457
  uv_err_new((uv_handle_t*)stream, errno);
445
458
  stream->connection_cb((uv_stream_t*)stream, -1);
446
459
  }
447
-
448
460
  } else {
449
461
  stream->accepted_fd = fd;
450
462
  stream->connection_cb((uv_stream_t*)stream, 0);
@@ -508,21 +520,21 @@ int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) {
508
520
 
509
521
  static int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) {
510
522
  int r;
511
- int fd;
512
523
 
513
524
  if (tcp->delayed_error) {
514
525
  uv_err_new((uv_handle_t*)tcp, tcp->delayed_error);
515
526
  return -1;
516
527
  }
517
528
 
518
- if (tcp->fd <= 0) {
519
- if ((fd = uv__socket(AF_INET, SOCK_STREAM, 0)) == -1) {
529
+ if (tcp->fd < 0) {
530
+ if ((tcp->fd = uv__socket(AF_INET, SOCK_STREAM, 0)) == -1) {
520
531
  uv_err_new((uv_handle_t*)tcp, errno);
521
532
  return -1;
522
533
  }
523
534
 
524
- if (uv__stream_open((uv_stream_t*)tcp, fd, UV_READABLE)) {
525
- uv__close(fd);
535
+ if (uv__stream_open((uv_stream_t*)tcp, tcp->fd, UV_READABLE)) {
536
+ uv__close(tcp->fd);
537
+ tcp->fd = -1;
526
538
  return -1;
527
539
  }
528
540
  }
@@ -574,23 +586,9 @@ void uv__finish_close(uv_handle_t* handle) {
574
586
 
575
587
  case UV_NAMED_PIPE:
576
588
  case UV_TCP:
577
- {
578
- uv_stream_t* stream;
579
-
580
- stream = (uv_stream_t*)handle;
581
-
582
- assert(!ev_is_active(&stream->read_watcher));
583
- assert(!ev_is_active(&stream->write_watcher));
584
-
585
- uv__close(stream->fd);
586
- stream->fd = -1;
587
-
588
- if (stream->accepted_fd >= 0) {
589
- uv__close(stream->accepted_fd);
590
- stream->accepted_fd = -1;
591
- }
589
+ assert(!ev_is_active(&((uv_stream_t*)handle)->read_watcher));
590
+ assert(!ev_is_active(&((uv_stream_t*)handle)->write_watcher));
592
591
  break;
593
- }
594
592
 
595
593
  case UV_PROCESS:
596
594
  assert(!ev_is_active(&((uv_process_t*)handle)->child_watcher));
@@ -653,9 +651,9 @@ static void uv__drain(uv_stream_t* stream) {
653
651
  ev_io_stop(EV_DEFAULT_ &stream->write_watcher);
654
652
 
655
653
  /* Shutdown? */
656
- if ((((uv_handle_t*)stream)->flags & UV_SHUTTING) &&
657
- !(((uv_handle_t*)stream)->flags & UV_CLOSING) &&
658
- !(((uv_handle_t*)stream)->flags & UV_SHUT)) {
654
+ if ((stream->flags & UV_SHUTTING) &&
655
+ !(stream->flags & UV_CLOSING) &&
656
+ !(stream->flags & UV_SHUT)) {
659
657
  assert(stream->shutdown_req);
660
658
 
661
659
  req = stream->shutdown_req;
@@ -874,10 +872,10 @@ int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
874
872
  "uv_shutdown (unix) only supports uv_handle_t right now");
875
873
  assert(stream->fd >= 0);
876
874
 
877
- if (!(((uv_handle_t*)stream)->flags & UV_WRITABLE) ||
878
- ((uv_handle_t*)stream)->flags & UV_SHUT ||
879
- ((uv_handle_t*)stream)->flags & UV_CLOSED ||
880
- ((uv_handle_t*)stream)->flags & UV_CLOSING) {
875
+ if (!(stream->flags & UV_WRITABLE) ||
876
+ stream->flags & UV_SHUT ||
877
+ stream->flags & UV_CLOSED ||
878
+ stream->flags & UV_CLOSING) {
881
879
  uv_err_new((uv_handle_t*)stream, EINVAL);
882
880
  return -1;
883
881
  }
@@ -906,7 +904,7 @@ static void uv__stream_io(EV_P_ ev_io* watcher, int revents) {
906
904
  stream->type == UV_NAMED_PIPE);
907
905
  assert(watcher == &stream->read_watcher ||
908
906
  watcher == &stream->write_watcher);
909
- assert(!(((uv_handle_t*)stream)->flags & UV_CLOSING));
907
+ assert(!(stream->flags & UV_CLOSING));
910
908
 
911
909
  if (stream->connect_req) {
912
910
  uv__stream_connect(stream);
@@ -994,10 +992,6 @@ static int uv__connect(uv_connect_t* req,
994
992
 
995
993
  if (stream->fd <= 0) {
996
994
  if ((sockfd = uv__socket(addr->sa_family, SOCK_STREAM, 0)) == -1) {
997
-
998
- }
999
-
1000
- if (sockfd < 0) {
1001
995
  uv_err_new((uv_handle_t*)stream, errno);
1002
996
  return -1;
1003
997
  }
@@ -1990,9 +1984,8 @@ int uv_pipe_connect(uv_connect_t* req,
1990
1984
  goto out;
1991
1985
  }
1992
1986
 
1993
- handle->fd = sockfd;
1994
- ev_io_init(&handle->read_watcher, uv__stream_io, sockfd, EV_READ);
1995
- ev_io_init(&handle->write_watcher, uv__stream_io, sockfd, EV_WRITE);
1987
+ uv__stream_open((uv_stream_t*)handle, sockfd, UV_READABLE | UV_WRITABLE);
1988
+
1996
1989
  ev_io_start(EV_DEFAULT_ &handle->read_watcher);
1997
1990
  ev_io_start(EV_DEFAULT_ &handle->write_watcher);
1998
1991
 
@@ -2075,6 +2068,8 @@ static int uv__socket(int domain, int type, int protocol) {
2075
2068
  static int uv__accept(int sockfd, struct sockaddr* saddr, socklen_t slen) {
2076
2069
  int peerfd;
2077
2070
 
2071
+ assert(sockfd >= 0);
2072
+
2078
2073
  do {
2079
2074
  #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC)
2080
2075
  peerfd = accept4(sockfd, saddr, &slen, SOCK_NONBLOCK | SOCK_CLOEXEC);
@@ -2202,6 +2197,9 @@ static void uv__chld(EV_P_ ev_child* watcher, int revents) {
2202
2197
  }
2203
2198
  }
2204
2199
 
2200
+ #ifndef SPAWN_WAIT_EXEC
2201
+ # define SPAWN_WAIT_EXEC 1
2202
+ #endif
2205
2203
 
2206
2204
  int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2207
2205
  /*
@@ -2212,8 +2210,10 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2212
2210
  int stdin_pipe[2] = { -1, -1 };
2213
2211
  int stdout_pipe[2] = { -1, -1 };
2214
2212
  int stderr_pipe[2] = { -1, -1 };
2213
+ #if SPAWN_WAIT_EXEC
2215
2214
  int signal_pipe[2] = { -1, -1 };
2216
2215
  struct pollfd pfd;
2216
+ #endif
2217
2217
  int status;
2218
2218
  pid_t pid;
2219
2219
 
@@ -2231,6 +2231,8 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2231
2231
  if (pipe(stdin_pipe) < 0) {
2232
2232
  goto error;
2233
2233
  }
2234
+ uv__cloexec(stdin_pipe[0], 1);
2235
+ uv__cloexec(stdin_pipe[1], 1);
2234
2236
  }
2235
2237
 
2236
2238
  if (options.stdout_stream) {
@@ -2242,6 +2244,8 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2242
2244
  if (pipe(stdout_pipe) < 0) {
2243
2245
  goto error;
2244
2246
  }
2247
+ uv__cloexec(stdout_pipe[0], 1);
2248
+ uv__cloexec(stdout_pipe[1], 1);
2245
2249
  }
2246
2250
 
2247
2251
  if (options.stderr_stream) {
@@ -2253,6 +2257,8 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2253
2257
  if (pipe(stderr_pipe) < 0) {
2254
2258
  goto error;
2255
2259
  }
2260
+ uv__cloexec(stderr_pipe[0], 1);
2261
+ uv__cloexec(stderr_pipe[1], 1);
2256
2262
  }
2257
2263
 
2258
2264
  /* This pipe is used by the parent to wait until
@@ -2275,11 +2281,12 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2275
2281
  * marked close-on-exec. Then, after the call to `fork()`,
2276
2282
  * the parent polls the read end until it sees POLLHUP.
2277
2283
  */
2278
- #ifdef HAVE_PIPE2
2284
+ #if SPAWN_WAIT_EXEC
2285
+ # ifdef HAVE_PIPE2
2279
2286
  if (pipe2(signal_pipe, O_CLOEXEC | O_NONBLOCK) < 0) {
2280
2287
  goto error;
2281
2288
  }
2282
- #else
2289
+ # else
2283
2290
  if (pipe(signal_pipe) < 0) {
2284
2291
  goto error;
2285
2292
  }
@@ -2287,13 +2294,16 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2287
2294
  uv__cloexec(signal_pipe[1], 1);
2288
2295
  uv__nonblock(signal_pipe[0], 1);
2289
2296
  uv__nonblock(signal_pipe[1], 1);
2297
+ # endif
2290
2298
  #endif
2291
2299
 
2292
2300
  pid = fork();
2293
2301
 
2294
2302
  if (pid == -1) {
2303
+ #if SPAWN_WAIT_EXEC
2295
2304
  uv__close(signal_pipe[0]);
2296
2305
  uv__close(signal_pipe[1]);
2306
+ #endif
2297
2307
  environ = save_our_env;
2298
2308
  goto error;
2299
2309
  }
@@ -2332,6 +2342,7 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2332
2342
  /* Restore environment. */
2333
2343
  environ = save_our_env;
2334
2344
 
2345
+ #if SPAWN_WAIT_EXEC
2335
2346
  /* POLLHUP signals child has exited or execve()'d. */
2336
2347
  uv__close(signal_pipe[1]);
2337
2348
  do {
@@ -2343,11 +2354,13 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
2343
2354
  while (status == -1 && (errno == EINTR || errno == ENOMEM));
2344
2355
 
2345
2356
  uv__close(signal_pipe[0]);
2357
+ uv__close(signal_pipe[1]);
2346
2358
 
2347
2359
  assert((status == 1)
2348
2360
  && "poll() on pipe read end failed");
2349
2361
  assert((pfd.revents & POLLHUP) == POLLHUP
2350
2362
  && "no POLLHUP on pipe read end");
2363
+ #endif
2351
2364
 
2352
2365
  process->pid = pid;
2353
2366
 
@@ -70,6 +70,9 @@ void uv_init() {
70
70
  /* Initialize winsock */
71
71
  uv_winsock_startup();
72
72
 
73
+ /* Fetch winapi function pointers */
74
+ uv_winapi_init();
75
+
73
76
  /* Intialize event loop */
74
77
  uv_loop_init();
75
78
  }
@@ -24,7 +24,9 @@
24
24
 
25
25
  #include "uv.h"
26
26
  #include "../uv-common.h"
27
+
27
28
  #include "tree.h"
29
+ #include "ntdll.h"
28
30
 
29
31
 
30
32
  /*
@@ -234,4 +236,13 @@ void uv_set_sys_error(int sys_errno);
234
236
  void uv_set_error(uv_err_code code, int sys_errno);
235
237
 
236
238
 
239
+ /*
240
+ * Windows api functions that we need to retrieve dynamically
241
+ */
242
+ void uv_winapi_init();
243
+
244
+ extern sRtlNtStatusToDosError pRtlNtStatusToDosError;
245
+ extern sNtQueryInformationFile pNtQueryInformationFile;
246
+
247
+
237
248
  #endif /* UV_WIN_INTERNAL_H_ */
@@ -0,0 +1,130 @@
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_WIN_NTDLL_H_
23
+ #define UV_WIN_NTDLL_H_
24
+
25
+ #include <windows.h>
26
+
27
+
28
+ #ifndef _NTDEF_
29
+ typedef LONG NTSTATUS;
30
+ typedef NTSTATUS *PNTSTATUS;
31
+ #endif
32
+
33
+
34
+ #define STATUS_SUCCESS ((NTSTATUS)0x0)
35
+
36
+
37
+ typedef struct _IO_STATUS_BLOCK {
38
+ union {
39
+ NTSTATUS Status;
40
+ PVOID Pointer;
41
+ } DUMMYUNIONNAME;
42
+ ULONG_PTR Information;
43
+ } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
44
+
45
+
46
+ typedef struct _FILE_PIPE_LOCAL_INFORMATION {
47
+ ULONG NamedPipeType;
48
+ ULONG NamedPipeConfiguration;
49
+ ULONG MaximumInstances;
50
+ ULONG CurrentInstances;
51
+ ULONG InboundQuota;
52
+ ULONG ReadDataAvailable;
53
+ ULONG OutboundQuota;
54
+ ULONG WriteQuotaAvailable;
55
+ ULONG NamedPipeState;
56
+ ULONG NamedPipeEnd;
57
+ } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
58
+
59
+
60
+ typedef enum _FILE_INFORMATION_CLASS {
61
+ FileDirectoryInformation = 1,
62
+ FileFullDirectoryInformation,
63
+ FileBothDirectoryInformation,
64
+ FileBasicInformation,
65
+ FileStandardInformation,
66
+ FileInternalInformation,
67
+ FileEaInformation,
68
+ FileAccessInformation,
69
+ FileNameInformation,
70
+ FileRenameInformation,
71
+ FileLinkInformation,
72
+ FileNamesInformation,
73
+ FileDispositionInformation,
74
+ FilePositionInformation,
75
+ FileFullEaInformation,
76
+ FileModeInformation,
77
+ FileAlignmentInformation,
78
+ FileAllInformation,
79
+ FileAllocationInformation,
80
+ FileEndOfFileInformation,
81
+ FileAlternateNameInformation,
82
+ FileStreamInformation,
83
+ FilePipeInformation,
84
+ FilePipeLocalInformation,
85
+ FilePipeRemoteInformation,
86
+ FileMailslotQueryInformation,
87
+ FileMailslotSetInformation,
88
+ FileCompressionInformation,
89
+ FileObjectIdInformation,
90
+ FileCompletionInformation,
91
+ FileMoveClusterInformation,
92
+ FileQuotaInformation,
93
+ FileReparsePointInformation,
94
+ FileNetworkOpenInformation,
95
+ FileAttributeTagInformation,
96
+ FileTrackingInformation,
97
+ FileIdBothDirectoryInformation,
98
+ FileIdFullDirectoryInformation,
99
+ FileValidDataLengthInformation,
100
+ FileShortNameInformation,
101
+ FileIoCompletionNotificationInformation,
102
+ FileIoStatusBlockRangeInformation,
103
+ FileIoPriorityHintInformation,
104
+ FileSfioReserveInformation,
105
+ FileSfioVolumeInformation,
106
+ FileHardLinkInformation,
107
+ FileProcessIdsUsingFileInformation,
108
+ FileNormalizedNameInformation,
109
+ FileNetworkPhysicalNameInformation,
110
+ FileIdGlobalTxDirectoryInformation,
111
+ FileIsRemoteDeviceInformation,
112
+ FileAttributeCacheInformation,
113
+ FileNumaNodeInformation,
114
+ FileStandardLinkInformation,
115
+ FileRemoteProtocolInformation,
116
+ FileMaximumInformation
117
+ } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
118
+
119
+
120
+ typedef ULONG (NTAPI *sRtlNtStatusToDosError)
121
+ (NTSTATUS Status);
122
+
123
+ typedef NTSTATUS (NTAPI *sNtQueryInformationFile)
124
+ (HANDLE FileHandle,
125
+ PIO_STATUS_BLOCK IoStatusBlock,
126
+ PVOID FileInformation,
127
+ ULONG Length,
128
+ FILE_INFORMATION_CLASS FileInformationClass);
129
+
130
+ #endif /* UV_WIN_NTDLL_H_ */