shoesgem 0.1424.0

Sign up to get free protection for your applications and to get access to all the features.
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
+