enclave 0.1.0

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 (739) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +182 -0
  3. data/Rakefile +30 -0
  4. data/ext/enclave/enclave.c +390 -0
  5. data/ext/enclave/extconf.rb +33 -0
  6. data/ext/enclave/mruby/Makefile +63 -0
  7. data/ext/enclave/mruby/Rakefile +102 -0
  8. data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
  9. data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
  10. data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
  11. data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
  12. data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
  13. data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
  14. data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
  15. data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
  16. data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
  17. data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
  18. data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
  19. data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
  20. data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
  21. data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
  22. data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
  23. data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
  24. data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
  25. data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
  26. data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
  27. data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
  28. data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
  29. data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
  30. data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
  31. data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
  32. data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
  33. data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
  34. data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
  35. data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
  36. data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
  37. data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
  38. data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
  39. data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
  40. data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
  41. data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
  42. data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
  43. data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
  44. data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
  45. data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
  46. data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
  47. data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
  48. data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
  49. data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
  50. data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
  51. data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
  52. data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
  53. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
  54. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
  55. data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
  56. data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
  57. data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
  58. data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
  59. data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
  60. data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
  61. data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
  62. data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
  63. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
  64. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
  65. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
  66. data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
  67. data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
  68. data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
  69. data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
  70. data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
  71. data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
  72. data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
  73. data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
  74. data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
  75. data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
  76. data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
  77. data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
  78. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
  79. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
  80. data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
  81. data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
  82. data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
  83. data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
  84. data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
  85. data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
  86. data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
  87. data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
  88. data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
  89. data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
  90. data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
  91. data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
  92. data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
  93. data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
  94. data/ext/enclave/mruby/build_config/RX630.rb +63 -0
  95. data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
  96. data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
  97. data/ext/enclave/mruby/build_config/bench.rb +11 -0
  98. data/ext/enclave/mruby/build_config/boxing.rb +19 -0
  99. data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
  100. data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
  101. data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
  102. data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
  103. data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
  104. data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
  105. data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
  106. data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
  107. data/ext/enclave/mruby/build_config/default.rb +83 -0
  108. data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
  109. data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
  110. data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
  111. data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
  112. data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
  113. data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
  114. data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
  115. data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
  116. data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
  117. data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
  118. data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
  119. data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
  120. data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
  121. data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
  122. data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
  123. data/ext/enclave/mruby/build_config/minimal.rb +4 -0
  124. data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
  125. data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
  126. data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
  127. data/ext/enclave/mruby/build_config/no-float.rb +17 -0
  128. data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
  129. data/ext/enclave/mruby/build_config/serenity.rb +26 -0
  130. data/ext/enclave/mruby/build_config.rb +9 -0
  131. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
  132. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
  133. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
  134. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
  135. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
  136. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
  137. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
  138. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
  139. data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
  140. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
  141. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
  142. data/ext/enclave/mruby/include/mrbconf.h +230 -0
  143. data/ext/enclave/mruby/include/mruby/array.h +303 -0
  144. data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
  145. data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
  146. data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
  147. data/ext/enclave/mruby/include/mruby/class.h +157 -0
  148. data/ext/enclave/mruby/include/mruby/common.h +127 -0
  149. data/ext/enclave/mruby/include/mruby/compile.h +187 -0
  150. data/ext/enclave/mruby/include/mruby/data.h +76 -0
  151. data/ext/enclave/mruby/include/mruby/debug.h +75 -0
  152. data/ext/enclave/mruby/include/mruby/dump.h +159 -0
  153. data/ext/enclave/mruby/include/mruby/endian.h +44 -0
  154. data/ext/enclave/mruby/include/mruby/error.h +168 -0
  155. data/ext/enclave/mruby/include/mruby/gc.h +77 -0
  156. data/ext/enclave/mruby/include/mruby/hash.h +234 -0
  157. data/ext/enclave/mruby/include/mruby/internal.h +278 -0
  158. data/ext/enclave/mruby/include/mruby/irep.h +142 -0
  159. data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
  160. data/ext/enclave/mruby/include/mruby/khash.h +455 -0
  161. data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
  162. data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
  163. data/ext/enclave/mruby/include/mruby/object.h +44 -0
  164. data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
  165. data/ext/enclave/mruby/include/mruby/ops.h +133 -0
  166. data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
  167. data/ext/enclave/mruby/include/mruby/presym.h +65 -0
  168. data/ext/enclave/mruby/include/mruby/proc.h +184 -0
  169. data/ext/enclave/mruby/include/mruby/range.h +77 -0
  170. data/ext/enclave/mruby/include/mruby/re.h +16 -0
  171. data/ext/enclave/mruby/include/mruby/string.h +428 -0
  172. data/ext/enclave/mruby/include/mruby/throw.h +81 -0
  173. data/ext/enclave/mruby/include/mruby/value.h +471 -0
  174. data/ext/enclave/mruby/include/mruby/variable.h +108 -0
  175. data/ext/enclave/mruby/include/mruby/version.h +143 -0
  176. data/ext/enclave/mruby/include/mruby.h +1632 -0
  177. data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
  178. data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
  179. data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
  180. data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
  181. data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
  182. data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
  183. data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
  184. data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
  185. data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
  186. data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
  187. data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
  188. data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
  189. data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
  190. data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
  191. data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
  192. data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
  193. data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
  194. data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
  195. data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
  196. data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
  197. data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
  198. data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
  199. data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
  200. data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
  201. data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
  202. data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
  203. data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
  204. data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
  205. data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
  206. data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
  207. data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
  208. data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
  209. data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
  210. data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
  211. data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
  212. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
  213. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
  214. data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
  215. data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
  216. data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
  217. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
  218. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
  219. data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
  220. data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
  221. data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
  222. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
  223. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
  224. data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
  225. data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
  226. data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
  227. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
  228. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
  229. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
  230. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
  231. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
  232. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
  233. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
  234. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
  235. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  236. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
  237. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  238. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
  239. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  240. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
  241. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
  242. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
  243. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
  244. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
  245. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
  246. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
  247. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
  248. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
  249. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
  250. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
  251. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
  252. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
  253. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
  254. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
  255. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
  256. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
  257. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
  258. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
  259. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
  260. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
  261. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
  262. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
  263. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
  264. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
  265. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
  266. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
  267. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
  268. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
  269. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
  270. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
  271. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
  272. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
  273. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
  274. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
  275. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
  276. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
  277. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
  278. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
  279. data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
  280. data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
  281. data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
  282. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
  283. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
  284. data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
  285. data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
  286. data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
  287. data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
  288. data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
  289. data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
  290. data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
  291. data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
  292. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
  293. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
  294. data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
  295. data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
  296. data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
  297. data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
  298. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
  299. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
  300. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
  301. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
  302. data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
  303. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
  304. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
  305. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
  306. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
  307. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
  308. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
  309. data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
  310. data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
  311. data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
  312. data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
  313. data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
  314. data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
  315. data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
  316. data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
  317. data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
  318. data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
  319. data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
  320. data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
  321. data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
  322. data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
  323. data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
  324. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
  325. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
  326. data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
  327. data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
  328. data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
  329. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
  330. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
  331. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
  332. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
  333. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
  334. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
  335. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
  336. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
  337. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
  338. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
  339. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
  340. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  341. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
  342. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
  343. data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
  344. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
  345. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
  346. data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
  347. data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
  348. data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
  349. data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
  350. data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
  351. data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
  352. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
  353. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
  354. data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
  355. data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
  356. data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
  357. data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
  358. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
  359. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
  360. data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
  361. data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
  362. data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
  363. data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
  364. data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
  365. data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
  366. data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
  367. data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
  368. data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
  369. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
  370. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
  371. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
  372. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
  373. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
  374. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
  375. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
  376. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
  377. data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
  378. data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
  379. data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
  380. data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
  381. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
  382. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
  383. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
  384. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
  385. data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
  386. data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
  387. data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
  388. data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
  389. data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
  390. data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
  391. data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
  392. data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
  393. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
  394. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  395. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
  396. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
  397. data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
  398. data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
  399. data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
  400. data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
  401. data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
  402. data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
  403. data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
  404. data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
  405. data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
  406. data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
  407. data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
  408. data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
  409. data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
  410. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
  411. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
  412. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
  413. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
  414. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
  415. data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
  416. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
  417. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
  418. data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
  419. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
  420. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
  421. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
  422. data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
  423. data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
  424. data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
  425. data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
  426. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
  427. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
  428. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
  429. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
  430. data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
  431. data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
  432. data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
  433. data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
  434. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
  435. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
  436. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
  437. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
  438. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
  439. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
  440. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
  441. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
  442. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
  443. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
  444. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
  445. data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
  446. data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
  447. data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
  448. data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
  449. data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
  450. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
  451. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
  452. data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
  453. data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
  454. data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
  455. data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
  456. data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
  457. data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
  458. data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
  459. data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
  460. data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
  461. data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
  462. data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
  463. data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
  464. data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
  465. data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
  466. data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
  467. data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
  468. data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
  469. data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
  470. data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
  471. data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
  472. data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
  473. data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
  474. data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
  475. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
  476. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
  477. data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
  478. data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
  479. data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
  480. data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
  481. data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
  482. data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
  483. data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
  484. data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
  485. data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
  486. data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
  487. data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
  488. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
  489. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
  490. data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
  491. data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
  492. data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
  493. data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
  494. data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
  495. data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
  496. data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
  497. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
  498. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
  499. data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
  500. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
  501. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
  502. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
  503. data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
  504. data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
  505. data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
  506. data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
  507. data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
  508. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
  509. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
  510. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
  511. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
  512. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
  513. data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
  514. data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
  515. data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
  516. data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
  517. data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
  518. data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
  519. data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
  520. data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
  521. data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
  522. data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
  523. data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
  524. data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
  525. data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
  526. data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
  527. data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
  528. data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
  529. data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
  530. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
  531. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
  532. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
  533. data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
  534. data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
  535. data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
  536. data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
  537. data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
  538. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
  539. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
  540. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
  541. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
  542. data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
  543. data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
  544. data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
  545. data/ext/enclave/mruby/mrblib/10error.rb +23 -0
  546. data/ext/enclave/mruby/mrblib/array.rb +102 -0
  547. data/ext/enclave/mruby/mrblib/compar.rb +102 -0
  548. data/ext/enclave/mruby/mrblib/enum.rb +358 -0
  549. data/ext/enclave/mruby/mrblib/hash.rb +276 -0
  550. data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
  551. data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
  552. data/ext/enclave/mruby/mrblib/range.rb +98 -0
  553. data/ext/enclave/mruby/mrblib/string.rb +173 -0
  554. data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
  555. data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
  556. data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
  557. data/ext/enclave/mruby/src/allocf.c +37 -0
  558. data/ext/enclave/mruby/src/array.c +2302 -0
  559. data/ext/enclave/mruby/src/backtrace.c +294 -0
  560. data/ext/enclave/mruby/src/cdump.c +498 -0
  561. data/ext/enclave/mruby/src/class.c +4394 -0
  562. data/ext/enclave/mruby/src/codedump.c +693 -0
  563. data/ext/enclave/mruby/src/debug.c +290 -0
  564. data/ext/enclave/mruby/src/dump.c +998 -0
  565. data/ext/enclave/mruby/src/enum.c +30 -0
  566. data/ext/enclave/mruby/src/error.c +937 -0
  567. data/ext/enclave/mruby/src/etc.c +421 -0
  568. data/ext/enclave/mruby/src/fmt_fp.c +372 -0
  569. data/ext/enclave/mruby/src/gc.c +1610 -0
  570. data/ext/enclave/mruby/src/hash.c +2355 -0
  571. data/ext/enclave/mruby/src/init.c +50 -0
  572. data/ext/enclave/mruby/src/kernel.c +718 -0
  573. data/ext/enclave/mruby/src/load.c +760 -0
  574. data/ext/enclave/mruby/src/mempool.c +225 -0
  575. data/ext/enclave/mruby/src/numeric.c +2420 -0
  576. data/ext/enclave/mruby/src/numops.c +112 -0
  577. data/ext/enclave/mruby/src/object.c +883 -0
  578. data/ext/enclave/mruby/src/print.c +136 -0
  579. data/ext/enclave/mruby/src/proc.c +572 -0
  580. data/ext/enclave/mruby/src/range.c +597 -0
  581. data/ext/enclave/mruby/src/readfloat.c +228 -0
  582. data/ext/enclave/mruby/src/readint.c +27 -0
  583. data/ext/enclave/mruby/src/readnum.c +43 -0
  584. data/ext/enclave/mruby/src/state.c +247 -0
  585. data/ext/enclave/mruby/src/string.c +3577 -0
  586. data/ext/enclave/mruby/src/symbol.c +1023 -0
  587. data/ext/enclave/mruby/src/value_array.h +28 -0
  588. data/ext/enclave/mruby/src/variable.c +1475 -0
  589. data/ext/enclave/mruby/src/version.c +17 -0
  590. data/ext/enclave/mruby/src/vm.c +3696 -0
  591. data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
  592. data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
  593. data/ext/enclave/mruby/tasks/bin.rake +23 -0
  594. data/ext/enclave/mruby/tasks/core.rake +12 -0
  595. data/ext/enclave/mruby/tasks/doc.rake +118 -0
  596. data/ext/enclave/mruby/tasks/install.rake +40 -0
  597. data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
  598. data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
  599. data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
  600. data/ext/enclave/mruby/tasks/presym.rake +57 -0
  601. data/ext/enclave/mruby/tasks/test.rake +84 -0
  602. data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
  603. data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
  604. data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
  605. data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
  606. data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
  607. data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
  608. data/ext/enclave/mruby/test/assert.rb +404 -0
  609. data/ext/enclave/mruby/test/bintest.rb +55 -0
  610. data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
  611. data/ext/enclave/mruby/test/t/array.rb +478 -0
  612. data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
  613. data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
  614. data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
  615. data/ext/enclave/mruby/test/t/class.rb +505 -0
  616. data/ext/enclave/mruby/test/t/codegen.rb +196 -0
  617. data/ext/enclave/mruby/test/t/comparable.rb +79 -0
  618. data/ext/enclave/mruby/test/t/ensure.rb +36 -0
  619. data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
  620. data/ext/enclave/mruby/test/t/exception.rb +425 -0
  621. data/ext/enclave/mruby/test/t/false.rb +31 -0
  622. data/ext/enclave/mruby/test/t/float.rb +296 -0
  623. data/ext/enclave/mruby/test/t/gc.rb +45 -0
  624. data/ext/enclave/mruby/test/t/hash.rb +976 -0
  625. data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
  626. data/ext/enclave/mruby/test/t/integer.rb +247 -0
  627. data/ext/enclave/mruby/test/t/iterations.rb +61 -0
  628. data/ext/enclave/mruby/test/t/kernel.rb +462 -0
  629. data/ext/enclave/mruby/test/t/lang.rb +74 -0
  630. data/ext/enclave/mruby/test/t/literals.rb +386 -0
  631. data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
  632. data/ext/enclave/mruby/test/t/methods.rb +138 -0
  633. data/ext/enclave/mruby/test/t/module.rb +931 -0
  634. data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
  635. data/ext/enclave/mruby/test/t/nil.rb +39 -0
  636. data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
  637. data/ext/enclave/mruby/test/t/numeric.rb +114 -0
  638. data/ext/enclave/mruby/test/t/object.rb +10 -0
  639. data/ext/enclave/mruby/test/t/proc.rb +198 -0
  640. data/ext/enclave/mruby/test/t/range.rb +194 -0
  641. data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
  642. data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
  643. data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
  644. data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
  645. data/ext/enclave/mruby/test/t/string.rb +981 -0
  646. data/ext/enclave/mruby/test/t/superclass.rb +46 -0
  647. data/ext/enclave/mruby/test/t/symbol.rb +30 -0
  648. data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
  649. data/ext/enclave/mruby/test/t/true.rb +31 -0
  650. data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
  651. data/ext/enclave/mruby/test/t/unicode.rb +39 -0
  652. data/ext/enclave/mruby/test/t/vformat.rb +57 -0
  653. data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
  654. data/ext/enclave/mruby/tools/lrama/MIT +21 -0
  655. data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
  656. data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
  657. data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
  658. data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
  659. data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
  660. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
  661. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
  662. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
  663. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
  664. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
  665. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
  666. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
  667. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
  668. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
  669. data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
  670. data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
  671. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
  672. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
  673. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
  674. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
  675. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
  676. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
  677. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
  678. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
  679. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
  680. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
  681. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
  682. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
  683. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
  684. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
  685. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
  686. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
  687. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
  688. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
  689. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
  690. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
  691. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
  692. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
  693. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
  694. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
  695. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
  696. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
  697. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
  698. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
  699. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
  700. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
  701. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
  702. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
  703. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
  704. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
  705. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
  706. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
  707. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
  708. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
  709. data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
  710. data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
  711. data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
  712. data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
  713. data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
  714. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
  715. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
  716. data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
  717. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
  718. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
  719. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
  720. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
  721. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
  722. data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
  723. data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
  724. data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
  725. data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
  726. data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
  727. data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
  728. data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
  729. data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
  730. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
  731. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
  732. data/ext/enclave/sandbox_build_config.rb +15 -0
  733. data/ext/enclave/sandbox_core.c +722 -0
  734. data/ext/enclave/sandbox_core.h +87 -0
  735. data/lib/enclave/result.rb +29 -0
  736. data/lib/enclave/tool.rb +38 -0
  737. data/lib/enclave/version.rb +3 -0
  738. data/lib/enclave.rb +73 -0
  739. metadata +819 -0
@@ -0,0 +1,1374 @@
1
+ /*
2
+ ** socket.c - Socket module
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #ifdef _WIN32
8
+ #define _WIN32_WINNT 0x0501
9
+ #include <winsock2.h>
10
+ #include <ws2tcpip.h>
11
+ #include <windows.h>
12
+ #define SHUT_RDWR SD_BOTH
13
+ typedef int fsize_t;
14
+ #else
15
+ #include <sys/types.h>
16
+ #include <sys/socket.h>
17
+ #include <sys/param.h>
18
+ #include <sys/un.h>
19
+ #include <netinet/in.h>
20
+ #include <netinet/tcp.h>
21
+ #include <arpa/inet.h>
22
+ #include <fcntl.h>
23
+ #include <netdb.h>
24
+ #include <unistd.h>
25
+ typedef size_t fsize_t;
26
+ #endif
27
+
28
+ #include <string.h>
29
+
30
+ #include <mruby.h>
31
+ #include <mruby/array.h>
32
+ #include <mruby/class.h>
33
+ #include <mruby/data.h>
34
+ #include <mruby/numeric.h>
35
+ #include <mruby/string.h>
36
+ #include <mruby/variable.h>
37
+ #include <mruby/error.h>
38
+ #include <mruby/internal.h>
39
+ #include <mruby/presym.h>
40
+
41
+ #include <mruby/io.h>
42
+ #include "socket_hal.h"
43
+
44
+ /* Address family information for compact lookup table */
45
+ typedef struct {
46
+ int family; /* AF_INET, AF_INET6, etc. */
47
+ const char *name; /* "AF_INET", "AF_INET6", etc. */
48
+ int port_offset; /* Offset to port field in sockaddr structure */
49
+ mrb_bool has_port; /* TRUE if this family has a port field */
50
+ } af_info_t;
51
+
52
+ /* Protocol family lookup table for socket option inspection */
53
+ typedef struct {
54
+ int family; /* PF_INET, PF_INET6, etc. */
55
+ const char *name; /* "INET", "INET6", etc. */
56
+ } pf_info_t;
57
+
58
+ /* Compact address family lookup table (memory-efficient) */
59
+ static const af_info_t af_table[] = {
60
+ /* Internet Protocol families with port numbers */
61
+ {AF_INET, "AF_INET", offsetof(struct sockaddr_in, sin_port), TRUE},
62
+ {AF_INET6, "AF_INET6", offsetof(struct sockaddr_in6, sin6_port), TRUE},
63
+
64
+ /* Local/Unix domain sockets without port numbers */
65
+ #ifdef AF_UNIX
66
+ {AF_UNIX, "AF_UNIX", -1, FALSE},
67
+ #endif
68
+ #ifdef AF_LOCAL
69
+ {AF_LOCAL, "AF_LOCAL", -1, FALSE},
70
+ #endif
71
+
72
+ /* Additional protocol families (platform-dependent) */
73
+ #ifdef AF_LINK
74
+ {AF_LINK, "AF_LINK", -1, FALSE},
75
+ #endif
76
+ #ifdef AF_ROUTE
77
+ {AF_ROUTE, "AF_ROUTE", -1, FALSE},
78
+ #endif
79
+ #ifdef AF_UNSPEC
80
+ {AF_UNSPEC, "AF_UNSPEC", -1, FALSE},
81
+ #endif
82
+ };
83
+
84
+ #define AF_TABLE_SIZE (sizeof(af_table) / sizeof(af_table[0]))
85
+
86
+ /* Get address family info for given family constant (compact linear search) */
87
+ static inline const af_info_t *get_af_info(int family) {
88
+ for (size_t i = 0; i < AF_TABLE_SIZE; i++) {
89
+ if (af_table[i].family == family) {
90
+ return &af_table[i];
91
+ }
92
+ }
93
+ return NULL;
94
+ }
95
+
96
+ /* Compact protocol family lookup table (memory-efficient) */
97
+ static const pf_info_t pf_table[] = {
98
+ {PF_INET, "INET"},
99
+ #ifdef PF_INET6
100
+ {PF_INET6, "INET6"},
101
+ #endif
102
+ #ifdef PF_IPX
103
+ {PF_IPX, "IPX"},
104
+ #endif
105
+ #ifdef PF_AX25
106
+ {PF_AX25, "AX25"},
107
+ #endif
108
+ #ifdef PF_APPLETALK
109
+ {PF_APPLETALK, "APPLETALK"},
110
+ #endif
111
+ #ifdef PF_UNIX
112
+ {PF_UNIX, "UNIX"},
113
+ #endif
114
+ };
115
+
116
+ #define PF_TABLE_SIZE (sizeof(pf_table) / sizeof(pf_table[0]))
117
+
118
+ /* Get protocol family name for given family constant (compact linear search) */
119
+ static inline const char *get_pf_name(int family) {
120
+ for (size_t i = 0; i < PF_TABLE_SIZE; i++) {
121
+ if (pf_table[i].family == family) {
122
+ return pf_table[i].name;
123
+ }
124
+ }
125
+ return NULL;
126
+ }
127
+
128
+ #if !defined(HAVE_SA_LEN)
129
+ #if (defined(BSD) && (BSD >= 199006))
130
+ #define HAVE_SA_LEN 1
131
+ #else
132
+ #define HAVE_SA_LEN 0
133
+ #endif
134
+ #endif
135
+
136
+ #define E_SOCKET_ERROR mrb_class_get_id(mrb, MRB_SYM(SocketError))
137
+
138
+ struct gen_addrinfo_args {
139
+ struct RClass *klass;
140
+ struct addrinfo *addrinfo;
141
+ };
142
+
143
+ /* Helper to generate array of Addrinfo objects from addrinfo linked list */
144
+ static mrb_value
145
+ gen_addrinfo(mrb_state *mrb, mrb_value args)
146
+ {
147
+ mrb_value ary = mrb_ary_new(mrb);
148
+ int arena_idx = mrb_gc_arena_save(mrb); /* ary must be on arena! */
149
+ struct gen_addrinfo_args *a = (struct gen_addrinfo_args*)mrb_cptr(args);
150
+
151
+ for (struct addrinfo *res = a->addrinfo; res != NULL; res = res->ai_next) {
152
+ mrb_value sa = mrb_str_new(mrb, (char*)res->ai_addr, res->ai_addrlen);
153
+ mrb_value args[4] = {sa, mrb_fixnum_value(res->ai_family), mrb_fixnum_value(res->ai_socktype), mrb_fixnum_value(res->ai_protocol)};
154
+ mrb_value ai = mrb_obj_new(mrb, a->klass, 4, args);
155
+ mrb_ary_push(mrb, ary, ai);
156
+ mrb_gc_arena_restore(mrb, arena_idx);
157
+ }
158
+ return ary;
159
+ }
160
+
161
+ /* Helper to free addrinfo structure - used with mrb_ensure */
162
+ static mrb_value
163
+ free_addrinfo(mrb_state *mrb, mrb_value addrinfo)
164
+ {
165
+ freeaddrinfo((struct addrinfo*)mrb_cptr(addrinfo));
166
+ return mrb_nil_value();
167
+ }
168
+
169
+ /*
170
+ * call-seq:
171
+ * Addrinfo.getaddrinfo(nodename, servname, family=nil, socktype=nil, protocol=nil, flags=0) -> array
172
+ *
173
+ * Returns an array of Addrinfo objects for the given nodename and servname.
174
+ *
175
+ * Addrinfo.getaddrinfo("localhost", "http")
176
+ * Addrinfo.getaddrinfo("www.example.com", 80, Socket::AF_INET)
177
+ */
178
+ static mrb_value
179
+ mrb_addrinfo_getaddrinfo(mrb_state *mrb, mrb_value klass)
180
+ {
181
+ struct addrinfo hints = {0}, *addr;
182
+ mrb_value family, protocol, service, socktype;
183
+ mrb_int flags = 0;
184
+ const char *hostname;
185
+
186
+ family = socktype = protocol = mrb_nil_value();
187
+ mrb_get_args(mrb, "z!o|oooi", &hostname, &service, &family, &socktype, &protocol, &flags);
188
+
189
+ const char *servname = NULL;
190
+ if (mrb_string_p(service)) {
191
+ servname = RSTRING_CSTR(mrb, service);
192
+ }
193
+ else if (mrb_integer_p(service)) {
194
+ servname = RSTRING_PTR(mrb_integer_to_str(mrb, service, 10));
195
+ }
196
+ else if (mrb_nil_p(service)) {
197
+ servname = NULL;
198
+ }
199
+ else {
200
+ mrb_raise(mrb, E_TYPE_ERROR, "service must be String, Integer, or nil");
201
+ }
202
+
203
+ hints.ai_flags = (int)flags;
204
+
205
+ if (mrb_integer_p(family)) {
206
+ hints.ai_family = (int)mrb_integer(family);
207
+ }
208
+
209
+ if (mrb_integer_p(socktype)) {
210
+ hints.ai_socktype = (int)mrb_integer(socktype);
211
+ }
212
+
213
+ if (mrb_integer_p(protocol)) {
214
+ hints.ai_protocol = (int)mrb_integer(protocol);
215
+ }
216
+
217
+ int error = getaddrinfo(hostname, servname, &hints, &addr);
218
+ if (error) {
219
+ mrb_raisef(mrb, E_SOCKET_ERROR, "getaddrinfo: %s", gai_strerror(error));
220
+ }
221
+
222
+ struct gen_addrinfo_args args = {mrb_class_ptr(klass), addr};
223
+ return mrb_ensure(mrb, gen_addrinfo, mrb_cptr_value(mrb, &args), free_addrinfo, mrb_cptr_value(mrb, addr));
224
+ }
225
+
226
+ /*
227
+ * call-seq:
228
+ * addrinfo.getnameinfo(flags=0) -> [hostname, service]
229
+ *
230
+ * Returns the hostname and service name for the address.
231
+ *
232
+ * addr.getnameinfo #=> ["localhost", "http"]
233
+ * addr.getnameinfo(Socket::NI_NUMERICHOST) #=> ["127.0.0.1", "80"]
234
+ */
235
+ static mrb_value
236
+ mrb_addrinfo_getnameinfo(mrb_state *mrb, mrb_value self)
237
+ {
238
+ mrb_int flags = 0;
239
+
240
+ mrb_get_args(mrb, "|i", &flags);
241
+
242
+ mrb_value host = mrb_str_new_capa(mrb, NI_MAXHOST);
243
+ mrb_value serv = mrb_str_new_capa(mrb, NI_MAXSERV);
244
+ mrb_value sastr = mrb_iv_get(mrb, self, MRB_IVSYM(sockaddr));
245
+ if (!mrb_string_p(sastr)) {
246
+ mrb_raise(mrb, E_SOCKET_ERROR, "invalid sockaddr");
247
+ }
248
+ int error = getnameinfo((struct sockaddr*)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr), RSTRING_PTR(host), NI_MAXHOST, RSTRING_PTR(serv), NI_MAXSERV, (int)flags);
249
+ if (error) {
250
+ mrb_raisef(mrb, E_SOCKET_ERROR, "getnameinfo: %s", gai_strerror(error));
251
+ }
252
+ mrb_value ary = mrb_ary_new_capa(mrb, 2);
253
+ mrb_str_resize(mrb, host, strlen(RSTRING_PTR(host)));
254
+ mrb_ary_push(mrb, ary, host);
255
+ mrb_str_resize(mrb, serv, strlen(RSTRING_PTR(serv)));
256
+ mrb_ary_push(mrb, ary, serv);
257
+ return ary;
258
+ }
259
+
260
+ /*
261
+ * call-seq:
262
+ * addrinfo.unix_path -> string
263
+ *
264
+ * Returns the Unix domain socket path.
265
+ *
266
+ * addr.unix_path #=> "/tmp/socket"
267
+ */
268
+ static mrb_value
269
+ mrb_addrinfo_unix_path(mrb_state *mrb, mrb_value self)
270
+ {
271
+ mrb_value sastr = mrb_iv_get(mrb, self, MRB_IVSYM(sockaddr));
272
+
273
+ if (!mrb_string_p(sastr)) {
274
+ mrb_raise(mrb, E_SOCKET_ERROR, "invalid sockaddr");
275
+ }
276
+
277
+ return mrb_hal_socket_unix_path(mrb, RSTRING_PTR(sastr), (size_t)RSTRING_LEN(sastr));
278
+ }
279
+
280
+ /* Helper to convert sockaddr to address list array [family, port, host, host] */
281
+ static mrb_value
282
+ sa2addrlist(mrb_state *mrb, const struct sockaddr *sa, socklen_t salen)
283
+ {
284
+ /* Use lookup table for O(1) address family dispatch */
285
+ const af_info_t *af_info = get_af_info(sa->sa_family);
286
+ if (!af_info) {
287
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "bad af");
288
+ return mrb_nil_value();
289
+ }
290
+
291
+ /* Extract port using table-driven offset calculation */
292
+ unsigned short port = 0;
293
+ if (af_info->has_port) {
294
+ port = *(unsigned short*)((char*)sa + af_info->port_offset);
295
+ }
296
+ port = ntohs(port);
297
+ mrb_value host = mrb_str_new_capa(mrb, NI_MAXHOST);
298
+ if (getnameinfo(sa, salen, RSTRING_PTR(host), NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == -1)
299
+ mrb_sys_fail(mrb, "getnameinfo");
300
+ mrb_str_resize(mrb, host, strlen(RSTRING_PTR(host)));
301
+
302
+ mrb_value ary = mrb_ary_new_capa(mrb, 4);
303
+ mrb_ary_push(mrb, ary, mrb_str_new_cstr(mrb, af_info->name));
304
+ mrb_ary_push(mrb, ary, mrb_fixnum_value(port));
305
+ mrb_ary_push(mrb, ary, host);
306
+ mrb_ary_push(mrb, ary, host);
307
+ return ary;
308
+ }
309
+
310
+ int mrb_io_fileno(mrb_state *mrb, mrb_value io);
311
+
312
+ /* Helper to extract file descriptor from socket object */
313
+ static int
314
+ socket_fd(mrb_state *mrb, mrb_value sock)
315
+ {
316
+ return mrb_io_fileno(mrb, sock);
317
+ }
318
+
319
+ /* Helper to get address family of socket by file descriptor */
320
+ static int
321
+ socket_family(int s)
322
+ {
323
+ struct sockaddr_storage ss;
324
+ socklen_t salen = sizeof(ss);
325
+
326
+ if (getsockname(s, (struct sockaddr*)&ss, &salen) == -1)
327
+ return AF_UNSPEC;
328
+ return ss.ss_family;
329
+ }
330
+
331
+ /*
332
+ * call-seq:
333
+ * basicsocket.getpeereid -> [euid, egid]
334
+ *
335
+ * Returns the effective user ID and group ID of the peer process.
336
+ * Only available on systems that support getpeereid().
337
+ *
338
+ * euid, egid = sock.getpeereid
339
+ */
340
+ static mrb_value
341
+ mrb_basicsocket_getpeereid(mrb_state *mrb, mrb_value self)
342
+ {
343
+ #ifdef HAVE_GETPEEREID
344
+ gid_t egid;
345
+ uid_t euid;
346
+ int s = socket_fd(mrb, self);
347
+ if (getpeereid(s, &euid, &egid) != 0)
348
+ mrb_sys_fail(mrb, "getpeereid");
349
+
350
+ mrb_value ary = mrb_ary_new_capa(mrb, 2);
351
+ mrb_ary_push(mrb, ary, mrb_fixnum_value((mrb_int)euid));
352
+ mrb_ary_push(mrb, ary, mrb_fixnum_value((mrb_int)egid));
353
+ return ary;
354
+ #else
355
+ mrb_raise(mrb, E_RUNTIME_ERROR, "getpeereid is not available on this system");
356
+ return mrb_nil_value();
357
+ #endif
358
+ }
359
+
360
+ /*
361
+ * call-seq:
362
+ * basicsocket.getpeername -> string
363
+ *
364
+ * Returns the remote socket address as a packed sockaddr string.
365
+ *
366
+ * sockaddr = sock.getpeername
367
+ */
368
+ static mrb_value
369
+ mrb_basicsocket_getpeername(mrb_state *mrb, mrb_value self)
370
+ {
371
+ struct sockaddr_storage ss;
372
+ socklen_t salen = sizeof(ss);
373
+
374
+ if (getpeername(socket_fd(mrb, self), (struct sockaddr*)&ss, &salen) != 0)
375
+ mrb_sys_fail(mrb, "getpeername");
376
+
377
+ return mrb_str_new(mrb, (char*)&ss, salen);
378
+ }
379
+
380
+ /*
381
+ * call-seq:
382
+ * basicsocket.getsockname -> string
383
+ *
384
+ * Returns the local socket address as a packed sockaddr string.
385
+ *
386
+ * sockaddr = sock.getsockname
387
+ */
388
+ static mrb_value
389
+ mrb_basicsocket_getsockname(mrb_state *mrb, mrb_value self)
390
+ {
391
+ struct sockaddr_storage ss;
392
+ socklen_t salen = sizeof(ss);
393
+
394
+ if (getsockname(socket_fd(mrb, self), (struct sockaddr*)&ss, &salen) != 0)
395
+ mrb_sys_fail(mrb, "getsockname");
396
+
397
+ return mrb_str_new(mrb, (char*)&ss, salen);
398
+ }
399
+
400
+ /* Helper to get Socket::Option class reference */
401
+ static struct RClass *
402
+ socket_option_class(mrb_state *mrb)
403
+ {
404
+ return mrb_class_get_under_id(mrb, mrb_class_get_id(mrb, MRB_SYM(Socket)), MRB_SYM(Option));
405
+ }
406
+
407
+ /*
408
+ * call-seq:
409
+ * Socket::Option.new(family, level, optname, data) -> socket_option
410
+ *
411
+ * Creates a new Socket::Option object with the given parameters.
412
+ *
413
+ * opt = Socket::Option.new(Socket::AF_INET, Socket::SOL_SOCKET, Socket::SO_REUSEADDR, [1].pack("i"))
414
+ */
415
+ static mrb_value
416
+ socket_option_init(mrb_state *mrb, mrb_value self)
417
+ {
418
+ mrb_int family, level, optname;
419
+ mrb_value data;
420
+
421
+ mrb_get_args(mrb, "iiio", &family, &level, &optname, &data);
422
+ mrb_iv_set(mrb, self, MRB_SYM(family), mrb_int_value(mrb, family));
423
+ mrb_iv_set(mrb, self, MRB_SYM(level), mrb_int_value(mrb, level));
424
+ mrb_iv_set(mrb, self, MRB_SYM(optname), mrb_int_value(mrb, optname));
425
+ mrb_iv_set(mrb, self, MRB_SYM(data), data);
426
+
427
+ return self;
428
+ }
429
+
430
+ /*
431
+ * call-seq:
432
+ * Socket::Option.bool(family, level, optname, bool) -> socket_option
433
+ *
434
+ * Creates a new Socket::Option object from a boolean value.
435
+ *
436
+ * opt = Socket::Option.bool(Socket::AF_INET, Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
437
+ */
438
+ static mrb_value
439
+ socket_option_s_bool(mrb_state *mrb, mrb_value klass)
440
+ {
441
+ mrb_value args[4];
442
+ mrb_bool data;
443
+
444
+ mrb_get_args(mrb, "ooob", &args[0], &args[1], &args[2], &data);
445
+
446
+ int tmp = (int)data;
447
+ args[3] = mrb_str_new(mrb, (char*)&tmp, sizeof(int));
448
+ return mrb_obj_new(mrb, mrb_class_ptr(klass), 4, args);
449
+ }
450
+
451
+ /*
452
+ * call-seq:
453
+ * Socket::Option.int(family, level, optname, integer) -> socket_option
454
+ *
455
+ * Creates a new Socket::Option object from an integer value.
456
+ *
457
+ * opt = Socket::Option.int(Socket::AF_INET, Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
458
+ */
459
+ static mrb_value
460
+ socket_option_s_int(mrb_state *mrb, mrb_value klass)
461
+ {
462
+ mrb_value args[4];
463
+ mrb_int data;
464
+
465
+ mrb_get_args(mrb, "oooi", &args[0], &args[1], &args[2], &data);
466
+
467
+ int tmp = (int)data;
468
+ args[3] = mrb_str_new(mrb, (char*)&tmp, sizeof(int));
469
+ return mrb_obj_new(mrb, mrb_class_ptr(klass), 4, args);
470
+ }
471
+
472
+ /*
473
+ * call-seq:
474
+ * socket_option.family -> integer
475
+ *
476
+ * Returns the address family of the socket option.
477
+ *
478
+ * opt.family #=> Socket::AF_INET
479
+ */
480
+ static mrb_value
481
+ socket_option_family(mrb_state *mrb, mrb_value self)
482
+ {
483
+ return mrb_iv_get(mrb, self, MRB_SYM(family));
484
+ }
485
+
486
+ /*
487
+ * call-seq:
488
+ * socket_option.level -> integer
489
+ *
490
+ * Returns the protocol level of the socket option.
491
+ *
492
+ * opt.level #=> Socket::SOL_SOCKET
493
+ */
494
+ static mrb_value
495
+ socket_option_level(mrb_state *mrb, mrb_value self)
496
+ {
497
+ return mrb_iv_get(mrb, self, MRB_SYM(level));
498
+ }
499
+
500
+ /*
501
+ * call-seq:
502
+ * socket_option.optname -> integer
503
+ *
504
+ * Returns the option name of the socket option.
505
+ *
506
+ * opt.optname #=> Socket::SO_REUSEADDR
507
+ */
508
+ static mrb_value
509
+ socket_option_optname(mrb_state *mrb, mrb_value self)
510
+ {
511
+ return mrb_iv_get(mrb, self, MRB_SYM(optname));
512
+ }
513
+
514
+ /*
515
+ * call-seq:
516
+ * socket_option.data -> string
517
+ *
518
+ * Returns the raw data of the socket option as a string.
519
+ *
520
+ * opt.data #=> "\x01\x00\x00\x00"
521
+ */
522
+ static mrb_value
523
+ socket_option_data(mrb_state *mrb, mrb_value self)
524
+ {
525
+ return mrb_iv_get(mrb, self, MRB_SYM(data));
526
+ }
527
+
528
+ /* Helper to extract integer value from Socket::Option data */
529
+ static int
530
+ option_int(mrb_state *mrb, mrb_value self)
531
+ {
532
+ mrb_value data = mrb_obj_as_string(mrb, mrb_iv_get(mrb, self, MRB_SYM(data)));
533
+
534
+ if (RSTRING_LEN(data) != sizeof(int)) {
535
+ mrb_raisef(mrb, E_TYPE_ERROR, "size differ; expected as sizeof(int)=%i but %i", (mrb_int)sizeof(int), RSTRING_LEN(data));
536
+ }
537
+
538
+ int tmp;
539
+ memcpy((char*)&tmp, RSTRING_PTR(data), sizeof(int));
540
+ return tmp;
541
+ }
542
+
543
+ /*
544
+ * call-seq:
545
+ * socket_option.int -> integer
546
+ *
547
+ * Returns the socket option data as an integer value.
548
+ *
549
+ * opt.int #=> 1
550
+ */
551
+ static mrb_value
552
+ socket_option_int(mrb_state *mrb, mrb_value self)
553
+ {
554
+ int i = option_int(mrb, self);
555
+ return mrb_int_value(mrb, (mrb_int)i);
556
+ }
557
+
558
+ /*
559
+ * call-seq:
560
+ * socket_option.bool -> true or false
561
+ *
562
+ * Returns the socket option data as a boolean value.
563
+ *
564
+ * opt.bool #=> true
565
+ */
566
+ static mrb_value
567
+ socket_option_bool(mrb_state *mrb, mrb_value self)
568
+ {
569
+ int i = option_int(mrb, self);
570
+ return mrb_bool_value((mrb_bool)i);
571
+ }
572
+
573
+ /* Helper to raise not implemented error for unimplemented Socket::Option methods */
574
+ static mrb_value
575
+ socket_option_notimp(mrb_state *mrb, mrb_value self)
576
+ {
577
+ mrb_notimplement(mrb);
578
+ return mrb_nil_value();
579
+ }
580
+
581
+ /*
582
+ * call-seq:
583
+ * socket_option.inspect -> string
584
+ *
585
+ * Returns a string representation of the socket option for debugging.
586
+ *
587
+ * opt.inspect #=> "#<Socket::Option: INET level:1 optname:2 \"\\x01\\x00\\x00\\x00\">"
588
+ */
589
+ static mrb_value
590
+ socket_option_inspect(mrb_state *mrb, mrb_value self)
591
+ {
592
+ mrb_value str = mrb_str_new_cstr(mrb, "#<Socket::Option: ");
593
+
594
+ mrb_value family = mrb_iv_get(mrb, self, MRB_SYM(family));
595
+ const char *pf = NULL;
596
+
597
+ if (mrb_integer_p(family)) {
598
+ mrb_int fm = mrb_integer(family);
599
+ pf = get_pf_name((int)fm);
600
+ }
601
+
602
+ if (pf) {
603
+ mrb_str_cat_cstr(mrb, str, pf);
604
+ }
605
+ else {
606
+ mrb_str_cat_cstr(mrb, str, "family:");
607
+ mrb_str_cat_str(mrb, str, mrb_inspect(mrb, family));
608
+ }
609
+ mrb_str_cat_cstr(mrb, str, " level:");
610
+ mrb_str_cat_str(mrb, str, mrb_inspect(mrb, mrb_iv_get(mrb, self, MRB_SYM(level))));
611
+ mrb_str_cat_cstr(mrb, str, " optname:");
612
+ mrb_str_cat_str(mrb, str, mrb_inspect(mrb, mrb_iv_get(mrb, self, MRB_SYM(optname))));
613
+ mrb_str_cat_cstr(mrb, str, " ");
614
+ mrb_str_cat_str(mrb, str, mrb_inspect(mrb, mrb_iv_get(mrb, self, MRB_SYM(data))));
615
+ mrb_str_cat_cstr(mrb, str, ">");
616
+
617
+ return str;
618
+ }
619
+
620
+ /*
621
+ * call-seq:
622
+ * basicsocket.getsockopt(level, optname) -> string
623
+ *
624
+ * Gets a socket option. Returns the option value as a string.
625
+ *
626
+ * val = sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR)
627
+ */
628
+ static mrb_value
629
+ mrb_basicsocket_getsockopt(mrb_state *mrb, mrb_value self)
630
+ {
631
+ mrb_int level, optname;
632
+
633
+ mrb_get_args(mrb, "ii", &level, &optname);
634
+
635
+ int s = socket_fd(mrb, self);
636
+ char opt[8];
637
+ socklen_t optlen = sizeof(opt);
638
+
639
+ if (getsockopt(s, (int)level, (int)optname, opt, &optlen) == -1)
640
+ mrb_sys_fail(mrb, "getsockopt");
641
+ mrb_int family = socket_family(s);
642
+ mrb_value data = mrb_str_new(mrb, opt, optlen);
643
+ mrb_value args[4] = {mrb_fixnum_value(family), mrb_fixnum_value(level), mrb_fixnum_value(optname), data};
644
+ return mrb_obj_new(mrb, socket_option_class(mrb), 4, args);
645
+ }
646
+
647
+ /*
648
+ * call-seq:
649
+ * basicsocket.recv(maxlen, flags=0) -> string
650
+ *
651
+ * Receives data from the socket.
652
+ *
653
+ * data = sock.recv(1024)
654
+ * data = sock.recv(512, 0)
655
+ */
656
+ static mrb_value
657
+ mrb_basicsocket_recv(mrb_state *mrb, mrb_value self)
658
+ {
659
+ mrb_int maxlen, flags = 0;
660
+
661
+ mrb_get_args(mrb, "i|i", &maxlen, &flags);
662
+
663
+ mrb_value buf = mrb_str_new_capa(mrb, maxlen);
664
+ ssize_t n = recv(socket_fd(mrb, self), RSTRING_PTR(buf), (fsize_t)maxlen, (int)flags);
665
+ if (n == -1)
666
+ mrb_sys_fail(mrb, "recv");
667
+ mrb_str_resize(mrb, buf, (mrb_int)n);
668
+ return buf;
669
+ }
670
+
671
+ /*
672
+ * call-seq:
673
+ * basicsocket._recvfrom(maxlen, flags=0) -> [data, sockaddr]
674
+ *
675
+ * Internal method to receive data and sender address from socket.
676
+ * Returns data and packed sockaddr.
677
+ */
678
+ static mrb_value
679
+ mrb_basicsocket_recvfrom(mrb_state *mrb, mrb_value self)
680
+ {
681
+ mrb_int maxlen, flags = 0;
682
+
683
+ mrb_get_args(mrb, "i|i", &maxlen, &flags);
684
+
685
+ mrb_value buf = mrb_str_new_capa(mrb, maxlen);
686
+ socklen_t socklen = sizeof(struct sockaddr_storage);
687
+ mrb_value sa = mrb_str_new_capa(mrb, socklen);
688
+ ssize_t n = recvfrom(socket_fd(mrb, self), RSTRING_PTR(buf), (fsize_t)maxlen, (int)flags, (struct sockaddr*)RSTRING_PTR(sa), &socklen);
689
+ if (n == -1)
690
+ mrb_sys_fail(mrb, "recvfrom");
691
+ mrb_str_resize(mrb, buf, (mrb_int)n);
692
+ mrb_str_resize(mrb, sa, (mrb_int)socklen);
693
+
694
+ mrb_value ary = mrb_ary_new_capa(mrb, 2);
695
+ mrb_ary_push(mrb, ary, buf);
696
+ mrb_ary_push(mrb, ary, sa);
697
+ return ary;
698
+ }
699
+
700
+ /*
701
+ * call-seq:
702
+ * basicsocket.send(mesg, flags) -> integer
703
+ *
704
+ * Sends data through the socket. Returns the number of bytes sent.
705
+ *
706
+ * bytes_sent = sock.send("Hello", 0)
707
+ */
708
+ static mrb_value
709
+ mrb_basicsocket_send(mrb_state *mrb, mrb_value self)
710
+ {
711
+ mrb_int flags;
712
+ mrb_value mesg;
713
+ mrb_value dest = mrb_nil_value();
714
+
715
+ mrb_get_args(mrb, "Si|S", &mesg, &flags, &dest);
716
+
717
+ ssize_t n;
718
+ if (mrb_nil_p(dest)) {
719
+ n = send(socket_fd(mrb, self), RSTRING_PTR(mesg), (fsize_t)RSTRING_LEN(mesg), (int)flags);
720
+ }
721
+ else {
722
+ n = sendto(socket_fd(mrb, self), RSTRING_PTR(mesg), (fsize_t)RSTRING_LEN(mesg), (int)flags, (const struct sockaddr*)RSTRING_PTR(dest), (fsize_t)RSTRING_LEN(dest));
723
+ }
724
+ if (n == -1)
725
+ mrb_sys_fail(mrb, "send");
726
+ return mrb_fixnum_value((mrb_int)n);
727
+ }
728
+
729
+ /*
730
+ * call-seq:
731
+ * basicsocket._setnonblock(flag) -> nil
732
+ *
733
+ * Internal method to set or unset non-blocking mode on the socket.
734
+ *
735
+ * sock._setnonblock(true) # enable non-blocking
736
+ * sock._setnonblock(false) # disable non-blocking
737
+ */
738
+ static mrb_value
739
+ mrb_basicsocket_setnonblock(mrb_state *mrb, mrb_value self)
740
+ {
741
+ mrb_bool nonblocking;
742
+
743
+ mrb_get_args(mrb, "b", &nonblocking);
744
+ int fd = socket_fd(mrb, self);
745
+
746
+ if (mrb_hal_socket_set_nonblock(mrb, fd, nonblocking) == -1)
747
+ mrb_sys_fail(mrb, "set_nonblock");
748
+
749
+ return mrb_nil_value();
750
+ }
751
+
752
+ /*
753
+ * call-seq:
754
+ * basicsocket.setsockopt(level, optname, optval) -> 0
755
+ *
756
+ * Sets a socket option. Level and optname are constants, optval is the value.
757
+ *
758
+ * sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1)
759
+ */
760
+ static mrb_value
761
+ mrb_basicsocket_setsockopt(mrb_state *mrb, mrb_value self)
762
+ {
763
+ mrb_int level = 0, optname;
764
+ mrb_value so, optval;
765
+ mrb_int argc = mrb_get_args(mrb, "o|io", &so, &optname, &optval);
766
+
767
+ if (argc == 3) {
768
+ mrb_ensure_int_type(mrb, so);
769
+ level = mrb_integer(so);
770
+ if (mrb_string_p(optval)) {
771
+ /* that's good */
772
+ }
773
+ else if (mrb_true_p(optval) || mrb_false_p(optval)) {
774
+ mrb_int i = mrb_test(optval) ? 1 : 0;
775
+ optval = mrb_str_new(mrb, (char*)&i, sizeof(i));
776
+ }
777
+ else if (mrb_integer_p(optval)) {
778
+ if (optname == IP_MULTICAST_TTL || optname == IP_MULTICAST_LOOP) {
779
+ char uc = (char)mrb_integer(optval);
780
+ optval = mrb_str_new(mrb, &uc, sizeof(uc));
781
+ }
782
+ else {
783
+ mrb_int i = mrb_integer(optval);
784
+ optval = mrb_str_new(mrb, (char*)&i, sizeof(i));
785
+ }
786
+ }
787
+ else {
788
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "optval should be true, false, an integer, or a string");
789
+ }
790
+ }
791
+ else if (argc == 1) {
792
+ if (!mrb_obj_is_instance_of(mrb, so, socket_option_class(mrb)))
793
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "not an instance of Socket::Option");
794
+ level = mrb_as_int(mrb, mrb_iv_get(mrb, so, MRB_SYM(level)));
795
+ optname = mrb_as_int(mrb, mrb_iv_get(mrb, so, MRB_SYM(optname)));
796
+ optval = mrb_iv_get(mrb, so, MRB_SYM(data));
797
+ mrb_ensure_string_type(mrb, optval);
798
+ }
799
+ else {
800
+ mrb_argnum_error(mrb, argc, 3, 3);
801
+ }
802
+
803
+ int s = socket_fd(mrb, self);
804
+ if (setsockopt(s, (int)level, (int)optname, RSTRING_PTR(optval), (socklen_t)RSTRING_LEN(optval)) == -1)
805
+ mrb_sys_fail(mrb, "setsockopt");
806
+ return mrb_fixnum_value(0);
807
+ }
808
+
809
+ /*
810
+ * call-seq:
811
+ * basicsocket.shutdown(how=Socket::SHUT_RDWR) -> 0
812
+ *
813
+ * Shuts down part of the socket connection.
814
+ *
815
+ * sock.shutdown(Socket::SHUT_RD) # shutdown reading
816
+ * sock.shutdown(Socket::SHUT_WR) # shutdown writing
817
+ * sock.shutdown(Socket::SHUT_RDWR) # shutdown both (default)
818
+ */
819
+ static mrb_value
820
+ mrb_basicsocket_shutdown(mrb_state *mrb, mrb_value self)
821
+ {
822
+ mrb_int how = SHUT_RDWR;
823
+
824
+ mrb_get_args(mrb, "|i", &how);
825
+ if (shutdown(socket_fd(mrb, self), (int)how) != 0)
826
+ mrb_sys_fail(mrb, "shutdown");
827
+ return mrb_fixnum_value(0);
828
+ }
829
+
830
+ /* Helper to set socket flag on IO object */
831
+ static mrb_value
832
+ mrb_basicsocket_set_is_socket(mrb_state *mrb, mrb_value self)
833
+ {
834
+ mrb_bool b;
835
+ mrb_get_args(mrb, "b", &b);
836
+
837
+ struct mrb_io *io_p = (struct mrb_io*)DATA_PTR(self);
838
+ if (io_p) {
839
+ io_p->is_socket = b;
840
+ }
841
+
842
+ return mrb_bool_value(b);
843
+ }
844
+
845
+ /*
846
+ * call-seq:
847
+ * IPSocket.ntop(af, addr) -> string
848
+ *
849
+ * Converts a network address to a string representation.
850
+ *
851
+ * IPSocket.ntop(Socket::AF_INET, "\x7f\x00\x00\x01") #=> "127.0.0.1"
852
+ */
853
+ static mrb_value
854
+ mrb_ipsocket_ntop(mrb_state *mrb, mrb_value klass)
855
+ {
856
+ mrb_int af, n;
857
+ const char *addr;
858
+ char buf[50];
859
+
860
+ mrb_get_args(mrb, "is", &af, &addr, &n);
861
+ if ((af == AF_INET && n != 4) || (af == AF_INET6 && n != 16) ||
862
+ mrb_hal_socket_inet_ntop((int)af, addr, buf, sizeof(buf)) == NULL)
863
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
864
+ return mrb_str_new_cstr(mrb, buf);
865
+ }
866
+
867
+ /*
868
+ * call-seq:
869
+ * IPSocket.pton(af, hostname) -> string
870
+ *
871
+ * Converts a string representation of an address to network format.
872
+ *
873
+ * IPSocket.pton(Socket::AF_INET, "127.0.0.1") #=> "\x7f\x00\x00\x01"
874
+ */
875
+ static mrb_noreturn void
876
+ invalid_address_error(mrb_state *mrb)
877
+ {
878
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
879
+ }
880
+
881
+ static mrb_value
882
+ mrb_ipsocket_pton(mrb_state *mrb, mrb_value klass)
883
+ {
884
+ mrb_int af, n;
885
+ const char *bp;
886
+ char buf[50];
887
+
888
+ mrb_get_args(mrb, "is", &af, &bp, &n);
889
+ if ((size_t)n > sizeof(buf) - 1) {
890
+ invalid_address_error(mrb);
891
+ }
892
+ memcpy(buf, bp, n);
893
+ buf[n] = '\0';
894
+
895
+ if (af == AF_INET) {
896
+ struct in_addr in;
897
+ if (mrb_hal_socket_inet_pton(AF_INET, buf, (void*)&in.s_addr) != 1) {
898
+ invalid_address_error(mrb);
899
+ }
900
+ return mrb_str_new(mrb, (char*)&in.s_addr, 4);
901
+ }
902
+ else if (af == AF_INET6) {
903
+ struct in6_addr in6;
904
+ if (mrb_hal_socket_inet_pton(AF_INET6, buf, (void*)&in6.s6_addr) != 1) {
905
+ invalid_address_error(mrb);
906
+ }
907
+ return mrb_str_new(mrb, (char*)&in6.s6_addr, 16);
908
+ }
909
+ else {
910
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "unsupported address family");
911
+ }
912
+ return mrb_nil_value(); /* not reached */
913
+ }
914
+
915
+ /*
916
+ * call-seq:
917
+ * ipsocket.recvfrom(maxlen, flags=0) -> [data, [family, port, hostname, ip]]
918
+ *
919
+ * Receives data from the socket and returns sender address information.
920
+ *
921
+ * data, addr = sock.recvfrom(1024)
922
+ * # addr => ["AF_INET", 12345, "hostname", "192.168.1.1"]
923
+ */
924
+ static mrb_value
925
+ mrb_ipsocket_recvfrom(mrb_state *mrb, mrb_value self)
926
+ {
927
+ mrb_int maxlen;
928
+ mrb_int flags = 0;
929
+
930
+ mrb_get_args(mrb, "i|i", &maxlen, &flags);
931
+
932
+ mrb_value buf = mrb_str_new_capa(mrb, maxlen);
933
+ struct sockaddr_storage ss;
934
+ socklen_t socklen = sizeof(ss);
935
+ int fd = socket_fd(mrb, self);
936
+ ssize_t n = recvfrom(fd, RSTRING_PTR(buf), (fsize_t)maxlen, (int)flags,
937
+ (struct sockaddr*)&ss, &socklen);
938
+ if (n == -1) {
939
+ mrb_sys_fail(mrb, "recvfrom");
940
+ }
941
+ mrb_str_resize(mrb, buf, (mrb_int)n);
942
+
943
+ mrb_value a = sa2addrlist(mrb, (struct sockaddr*)&ss, socklen);
944
+ mrb_value pair = mrb_ary_new_capa(mrb, 2);
945
+ mrb_ary_push(mrb, pair, buf);
946
+ mrb_ary_push(mrb, pair, a);
947
+ return pair;
948
+ }
949
+
950
+ /*
951
+ * call-seq:
952
+ * Socket.gethostname -> string
953
+ *
954
+ * Returns the hostname of the current machine.
955
+ *
956
+ * Socket.gethostname #=> "localhost"
957
+ */
958
+ static mrb_value
959
+ mrb_socket_gethostname(mrb_state *mrb, mrb_value cls)
960
+ {
961
+ #ifdef HOST_NAME_MAX
962
+ size_t bufsize = HOST_NAME_MAX + 1;
963
+ #else
964
+ size_t bufsize = 256;
965
+ #endif
966
+ mrb_value buf = mrb_str_new_capa(mrb, (mrb_int)bufsize);
967
+
968
+ if (gethostname(RSTRING_PTR(buf), (fsize_t)bufsize) != 0)
969
+ mrb_sys_fail(mrb, "gethostname");
970
+ mrb_str_resize(mrb, buf, (mrb_int)strlen(RSTRING_PTR(buf)));
971
+ return buf;
972
+ }
973
+
974
+ /*
975
+ * call-seq:
976
+ * Socket._accept(fd) -> [new_fd, sockaddr]
977
+ *
978
+ * Internal method to accept a connection on a socket file descriptor.
979
+ * Returns the new file descriptor and remote address.
980
+ */
981
+ static mrb_value
982
+ mrb_socket_accept(mrb_state *mrb, mrb_value klass)
983
+ {
984
+ mrb_int s0;
985
+
986
+ mrb_get_args(mrb, "i", &s0);
987
+ int s1 = (int)accept(s0, NULL, NULL);
988
+ if (s1 == -1) {
989
+ mrb_sys_fail(mrb, "accept");
990
+ }
991
+ return mrb_fixnum_value(s1);
992
+ }
993
+
994
+ static mrb_value
995
+ mrb_socket_accept2(mrb_state *mrb, mrb_value klass)
996
+ {
997
+ mrb_int s0;
998
+
999
+ mrb_get_args(mrb, "i", &s0);
1000
+
1001
+ socklen_t socklen = sizeof(struct sockaddr_storage);
1002
+ mrb_value sastr = mrb_str_new_capa(mrb, (mrb_int)socklen);
1003
+ mrb_value ary = mrb_ary_new_capa(mrb, 2);
1004
+
1005
+ int s1 = (int)accept(s0, (struct sockaddr*)RSTRING_PTR(sastr), &socklen);
1006
+ if (s1 == -1) {
1007
+ mrb_sys_fail(mrb, "accept");
1008
+ }
1009
+
1010
+ mrb_str_resize(mrb, sastr, socklen);
1011
+ mrb_ary_push(mrb, ary, mrb_fixnum_value(s1));
1012
+ mrb_ary_push(mrb, ary, sastr);
1013
+ return ary;
1014
+ }
1015
+
1016
+ /*
1017
+ * call-seq:
1018
+ * Socket._bind(fd, sockaddr) -> 0
1019
+ *
1020
+ * Internal method to bind a socket file descriptor to the given address.
1021
+ */
1022
+ static mrb_value
1023
+ mrb_socket_bind(mrb_state *mrb, mrb_value klass)
1024
+ {
1025
+ mrb_value sastr;
1026
+ mrb_int s;
1027
+
1028
+ mrb_get_args(mrb, "iS", &s, &sastr);
1029
+ if (bind((int)s, (struct sockaddr*)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) {
1030
+ mrb_sys_fail(mrb, "bind");
1031
+ }
1032
+ return mrb_nil_value();
1033
+ }
1034
+
1035
+ /*
1036
+ * call-seq:
1037
+ * Socket._connect(fd, sockaddr) -> 0
1038
+ *
1039
+ * Internal method to connect a socket file descriptor to the given address.
1040
+ */
1041
+ static mrb_value
1042
+ mrb_socket_connect(mrb_state *mrb, mrb_value klass)
1043
+ {
1044
+ mrb_value sastr;
1045
+ mrb_int s;
1046
+
1047
+ mrb_get_args(mrb, "iS", &s, &sastr);
1048
+ if (connect((int)s, (struct sockaddr*)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) {
1049
+ mrb_sys_fail(mrb, "connect");
1050
+ }
1051
+ return mrb_nil_value();
1052
+ }
1053
+
1054
+ /*
1055
+ * call-seq:
1056
+ * Socket._listen(fd, backlog) -> 0
1057
+ *
1058
+ * Internal method to set a socket file descriptor to listen for connections.
1059
+ */
1060
+ static mrb_value
1061
+ mrb_socket_listen(mrb_state *mrb, mrb_value klass)
1062
+ {
1063
+ mrb_int s, backlog;
1064
+
1065
+ mrb_get_args(mrb, "ii", &s, &backlog);
1066
+ if (listen((int)s, (int)backlog) == -1) {
1067
+ mrb_sys_fail(mrb, "listen");
1068
+ }
1069
+ return mrb_nil_value();
1070
+ }
1071
+
1072
+ static mrb_value
1073
+ mrb_socket_sockaddr_family(mrb_state *mrb, mrb_value klass)
1074
+ {
1075
+ mrb_value str;
1076
+ const struct sockaddr *sa;
1077
+
1078
+ mrb_get_args(mrb, "S", &str);
1079
+ if ((size_t)RSTRING_LEN(str) < offsetof(struct sockaddr, sa_family) + sizeof(sa->sa_family)) {
1080
+ mrb_raise(mrb, E_SOCKET_ERROR, "invalid sockaddr (too short)");
1081
+ }
1082
+ sa = (const struct sockaddr*)RSTRING_PTR(str);
1083
+ return mrb_fixnum_value(sa->sa_family);
1084
+ }
1085
+
1086
+ /*
1087
+ * call-seq:
1088
+ * Socket.sockaddr_un(path) -> string
1089
+ *
1090
+ * Returns a packed sockaddr_un structure for the given Unix socket path.
1091
+ *
1092
+ * Socket.sockaddr_un("/tmp/socket")
1093
+ * Socket.sockaddr_un("/var/run/daemon.sock")
1094
+ */
1095
+ static mrb_value
1096
+ mrb_socket_sockaddr_un(mrb_state *mrb, mrb_value klass)
1097
+ {
1098
+ mrb_value path;
1099
+
1100
+ mrb_get_args(mrb, "S", &path);
1101
+ return mrb_hal_socket_sockaddr_un(mrb, RSTRING_PTR(path), (size_t)RSTRING_LEN(path));
1102
+ }
1103
+
1104
+ /*
1105
+ * call-seq:
1106
+ * Socket.socketpair(domain, type, protocol=0) -> [socket1, socket2]
1107
+ * Socket.pair(domain, type, protocol=0) -> [socket1, socket2]
1108
+ *
1109
+ * Creates a pair of connected sockets.
1110
+ *
1111
+ * sock1, sock2 = Socket.socketpair(Socket::AF_UNIX, Socket::SOCK_STREAM)
1112
+ * sock1, sock2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_DGRAM)
1113
+ */
1114
+ static mrb_value
1115
+ mrb_socket_socketpair(mrb_state *mrb, mrb_value klass)
1116
+ {
1117
+ mrb_int domain, type, protocol;
1118
+ int sv[2];
1119
+
1120
+ mrb_get_args(mrb, "iii", &domain, &type, &protocol);
1121
+
1122
+ if (mrb_hal_socket_socketpair(mrb, (int)domain, (int)type, (int)protocol, sv) == -1) {
1123
+ mrb_sys_fail(mrb, "socketpair");
1124
+ }
1125
+
1126
+ mrb_value ary = mrb_ary_new_capa(mrb, 2);
1127
+ mrb_ary_push(mrb, ary, mrb_fixnum_value(sv[0]));
1128
+ mrb_ary_push(mrb, ary, mrb_fixnum_value(sv[1]));
1129
+ return ary;
1130
+ }
1131
+
1132
+ /*
1133
+ * call-seq:
1134
+ * Socket._socket(domain, type, protocol) -> fd
1135
+ *
1136
+ * Internal method to create a new socket and return its file descriptor.
1137
+ *
1138
+ * fd = Socket._socket(Socket::AF_INET, Socket::SOCK_STREAM, 0)
1139
+ */
1140
+ static mrb_value
1141
+ mrb_socket_socket(mrb_state *mrb, mrb_value klass)
1142
+ {
1143
+ mrb_int domain, type, protocol;
1144
+
1145
+ mrb_get_args(mrb, "iii", &domain, &type, &protocol);
1146
+
1147
+ int s = (int)socket((int)domain, (int)type, (int)protocol);
1148
+ if (s == -1)
1149
+ mrb_sys_fail(mrb, "socket");
1150
+ return mrb_fixnum_value(s);
1151
+ }
1152
+
1153
+ /* Helper to allocate TCPSocket object */
1154
+ static mrb_value
1155
+ mrb_tcpsocket_allocate(mrb_state *mrb, mrb_value klass)
1156
+ {
1157
+ struct RClass *c = mrb_class_ptr(klass);
1158
+ enum mrb_vtype ttype = MRB_INSTANCE_TT(c);
1159
+
1160
+ /* copied from mrb_instance_alloc() */
1161
+ if (ttype == 0) ttype = MRB_TT_OBJECT;
1162
+ return mrb_obj_value((struct RObject*)mrb_obj_alloc(mrb, ttype, c));
1163
+ }
1164
+
1165
+ /* Windows overrides for IO methods on BasicSocket objects.
1166
+ * This is because sockets on Windows are not the same as file
1167
+ * descriptors, and thus functions which operate on file descriptors
1168
+ * will break on socket descriptors.
1169
+ */
1170
+ #ifdef _WIN32
1171
+ /*
1172
+ * call-seq:
1173
+ * basicsocket.close -> nil
1174
+ *
1175
+ * Windows-specific implementation to close socket using closesocket().
1176
+ * Overrides IO#close for socket objects on Windows.
1177
+ */
1178
+ static mrb_value
1179
+ mrb_win32_basicsocket_close(mrb_state *mrb, mrb_value self)
1180
+ {
1181
+ if (closesocket(socket_fd(mrb, self)) != NO_ERROR)
1182
+ mrb_raise(mrb, E_SOCKET_ERROR, "closesocket unsuccessful");
1183
+ return mrb_nil_value();
1184
+ }
1185
+
1186
+ /*
1187
+ * call-seq:
1188
+ * basicsocket.sysread(maxlen, outbuf=nil) -> string
1189
+ *
1190
+ * Windows-specific implementation to read from socket using recv().
1191
+ * Overrides IO#sysread for socket objects on Windows.
1192
+ */
1193
+ static mrb_value
1194
+ mrb_win32_basicsocket_sysread(mrb_state *mrb, mrb_value self)
1195
+ {
1196
+ mrb_value buf = mrb_nil_value();
1197
+ mrb_int maxlen;
1198
+
1199
+ mrb_get_args(mrb, "i|S", &maxlen, &buf);
1200
+ if (maxlen < 0) {
1201
+ return mrb_nil_value();
1202
+ }
1203
+
1204
+ if (mrb_nil_p(buf)) {
1205
+ buf = mrb_str_new(mrb, NULL, maxlen);
1206
+ }
1207
+ if (RSTRING_LEN(buf) != maxlen) {
1208
+ buf = mrb_str_resize(mrb, buf, maxlen);
1209
+ }
1210
+
1211
+ int sd = socket_fd(mrb, self);
1212
+ int ret = recv(sd, RSTRING_PTR(buf), (int)maxlen, 0);
1213
+
1214
+ switch (ret) {
1215
+ case 0: /* EOF */
1216
+ if (maxlen == 0) {
1217
+ buf = mrb_str_new_cstr(mrb, "");
1218
+ }
1219
+ else {
1220
+ mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File");
1221
+ }
1222
+ break;
1223
+ case SOCKET_ERROR: /* Error */
1224
+ mrb_sys_fail(mrb, "recv");
1225
+ break;
1226
+ default:
1227
+ if (RSTRING_LEN(buf) != ret) {
1228
+ buf = mrb_str_resize(mrb, buf, ret);
1229
+ }
1230
+ break;
1231
+ }
1232
+
1233
+ return buf;
1234
+ }
1235
+
1236
+ /*
1237
+ * call-seq:
1238
+ * basicsocket.sysseek(offset, whence) -> integer
1239
+ *
1240
+ * Windows-specific implementation that raises NotImplementedError.
1241
+ * Sockets don't support seeking operations.
1242
+ */
1243
+ static mrb_value
1244
+ mrb_win32_basicsocket_sysseek(mrb_state *mrb, mrb_value self)
1245
+ {
1246
+ mrb_raise(mrb, E_NOTIMP_ERROR, "sysseek not implemented for windows sockets");
1247
+ return mrb_nil_value();
1248
+ }
1249
+
1250
+ /*
1251
+ * call-seq:
1252
+ * basicsocket.syswrite(string) -> integer
1253
+ *
1254
+ * Windows-specific implementation to write to socket using send().
1255
+ * Overrides IO#syswrite for socket objects on Windows.
1256
+ */
1257
+ static mrb_value
1258
+ mrb_win32_basicsocket_syswrite(mrb_state *mrb, mrb_value self)
1259
+ {
1260
+ mrb_value str;
1261
+ SOCKET sd = socket_fd(mrb, self);
1262
+
1263
+ mrb_get_args(mrb, "S", &str);
1264
+
1265
+ int n = send(sd, RSTRING_PTR(str), (int)RSTRING_LEN(str), 0);
1266
+ if (n == SOCKET_ERROR)
1267
+ mrb_sys_fail(mrb, "send");
1268
+ return mrb_int_value(mrb, n);
1269
+ }
1270
+
1271
+ #endif
1272
+
1273
+ /* ---------------------------*/
1274
+ static const mrb_mt_entry addrinfo_rom_entries[] = {
1275
+ MRB_MT_ENTRY(mrb_addrinfo_getnameinfo, MRB_SYM(getnameinfo), MRB_ARGS_OPT(1)),
1276
+ MRB_MT_ENTRY(mrb_addrinfo_unix_path, MRB_SYM(unix_path), MRB_ARGS_NONE()),
1277
+ };
1278
+
1279
+ static const mrb_mt_entry basicsocket_rom_entries[] = {
1280
+ MRB_MT_ENTRY(mrb_basicsocket_recvfrom, MRB_SYM(_recvfrom), MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)),
1281
+ MRB_MT_ENTRY(mrb_basicsocket_setnonblock, MRB_SYM(_setnonblock), MRB_ARGS_REQ(1)),
1282
+ MRB_MT_ENTRY(mrb_basicsocket_getpeereid, MRB_SYM(getpeereid), MRB_ARGS_NONE()),
1283
+ MRB_MT_ENTRY(mrb_basicsocket_getpeername, MRB_SYM(getpeername), MRB_ARGS_NONE()),
1284
+ MRB_MT_ENTRY(mrb_basicsocket_getsockname, MRB_SYM(getsockname), MRB_ARGS_NONE()),
1285
+ MRB_MT_ENTRY(mrb_basicsocket_getsockopt, MRB_SYM(getsockopt), MRB_ARGS_REQ(2)),
1286
+ MRB_MT_ENTRY(mrb_basicsocket_recv, MRB_SYM(recv), MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)),
1287
+ MRB_MT_ENTRY(mrb_basicsocket_send, MRB_SYM(send), MRB_ARGS_REQ(2)|MRB_ARGS_OPT(1)),
1288
+ MRB_MT_ENTRY(mrb_basicsocket_setsockopt, MRB_SYM(setsockopt), MRB_ARGS_REQ(1)|MRB_ARGS_OPT(2)),
1289
+ MRB_MT_ENTRY(mrb_basicsocket_shutdown, MRB_SYM(shutdown), MRB_ARGS_OPT(1)),
1290
+ MRB_MT_ENTRY(mrb_basicsocket_set_is_socket, MRB_SYM_E(_is_socket), MRB_ARGS_REQ(1)),
1291
+ #ifdef _WIN32
1292
+ MRB_MT_ENTRY(mrb_win32_basicsocket_close, MRB_SYM(close), MRB_ARGS_NONE()),
1293
+ MRB_MT_ENTRY(mrb_win32_basicsocket_sysread, MRB_SYM(sysread), MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)),
1294
+ MRB_MT_ENTRY(mrb_win32_basicsocket_sysseek, MRB_SYM(sysseek), MRB_ARGS_REQ(1)),
1295
+ MRB_MT_ENTRY(mrb_win32_basicsocket_syswrite, MRB_SYM(syswrite), MRB_ARGS_REQ(1)),
1296
+ MRB_MT_ENTRY(mrb_win32_basicsocket_sysread, MRB_SYM(read), MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)),
1297
+ MRB_MT_ENTRY(mrb_win32_basicsocket_syswrite, MRB_SYM(write), MRB_ARGS_REQ(1)),
1298
+ #endif
1299
+ };
1300
+
1301
+ static const mrb_mt_entry ipsocket_rom_entries[] = {
1302
+ MRB_MT_ENTRY(mrb_ipsocket_recvfrom, MRB_SYM(recvfrom), MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)),
1303
+ };
1304
+
1305
+ static const mrb_mt_entry socket_option_rom_entries[] = {
1306
+ MRB_MT_ENTRY(socket_option_init, MRB_SYM(initialize), MRB_ARGS_REQ(4)),
1307
+ MRB_MT_ENTRY(socket_option_inspect, MRB_SYM(inspect), MRB_ARGS_REQ(0)),
1308
+ MRB_MT_ENTRY(socket_option_family, MRB_SYM(family), MRB_ARGS_REQ(0)),
1309
+ MRB_MT_ENTRY(socket_option_level, MRB_SYM(level), MRB_ARGS_REQ(0)),
1310
+ MRB_MT_ENTRY(socket_option_optname, MRB_SYM(optname), MRB_ARGS_REQ(0)),
1311
+ MRB_MT_ENTRY(socket_option_data, MRB_SYM(data), MRB_ARGS_REQ(0)),
1312
+ MRB_MT_ENTRY(socket_option_bool, MRB_SYM(bool), MRB_ARGS_REQ(0)),
1313
+ MRB_MT_ENTRY(socket_option_int, MRB_SYM(int), MRB_ARGS_REQ(0)),
1314
+ MRB_MT_ENTRY(socket_option_notimp, MRB_SYM(linger), MRB_ARGS_REQ(0)),
1315
+ MRB_MT_ENTRY(socket_option_notimp, MRB_SYM(unpack), MRB_ARGS_REQ(1)),
1316
+ };
1317
+
1318
+ void
1319
+ mrb_mruby_socket_gem_init(mrb_state* mrb)
1320
+ {
1321
+ mrb_hal_socket_init(mrb);
1322
+
1323
+ struct RClass *ainfo = mrb_define_class_id(mrb, MRB_SYM(Addrinfo), mrb->object_class);
1324
+ mrb_define_class_method_id(mrb, ainfo, MRB_SYM(getaddrinfo), mrb_addrinfo_getaddrinfo, MRB_ARGS_REQ(2)|MRB_ARGS_OPT(4));
1325
+
1326
+ struct RClass *io = mrb_class_get_id(mrb, MRB_SYM(IO));
1327
+
1328
+ struct RClass *bsock = mrb_define_class_id(mrb, MRB_SYM(BasicSocket), io);
1329
+
1330
+ struct RClass *ipsock = mrb_define_class_id(mrb, MRB_SYM(IPSocket), bsock);
1331
+ mrb_define_class_method_id(mrb, ipsock, MRB_SYM(ntop), mrb_ipsocket_ntop, MRB_ARGS_REQ(1));
1332
+ mrb_define_class_method_id(mrb, ipsock, MRB_SYM(pton), mrb_ipsocket_pton, MRB_ARGS_REQ(2));
1333
+
1334
+ struct RClass *tcpsock = mrb_define_class_id(mrb, MRB_SYM(TCPSocket), ipsock);
1335
+ mrb_define_class_method_id(mrb, tcpsock, MRB_SYM(_allocate), mrb_tcpsocket_allocate, MRB_ARGS_NONE());
1336
+
1337
+ struct RClass *sock = mrb_define_class_id(mrb, MRB_SYM(Socket), bsock);
1338
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(_accept), mrb_socket_accept, MRB_ARGS_REQ(1));
1339
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(_accept2), mrb_socket_accept2, MRB_ARGS_REQ(1));
1340
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(_bind), mrb_socket_bind, MRB_ARGS_REQ(2));
1341
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(_connect), mrb_socket_connect, MRB_ARGS_REQ(2));
1342
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(_listen), mrb_socket_listen, MRB_ARGS_REQ(2));
1343
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(_sockaddr_family), mrb_socket_sockaddr_family, MRB_ARGS_REQ(1));
1344
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(_socket), mrb_socket_socket, MRB_ARGS_REQ(3));
1345
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(gethostname), mrb_socket_gethostname, MRB_ARGS_NONE());
1346
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(sockaddr_un), mrb_socket_sockaddr_un, MRB_ARGS_REQ(1));
1347
+ mrb_define_class_method_id(mrb, sock, MRB_SYM(socketpair), mrb_socket_socketpair, MRB_ARGS_REQ(3));
1348
+
1349
+ struct RClass *option = mrb_define_class_under_id(mrb, sock, MRB_SYM(Option), mrb->object_class);
1350
+ mrb_define_class_method_id(mrb, option, MRB_SYM(bool), socket_option_s_bool, MRB_ARGS_REQ(4));
1351
+ mrb_define_class_method_id(mrb, option, MRB_SYM(int), socket_option_s_int, MRB_ARGS_REQ(4));
1352
+
1353
+ MRB_MT_INIT_ROM(mrb, ainfo, addrinfo_rom_entries);
1354
+ MRB_MT_INIT_ROM(mrb, bsock, basicsocket_rom_entries);
1355
+ MRB_MT_INIT_ROM(mrb, ipsock, ipsocket_rom_entries);
1356
+ MRB_MT_INIT_ROM(mrb, option, socket_option_rom_entries);
1357
+
1358
+ struct RClass *constants = mrb_define_module_under_id(mrb, sock, MRB_SYM(Constants));
1359
+
1360
+ #define define_const(SYM) \
1361
+ do { \
1362
+ mrb_define_const(mrb, constants, #SYM, mrb_int_value(mrb, SYM)); \
1363
+ } while (0)
1364
+
1365
+ #include "const.cstub"
1366
+
1367
+ mrb_include_module(mrb, sock, constants);
1368
+ }
1369
+
1370
+ void
1371
+ mrb_mruby_socket_gem_final(mrb_state* mrb)
1372
+ {
1373
+ mrb_hal_socket_final(mrb);
1374
+ }