shoesgem 0.1424.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 (808) hide show
  1. data/LICENSE +30 -0
  2. data/README.rdoc +31 -0
  3. data/lib/shoes.rb +4 -0
  4. data/shoes/CHANGELOG.txt +21 -0
  5. data/shoes/COPYING.txt +30 -0
  6. data/shoes/README.txt +117 -0
  7. data/shoes/VERSION.txt +1 -0
  8. data/shoes/fonts/Coolvetica.ttf +0 -0
  9. data/shoes/fonts/Lacuna.ttf +0 -0
  10. data/shoes/freetype6.dll +0 -0
  11. data/shoes/lib/shoes/cache.rb +54 -0
  12. data/shoes/lib/shoes/data.rb +39 -0
  13. data/shoes/lib/shoes/help.rb +421 -0
  14. data/shoes/lib/shoes/image.rb +25 -0
  15. data/shoes/lib/shoes/inspect.rb +128 -0
  16. data/shoes/lib/shoes/log.rb +48 -0
  17. data/shoes/lib/shoes/minitar.rb +986 -0
  18. data/shoes/lib/shoes/override.rb +38 -0
  19. data/shoes/lib/shoes/pack.rb +503 -0
  20. data/shoes/lib/shoes/search.rb +46 -0
  21. data/shoes/lib/shoes/setup.rb +329 -0
  22. data/shoes/lib/shoes/shy.rb +131 -0
  23. data/shoes/lib/shoes/shybuilder.rb +44 -0
  24. data/shoes/lib/shoes.rb +522 -0
  25. data/shoes/libcairo-2.dll +0 -0
  26. data/shoes/libeay32.dll +0 -0
  27. data/shoes/libexpat-1.dll +0 -0
  28. data/shoes/libfontconfig-1.dll +0 -0
  29. data/shoes/libgio-2.0-0.dll +0 -0
  30. data/shoes/libglib-2.0-0.dll +0 -0
  31. data/shoes/libgmodule-2.0-0.dll +0 -0
  32. data/shoes/libgobject-2.0-0.dll +0 -0
  33. data/shoes/libgthread-2.0-0.dll +0 -0
  34. data/shoes/libiconv2.dll +0 -0
  35. data/shoes/libjpeg-8.dll +0 -0
  36. data/shoes/libpango-1.0-0.dll +0 -0
  37. data/shoes/libpangocairo-1.0-0.dll +0 -0
  38. data/shoes/libpangoft2-1.0-0.dll +0 -0
  39. data/shoes/libpangowin32-1.0-0.dll +0 -0
  40. data/shoes/libpng14-14.dll +0 -0
  41. data/shoes/libportaudio-2.dll +0 -0
  42. data/shoes/libshoes.dll +0 -0
  43. data/shoes/libssl32.dll +0 -0
  44. data/shoes/libungif4.dll +0 -0
  45. data/shoes/msvcrt-ruby191.dll +0 -0
  46. data/shoes/readline5.dll +0 -0
  47. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/fast_xs.so +0 -0
  48. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/blankslate.rb +63 -0
  49. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/builder.rb +216 -0
  50. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/elements.rb +510 -0
  51. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/htmlinfo.rb +691 -0
  52. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/inspect.rb +103 -0
  53. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/modules.rb +40 -0
  54. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/parse.rb +38 -0
  55. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tag.rb +202 -0
  56. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tags.rb +164 -0
  57. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/traverse.rb +838 -0
  58. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/xchar.rb +94 -0
  59. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot.rb +26 -0
  60. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot_scan.so +0 -0
  61. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/core.rb +135 -0
  62. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/rails.rb +58 -0
  63. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/common.rb +354 -0
  64. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/generator.so +0 -0
  65. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/parser.so +0 -0
  66. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext.rb +13 -0
  67. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/version.rb +9 -0
  68. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json.rb +8 -0
  69. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/constants.rb +49 -0
  70. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/database.rb +721 -0
  71. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/api.rb +152 -0
  72. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/driver.rb +307 -0
  73. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/native/driver.rb +219 -0
  74. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/errors.rb +68 -0
  75. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/pragmas.rb +271 -0
  76. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/resultset.rb +180 -0
  77. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/statement.rb +231 -0
  78. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/translator.rb +109 -0
  79. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/value.rb +57 -0
  80. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/version.rb +16 -0
  81. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3.rb +1 -0
  82. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3_api.so +0 -0
  83. data/shoes/ruby/gems/1.9.1/specifications/hpricot-0.8.1.gemspec +32 -0
  84. data/shoes/ruby/gems/1.9.1/specifications/json-shoes-1.1.3.gemspec +34 -0
  85. data/shoes/ruby/gems/1.9.1/specifications/sqlite3-ruby-1.2.5-x86-mswin32.gemspec +46 -0
  86. data/shoes/ruby/lib/English.rb +155 -0
  87. data/shoes/ruby/lib/Win32API.rb +28 -0
  88. data/shoes/ruby/lib/abbrev.rb +103 -0
  89. data/shoes/ruby/lib/base64.rb +91 -0
  90. data/shoes/ruby/lib/benchmark.rb +573 -0
  91. data/shoes/ruby/lib/bigdecimal/jacobian.rb +85 -0
  92. data/shoes/ruby/lib/bigdecimal/ludcmp.rb +86 -0
  93. data/shoes/ruby/lib/bigdecimal/math.rb +237 -0
  94. data/shoes/ruby/lib/bigdecimal/newton.rb +77 -0
  95. data/shoes/ruby/lib/bigdecimal/util.rb +53 -0
  96. data/shoes/ruby/lib/cgi/cookie.rb +144 -0
  97. data/shoes/ruby/lib/cgi/core.rb +786 -0
  98. data/shoes/ruby/lib/cgi/html.rb +1021 -0
  99. data/shoes/ruby/lib/cgi/session/pstore.rb +111 -0
  100. data/shoes/ruby/lib/cgi/session.rb +537 -0
  101. data/shoes/ruby/lib/cgi/util.rb +181 -0
  102. data/shoes/ruby/lib/cgi.rb +274 -0
  103. data/shoes/ruby/lib/cmath.rb +233 -0
  104. data/shoes/ruby/lib/complex.rb +24 -0
  105. data/shoes/ruby/lib/csv.rb +2320 -0
  106. data/shoes/ruby/lib/date/format.rb +1313 -0
  107. data/shoes/ruby/lib/date.rb +1834 -0
  108. data/shoes/ruby/lib/debug.rb +907 -0
  109. data/shoes/ruby/lib/delegate.rb +311 -0
  110. data/shoes/ruby/lib/digest/hmac.rb +274 -0
  111. data/shoes/ruby/lib/digest/sha2.rb +74 -0
  112. data/shoes/ruby/lib/digest.rb +50 -0
  113. data/shoes/ruby/lib/dl/callback.rb +69 -0
  114. data/shoes/ruby/lib/dl/cparser.rb +109 -0
  115. data/shoes/ruby/lib/dl/func.rb +153 -0
  116. data/shoes/ruby/lib/dl/import.rb +215 -0
  117. data/shoes/ruby/lib/dl/pack.rb +173 -0
  118. data/shoes/ruby/lib/dl/stack.rb +146 -0
  119. data/shoes/ruby/lib/dl/struct.rb +213 -0
  120. data/shoes/ruby/lib/dl/types.rb +40 -0
  121. data/shoes/ruby/lib/dl/value.rb +112 -0
  122. data/shoes/ruby/lib/drb/acl.rb +146 -0
  123. data/shoes/ruby/lib/drb/drb.rb +1778 -0
  124. data/shoes/ruby/lib/drb/eq.rb +16 -0
  125. data/shoes/ruby/lib/drb/extserv.rb +71 -0
  126. data/shoes/ruby/lib/drb/extservm.rb +85 -0
  127. data/shoes/ruby/lib/drb/gw.rb +122 -0
  128. data/shoes/ruby/lib/drb/invokemethod.rb +34 -0
  129. data/shoes/ruby/lib/drb/observer.rb +22 -0
  130. data/shoes/ruby/lib/drb/ssl.rb +190 -0
  131. data/shoes/ruby/lib/drb/timeridconv.rb +91 -0
  132. data/shoes/ruby/lib/drb/unix.rb +108 -0
  133. data/shoes/ruby/lib/drb.rb +2 -0
  134. data/shoes/ruby/lib/e2mmap.rb +172 -0
  135. data/shoes/ruby/lib/erb.rb +902 -0
  136. data/shoes/ruby/lib/fileutils.rb +1592 -0
  137. data/shoes/ruby/lib/find.rb +81 -0
  138. data/shoes/ruby/lib/forwardable.rb +270 -0
  139. data/shoes/ruby/lib/ftsearch/analysis/analyzer.rb +16 -0
  140. data/shoes/ruby/lib/ftsearch/analysis/simple_identifier_analyzer.rb +23 -0
  141. data/shoes/ruby/lib/ftsearch/analysis/whitespace_analyzer.rb +22 -0
  142. data/shoes/ruby/lib/ftsearch/document_map_reader.rb +106 -0
  143. data/shoes/ruby/lib/ftsearch/document_map_writer.rb +46 -0
  144. data/shoes/ruby/lib/ftsearch/field_infos.rb +46 -0
  145. data/shoes/ruby/lib/ftsearch/fragment_writer.rb +114 -0
  146. data/shoes/ruby/lib/ftsearch/fulltext_reader.rb +52 -0
  147. data/shoes/ruby/lib/ftsearch/fulltext_writer.rb +75 -0
  148. data/shoes/ruby/lib/ftsearch/suffix_array_reader.rb +275 -0
  149. data/shoes/ruby/lib/ftsearch/suffix_array_writer.rb +99 -0
  150. data/shoes/ruby/lib/ftsearch/util.rb +21 -0
  151. data/shoes/ruby/lib/getoptlong.rb +610 -0
  152. data/shoes/ruby/lib/gserver.rb +253 -0
  153. data/shoes/ruby/lib/i386-mingw32/bigdecimal.so +0 -0
  154. data/shoes/ruby/lib/i386-mingw32/binject.so +0 -0
  155. data/shoes/ruby/lib/i386-mingw32/bloops.so +0 -0
  156. data/shoes/ruby/lib/i386-mingw32/continuation.so +0 -0
  157. data/shoes/ruby/lib/i386-mingw32/coverage.so +0 -0
  158. data/shoes/ruby/lib/i386-mingw32/curses.so +0 -0
  159. data/shoes/ruby/lib/i386-mingw32/digest/bubblebabble.so +0 -0
  160. data/shoes/ruby/lib/i386-mingw32/digest/md5.so +0 -0
  161. data/shoes/ruby/lib/i386-mingw32/digest/rmd160.so +0 -0
  162. data/shoes/ruby/lib/i386-mingw32/digest/sha1.so +0 -0
  163. data/shoes/ruby/lib/i386-mingw32/digest/sha2.so +0 -0
  164. data/shoes/ruby/lib/i386-mingw32/digest.so +0 -0
  165. data/shoes/ruby/lib/i386-mingw32/dl.so +0 -0
  166. data/shoes/ruby/lib/i386-mingw32/enc/big5.so +0 -0
  167. data/shoes/ruby/lib/i386-mingw32/enc/cp949.so +0 -0
  168. data/shoes/ruby/lib/i386-mingw32/enc/emacs_mule.so +0 -0
  169. data/shoes/ruby/lib/i386-mingw32/enc/encdb.so +0 -0
  170. data/shoes/ruby/lib/i386-mingw32/enc/euc_jp.so +0 -0
  171. data/shoes/ruby/lib/i386-mingw32/enc/euc_kr.so +0 -0
  172. data/shoes/ruby/lib/i386-mingw32/enc/euc_tw.so +0 -0
  173. data/shoes/ruby/lib/i386-mingw32/enc/gb18030.so +0 -0
  174. data/shoes/ruby/lib/i386-mingw32/enc/gb2312.so +0 -0
  175. data/shoes/ruby/lib/i386-mingw32/enc/gbk.so +0 -0
  176. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_1.so +0 -0
  177. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_10.so +0 -0
  178. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_11.so +0 -0
  179. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_13.so +0 -0
  180. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_14.so +0 -0
  181. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_15.so +0 -0
  182. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_16.so +0 -0
  183. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_2.so +0 -0
  184. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_3.so +0 -0
  185. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_4.so +0 -0
  186. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_5.so +0 -0
  187. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_6.so +0 -0
  188. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_7.so +0 -0
  189. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_8.so +0 -0
  190. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_9.so +0 -0
  191. data/shoes/ruby/lib/i386-mingw32/enc/koi8_r.so +0 -0
  192. data/shoes/ruby/lib/i386-mingw32/enc/koi8_u.so +0 -0
  193. data/shoes/ruby/lib/i386-mingw32/enc/shift_jis.so +0 -0
  194. data/shoes/ruby/lib/i386-mingw32/enc/trans/big5.so +0 -0
  195. data/shoes/ruby/lib/i386-mingw32/enc/trans/chinese.so +0 -0
  196. data/shoes/ruby/lib/i386-mingw32/enc/trans/escape.so +0 -0
  197. data/shoes/ruby/lib/i386-mingw32/enc/trans/gb18030.so +0 -0
  198. data/shoes/ruby/lib/i386-mingw32/enc/trans/gbk.so +0 -0
  199. data/shoes/ruby/lib/i386-mingw32/enc/trans/iso2022.so +0 -0
  200. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese.so +0 -0
  201. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_euc.so +0 -0
  202. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_sjis.so +0 -0
  203. data/shoes/ruby/lib/i386-mingw32/enc/trans/korean.so +0 -0
  204. data/shoes/ruby/lib/i386-mingw32/enc/trans/single_byte.so +0 -0
  205. data/shoes/ruby/lib/i386-mingw32/enc/trans/transdb.so +0 -0
  206. data/shoes/ruby/lib/i386-mingw32/enc/trans/utf_16_32.so +0 -0
  207. data/shoes/ruby/lib/i386-mingw32/enc/utf_16be.so +0 -0
  208. data/shoes/ruby/lib/i386-mingw32/enc/utf_16le.so +0 -0
  209. data/shoes/ruby/lib/i386-mingw32/enc/utf_32be.so +0 -0
  210. data/shoes/ruby/lib/i386-mingw32/enc/utf_32le.so +0 -0
  211. data/shoes/ruby/lib/i386-mingw32/enc/windows_1251.so +0 -0
  212. data/shoes/ruby/lib/i386-mingw32/etc.so +0 -0
  213. data/shoes/ruby/lib/i386-mingw32/fcntl.so +0 -0
  214. data/shoes/ruby/lib/i386-mingw32/fiber.so +0 -0
  215. data/shoes/ruby/lib/i386-mingw32/ftsearchrt.so +0 -0
  216. data/shoes/ruby/lib/i386-mingw32/gdbm.so +0 -0
  217. data/shoes/ruby/lib/i386-mingw32/iconv.so +0 -0
  218. data/shoes/ruby/lib/i386-mingw32/io/wait.so +0 -0
  219. data/shoes/ruby/lib/i386-mingw32/json/ext/generator.so +0 -0
  220. data/shoes/ruby/lib/i386-mingw32/json/ext/parser.so +0 -0
  221. data/shoes/ruby/lib/i386-mingw32/mathn/complex.so +0 -0
  222. data/shoes/ruby/lib/i386-mingw32/mathn/rational.so +0 -0
  223. data/shoes/ruby/lib/i386-mingw32/nkf.so +0 -0
  224. data/shoes/ruby/lib/i386-mingw32/openssl.so +0 -0
  225. data/shoes/ruby/lib/i386-mingw32/racc/cparse.so +0 -0
  226. data/shoes/ruby/lib/i386-mingw32/rbconfig.rb +196 -0
  227. data/shoes/ruby/lib/i386-mingw32/readline.so +0 -0
  228. data/shoes/ruby/lib/i386-mingw32/ripper.so +0 -0
  229. data/shoes/ruby/lib/i386-mingw32/sdbm.so +0 -0
  230. data/shoes/ruby/lib/i386-mingw32/socket.so +0 -0
  231. data/shoes/ruby/lib/i386-mingw32/stringio.so +0 -0
  232. data/shoes/ruby/lib/i386-mingw32/strscan.so +0 -0
  233. data/shoes/ruby/lib/i386-mingw32/syck.so +0 -0
  234. data/shoes/ruby/lib/i386-mingw32/win32ole.so +0 -0
  235. data/shoes/ruby/lib/i386-mingw32/zlib.so +0 -0
  236. data/shoes/ruby/lib/io/nonblock.rb +23 -0
  237. data/shoes/ruby/lib/ipaddr.rb +813 -0
  238. data/shoes/ruby/lib/irb/cmd/chws.rb +32 -0
  239. data/shoes/ruby/lib/irb/cmd/fork.rb +38 -0
  240. data/shoes/ruby/lib/irb/cmd/help.rb +36 -0
  241. data/shoes/ruby/lib/irb/cmd/load.rb +66 -0
  242. data/shoes/ruby/lib/irb/cmd/nop.rb +38 -0
  243. data/shoes/ruby/lib/irb/cmd/pushws.rb +38 -0
  244. data/shoes/ruby/lib/irb/cmd/subirb.rb +42 -0
  245. data/shoes/ruby/lib/irb/completion.rb +207 -0
  246. data/shoes/ruby/lib/irb/context.rb +255 -0
  247. data/shoes/ruby/lib/irb/ext/change-ws.rb +61 -0
  248. data/shoes/ruby/lib/irb/ext/history.rb +109 -0
  249. data/shoes/ruby/lib/irb/ext/loader.rb +119 -0
  250. data/shoes/ruby/lib/irb/ext/math-mode.rb +36 -0
  251. data/shoes/ruby/lib/irb/ext/multi-irb.rb +240 -0
  252. data/shoes/ruby/lib/irb/ext/save-history.rb +100 -0
  253. data/shoes/ruby/lib/irb/ext/tracer.rb +60 -0
  254. data/shoes/ruby/lib/irb/ext/use-loader.rb +64 -0
  255. data/shoes/ruby/lib/irb/ext/workspaces.rb +55 -0
  256. data/shoes/ruby/lib/irb/extend-command.rb +272 -0
  257. data/shoes/ruby/lib/irb/frame.rb +66 -0
  258. data/shoes/ruby/lib/irb/help.rb +35 -0
  259. data/shoes/ruby/lib/irb/init.rb +288 -0
  260. data/shoes/ruby/lib/irb/input-method.rb +142 -0
  261. data/shoes/ruby/lib/irb/lc/error.rb +29 -0
  262. data/shoes/ruby/lib/irb/lc/help-message +38 -0
  263. data/shoes/ruby/lib/irb/lc/ja/encoding_aliases.rb +8 -0
  264. data/shoes/ruby/lib/irb/lc/ja/error.rb +27 -0
  265. data/shoes/ruby/lib/irb/lc/ja/help-message +39 -0
  266. data/shoes/ruby/lib/irb/locale.rb +195 -0
  267. data/shoes/ruby/lib/irb/magic-file.rb +36 -0
  268. data/shoes/ruby/lib/irb/notifier.rb +144 -0
  269. data/shoes/ruby/lib/irb/output-method.rb +69 -0
  270. data/shoes/ruby/lib/irb/ruby-lex.rb +1188 -0
  271. data/shoes/ruby/lib/irb/ruby-token.rb +270 -0
  272. data/shoes/ruby/lib/irb/slex.rb +282 -0
  273. data/shoes/ruby/lib/irb/src_encoding.rb +4 -0
  274. data/shoes/ruby/lib/irb/version.rb +15 -0
  275. data/shoes/ruby/lib/irb/workspace.rb +108 -0
  276. data/shoes/ruby/lib/irb/ws-for-case-2.rb +14 -0
  277. data/shoes/ruby/lib/irb/xmp.rb +97 -0
  278. data/shoes/ruby/lib/irb.rb +354 -0
  279. data/shoes/ruby/lib/json/add/core.rb +135 -0
  280. data/shoes/ruby/lib/json/add/rails.rb +58 -0
  281. data/shoes/ruby/lib/json/common.rb +354 -0
  282. data/shoes/ruby/lib/json/editor.rb +1371 -0
  283. data/shoes/ruby/lib/json/ext.rb +15 -0
  284. data/shoes/ruby/lib/json/version.rb +9 -0
  285. data/shoes/ruby/lib/json.rb +297 -0
  286. data/shoes/ruby/lib/kconv.rb +282 -0
  287. data/shoes/ruby/lib/logger.rb +732 -0
  288. data/shoes/ruby/lib/mathn.rb +206 -0
  289. data/shoes/ruby/lib/matrix.rb +1381 -0
  290. data/shoes/ruby/lib/minitest/autorun.rb +9 -0
  291. data/shoes/ruby/lib/minitest/mock.rb +37 -0
  292. data/shoes/ruby/lib/minitest/spec.rb +89 -0
  293. data/shoes/ruby/lib/minitest/unit.rb +497 -0
  294. data/shoes/ruby/lib/mkmf.rb +1958 -0
  295. data/shoes/ruby/lib/monitor.rb +265 -0
  296. data/shoes/ruby/lib/mutex_m.rb +91 -0
  297. data/shoes/ruby/lib/net/ftp.rb +981 -0
  298. data/shoes/ruby/lib/net/http.rb +2399 -0
  299. data/shoes/ruby/lib/net/https.rb +136 -0
  300. data/shoes/ruby/lib/net/imap.rb +3500 -0
  301. data/shoes/ruby/lib/net/pop.rb +1000 -0
  302. data/shoes/ruby/lib/net/protocol.rb +382 -0
  303. data/shoes/ruby/lib/net/smtp.rb +1014 -0
  304. data/shoes/ruby/lib/net/telnet.rb +759 -0
  305. data/shoes/ruby/lib/observer.rb +193 -0
  306. data/shoes/ruby/lib/open-uri.rb +832 -0
  307. data/shoes/ruby/lib/open3.rb +98 -0
  308. data/shoes/ruby/lib/openssl/bn.rb +35 -0
  309. data/shoes/ruby/lib/openssl/buffering.rb +242 -0
  310. data/shoes/ruby/lib/openssl/cipher.rb +65 -0
  311. data/shoes/ruby/lib/openssl/digest.rb +61 -0
  312. data/shoes/ruby/lib/openssl/ssl.rb +178 -0
  313. data/shoes/ruby/lib/openssl/x509.rb +155 -0
  314. data/shoes/ruby/lib/openssl.rb +24 -0
  315. data/shoes/ruby/lib/optparse/date.rb +17 -0
  316. data/shoes/ruby/lib/optparse/shellwords.rb +6 -0
  317. data/shoes/ruby/lib/optparse/time.rb +10 -0
  318. data/shoes/ruby/lib/optparse/uri.rb +6 -0
  319. data/shoes/ruby/lib/optparse/version.rb +70 -0
  320. data/shoes/ruby/lib/optparse.rb +1810 -0
  321. data/shoes/ruby/lib/ostruct.rb +145 -0
  322. data/shoes/ruby/lib/pathname.rb +1099 -0
  323. data/shoes/ruby/lib/pp.rb +532 -0
  324. data/shoes/ruby/lib/prettyprint.rb +896 -0
  325. data/shoes/ruby/lib/prime.rb +471 -0
  326. data/shoes/ruby/lib/profile.rb +10 -0
  327. data/shoes/ruby/lib/profiler.rb +59 -0
  328. data/shoes/ruby/lib/pstore.rb +543 -0
  329. data/shoes/ruby/lib/racc/parser.rb +441 -0
  330. data/shoes/ruby/lib/rake/classic_namespace.rb +8 -0
  331. data/shoes/ruby/lib/rake/clean.rb +33 -0
  332. data/shoes/ruby/lib/rake/gempackagetask.rb +97 -0
  333. data/shoes/ruby/lib/rake/loaders/makefile.rb +35 -0
  334. data/shoes/ruby/lib/rake/packagetask.rb +185 -0
  335. data/shoes/ruby/lib/rake/rake_test_loader.rb +5 -0
  336. data/shoes/ruby/lib/rake/rdoctask.rb +147 -0
  337. data/shoes/ruby/lib/rake/runtest.rb +23 -0
  338. data/shoes/ruby/lib/rake/tasklib.rb +23 -0
  339. data/shoes/ruby/lib/rake/testtask.rb +161 -0
  340. data/shoes/ruby/lib/rake/win32.rb +34 -0
  341. data/shoes/ruby/lib/rake.rb +2465 -0
  342. data/shoes/ruby/lib/rational.rb +19 -0
  343. data/shoes/ruby/lib/rbconfig/datadir.rb +24 -0
  344. data/shoes/ruby/lib/rdoc/code_objects.rb +1061 -0
  345. data/shoes/ruby/lib/rdoc/diagram.rb +340 -0
  346. data/shoes/ruby/lib/rdoc/dot.rb +249 -0
  347. data/shoes/ruby/lib/rdoc/generator/chm/chm.rb +100 -0
  348. data/shoes/ruby/lib/rdoc/generator/chm.rb +113 -0
  349. data/shoes/ruby/lib/rdoc/generator/html/common.rb +24 -0
  350. data/shoes/ruby/lib/rdoc/generator/html/frameless.rb +92 -0
  351. data/shoes/ruby/lib/rdoc/generator/html/hefss.rb +150 -0
  352. data/shoes/ruby/lib/rdoc/generator/html/html.rb +769 -0
  353. data/shoes/ruby/lib/rdoc/generator/html/kilmer.rb +151 -0
  354. data/shoes/ruby/lib/rdoc/generator/html/kilmerfactory.rb +427 -0
  355. data/shoes/ruby/lib/rdoc/generator/html/one_page_html.rb +122 -0
  356. data/shoes/ruby/lib/rdoc/generator/html.rb +445 -0
  357. data/shoes/ruby/lib/rdoc/generator/ri.rb +226 -0
  358. data/shoes/ruby/lib/rdoc/generator/texinfo/class.texinfo.erb +44 -0
  359. data/shoes/ruby/lib/rdoc/generator/texinfo/file.texinfo.erb +6 -0
  360. data/shoes/ruby/lib/rdoc/generator/texinfo/method.texinfo.erb +6 -0
  361. data/shoes/ruby/lib/rdoc/generator/texinfo/texinfo.erb +28 -0
  362. data/shoes/ruby/lib/rdoc/generator/texinfo.rb +81 -0
  363. data/shoes/ruby/lib/rdoc/generator/xml/rdf.rb +113 -0
  364. data/shoes/ruby/lib/rdoc/generator/xml/xml.rb +123 -0
  365. data/shoes/ruby/lib/rdoc/generator/xml.rb +117 -0
  366. data/shoes/ruby/lib/rdoc/generator.rb +1082 -0
  367. data/shoes/ruby/lib/rdoc/known_classes.rb +68 -0
  368. data/shoes/ruby/lib/rdoc/markup/attribute_manager.rb +265 -0
  369. data/shoes/ruby/lib/rdoc/markup/formatter.rb +14 -0
  370. data/shoes/ruby/lib/rdoc/markup/fragments.rb +337 -0
  371. data/shoes/ruby/lib/rdoc/markup/inline.rb +101 -0
  372. data/shoes/ruby/lib/rdoc/markup/lines.rb +152 -0
  373. data/shoes/ruby/lib/rdoc/markup/preprocess.rb +75 -0
  374. data/shoes/ruby/lib/rdoc/markup/to_flow.rb +185 -0
  375. data/shoes/ruby/lib/rdoc/markup/to_html.rb +403 -0
  376. data/shoes/ruby/lib/rdoc/markup/to_html_crossref.rb +148 -0
  377. data/shoes/ruby/lib/rdoc/markup/to_latex.rb +328 -0
  378. data/shoes/ruby/lib/rdoc/markup/to_test.rb +50 -0
  379. data/shoes/ruby/lib/rdoc/markup/to_texinfo.rb +69 -0
  380. data/shoes/ruby/lib/rdoc/markup.rb +378 -0
  381. data/shoes/ruby/lib/rdoc/options.rb +638 -0
  382. data/shoes/ruby/lib/rdoc/parser/c.rb +661 -0
  383. data/shoes/ruby/lib/rdoc/parser/f95.rb +1835 -0
  384. data/shoes/ruby/lib/rdoc/parser/perl.rb +165 -0
  385. data/shoes/ruby/lib/rdoc/parser/ruby.rb +2829 -0
  386. data/shoes/ruby/lib/rdoc/parser/simple.rb +38 -0
  387. data/shoes/ruby/lib/rdoc/parser.rb +142 -0
  388. data/shoes/ruby/lib/rdoc/rdoc.rb +293 -0
  389. data/shoes/ruby/lib/rdoc/ri/cache.rb +187 -0
  390. data/shoes/ruby/lib/rdoc/ri/descriptions.rb +156 -0
  391. data/shoes/ruby/lib/rdoc/ri/display.rb +392 -0
  392. data/shoes/ruby/lib/rdoc/ri/driver.rb +669 -0
  393. data/shoes/ruby/lib/rdoc/ri/formatter.rb +616 -0
  394. data/shoes/ruby/lib/rdoc/ri/paths.rb +99 -0
  395. data/shoes/ruby/lib/rdoc/ri/reader.rb +106 -0
  396. data/shoes/ruby/lib/rdoc/ri/util.rb +79 -0
  397. data/shoes/ruby/lib/rdoc/ri/writer.rb +68 -0
  398. data/shoes/ruby/lib/rdoc/ri.rb +8 -0
  399. data/shoes/ruby/lib/rdoc/stats.rb +115 -0
  400. data/shoes/ruby/lib/rdoc/template.rb +64 -0
  401. data/shoes/ruby/lib/rdoc/tokenstream.rb +33 -0
  402. data/shoes/ruby/lib/rdoc.rb +395 -0
  403. data/shoes/ruby/lib/resolv-replace.rb +63 -0
  404. data/shoes/ruby/lib/resolv.rb +2262 -0
  405. data/shoes/ruby/lib/rexml/attlistdecl.rb +62 -0
  406. data/shoes/ruby/lib/rexml/attribute.rb +188 -0
  407. data/shoes/ruby/lib/rexml/cdata.rb +67 -0
  408. data/shoes/ruby/lib/rexml/child.rb +96 -0
  409. data/shoes/ruby/lib/rexml/comment.rb +80 -0
  410. data/shoes/ruby/lib/rexml/doctype.rb +270 -0
  411. data/shoes/ruby/lib/rexml/document.rb +231 -0
  412. data/shoes/ruby/lib/rexml/dtd/attlistdecl.rb +10 -0
  413. data/shoes/ruby/lib/rexml/dtd/dtd.rb +51 -0
  414. data/shoes/ruby/lib/rexml/dtd/elementdecl.rb +17 -0
  415. data/shoes/ruby/lib/rexml/dtd/entitydecl.rb +56 -0
  416. data/shoes/ruby/lib/rexml/dtd/notationdecl.rb +39 -0
  417. data/shoes/ruby/lib/rexml/element.rb +1246 -0
  418. data/shoes/ruby/lib/rexml/encoding.rb +71 -0
  419. data/shoes/ruby/lib/rexml/encodings/CP-1252.rb +103 -0
  420. data/shoes/ruby/lib/rexml/encodings/EUC-JP.rb +35 -0
  421. data/shoes/ruby/lib/rexml/encodings/ICONV.rb +22 -0
  422. data/shoes/ruby/lib/rexml/encodings/ISO-8859-1.rb +7 -0
  423. data/shoes/ruby/lib/rexml/encodings/ISO-8859-15.rb +72 -0
  424. data/shoes/ruby/lib/rexml/encodings/SHIFT-JIS.rb +37 -0
  425. data/shoes/ruby/lib/rexml/encodings/SHIFT_JIS.rb +1 -0
  426. data/shoes/ruby/lib/rexml/encodings/UNILE.rb +34 -0
  427. data/shoes/ruby/lib/rexml/encodings/US-ASCII.rb +30 -0
  428. data/shoes/ruby/lib/rexml/encodings/UTF-16.rb +35 -0
  429. data/shoes/ruby/lib/rexml/encodings/UTF-8.rb +18 -0
  430. data/shoes/ruby/lib/rexml/entity.rb +166 -0
  431. data/shoes/ruby/lib/rexml/formatters/default.rb +109 -0
  432. data/shoes/ruby/lib/rexml/formatters/pretty.rb +139 -0
  433. data/shoes/ruby/lib/rexml/formatters/transitive.rb +58 -0
  434. data/shoes/ruby/lib/rexml/functions.rb +388 -0
  435. data/shoes/ruby/lib/rexml/instruction.rb +70 -0
  436. data/shoes/ruby/lib/rexml/light/node.rb +196 -0
  437. data/shoes/ruby/lib/rexml/namespace.rb +47 -0
  438. data/shoes/ruby/lib/rexml/node.rb +75 -0
  439. data/shoes/ruby/lib/rexml/output.rb +24 -0
  440. data/shoes/ruby/lib/rexml/parent.rb +166 -0
  441. data/shoes/ruby/lib/rexml/parseexception.rb +51 -0
  442. data/shoes/ruby/lib/rexml/parsers/baseparser.rb +530 -0
  443. data/shoes/ruby/lib/rexml/parsers/lightparser.rb +58 -0
  444. data/shoes/ruby/lib/rexml/parsers/pullparser.rb +196 -0
  445. data/shoes/ruby/lib/rexml/parsers/sax2parser.rb +247 -0
  446. data/shoes/ruby/lib/rexml/parsers/streamparser.rb +46 -0
  447. data/shoes/ruby/lib/rexml/parsers/treeparser.rb +100 -0
  448. data/shoes/ruby/lib/rexml/parsers/ultralightparser.rb +56 -0
  449. data/shoes/ruby/lib/rexml/parsers/xpathparser.rb +698 -0
  450. data/shoes/ruby/lib/rexml/quickpath.rb +263 -0
  451. data/shoes/ruby/lib/rexml/rexml.rb +31 -0
  452. data/shoes/ruby/lib/rexml/sax2listener.rb +97 -0
  453. data/shoes/ruby/lib/rexml/source.rb +258 -0
  454. data/shoes/ruby/lib/rexml/streamlistener.rb +92 -0
  455. data/shoes/ruby/lib/rexml/syncenumerator.rb +32 -0
  456. data/shoes/ruby/lib/rexml/text.rb +404 -0
  457. data/shoes/ruby/lib/rexml/undefinednamespaceexception.rb +8 -0
  458. data/shoes/ruby/lib/rexml/validation/relaxng.rb +559 -0
  459. data/shoes/ruby/lib/rexml/validation/validation.rb +155 -0
  460. data/shoes/ruby/lib/rexml/validation/validationexception.rb +9 -0
  461. data/shoes/ruby/lib/rexml/xmldecl.rb +119 -0
  462. data/shoes/ruby/lib/rexml/xmltokens.rb +18 -0
  463. data/shoes/ruby/lib/rexml/xpath.rb +77 -0
  464. data/shoes/ruby/lib/rexml/xpath_parser.rb +792 -0
  465. data/shoes/ruby/lib/rinda/rinda.rb +283 -0
  466. data/shoes/ruby/lib/rinda/ring.rb +271 -0
  467. data/shoes/ruby/lib/rinda/tuplespace.rb +642 -0
  468. data/shoes/ruby/lib/ripper/core.rb +70 -0
  469. data/shoes/ruby/lib/ripper/filter.rb +70 -0
  470. data/shoes/ruby/lib/ripper/lexer.rb +179 -0
  471. data/shoes/ruby/lib/ripper/sexp.rb +99 -0
  472. data/shoes/ruby/lib/ripper.rb +4 -0
  473. data/shoes/ruby/lib/rss/0.9.rb +427 -0
  474. data/shoes/ruby/lib/rss/1.0.rb +452 -0
  475. data/shoes/ruby/lib/rss/2.0.rb +111 -0
  476. data/shoes/ruby/lib/rss/atom.rb +748 -0
  477. data/shoes/ruby/lib/rss/content/1.0.rb +10 -0
  478. data/shoes/ruby/lib/rss/content/2.0.rb +12 -0
  479. data/shoes/ruby/lib/rss/content.rb +31 -0
  480. data/shoes/ruby/lib/rss/converter.rb +170 -0
  481. data/shoes/ruby/lib/rss/dublincore/1.0.rb +13 -0
  482. data/shoes/ruby/lib/rss/dublincore/2.0.rb +13 -0
  483. data/shoes/ruby/lib/rss/dublincore/atom.rb +17 -0
  484. data/shoes/ruby/lib/rss/dublincore.rb +161 -0
  485. data/shoes/ruby/lib/rss/image.rb +193 -0
  486. data/shoes/ruby/lib/rss/itunes.rb +410 -0
  487. data/shoes/ruby/lib/rss/maker/0.9.rb +467 -0
  488. data/shoes/ruby/lib/rss/maker/1.0.rb +434 -0
  489. data/shoes/ruby/lib/rss/maker/2.0.rb +223 -0
  490. data/shoes/ruby/lib/rss/maker/atom.rb +172 -0
  491. data/shoes/ruby/lib/rss/maker/base.rb +880 -0
  492. data/shoes/ruby/lib/rss/maker/content.rb +21 -0
  493. data/shoes/ruby/lib/rss/maker/dublincore.rb +124 -0
  494. data/shoes/ruby/lib/rss/maker/entry.rb +163 -0
  495. data/shoes/ruby/lib/rss/maker/feed.rb +430 -0
  496. data/shoes/ruby/lib/rss/maker/image.rb +111 -0
  497. data/shoes/ruby/lib/rss/maker/itunes.rb +242 -0
  498. data/shoes/ruby/lib/rss/maker/slash.rb +33 -0
  499. data/shoes/ruby/lib/rss/maker/syndication.rb +18 -0
  500. data/shoes/ruby/lib/rss/maker/taxonomy.rb +118 -0
  501. data/shoes/ruby/lib/rss/maker/trackback.rb +61 -0
  502. data/shoes/ruby/lib/rss/maker.rb +44 -0
  503. data/shoes/ruby/lib/rss/parser.rb +568 -0
  504. data/shoes/ruby/lib/rss/rexmlparser.rb +54 -0
  505. data/shoes/ruby/lib/rss/rss.rb +1313 -0
  506. data/shoes/ruby/lib/rss/slash.rb +49 -0
  507. data/shoes/ruby/lib/rss/syndication.rb +67 -0
  508. data/shoes/ruby/lib/rss/taxonomy.rb +145 -0
  509. data/shoes/ruby/lib/rss/trackback.rb +288 -0
  510. data/shoes/ruby/lib/rss/utils.rb +111 -0
  511. data/shoes/ruby/lib/rss/xml-stylesheet.rb +105 -0
  512. data/shoes/ruby/lib/rss/xml.rb +71 -0
  513. data/shoes/ruby/lib/rss/xmlparser.rb +93 -0
  514. data/shoes/ruby/lib/rss/xmlscanner.rb +121 -0
  515. data/shoes/ruby/lib/rss.rb +19 -0
  516. data/shoes/ruby/lib/rubygems/builder.rb +88 -0
  517. data/shoes/ruby/lib/rubygems/command.rb +406 -0
  518. data/shoes/ruby/lib/rubygems/command_manager.rb +146 -0
  519. data/shoes/ruby/lib/rubygems/commands/build_command.rb +53 -0
  520. data/shoes/ruby/lib/rubygems/commands/cert_command.rb +86 -0
  521. data/shoes/ruby/lib/rubygems/commands/check_command.rb +75 -0
  522. data/shoes/ruby/lib/rubygems/commands/cleanup_command.rb +91 -0
  523. data/shoes/ruby/lib/rubygems/commands/contents_command.rb +74 -0
  524. data/shoes/ruby/lib/rubygems/commands/dependency_command.rb +188 -0
  525. data/shoes/ruby/lib/rubygems/commands/environment_command.rb +128 -0
  526. data/shoes/ruby/lib/rubygems/commands/fetch_command.rb +62 -0
  527. data/shoes/ruby/lib/rubygems/commands/generate_index_command.rb +57 -0
  528. data/shoes/ruby/lib/rubygems/commands/help_command.rb +172 -0
  529. data/shoes/ruby/lib/rubygems/commands/install_command.rb +148 -0
  530. data/shoes/ruby/lib/rubygems/commands/list_command.rb +35 -0
  531. data/shoes/ruby/lib/rubygems/commands/lock_command.rb +110 -0
  532. data/shoes/ruby/lib/rubygems/commands/mirror_command.rb +111 -0
  533. data/shoes/ruby/lib/rubygems/commands/outdated_command.rb +33 -0
  534. data/shoes/ruby/lib/rubygems/commands/pristine_command.rb +93 -0
  535. data/shoes/ruby/lib/rubygems/commands/query_command.rb +233 -0
  536. data/shoes/ruby/lib/rubygems/commands/rdoc_command.rb +82 -0
  537. data/shoes/ruby/lib/rubygems/commands/search_command.rb +37 -0
  538. data/shoes/ruby/lib/rubygems/commands/server_command.rb +48 -0
  539. data/shoes/ruby/lib/rubygems/commands/sources_command.rb +152 -0
  540. data/shoes/ruby/lib/rubygems/commands/specification_command.rb +77 -0
  541. data/shoes/ruby/lib/rubygems/commands/stale_command.rb +27 -0
  542. data/shoes/ruby/lib/rubygems/commands/uninstall_command.rb +73 -0
  543. data/shoes/ruby/lib/rubygems/commands/unpack_command.rb +95 -0
  544. data/shoes/ruby/lib/rubygems/commands/update_command.rb +181 -0
  545. data/shoes/ruby/lib/rubygems/commands/which_command.rb +87 -0
  546. data/shoes/ruby/lib/rubygems/config_file.rb +266 -0
  547. data/shoes/ruby/lib/rubygems/custom_require.rb +46 -0
  548. data/shoes/ruby/lib/rubygems/defaults.rb +89 -0
  549. data/shoes/ruby/lib/rubygems/dependency.rb +119 -0
  550. data/shoes/ruby/lib/rubygems/dependency_installer.rb +258 -0
  551. data/shoes/ruby/lib/rubygems/dependency_list.rb +165 -0
  552. data/shoes/ruby/lib/rubygems/digest/digest_adapter.rb +40 -0
  553. data/shoes/ruby/lib/rubygems/digest/md5.rb +23 -0
  554. data/shoes/ruby/lib/rubygems/digest/sha1.rb +17 -0
  555. data/shoes/ruby/lib/rubygems/digest/sha2.rb +17 -0
  556. data/shoes/ruby/lib/rubygems/doc_manager.rb +214 -0
  557. data/shoes/ruby/lib/rubygems/exceptions.rb +84 -0
  558. data/shoes/ruby/lib/rubygems/ext/builder.rb +56 -0
  559. data/shoes/ruby/lib/rubygems/ext/configure_builder.rb +24 -0
  560. data/shoes/ruby/lib/rubygems/ext/ext_conf_builder.rb +23 -0
  561. data/shoes/ruby/lib/rubygems/ext/rake_builder.rb +27 -0
  562. data/shoes/ruby/lib/rubygems/ext.rb +18 -0
  563. data/shoes/ruby/lib/rubygems/format.rb +87 -0
  564. data/shoes/ruby/lib/rubygems/gem_openssl.rb +83 -0
  565. data/shoes/ruby/lib/rubygems/gem_path_searcher.rb +100 -0
  566. data/shoes/ruby/lib/rubygems/gem_runner.rb +58 -0
  567. data/shoes/ruby/lib/rubygems/indexer/abstract_index_builder.rb +88 -0
  568. data/shoes/ruby/lib/rubygems/indexer/latest_index_builder.rb +35 -0
  569. data/shoes/ruby/lib/rubygems/indexer/marshal_index_builder.rb +17 -0
  570. data/shoes/ruby/lib/rubygems/indexer/master_index_builder.rb +54 -0
  571. data/shoes/ruby/lib/rubygems/indexer/quick_index_builder.rb +50 -0
  572. data/shoes/ruby/lib/rubygems/indexer.rb +370 -0
  573. data/shoes/ruby/lib/rubygems/install_update_options.rb +113 -0
  574. data/shoes/ruby/lib/rubygems/installer.rb +578 -0
  575. data/shoes/ruby/lib/rubygems/local_remote_options.rb +134 -0
  576. data/shoes/ruby/lib/rubygems/old_format.rb +148 -0
  577. data/shoes/ruby/lib/rubygems/package/f_sync_dir.rb +24 -0
  578. data/shoes/ruby/lib/rubygems/package/tar_header.rb +245 -0
  579. data/shoes/ruby/lib/rubygems/package/tar_input.rb +219 -0
  580. data/shoes/ruby/lib/rubygems/package/tar_output.rb +143 -0
  581. data/shoes/ruby/lib/rubygems/package/tar_reader/entry.rb +99 -0
  582. data/shoes/ruby/lib/rubygems/package/tar_reader.rb +86 -0
  583. data/shoes/ruby/lib/rubygems/package/tar_writer.rb +180 -0
  584. data/shoes/ruby/lib/rubygems/package.rb +95 -0
  585. data/shoes/ruby/lib/rubygems/platform.rb +178 -0
  586. data/shoes/ruby/lib/rubygems/remote_fetcher.rb +344 -0
  587. data/shoes/ruby/lib/rubygems/require_paths_builder.rb +15 -0
  588. data/shoes/ruby/lib/rubygems/requirement.rb +163 -0
  589. data/shoes/ruby/lib/rubygems/rubygems_version.rb +6 -0
  590. data/shoes/ruby/lib/rubygems/security.rb +786 -0
  591. data/shoes/ruby/lib/rubygems/server.rb +629 -0
  592. data/shoes/ruby/lib/rubygems/source_index.rb +559 -0
  593. data/shoes/ruby/lib/rubygems/source_info_cache.rb +393 -0
  594. data/shoes/ruby/lib/rubygems/source_info_cache_entry.rb +56 -0
  595. data/shoes/ruby/lib/rubygems/spec_fetcher.rb +249 -0
  596. data/shoes/ruby/lib/rubygems/specification.rb +1262 -0
  597. data/shoes/ruby/lib/rubygems/test_utilities.rb +131 -0
  598. data/shoes/ruby/lib/rubygems/timer.rb +25 -0
  599. data/shoes/ruby/lib/rubygems/uninstaller.rb +242 -0
  600. data/shoes/ruby/lib/rubygems/user_interaction.rb +360 -0
  601. data/shoes/ruby/lib/rubygems/validator.rb +208 -0
  602. data/shoes/ruby/lib/rubygems/version.rb +167 -0
  603. data/shoes/ruby/lib/rubygems/version_option.rb +48 -0
  604. data/shoes/ruby/lib/rubygems.rb +888 -0
  605. data/shoes/ruby/lib/scanf.rb +703 -0
  606. data/shoes/ruby/lib/securerandom.rb +182 -0
  607. data/shoes/ruby/lib/set.rb +1274 -0
  608. data/shoes/ruby/lib/shell/builtin-command.rb +160 -0
  609. data/shoes/ruby/lib/shell/command-processor.rb +593 -0
  610. data/shoes/ruby/lib/shell/error.rb +25 -0
  611. data/shoes/ruby/lib/shell/filter.rb +109 -0
  612. data/shoes/ruby/lib/shell/process-controller.rb +319 -0
  613. data/shoes/ruby/lib/shell/system-command.rb +159 -0
  614. data/shoes/ruby/lib/shell/version.rb +15 -0
  615. data/shoes/ruby/lib/shell.rb +300 -0
  616. data/shoes/ruby/lib/shellwords.rb +156 -0
  617. data/shoes/ruby/lib/singleton.rb +313 -0
  618. data/shoes/ruby/lib/sync.rb +307 -0
  619. data/shoes/ruby/lib/tempfile.rb +218 -0
  620. data/shoes/ruby/lib/test/unit/assertions.rb +122 -0
  621. data/shoes/ruby/lib/test/unit/testcase.rb +12 -0
  622. data/shoes/ruby/lib/test/unit.rb +66 -0
  623. data/shoes/ruby/lib/thread.rb +367 -0
  624. data/shoes/ruby/lib/thwait.rb +168 -0
  625. data/shoes/ruby/lib/time.rb +869 -0
  626. data/shoes/ruby/lib/timeout.rb +108 -0
  627. data/shoes/ruby/lib/tmpdir.rb +138 -0
  628. data/shoes/ruby/lib/tracer.rb +166 -0
  629. data/shoes/ruby/lib/tsort.rb +290 -0
  630. data/shoes/ruby/lib/ubygems.rb +10 -0
  631. data/shoes/ruby/lib/un.rb +304 -0
  632. data/shoes/ruby/lib/uri/common.rb +727 -0
  633. data/shoes/ruby/lib/uri/ftp.rb +198 -0
  634. data/shoes/ruby/lib/uri/generic.rb +1128 -0
  635. data/shoes/ruby/lib/uri/http.rb +100 -0
  636. data/shoes/ruby/lib/uri/https.rb +20 -0
  637. data/shoes/ruby/lib/uri/ldap.rb +190 -0
  638. data/shoes/ruby/lib/uri/ldaps.rb +12 -0
  639. data/shoes/ruby/lib/uri/mailto.rb +266 -0
  640. data/shoes/ruby/lib/uri.rb +29 -0
  641. data/shoes/ruby/lib/weakref.rb +80 -0
  642. data/shoes/ruby/lib/webrick/accesslog.rb +75 -0
  643. data/shoes/ruby/lib/webrick/cgi.rb +260 -0
  644. data/shoes/ruby/lib/webrick/compat.rb +15 -0
  645. data/shoes/ruby/lib/webrick/config.rb +100 -0
  646. data/shoes/ruby/lib/webrick/cookie.rb +110 -0
  647. data/shoes/ruby/lib/webrick/htmlutils.rb +25 -0
  648. data/shoes/ruby/lib/webrick/httpauth/authenticator.rb +79 -0
  649. data/shoes/ruby/lib/webrick/httpauth/basicauth.rb +65 -0
  650. data/shoes/ruby/lib/webrick/httpauth/digestauth.rb +344 -0
  651. data/shoes/ruby/lib/webrick/httpauth/htdigest.rb +91 -0
  652. data/shoes/ruby/lib/webrick/httpauth/htgroup.rb +61 -0
  653. data/shoes/ruby/lib/webrick/httpauth/htpasswd.rb +83 -0
  654. data/shoes/ruby/lib/webrick/httpauth/userdb.rb +29 -0
  655. data/shoes/ruby/lib/webrick/httpauth.rb +45 -0
  656. data/shoes/ruby/lib/webrick/httpproxy.rb +288 -0
  657. data/shoes/ruby/lib/webrick/httprequest.rb +402 -0
  658. data/shoes/ruby/lib/webrick/httpresponse.rb +326 -0
  659. data/shoes/ruby/lib/webrick/https.rb +63 -0
  660. data/shoes/ruby/lib/webrick/httpserver.rb +217 -0
  661. data/shoes/ruby/lib/webrick/httpservlet/abstract.rb +70 -0
  662. data/shoes/ruby/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  663. data/shoes/ruby/lib/webrick/httpservlet/cgihandler.rb +110 -0
  664. data/shoes/ruby/lib/webrick/httpservlet/erbhandler.rb +54 -0
  665. data/shoes/ruby/lib/webrick/httpservlet/filehandler.rb +435 -0
  666. data/shoes/ruby/lib/webrick/httpservlet/prochandler.rb +33 -0
  667. data/shoes/ruby/lib/webrick/httpservlet.rb +22 -0
  668. data/shoes/ruby/lib/webrick/httpstatus.rb +132 -0
  669. data/shoes/ruby/lib/webrick/httputils.rb +392 -0
  670. data/shoes/ruby/lib/webrick/httpversion.rb +49 -0
  671. data/shoes/ruby/lib/webrick/log.rb +88 -0
  672. data/shoes/ruby/lib/webrick/server.rb +210 -0
  673. data/shoes/ruby/lib/webrick/ssl.rb +126 -0
  674. data/shoes/ruby/lib/webrick/utils.rb +175 -0
  675. data/shoes/ruby/lib/webrick/version.rb +13 -0
  676. data/shoes/ruby/lib/webrick.rb +29 -0
  677. data/shoes/ruby/lib/win32/registry.rb +832 -0
  678. data/shoes/ruby/lib/win32/resolv.rb +370 -0
  679. data/shoes/ruby/lib/win32/sspi.rb +330 -0
  680. data/shoes/ruby/lib/win32ole/property.rb +16 -0
  681. data/shoes/ruby/lib/xmlrpc/base64.rb +81 -0
  682. data/shoes/ruby/lib/xmlrpc/client.rb +625 -0
  683. data/shoes/ruby/lib/xmlrpc/config.rb +40 -0
  684. data/shoes/ruby/lib/xmlrpc/create.rb +290 -0
  685. data/shoes/ruby/lib/xmlrpc/datetime.rb +142 -0
  686. data/shoes/ruby/lib/xmlrpc/httpserver.rb +178 -0
  687. data/shoes/ruby/lib/xmlrpc/marshal.rb +76 -0
  688. data/shoes/ruby/lib/xmlrpc/parser.rb +813 -0
  689. data/shoes/ruby/lib/xmlrpc/server.rb +778 -0
  690. data/shoes/ruby/lib/xmlrpc/utils.rb +165 -0
  691. data/shoes/ruby/lib/yaml/baseemitter.rb +242 -0
  692. data/shoes/ruby/lib/yaml/basenode.rb +216 -0
  693. data/shoes/ruby/lib/yaml/constants.rb +45 -0
  694. data/shoes/ruby/lib/yaml/dbm.rb +111 -0
  695. data/shoes/ruby/lib/yaml/encoding.rb +33 -0
  696. data/shoes/ruby/lib/yaml/error.rb +34 -0
  697. data/shoes/ruby/lib/yaml/loader.rb +14 -0
  698. data/shoes/ruby/lib/yaml/rubytypes.rb +446 -0
  699. data/shoes/ruby/lib/yaml/store.rb +43 -0
  700. data/shoes/ruby/lib/yaml/stream.rb +40 -0
  701. data/shoes/ruby/lib/yaml/stringio.rb +83 -0
  702. data/shoes/ruby/lib/yaml/syck.rb +19 -0
  703. data/shoes/ruby/lib/yaml/tag.rb +91 -0
  704. data/shoes/ruby/lib/yaml/types.rb +192 -0
  705. data/shoes/ruby/lib/yaml/yamlnode.rb +54 -0
  706. data/shoes/ruby/lib/yaml/ypath.rb +52 -0
  707. data/shoes/ruby/lib/yaml.rb +440 -0
  708. data/shoes/samples/class-book.rb +43 -0
  709. data/shoes/samples/class-book.yaml +387 -0
  710. data/shoes/samples/expert-definr.rb +23 -0
  711. data/shoes/samples/expert-funnies.rb +51 -0
  712. data/shoes/samples/expert-irb.rb +112 -0
  713. data/shoes/samples/expert-minesweeper.rb +267 -0
  714. data/shoes/samples/expert-othello.rb +319 -0
  715. data/shoes/samples/expert-pong.rb +62 -0
  716. data/shoes/samples/expert-tankspank.rb +385 -0
  717. data/shoes/samples/good-arc.rb +37 -0
  718. data/shoes/samples/good-clock.rb +51 -0
  719. data/shoes/samples/good-follow.rb +26 -0
  720. data/shoes/samples/good-reminder.rb +174 -0
  721. data/shoes/samples/good-vjot.rb +56 -0
  722. data/shoes/samples/simple-accordion.rb +75 -0
  723. data/shoes/samples/simple-anim-shapes.rb +17 -0
  724. data/shoes/samples/simple-anim-text.rb +13 -0
  725. data/shoes/samples/simple-arc.rb +23 -0
  726. data/shoes/samples/simple-bounce.rb +24 -0
  727. data/shoes/samples/simple-calc.rb +70 -0
  728. data/shoes/samples/simple-control-sizes.rb +24 -0
  729. data/shoes/samples/simple-curve.rb +26 -0
  730. data/shoes/samples/simple-dialogs.rb +29 -0
  731. data/shoes/samples/simple-downloader.rb +27 -0
  732. data/shoes/samples/simple-draw.rb +13 -0
  733. data/shoes/samples/simple-editor.rb +28 -0
  734. data/shoes/samples/simple-form.rb +28 -0
  735. data/shoes/samples/simple-form.shy +0 -0
  736. data/shoes/samples/simple-mask.rb +21 -0
  737. data/shoes/samples/simple-menu.rb +31 -0
  738. data/shoes/samples/simple-menu1.rb +35 -0
  739. data/shoes/samples/simple-rubygems.rb +29 -0
  740. data/shoes/samples/simple-slide.rb +45 -0
  741. data/shoes/samples/simple-sphere.rb +28 -0
  742. data/shoes/samples/simple-timer.rb +13 -0
  743. data/shoes/samples/simple-video.rb +13 -0
  744. data/shoes/shoes +21 -0
  745. data/shoes/shoes.exe +0 -0
  746. data/shoes/shoes.exe.manifest +17 -0
  747. data/shoes/sqlite3.dll +0 -0
  748. data/shoes/static/Shoes.icns +0 -0
  749. data/shoes/static/Thumbs.db +0 -0
  750. data/shoes/static/app-icon.png +0 -0
  751. data/shoes/static/avatar.png +0 -0
  752. data/shoes/static/code_highlighter.js +188 -0
  753. data/shoes/static/code_highlighter_ruby.js +26 -0
  754. data/shoes/static/icon-debug.png +0 -0
  755. data/shoes/static/icon-error.png +0 -0
  756. data/shoes/static/icon-info.png +0 -0
  757. data/shoes/static/icon-warn.png +0 -0
  758. data/shoes/static/listbox_button1.png +0 -0
  759. data/shoes/static/listbox_button2.png +0 -0
  760. data/shoes/static/man-app.png +0 -0
  761. data/shoes/static/man-builds.png +0 -0
  762. data/shoes/static/man-editor-notepad.png +0 -0
  763. data/shoes/static/man-editor-osx.png +0 -0
  764. data/shoes/static/man-ele-background.png +0 -0
  765. data/shoes/static/man-ele-border.png +0 -0
  766. data/shoes/static/man-ele-button.png +0 -0
  767. data/shoes/static/man-ele-check.png +0 -0
  768. data/shoes/static/man-ele-editbox.png +0 -0
  769. data/shoes/static/man-ele-editline.png +0 -0
  770. data/shoes/static/man-ele-image.png +0 -0
  771. data/shoes/static/man-ele-listbox.png +0 -0
  772. data/shoes/static/man-ele-progress.png +0 -0
  773. data/shoes/static/man-ele-radio.png +0 -0
  774. data/shoes/static/man-ele-shape.png +0 -0
  775. data/shoes/static/man-ele-textblock.png +0 -0
  776. data/shoes/static/man-ele-video.png +0 -0
  777. data/shoes/static/man-intro-dmg.png +0 -0
  778. data/shoes/static/man-intro-exe.png +0 -0
  779. data/shoes/static/man-look-tiger.png +0 -0
  780. data/shoes/static/man-look-ubuntu.png +0 -0
  781. data/shoes/static/man-look-vista.png +0 -0
  782. data/shoes/static/man-run-osx.png +0 -0
  783. data/shoes/static/man-run-vista.png +0 -0
  784. data/shoes/static/man-run-xp.png +0 -0
  785. data/shoes/static/man-shot1.png +0 -0
  786. data/shoes/static/manual-en.txt +2783 -0
  787. data/shoes/static/manual-ja.txt +2780 -0
  788. data/shoes/static/manual.css +167 -0
  789. data/shoes/static/menu-corner1.png +0 -0
  790. data/shoes/static/menu-corner2.png +0 -0
  791. data/shoes/static/menu-gray.png +0 -0
  792. data/shoes/static/menu-left.png +0 -0
  793. data/shoes/static/menu-right.png +0 -0
  794. data/shoes/static/menu-top.png +0 -0
  795. data/shoes/static/shoes-dmg.jpg +0 -0
  796. data/shoes/static/shoes-icon-blue.png +0 -0
  797. data/shoes/static/shoes-icon.png +0 -0
  798. data/shoes/static/shoes-manual-apps.gif +0 -0
  799. data/shoes/static/stripe.png +0 -0
  800. data/shoes/static/stubs/blank.exe +0 -0
  801. data/shoes/static/stubs/blank.hfz +0 -0
  802. data/shoes/static/stubs/blank.run +375 -0
  803. data/shoes/static/stubs/cocoa-install +0 -0
  804. data/shoes/static/stubs/sh-install +48 -0
  805. data/shoes/static/tutor-back.png +0 -0
  806. data/shoes/zlib.dll +0 -0
  807. data/shoes/zlib1.dll +0 -0
  808. metadata +887 -0
@@ -0,0 +1,2262 @@
1
+ require 'socket'
2
+ require 'fcntl'
3
+ require 'timeout'
4
+ require 'thread'
5
+
6
+ begin
7
+ require 'securerandom'
8
+ rescue LoadError
9
+ end
10
+
11
+ # Resolv is a thread-aware DNS resolver library written in Ruby. Resolv can
12
+ # handle multiple DNS requests concurrently without blocking. The ruby
13
+ # interpreter.
14
+ #
15
+ # See also resolv-replace.rb to replace the libc resolver with # Resolv.
16
+ #
17
+ # Resolv can look up various DNS resources using the DNS module directly.
18
+ #
19
+ # Examples:
20
+ #
21
+ # p Resolv.getaddress "www.ruby-lang.org"
22
+ # p Resolv.getname "210.251.121.214"
23
+ #
24
+ # Resolv::DNS.open do |dns|
25
+ # ress = dns.getresources "www.ruby-lang.org", Resolv::DNS::Resource::IN::A
26
+ # p ress.map { |r| r.address }
27
+ # ress = dns.getresources "ruby-lang.org", Resolv::DNS::Resource::IN::MX
28
+ # p ress.map { |r| [r.exchange.to_s, r.preference] }
29
+ # end
30
+ #
31
+ #
32
+ # == Bugs
33
+ #
34
+ # * NIS is not supported.
35
+ # * /etc/nsswitch.conf is not supported.
36
+
37
+ class Resolv
38
+
39
+ ##
40
+ # Looks up the first IP address for +name+.
41
+
42
+ def self.getaddress(name)
43
+ DefaultResolver.getaddress(name)
44
+ end
45
+
46
+ ##
47
+ # Looks up all IP address for +name+.
48
+
49
+ def self.getaddresses(name)
50
+ DefaultResolver.getaddresses(name)
51
+ end
52
+
53
+ ##
54
+ # Iterates over all IP addresses for +name+.
55
+
56
+ def self.each_address(name, &block)
57
+ DefaultResolver.each_address(name, &block)
58
+ end
59
+
60
+ ##
61
+ # Looks up the hostname of +address+.
62
+
63
+ def self.getname(address)
64
+ DefaultResolver.getname(address)
65
+ end
66
+
67
+ ##
68
+ # Looks up all hostnames for +address+.
69
+
70
+ def self.getnames(address)
71
+ DefaultResolver.getnames(address)
72
+ end
73
+
74
+ ##
75
+ # Iterates over all hostnames for +address+.
76
+
77
+ def self.each_name(address, &proc)
78
+ DefaultResolver.each_name(address, &proc)
79
+ end
80
+
81
+ ##
82
+ # Creates a new Resolv using +resolvers+.
83
+
84
+ def initialize(resolvers=[Hosts.new, DNS.new])
85
+ @resolvers = resolvers
86
+ end
87
+
88
+ ##
89
+ # Looks up the first IP address for +name+.
90
+
91
+ def getaddress(name)
92
+ each_address(name) {|address| return address}
93
+ raise ResolvError.new("no address for #{name}")
94
+ end
95
+
96
+ ##
97
+ # Looks up all IP address for +name+.
98
+
99
+ def getaddresses(name)
100
+ ret = []
101
+ each_address(name) {|address| ret << address}
102
+ return ret
103
+ end
104
+
105
+ ##
106
+ # Iterates over all IP addresses for +name+.
107
+
108
+ def each_address(name)
109
+ if AddressRegex =~ name
110
+ yield name
111
+ return
112
+ end
113
+ yielded = false
114
+ @resolvers.each {|r|
115
+ r.each_address(name) {|address|
116
+ yield address.to_s
117
+ yielded = true
118
+ }
119
+ return if yielded
120
+ }
121
+ end
122
+
123
+ ##
124
+ # Looks up the hostname of +address+.
125
+
126
+ def getname(address)
127
+ each_name(address) {|name| return name}
128
+ raise ResolvError.new("no name for #{address}")
129
+ end
130
+
131
+ ##
132
+ # Looks up all hostnames for +address+.
133
+
134
+ def getnames(address)
135
+ ret = []
136
+ each_name(address) {|name| ret << name}
137
+ return ret
138
+ end
139
+
140
+ ##
141
+ # Iterates over all hostnames for +address+.
142
+
143
+ def each_name(address)
144
+ yielded = false
145
+ @resolvers.each {|r|
146
+ r.each_name(address) {|name|
147
+ yield name.to_s
148
+ yielded = true
149
+ }
150
+ return if yielded
151
+ }
152
+ end
153
+
154
+ ##
155
+ # Indicates a failure to resolve a name or address.
156
+
157
+ class ResolvError < StandardError; end
158
+
159
+ ##
160
+ # Indicates a timeout resolving a name or address.
161
+
162
+ class ResolvTimeout < TimeoutError; end
163
+
164
+ ##
165
+ # DNS::Hosts is a hostname resolver that uses the system hosts file.
166
+
167
+ class Hosts
168
+ if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
169
+ require 'win32/resolv'
170
+ DefaultFileName = Win32::Resolv.get_hosts_path
171
+ else
172
+ DefaultFileName = '/etc/hosts'
173
+ end
174
+
175
+ ##
176
+ # Creates a new DNS::Hosts, using +filename+ for its data source.
177
+
178
+ def initialize(filename = DefaultFileName)
179
+ @filename = filename
180
+ @mutex = Mutex.new
181
+ @initialized = nil
182
+ end
183
+
184
+ def lazy_initialize # :nodoc:
185
+ @mutex.synchronize {
186
+ unless @initialized
187
+ @name2addr = {}
188
+ @addr2name = {}
189
+ open(@filename) {|f|
190
+ f.each {|line|
191
+ line.sub!(/#.*/, '')
192
+ addr, hostname, *aliases = line.split(/\s+/)
193
+ next unless addr
194
+ addr.untaint
195
+ hostname.untaint
196
+ @addr2name[addr] = [] unless @addr2name.include? addr
197
+ @addr2name[addr] << hostname
198
+ @addr2name[addr] += aliases
199
+ @name2addr[hostname] = [] unless @name2addr.include? hostname
200
+ @name2addr[hostname] << addr
201
+ aliases.each {|n|
202
+ n.untaint
203
+ @name2addr[n] = [] unless @name2addr.include? n
204
+ @name2addr[n] << addr
205
+ }
206
+ }
207
+ }
208
+ @name2addr.each {|name, arr| arr.reverse!}
209
+ @initialized = true
210
+ end
211
+ }
212
+ self
213
+ end
214
+
215
+ ##
216
+ # Gets the IP address of +name+ from the hosts file.
217
+
218
+ def getaddress(name)
219
+ each_address(name) {|address| return address}
220
+ raise ResolvError.new("#{@filename} has no name: #{name}")
221
+ end
222
+
223
+ ##
224
+ # Gets all IP addresses for +name+ from the hosts file.
225
+
226
+ def getaddresses(name)
227
+ ret = []
228
+ each_address(name) {|address| ret << address}
229
+ return ret
230
+ end
231
+
232
+ ##
233
+ # Iterates over all IP addresses for +name+ retrieved from the hosts file.
234
+
235
+ def each_address(name, &proc)
236
+ lazy_initialize
237
+ if @name2addr.include?(name)
238
+ @name2addr[name].each(&proc)
239
+ end
240
+ end
241
+
242
+ ##
243
+ # Gets the hostname of +address+ from the hosts file.
244
+
245
+ def getname(address)
246
+ each_name(address) {|name| return name}
247
+ raise ResolvError.new("#{@filename} has no address: #{address}")
248
+ end
249
+
250
+ ##
251
+ # Gets all hostnames for +address+ from the hosts file.
252
+
253
+ def getnames(address)
254
+ ret = []
255
+ each_name(address) {|name| ret << name}
256
+ return ret
257
+ end
258
+
259
+ ##
260
+ # Iterates over all hostnames for +address+ retrieved from the hosts file.
261
+
262
+ def each_name(address, &proc)
263
+ lazy_initialize
264
+ if @addr2name.include?(address)
265
+ @addr2name[address].each(&proc)
266
+ end
267
+ end
268
+ end
269
+
270
+ ##
271
+ # Resolv::DNS is a DNS stub resolver.
272
+ #
273
+ # Information taken from the following places:
274
+ #
275
+ # * STD0013
276
+ # * RFC 1035
277
+ # * ftp://ftp.isi.edu/in-notes/iana/assignments/dns-parameters
278
+ # * etc.
279
+
280
+ class DNS
281
+
282
+ ##
283
+ # Default DNS Port
284
+
285
+ Port = 53
286
+
287
+ ##
288
+ # Default DNS UDP packet size
289
+
290
+ UDPSize = 512
291
+
292
+ ##
293
+ # Creates a new DNS resolver. See Resolv::DNS.new for argument details.
294
+ #
295
+ # Yields the created DNS resolver to the block, if given, otherwise
296
+ # returns it.
297
+
298
+ def self.open(*args)
299
+ dns = new(*args)
300
+ return dns unless block_given?
301
+ begin
302
+ yield dns
303
+ ensure
304
+ dns.close
305
+ end
306
+ end
307
+
308
+ ##
309
+ # Creates a new DNS resolver.
310
+ #
311
+ # +config_info+ can be:
312
+ #
313
+ # nil:: Uses /etc/resolv.conf.
314
+ # String:: Path to a file using /etc/resolv.conf's format.
315
+ # Hash:: Must contain :nameserver, :search and :ndots keys.
316
+ #
317
+ # Example:
318
+ #
319
+ # Resolv::DNS.new(:nameserver => ['210.251.121.21'],
320
+ # :search => ['ruby-lang.org'],
321
+ # :ndots => 1)
322
+
323
+ def initialize(config_info=nil)
324
+ @mutex = Mutex.new
325
+ @config = Config.new(config_info)
326
+ @initialized = nil
327
+ end
328
+
329
+ def lazy_initialize # :nodoc:
330
+ @mutex.synchronize {
331
+ unless @initialized
332
+ @config.lazy_initialize
333
+ @initialized = true
334
+ end
335
+ }
336
+ self
337
+ end
338
+
339
+ ##
340
+ # Closes the DNS resolver.
341
+
342
+ def close
343
+ @mutex.synchronize {
344
+ if @initialized
345
+ @initialized = false
346
+ end
347
+ }
348
+ end
349
+
350
+ ##
351
+ # Gets the IP address of +name+ from the DNS resolver.
352
+ #
353
+ # +name+ can be a Resolv::DNS::Name or a String. Retrieved address will
354
+ # be a Resolv::IPv4 or Resolv::IPv6
355
+
356
+ def getaddress(name)
357
+ each_address(name) {|address| return address}
358
+ raise ResolvError.new("DNS result has no information for #{name}")
359
+ end
360
+
361
+ ##
362
+ # Gets all IP addresses for +name+ from the DNS resolver.
363
+ #
364
+ # +name+ can be a Resolv::DNS::Name or a String. Retrieved addresses will
365
+ # be a Resolv::IPv4 or Resolv::IPv6
366
+
367
+ def getaddresses(name)
368
+ ret = []
369
+ each_address(name) {|address| ret << address}
370
+ return ret
371
+ end
372
+
373
+ ##
374
+ # Iterates over all IP addresses for +name+ retrieved from the DNS
375
+ # resolver.
376
+ #
377
+ # +name+ can be a Resolv::DNS::Name or a String. Retrieved addresses will
378
+ # be a Resolv::IPv4 or Resolv::IPv6
379
+
380
+ def each_address(name)
381
+ each_resource(name, Resource::IN::A) {|resource| yield resource.address}
382
+ each_resource(name, Resource::IN::AAAA) {|resource| yield resource.address}
383
+ end
384
+
385
+ ##
386
+ # Gets the hostname for +address+ from the DNS resolver.
387
+ #
388
+ # +address+ must be a Resolv::IPv4, Resolv::IPv6 or a String. Retrieved
389
+ # name will be a Resolv::DNS::Name.
390
+
391
+ def getname(address)
392
+ each_name(address) {|name| return name}
393
+ raise ResolvError.new("DNS result has no information for #{address}")
394
+ end
395
+
396
+ ##
397
+ # Gets all hostnames for +address+ from the DNS resolver.
398
+ #
399
+ # +address+ must be a Resolv::IPv4, Resolv::IPv6 or a String. Retrieved
400
+ # names will be Resolv::DNS::Name instances.
401
+
402
+ def getnames(address)
403
+ ret = []
404
+ each_name(address) {|name| ret << name}
405
+ return ret
406
+ end
407
+
408
+ ##
409
+ # Iterates over all hostnames for +address+ retrieved from the DNS
410
+ # resolver.
411
+ #
412
+ # +address+ must be a Resolv::IPv4, Resolv::IPv6 or a String. Retrieved
413
+ # names will be Resolv::DNS::Name instances.
414
+
415
+ def each_name(address)
416
+ case address
417
+ when Name
418
+ ptr = address
419
+ when IPv4::Regex
420
+ ptr = IPv4.create(address).to_name
421
+ when IPv6::Regex
422
+ ptr = IPv6.create(address).to_name
423
+ else
424
+ raise ResolvError.new("cannot interpret as address: #{address}")
425
+ end
426
+ each_resource(ptr, Resource::IN::PTR) {|resource| yield resource.name}
427
+ end
428
+
429
+ ##
430
+ # Look up the +typeclass+ DNS resource of +name+.
431
+ #
432
+ # +name+ must be a Resolv::DNS::Name or a String.
433
+ #
434
+ # +typeclass+ should be one of the following:
435
+ #
436
+ # * Resolv::DNS::Resource::IN::A
437
+ # * Resolv::DNS::Resource::IN::AAAA
438
+ # * Resolv::DNS::Resource::IN::ANY
439
+ # * Resolv::DNS::Resource::IN::CNAME
440
+ # * Resolv::DNS::Resource::IN::HINFO
441
+ # * Resolv::DNS::Resource::IN::MINFO
442
+ # * Resolv::DNS::Resource::IN::MX
443
+ # * Resolv::DNS::Resource::IN::NS
444
+ # * Resolv::DNS::Resource::IN::PTR
445
+ # * Resolv::DNS::Resource::IN::SOA
446
+ # * Resolv::DNS::Resource::IN::TXT
447
+ # * Resolv::DNS::Resource::IN::WKS
448
+ #
449
+ # Returned resource is represented as a Resolv::DNS::Resource instance,
450
+ # i.e. Resolv::DNS::Resource::IN::A.
451
+
452
+ def getresource(name, typeclass)
453
+ each_resource(name, typeclass) {|resource| return resource}
454
+ raise ResolvError.new("DNS result has no information for #{name}")
455
+ end
456
+
457
+ ##
458
+ # Looks up all +typeclass+ DNS resources for +name+. See #getresource for
459
+ # argument details.
460
+
461
+ def getresources(name, typeclass)
462
+ ret = []
463
+ each_resource(name, typeclass) {|resource| ret << resource}
464
+ return ret
465
+ end
466
+
467
+ ##
468
+ # Iterates over all +typeclass+ DNS resources for +name+. See
469
+ # #getresource for argument details.
470
+
471
+ def each_resource(name, typeclass, &proc)
472
+ lazy_initialize
473
+ requester = make_requester
474
+ senders = {}
475
+ begin
476
+ @config.resolv(name) {|candidate, tout, nameserver|
477
+ msg = Message.new
478
+ msg.rd = 1
479
+ msg.add_question(candidate, typeclass)
480
+ unless sender = senders[[candidate, nameserver]]
481
+ sender = senders[[candidate, nameserver]] =
482
+ requester.sender(msg, candidate, nameserver)
483
+ end
484
+ reply, reply_name = requester.request(sender, tout)
485
+ case reply.rcode
486
+ when RCode::NoError
487
+ extract_resources(reply, reply_name, typeclass, &proc)
488
+ return
489
+ when RCode::NXDomain
490
+ raise Config::NXDomain.new(reply_name.to_s)
491
+ else
492
+ raise Config::OtherResolvError.new(reply_name.to_s)
493
+ end
494
+ }
495
+ ensure
496
+ requester.close
497
+ end
498
+ end
499
+
500
+ def make_requester # :nodoc:
501
+ if nameserver = @config.single?
502
+ Requester::ConnectedUDP.new(nameserver)
503
+ else
504
+ Requester::UnconnectedUDP.new
505
+ end
506
+ end
507
+
508
+ def extract_resources(msg, name, typeclass) # :nodoc:
509
+ if typeclass < Resource::ANY
510
+ n0 = Name.create(name)
511
+ msg.each_answer {|n, ttl, data|
512
+ yield data if n0 == n
513
+ }
514
+ end
515
+ yielded = false
516
+ n0 = Name.create(name)
517
+ msg.each_answer {|n, ttl, data|
518
+ if n0 == n
519
+ case data
520
+ when typeclass
521
+ yield data
522
+ yielded = true
523
+ when Resource::CNAME
524
+ n0 = data.name
525
+ end
526
+ end
527
+ }
528
+ return if yielded
529
+ msg.each_answer {|n, ttl, data|
530
+ if n0 == n
531
+ case data
532
+ when typeclass
533
+ yield data
534
+ end
535
+ end
536
+ }
537
+ end
538
+
539
+ if defined? SecureRandom
540
+ def self.random(arg) # :nodoc:
541
+ begin
542
+ SecureRandom.random_number(arg)
543
+ rescue NotImplementedError
544
+ rand(arg)
545
+ end
546
+ end
547
+ else
548
+ def self.random(arg) # :nodoc:
549
+ rand(arg)
550
+ end
551
+ end
552
+
553
+
554
+ def self.rangerand(range) # :nodoc:
555
+ base = range.begin
556
+ len = range.end - range.begin
557
+ if !range.exclude_end?
558
+ len += 1
559
+ end
560
+ base + random(len)
561
+ end
562
+
563
+ RequestID = {}
564
+ RequestIDMutex = Mutex.new
565
+
566
+ def self.allocate_request_id(host, port) # :nodoc:
567
+ id = nil
568
+ RequestIDMutex.synchronize {
569
+ h = (RequestID[[host, port]] ||= {})
570
+ begin
571
+ id = rangerand(0x0000..0xffff)
572
+ end while h[id]
573
+ h[id] = true
574
+ }
575
+ id
576
+ end
577
+
578
+ def self.free_request_id(host, port, id) # :nodoc:
579
+ RequestIDMutex.synchronize {
580
+ key = [host, port]
581
+ if h = RequestID[key]
582
+ h.delete id
583
+ if h.empty?
584
+ RequestID.delete key
585
+ end
586
+ end
587
+ }
588
+ end
589
+
590
+ def self.bind_random_port(udpsock) # :nodoc:
591
+ begin
592
+ port = rangerand(1024..65535)
593
+ udpsock.bind("", port)
594
+ rescue Errno::EADDRINUSE
595
+ retry
596
+ end
597
+ end
598
+
599
+ class Requester # :nodoc:
600
+ def initialize
601
+ @senders = {}
602
+ @sock = nil
603
+ end
604
+
605
+ def request(sender, tout)
606
+ timelimit = Time.now + tout
607
+ sender.send
608
+ while (now = Time.now) < timelimit
609
+ timeout = timelimit - now
610
+ if !IO.select([@sock], nil, nil, timeout)
611
+ raise ResolvTimeout
612
+ end
613
+ reply, from = recv_reply
614
+ begin
615
+ msg = Message.decode(reply)
616
+ rescue DecodeError
617
+ next # broken DNS message ignored
618
+ end
619
+ if s = @senders[[from,msg.id]]
620
+ break
621
+ else
622
+ # unexpected DNS message ignored
623
+ end
624
+ end
625
+ return msg, s.data
626
+ end
627
+
628
+ def close
629
+ sock = @sock
630
+ @sock = nil
631
+ sock.close if sock
632
+ end
633
+
634
+ class Sender # :nodoc:
635
+ def initialize(msg, data, sock)
636
+ @msg = msg
637
+ @data = data
638
+ @sock = sock
639
+ end
640
+ end
641
+
642
+ class UnconnectedUDP < Requester # :nodoc:
643
+ def initialize
644
+ super()
645
+ @sock = UDPSocket.new
646
+ @sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::F_SETFD
647
+ DNS.bind_random_port(@sock)
648
+ end
649
+
650
+ def recv_reply
651
+ reply, from = @sock.recvfrom(UDPSize)
652
+ return reply, [from[3],from[1]]
653
+ end
654
+
655
+ def sender(msg, data, host, port=Port)
656
+ service = [host, port]
657
+ id = DNS.allocate_request_id(host, port)
658
+ request = msg.encode
659
+ request[0,2] = [id].pack('n')
660
+ return @senders[[service, id]] =
661
+ Sender.new(request, data, @sock, host, port)
662
+ end
663
+
664
+ def close
665
+ super
666
+ @senders.each_key {|service, id|
667
+ DNS.free_request_id(service[0], service[1], id)
668
+ }
669
+ end
670
+
671
+ class Sender < Requester::Sender # :nodoc:
672
+ def initialize(msg, data, sock, host, port)
673
+ super(msg, data, sock)
674
+ @host = host
675
+ @port = port
676
+ end
677
+ attr_reader :data
678
+
679
+ def send
680
+ @sock.send(@msg, 0, @host, @port)
681
+ end
682
+ end
683
+ end
684
+
685
+ class ConnectedUDP < Requester # :nodoc:
686
+ def initialize(host, port=Port)
687
+ super()
688
+ @host = host
689
+ @port = port
690
+ @sock = UDPSocket.new(host.index(':') ? Socket::AF_INET6 : Socket::AF_INET)
691
+ DNS.bind_random_port(@sock)
692
+ @sock.connect(host, port)
693
+ @sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::F_SETFD
694
+ end
695
+
696
+ def recv_reply
697
+ reply = @sock.recv(UDPSize)
698
+ return reply, nil
699
+ end
700
+
701
+ def sender(msg, data, host=@host, port=@port)
702
+ unless host == @host && port == @port
703
+ raise RequestError.new("host/port don't match: #{host}:#{port}")
704
+ end
705
+ id = DNS.allocate_request_id(@host, @port)
706
+ request = msg.encode
707
+ request[0,2] = [id].pack('n')
708
+ return @senders[[nil,id]] = Sender.new(request, data, @sock)
709
+ end
710
+
711
+ def close
712
+ super
713
+ @senders.each_key {|from, id|
714
+ DNS.free_request_id(@host, @port, id)
715
+ }
716
+ end
717
+
718
+ class Sender < Requester::Sender # :nodoc:
719
+ def send
720
+ @sock.send(@msg, 0)
721
+ end
722
+ attr_reader :data
723
+ end
724
+ end
725
+
726
+ class TCP < Requester # :nodoc:
727
+ def initialize(host, port=Port)
728
+ super()
729
+ @host = host
730
+ @port = port
731
+ @sock = TCPSocket.new(@host, @port)
732
+ @sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::F_SETFD
733
+ @senders = {}
734
+ end
735
+
736
+ def recv_reply
737
+ len = @sock.read(2).unpack('n')[0]
738
+ reply = @sock.read(len)
739
+ return reply, nil
740
+ end
741
+
742
+ def sender(msg, data, host=@host, port=@port)
743
+ unless host == @host && port == @port
744
+ raise RequestError.new("host/port don't match: #{host}:#{port}")
745
+ end
746
+ id = DNS.allocate_request_id(@host, @port)
747
+ request = msg.encode
748
+ request[0,2] = [request.length, id].pack('nn')
749
+ return @senders[[nil,id]] = Sender.new(request, data, @sock)
750
+ end
751
+
752
+ class Sender < Requester::Sender # :nodoc:
753
+ def send
754
+ @sock.print(@msg)
755
+ @sock.flush
756
+ end
757
+ attr_reader :data
758
+ end
759
+
760
+ def close
761
+ super
762
+ @senders.each_key {|from,id|
763
+ DNS.free_request_id(@host, @port, id)
764
+ }
765
+ end
766
+ end
767
+
768
+ ##
769
+ # Indicates a problem with the DNS request.
770
+
771
+ class RequestError < StandardError
772
+ end
773
+ end
774
+
775
+ class Config # :nodoc:
776
+ def initialize(config_info=nil)
777
+ @mutex = Mutex.new
778
+ @config_info = config_info
779
+ @initialized = nil
780
+ end
781
+
782
+ def Config.parse_resolv_conf(filename)
783
+ nameserver = []
784
+ search = nil
785
+ ndots = 1
786
+ open(filename) {|f|
787
+ f.each {|line|
788
+ line.sub!(/[#;].*/, '')
789
+ keyword, *args = line.split(/\s+/)
790
+ args.each { |arg|
791
+ arg.untaint
792
+ }
793
+ next unless keyword
794
+ case keyword
795
+ when 'nameserver'
796
+ nameserver += args
797
+ when 'domain'
798
+ next if args.empty?
799
+ search = [args[0]]
800
+ when 'search'
801
+ next if args.empty?
802
+ search = args
803
+ when 'options'
804
+ args.each {|arg|
805
+ case arg
806
+ when /\Andots:(\d+)\z/
807
+ ndots = $1.to_i
808
+ end
809
+ }
810
+ end
811
+ }
812
+ }
813
+ return { :nameserver => nameserver, :search => search, :ndots => ndots }
814
+ end
815
+
816
+ def Config.default_config_hash(filename="/etc/resolv.conf")
817
+ if File.exist? filename
818
+ config_hash = Config.parse_resolv_conf(filename)
819
+ else
820
+ if /mswin|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM
821
+ require 'win32/resolv'
822
+ search, nameserver = Win32::Resolv.get_resolv_info
823
+ config_hash = {}
824
+ config_hash[:nameserver] = nameserver if nameserver
825
+ config_hash[:search] = [search].flatten if search
826
+ end
827
+ end
828
+ config_hash
829
+ end
830
+
831
+ def lazy_initialize
832
+ @mutex.synchronize {
833
+ unless @initialized
834
+ @nameserver = []
835
+ @search = nil
836
+ @ndots = 1
837
+ case @config_info
838
+ when nil
839
+ config_hash = Config.default_config_hash
840
+ when String
841
+ config_hash = Config.parse_resolv_conf(@config_info)
842
+ when Hash
843
+ config_hash = @config_info.dup
844
+ if String === config_hash[:nameserver]
845
+ config_hash[:nameserver] = [config_hash[:nameserver]]
846
+ end
847
+ if String === config_hash[:search]
848
+ config_hash[:search] = [config_hash[:search]]
849
+ end
850
+ else
851
+ raise ArgumentError.new("invalid resolv configuration: #{@config_info.inspect}")
852
+ end
853
+ @nameserver = config_hash[:nameserver] if config_hash.include? :nameserver
854
+ @search = config_hash[:search] if config_hash.include? :search
855
+ @ndots = config_hash[:ndots] if config_hash.include? :ndots
856
+
857
+ @nameserver = ['0.0.0.0'] if @nameserver.empty?
858
+ if @search
859
+ @search = @search.map {|arg| Label.split(arg) }
860
+ else
861
+ hostname = Socket.gethostname
862
+ if /\./ =~ hostname
863
+ @search = [Label.split($')]
864
+ else
865
+ @search = [[]]
866
+ end
867
+ end
868
+
869
+ if !@nameserver.kind_of?(Array) ||
870
+ !@nameserver.all? {|ns| String === ns }
871
+ raise ArgumentError.new("invalid nameserver config: #{@nameserver.inspect}")
872
+ end
873
+
874
+ if !@search.kind_of?(Array) ||
875
+ !@search.all? {|ls| ls.all? {|l| Label::Str === l } }
876
+ raise ArgumentError.new("invalid search config: #{@search.inspect}")
877
+ end
878
+
879
+ if !@ndots.kind_of?(Integer)
880
+ raise ArgumentError.new("invalid ndots config: #{@ndots.inspect}")
881
+ end
882
+
883
+ @initialized = true
884
+ end
885
+ }
886
+ self
887
+ end
888
+
889
+ def single?
890
+ lazy_initialize
891
+ if @nameserver.length == 1
892
+ return @nameserver[0]
893
+ else
894
+ return nil
895
+ end
896
+ end
897
+
898
+ def generate_candidates(name)
899
+ candidates = nil
900
+ name = Name.create(name)
901
+ if name.absolute?
902
+ candidates = [name]
903
+ else
904
+ if @ndots <= name.length - 1
905
+ candidates = [Name.new(name.to_a)]
906
+ else
907
+ candidates = []
908
+ end
909
+ candidates.concat(@search.map {|domain| Name.new(name.to_a + domain)})
910
+ end
911
+ return candidates
912
+ end
913
+
914
+ InitialTimeout = 5
915
+
916
+ def generate_timeouts
917
+ ts = [InitialTimeout]
918
+ ts << ts[-1] * 2 / @nameserver.length
919
+ ts << ts[-1] * 2
920
+ ts << ts[-1] * 2
921
+ return ts
922
+ end
923
+
924
+ def resolv(name)
925
+ candidates = generate_candidates(name)
926
+ timeouts = generate_timeouts
927
+ begin
928
+ candidates.each {|candidate|
929
+ begin
930
+ timeouts.each {|tout|
931
+ @nameserver.each {|nameserver|
932
+ begin
933
+ yield candidate, tout, nameserver
934
+ rescue ResolvTimeout
935
+ end
936
+ }
937
+ }
938
+ raise ResolvError.new("DNS resolv timeout: #{name}")
939
+ rescue NXDomain
940
+ end
941
+ }
942
+ rescue ResolvError
943
+ end
944
+ end
945
+
946
+ ##
947
+ # Indicates no such domain was found.
948
+
949
+ class NXDomain < ResolvError
950
+ end
951
+
952
+ ##
953
+ # Indicates some other unhandled resolver error was encountered.
954
+
955
+ class OtherResolvError < ResolvError
956
+ end
957
+ end
958
+
959
+ module OpCode # :nodoc:
960
+ Query = 0
961
+ IQuery = 1
962
+ Status = 2
963
+ Notify = 4
964
+ Update = 5
965
+ end
966
+
967
+ module RCode # :nodoc:
968
+ NoError = 0
969
+ FormErr = 1
970
+ ServFail = 2
971
+ NXDomain = 3
972
+ NotImp = 4
973
+ Refused = 5
974
+ YXDomain = 6
975
+ YXRRSet = 7
976
+ NXRRSet = 8
977
+ NotAuth = 9
978
+ NotZone = 10
979
+ BADVERS = 16
980
+ BADSIG = 16
981
+ BADKEY = 17
982
+ BADTIME = 18
983
+ BADMODE = 19
984
+ BADNAME = 20
985
+ BADALG = 21
986
+ end
987
+
988
+ ##
989
+ # Indicates that the DNS response was unable to be decoded.
990
+
991
+ class DecodeError < StandardError
992
+ end
993
+
994
+ ##
995
+ # Indicates that the DNS request was unable to be encoded.
996
+
997
+ class EncodeError < StandardError
998
+ end
999
+
1000
+ module Label # :nodoc:
1001
+ def self.split(arg)
1002
+ labels = []
1003
+ arg.scan(/[^\.]+/) {labels << Str.new($&)}
1004
+ return labels
1005
+ end
1006
+
1007
+ class Str # :nodoc:
1008
+ def initialize(string)
1009
+ @string = string
1010
+ @downcase = string.downcase
1011
+ end
1012
+ attr_reader :string, :downcase
1013
+
1014
+ def to_s
1015
+ return @string
1016
+ end
1017
+
1018
+ def inspect
1019
+ return "#<#{self.class} #{self.to_s}>"
1020
+ end
1021
+
1022
+ def ==(other)
1023
+ return @downcase == other.downcase
1024
+ end
1025
+
1026
+ def eql?(other)
1027
+ return self == other
1028
+ end
1029
+
1030
+ def hash
1031
+ return @downcase.hash
1032
+ end
1033
+ end
1034
+ end
1035
+
1036
+ ##
1037
+ # A representation of a DNS name.
1038
+
1039
+ class Name
1040
+
1041
+ ##
1042
+ # Creates a new DNS name from +arg+. +arg+ can be:
1043
+ #
1044
+ # Name:: returns +arg+.
1045
+ # String:: Creates a new Name.
1046
+
1047
+ def self.create(arg)
1048
+ case arg
1049
+ when Name
1050
+ return arg
1051
+ when String
1052
+ return Name.new(Label.split(arg), /\.\z/ =~ arg ? true : false)
1053
+ else
1054
+ raise ArgumentError.new("cannot interpret as DNS name: #{arg.inspect}")
1055
+ end
1056
+ end
1057
+
1058
+ def initialize(labels, absolute=true) # :nodoc:
1059
+ @labels = labels
1060
+ @absolute = absolute
1061
+ end
1062
+
1063
+ def inspect # :nodoc:
1064
+ "#<#{self.class}: #{self.to_s}#{@absolute ? '.' : ''}>"
1065
+ end
1066
+
1067
+ ##
1068
+ # True if this name is absolute.
1069
+
1070
+ def absolute?
1071
+ return @absolute
1072
+ end
1073
+
1074
+ def ==(other) # :nodoc:
1075
+ return false unless Name === other
1076
+ return @labels.join == other.to_a.join && @absolute == other.absolute?
1077
+ end
1078
+
1079
+ alias eql? == # :nodoc:
1080
+
1081
+ ##
1082
+ # Returns true if +other+ is a subdomain.
1083
+ #
1084
+ # Example:
1085
+ #
1086
+ # domain = Resolv::DNS::Name.create("y.z")
1087
+ # p Resolv::DNS::Name.create("w.x.y.z").subdomain_of?(domain) #=> true
1088
+ # p Resolv::DNS::Name.create("x.y.z").subdomain_of?(domain) #=> true
1089
+ # p Resolv::DNS::Name.create("y.z").subdomain_of?(domain) #=> false
1090
+ # p Resolv::DNS::Name.create("z").subdomain_of?(domain) #=> false
1091
+ # p Resolv::DNS::Name.create("x.y.z.").subdomain_of?(domain) #=> false
1092
+ # p Resolv::DNS::Name.create("w.z").subdomain_of?(domain) #=> false
1093
+ #
1094
+
1095
+ def subdomain_of?(other)
1096
+ raise ArgumentError, "not a domain name: #{other.inspect}" unless Name === other
1097
+ return false if @absolute != other.absolute?
1098
+ other_len = other.length
1099
+ return false if @labels.length <= other_len
1100
+ return @labels[-other_len, other_len] == other.to_a
1101
+ end
1102
+
1103
+ def hash # :nodoc:
1104
+ return @labels.hash ^ @absolute.hash
1105
+ end
1106
+
1107
+ def to_a # :nodoc:
1108
+ return @labels
1109
+ end
1110
+
1111
+ def length # :nodoc:
1112
+ return @labels.length
1113
+ end
1114
+
1115
+ def [](i) # :nodoc:
1116
+ return @labels[i]
1117
+ end
1118
+
1119
+ ##
1120
+ # returns the domain name as a string.
1121
+ #
1122
+ # The domain name doesn't have a trailing dot even if the name object is
1123
+ # absolute.
1124
+ #
1125
+ # Example:
1126
+ #
1127
+ # p Resolv::DNS::Name.create("x.y.z.").to_s #=> "x.y.z"
1128
+ # p Resolv::DNS::Name.create("x.y.z").to_s #=> "x.y.z"
1129
+
1130
+ def to_s
1131
+ return @labels.join('.')
1132
+ end
1133
+ end
1134
+
1135
+ class Message # :nodoc:
1136
+ @@identifier = -1
1137
+
1138
+ def initialize(id = (@@identifier += 1) & 0xffff)
1139
+ @id = id
1140
+ @qr = 0
1141
+ @opcode = 0
1142
+ @aa = 0
1143
+ @tc = 0
1144
+ @rd = 0 # recursion desired
1145
+ @ra = 0 # recursion available
1146
+ @rcode = 0
1147
+ @question = []
1148
+ @answer = []
1149
+ @authority = []
1150
+ @additional = []
1151
+ end
1152
+
1153
+ attr_accessor :id, :qr, :opcode, :aa, :tc, :rd, :ra, :rcode
1154
+ attr_reader :question, :answer, :authority, :additional
1155
+
1156
+ def ==(other)
1157
+ return @id == other.id &&
1158
+ @qr == other.qr &&
1159
+ @opcode == other.opcode &&
1160
+ @aa == other.aa &&
1161
+ @tc == other.tc &&
1162
+ @rd == other.rd &&
1163
+ @ra == other.ra &&
1164
+ @rcode == other.rcode &&
1165
+ @question == other.question &&
1166
+ @answer == other.answer &&
1167
+ @authority == other.authority &&
1168
+ @additional == other.additional
1169
+ end
1170
+
1171
+ def add_question(name, typeclass)
1172
+ @question << [Name.create(name), typeclass]
1173
+ end
1174
+
1175
+ def each_question
1176
+ @question.each {|name, typeclass|
1177
+ yield name, typeclass
1178
+ }
1179
+ end
1180
+
1181
+ def add_answer(name, ttl, data)
1182
+ @answer << [Name.create(name), ttl, data]
1183
+ end
1184
+
1185
+ def each_answer
1186
+ @answer.each {|name, ttl, data|
1187
+ yield name, ttl, data
1188
+ }
1189
+ end
1190
+
1191
+ def add_authority(name, ttl, data)
1192
+ @authority << [Name.create(name), ttl, data]
1193
+ end
1194
+
1195
+ def each_authority
1196
+ @authority.each {|name, ttl, data|
1197
+ yield name, ttl, data
1198
+ }
1199
+ end
1200
+
1201
+ def add_additional(name, ttl, data)
1202
+ @additional << [Name.create(name), ttl, data]
1203
+ end
1204
+
1205
+ def each_additional
1206
+ @additional.each {|name, ttl, data|
1207
+ yield name, ttl, data
1208
+ }
1209
+ end
1210
+
1211
+ def each_resource
1212
+ each_answer {|name, ttl, data| yield name, ttl, data}
1213
+ each_authority {|name, ttl, data| yield name, ttl, data}
1214
+ each_additional {|name, ttl, data| yield name, ttl, data}
1215
+ end
1216
+
1217
+ def encode
1218
+ return MessageEncoder.new {|msg|
1219
+ msg.put_pack('nnnnnn',
1220
+ @id,
1221
+ (@qr & 1) << 15 |
1222
+ (@opcode & 15) << 11 |
1223
+ (@aa & 1) << 10 |
1224
+ (@tc & 1) << 9 |
1225
+ (@rd & 1) << 8 |
1226
+ (@ra & 1) << 7 |
1227
+ (@rcode & 15),
1228
+ @question.length,
1229
+ @answer.length,
1230
+ @authority.length,
1231
+ @additional.length)
1232
+ @question.each {|q|
1233
+ name, typeclass = q
1234
+ msg.put_name(name)
1235
+ msg.put_pack('nn', typeclass::TypeValue, typeclass::ClassValue)
1236
+ }
1237
+ [@answer, @authority, @additional].each {|rr|
1238
+ rr.each {|r|
1239
+ name, ttl, data = r
1240
+ msg.put_name(name)
1241
+ msg.put_pack('nnN', data.class::TypeValue, data.class::ClassValue, ttl)
1242
+ msg.put_length16 {data.encode_rdata(msg)}
1243
+ }
1244
+ }
1245
+ }.to_s
1246
+ end
1247
+
1248
+ class MessageEncoder # :nodoc:
1249
+ def initialize
1250
+ @data = ''
1251
+ @names = {}
1252
+ yield self
1253
+ end
1254
+
1255
+ def to_s
1256
+ return @data
1257
+ end
1258
+
1259
+ def put_bytes(d)
1260
+ @data << d
1261
+ end
1262
+
1263
+ def put_pack(template, *d)
1264
+ @data << d.pack(template)
1265
+ end
1266
+
1267
+ def put_length16
1268
+ length_index = @data.length
1269
+ @data << "\0\0"
1270
+ data_start = @data.length
1271
+ yield
1272
+ data_end = @data.length
1273
+ @data[length_index, 2] = [data_end - data_start].pack("n")
1274
+ end
1275
+
1276
+ def put_string(d)
1277
+ self.put_pack("C", d.length)
1278
+ @data << d
1279
+ end
1280
+
1281
+ def put_string_list(ds)
1282
+ ds.each {|d|
1283
+ self.put_string(d)
1284
+ }
1285
+ end
1286
+
1287
+ def put_name(d)
1288
+ put_labels(d.to_a)
1289
+ end
1290
+
1291
+ def put_labels(d)
1292
+ d.each_index {|i|
1293
+ domain = d[i..-1]
1294
+ if idx = @names[domain]
1295
+ self.put_pack("n", 0xc000 | idx)
1296
+ return
1297
+ else
1298
+ @names[domain] = @data.length
1299
+ self.put_label(d[i])
1300
+ end
1301
+ }
1302
+ @data << "\0"
1303
+ end
1304
+
1305
+ def put_label(d)
1306
+ self.put_string(d.to_s)
1307
+ end
1308
+ end
1309
+
1310
+ def Message.decode(m)
1311
+ o = Message.new(0)
1312
+ MessageDecoder.new(m) {|msg|
1313
+ id, flag, qdcount, ancount, nscount, arcount =
1314
+ msg.get_unpack('nnnnnn')
1315
+ o.id = id
1316
+ o.qr = (flag >> 15) & 1
1317
+ o.opcode = (flag >> 11) & 15
1318
+ o.aa = (flag >> 10) & 1
1319
+ o.tc = (flag >> 9) & 1
1320
+ o.rd = (flag >> 8) & 1
1321
+ o.ra = (flag >> 7) & 1
1322
+ o.rcode = flag & 15
1323
+ (1..qdcount).each {
1324
+ name, typeclass = msg.get_question
1325
+ o.add_question(name, typeclass)
1326
+ }
1327
+ (1..ancount).each {
1328
+ name, ttl, data = msg.get_rr
1329
+ o.add_answer(name, ttl, data)
1330
+ }
1331
+ (1..nscount).each {
1332
+ name, ttl, data = msg.get_rr
1333
+ o.add_authority(name, ttl, data)
1334
+ }
1335
+ (1..arcount).each {
1336
+ name, ttl, data = msg.get_rr
1337
+ o.add_additional(name, ttl, data)
1338
+ }
1339
+ }
1340
+ return o
1341
+ end
1342
+
1343
+ class MessageDecoder # :nodoc:
1344
+ def initialize(data)
1345
+ @data = data
1346
+ @index = 0
1347
+ @limit = data.length
1348
+ yield self
1349
+ end
1350
+
1351
+ def get_length16
1352
+ len, = self.get_unpack('n')
1353
+ save_limit = @limit
1354
+ @limit = @index + len
1355
+ d = yield(len)
1356
+ if @index < @limit
1357
+ raise DecodeError.new("junk exists")
1358
+ elsif @limit < @index
1359
+ raise DecodeError.new("limit exceeded")
1360
+ end
1361
+ @limit = save_limit
1362
+ return d
1363
+ end
1364
+
1365
+ def get_bytes(len = @limit - @index)
1366
+ d = @data[@index, len]
1367
+ @index += len
1368
+ return d
1369
+ end
1370
+
1371
+ def get_unpack(template)
1372
+ len = 0
1373
+ template.each_byte {|byte|
1374
+ byte = "%c" % byte
1375
+ case byte
1376
+ when ?c, ?C
1377
+ len += 1
1378
+ when ?n
1379
+ len += 2
1380
+ when ?N
1381
+ len += 4
1382
+ else
1383
+ raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
1384
+ end
1385
+ }
1386
+ raise DecodeError.new("limit exceeded") if @limit < @index + len
1387
+ arr = @data.unpack("@#{@index}#{template}")
1388
+ @index += len
1389
+ return arr
1390
+ end
1391
+
1392
+ def get_string
1393
+ len = @data[@index].ord
1394
+ raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
1395
+ d = @data[@index + 1, len]
1396
+ @index += 1 + len
1397
+ return d
1398
+ end
1399
+
1400
+ def get_string_list
1401
+ strings = []
1402
+ while @index < @limit
1403
+ strings << self.get_string
1404
+ end
1405
+ strings
1406
+ end
1407
+
1408
+ def get_name
1409
+ return Name.new(self.get_labels)
1410
+ end
1411
+
1412
+ def get_labels(limit=nil)
1413
+ limit = @index if !limit || @index < limit
1414
+ d = []
1415
+ while true
1416
+ case @data[@index].ord
1417
+ when 0
1418
+ @index += 1
1419
+ return d
1420
+ when 192..255
1421
+ idx = self.get_unpack('n')[0] & 0x3fff
1422
+ if limit <= idx
1423
+ raise DecodeError.new("non-backward name pointer")
1424
+ end
1425
+ save_index = @index
1426
+ @index = idx
1427
+ d += self.get_labels(limit)
1428
+ @index = save_index
1429
+ return d
1430
+ else
1431
+ d << self.get_label
1432
+ end
1433
+ end
1434
+ return d
1435
+ end
1436
+
1437
+ def get_label
1438
+ return Label::Str.new(self.get_string)
1439
+ end
1440
+
1441
+ def get_question
1442
+ name = self.get_name
1443
+ type, klass = self.get_unpack("nn")
1444
+ return name, Resource.get_class(type, klass)
1445
+ end
1446
+
1447
+ def get_rr
1448
+ name = self.get_name
1449
+ type, klass, ttl = self.get_unpack('nnN')
1450
+ typeclass = Resource.get_class(type, klass)
1451
+ res = self.get_length16 { typeclass.decode_rdata self }
1452
+ res.instance_variable_set :@ttl, ttl
1453
+ return name, ttl, res
1454
+ end
1455
+ end
1456
+ end
1457
+
1458
+ ##
1459
+ # A DNS query abstract class.
1460
+
1461
+ class Query
1462
+ def encode_rdata(msg) # :nodoc:
1463
+ raise EncodeError.new("#{self.class} is query.")
1464
+ end
1465
+
1466
+ def self.decode_rdata(msg) # :nodoc:
1467
+ raise DecodeError.new("#{self.class} is query.")
1468
+ end
1469
+ end
1470
+
1471
+ ##
1472
+ # A DNS resource abstract class.
1473
+
1474
+ class Resource < Query
1475
+
1476
+ ##
1477
+ # Remaining Time To Live for this Resource.
1478
+
1479
+ attr_reader :ttl
1480
+
1481
+ ClassHash = {} # :nodoc:
1482
+
1483
+ def encode_rdata(msg) # :nodoc:
1484
+ raise NotImplementedError.new
1485
+ end
1486
+
1487
+ def self.decode_rdata(msg) # :nodoc:
1488
+ raise NotImplementedError.new
1489
+ end
1490
+
1491
+ def ==(other) # :nodoc:
1492
+ return false unless self.class == other.class
1493
+ s_ivars = self.instance_variables
1494
+ s_ivars.sort!
1495
+ s_ivars.delete "@ttl"
1496
+ o_ivars = other.instance_variables
1497
+ o_ivars.sort!
1498
+ o_ivars.delete "@ttl"
1499
+ return s_ivars == o_ivars &&
1500
+ s_ivars.collect {|name| self.instance_variable_get name} ==
1501
+ o_ivars.collect {|name| other.instance_variable_get name}
1502
+ end
1503
+
1504
+ def eql?(other) # :nodoc:
1505
+ return self == other
1506
+ end
1507
+
1508
+ def hash # :nodoc:
1509
+ h = 0
1510
+ vars = self.instance_variables
1511
+ vars.delete "@ttl"
1512
+ vars.each {|name|
1513
+ h ^= self.instance_variable_get(name).hash
1514
+ }
1515
+ return h
1516
+ end
1517
+
1518
+ def self.get_class(type_value, class_value) # :nodoc:
1519
+ return ClassHash[[type_value, class_value]] ||
1520
+ Generic.create(type_value, class_value)
1521
+ end
1522
+
1523
+ ##
1524
+ # A generic resource abstract class.
1525
+
1526
+ class Generic < Resource
1527
+
1528
+ ##
1529
+ # Creates a new generic resource.
1530
+
1531
+ def initialize(data)
1532
+ @data = data
1533
+ end
1534
+
1535
+ ##
1536
+ # Data for this generic resource.
1537
+
1538
+ attr_reader :data
1539
+
1540
+ def encode_rdata(msg) # :nodoc:
1541
+ msg.put_bytes(data)
1542
+ end
1543
+
1544
+ def self.decode_rdata(msg) # :nodoc:
1545
+ return self.new(msg.get_bytes)
1546
+ end
1547
+
1548
+ def self.create(type_value, class_value) # :nodoc:
1549
+ c = Class.new(Generic)
1550
+ c.const_set(:TypeValue, type_value)
1551
+ c.const_set(:ClassValue, class_value)
1552
+ Generic.const_set("Type#{type_value}_Class#{class_value}", c)
1553
+ ClassHash[[type_value, class_value]] = c
1554
+ return c
1555
+ end
1556
+ end
1557
+
1558
+ ##
1559
+ # Domain Name resource abstract class.
1560
+
1561
+ class DomainName < Resource
1562
+
1563
+ ##
1564
+ # Creates a new DomainName from +name+.
1565
+
1566
+ def initialize(name)
1567
+ @name = name
1568
+ end
1569
+
1570
+ ##
1571
+ # The name of this DomainName.
1572
+
1573
+ attr_reader :name
1574
+
1575
+ def encode_rdata(msg) # :nodoc:
1576
+ msg.put_name(@name)
1577
+ end
1578
+
1579
+ def self.decode_rdata(msg) # :nodoc:
1580
+ return self.new(msg.get_name)
1581
+ end
1582
+ end
1583
+
1584
+ # Standard (class generic) RRs
1585
+
1586
+ ClassValue = nil # :nodoc:
1587
+
1588
+ ##
1589
+ # An authoritative name server.
1590
+
1591
+ class NS < DomainName
1592
+ TypeValue = 2 # :nodoc:
1593
+ end
1594
+
1595
+ ##
1596
+ # The canonical name for an alias.
1597
+
1598
+ class CNAME < DomainName
1599
+ TypeValue = 5 # :nodoc:
1600
+ end
1601
+
1602
+ ##
1603
+ # Start Of Authority resource.
1604
+
1605
+ class SOA < Resource
1606
+
1607
+ TypeValue = 6 # :nodoc:
1608
+
1609
+ ##
1610
+ # Creates a new SOA record. See the attr documentation for the
1611
+ # details of each argument.
1612
+
1613
+ def initialize(mname, rname, serial, refresh, retry_, expire, minimum)
1614
+ @mname = mname
1615
+ @rname = rname
1616
+ @serial = serial
1617
+ @refresh = refresh
1618
+ @retry = retry_
1619
+ @expire = expire
1620
+ @minimum = minimum
1621
+ end
1622
+
1623
+ ##
1624
+ # Name of the host where the master zone file for this zone resides.
1625
+
1626
+ attr_reader :mname
1627
+
1628
+ ##
1629
+ # The person responsible for this domain name.
1630
+
1631
+ attr_reader :rname
1632
+
1633
+ ##
1634
+ # The version number of the zone file.
1635
+
1636
+ attr_reader :serial
1637
+
1638
+ ##
1639
+ # How often, in seconds, a secondary name server is to check for
1640
+ # updates from the primary name server.
1641
+
1642
+ attr_reader :refresh
1643
+
1644
+ ##
1645
+ # How often, in seconds, a secondary name server is to retry after a
1646
+ # failure to check for a refresh.
1647
+
1648
+ attr_reader :retry
1649
+
1650
+ ##
1651
+ # Time in seconds that a secondary name server is to use the data
1652
+ # before refreshing from the primary name server.
1653
+
1654
+ attr_reader :expire
1655
+
1656
+ ##
1657
+ # The minimum number of seconds to be used for TTL values in RRs.
1658
+
1659
+ attr_reader :minimum
1660
+
1661
+ def encode_rdata(msg) # :nodoc:
1662
+ msg.put_name(@mname)
1663
+ msg.put_name(@rname)
1664
+ msg.put_pack('NNNNN', @serial, @refresh, @retry, @expire, @minimum)
1665
+ end
1666
+
1667
+ def self.decode_rdata(msg) # :nodoc:
1668
+ mname = msg.get_name
1669
+ rname = msg.get_name
1670
+ serial, refresh, retry_, expire, minimum = msg.get_unpack('NNNNN')
1671
+ return self.new(
1672
+ mname, rname, serial, refresh, retry_, expire, minimum)
1673
+ end
1674
+ end
1675
+
1676
+ ##
1677
+ # A Pointer to another DNS name.
1678
+
1679
+ class PTR < DomainName
1680
+ TypeValue = 12 # :nodoc:
1681
+ end
1682
+
1683
+ ##
1684
+ # Host Information resource.
1685
+
1686
+ class HINFO < Resource
1687
+
1688
+ TypeValue = 13 # :nodoc:
1689
+
1690
+ ##
1691
+ # Creates a new HINFO running +os+ on +cpu+.
1692
+
1693
+ def initialize(cpu, os)
1694
+ @cpu = cpu
1695
+ @os = os
1696
+ end
1697
+
1698
+ ##
1699
+ # CPU architecture for this resource.
1700
+
1701
+ attr_reader :cpu
1702
+
1703
+ ##
1704
+ # Operating system for this resource.
1705
+
1706
+ attr_reader :os
1707
+
1708
+ def encode_rdata(msg) # :nodoc:
1709
+ msg.put_string(@cpu)
1710
+ msg.put_string(@os)
1711
+ end
1712
+
1713
+ def self.decode_rdata(msg) # :nodoc:
1714
+ cpu = msg.get_string
1715
+ os = msg.get_string
1716
+ return self.new(cpu, os)
1717
+ end
1718
+ end
1719
+
1720
+ ##
1721
+ # Mailing list or mailbox information.
1722
+
1723
+ class MINFO < Resource
1724
+
1725
+ TypeValue = 14 # :nodoc:
1726
+
1727
+ def initialize(rmailbx, emailbx)
1728
+ @rmailbx = rmailbx
1729
+ @emailbx = emailbx
1730
+ end
1731
+
1732
+ ##
1733
+ # Domain name responsible for this mail list or mailbox.
1734
+
1735
+ attr_reader :rmailbx
1736
+
1737
+ ##
1738
+ # Mailbox to use for error messages related to the mail list or mailbox.
1739
+
1740
+ attr_reader :emailbx
1741
+
1742
+ def encode_rdata(msg) # :nodoc:
1743
+ msg.put_name(@rmailbx)
1744
+ msg.put_name(@emailbx)
1745
+ end
1746
+
1747
+ def self.decode_rdata(msg) # :nodoc:
1748
+ rmailbx = msg.get_string
1749
+ emailbx = msg.get_string
1750
+ return self.new(rmailbx, emailbx)
1751
+ end
1752
+ end
1753
+
1754
+ ##
1755
+ # Mail Exchanger resource.
1756
+
1757
+ class MX < Resource
1758
+
1759
+ TypeValue= 15 # :nodoc:
1760
+
1761
+ ##
1762
+ # Creates a new MX record with +preference+, accepting mail at
1763
+ # +exchange+.
1764
+
1765
+ def initialize(preference, exchange)
1766
+ @preference = preference
1767
+ @exchange = exchange
1768
+ end
1769
+
1770
+ ##
1771
+ # The preference for this MX.
1772
+
1773
+ attr_reader :preference
1774
+
1775
+ ##
1776
+ # The host of this MX.
1777
+
1778
+ attr_reader :exchange
1779
+
1780
+ def encode_rdata(msg) # :nodoc:
1781
+ msg.put_pack('n', @preference)
1782
+ msg.put_name(@exchange)
1783
+ end
1784
+
1785
+ def self.decode_rdata(msg) # :nodoc:
1786
+ preference, = msg.get_unpack('n')
1787
+ exchange = msg.get_name
1788
+ return self.new(preference, exchange)
1789
+ end
1790
+ end
1791
+
1792
+ ##
1793
+ # Unstructured text resource.
1794
+
1795
+ class TXT < Resource
1796
+
1797
+ TypeValue = 16 # :nodoc:
1798
+
1799
+ def initialize(first_string, *rest_strings)
1800
+ @strings = [first_string, *rest_strings]
1801
+ end
1802
+
1803
+ ##
1804
+ # Returns an Array of Strings for this TXT record.
1805
+
1806
+ attr_reader :strings
1807
+
1808
+ ##
1809
+ # Returns the first string from +strings+.
1810
+
1811
+ def data
1812
+ @strings[0]
1813
+ end
1814
+
1815
+ def encode_rdata(msg) # :nodoc:
1816
+ msg.put_string_list(@strings)
1817
+ end
1818
+
1819
+ def self.decode_rdata(msg) # :nodoc:
1820
+ strings = msg.get_string_list
1821
+ return self.new(*strings)
1822
+ end
1823
+ end
1824
+
1825
+ ##
1826
+ # A Query type requesting any RR.
1827
+
1828
+ class ANY < Query
1829
+ TypeValue = 255 # :nodoc:
1830
+ end
1831
+
1832
+ ClassInsensitiveTypes = [ # :nodoc:
1833
+ NS, CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, ANY
1834
+ ]
1835
+
1836
+ ##
1837
+ # module IN contains ARPA Internet specific RRs.
1838
+
1839
+ module IN
1840
+
1841
+ ClassValue = 1 # :nodoc:
1842
+
1843
+ ClassInsensitiveTypes.each {|s|
1844
+ c = Class.new(s)
1845
+ c.const_set(:TypeValue, s::TypeValue)
1846
+ c.const_set(:ClassValue, ClassValue)
1847
+ ClassHash[[s::TypeValue, ClassValue]] = c
1848
+ self.const_set(s.name.sub(/.*::/, ''), c)
1849
+ }
1850
+
1851
+ ##
1852
+ # IPv4 Address resource
1853
+
1854
+ class A < Resource
1855
+ TypeValue = 1
1856
+ ClassValue = IN::ClassValue
1857
+ ClassHash[[TypeValue, ClassValue]] = self # :nodoc:
1858
+
1859
+ ##
1860
+ # Creates a new A for +address+.
1861
+
1862
+ def initialize(address)
1863
+ @address = IPv4.create(address)
1864
+ end
1865
+
1866
+ ##
1867
+ # The Resolv::IPv4 address for this A.
1868
+
1869
+ attr_reader :address
1870
+
1871
+ def encode_rdata(msg) # :nodoc:
1872
+ msg.put_bytes(@address.address)
1873
+ end
1874
+
1875
+ def self.decode_rdata(msg) # :nodoc:
1876
+ return self.new(IPv4.new(msg.get_bytes(4)))
1877
+ end
1878
+ end
1879
+
1880
+ ##
1881
+ # Well Known Service resource.
1882
+
1883
+ class WKS < Resource
1884
+ TypeValue = 11
1885
+ ClassValue = IN::ClassValue
1886
+ ClassHash[[TypeValue, ClassValue]] = self # :nodoc:
1887
+
1888
+ def initialize(address, protocol, bitmap)
1889
+ @address = IPv4.create(address)
1890
+ @protocol = protocol
1891
+ @bitmap = bitmap
1892
+ end
1893
+
1894
+ ##
1895
+ # The host these services run on.
1896
+
1897
+ attr_reader :address
1898
+
1899
+ ##
1900
+ # IP protocol number for these services.
1901
+
1902
+ attr_reader :protocol
1903
+
1904
+ ##
1905
+ # A bit map of enabled services on this host.
1906
+ #
1907
+ # If protocol is 6 (TCP) then the 26th bit corresponds to the SMTP
1908
+ # service (port 25). If this bit is set, then an SMTP server should
1909
+ # be listening on TCP port 25; if zero, SMTP service is not
1910
+ # supported.
1911
+
1912
+ attr_reader :bitmap
1913
+
1914
+ def encode_rdata(msg) # :nodoc:
1915
+ msg.put_bytes(@address.address)
1916
+ msg.put_pack("n", @protocol)
1917
+ msg.put_bytes(@bitmap)
1918
+ end
1919
+
1920
+ def self.decode_rdata(msg) # :nodoc:
1921
+ address = IPv4.new(msg.get_bytes(4))
1922
+ protocol, = msg.get_unpack("n")
1923
+ bitmap = msg.get_bytes
1924
+ return self.new(address, protocol, bitmap)
1925
+ end
1926
+ end
1927
+
1928
+ ##
1929
+ # An IPv6 address record.
1930
+
1931
+ class AAAA < Resource
1932
+ TypeValue = 28
1933
+ ClassValue = IN::ClassValue
1934
+ ClassHash[[TypeValue, ClassValue]] = self # :nodoc:
1935
+
1936
+ ##
1937
+ # Creates a new AAAA for +address+.
1938
+
1939
+ def initialize(address)
1940
+ @address = IPv6.create(address)
1941
+ end
1942
+
1943
+ ##
1944
+ # The Resolv::IPv6 address for this AAAA.
1945
+
1946
+ attr_reader :address
1947
+
1948
+ def encode_rdata(msg) # :nodoc:
1949
+ msg.put_bytes(@address.address)
1950
+ end
1951
+
1952
+ def self.decode_rdata(msg) # :nodoc:
1953
+ return self.new(IPv6.new(msg.get_bytes(16)))
1954
+ end
1955
+ end
1956
+
1957
+ ##
1958
+ # SRV resource record defined in RFC 2782
1959
+ #
1960
+ # These records identify the hostname and port that a service is
1961
+ # available at.
1962
+
1963
+ class SRV < Resource
1964
+ TypeValue = 33
1965
+ ClassValue = IN::ClassValue
1966
+ ClassHash[[TypeValue, ClassValue]] = self # :nodoc:
1967
+
1968
+ # Create a SRV resource record.
1969
+ #
1970
+ # See the documentation for #priority, #weight, #port and #target
1971
+ # for +priority+, +weight+, +port and +target+ respectively.
1972
+
1973
+ def initialize(priority, weight, port, target)
1974
+ @priority = priority.to_int
1975
+ @weight = weight.to_int
1976
+ @port = port.to_int
1977
+ @target = Name.create(target)
1978
+ end
1979
+
1980
+ # The priority of this target host.
1981
+ #
1982
+ # A client MUST attempt to contact the target host with the
1983
+ # lowest-numbered priority it can reach; target hosts with the same
1984
+ # priority SHOULD be tried in an order defined by the weight field.
1985
+ # The range is 0-65535. Note that it is not widely implemented and
1986
+ # should be set to zero.
1987
+
1988
+ attr_reader :priority
1989
+
1990
+ # A server selection mechanism.
1991
+ #
1992
+ # The weight field specifies a relative weight for entries with the
1993
+ # same priority. Larger weights SHOULD be given a proportionately
1994
+ # higher probability of being selected. The range of this number is
1995
+ # 0-65535. Domain administrators SHOULD use Weight 0 when there
1996
+ # isn't any server selection to do, to make the RR easier to read
1997
+ # for humans (less noisy). Note that it is not widely implemented
1998
+ # and should be set to zero.
1999
+
2000
+ attr_reader :weight
2001
+
2002
+ # The port on this target host of this service.
2003
+ #
2004
+ # The range is 0-65535.
2005
+
2006
+ attr_reader :port
2007
+
2008
+ # The domain name of the target host.
2009
+ #
2010
+ # A target of "." means that the service is decidedly not available
2011
+ # at this domain.
2012
+
2013
+ attr_reader :target
2014
+
2015
+ def encode_rdata(msg) # :nodoc:
2016
+ msg.put_pack("n", @priority)
2017
+ msg.put_pack("n", @weight)
2018
+ msg.put_pack("n", @port)
2019
+ msg.put_name(@target)
2020
+ end
2021
+
2022
+ def self.decode_rdata(msg) # :nodoc:
2023
+ priority, = msg.get_unpack("n")
2024
+ weight, = msg.get_unpack("n")
2025
+ port, = msg.get_unpack("n")
2026
+ target = msg.get_name
2027
+ return self.new(priority, weight, port, target)
2028
+ end
2029
+ end
2030
+ end
2031
+ end
2032
+ end
2033
+
2034
+ ##
2035
+ # A Resolv::DNS IPv4 address.
2036
+
2037
+ class IPv4
2038
+
2039
+ ##
2040
+ # Regular expression IPv4 addresses must match.
2041
+
2042
+ Regex = /\A(\d+)\.(\d+)\.(\d+)\.(\d+)\z/
2043
+
2044
+ def self.create(arg)
2045
+ case arg
2046
+ when IPv4
2047
+ return arg
2048
+ when Regex
2049
+ if (0..255) === (a = $1.to_i) &&
2050
+ (0..255) === (b = $2.to_i) &&
2051
+ (0..255) === (c = $3.to_i) &&
2052
+ (0..255) === (d = $4.to_i)
2053
+ return self.new([a, b, c, d].pack("CCCC"))
2054
+ else
2055
+ raise ArgumentError.new("IPv4 address with invalid value: " + arg)
2056
+ end
2057
+ else
2058
+ raise ArgumentError.new("cannot interpret as IPv4 address: #{arg.inspect}")
2059
+ end
2060
+ end
2061
+
2062
+ def initialize(address) # :nodoc:
2063
+ unless address.kind_of?(String) && address.length == 4
2064
+ raise ArgumentError.new('IPv4 address must be 4 bytes')
2065
+ end
2066
+ @address = address
2067
+ end
2068
+
2069
+ ##
2070
+ # A String representation of this IPv4 address.
2071
+
2072
+ ##
2073
+ # The raw IPv4 address as a String.
2074
+
2075
+ attr_reader :address
2076
+
2077
+ def to_s # :nodoc:
2078
+ return sprintf("%d.%d.%d.%d", *@address.unpack("CCCC"))
2079
+ end
2080
+
2081
+ def inspect # :nodoc:
2082
+ return "#<#{self.class} #{self.to_s}>"
2083
+ end
2084
+
2085
+ ##
2086
+ # Turns this IPv4 address into a Resolv::DNS::Name.
2087
+
2088
+ def to_name
2089
+ return DNS::Name.create(
2090
+ '%d.%d.%d.%d.in-addr.arpa.' % @address.unpack('CCCC').reverse)
2091
+ end
2092
+
2093
+ def ==(other) # :nodoc:
2094
+ return @address == other.address
2095
+ end
2096
+
2097
+ def eql?(other) # :nodoc:
2098
+ return self == other
2099
+ end
2100
+
2101
+ def hash # :nodoc:
2102
+ return @address.hash
2103
+ end
2104
+ end
2105
+
2106
+ ##
2107
+ # A Resolv::DNS IPv6 address.
2108
+
2109
+ class IPv6
2110
+
2111
+ ##
2112
+ # IPv6 address format a:b:c:d:e:f:g:h
2113
+ Regex_8Hex = /\A
2114
+ (?:[0-9A-Fa-f]{1,4}:){7}
2115
+ [0-9A-Fa-f]{1,4}
2116
+ \z/x
2117
+
2118
+ ##
2119
+ # Compressed IPv6 address format a::b
2120
+
2121
+ Regex_CompressedHex = /\A
2122
+ ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::
2123
+ ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)
2124
+ \z/x
2125
+
2126
+ ##
2127
+ # IPv4 mapped IPv6 address format a:b:c:d:e:f:w.x.y.z
2128
+
2129
+ Regex_6Hex4Dec = /\A
2130
+ ((?:[0-9A-Fa-f]{1,4}:){6,6})
2131
+ (\d+)\.(\d+)\.(\d+)\.(\d+)
2132
+ \z/x
2133
+
2134
+ ##
2135
+ # Compressed IPv4 mapped IPv6 address format a::b:w.x.y.z
2136
+
2137
+ Regex_CompressedHex4Dec = /\A
2138
+ ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::
2139
+ ((?:[0-9A-Fa-f]{1,4}:)*)
2140
+ (\d+)\.(\d+)\.(\d+)\.(\d+)
2141
+ \z/x
2142
+
2143
+ ##
2144
+ # A composite IPv6 address Regexp.
2145
+
2146
+ Regex = /
2147
+ (?:#{Regex_8Hex}) |
2148
+ (?:#{Regex_CompressedHex}) |
2149
+ (?:#{Regex_6Hex4Dec}) |
2150
+ (?:#{Regex_CompressedHex4Dec})/x
2151
+
2152
+ ##
2153
+ # Creates a new IPv6 address from +arg+ which may be:
2154
+ #
2155
+ # IPv6:: returns +arg+.
2156
+ # String:: +arg+ must match one of the IPv6::Regex* constants
2157
+
2158
+ def self.create(arg)
2159
+ case arg
2160
+ when IPv6
2161
+ return arg
2162
+ when String
2163
+ address = ''
2164
+ if Regex_8Hex =~ arg
2165
+ arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
2166
+ elsif Regex_CompressedHex =~ arg
2167
+ prefix = $1
2168
+ suffix = $2
2169
+ a1 = ''
2170
+ a2 = ''
2171
+ prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
2172
+ suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
2173
+ omitlen = 16 - a1.length - a2.length
2174
+ address << a1 << "\0" * omitlen << a2
2175
+ elsif Regex_6Hex4Dec =~ arg
2176
+ prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
2177
+ if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
2178
+ prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
2179
+ address << [a, b, c, d].pack('CCCC')
2180
+ else
2181
+ raise ArgumentError.new("not numeric IPv6 address: " + arg)
2182
+ end
2183
+ elsif Regex_CompressedHex4Dec =~ arg
2184
+ prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
2185
+ if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
2186
+ a1 = ''
2187
+ a2 = ''
2188
+ prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
2189
+ suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
2190
+ omitlen = 12 - a1.length - a2.length
2191
+ address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
2192
+ else
2193
+ raise ArgumentError.new("not numeric IPv6 address: " + arg)
2194
+ end
2195
+ else
2196
+ raise ArgumentError.new("not numeric IPv6 address: " + arg)
2197
+ end
2198
+ return IPv6.new(address)
2199
+ else
2200
+ raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
2201
+ end
2202
+ end
2203
+
2204
+ def initialize(address) # :nodoc:
2205
+ unless address.kind_of?(String) && address.length == 16
2206
+ raise ArgumentError.new('IPv6 address must be 16 bytes')
2207
+ end
2208
+ @address = address
2209
+ end
2210
+
2211
+ ##
2212
+ # The raw IPv6 address as a String.
2213
+
2214
+ attr_reader :address
2215
+
2216
+ def to_s # :nodoc:
2217
+ address = sprintf("%X:%X:%X:%X:%X:%X:%X:%X", *@address.unpack("nnnnnnnn"))
2218
+ unless address.sub!(/(^|:)0(:0)+(:|$)/, '::')
2219
+ address.sub!(/(^|:)0(:|$)/, '::')
2220
+ end
2221
+ return address
2222
+ end
2223
+
2224
+ def inspect # :nodoc:
2225
+ return "#<#{self.class} #{self.to_s}>"
2226
+ end
2227
+
2228
+ ##
2229
+ # Turns this IPv6 address into a Resolv::DNS::Name.
2230
+ #--
2231
+ # ip6.arpa should be searched too. [RFC3152]
2232
+
2233
+ def to_name
2234
+ return DNS::Name.new(
2235
+ @address.unpack("H32")[0].split(//).reverse + ['ip6', 'arpa'])
2236
+ end
2237
+
2238
+ def ==(other) # :nodoc:
2239
+ return @address == other.address
2240
+ end
2241
+
2242
+ def eql?(other) # :nodoc:
2243
+ return self == other
2244
+ end
2245
+
2246
+ def hash # :nodoc:
2247
+ return @address.hash
2248
+ end
2249
+ end
2250
+
2251
+ ##
2252
+ # Default resolver to use for Resolv class methods.
2253
+
2254
+ DefaultResolver = self.new
2255
+
2256
+ ##
2257
+ # Address Regexp to use for matching IP addresses.
2258
+
2259
+ AddressRegex = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/
2260
+
2261
+ end
2262
+