racer 0.1.3

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.
Files changed (336) hide show
  1. data/LICENSE +22 -0
  2. data/bin/racer +33 -0
  3. data/ext/libuv/AUTHORS +45 -0
  4. data/ext/libuv/LICENSE +42 -0
  5. data/ext/libuv/Makefile +119 -0
  6. data/ext/libuv/README.md +88 -0
  7. data/ext/libuv/build/gcc_version.py +20 -0
  8. data/ext/libuv/common.gypi +176 -0
  9. data/ext/libuv/config-mingw.mk +61 -0
  10. data/ext/libuv/config-unix.mk +171 -0
  11. data/ext/libuv/gyp_uv +64 -0
  12. data/ext/libuv/include/ares.h +591 -0
  13. data/ext/libuv/include/ares_version.h +24 -0
  14. data/ext/libuv/include/uv-private/eio.h +403 -0
  15. data/ext/libuv/include/uv-private/ev.h +838 -0
  16. data/ext/libuv/include/uv-private/ngx-queue.h +108 -0
  17. data/ext/libuv/include/uv-private/tree.h +768 -0
  18. data/ext/libuv/include/uv-private/uv-unix.h +310 -0
  19. data/ext/libuv/include/uv-private/uv-win.h +510 -0
  20. data/ext/libuv/include/uv.h +1796 -0
  21. data/ext/libuv/src/ares/AUTHORS +37 -0
  22. data/ext/libuv/src/ares/CHANGES +1218 -0
  23. data/ext/libuv/src/ares/CMakeLists.txt +22 -0
  24. data/ext/libuv/src/ares/NEWS +21 -0
  25. data/ext/libuv/src/ares/README +60 -0
  26. data/ext/libuv/src/ares/README.cares +13 -0
  27. data/ext/libuv/src/ares/README.msvc +142 -0
  28. data/ext/libuv/src/ares/README.node +21 -0
  29. data/ext/libuv/src/ares/RELEASE-NOTES +26 -0
  30. data/ext/libuv/src/ares/TODO +23 -0
  31. data/ext/libuv/src/ares/ares__close_sockets.c +66 -0
  32. data/ext/libuv/src/ares/ares__get_hostent.c +263 -0
  33. data/ext/libuv/src/ares/ares__read_line.c +71 -0
  34. data/ext/libuv/src/ares/ares__timeval.c +111 -0
  35. data/ext/libuv/src/ares/ares_cancel.c +63 -0
  36. data/ext/libuv/src/ares/ares_data.c +190 -0
  37. data/ext/libuv/src/ares/ares_data.h +65 -0
  38. data/ext/libuv/src/ares/ares_destroy.c +105 -0
  39. data/ext/libuv/src/ares/ares_dns.h +90 -0
  40. data/ext/libuv/src/ares/ares_expand_name.c +200 -0
  41. data/ext/libuv/src/ares/ares_expand_string.c +75 -0
  42. data/ext/libuv/src/ares/ares_fds.c +63 -0
  43. data/ext/libuv/src/ares/ares_free_hostent.c +42 -0
  44. data/ext/libuv/src/ares/ares_free_string.c +25 -0
  45. data/ext/libuv/src/ares/ares_getenv.c +30 -0
  46. data/ext/libuv/src/ares/ares_getenv.h +26 -0
  47. data/ext/libuv/src/ares/ares_gethostbyaddr.c +301 -0
  48. data/ext/libuv/src/ares/ares_gethostbyname.c +523 -0
  49. data/ext/libuv/src/ares/ares_getnameinfo.c +427 -0
  50. data/ext/libuv/src/ares/ares_getopt.c +122 -0
  51. data/ext/libuv/src/ares/ares_getopt.h +53 -0
  52. data/ext/libuv/src/ares/ares_getsock.c +72 -0
  53. data/ext/libuv/src/ares/ares_init.c +1809 -0
  54. data/ext/libuv/src/ares/ares_iphlpapi.h +221 -0
  55. data/ext/libuv/src/ares/ares_ipv6.h +78 -0
  56. data/ext/libuv/src/ares/ares_library_init.c +142 -0
  57. data/ext/libuv/src/ares/ares_library_init.h +42 -0
  58. data/ext/libuv/src/ares/ares_llist.c +86 -0
  59. data/ext/libuv/src/ares/ares_llist.h +42 -0
  60. data/ext/libuv/src/ares/ares_mkquery.c +195 -0
  61. data/ext/libuv/src/ares/ares_nowarn.c +181 -0
  62. data/ext/libuv/src/ares/ares_nowarn.h +55 -0
  63. data/ext/libuv/src/ares/ares_options.c +248 -0
  64. data/ext/libuv/src/ares/ares_parse_a_reply.c +263 -0
  65. data/ext/libuv/src/ares/ares_parse_aaaa_reply.c +259 -0
  66. data/ext/libuv/src/ares/ares_parse_mx_reply.c +170 -0
  67. data/ext/libuv/src/ares/ares_parse_ns_reply.c +182 -0
  68. data/ext/libuv/src/ares/ares_parse_ptr_reply.c +217 -0
  69. data/ext/libuv/src/ares/ares_parse_srv_reply.c +179 -0
  70. data/ext/libuv/src/ares/ares_parse_txt_reply.c +201 -0
  71. data/ext/libuv/src/ares/ares_platform.c +11035 -0
  72. data/ext/libuv/src/ares/ares_platform.h +43 -0
  73. data/ext/libuv/src/ares/ares_private.h +355 -0
  74. data/ext/libuv/src/ares/ares_process.c +1295 -0
  75. data/ext/libuv/src/ares/ares_query.c +183 -0
  76. data/ext/libuv/src/ares/ares_rules.h +144 -0
  77. data/ext/libuv/src/ares/ares_search.c +321 -0
  78. data/ext/libuv/src/ares/ares_send.c +134 -0
  79. data/ext/libuv/src/ares/ares_setup.h +199 -0
  80. data/ext/libuv/src/ares/ares_strcasecmp.c +66 -0
  81. data/ext/libuv/src/ares/ares_strcasecmp.h +30 -0
  82. data/ext/libuv/src/ares/ares_strdup.c +42 -0
  83. data/ext/libuv/src/ares/ares_strdup.h +26 -0
  84. data/ext/libuv/src/ares/ares_strerror.c +56 -0
  85. data/ext/libuv/src/ares/ares_timeout.c +80 -0
  86. data/ext/libuv/src/ares/ares_version.c +11 -0
  87. data/ext/libuv/src/ares/ares_writev.c +79 -0
  88. data/ext/libuv/src/ares/ares_writev.h +36 -0
  89. data/ext/libuv/src/ares/bitncmp.c +59 -0
  90. data/ext/libuv/src/ares/bitncmp.h +26 -0
  91. data/ext/libuv/src/ares/config_cygwin/ares_config.h +512 -0
  92. data/ext/libuv/src/ares/config_darwin/ares_config.h +512 -0
  93. data/ext/libuv/src/ares/config_freebsd/ares_config.h +512 -0
  94. data/ext/libuv/src/ares/config_linux/ares_config.h +512 -0
  95. data/ext/libuv/src/ares/config_netbsd/ares_config.h +512 -0
  96. data/ext/libuv/src/ares/config_openbsd/ares_config.h +512 -0
  97. data/ext/libuv/src/ares/config_sunos/ares_config.h +512 -0
  98. data/ext/libuv/src/ares/config_win32/ares_config.h +369 -0
  99. data/ext/libuv/src/ares/get_ver.awk +35 -0
  100. data/ext/libuv/src/ares/inet_net_pton.c +451 -0
  101. data/ext/libuv/src/ares/inet_net_pton.h +31 -0
  102. data/ext/libuv/src/ares/inet_ntop.c +208 -0
  103. data/ext/libuv/src/ares/inet_ntop.h +26 -0
  104. data/ext/libuv/src/ares/nameser.h +203 -0
  105. data/ext/libuv/src/ares/setup_once.h +504 -0
  106. data/ext/libuv/src/ares/windows_port.c +22 -0
  107. data/ext/libuv/src/cares.c +225 -0
  108. data/ext/libuv/src/fs-poll.c +237 -0
  109. data/ext/libuv/src/unix/async.c +119 -0
  110. data/ext/libuv/src/unix/core.c +647 -0
  111. data/ext/libuv/src/unix/cygwin.c +84 -0
  112. data/ext/libuv/src/unix/darwin.c +341 -0
  113. data/ext/libuv/src/unix/dl.c +83 -0
  114. data/ext/libuv/src/unix/eio/Changes +63 -0
  115. data/ext/libuv/src/unix/eio/LICENSE +36 -0
  116. data/ext/libuv/src/unix/eio/Makefile.am +15 -0
  117. data/ext/libuv/src/unix/eio/aclocal.m4 +8957 -0
  118. data/ext/libuv/src/unix/eio/autogen.sh +3 -0
  119. data/ext/libuv/src/unix/eio/config.h.in +86 -0
  120. data/ext/libuv/src/unix/eio/config_cygwin.h +80 -0
  121. data/ext/libuv/src/unix/eio/config_darwin.h +141 -0
  122. data/ext/libuv/src/unix/eio/config_freebsd.h +81 -0
  123. data/ext/libuv/src/unix/eio/config_linux.h +94 -0
  124. data/ext/libuv/src/unix/eio/config_netbsd.h +81 -0
  125. data/ext/libuv/src/unix/eio/config_openbsd.h +137 -0
  126. data/ext/libuv/src/unix/eio/config_sunos.h +84 -0
  127. data/ext/libuv/src/unix/eio/configure.ac +22 -0
  128. data/ext/libuv/src/unix/eio/demo.c +194 -0
  129. data/ext/libuv/src/unix/eio/ecb.h +370 -0
  130. data/ext/libuv/src/unix/eio/eio.3 +3428 -0
  131. data/ext/libuv/src/unix/eio/eio.c +2593 -0
  132. data/ext/libuv/src/unix/eio/eio.pod +969 -0
  133. data/ext/libuv/src/unix/eio/libeio.m4 +195 -0
  134. data/ext/libuv/src/unix/eio/xthread.h +164 -0
  135. data/ext/libuv/src/unix/error.c +104 -0
  136. data/ext/libuv/src/unix/ev/Changes +388 -0
  137. data/ext/libuv/src/unix/ev/LICENSE +36 -0
  138. data/ext/libuv/src/unix/ev/Makefile.am +18 -0
  139. data/ext/libuv/src/unix/ev/Makefile.in +771 -0
  140. data/ext/libuv/src/unix/ev/README +58 -0
  141. data/ext/libuv/src/unix/ev/aclocal.m4 +8957 -0
  142. data/ext/libuv/src/unix/ev/autogen.sh +6 -0
  143. data/ext/libuv/src/unix/ev/config.guess +1526 -0
  144. data/ext/libuv/src/unix/ev/config.h.in +125 -0
  145. data/ext/libuv/src/unix/ev/config.sub +1658 -0
  146. data/ext/libuv/src/unix/ev/config_cygwin.h +123 -0
  147. data/ext/libuv/src/unix/ev/config_darwin.h +122 -0
  148. data/ext/libuv/src/unix/ev/config_freebsd.h +120 -0
  149. data/ext/libuv/src/unix/ev/config_linux.h +141 -0
  150. data/ext/libuv/src/unix/ev/config_netbsd.h +120 -0
  151. data/ext/libuv/src/unix/ev/config_openbsd.h +126 -0
  152. data/ext/libuv/src/unix/ev/config_sunos.h +122 -0
  153. data/ext/libuv/src/unix/ev/configure +13037 -0
  154. data/ext/libuv/src/unix/ev/configure.ac +18 -0
  155. data/ext/libuv/src/unix/ev/depcomp +630 -0
  156. data/ext/libuv/src/unix/ev/ev++.h +816 -0
  157. data/ext/libuv/src/unix/ev/ev.3 +5311 -0
  158. data/ext/libuv/src/unix/ev/ev.c +3925 -0
  159. data/ext/libuv/src/unix/ev/ev.pod +5243 -0
  160. data/ext/libuv/src/unix/ev/ev_epoll.c +266 -0
  161. data/ext/libuv/src/unix/ev/ev_kqueue.c +235 -0
  162. data/ext/libuv/src/unix/ev/ev_poll.c +148 -0
  163. data/ext/libuv/src/unix/ev/ev_port.c +179 -0
  164. data/ext/libuv/src/unix/ev/ev_select.c +310 -0
  165. data/ext/libuv/src/unix/ev/ev_vars.h +203 -0
  166. data/ext/libuv/src/unix/ev/ev_win32.c +153 -0
  167. data/ext/libuv/src/unix/ev/ev_wrap.h +196 -0
  168. data/ext/libuv/src/unix/ev/event.c +402 -0
  169. data/ext/libuv/src/unix/ev/event.h +170 -0
  170. data/ext/libuv/src/unix/ev/install-sh +294 -0
  171. data/ext/libuv/src/unix/ev/libev.m4 +39 -0
  172. data/ext/libuv/src/unix/ev/ltmain.sh +8413 -0
  173. data/ext/libuv/src/unix/ev/missing +336 -0
  174. data/ext/libuv/src/unix/ev/mkinstalldirs +111 -0
  175. data/ext/libuv/src/unix/freebsd.c +312 -0
  176. data/ext/libuv/src/unix/fs.c +699 -0
  177. data/ext/libuv/src/unix/internal.h +180 -0
  178. data/ext/libuv/src/unix/kqueue.c +122 -0
  179. data/ext/libuv/src/unix/linux/core.c +474 -0
  180. data/ext/libuv/src/unix/linux/inotify.c +209 -0
  181. data/ext/libuv/src/unix/linux/syscalls.c +268 -0
  182. data/ext/libuv/src/unix/linux/syscalls.h +93 -0
  183. data/ext/libuv/src/unix/loop-watcher.c +63 -0
  184. data/ext/libuv/src/unix/loop.c +81 -0
  185. data/ext/libuv/src/unix/netbsd.c +108 -0
  186. data/ext/libuv/src/unix/openbsd.c +295 -0
  187. data/ext/libuv/src/unix/pipe.c +261 -0
  188. data/ext/libuv/src/unix/poll.c +116 -0
  189. data/ext/libuv/src/unix/process.c +447 -0
  190. data/ext/libuv/src/unix/stream.c +1026 -0
  191. data/ext/libuv/src/unix/sunos.c +483 -0
  192. data/ext/libuv/src/unix/tcp.c +328 -0
  193. data/ext/libuv/src/unix/thread.c +211 -0
  194. data/ext/libuv/src/unix/timer.c +138 -0
  195. data/ext/libuv/src/unix/tty.c +146 -0
  196. data/ext/libuv/src/unix/udp.c +661 -0
  197. data/ext/libuv/src/unix/uv-eio.c +107 -0
  198. data/ext/libuv/src/unix/uv-eio.h +13 -0
  199. data/ext/libuv/src/uv-common.c +384 -0
  200. data/ext/libuv/src/uv-common.h +171 -0
  201. data/ext/libuv/src/win/async.c +130 -0
  202. data/ext/libuv/src/win/core.c +283 -0
  203. data/ext/libuv/src/win/dl.c +86 -0
  204. data/ext/libuv/src/win/error.c +150 -0
  205. data/ext/libuv/src/win/fs-event.c +512 -0
  206. data/ext/libuv/src/win/fs.c +1856 -0
  207. data/ext/libuv/src/win/getaddrinfo.c +365 -0
  208. data/ext/libuv/src/win/handle-inl.h +145 -0
  209. data/ext/libuv/src/win/handle.c +150 -0
  210. data/ext/libuv/src/win/internal.h +337 -0
  211. data/ext/libuv/src/win/loop-watcher.c +123 -0
  212. data/ext/libuv/src/win/pipe.c +1675 -0
  213. data/ext/libuv/src/win/poll.c +618 -0
  214. data/ext/libuv/src/win/process-stdio.c +479 -0
  215. data/ext/libuv/src/win/process.c +1013 -0
  216. data/ext/libuv/src/win/req-inl.h +225 -0
  217. data/ext/libuv/src/win/req.c +25 -0
  218. data/ext/libuv/src/win/stream-inl.h +69 -0
  219. data/ext/libuv/src/win/stream.c +167 -0
  220. data/ext/libuv/src/win/tcp.c +1400 -0
  221. data/ext/libuv/src/win/thread.c +372 -0
  222. data/ext/libuv/src/win/threadpool.c +74 -0
  223. data/ext/libuv/src/win/timer.c +226 -0
  224. data/ext/libuv/src/win/tty.c +1801 -0
  225. data/ext/libuv/src/win/udp.c +718 -0
  226. data/ext/libuv/src/win/util.c +864 -0
  227. data/ext/libuv/src/win/winapi.c +132 -0
  228. data/ext/libuv/src/win/winapi.h +4443 -0
  229. data/ext/libuv/src/win/winsock.c +557 -0
  230. data/ext/libuv/src/win/winsock.h +171 -0
  231. data/ext/libuv/test/benchmark-ares.c +117 -0
  232. data/ext/libuv/test/benchmark-fs-stat.c +164 -0
  233. data/ext/libuv/test/benchmark-getaddrinfo.c +94 -0
  234. data/ext/libuv/test/benchmark-list.h +114 -0
  235. data/ext/libuv/test/benchmark-loop-count.c +88 -0
  236. data/ext/libuv/test/benchmark-million-timers.c +65 -0
  237. data/ext/libuv/test/benchmark-ping-pongs.c +213 -0
  238. data/ext/libuv/test/benchmark-pound.c +324 -0
  239. data/ext/libuv/test/benchmark-pump.c +462 -0
  240. data/ext/libuv/test/benchmark-sizes.c +42 -0
  241. data/ext/libuv/test/benchmark-spawn.c +162 -0
  242. data/ext/libuv/test/benchmark-tcp-write-batch.c +140 -0
  243. data/ext/libuv/test/benchmark-thread.c +64 -0
  244. data/ext/libuv/test/benchmark-udp-packet-storm.c +247 -0
  245. data/ext/libuv/test/blackhole-server.c +118 -0
  246. data/ext/libuv/test/dns-server.c +321 -0
  247. data/ext/libuv/test/echo-server.c +378 -0
  248. data/ext/libuv/test/fixtures/empty_file +0 -0
  249. data/ext/libuv/test/fixtures/load_error.node +1 -0
  250. data/ext/libuv/test/run-benchmarks.c +64 -0
  251. data/ext/libuv/test/run-tests.c +138 -0
  252. data/ext/libuv/test/runner-unix.c +290 -0
  253. data/ext/libuv/test/runner-unix.h +36 -0
  254. data/ext/libuv/test/runner-win.c +285 -0
  255. data/ext/libuv/test/runner-win.h +42 -0
  256. data/ext/libuv/test/runner.c +326 -0
  257. data/ext/libuv/test/runner.h +159 -0
  258. data/ext/libuv/test/task.h +109 -0
  259. data/ext/libuv/test/test-async.c +118 -0
  260. data/ext/libuv/test/test-callback-order.c +76 -0
  261. data/ext/libuv/test/test-callback-stack.c +203 -0
  262. data/ext/libuv/test/test-connection-fail.c +148 -0
  263. data/ext/libuv/test/test-counters-init.c +215 -0
  264. data/ext/libuv/test/test-cwd-and-chdir.c +64 -0
  265. data/ext/libuv/test/test-delayed-accept.c +197 -0
  266. data/ext/libuv/test/test-dlerror.c +58 -0
  267. data/ext/libuv/test/test-error.c +59 -0
  268. data/ext/libuv/test/test-fail-always.c +29 -0
  269. data/ext/libuv/test/test-fs-event.c +442 -0
  270. data/ext/libuv/test/test-fs-poll.c +146 -0
  271. data/ext/libuv/test/test-fs.c +1843 -0
  272. data/ext/libuv/test/test-get-currentexe.c +63 -0
  273. data/ext/libuv/test/test-get-loadavg.c +36 -0
  274. data/ext/libuv/test/test-get-memory.c +38 -0
  275. data/ext/libuv/test/test-getaddrinfo.c +122 -0
  276. data/ext/libuv/test/test-gethostbyname.c +189 -0
  277. data/ext/libuv/test/test-getsockname.c +342 -0
  278. data/ext/libuv/test/test-hrtime.c +54 -0
  279. data/ext/libuv/test/test-idle.c +81 -0
  280. data/ext/libuv/test/test-ipc-send-recv.c +209 -0
  281. data/ext/libuv/test/test-ipc.c +620 -0
  282. data/ext/libuv/test/test-list.h +421 -0
  283. data/ext/libuv/test/test-loop-handles.c +336 -0
  284. data/ext/libuv/test/test-multiple-listen.c +102 -0
  285. data/ext/libuv/test/test-mutexes.c +63 -0
  286. data/ext/libuv/test/test-pass-always.c +28 -0
  287. data/ext/libuv/test/test-ping-pong.c +253 -0
  288. data/ext/libuv/test/test-pipe-bind-error.c +140 -0
  289. data/ext/libuv/test/test-pipe-connect-error.c +96 -0
  290. data/ext/libuv/test/test-platform-output.c +87 -0
  291. data/ext/libuv/test/test-poll-close.c +77 -0
  292. data/ext/libuv/test/test-poll.c +573 -0
  293. data/ext/libuv/test/test-process-title.c +42 -0
  294. data/ext/libuv/test/test-ref.c +338 -0
  295. data/ext/libuv/test/test-run-once.c +48 -0
  296. data/ext/libuv/test/test-semaphore.c +111 -0
  297. data/ext/libuv/test/test-shutdown-close.c +103 -0
  298. data/ext/libuv/test/test-shutdown-eof.c +183 -0
  299. data/ext/libuv/test/test-spawn.c +847 -0
  300. data/ext/libuv/test/test-stdio-over-pipes.c +246 -0
  301. data/ext/libuv/test/test-tcp-bind-error.c +191 -0
  302. data/ext/libuv/test/test-tcp-bind6-error.c +154 -0
  303. data/ext/libuv/test/test-tcp-close-while-connecting.c +80 -0
  304. data/ext/libuv/test/test-tcp-close.c +129 -0
  305. data/ext/libuv/test/test-tcp-connect-error-after-write.c +95 -0
  306. data/ext/libuv/test/test-tcp-connect-error.c +70 -0
  307. data/ext/libuv/test/test-tcp-connect-timeout.c +85 -0
  308. data/ext/libuv/test/test-tcp-connect6-error.c +68 -0
  309. data/ext/libuv/test/test-tcp-flags.c +51 -0
  310. data/ext/libuv/test/test-tcp-shutdown-after-write.c +131 -0
  311. data/ext/libuv/test/test-tcp-write-error.c +168 -0
  312. data/ext/libuv/test/test-tcp-write-to-half-open-connection.c +135 -0
  313. data/ext/libuv/test/test-tcp-writealot.c +170 -0
  314. data/ext/libuv/test/test-thread.c +183 -0
  315. data/ext/libuv/test/test-threadpool.c +57 -0
  316. data/ext/libuv/test/test-timer-again.c +141 -0
  317. data/ext/libuv/test/test-timer.c +152 -0
  318. data/ext/libuv/test/test-tty.c +110 -0
  319. data/ext/libuv/test/test-udp-dgram-too-big.c +86 -0
  320. data/ext/libuv/test/test-udp-ipv6.c +156 -0
  321. data/ext/libuv/test/test-udp-multicast-join.c +139 -0
  322. data/ext/libuv/test/test-udp-multicast-ttl.c +86 -0
  323. data/ext/libuv/test/test-udp-options.c +86 -0
  324. data/ext/libuv/test/test-udp-send-and-recv.c +208 -0
  325. data/ext/libuv/test/test-util.c +97 -0
  326. data/ext/libuv/test/test-walk-handles.c +77 -0
  327. data/ext/libuv/uv.gyp +452 -0
  328. data/ext/libuv/vcbuild.bat +105 -0
  329. data/ext/racer/extconf.rb +20 -0
  330. data/ext/racer/http_parser.c +2059 -0
  331. data/ext/racer/http_parser.h +318 -0
  332. data/ext/racer/mkmf.log +22 -0
  333. data/ext/racer/racer.c +551 -0
  334. data/lib/racer.rb +2 -0
  335. data/lib/racer/version.rb +3 -0
  336. metadata +382 -0
@@ -0,0 +1,209 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3
+ * of this software and associated documentation files (the "Software"), to
4
+ * deal in the Software without restriction, including without limitation the
5
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6
+ * sell copies of the Software, and to permit persons to whom the Software is
7
+ * furnished to do so, subject to the following conditions:
8
+ *
9
+ * The above copyright notice and this permission notice shall be included in
10
+ * all copies or substantial portions of the Software.
11
+ *
12
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18
+ * IN THE SOFTWARE.
19
+ */
20
+
21
+ #include "uv.h"
22
+ #include "tree.h"
23
+ #include "../internal.h"
24
+ #include "syscalls.h"
25
+
26
+ #include <stdint.h>
27
+ #include <stdio.h>
28
+ #include <stdlib.h>
29
+ #include <string.h>
30
+ #include <assert.h>
31
+ #include <errno.h>
32
+
33
+ #include <sys/types.h>
34
+ #include <unistd.h>
35
+
36
+
37
+ /* Don't look aghast, this is exactly how glibc's basename() works. */
38
+ static char* basename_r(const char* path) {
39
+ char* s = strrchr(path, '/');
40
+ return s ? (s + 1) : (char*)path;
41
+ }
42
+
43
+
44
+ static int compare_watchers(const uv_fs_event_t* a, const uv_fs_event_t* b) {
45
+ if (a->fd < b->fd) return -1;
46
+ if (a->fd > b->fd) return 1;
47
+ return 0;
48
+ }
49
+
50
+
51
+ RB_GENERATE_STATIC(uv__inotify_watchers, uv_fs_event_s, node, compare_watchers)
52
+
53
+
54
+ static void uv__inotify_read(uv_loop_t* loop, uv__io_t* w, int revents);
55
+
56
+
57
+ static int new_inotify_fd(void) {
58
+ int fd;
59
+
60
+ fd = uv__inotify_init1(UV__IN_NONBLOCK | UV__IN_CLOEXEC);
61
+ if (fd != -1)
62
+ return fd;
63
+ if (errno != ENOSYS)
64
+ return -1;
65
+
66
+ if ((fd = uv__inotify_init()) == -1)
67
+ return -1;
68
+
69
+ if (uv__cloexec(fd, 1) || uv__nonblock(fd, 1)) {
70
+ SAVE_ERRNO(close(fd));
71
+ return -1;
72
+ }
73
+
74
+ return fd;
75
+ }
76
+
77
+
78
+ static int init_inotify(uv_loop_t* loop) {
79
+ if (loop->inotify_fd != -1)
80
+ return 0;
81
+
82
+ loop->inotify_fd = new_inotify_fd();
83
+ if (loop->inotify_fd == -1) {
84
+ uv__set_sys_error(loop, errno);
85
+ return -1;
86
+ }
87
+
88
+ uv__io_init(&loop->inotify_read_watcher,
89
+ uv__inotify_read,
90
+ loop->inotify_fd,
91
+ UV__IO_READ);
92
+ uv__io_start(loop, &loop->inotify_read_watcher);
93
+
94
+ return 0;
95
+ }
96
+
97
+
98
+ static void add_watcher(uv_fs_event_t* handle) {
99
+ RB_INSERT(uv__inotify_watchers, &handle->loop->inotify_watchers, handle);
100
+ }
101
+
102
+
103
+ static uv_fs_event_t* find_watcher(uv_loop_t* loop, int wd) {
104
+ uv_fs_event_t handle;
105
+ handle.fd = wd;
106
+ return RB_FIND(uv__inotify_watchers, &loop->inotify_watchers, &handle);
107
+ }
108
+
109
+
110
+ static void remove_watcher(uv_fs_event_t* handle) {
111
+ RB_REMOVE(uv__inotify_watchers, &handle->loop->inotify_watchers, handle);
112
+ }
113
+
114
+
115
+ static void uv__inotify_read(uv_loop_t* loop, uv__io_t* w, int events) {
116
+ const struct uv__inotify_event* e;
117
+ uv_fs_event_t* handle;
118
+ const char* filename;
119
+ ssize_t size;
120
+ const char *p;
121
+ /* needs to be large enough for sizeof(inotify_event) + strlen(filename) */
122
+ char buf[4096];
123
+
124
+ while (1) {
125
+ do {
126
+ size = read(loop->inotify_fd, buf, sizeof buf);
127
+ }
128
+ while (size == -1 && errno == EINTR);
129
+
130
+ if (size == -1) {
131
+ assert(errno == EAGAIN || errno == EWOULDBLOCK);
132
+ break;
133
+ }
134
+
135
+ assert(size > 0); /* pre-2.6.21 thing, size=0 == read buffer too small */
136
+
137
+ /* Now we have one or more inotify_event structs. */
138
+ for (p = buf; p < buf + size; p += sizeof(*e) + e->len) {
139
+ e = (const struct uv__inotify_event*)p;
140
+
141
+ events = 0;
142
+ if (e->mask & (UV__IN_ATTRIB|UV__IN_MODIFY))
143
+ events |= UV_CHANGE;
144
+ if (e->mask & ~(UV__IN_ATTRIB|UV__IN_MODIFY))
145
+ events |= UV_RENAME;
146
+
147
+ handle = find_watcher(loop, e->wd);
148
+ if (handle == NULL)
149
+ continue; /* Handle has already been closed. */
150
+
151
+ /* inotify does not return the filename when monitoring a single file
152
+ * for modifications. Repurpose the filename for API compatibility.
153
+ * I'm not convinced this is a good thing, maybe it should go.
154
+ */
155
+ filename = e->len ? (const char*) (e + 1) : basename_r(handle->filename);
156
+
157
+ handle->cb(handle, filename, events, 0);
158
+ }
159
+ }
160
+ }
161
+
162
+
163
+ int uv_fs_event_init(uv_loop_t* loop,
164
+ uv_fs_event_t* handle,
165
+ const char* filename,
166
+ uv_fs_event_cb cb,
167
+ int flags) {
168
+ int events;
169
+ int wd;
170
+
171
+ loop->counters.fs_event_init++;
172
+
173
+ /* We don't support any flags yet. */
174
+ assert(!flags);
175
+
176
+ if (init_inotify(loop)) return -1;
177
+
178
+ events = UV__IN_ATTRIB
179
+ | UV__IN_CREATE
180
+ | UV__IN_MODIFY
181
+ | UV__IN_DELETE
182
+ | UV__IN_DELETE_SELF
183
+ | UV__IN_MOVE_SELF
184
+ | UV__IN_MOVED_FROM
185
+ | UV__IN_MOVED_TO;
186
+
187
+ wd = uv__inotify_add_watch(loop->inotify_fd, filename, events);
188
+ if (wd == -1) return uv__set_sys_error(loop, errno);
189
+
190
+ uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT);
191
+ uv__handle_start(handle); /* FIXME shouldn't start automatically */
192
+ handle->filename = strdup(filename);
193
+ handle->cb = cb;
194
+ handle->fd = wd;
195
+ add_watcher(handle);
196
+
197
+ return 0;
198
+ }
199
+
200
+
201
+ void uv__fs_event_close(uv_fs_event_t* handle) {
202
+ uv__inotify_rm_watch(handle->loop->inotify_fd, handle->fd);
203
+ remove_watcher(handle);
204
+ handle->fd = -1;
205
+
206
+ free(handle->filename);
207
+ handle->filename = NULL;
208
+ uv__handle_stop(handle);
209
+ }
@@ -0,0 +1,268 @@
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
+ #include "syscalls.h"
23
+ #include <unistd.h>
24
+ #include <sys/syscall.h>
25
+ #include <sys/types.h>
26
+ #include <errno.h>
27
+
28
+ #if __i386__
29
+ # ifndef __NR_socketcall
30
+ # define __NR_socketcall 102
31
+ # endif
32
+ #endif
33
+
34
+ #if __arm__
35
+ # if __thumb__ || __ARM_EABI__
36
+ # define UV_SYSCALL_BASE 0
37
+ # else
38
+ # define UV_SYSCALL_BASE 0x900000
39
+ # endif
40
+ #endif /* __arm__ */
41
+
42
+ #ifndef __NR_accept4
43
+ # if __x86_64__
44
+ # define __NR_accept4 288
45
+ # elif __i386__
46
+ /* Nothing. Handled through socketcall(). */
47
+ # elif __arm__
48
+ # define __NR_accept4 (UV_SYSCALL_BASE + 366)
49
+ # endif
50
+ #endif /* __NR_accept4 */
51
+
52
+ #ifndef __NR_eventfd
53
+ # if __x86_64__
54
+ # define __NR_eventfd 284
55
+ # elif __i386__
56
+ # define __NR_eventfd 323
57
+ # elif __arm__
58
+ # define __NR_eventfd (UV_SYSCALL_BASE + 351)
59
+ # endif
60
+ #endif /* __NR_eventfd */
61
+
62
+ #ifndef __NR_eventfd2
63
+ # if __x86_64__
64
+ # define __NR_eventfd2 290
65
+ # elif __i386__
66
+ # define __NR_eventfd2 328
67
+ # elif __arm__
68
+ # define __NR_eventfd2 (UV_SYSCALL_BASE + 356)
69
+ # endif
70
+ #endif /* __NR_eventfd2 */
71
+
72
+ #ifndef __NR_inotify_init
73
+ # if __x86_64__
74
+ # define __NR_inotify_init 253
75
+ # elif __i386__
76
+ # define __NR_inotify_init 291
77
+ # elif __arm__
78
+ # define __NR_inotify_init (UV_SYSCALL_BASE + 316)
79
+ # endif
80
+ #endif /* __NR_inotify_init */
81
+
82
+ #ifndef __NR_inotify_init1
83
+ # if __x86_64__
84
+ # define __NR_inotify_init1 294
85
+ # elif __i386__
86
+ # define __NR_inotify_init1 332
87
+ # elif __arm__
88
+ # define __NR_inotify_init1 (UV_SYSCALL_BASE + 360)
89
+ # endif
90
+ #endif /* __NR_inotify_init1 */
91
+
92
+ #ifndef __NR_inotify_add_watch
93
+ # if __x86_64__
94
+ # define __NR_inotify_add_watch 254
95
+ # elif __i386__
96
+ # define __NR_inotify_add_watch 292
97
+ # elif __arm__
98
+ # define __NR_inotify_add_watch (UV_SYSCALL_BASE + 317)
99
+ # endif
100
+ #endif /* __NR_inotify_add_watch */
101
+
102
+ #ifndef __NR_inotify_rm_watch
103
+ # if __x86_64__
104
+ # define __NR_inotify_rm_watch 255
105
+ # elif __i386__
106
+ # define __NR_inotify_rm_watch 293
107
+ # elif __arm__
108
+ # define __NR_inotify_rm_watch (UV_SYSCALL_BASE + 318)
109
+ # endif
110
+ #endif /* __NR_inotify_rm_watch */
111
+
112
+ #ifndef __NR_pipe2
113
+ # if __x86_64__
114
+ # define __NR_pipe2 293
115
+ # elif __i386__
116
+ # define __NR_pipe2 331
117
+ # elif __arm__
118
+ # define __NR_pipe2 (UV_SYSCALL_BASE + 359)
119
+ # endif
120
+ #endif /* __NR_pipe2 */
121
+
122
+ #ifndef __NR_recvmmsg
123
+ # if __x86_64__
124
+ # define __NR_recvmmsg 299
125
+ # elif __i386__
126
+ # define __NR_recvmmsg 337
127
+ # elif __arm__
128
+ # define __NR_recvmmsg (UV_SYSCALL_BASE + 365)
129
+ # endif
130
+ #endif /* __NR_recvmsg */
131
+
132
+ #ifndef __NR_sendmmsg
133
+ # if __x86_64__
134
+ # define __NR_sendmmsg 307
135
+ # elif __i386__
136
+ # define __NR_sendmmsg 345
137
+ # elif __arm__
138
+ # define __NR_sendmmsg (UV_SYSCALL_BASE + 374)
139
+ # endif
140
+ #endif /* __NR_sendmmsg */
141
+
142
+ #ifndef __NR_utimensat
143
+ # if __x86_64__
144
+ # define __NR_utimensat 280
145
+ # elif __i386__
146
+ # define __NR_utimensat 320
147
+ # elif __arm__
148
+ # define __NR_utimensat (UV_SYSCALL_BASE + 348)
149
+ # endif
150
+ #endif /* __NR_utimensat */
151
+
152
+
153
+ int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags) {
154
+ #if __i386__
155
+ unsigned long args[] = {
156
+ (unsigned long) fd,
157
+ (unsigned long) addr,
158
+ (unsigned long) addrlen,
159
+ (unsigned long) flags
160
+ };
161
+ return syscall(__NR_socketcall, 18 /* SYS_ACCEPT4 */, args);
162
+ #elif __NR_accept4
163
+ return syscall(__NR_accept4, fd, addr, addrlen, flags);
164
+ #else
165
+ return errno = ENOSYS, -1;
166
+ #endif
167
+ }
168
+
169
+
170
+ int uv__eventfd(unsigned int count) {
171
+ #if __NR_eventfd
172
+ return syscall(__NR_eventfd, count);
173
+ #else
174
+ return errno = ENOSYS, -1;
175
+ #endif
176
+ }
177
+
178
+
179
+ int uv__eventfd2(unsigned int count, int flags) {
180
+ #if __NR_eventfd2
181
+ return syscall(__NR_eventfd2, count, flags);
182
+ #else
183
+ return errno = ENOSYS, -1;
184
+ #endif
185
+ }
186
+
187
+
188
+ int uv__inotify_init(void) {
189
+ #if __NR_inotify_init
190
+ return syscall(__NR_inotify_init);
191
+ #else
192
+ return errno = ENOSYS, -1;
193
+ #endif
194
+ }
195
+
196
+
197
+ int uv__inotify_init1(int flags) {
198
+ #if __NR_inotify_init1
199
+ return syscall(__NR_inotify_init1, flags);
200
+ #else
201
+ return errno = ENOSYS, -1;
202
+ #endif
203
+ }
204
+
205
+
206
+ int uv__inotify_add_watch(int fd, const char* path, __u32 mask) {
207
+ #if __NR_inotify_add_watch
208
+ return syscall(__NR_inotify_add_watch, fd, path, mask);
209
+ #else
210
+ return errno = ENOSYS, -1;
211
+ #endif
212
+ }
213
+
214
+
215
+ int uv__inotify_rm_watch(int fd, __s32 wd) {
216
+ #if __NR_inotify_rm_watch
217
+ return syscall(__NR_inotify_rm_watch, fd, wd);
218
+ #else
219
+ return errno = ENOSYS, -1;
220
+ #endif
221
+ }
222
+
223
+
224
+ int uv__pipe2(int pipefd[2], int flags) {
225
+ #if __NR_pipe2
226
+ return syscall(__NR_pipe2, pipefd, flags);
227
+ #else
228
+ return errno = ENOSYS, -1;
229
+ #endif
230
+ }
231
+
232
+
233
+ int uv__sendmmsg(int fd,
234
+ struct uv__mmsghdr* mmsg,
235
+ unsigned int vlen,
236
+ unsigned int flags) {
237
+ #if __NR_sendmmsg
238
+ return syscall(__NR_sendmmsg, fd, mmsg, vlen, flags);
239
+ #else
240
+ return errno = ENOSYS, -1;
241
+ #endif
242
+ }
243
+
244
+
245
+ int uv__recvmmsg(int fd,
246
+ struct uv__mmsghdr* mmsg,
247
+ unsigned int vlen,
248
+ unsigned int flags,
249
+ struct timespec* timeout) {
250
+ #if __NR_recvmmsg
251
+ return syscall(__NR_recvmmsg, fd, mmsg, vlen, flags, timeout);
252
+ #else
253
+ return errno = ENOSYS, -1;
254
+ #endif
255
+ }
256
+
257
+
258
+ int uv__utimesat(int dirfd,
259
+ const char* path,
260
+ const struct timespec times[2],
261
+ int flags)
262
+ {
263
+ #if __NR_utimensat
264
+ return syscall(__NR_utimensat, dirfd, path, times, flags);
265
+ #else
266
+ return errno = ENOSYS, -1;
267
+ #endif
268
+ }