asyncengine 0.0.1.testing

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 (317) hide show
  1. data/README.markdown +0 -0
  2. data/asyncengine.gemspec +26 -0
  3. data/ext/asyncengine_ext/asyncengine_ruby.c +82 -0
  4. data/ext/asyncengine_ext/extconf.rb +47 -0
  5. data/ext/asyncengine_ext/libuv/AUTHORS +45 -0
  6. data/ext/asyncengine_ext/libuv/LICENSE +42 -0
  7. data/ext/asyncengine_ext/libuv/Makefile +119 -0
  8. data/ext/asyncengine_ext/libuv/README.md +88 -0
  9. data/ext/asyncengine_ext/libuv/build/gcc_version.py +20 -0
  10. data/ext/asyncengine_ext/libuv/common.gypi +176 -0
  11. data/ext/asyncengine_ext/libuv/config-mingw.mk +61 -0
  12. data/ext/asyncengine_ext/libuv/config-unix.mk +173 -0
  13. data/ext/asyncengine_ext/libuv/gyp_uv +60 -0
  14. data/ext/asyncengine_ext/libuv/include/ares.h +591 -0
  15. data/ext/asyncengine_ext/libuv/include/ares_version.h +24 -0
  16. data/ext/asyncengine_ext/libuv/include/uv-private/eio.h +403 -0
  17. data/ext/asyncengine_ext/libuv/include/uv-private/ev.h +838 -0
  18. data/ext/asyncengine_ext/libuv/include/uv-private/ngx-queue.h +106 -0
  19. data/ext/asyncengine_ext/libuv/include/uv-private/tree.h +768 -0
  20. data/ext/asyncengine_ext/libuv/include/uv-private/uv-unix.h +256 -0
  21. data/ext/asyncengine_ext/libuv/include/uv-private/uv-win.h +458 -0
  22. data/ext/asyncengine_ext/libuv/include/uv.h +1556 -0
  23. data/ext/asyncengine_ext/libuv/src/ares/AUTHORS +37 -0
  24. data/ext/asyncengine_ext/libuv/src/ares/CHANGES +1218 -0
  25. data/ext/asyncengine_ext/libuv/src/ares/CMakeLists.txt +22 -0
  26. data/ext/asyncengine_ext/libuv/src/ares/NEWS +21 -0
  27. data/ext/asyncengine_ext/libuv/src/ares/README +60 -0
  28. data/ext/asyncengine_ext/libuv/src/ares/README.cares +13 -0
  29. data/ext/asyncengine_ext/libuv/src/ares/README.msvc +142 -0
  30. data/ext/asyncengine_ext/libuv/src/ares/README.node +21 -0
  31. data/ext/asyncengine_ext/libuv/src/ares/RELEASE-NOTES +26 -0
  32. data/ext/asyncengine_ext/libuv/src/ares/TODO +23 -0
  33. data/ext/asyncengine_ext/libuv/src/ares/ares__close_sockets.c +66 -0
  34. data/ext/asyncengine_ext/libuv/src/ares/ares__get_hostent.c +263 -0
  35. data/ext/asyncengine_ext/libuv/src/ares/ares__read_line.c +71 -0
  36. data/ext/asyncengine_ext/libuv/src/ares/ares__timeval.c +111 -0
  37. data/ext/asyncengine_ext/libuv/src/ares/ares_cancel.c +63 -0
  38. data/ext/asyncengine_ext/libuv/src/ares/ares_data.c +190 -0
  39. data/ext/asyncengine_ext/libuv/src/ares/ares_data.h +65 -0
  40. data/ext/asyncengine_ext/libuv/src/ares/ares_destroy.c +105 -0
  41. data/ext/asyncengine_ext/libuv/src/ares/ares_dns.h +90 -0
  42. data/ext/asyncengine_ext/libuv/src/ares/ares_expand_name.c +200 -0
  43. data/ext/asyncengine_ext/libuv/src/ares/ares_expand_string.c +75 -0
  44. data/ext/asyncengine_ext/libuv/src/ares/ares_fds.c +63 -0
  45. data/ext/asyncengine_ext/libuv/src/ares/ares_free_hostent.c +42 -0
  46. data/ext/asyncengine_ext/libuv/src/ares/ares_free_string.c +25 -0
  47. data/ext/asyncengine_ext/libuv/src/ares/ares_getenv.c +30 -0
  48. data/ext/asyncengine_ext/libuv/src/ares/ares_getenv.h +26 -0
  49. data/ext/asyncengine_ext/libuv/src/ares/ares_gethostbyaddr.c +301 -0
  50. data/ext/asyncengine_ext/libuv/src/ares/ares_gethostbyname.c +523 -0
  51. data/ext/asyncengine_ext/libuv/src/ares/ares_getnameinfo.c +427 -0
  52. data/ext/asyncengine_ext/libuv/src/ares/ares_getopt.c +122 -0
  53. data/ext/asyncengine_ext/libuv/src/ares/ares_getopt.h +53 -0
  54. data/ext/asyncengine_ext/libuv/src/ares/ares_getsock.c +72 -0
  55. data/ext/asyncengine_ext/libuv/src/ares/ares_init.c +1809 -0
  56. data/ext/asyncengine_ext/libuv/src/ares/ares_iphlpapi.h +221 -0
  57. data/ext/asyncengine_ext/libuv/src/ares/ares_ipv6.h +78 -0
  58. data/ext/asyncengine_ext/libuv/src/ares/ares_library_init.c +142 -0
  59. data/ext/asyncengine_ext/libuv/src/ares/ares_library_init.h +42 -0
  60. data/ext/asyncengine_ext/libuv/src/ares/ares_llist.c +86 -0
  61. data/ext/asyncengine_ext/libuv/src/ares/ares_llist.h +42 -0
  62. data/ext/asyncengine_ext/libuv/src/ares/ares_mkquery.c +195 -0
  63. data/ext/asyncengine_ext/libuv/src/ares/ares_nowarn.c +181 -0
  64. data/ext/asyncengine_ext/libuv/src/ares/ares_nowarn.h +55 -0
  65. data/ext/asyncengine_ext/libuv/src/ares/ares_options.c +248 -0
  66. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_a_reply.c +263 -0
  67. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_aaaa_reply.c +259 -0
  68. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_mx_reply.c +170 -0
  69. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_ns_reply.c +182 -0
  70. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_ptr_reply.c +217 -0
  71. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_srv_reply.c +179 -0
  72. data/ext/asyncengine_ext/libuv/src/ares/ares_parse_txt_reply.c +201 -0
  73. data/ext/asyncengine_ext/libuv/src/ares/ares_platform.c +11035 -0
  74. data/ext/asyncengine_ext/libuv/src/ares/ares_platform.h +43 -0
  75. data/ext/asyncengine_ext/libuv/src/ares/ares_private.h +355 -0
  76. data/ext/asyncengine_ext/libuv/src/ares/ares_process.c +1295 -0
  77. data/ext/asyncengine_ext/libuv/src/ares/ares_query.c +183 -0
  78. data/ext/asyncengine_ext/libuv/src/ares/ares_rules.h +144 -0
  79. data/ext/asyncengine_ext/libuv/src/ares/ares_search.c +321 -0
  80. data/ext/asyncengine_ext/libuv/src/ares/ares_send.c +134 -0
  81. data/ext/asyncengine_ext/libuv/src/ares/ares_setup.h +199 -0
  82. data/ext/asyncengine_ext/libuv/src/ares/ares_strcasecmp.c +66 -0
  83. data/ext/asyncengine_ext/libuv/src/ares/ares_strcasecmp.h +30 -0
  84. data/ext/asyncengine_ext/libuv/src/ares/ares_strdup.c +42 -0
  85. data/ext/asyncengine_ext/libuv/src/ares/ares_strdup.h +26 -0
  86. data/ext/asyncengine_ext/libuv/src/ares/ares_strerror.c +56 -0
  87. data/ext/asyncengine_ext/libuv/src/ares/ares_timeout.c +80 -0
  88. data/ext/asyncengine_ext/libuv/src/ares/ares_version.c +11 -0
  89. data/ext/asyncengine_ext/libuv/src/ares/ares_writev.c +79 -0
  90. data/ext/asyncengine_ext/libuv/src/ares/ares_writev.h +36 -0
  91. data/ext/asyncengine_ext/libuv/src/ares/bitncmp.c +59 -0
  92. data/ext/asyncengine_ext/libuv/src/ares/bitncmp.h +26 -0
  93. data/ext/asyncengine_ext/libuv/src/ares/config_cygwin/ares_config.h +512 -0
  94. data/ext/asyncengine_ext/libuv/src/ares/config_darwin/ares_config.h +512 -0
  95. data/ext/asyncengine_ext/libuv/src/ares/config_freebsd/ares_config.h +512 -0
  96. data/ext/asyncengine_ext/libuv/src/ares/config_linux/ares_config.h +512 -0
  97. data/ext/asyncengine_ext/libuv/src/ares/config_netbsd/ares_config.h +512 -0
  98. data/ext/asyncengine_ext/libuv/src/ares/config_openbsd/ares_config.h +512 -0
  99. data/ext/asyncengine_ext/libuv/src/ares/config_sunos/ares_config.h +512 -0
  100. data/ext/asyncengine_ext/libuv/src/ares/config_win32/ares_config.h +369 -0
  101. data/ext/asyncengine_ext/libuv/src/ares/get_ver.awk +35 -0
  102. data/ext/asyncengine_ext/libuv/src/ares/inet_net_pton.c +451 -0
  103. data/ext/asyncengine_ext/libuv/src/ares/inet_net_pton.h +31 -0
  104. data/ext/asyncengine_ext/libuv/src/ares/inet_ntop.c +208 -0
  105. data/ext/asyncengine_ext/libuv/src/ares/inet_ntop.h +26 -0
  106. data/ext/asyncengine_ext/libuv/src/ares/nameser.h +203 -0
  107. data/ext/asyncengine_ext/libuv/src/ares/setup_once.h +504 -0
  108. data/ext/asyncengine_ext/libuv/src/ares/windows_port.c +22 -0
  109. data/ext/asyncengine_ext/libuv/src/unix/async.c +58 -0
  110. data/ext/asyncengine_ext/libuv/src/unix/cares.c +194 -0
  111. data/ext/asyncengine_ext/libuv/src/unix/check.c +80 -0
  112. data/ext/asyncengine_ext/libuv/src/unix/core.c +588 -0
  113. data/ext/asyncengine_ext/libuv/src/unix/cygwin.c +84 -0
  114. data/ext/asyncengine_ext/libuv/src/unix/darwin.c +341 -0
  115. data/ext/asyncengine_ext/libuv/src/unix/dl.c +91 -0
  116. data/ext/asyncengine_ext/libuv/src/unix/eio/Changes +63 -0
  117. data/ext/asyncengine_ext/libuv/src/unix/eio/LICENSE +36 -0
  118. data/ext/asyncengine_ext/libuv/src/unix/eio/Makefile.am +15 -0
  119. data/ext/asyncengine_ext/libuv/src/unix/eio/aclocal.m4 +8957 -0
  120. data/ext/asyncengine_ext/libuv/src/unix/eio/autogen.sh +3 -0
  121. data/ext/asyncengine_ext/libuv/src/unix/eio/config.h.in +86 -0
  122. data/ext/asyncengine_ext/libuv/src/unix/eio/config_cygwin.h +80 -0
  123. data/ext/asyncengine_ext/libuv/src/unix/eio/config_darwin.h +141 -0
  124. data/ext/asyncengine_ext/libuv/src/unix/eio/config_freebsd.h +81 -0
  125. data/ext/asyncengine_ext/libuv/src/unix/eio/config_linux.h +94 -0
  126. data/ext/asyncengine_ext/libuv/src/unix/eio/config_netbsd.h +81 -0
  127. data/ext/asyncengine_ext/libuv/src/unix/eio/config_openbsd.h +137 -0
  128. data/ext/asyncengine_ext/libuv/src/unix/eio/config_sunos.h +84 -0
  129. data/ext/asyncengine_ext/libuv/src/unix/eio/configure.ac +22 -0
  130. data/ext/asyncengine_ext/libuv/src/unix/eio/demo.c +194 -0
  131. data/ext/asyncengine_ext/libuv/src/unix/eio/ecb.h +370 -0
  132. data/ext/asyncengine_ext/libuv/src/unix/eio/eio.3 +3428 -0
  133. data/ext/asyncengine_ext/libuv/src/unix/eio/eio.c +2593 -0
  134. data/ext/asyncengine_ext/libuv/src/unix/eio/eio.pod +969 -0
  135. data/ext/asyncengine_ext/libuv/src/unix/eio/libeio.m4 +195 -0
  136. data/ext/asyncengine_ext/libuv/src/unix/eio/xthread.h +164 -0
  137. data/ext/asyncengine_ext/libuv/src/unix/error.c +98 -0
  138. data/ext/asyncengine_ext/libuv/src/unix/ev/Changes +388 -0
  139. data/ext/asyncengine_ext/libuv/src/unix/ev/LICENSE +36 -0
  140. data/ext/asyncengine_ext/libuv/src/unix/ev/Makefile.am +18 -0
  141. data/ext/asyncengine_ext/libuv/src/unix/ev/Makefile.in +771 -0
  142. data/ext/asyncengine_ext/libuv/src/unix/ev/README +58 -0
  143. data/ext/asyncengine_ext/libuv/src/unix/ev/aclocal.m4 +8957 -0
  144. data/ext/asyncengine_ext/libuv/src/unix/ev/autogen.sh +6 -0
  145. data/ext/asyncengine_ext/libuv/src/unix/ev/config.guess +1526 -0
  146. data/ext/asyncengine_ext/libuv/src/unix/ev/config.h.in +125 -0
  147. data/ext/asyncengine_ext/libuv/src/unix/ev/config.sub +1658 -0
  148. data/ext/asyncengine_ext/libuv/src/unix/ev/config_cygwin.h +123 -0
  149. data/ext/asyncengine_ext/libuv/src/unix/ev/config_darwin.h +122 -0
  150. data/ext/asyncengine_ext/libuv/src/unix/ev/config_freebsd.h +120 -0
  151. data/ext/asyncengine_ext/libuv/src/unix/ev/config_linux.h +141 -0
  152. data/ext/asyncengine_ext/libuv/src/unix/ev/config_netbsd.h +120 -0
  153. data/ext/asyncengine_ext/libuv/src/unix/ev/config_openbsd.h +126 -0
  154. data/ext/asyncengine_ext/libuv/src/unix/ev/config_sunos.h +122 -0
  155. data/ext/asyncengine_ext/libuv/src/unix/ev/configure +13037 -0
  156. data/ext/asyncengine_ext/libuv/src/unix/ev/configure.ac +18 -0
  157. data/ext/asyncengine_ext/libuv/src/unix/ev/depcomp +630 -0
  158. data/ext/asyncengine_ext/libuv/src/unix/ev/ev++.h +816 -0
  159. data/ext/asyncengine_ext/libuv/src/unix/ev/ev.3 +5311 -0
  160. data/ext/asyncengine_ext/libuv/src/unix/ev/ev.c +3921 -0
  161. data/ext/asyncengine_ext/libuv/src/unix/ev/ev.pod +5243 -0
  162. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_epoll.c +266 -0
  163. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_kqueue.c +235 -0
  164. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_poll.c +148 -0
  165. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_port.c +179 -0
  166. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_select.c +310 -0
  167. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_vars.h +203 -0
  168. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_win32.c +153 -0
  169. data/ext/asyncengine_ext/libuv/src/unix/ev/ev_wrap.h +196 -0
  170. data/ext/asyncengine_ext/libuv/src/unix/ev/event.c +402 -0
  171. data/ext/asyncengine_ext/libuv/src/unix/ev/event.h +170 -0
  172. data/ext/asyncengine_ext/libuv/src/unix/ev/install-sh +294 -0
  173. data/ext/asyncengine_ext/libuv/src/unix/ev/libev.m4 +39 -0
  174. data/ext/asyncengine_ext/libuv/src/unix/ev/ltmain.sh +8413 -0
  175. data/ext/asyncengine_ext/libuv/src/unix/ev/missing +336 -0
  176. data/ext/asyncengine_ext/libuv/src/unix/ev/mkinstalldirs +111 -0
  177. data/ext/asyncengine_ext/libuv/src/unix/freebsd.c +312 -0
  178. data/ext/asyncengine_ext/libuv/src/unix/fs.c +707 -0
  179. data/ext/asyncengine_ext/libuv/src/unix/idle.c +79 -0
  180. data/ext/asyncengine_ext/libuv/src/unix/internal.h +161 -0
  181. data/ext/asyncengine_ext/libuv/src/unix/kqueue.c +127 -0
  182. data/ext/asyncengine_ext/libuv/src/unix/linux/core.c +474 -0
  183. data/ext/asyncengine_ext/libuv/src/unix/linux/inotify.c +211 -0
  184. data/ext/asyncengine_ext/libuv/src/unix/linux/syscalls.c +230 -0
  185. data/ext/asyncengine_ext/libuv/src/unix/linux/syscalls.h +87 -0
  186. data/ext/asyncengine_ext/libuv/src/unix/loop.c +58 -0
  187. data/ext/asyncengine_ext/libuv/src/unix/netbsd.c +108 -0
  188. data/ext/asyncengine_ext/libuv/src/unix/openbsd.c +295 -0
  189. data/ext/asyncengine_ext/libuv/src/unix/pipe.c +266 -0
  190. data/ext/asyncengine_ext/libuv/src/unix/prepare.c +79 -0
  191. data/ext/asyncengine_ext/libuv/src/unix/process.c +369 -0
  192. data/ext/asyncengine_ext/libuv/src/unix/stream.c +1033 -0
  193. data/ext/asyncengine_ext/libuv/src/unix/sunos.c +466 -0
  194. data/ext/asyncengine_ext/libuv/src/unix/tcp.c +327 -0
  195. data/ext/asyncengine_ext/libuv/src/unix/thread.c +154 -0
  196. data/ext/asyncengine_ext/libuv/src/unix/timer.c +127 -0
  197. data/ext/asyncengine_ext/libuv/src/unix/tty.c +146 -0
  198. data/ext/asyncengine_ext/libuv/src/unix/udp.c +670 -0
  199. data/ext/asyncengine_ext/libuv/src/unix/uv-eio.c +124 -0
  200. data/ext/asyncengine_ext/libuv/src/unix/uv-eio.h +13 -0
  201. data/ext/asyncengine_ext/libuv/src/uv-common.c +354 -0
  202. data/ext/asyncengine_ext/libuv/src/uv-common.h +87 -0
  203. data/ext/asyncengine_ext/libuv/src/win/async.c +127 -0
  204. data/ext/asyncengine_ext/libuv/src/win/cares.c +290 -0
  205. data/ext/asyncengine_ext/libuv/src/win/core.c +270 -0
  206. data/ext/asyncengine_ext/libuv/src/win/dl.c +82 -0
  207. data/ext/asyncengine_ext/libuv/src/win/error.c +132 -0
  208. data/ext/asyncengine_ext/libuv/src/win/fs-event.c +514 -0
  209. data/ext/asyncengine_ext/libuv/src/win/fs.c +1576 -0
  210. data/ext/asyncengine_ext/libuv/src/win/getaddrinfo.c +372 -0
  211. data/ext/asyncengine_ext/libuv/src/win/handle.c +225 -0
  212. data/ext/asyncengine_ext/libuv/src/win/internal.h +352 -0
  213. data/ext/asyncengine_ext/libuv/src/win/loop-watcher.c +131 -0
  214. data/ext/asyncengine_ext/libuv/src/win/pipe.c +1661 -0
  215. data/ext/asyncengine_ext/libuv/src/win/process.c +1140 -0
  216. data/ext/asyncengine_ext/libuv/src/win/req.c +174 -0
  217. data/ext/asyncengine_ext/libuv/src/win/stream.c +201 -0
  218. data/ext/asyncengine_ext/libuv/src/win/tcp.c +1282 -0
  219. data/ext/asyncengine_ext/libuv/src/win/thread.c +332 -0
  220. data/ext/asyncengine_ext/libuv/src/win/threadpool.c +73 -0
  221. data/ext/asyncengine_ext/libuv/src/win/timer.c +276 -0
  222. data/ext/asyncengine_ext/libuv/src/win/tty.c +1795 -0
  223. data/ext/asyncengine_ext/libuv/src/win/udp.c +709 -0
  224. data/ext/asyncengine_ext/libuv/src/win/util.c +719 -0
  225. data/ext/asyncengine_ext/libuv/src/win/winapi.c +117 -0
  226. data/ext/asyncengine_ext/libuv/src/win/winapi.h +4419 -0
  227. data/ext/asyncengine_ext/libuv/src/win/winsock.c +470 -0
  228. data/ext/asyncengine_ext/libuv/src/win/winsock.h +138 -0
  229. data/ext/asyncengine_ext/libuv/test/benchmark-ares.c +118 -0
  230. data/ext/asyncengine_ext/libuv/test/benchmark-getaddrinfo.c +94 -0
  231. data/ext/asyncengine_ext/libuv/test/benchmark-list.h +105 -0
  232. data/ext/asyncengine_ext/libuv/test/benchmark-ping-pongs.c +213 -0
  233. data/ext/asyncengine_ext/libuv/test/benchmark-pound.c +324 -0
  234. data/ext/asyncengine_ext/libuv/test/benchmark-pump.c +462 -0
  235. data/ext/asyncengine_ext/libuv/test/benchmark-sizes.c +40 -0
  236. data/ext/asyncengine_ext/libuv/test/benchmark-spawn.c +156 -0
  237. data/ext/asyncengine_ext/libuv/test/benchmark-tcp-write-batch.c +140 -0
  238. data/ext/asyncengine_ext/libuv/test/benchmark-thread.c +64 -0
  239. data/ext/asyncengine_ext/libuv/test/benchmark-udp-packet-storm.c +247 -0
  240. data/ext/asyncengine_ext/libuv/test/blackhole-server.c +118 -0
  241. data/ext/asyncengine_ext/libuv/test/dns-server.c +321 -0
  242. data/ext/asyncengine_ext/libuv/test/echo-server.c +370 -0
  243. data/ext/asyncengine_ext/libuv/test/fixtures/empty_file +0 -0
  244. data/ext/asyncengine_ext/libuv/test/fixtures/load_error.node +1 -0
  245. data/ext/asyncengine_ext/libuv/test/run-benchmarks.c +64 -0
  246. data/ext/asyncengine_ext/libuv/test/run-tests.c +108 -0
  247. data/ext/asyncengine_ext/libuv/test/runner-unix.c +315 -0
  248. data/ext/asyncengine_ext/libuv/test/runner-unix.h +36 -0
  249. data/ext/asyncengine_ext/libuv/test/runner-win.c +343 -0
  250. data/ext/asyncengine_ext/libuv/test/runner-win.h +42 -0
  251. data/ext/asyncengine_ext/libuv/test/runner.c +317 -0
  252. data/ext/asyncengine_ext/libuv/test/runner.h +159 -0
  253. data/ext/asyncengine_ext/libuv/test/task.h +117 -0
  254. data/ext/asyncengine_ext/libuv/test/test-async.c +216 -0
  255. data/ext/asyncengine_ext/libuv/test/test-callback-stack.c +203 -0
  256. data/ext/asyncengine_ext/libuv/test/test-connection-fail.c +148 -0
  257. data/ext/asyncengine_ext/libuv/test/test-counters-init.c +216 -0
  258. data/ext/asyncengine_ext/libuv/test/test-cwd-and-chdir.c +64 -0
  259. data/ext/asyncengine_ext/libuv/test/test-delayed-accept.c +197 -0
  260. data/ext/asyncengine_ext/libuv/test/test-dlerror.c +49 -0
  261. data/ext/asyncengine_ext/libuv/test/test-eio-overflow.c +90 -0
  262. data/ext/asyncengine_ext/libuv/test/test-error.c +59 -0
  263. data/ext/asyncengine_ext/libuv/test/test-fail-always.c +29 -0
  264. data/ext/asyncengine_ext/libuv/test/test-fs-event.c +442 -0
  265. data/ext/asyncengine_ext/libuv/test/test-fs.c +1731 -0
  266. data/ext/asyncengine_ext/libuv/test/test-get-currentexe.c +63 -0
  267. data/ext/asyncengine_ext/libuv/test/test-get-loadavg.c +36 -0
  268. data/ext/asyncengine_ext/libuv/test/test-get-memory.c +38 -0
  269. data/ext/asyncengine_ext/libuv/test/test-getaddrinfo.c +122 -0
  270. data/ext/asyncengine_ext/libuv/test/test-gethostbyname.c +189 -0
  271. data/ext/asyncengine_ext/libuv/test/test-getsockname.c +342 -0
  272. data/ext/asyncengine_ext/libuv/test/test-hrtime.c +51 -0
  273. data/ext/asyncengine_ext/libuv/test/test-idle.c +81 -0
  274. data/ext/asyncengine_ext/libuv/test/test-ipc-send-recv.c +209 -0
  275. data/ext/asyncengine_ext/libuv/test/test-ipc.c +614 -0
  276. data/ext/asyncengine_ext/libuv/test/test-list.h +371 -0
  277. data/ext/asyncengine_ext/libuv/test/test-loop-handles.c +359 -0
  278. data/ext/asyncengine_ext/libuv/test/test-multiple-listen.c +102 -0
  279. data/ext/asyncengine_ext/libuv/test/test-mutexes.c +63 -0
  280. data/ext/asyncengine_ext/libuv/test/test-pass-always.c +28 -0
  281. data/ext/asyncengine_ext/libuv/test/test-ping-pong.c +253 -0
  282. data/ext/asyncengine_ext/libuv/test/test-pipe-bind-error.c +140 -0
  283. data/ext/asyncengine_ext/libuv/test/test-pipe-connect-error.c +96 -0
  284. data/ext/asyncengine_ext/libuv/test/test-platform-output.c +87 -0
  285. data/ext/asyncengine_ext/libuv/test/test-process-title.c +42 -0
  286. data/ext/asyncengine_ext/libuv/test/test-ref.c +322 -0
  287. data/ext/asyncengine_ext/libuv/test/test-run-once.c +44 -0
  288. data/ext/asyncengine_ext/libuv/test/test-shutdown-close.c +103 -0
  289. data/ext/asyncengine_ext/libuv/test/test-shutdown-eof.c +183 -0
  290. data/ext/asyncengine_ext/libuv/test/test-spawn.c +499 -0
  291. data/ext/asyncengine_ext/libuv/test/test-stdio-over-pipes.c +256 -0
  292. data/ext/asyncengine_ext/libuv/test/test-tcp-bind-error.c +191 -0
  293. data/ext/asyncengine_ext/libuv/test/test-tcp-bind6-error.c +154 -0
  294. data/ext/asyncengine_ext/libuv/test/test-tcp-close.c +129 -0
  295. data/ext/asyncengine_ext/libuv/test/test-tcp-connect-error.c +70 -0
  296. data/ext/asyncengine_ext/libuv/test/test-tcp-connect6-error.c +68 -0
  297. data/ext/asyncengine_ext/libuv/test/test-tcp-flags.c +51 -0
  298. data/ext/asyncengine_ext/libuv/test/test-tcp-write-error.c +168 -0
  299. data/ext/asyncengine_ext/libuv/test/test-tcp-write-to-half-open-connection.c +135 -0
  300. data/ext/asyncengine_ext/libuv/test/test-tcp-writealot.c +195 -0
  301. data/ext/asyncengine_ext/libuv/test/test-thread.c +183 -0
  302. data/ext/asyncengine_ext/libuv/test/test-threadpool.c +57 -0
  303. data/ext/asyncengine_ext/libuv/test/test-timer-again.c +141 -0
  304. data/ext/asyncengine_ext/libuv/test/test-timer.c +130 -0
  305. data/ext/asyncengine_ext/libuv/test/test-tty.c +110 -0
  306. data/ext/asyncengine_ext/libuv/test/test-udp-dgram-too-big.c +86 -0
  307. data/ext/asyncengine_ext/libuv/test/test-udp-ipv6.c +156 -0
  308. data/ext/asyncengine_ext/libuv/test/test-udp-multicast-join.c +139 -0
  309. data/ext/asyncengine_ext/libuv/test/test-udp-multicast-ttl.c +86 -0
  310. data/ext/asyncengine_ext/libuv/test/test-udp-options.c +86 -0
  311. data/ext/asyncengine_ext/libuv/test/test-udp-send-and-recv.c +208 -0
  312. data/ext/asyncengine_ext/libuv/test/test-util.c +97 -0
  313. data/ext/asyncengine_ext/libuv/uv.gyp +435 -0
  314. data/ext/asyncengine_ext/libuv/vcbuild.bat +105 -0
  315. data/lib/asyncengine/version.rb +3 -0
  316. data/lib/asyncengine.rb +41 -0
  317. metadata +384 -0
@@ -0,0 +1,670 @@
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 "uv.h"
23
+ #include "internal.h"
24
+
25
+ #include <assert.h>
26
+ #include <string.h>
27
+ #include <errno.h>
28
+ #include <stdlib.h>
29
+ #include <unistd.h>
30
+
31
+
32
+ static void uv__udp_run_completed(uv_udp_t* handle);
33
+ static void uv__udp_run_pending(uv_udp_t* handle);
34
+ static void uv__udp_recvmsg(EV_P_ ev_io* w, int revents);
35
+ static void uv__udp_sendmsg(EV_P_ ev_io* w, int revents);
36
+ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain);
37
+ static int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, uv_buf_t bufs[],
38
+ int bufcnt, struct sockaddr* addr, socklen_t addrlen, uv_udp_send_cb send_cb);
39
+
40
+
41
+ static void uv__udp_start_watcher(uv_udp_t* handle,
42
+ ev_io* w,
43
+ void (*cb)(EV_P_ ev_io*, int),
44
+ int flags) {
45
+ if (ev_is_active(w)) return;
46
+ ev_set_cb(w, cb);
47
+ ev_io_set(w, handle->fd, flags);
48
+ ev_io_start(handle->loop->ev, w);
49
+ ev_unref(handle->loop->ev);
50
+ }
51
+
52
+
53
+ static void uv__udp_stop_watcher(uv_udp_t* handle, ev_io* w) {
54
+ if (!ev_is_active(w)) return;
55
+ ev_ref(handle->loop->ev);
56
+ ev_io_stop(handle->loop->ev, w);
57
+ ev_io_set(w, -1, 0);
58
+ ev_set_cb(w, NULL);
59
+ }
60
+
61
+
62
+ static void uv__udp_start_read_watcher(uv_udp_t* handle) {
63
+ uv__udp_start_watcher(handle,
64
+ &handle->read_watcher,
65
+ uv__udp_recvmsg,
66
+ EV_READ);
67
+ }
68
+
69
+
70
+ static void uv__udp_start_write_watcher(uv_udp_t* handle) {
71
+ uv__udp_start_watcher(handle,
72
+ &handle->write_watcher,
73
+ uv__udp_sendmsg,
74
+ EV_WRITE);
75
+ }
76
+
77
+
78
+ static void uv__udp_stop_read_watcher(uv_udp_t* handle) {
79
+ uv__udp_stop_watcher(handle, &handle->read_watcher);
80
+ }
81
+
82
+
83
+ static void uv__udp_stop_write_watcher(uv_udp_t* handle) {
84
+ uv__udp_stop_watcher(handle, &handle->write_watcher);
85
+ }
86
+
87
+
88
+ void uv__udp_close(uv_udp_t* handle) {
89
+ uv__udp_stop_write_watcher(handle);
90
+ uv__udp_stop_read_watcher(handle);
91
+ close(handle->fd);
92
+ handle->fd = -1;
93
+ }
94
+
95
+
96
+ void uv__udp_finish_close(uv_udp_t* handle) {
97
+ uv_udp_send_t* req;
98
+ ngx_queue_t* q;
99
+
100
+ assert(!ev_is_active(&handle->write_watcher));
101
+ assert(!ev_is_active(&handle->read_watcher));
102
+ assert(handle->fd == -1);
103
+
104
+ uv__udp_run_completed(handle);
105
+
106
+ while (!ngx_queue_empty(&handle->write_queue)) {
107
+ q = ngx_queue_head(&handle->write_queue);
108
+ ngx_queue_remove(q);
109
+
110
+ req = ngx_queue_data(q, uv_udp_send_t, queue);
111
+ if (req->send_cb) {
112
+ /* FIXME proper error code like UV_EABORTED */
113
+ uv__set_artificial_error(handle->loop, UV_EINTR);
114
+ req->send_cb(req, -1);
115
+ }
116
+ }
117
+
118
+ /* Now tear down the handle. */
119
+ handle->flags = 0;
120
+ handle->recv_cb = NULL;
121
+ handle->alloc_cb = NULL;
122
+ /* but _do not_ touch close_cb */
123
+ }
124
+
125
+
126
+ static void uv__udp_run_pending(uv_udp_t* handle) {
127
+ uv_udp_send_t* req;
128
+ ngx_queue_t* q;
129
+ struct msghdr h;
130
+ ssize_t size;
131
+
132
+ while (!ngx_queue_empty(&handle->write_queue)) {
133
+ q = ngx_queue_head(&handle->write_queue);
134
+ assert(q != NULL);
135
+
136
+ req = ngx_queue_data(q, uv_udp_send_t, queue);
137
+ assert(req != NULL);
138
+
139
+ memset(&h, 0, sizeof h);
140
+ h.msg_name = &req->addr;
141
+ h.msg_namelen = req->addrlen;
142
+ h.msg_iov = (struct iovec*)req->bufs;
143
+ h.msg_iovlen = req->bufcnt;
144
+
145
+ do {
146
+ size = sendmsg(handle->fd, &h, 0);
147
+ }
148
+ while (size == -1 && errno == EINTR);
149
+
150
+ /* TODO try to write once or twice more in the
151
+ * hope that the socket becomes readable again?
152
+ */
153
+ if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
154
+ break;
155
+
156
+ req->status = (size == -1 ? -errno : size);
157
+
158
+ #ifndef NDEBUG
159
+ /* Sanity check. */
160
+ if (size != -1) {
161
+ ssize_t nbytes;
162
+ int i;
163
+
164
+ for (nbytes = i = 0; i < req->bufcnt; i++)
165
+ nbytes += req->bufs[i].len;
166
+
167
+ assert(size == nbytes);
168
+ }
169
+ #endif
170
+
171
+ /* Sending a datagram is an atomic operation: either all data
172
+ * is written or nothing is (and EMSGSIZE is raised). That is
173
+ * why we don't handle partial writes. Just pop the request
174
+ * off the write queue and onto the completed queue, done.
175
+ */
176
+ ngx_queue_remove(&req->queue);
177
+ ngx_queue_insert_tail(&handle->write_completed_queue, &req->queue);
178
+ }
179
+ }
180
+
181
+
182
+ static void uv__udp_run_completed(uv_udp_t* handle) {
183
+ uv_udp_send_t* req;
184
+ ngx_queue_t* q;
185
+
186
+ while (!ngx_queue_empty(&handle->write_completed_queue)) {
187
+ q = ngx_queue_head(&handle->write_completed_queue);
188
+ assert(q != NULL);
189
+
190
+ ngx_queue_remove(q);
191
+
192
+ req = ngx_queue_data(q, uv_udp_send_t, queue);
193
+ assert(req != NULL);
194
+
195
+ if (req->bufs != req->bufsml)
196
+ free(req->bufs);
197
+
198
+ if (req->send_cb == NULL)
199
+ continue;
200
+
201
+ /* req->status >= 0 == bytes written
202
+ * req->status < 0 == errno
203
+ */
204
+ if (req->status >= 0) {
205
+ req->send_cb(req, 0);
206
+ }
207
+ else {
208
+ uv__set_sys_error(handle->loop, -req->status);
209
+ req->send_cb(req, -1);
210
+ }
211
+ }
212
+ }
213
+
214
+
215
+ static void uv__udp_recvmsg(EV_P_ ev_io* w, int revents) {
216
+ struct sockaddr_storage peer;
217
+ struct msghdr h;
218
+ uv_udp_t* handle;
219
+ ssize_t nread;
220
+ uv_buf_t buf;
221
+ int flags;
222
+
223
+ handle = container_of(w, uv_udp_t, read_watcher);
224
+ assert(handle->type == UV_UDP);
225
+ assert(revents & EV_READ);
226
+
227
+ assert(handle->recv_cb != NULL);
228
+ assert(handle->alloc_cb != NULL);
229
+
230
+ do {
231
+ /* FIXME: hoist alloc_cb out the loop but for now follow uv__read() */
232
+ buf = handle->alloc_cb((uv_handle_t*)handle, 64 * 1024);
233
+ assert(buf.len > 0);
234
+ assert(buf.base != NULL);
235
+
236
+ memset(&h, 0, sizeof h);
237
+ h.msg_name = &peer;
238
+ h.msg_namelen = sizeof peer;
239
+ h.msg_iov = (struct iovec*)&buf;
240
+ h.msg_iovlen = 1;
241
+
242
+ do {
243
+ nread = recvmsg(handle->fd, &h, 0);
244
+ }
245
+ while (nread == -1 && errno == EINTR);
246
+
247
+ if (nread == -1) {
248
+ if (errno == EAGAIN || errno == EWOULDBLOCK) {
249
+ uv__set_sys_error(handle->loop, EAGAIN);
250
+ handle->recv_cb(handle, 0, buf, NULL, 0);
251
+ }
252
+ else {
253
+ uv__set_sys_error(handle->loop, errno);
254
+ handle->recv_cb(handle, -1, buf, NULL, 0);
255
+ }
256
+ }
257
+ else {
258
+ flags = 0;
259
+
260
+ if (h.msg_flags & MSG_TRUNC)
261
+ flags |= UV_UDP_PARTIAL;
262
+
263
+ handle->recv_cb(handle,
264
+ nread,
265
+ buf,
266
+ (struct sockaddr*)&peer,
267
+ flags);
268
+ }
269
+ }
270
+ /* recv_cb callback may decide to pause or close the handle */
271
+ while (nread != -1
272
+ && handle->fd != -1
273
+ && handle->recv_cb != NULL);
274
+ }
275
+
276
+
277
+ static void uv__udp_sendmsg(EV_P_ ev_io* w, int revents) {
278
+ uv_udp_t* handle;
279
+
280
+ handle = container_of(w, uv_udp_t, write_watcher);
281
+ assert(handle->type == UV_UDP);
282
+ assert(revents & EV_WRITE);
283
+
284
+ assert(!ngx_queue_empty(&handle->write_queue)
285
+ || !ngx_queue_empty(&handle->write_completed_queue));
286
+
287
+ /* Write out pending data first. */
288
+ uv__udp_run_pending(handle);
289
+
290
+ /* Drain 'request completed' queue. */
291
+ uv__udp_run_completed(handle);
292
+
293
+ if (!ngx_queue_empty(&handle->write_completed_queue)) {
294
+ /* Schedule completion callbacks. */
295
+ ev_feed_event(handle->loop->ev, &handle->write_watcher, EV_WRITE);
296
+ }
297
+ else if (ngx_queue_empty(&handle->write_queue)) {
298
+ /* Pending queue and completion queue empty, stop watcher. */
299
+ uv__udp_stop_write_watcher(handle);
300
+ }
301
+ }
302
+
303
+
304
+ static int uv__bind(uv_udp_t* handle,
305
+ int domain,
306
+ struct sockaddr* addr,
307
+ socklen_t len,
308
+ unsigned flags) {
309
+ int saved_errno;
310
+ int status;
311
+ int yes;
312
+ int fd;
313
+
314
+ saved_errno = errno;
315
+ status = -1;
316
+ fd = -1;
317
+
318
+ /* Check for bad flags. */
319
+ if (flags & ~UV_UDP_IPV6ONLY) {
320
+ uv__set_sys_error(handle->loop, EINVAL);
321
+ goto out;
322
+ }
323
+
324
+ /* Cannot set IPv6-only mode on non-IPv6 socket. */
325
+ if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6) {
326
+ uv__set_sys_error(handle->loop, EINVAL);
327
+ goto out;
328
+ }
329
+
330
+ /* Check for already active socket. */
331
+ if (handle->fd != -1) {
332
+ uv__set_artificial_error(handle->loop, UV_EALREADY);
333
+ goto out;
334
+ }
335
+
336
+ if ((fd = uv__socket(domain, SOCK_DGRAM, 0)) == -1) {
337
+ uv__set_sys_error(handle->loop, errno);
338
+ goto out;
339
+ }
340
+
341
+ yes = 1;
342
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) == -1) {
343
+ uv__set_sys_error(handle->loop, errno);
344
+ goto out;
345
+ }
346
+
347
+ /* On the BSDs, SO_REUSEADDR lets you reuse an address that's in the TIME_WAIT
348
+ * state (i.e. was until recently tied to a socket) while SO_REUSEPORT lets
349
+ * multiple processes bind to the same address. Yes, it's something of a
350
+ * misnomer but then again, SO_REUSEADDR was already taken.
351
+ *
352
+ * None of the above applies to Linux: SO_REUSEADDR implies SO_REUSEPORT on
353
+ * Linux and hence it does not have SO_REUSEPORT at all.
354
+ */
355
+ #ifdef SO_REUSEPORT
356
+ yes = 1;
357
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof yes) == -1) {
358
+ uv__set_sys_error(handle->loop, errno);
359
+ goto out;
360
+ }
361
+ #endif
362
+
363
+ if (flags & UV_UDP_IPV6ONLY) {
364
+ #ifdef IPV6_V6ONLY
365
+ yes = 1;
366
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) {
367
+ uv__set_sys_error(handle->loop, errno);
368
+ goto out;
369
+ }
370
+ #else
371
+ uv__set_sys_error(handle->loop, ENOTSUP);
372
+ goto out;
373
+ #endif
374
+ }
375
+
376
+ if (bind(fd, addr, len) == -1) {
377
+ uv__set_sys_error(handle->loop, errno);
378
+ goto out;
379
+ }
380
+
381
+ handle->fd = fd;
382
+ status = 0;
383
+
384
+ out:
385
+ if (status)
386
+ close(fd);
387
+
388
+ errno = saved_errno;
389
+ return status;
390
+ }
391
+
392
+
393
+ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain) {
394
+ struct sockaddr_storage taddr;
395
+ socklen_t addrlen;
396
+
397
+ assert(domain == AF_INET || domain == AF_INET6);
398
+
399
+ if (handle->fd != -1)
400
+ return 0;
401
+
402
+ switch (domain) {
403
+ case AF_INET:
404
+ {
405
+ struct sockaddr_in* addr = (void*)&taddr;
406
+ memset(addr, 0, sizeof *addr);
407
+ addr->sin_family = AF_INET;
408
+ addr->sin_addr.s_addr = INADDR_ANY;
409
+ addrlen = sizeof *addr;
410
+ break;
411
+ }
412
+ case AF_INET6:
413
+ {
414
+ struct sockaddr_in6* addr = (void*)&taddr;
415
+ memset(addr, 0, sizeof *addr);
416
+ addr->sin6_family = AF_INET6;
417
+ addr->sin6_addr = in6addr_any;
418
+ addrlen = sizeof *addr;
419
+ break;
420
+ }
421
+ default:
422
+ assert(0 && "unsupported address family");
423
+ abort();
424
+ }
425
+
426
+ return uv__bind(handle, domain, (struct sockaddr*)&taddr, addrlen, 0);
427
+ }
428
+
429
+
430
+ static int uv__udp_send(uv_udp_send_t* req,
431
+ uv_udp_t* handle,
432
+ uv_buf_t bufs[],
433
+ int bufcnt,
434
+ struct sockaddr* addr,
435
+ socklen_t addrlen,
436
+ uv_udp_send_cb send_cb) {
437
+ if (uv__udp_maybe_deferred_bind(handle, addr->sa_family))
438
+ return -1;
439
+
440
+ uv__req_init(handle->loop, (uv_req_t*)req);
441
+
442
+ memcpy(&req->addr, addr, addrlen);
443
+ req->addrlen = addrlen;
444
+ req->send_cb = send_cb;
445
+ req->handle = handle;
446
+ req->bufcnt = bufcnt;
447
+ req->type = UV_UDP_SEND;
448
+
449
+ if (bufcnt <= UV_REQ_BUFSML_SIZE) {
450
+ req->bufs = req->bufsml;
451
+ }
452
+ else if ((req->bufs = malloc(bufcnt * sizeof(bufs[0]))) == NULL) {
453
+ uv__set_sys_error(handle->loop, ENOMEM);
454
+ return -1;
455
+ }
456
+ memcpy(req->bufs, bufs, bufcnt * sizeof(bufs[0]));
457
+
458
+ ngx_queue_insert_tail(&handle->write_queue, &req->queue);
459
+ uv__udp_start_write_watcher(handle);
460
+
461
+ return 0;
462
+ }
463
+
464
+
465
+ int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
466
+ memset(handle, 0, sizeof *handle);
467
+
468
+ uv__handle_init(loop, (uv_handle_t*)handle, UV_UDP);
469
+ loop->counters.udp_init++;
470
+
471
+ handle->fd = -1;
472
+ ngx_queue_init(&handle->write_queue);
473
+ ngx_queue_init(&handle->write_completed_queue);
474
+
475
+ return 0;
476
+ }
477
+
478
+
479
+ int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags) {
480
+ return uv__bind(handle,
481
+ AF_INET,
482
+ (struct sockaddr*)&addr,
483
+ sizeof addr,
484
+ flags);
485
+ }
486
+
487
+
488
+ int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) {
489
+ return uv__bind(handle,
490
+ AF_INET6,
491
+ (struct sockaddr*)&addr,
492
+ sizeof addr,
493
+ flags);
494
+ }
495
+
496
+
497
+ int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr,
498
+ const char* interface_addr, uv_membership membership) {
499
+
500
+ int optname;
501
+ struct ip_mreq mreq;
502
+ memset(&mreq, 0, sizeof mreq);
503
+
504
+ if (interface_addr) {
505
+ mreq.imr_interface.s_addr = inet_addr(interface_addr);
506
+ } else {
507
+ mreq.imr_interface.s_addr = htonl(INADDR_ANY);
508
+ }
509
+
510
+ mreq.imr_multiaddr.s_addr = inet_addr(multicast_addr);
511
+
512
+ switch (membership) {
513
+ case UV_JOIN_GROUP:
514
+ optname = IP_ADD_MEMBERSHIP;
515
+ break;
516
+ case UV_LEAVE_GROUP:
517
+ optname = IP_DROP_MEMBERSHIP;
518
+ break;
519
+ default:
520
+ uv__set_sys_error(handle->loop, EFAULT);
521
+ return -1;
522
+ }
523
+
524
+ if (setsockopt(handle->fd, IPPROTO_IP, optname, (void*) &mreq, sizeof mreq) == -1) {
525
+ uv__set_sys_error(handle->loop, errno);
526
+ return -1;
527
+ }
528
+
529
+ return 0;
530
+ }
531
+
532
+
533
+ static int uv__setsockopt_maybe_char(uv_udp_t* handle, int option, int val) {
534
+ #if __sun
535
+ char arg = val;
536
+ #else
537
+ int arg = val;
538
+ #endif
539
+
540
+ if (val < 0 || val > 255)
541
+ return uv__set_sys_error(handle->loop, EINVAL);
542
+
543
+ if (setsockopt(handle->fd, IPPROTO_IP, option, &arg, sizeof(arg)))
544
+ return uv__set_sys_error(handle->loop, errno);
545
+
546
+ return 0;
547
+ }
548
+
549
+
550
+ int uv_udp_set_broadcast(uv_udp_t* handle, int on) {
551
+ if (setsockopt(handle->fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)))
552
+ return uv__set_sys_error(handle->loop, errno);
553
+
554
+ return 0;
555
+ }
556
+
557
+
558
+ int uv_udp_set_ttl(uv_udp_t* handle, int ttl) {
559
+ if (ttl < 1 || ttl > 255)
560
+ return uv__set_sys_error(handle->loop, EINVAL);
561
+
562
+ if (setsockopt(handle->fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)))
563
+ return uv__set_sys_error(handle->loop, errno);
564
+
565
+ return 0;
566
+ }
567
+
568
+
569
+ int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) {
570
+ return uv__setsockopt_maybe_char(handle, IP_MULTICAST_TTL, ttl);
571
+ }
572
+
573
+
574
+ int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) {
575
+ return uv__setsockopt_maybe_char(handle, IP_MULTICAST_LOOP, on);
576
+ }
577
+
578
+
579
+ int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name, int* namelen) {
580
+ socklen_t socklen;
581
+ int saved_errno;
582
+ int rv = 0;
583
+
584
+ /* Don't clobber errno. */
585
+ saved_errno = errno;
586
+
587
+ if (handle->fd < 0) {
588
+ uv__set_sys_error(handle->loop, EINVAL);
589
+ rv = -1;
590
+ goto out;
591
+ }
592
+
593
+ /* sizeof(socklen_t) != sizeof(int) on some systems. */
594
+ socklen = (socklen_t)*namelen;
595
+
596
+ if (getsockname(handle->fd, name, &socklen) == -1) {
597
+ uv__set_sys_error(handle->loop, errno);
598
+ rv = -1;
599
+ } else {
600
+ *namelen = (int)socklen;
601
+ }
602
+
603
+ out:
604
+ errno = saved_errno;
605
+ return rv;
606
+ }
607
+
608
+
609
+ int uv_udp_send(uv_udp_send_t* req,
610
+ uv_udp_t* handle,
611
+ uv_buf_t bufs[],
612
+ int bufcnt,
613
+ struct sockaddr_in addr,
614
+ uv_udp_send_cb send_cb) {
615
+ return uv__udp_send(req,
616
+ handle,
617
+ bufs,
618
+ bufcnt,
619
+ (struct sockaddr*)&addr,
620
+ sizeof addr,
621
+ send_cb);
622
+ }
623
+
624
+
625
+ int uv_udp_send6(uv_udp_send_t* req,
626
+ uv_udp_t* handle,
627
+ uv_buf_t bufs[],
628
+ int bufcnt,
629
+ struct sockaddr_in6 addr,
630
+ uv_udp_send_cb send_cb) {
631
+ return uv__udp_send(req,
632
+ handle,
633
+ bufs,
634
+ bufcnt,
635
+ (struct sockaddr*)&addr,
636
+ sizeof addr,
637
+ send_cb);
638
+ }
639
+
640
+
641
+ int uv_udp_recv_start(uv_udp_t* handle,
642
+ uv_alloc_cb alloc_cb,
643
+ uv_udp_recv_cb recv_cb) {
644
+ if (alloc_cb == NULL || recv_cb == NULL) {
645
+ uv__set_artificial_error(handle->loop, UV_EINVAL);
646
+ return -1;
647
+ }
648
+
649
+ if (ev_is_active(&handle->read_watcher)) {
650
+ uv__set_artificial_error(handle->loop, UV_EALREADY);
651
+ return -1;
652
+ }
653
+
654
+ if (uv__udp_maybe_deferred_bind(handle, AF_INET))
655
+ return -1;
656
+
657
+ handle->alloc_cb = alloc_cb;
658
+ handle->recv_cb = recv_cb;
659
+ uv__udp_start_read_watcher(handle);
660
+
661
+ return 0;
662
+ }
663
+
664
+
665
+ int uv_udp_recv_stop(uv_udp_t* handle) {
666
+ uv__udp_stop_read_watcher(handle);
667
+ handle->alloc_cb = NULL;
668
+ handle->recv_cb = NULL;
669
+ return 0;
670
+ }