dnsruby 1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (520) hide show
  1. data/EVENTMACHINE +64 -0
  2. data/README +63 -0
  3. data/doc/classes/Dnsruby.html +463 -0
  4. data/doc/classes/Dnsruby/Algorithms.html +171 -0
  5. data/doc/classes/Dnsruby/Classes.html +197 -0
  6. data/doc/classes/Dnsruby/Classes.src/M000209.html +23 -0
  7. data/doc/classes/Dnsruby/Classes.src/M000210.html +19 -0
  8. data/doc/classes/Dnsruby/CodeMapper.html +375 -0
  9. data/doc/classes/Dnsruby/CodeMapper.src/M000186.html +18 -0
  10. data/doc/classes/Dnsruby/CodeMapper.src/M000187.html +33 -0
  11. data/doc/classes/Dnsruby/CodeMapper.src/M000188.html +21 -0
  12. data/doc/classes/Dnsruby/CodeMapper.src/M000189.html +19 -0
  13. data/doc/classes/Dnsruby/CodeMapper.src/M000190.html +19 -0
  14. data/doc/classes/Dnsruby/CodeMapper.src/M000191.html +18 -0
  15. data/doc/classes/Dnsruby/CodeMapper.src/M000192.html +22 -0
  16. data/doc/classes/Dnsruby/CodeMapper.src/M000193.html +22 -0
  17. data/doc/classes/Dnsruby/CodeMapper.src/M000194.html +22 -0
  18. data/doc/classes/Dnsruby/CodeMapper.src/M000195.html +31 -0
  19. data/doc/classes/Dnsruby/CodeMapper.src/M000196.html +19 -0
  20. data/doc/classes/Dnsruby/Config.html +413 -0
  21. data/doc/classes/Dnsruby/Config.src/M000148.html +18 -0
  22. data/doc/classes/Dnsruby/Config.src/M000149.html +19 -0
  23. data/doc/classes/Dnsruby/Config.src/M000150.html +19 -0
  24. data/doc/classes/Dnsruby/Config.src/M000151.html +25 -0
  25. data/doc/classes/Dnsruby/Config.src/M000152.html +21 -0
  26. data/doc/classes/Dnsruby/Config.src/M000153.html +38 -0
  27. data/doc/classes/Dnsruby/Config.src/M000154.html +26 -0
  28. data/doc/classes/Dnsruby/Config.src/M000155.html +22 -0
  29. data/doc/classes/Dnsruby/Config.src/M000156.html +27 -0
  30. data/doc/classes/Dnsruby/Config.src/M000157.html +22 -0
  31. data/doc/classes/Dnsruby/Config.src/M000158.html +21 -0
  32. data/doc/classes/Dnsruby/DNS.html +571 -0
  33. data/doc/classes/Dnsruby/DNS.src/M000258.html +24 -0
  34. data/doc/classes/Dnsruby/DNS.src/M000259.html +18 -0
  35. data/doc/classes/Dnsruby/DNS.src/M000260.html +18 -0
  36. data/doc/classes/Dnsruby/DNS.src/M000261.html +20 -0
  37. data/doc/classes/Dnsruby/DNS.src/M000262.html +19 -0
  38. data/doc/classes/Dnsruby/DNS.src/M000263.html +20 -0
  39. data/doc/classes/Dnsruby/DNS.src/M000264.html +18 -0
  40. data/doc/classes/Dnsruby/DNS.src/M000265.html +19 -0
  41. data/doc/classes/Dnsruby/DNS.src/M000266.html +20 -0
  42. data/doc/classes/Dnsruby/DNS.src/M000267.html +28 -0
  43. data/doc/classes/Dnsruby/DNS.src/M000268.html +19 -0
  44. data/doc/classes/Dnsruby/DNS.src/M000269.html +20 -0
  45. data/doc/classes/Dnsruby/DNS.src/M000270.html +31 -0
  46. data/doc/classes/Dnsruby/DecodeError.html +120 -0
  47. data/doc/classes/Dnsruby/Dnssec.html +287 -0
  48. data/doc/classes/Dnsruby/Dnssec.src/M000249.html +23 -0
  49. data/doc/classes/Dnsruby/Dnssec.src/M000250.html +19 -0
  50. data/doc/classes/Dnsruby/Dnssec.src/M000251.html +90 -0
  51. data/doc/classes/Dnsruby/Dnssec.src/M000252.html +76 -0
  52. data/doc/classes/Dnsruby/EncodeError.html +120 -0
  53. data/doc/classes/Dnsruby/FormErr.html +119 -0
  54. data/doc/classes/Dnsruby/Header.html +501 -0
  55. data/doc/classes/Dnsruby/Header.src/M000231.html +35 -0
  56. data/doc/classes/Dnsruby/Header.src/M000232.html +18 -0
  57. data/doc/classes/Dnsruby/Header.src/M000233.html +18 -0
  58. data/doc/classes/Dnsruby/Header.src/M000234.html +21 -0
  59. data/doc/classes/Dnsruby/Header.src/M000235.html +20 -0
  60. data/doc/classes/Dnsruby/Header.src/M000236.html +32 -0
  61. data/doc/classes/Dnsruby/Header.src/M000237.html +27 -0
  62. data/doc/classes/Dnsruby/Header.src/M000238.html +26 -0
  63. data/doc/classes/Dnsruby/Header.src/M000239.html +47 -0
  64. data/doc/classes/Dnsruby/Header.src/M000240.html +28 -0
  65. data/doc/classes/Dnsruby/Header.src/M000241.html +30 -0
  66. data/doc/classes/Dnsruby/Hosts.html +316 -0
  67. data/doc/classes/Dnsruby/Hosts.src/M000197.html +20 -0
  68. data/doc/classes/Dnsruby/Hosts.src/M000198.html +19 -0
  69. data/doc/classes/Dnsruby/Hosts.src/M000199.html +20 -0
  70. data/doc/classes/Dnsruby/Hosts.src/M000200.html +21 -0
  71. data/doc/classes/Dnsruby/Hosts.src/M000201.html +19 -0
  72. data/doc/classes/Dnsruby/Hosts.src/M000202.html +20 -0
  73. data/doc/classes/Dnsruby/Hosts.src/M000203.html +21 -0
  74. data/doc/classes/Dnsruby/IPv4.html +233 -0
  75. data/doc/classes/Dnsruby/IPv4.src/M000204.html +32 -0
  76. data/doc/classes/Dnsruby/IPv4.src/M000205.html +19 -0
  77. data/doc/classes/Dnsruby/IPv4.src/M000206.html +18 -0
  78. data/doc/classes/Dnsruby/IPv4.src/M000207.html +18 -0
  79. data/doc/classes/Dnsruby/IPv4.src/M000208.html +18 -0
  80. data/doc/classes/Dnsruby/IPv6.html +281 -0
  81. data/doc/classes/Dnsruby/IPv6.src/M000242.html +60 -0
  82. data/doc/classes/Dnsruby/IPv6.src/M000243.html +22 -0
  83. data/doc/classes/Dnsruby/IPv6.src/M000244.html +20 -0
  84. data/doc/classes/Dnsruby/IPv6.src/M000245.html +18 -0
  85. data/doc/classes/Dnsruby/Message.html +803 -0
  86. data/doc/classes/Dnsruby/Message.src/M000119.html +38 -0
  87. data/doc/classes/Dnsruby/Message.src/M000120.html +26 -0
  88. data/doc/classes/Dnsruby/Message.src/M000121.html +22 -0
  89. data/doc/classes/Dnsruby/Message.src/M000122.html +22 -0
  90. data/doc/classes/Dnsruby/Message.src/M000123.html +20 -0
  91. data/doc/classes/Dnsruby/Message.src/M000124.html +20 -0
  92. data/doc/classes/Dnsruby/Message.src/M000125.html +20 -0
  93. data/doc/classes/Dnsruby/Message.src/M000126.html +20 -0
  94. data/doc/classes/Dnsruby/Message.src/M000127.html +18 -0
  95. data/doc/classes/Dnsruby/Message.src/M000128.html +20 -0
  96. data/doc/classes/Dnsruby/Message.src/M000129.html +23 -0
  97. data/doc/classes/Dnsruby/Message.src/M000130.html +30 -0
  98. data/doc/classes/Dnsruby/Message.src/M000131.html +20 -0
  99. data/doc/classes/Dnsruby/Message.src/M000132.html +18 -0
  100. data/doc/classes/Dnsruby/Message.src/M000133.html +56 -0
  101. data/doc/classes/Dnsruby/Message.src/M000134.html +35 -0
  102. data/doc/classes/Dnsruby/Message.src/M000135.html +46 -0
  103. data/doc/classes/Dnsruby/Message/Section.html +160 -0
  104. data/doc/classes/Dnsruby/Message/Section.src/M000141.html +29 -0
  105. data/doc/classes/Dnsruby/Message/Section.src/M000142.html +30 -0
  106. data/doc/classes/Dnsruby/MetaTypes.html +136 -0
  107. data/doc/classes/Dnsruby/Modes.html +171 -0
  108. data/doc/classes/Dnsruby/NXDomain.html +119 -0
  109. data/doc/classes/Dnsruby/Name.html +330 -0
  110. data/doc/classes/Dnsruby/Name.src/M000104.html +28 -0
  111. data/doc/classes/Dnsruby/Name.src/M000105.html +20 -0
  112. data/doc/classes/Dnsruby/Name.src/M000106.html +18 -0
  113. data/doc/classes/Dnsruby/Name.src/M000107.html +21 -0
  114. data/doc/classes/Dnsruby/Name.src/M000108.html +22 -0
  115. data/doc/classes/Dnsruby/Name.src/M000109.html +18 -0
  116. data/doc/classes/Dnsruby/Name/Label.html +300 -0
  117. data/doc/classes/Dnsruby/Name/Label.src/M000110.html +21 -0
  118. data/doc/classes/Dnsruby/Name/Label.src/M000111.html +18 -0
  119. data/doc/classes/Dnsruby/Name/Label.src/M000112.html +22 -0
  120. data/doc/classes/Dnsruby/Name/Label.src/M000113.html +18 -0
  121. data/doc/classes/Dnsruby/Name/Label.src/M000114.html +18 -0
  122. data/doc/classes/Dnsruby/Name/Label.src/M000115.html +18 -0
  123. data/doc/classes/Dnsruby/Name/Label.src/M000116.html +18 -0
  124. data/doc/classes/Dnsruby/Name/Label.src/M000117.html +18 -0
  125. data/doc/classes/Dnsruby/Name/Label.src/M000118.html +18 -0
  126. data/doc/classes/Dnsruby/NotImp.html +119 -0
  127. data/doc/classes/Dnsruby/OpCode.html +146 -0
  128. data/doc/classes/Dnsruby/OtherResolvError.html +119 -0
  129. data/doc/classes/Dnsruby/QTypes.html +146 -0
  130. data/doc/classes/Dnsruby/Question.html +301 -0
  131. data/doc/classes/Dnsruby/Question.src/M000226.html +47 -0
  132. data/doc/classes/Dnsruby/Question.src/M000227.html +18 -0
  133. data/doc/classes/Dnsruby/Question.src/M000228.html +18 -0
  134. data/doc/classes/Dnsruby/Question.src/M000229.html +32 -0
  135. data/doc/classes/Dnsruby/Question.src/M000230.html +18 -0
  136. data/doc/classes/Dnsruby/RCode.html +211 -0
  137. data/doc/classes/Dnsruby/RR.html +648 -0
  138. data/doc/classes/Dnsruby/RR.src/M000001.html +18 -0
  139. data/doc/classes/Dnsruby/RR.src/M000002.html +22 -0
  140. data/doc/classes/Dnsruby/RR.src/M000003.html +18 -0
  141. data/doc/classes/Dnsruby/RR.src/M000004.html +18 -0
  142. data/doc/classes/Dnsruby/RR.src/M000005.html +26 -0
  143. data/doc/classes/Dnsruby/RR.src/M000006.html +18 -0
  144. data/doc/classes/Dnsruby/RR.src/M000007.html +36 -0
  145. data/doc/classes/Dnsruby/RR.src/M000008.html +100 -0
  146. data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
  147. data/doc/classes/Dnsruby/RR.src/M000010.html +18 -0
  148. data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
  149. data/doc/classes/Dnsruby/RR.src/M000012.html +29 -0
  150. data/doc/classes/Dnsruby/RR.src/M000013.html +24 -0
  151. data/doc/classes/Dnsruby/RR/ANY.html +133 -0
  152. data/doc/classes/Dnsruby/RR/CERT.html +180 -0
  153. data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
  154. data/doc/classes/Dnsruby/RR/CNAME.html +151 -0
  155. data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
  156. data/doc/classes/Dnsruby/RR/DNSKEY.html +422 -0
  157. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000044.html +20 -0
  158. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000045.html +21 -0
  159. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000046.html +28 -0
  160. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000047.html +22 -0
  161. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000048.html +18 -0
  162. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000049.html +22 -0
  163. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000050.html +18 -0
  164. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000051.html +26 -0
  165. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000052.html +38 -0
  166. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000053.html +45 -0
  167. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000054.html +21 -0
  168. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000055.html +24 -0
  169. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000056.html +32 -0
  170. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000057.html +24 -0
  171. data/doc/classes/Dnsruby/RR/DS.html +286 -0
  172. data/doc/classes/Dnsruby/RR/DS.src/M000039.html +22 -0
  173. data/doc/classes/Dnsruby/RR/DS.src/M000040.html +28 -0
  174. data/doc/classes/Dnsruby/RR/DS.src/M000041.html +24 -0
  175. data/doc/classes/Dnsruby/RR/DS.src/M000042.html +28 -0
  176. data/doc/classes/Dnsruby/RR/DS.src/M000043.html +36 -0
  177. data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
  178. data/doc/classes/Dnsruby/RR/DomainName.src/M000083.html +18 -0
  179. data/doc/classes/Dnsruby/RR/Generic.html +133 -0
  180. data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
  181. data/doc/classes/Dnsruby/RR/IN.html +155 -0
  182. data/doc/classes/Dnsruby/RR/IN/A.html +200 -0
  183. data/doc/classes/Dnsruby/RR/IN/A.src/M000017.html +18 -0
  184. data/doc/classes/Dnsruby/RR/IN/A.src/M000018.html +18 -0
  185. data/doc/classes/Dnsruby/RR/IN/A.src/M000019.html +18 -0
  186. data/doc/classes/Dnsruby/RR/IN/AAAA.html +139 -0
  187. data/doc/classes/Dnsruby/RR/IN/AFSDB.html +145 -0
  188. data/doc/classes/Dnsruby/RR/IN/PX.html +143 -0
  189. data/doc/classes/Dnsruby/RR/IN/SRV.html +238 -0
  190. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000014.html +29 -0
  191. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +26 -0
  192. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +22 -0
  193. data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
  194. data/doc/classes/Dnsruby/RR/IN/WKS.src/M000020.html +20 -0
  195. data/doc/classes/Dnsruby/RR/ISDN.html +155 -0
  196. data/doc/classes/Dnsruby/RR/LOC.html +395 -0
  197. data/doc/classes/Dnsruby/RR/LOC.src/M000025.html +32 -0
  198. data/doc/classes/Dnsruby/RR/LOC.src/M000026.html +23 -0
  199. data/doc/classes/Dnsruby/RR/LOC.src/M000027.html +25 -0
  200. data/doc/classes/Dnsruby/RR/LOC.src/M000028.html +21 -0
  201. data/doc/classes/Dnsruby/RR/LOC.src/M000029.html +20 -0
  202. data/doc/classes/Dnsruby/RR/LOC.src/M000030.html +23 -0
  203. data/doc/classes/Dnsruby/RR/MB.html +150 -0
  204. data/doc/classes/Dnsruby/RR/MG.html +150 -0
  205. data/doc/classes/Dnsruby/RR/MINFO.html +156 -0
  206. data/doc/classes/Dnsruby/RR/MR.html +150 -0
  207. data/doc/classes/Dnsruby/RR/MX.html +155 -0
  208. data/doc/classes/Dnsruby/RR/NAPTR.html +190 -0
  209. data/doc/classes/Dnsruby/RR/NS.html +151 -0
  210. data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
  211. data/doc/classes/Dnsruby/RR/NSAP.src/M000093.html +19 -0
  212. data/doc/classes/Dnsruby/RR/NSAP.src/M000094.html +19 -0
  213. data/doc/classes/Dnsruby/RR/NSAP.src/M000095.html +22 -0
  214. data/doc/classes/Dnsruby/RR/NSAP.src/M000096.html +31 -0
  215. data/doc/classes/Dnsruby/RR/NSEC.html +301 -0
  216. data/doc/classes/Dnsruby/RR/NSEC.src/M000031.html +19 -0
  217. data/doc/classes/Dnsruby/RR/NSEC.src/M000032.html +18 -0
  218. data/doc/classes/Dnsruby/RR/NSEC.src/M000033.html +34 -0
  219. data/doc/classes/Dnsruby/RR/NSEC.src/M000034.html +18 -0
  220. data/doc/classes/Dnsruby/RR/NSEC.src/M000035.html +71 -0
  221. data/doc/classes/Dnsruby/RR/NSEC.src/M000036.html +18 -0
  222. data/doc/classes/Dnsruby/RR/NSEC.src/M000037.html +80 -0
  223. data/doc/classes/Dnsruby/RR/NSEC.src/M000038.html +23 -0
  224. data/doc/classes/Dnsruby/RR/NSEC3.html +366 -0
  225. data/doc/classes/Dnsruby/RR/NSEC3.src/M000085.html +28 -0
  226. data/doc/classes/Dnsruby/RR/NSEC3.src/M000086.html +18 -0
  227. data/doc/classes/Dnsruby/RR/NSEC3.src/M000087.html +18 -0
  228. data/doc/classes/Dnsruby/RR/NSEC3.src/M000088.html +22 -0
  229. data/doc/classes/Dnsruby/RR/NSEC3.src/M000089.html +18 -0
  230. data/doc/classes/Dnsruby/RR/NSEC3.src/M000090.html +21 -0
  231. data/doc/classes/Dnsruby/RR/NSEC3.src/M000091.html +21 -0
  232. data/doc/classes/Dnsruby/RR/NSEC3.src/M000092.html +29 -0
  233. data/doc/classes/Dnsruby/RR/NSEC3PARAM.html +279 -0
  234. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000077.html +28 -0
  235. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000078.html +18 -0
  236. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000079.html +22 -0
  237. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000080.html +21 -0
  238. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000081.html +25 -0
  239. data/doc/classes/Dnsruby/RR/PTR.html +132 -0
  240. data/doc/classes/Dnsruby/RR/RP.html +183 -0
  241. data/doc/classes/Dnsruby/RR/RP.src/M000082.html +19 -0
  242. data/doc/classes/Dnsruby/RR/RRSIG.html +357 -0
  243. data/doc/classes/Dnsruby/RR/RRSIG.src/M000097.html +26 -0
  244. data/doc/classes/Dnsruby/RR/RRSIG.src/M000098.html +28 -0
  245. data/doc/classes/Dnsruby/RR/RRSIG.src/M000099.html +23 -0
  246. data/doc/classes/Dnsruby/RR/RRSIG.src/M000100.html +23 -0
  247. data/doc/classes/Dnsruby/RR/RRSIG.src/M000101.html +46 -0
  248. data/doc/classes/Dnsruby/RR/RRSIG.src/M000102.html +50 -0
  249. data/doc/classes/Dnsruby/RR/RRSIG.src/M000103.html +27 -0
  250. data/doc/classes/Dnsruby/RR/RT.html +155 -0
  251. data/doc/classes/Dnsruby/RR/SOA.html +233 -0
  252. data/doc/classes/Dnsruby/RR/SOA.src/M000066.html +24 -0
  253. data/doc/classes/Dnsruby/RR/SOA.src/M000067.html +27 -0
  254. data/doc/classes/Dnsruby/RR/SPF.html +138 -0
  255. data/doc/classes/Dnsruby/RR/TKEY.html +313 -0
  256. data/doc/classes/Dnsruby/RR/TKEY.src/M000021.html +19 -0
  257. data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +29 -0
  258. data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +21 -0
  259. data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +29 -0
  260. data/doc/classes/Dnsruby/RR/TSIG.html +524 -0
  261. data/doc/classes/Dnsruby/RR/TSIG.src/M000068.html +24 -0
  262. data/doc/classes/Dnsruby/RR/TSIG.src/M000069.html +32 -0
  263. data/doc/classes/Dnsruby/RR/TSIG.src/M000070.html +54 -0
  264. data/doc/classes/Dnsruby/RR/TSIG.src/M000071.html +121 -0
  265. data/doc/classes/Dnsruby/RR/TSIG.src/M000072.html +33 -0
  266. data/doc/classes/Dnsruby/RR/TSIG.src/M000073.html +25 -0
  267. data/doc/classes/Dnsruby/RR/TSIG.src/M000074.html +36 -0
  268. data/doc/classes/Dnsruby/RR/TSIG.src/M000075.html +22 -0
  269. data/doc/classes/Dnsruby/RR/TSIG.src/M000076.html +29 -0
  270. data/doc/classes/Dnsruby/RR/TXT.html +233 -0
  271. data/doc/classes/Dnsruby/RR/TXT.src/M000061.html +18 -0
  272. data/doc/classes/Dnsruby/RR/TXT.src/M000062.html +18 -0
  273. data/doc/classes/Dnsruby/RR/TXT.src/M000063.html +20 -0
  274. data/doc/classes/Dnsruby/RR/TXT.src/M000064.html +27 -0
  275. data/doc/classes/Dnsruby/RR/TXT.src/M000065.html +25 -0
  276. data/doc/classes/Dnsruby/RR/X25.html +203 -0
  277. data/doc/classes/Dnsruby/RR/X25.src/M000058.html +18 -0
  278. data/doc/classes/Dnsruby/RR/X25.src/M000059.html +18 -0
  279. data/doc/classes/Dnsruby/RR/X25.src/M000060.html +22 -0
  280. data/doc/classes/Dnsruby/RRSet.html +404 -0
  281. data/doc/classes/Dnsruby/RRSet.src/M000211.html +23 -0
  282. data/doc/classes/Dnsruby/RRSet.src/M000212.html +18 -0
  283. data/doc/classes/Dnsruby/RRSet.src/M000213.html +18 -0
  284. data/doc/classes/Dnsruby/RRSet.src/M000214.html +47 -0
  285. data/doc/classes/Dnsruby/RRSet.src/M000215.html +42 -0
  286. data/doc/classes/Dnsruby/RRSet.src/M000216.html +18 -0
  287. data/doc/classes/Dnsruby/RRSet.src/M000217.html +20 -0
  288. data/doc/classes/Dnsruby/RRSet.src/M000218.html +18 -0
  289. data/doc/classes/Dnsruby/RRSet.src/M000219.html +18 -0
  290. data/doc/classes/Dnsruby/RRSet.src/M000220.html +18 -0
  291. data/doc/classes/Dnsruby/RRSet.src/M000221.html +18 -0
  292. data/doc/classes/Dnsruby/RRSet.src/M000222.html +22 -0
  293. data/doc/classes/Dnsruby/RRSet.src/M000223.html +18 -0
  294. data/doc/classes/Dnsruby/RRSet.src/M000224.html +22 -0
  295. data/doc/classes/Dnsruby/RRSet.src/M000225.html +18 -0
  296. data/doc/classes/Dnsruby/Refused.html +119 -0
  297. data/doc/classes/Dnsruby/Resolv.html +401 -0
  298. data/doc/classes/Dnsruby/Resolv.src/M000159.html +18 -0
  299. data/doc/classes/Dnsruby/Resolv.src/M000160.html +18 -0
  300. data/doc/classes/Dnsruby/Resolv.src/M000161.html +18 -0
  301. data/doc/classes/Dnsruby/Resolv.src/M000162.html +18 -0
  302. data/doc/classes/Dnsruby/Resolv.src/M000163.html +18 -0
  303. data/doc/classes/Dnsruby/Resolv.src/M000164.html +18 -0
  304. data/doc/classes/Dnsruby/Resolv.src/M000165.html +18 -0
  305. data/doc/classes/Dnsruby/Resolv.src/M000166.html +19 -0
  306. data/doc/classes/Dnsruby/Resolv.src/M000167.html +20 -0
  307. data/doc/classes/Dnsruby/Resolv.src/M000168.html +29 -0
  308. data/doc/classes/Dnsruby/Resolv.src/M000169.html +19 -0
  309. data/doc/classes/Dnsruby/Resolv.src/M000170.html +20 -0
  310. data/doc/classes/Dnsruby/Resolv.src/M000171.html +25 -0
  311. data/doc/classes/Dnsruby/ResolvError.html +117 -0
  312. data/doc/classes/Dnsruby/ResolvTimeout.html +117 -0
  313. data/doc/classes/Dnsruby/Resolver.html +1055 -0
  314. data/doc/classes/Dnsruby/Resolver.src/M000271.html +21 -0
  315. data/doc/classes/Dnsruby/Resolver.src/M000272.html +27 -0
  316. data/doc/classes/Dnsruby/Resolver.src/M000273.html +28 -0
  317. data/doc/classes/Dnsruby/Resolver.src/M000274.html +18 -0
  318. data/doc/classes/Dnsruby/Resolver.src/M000275.html +51 -0
  319. data/doc/classes/Dnsruby/Resolver.src/M000276.html +21 -0
  320. data/doc/classes/Dnsruby/Resolver.src/M000277.html +22 -0
  321. data/doc/classes/Dnsruby/Resolver.src/M000278.html +18 -0
  322. data/doc/classes/Dnsruby/Resolver.src/M000279.html +20 -0
  323. data/doc/classes/Dnsruby/Resolver.src/M000280.html +19 -0
  324. data/doc/classes/Dnsruby/Resolver.src/M000281.html +19 -0
  325. data/doc/classes/Dnsruby/Resolver.src/M000282.html +19 -0
  326. data/doc/classes/Dnsruby/Resolver.src/M000283.html +19 -0
  327. data/doc/classes/Dnsruby/Resolver.src/M000284.html +19 -0
  328. data/doc/classes/Dnsruby/Resolver.src/M000285.html +19 -0
  329. data/doc/classes/Dnsruby/Resolver.src/M000286.html +19 -0
  330. data/doc/classes/Dnsruby/Resolver.src/M000287.html +19 -0
  331. data/doc/classes/Dnsruby/Resolver.src/M000288.html +19 -0
  332. data/doc/classes/Dnsruby/Resolver.src/M000289.html +19 -0
  333. data/doc/classes/Dnsruby/Resolver.src/M000290.html +19 -0
  334. data/doc/classes/Dnsruby/Resolver.src/M000291.html +19 -0
  335. data/doc/classes/Dnsruby/Resolver.src/M000292.html +26 -0
  336. data/doc/classes/Dnsruby/Resolver.src/M000293.html +18 -0
  337. data/doc/classes/Dnsruby/Resolver.src/M000294.html +23 -0
  338. data/doc/classes/Dnsruby/Resolver.src/M000295.html +18 -0
  339. data/doc/classes/Dnsruby/ServFail.html +119 -0
  340. data/doc/classes/Dnsruby/SingleResolver.html +674 -0
  341. data/doc/classes/Dnsruby/SingleResolver.src/M000172.html +18 -0
  342. data/doc/classes/Dnsruby/SingleResolver.src/M000173.html +24 -0
  343. data/doc/classes/Dnsruby/SingleResolver.src/M000174.html +36 -0
  344. data/doc/classes/Dnsruby/SingleResolver.src/M000175.html +18 -0
  345. data/doc/classes/Dnsruby/SingleResolver.src/M000176.html +19 -0
  346. data/doc/classes/Dnsruby/SingleResolver.src/M000177.html +50 -0
  347. data/doc/classes/Dnsruby/SingleResolver.src/M000178.html +19 -0
  348. data/doc/classes/Dnsruby/SingleResolver.src/M000179.html +21 -0
  349. data/doc/classes/Dnsruby/SingleResolver.src/M000180.html +25 -0
  350. data/doc/classes/Dnsruby/SingleResolver.src/M000181.html +54 -0
  351. data/doc/classes/Dnsruby/SingleResolver.src/M000182.html +27 -0
  352. data/doc/classes/Dnsruby/SingleResolver.src/M000183.html +27 -0
  353. data/doc/classes/Dnsruby/SingleResolver.src/M000184.html +35 -0
  354. data/doc/classes/Dnsruby/SingleResolver.src/M000185.html +21 -0
  355. data/doc/classes/Dnsruby/TheLog.html +196 -0
  356. data/doc/classes/Dnsruby/TheLog.src/M000246.html +20 -0
  357. data/doc/classes/Dnsruby/TheLog.src/M000247.html +20 -0
  358. data/doc/classes/Dnsruby/TheLog.src/M000248.html +20 -0
  359. data/doc/classes/Dnsruby/Types.html +436 -0
  360. data/doc/classes/Dnsruby/Update.html +368 -0
  361. data/doc/classes/Dnsruby/Update.src/M000253.html +32 -0
  362. data/doc/classes/Dnsruby/Update.src/M000254.html +36 -0
  363. data/doc/classes/Dnsruby/Update.src/M000255.html +32 -0
  364. data/doc/classes/Dnsruby/Update.src/M000256.html +41 -0
  365. data/doc/classes/Dnsruby/Update.src/M000257.html +34 -0
  366. data/doc/classes/Dnsruby/VerifyError.html +119 -0
  367. data/doc/classes/Dnsruby/ZoneTransfer.html +300 -0
  368. data/doc/classes/Dnsruby/ZoneTransfer.src/M000143.html +18 -0
  369. data/doc/classes/Dnsruby/ZoneTransfer.src/M000144.html +24 -0
  370. data/doc/classes/Dnsruby/ZoneTransfer.src/M000145.html +35 -0
  371. data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +200 -0
  372. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000146.html +19 -0
  373. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000147.html +19 -0
  374. data/doc/created.rid +1 -0
  375. data/doc/files/lib/Dnsruby/Config_rb.html +101 -0
  376. data/doc/files/lib/Dnsruby/DNS_rb.html +110 -0
  377. data/doc/files/lib/Dnsruby/Hosts_rb.html +108 -0
  378. data/doc/files/lib/Dnsruby/Resolver_rb.html +109 -0
  379. data/doc/files/lib/Dnsruby/SingleResolver_rb.html +108 -0
  380. data/doc/files/lib/Dnsruby/TheLog_rb.html +110 -0
  381. data/doc/files/lib/Dnsruby/code_mapper_rb.html +101 -0
  382. data/doc/files/lib/Dnsruby/dnssec_rb.html +107 -0
  383. data/doc/files/lib/Dnsruby/event_machine_interface_rb.html +108 -0
  384. data/doc/files/lib/Dnsruby/ipv4_rb.html +101 -0
  385. data/doc/files/lib/Dnsruby/ipv6_rb.html +101 -0
  386. data/doc/files/lib/Dnsruby/message_rb.html +109 -0
  387. data/doc/files/lib/Dnsruby/name_rb.html +101 -0
  388. data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +101 -0
  389. data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +101 -0
  390. data/doc/files/lib/Dnsruby/resource/A_rb.html +101 -0
  391. data/doc/files/lib/Dnsruby/resource/CERT_rb.html +101 -0
  392. data/doc/files/lib/Dnsruby/resource/DNSKEY_rb.html +101 -0
  393. data/doc/files/lib/Dnsruby/resource/DS_rb.html +101 -0
  394. data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +101 -0
  395. data/doc/files/lib/Dnsruby/resource/IN_rb.html +112 -0
  396. data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +101 -0
  397. data/doc/files/lib/Dnsruby/resource/LOC_rb.html +101 -0
  398. data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +101 -0
  399. data/doc/files/lib/Dnsruby/resource/MX_rb.html +101 -0
  400. data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +101 -0
  401. data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +101 -0
  402. data/doc/files/lib/Dnsruby/resource/NSEC3PARAM_rb.html +101 -0
  403. data/doc/files/lib/Dnsruby/resource/NSEC3_rb.html +101 -0
  404. data/doc/files/lib/Dnsruby/resource/NSEC_rb.html +101 -0
  405. data/doc/files/lib/Dnsruby/resource/OPT_rb.html +101 -0
  406. data/doc/files/lib/Dnsruby/resource/PX_rb.html +101 -0
  407. data/doc/files/lib/Dnsruby/resource/RP_rb.html +101 -0
  408. data/doc/files/lib/Dnsruby/resource/RRSIG_rb.html +101 -0
  409. data/doc/files/lib/Dnsruby/resource/RT_rb.html +101 -0
  410. data/doc/files/lib/Dnsruby/resource/SOA_rb.html +101 -0
  411. data/doc/files/lib/Dnsruby/resource/SPF_rb.html +101 -0
  412. data/doc/files/lib/Dnsruby/resource/SRV_rb.html +101 -0
  413. data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +101 -0
  414. data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +114 -0
  415. data/doc/files/lib/Dnsruby/resource/TXT_rb.html +108 -0
  416. data/doc/files/lib/Dnsruby/resource/X25_rb.html +101 -0
  417. data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +101 -0
  418. data/doc/files/lib/Dnsruby/resource/generic_rb.html +131 -0
  419. data/doc/files/lib/Dnsruby/resource/resource_rb.html +110 -0
  420. data/doc/files/lib/Dnsruby/select_thread_rb.html +111 -0
  421. data/doc/files/lib/Dnsruby/update_rb.html +101 -0
  422. data/doc/files/lib/Dnsruby/zone_transfer_rb.html +101 -0
  423. data/doc/files/lib/dnsruby_rb.html +118 -0
  424. data/doc/fr_class_index.html +108 -0
  425. data/doc/fr_file_index.html +75 -0
  426. data/doc/fr_method_index.html +321 -0
  427. data/doc/index.html +24 -0
  428. data/lib/Dnsruby/Config.rb +363 -0
  429. data/lib/Dnsruby/DNS.rb +293 -0
  430. data/lib/Dnsruby/Hosts.rb +126 -0
  431. data/lib/Dnsruby/Resolver.rb +999 -0
  432. data/lib/Dnsruby/SingleResolver.rb +493 -0
  433. data/lib/Dnsruby/TheLog.rb +60 -0
  434. data/lib/Dnsruby/code_mapper.rb +165 -0
  435. data/lib/Dnsruby/dnssec.rb +357 -0
  436. data/lib/Dnsruby/event_machine_interface.rb +264 -0
  437. data/lib/Dnsruby/ipv4.rb +74 -0
  438. data/lib/Dnsruby/ipv6.rb +144 -0
  439. data/lib/Dnsruby/message.rb +961 -0
  440. data/lib/Dnsruby/name.rb +332 -0
  441. data/lib/Dnsruby/resource/A.rb +56 -0
  442. data/lib/Dnsruby/resource/AAAA.rb +54 -0
  443. data/lib/Dnsruby/resource/AFSDB.rb +68 -0
  444. data/lib/Dnsruby/resource/CERT.rb +89 -0
  445. data/lib/Dnsruby/resource/DNSKEY.rb +242 -0
  446. data/lib/Dnsruby/resource/DS.rb +162 -0
  447. data/lib/Dnsruby/resource/HINFO.rb +52 -0
  448. data/lib/Dnsruby/resource/IN.rb +70 -0
  449. data/lib/Dnsruby/resource/ISDN.rb +54 -0
  450. data/lib/Dnsruby/resource/LOC.rb +255 -0
  451. data/lib/Dnsruby/resource/MINFO.rb +70 -0
  452. data/lib/Dnsruby/resource/MX.rb +66 -0
  453. data/lib/Dnsruby/resource/NAPTR.rb +90 -0
  454. data/lib/Dnsruby/resource/NSAP.rb +172 -0
  455. data/lib/Dnsruby/resource/NSEC.rb +243 -0
  456. data/lib/Dnsruby/resource/NSEC3.rb +173 -0
  457. data/lib/Dnsruby/resource/NSEC3PARAM.rb +120 -0
  458. data/lib/Dnsruby/resource/OPT.rb +210 -0
  459. data/lib/Dnsruby/resource/PX.rb +71 -0
  460. data/lib/Dnsruby/resource/RP.rb +67 -0
  461. data/lib/Dnsruby/resource/RRSIG.rb +256 -0
  462. data/lib/Dnsruby/resource/RT.rb +67 -0
  463. data/lib/Dnsruby/resource/SOA.rb +95 -0
  464. data/lib/Dnsruby/resource/SPF.rb +29 -0
  465. data/lib/Dnsruby/resource/SRV.rb +112 -0
  466. data/lib/Dnsruby/resource/TKEY.rb +163 -0
  467. data/lib/Dnsruby/resource/TSIG.rb +584 -0
  468. data/lib/Dnsruby/resource/TXT.rb +76 -0
  469. data/lib/Dnsruby/resource/X25.rb +53 -0
  470. data/lib/Dnsruby/resource/domain_name.rb +54 -0
  471. data/lib/Dnsruby/resource/generic.rb +151 -0
  472. data/lib/Dnsruby/resource/resource.rb +561 -0
  473. data/lib/Dnsruby/select_thread.rb +449 -0
  474. data/lib/Dnsruby/update.rb +262 -0
  475. data/lib/Dnsruby/zone_transfer.rb +332 -0
  476. data/lib/dnsruby.rb +512 -0
  477. data/test/custom.txt +4 -0
  478. data/test/resolv.conf +4 -0
  479. data/test/tc_axfr.rb +32 -0
  480. data/test/tc_dns.rb +230 -0
  481. data/test/tc_dnskey.rb +52 -0
  482. data/test/tc_dnsruby.rb +42 -0
  483. data/test/tc_dnssec.rb +88 -0
  484. data/test/tc_ds.rb +38 -0
  485. data/test/tc_escapedchars.rb +484 -0
  486. data/test/tc_event_machine_deferrable.rb +85 -0
  487. data/test/tc_event_machine_res.rb +174 -0
  488. data/test/tc_event_machine_single_res.rb +101 -0
  489. data/test/tc_event_machine_soak.rb +98 -0
  490. data/test/tc_header.rb +104 -0
  491. data/test/tc_misc.rb +139 -0
  492. data/test/tc_name.rb +53 -0
  493. data/test/tc_nsec.rb +36 -0
  494. data/test/tc_nsec3.rb +63 -0
  495. data/test/tc_nsec3param.rb +30 -0
  496. data/test/tc_packet.rb +179 -0
  497. data/test/tc_packet_unique_push.rb +102 -0
  498. data/test/tc_question.rb +51 -0
  499. data/test/tc_res_config.rb +92 -0
  500. data/test/tc_res_env.rb +51 -0
  501. data/test/tc_res_file.rb +42 -0
  502. data/test/tc_res_opt.rb +187 -0
  503. data/test/tc_resolver.rb +184 -0
  504. data/test/tc_rr-opt.rb +82 -0
  505. data/test/tc_rr-txt.rb +137 -0
  506. data/test/tc_rr-unknown.rb +99 -0
  507. data/test/tc_rr.rb +258 -0
  508. data/test/tc_rrset.rb +58 -0
  509. data/test/tc_rrsig.rb +32 -0
  510. data/test/tc_single_resolver.rb +169 -0
  511. data/test/tc_soak.rb +200 -0
  512. data/test/tc_soak_base.rb +136 -0
  513. data/test/tc_tcp.rb +35 -0
  514. data/test/tc_tkey.rb +75 -0
  515. data/test/tc_tsig.rb +237 -0
  516. data/test/tc_update.rb +215 -0
  517. data/test/ts_dnsruby.rb +17 -0
  518. data/test/ts_offline.rb +42 -0
  519. data/test/ts_online.rb +107 -0
  520. metadata +627 -0
@@ -0,0 +1,961 @@
1
+ #--
2
+ #Copyright 2007 Nominet UK
3
+ #
4
+ #Licensed under the Apache License, Version 2.0 (the "License");
5
+ #you may not use this file except in compliance with the License.
6
+ #You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ #Unless required by applicable law or agreed to in writing, software
11
+ #distributed under the License is distributed on an "AS IS" BASIS,
12
+ #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ #See the License for the specific language governing permissions and
14
+ #limitations under the License.
15
+ #++
16
+ require 'Dnsruby/name'
17
+ require 'Dnsruby/resource/resource'
18
+ module Dnsruby
19
+ #===Defines a DNS packet.
20
+ #
21
+ #RFC 1035 Section 4.1, RFC 2136 Section 2, RFC 2845
22
+ #
23
+ #===Sections
24
+ #Message objects have five sections:
25
+ #
26
+ #* The header section, a Dnsruby::Header object.
27
+ #
28
+ # msg.header=Header.new(...)
29
+ # header = msg.header
30
+ #
31
+ #* The question section, an array of Dnsruby::Question objects.
32
+ #
33
+ # msg.add_question(Question.new(domain, type, klass))
34
+ # msg.each_question do |question| .... end
35
+ #
36
+ #* The answer section, an array of Dnsruby::RR objects.
37
+ #
38
+ # msg.add_answer(RR.create({:name => "a2.example.com",
39
+ # :type => "A", :address => "10.0.0.2"}))
40
+ # msg.each_answer {|answer| ... }
41
+ #
42
+ #* The authority section, an array of Dnsruby::RR objects.
43
+ #
44
+ # msg.add_authority(rr)
45
+ # msg.each_authority {|rr| ... }
46
+ #
47
+ #* The additional section, an array of Dnsruby::RR objects.
48
+ #
49
+ # msg.add_additional(rr)
50
+ # msg.each_additional {|rr| ... }
51
+ #
52
+ #In addition, each_resource iterates the answer, additional
53
+ #and authority sections :
54
+ #
55
+ # msg.each_resource {|rr| ... }
56
+ #
57
+ #===Packet format encoding
58
+ #
59
+ # Dnsruby::Message#encode
60
+ # Dnsruby::Message::decode(data)
61
+ class Message
62
+ class Section < Array
63
+ # Return the rrset of the specified type in this section
64
+ def rrset(type, klass=Classes::IN)
65
+ rrs = select{|rr|
66
+ (type_ok = rr.type==type)
67
+ if (rr.type == Types.RRSIG)
68
+ type_ok = (rr.type_covered == type)
69
+ end
70
+ type_ok && rr.klass == klass
71
+ }
72
+ rrset = RRSet.new
73
+ rrs.each do |rr|
74
+ rrset.add(rr)
75
+ end
76
+ return rrset
77
+ end
78
+
79
+ # Return an array of all the rrsets in the section
80
+ def rrsets
81
+ ret = []
82
+ each do |rr|
83
+ next if (rr.type == Types.OPT)
84
+ found_rrset = false
85
+ ret.each do |rrset|
86
+ found_rrset = rrset.add(rr)
87
+ break if found_rrset
88
+ end
89
+ if (!found_rrset)
90
+ ret.push(RRSet.new(rr))
91
+ end
92
+ end
93
+ return ret
94
+ end
95
+ end
96
+ #Create a new Message. Takes optional name, type and class
97
+ #
98
+ #type defaults to A, and klass defaults to IN
99
+ #
100
+ #* Dnsruby::Message.new("example.com") # defaults to A, IN
101
+ #* Dnsruby::Message.new("example.com", 'AAAA')
102
+ #* Dnsruby::Message.new("example.com", Dnsruby::Types.PTR, "HS")
103
+ #
104
+ def initialize(*args)
105
+ @header = Header.new()
106
+ @question = Section.new
107
+ @answer = Section.new
108
+ @authority = Section.new
109
+ @additional = Section.new
110
+ @tsigstate = :Unsigned
111
+ @signing = false
112
+ @tsigkey = nil
113
+ @answerfrom = nil
114
+ type = Types.A
115
+ klass = Classes.IN
116
+ if (args.length > 0)
117
+ name = args[0]
118
+ if (args.length > 1)
119
+ type = Types.new(args[1])
120
+ if (args.length > 2)
121
+ klass = Classes.new(args[2])
122
+ end
123
+ end
124
+ add_question(name, type, klass)
125
+ end
126
+ end
127
+
128
+ #The question section, an array of Dnsruby::Question objects.
129
+ attr_reader :question
130
+
131
+ #The answer section, an array of Dnsruby::RR objects.
132
+ attr_reader :answer
133
+ #The authority section, an array of Dnsruby::RR objects.
134
+ attr_reader :authority
135
+ #The additional section, an array of Dnsruby::RR objects.
136
+ attr_reader :additional
137
+ #The header section, a Dnsruby::Header object.
138
+ attr_accessor :header
139
+
140
+ #If this Message is a response from a server, then answerfrom contains the address of the server
141
+ attr_accessor :answerfrom
142
+
143
+ #If this Message is a response from a server, then answersize contains the size of the response
144
+ attr_accessor :answersize
145
+
146
+ #If this message has been verified using a TSIG RR then tsigerror contains
147
+ #the error code returned by the TSIG verification. The error will be an RCode
148
+ attr_accessor :tsigerror
149
+
150
+ #Can be
151
+ #* :Unsigned - the default state
152
+ #* :Signed - the outgoing message has been signed
153
+ #* :Verified - the incoming message has been verified
154
+ #* :Intermediate - the incoming message is an intermediate envelope in a TCP session
155
+ #in which only every 100th envelope must be signed
156
+ #* :Failed - the incoming response failed verification
157
+ attr_accessor :tsigstate
158
+
159
+ #--
160
+ attr_accessor :tsigstart
161
+ #++
162
+
163
+ def ==(other)
164
+ ret = false
165
+ if (other.kind_of?Message)
166
+ ret = @header == other.header &&
167
+ @question == other.question &&
168
+ @answer == other.answer &&
169
+ @authority == other.authority &&
170
+ @additional == other.additional
171
+ end
172
+ return ret
173
+ end
174
+
175
+ # # Return the rrset of the specified type in the section
176
+ # def rrset(type, klass=Classes::IN)
177
+ # [@answer, @authority, @additional].each do |section|
178
+ # if ((rrset = section.rrset(type, klass)).length > 0)
179
+ # return rrset
180
+ # end
181
+ # end
182
+ # return nil
183
+ # end
184
+
185
+ # Return a hash, with the section as key, and the RRSets in that
186
+ # section as the data : {section => section_rrs}
187
+ def section_rrsets
188
+ ret = {}
189
+ ["answer", "authority", "additional"].each do |section|
190
+ ret[section] = self.send(section).rrsets
191
+ end
192
+ return ret
193
+ end
194
+
195
+ #Add a new Question to the Message. Takes either a Question,
196
+ #or a name, and an optional type and class.
197
+ #
198
+ #* msg.add_question(Question.new("example.com", 'MX'))
199
+ #* msg.add_question("example.com") # defaults to Types.A, Classes.IN
200
+ #* msg.add_question("example.com", Types.LOC)
201
+ def add_question(question, type=Types.A, klass=Classes.IN)
202
+ if (!question.kind_of?Question)
203
+ question = Question.new(question, type, klass)
204
+ end
205
+ @question << question
206
+ @header.qdcount = @question.length
207
+ end
208
+
209
+ def each_question
210
+ @question.each {|rec|
211
+ yield rec
212
+ }
213
+ end
214
+
215
+
216
+ def add_answer(rr) #:nodoc: all
217
+ if (!@answer.include?rr)
218
+ @answer << rr
219
+ @header.ancount = @answer.length
220
+ end
221
+ end
222
+
223
+ def each_answer
224
+ @answer.each {|rec|
225
+ yield rec
226
+ }
227
+ end
228
+
229
+ def add_authority(rr) #:nodoc: all
230
+ if (!@authority.include?rr)
231
+ @authority << rr
232
+ @header.nscount = @authority.length
233
+ end
234
+ end
235
+
236
+ def each_authority
237
+ @authority.each {|rec|
238
+ yield rec
239
+ }
240
+ end
241
+
242
+ def add_additional(rr) #:nodoc: all
243
+ if (!@additional.include?rr)
244
+ @additional << rr
245
+ @header.arcount = @additional.length
246
+ end
247
+ end
248
+
249
+ def each_additional
250
+ @additional.each {|rec|
251
+ yield rec
252
+ }
253
+ end
254
+
255
+ #Yields each section (question, answer, authority, additional)
256
+ def each_section
257
+ [@answer, @authority, @additional].each {|section| yield section}
258
+ end
259
+
260
+ #Calls each_answer, each_authority, each_additional
261
+ def each_resource
262
+ each_answer {|rec| yield rec}
263
+ each_authority {|rec| yield rec}
264
+ each_additional {|rec| yield rec}
265
+ end
266
+
267
+ # Returns the TSIG record from the ADDITIONAL section, if one is present.
268
+ def tsig
269
+ if (@additional.last)
270
+ if (@additional.last.rr_type == Types.TSIG)
271
+ return @additional.last
272
+ end
273
+ end
274
+ return nil
275
+ end
276
+
277
+ #Sets the TSIG to sign this message with. Can either be a Dnsruby::RR::TSIG
278
+ #object, or it can be a (name, key) tuple, or it can be a hash which takes
279
+ #Dnsruby::RR::TSIG attributes (e.g. name, key, fudge, etc.)
280
+ def set_tsig(*args)
281
+ if (args.length == 1)
282
+ if (args[0].instance_of?RR::TSIG)
283
+ @tsigkey = args[0]
284
+ elsif (args[0].instance_of?Hash)
285
+ @tsigkey = RR.create({:type=>'TSIG', :klass=>'ANY'}.merge(args[0]))
286
+ else
287
+ raise ArgumentError.new("Wrong type of argument to Dnsruby::Message#set_tsig - should be TSIG or Hash")
288
+ end
289
+ elsif (args.length == 2)
290
+ @tsigkey = RR.create({:type=>'TSIG', :klass=>'ANY', :name=>args[0], :key=>args[1]})
291
+ else
292
+ raise ArgumentError.new("Wrong number of arguments to Dnsruby::Message#set_tsig")
293
+ end
294
+ end
295
+
296
+ #Was this message signed by a TSIG?
297
+ def signed?
298
+ return (@tsigstate == :Signed ||
299
+ @tsigstate == :Verified ||
300
+ @tsigstate == :Failed)
301
+ end
302
+
303
+ #If this message was signed by a TSIG, was the TSIG verified?
304
+ def verified?
305
+ return (@tsigstate == :Verified)
306
+ end
307
+
308
+ def to_s
309
+ retval = "";
310
+
311
+ if (@answerfrom != nil && @answerfrom != "")
312
+ retval = retval + ";; Answer received from #{@answerfrom} (#{@answersize} bytes)\n;;\n";
313
+ end
314
+
315
+ retval = retval + ";; HEADER SECTION\n";
316
+ retval = retval + @header.to_s;
317
+ retval = retval + "\n";
318
+
319
+ # @TODO@ OPT pseudosection? EDNS flags, udpsize
320
+
321
+ section = (@header.opcode == OpCode.UPDATE) ? "ZONE" : "QUESTION";
322
+ retval = retval + ";; #{section} SECTION (#{@header.qdcount} record#{@header.qdcount == 1 ? '' : 's'})\n";
323
+ each_question { |qr|
324
+ retval = retval + ";; #{qr.to_s}\n";
325
+ }
326
+
327
+ retval = retval + "\n";
328
+ section = (@header.opcode == OpCode.UPDATE) ? "PREREQUISITE" : "ANSWER";
329
+ retval = retval + ";; #{section} SECTION (#{@header.ancount} record#{@header.ancount == 1 ? '' : 's'})\n";
330
+ each_answer { |rr|
331
+ retval = retval + rr.to_s + "\n";
332
+ }
333
+
334
+ retval = retval + "\n";
335
+ section = (@header.opcode == OpCode.UPDATE) ? "UPDATE" : "AUTHORITY";
336
+ retval = retval + ";; #{section} SECTION (#{@header.nscount} record#{@header.nscount == 1 ? '' : 's'})\n";
337
+ each_authority { |rr|
338
+ retval = retval + rr.to_s + "\n";
339
+ }
340
+
341
+ retval = retval + "\n";
342
+ retval = retval + ";; ADDITIONAL SECTION (#{@header.arcount} record#{@header.arcount == 1 ? '' : 's'})\n";
343
+ each_additional { |rr|
344
+ retval = retval + rr.to_s+ "\n";
345
+ }
346
+
347
+ return retval;
348
+ end
349
+
350
+ #Signs the message. If used with no arguments, then the message must have already
351
+ #been set (set_tsig). Otherwise, the arguments can either be a Dnsruby::RR::TSIG
352
+ #object, or a (name, key) tuple, or a hash which takes
353
+ #Dnsruby::RR::TSIG attributes (e.g. name, key, fudge, etc.)
354
+ #
355
+ #NOTE that this method should only be called by the resolver, rather than the
356
+ #client code. To use signing from the client, call Dnsruby::Resolver#tsig=
357
+ def sign!(*args) #:nodoc: all
358
+ if (args.length > 0)
359
+ set_tsig(*args)
360
+ sign!
361
+ else
362
+ if ((@tsigkey) && @tsigstate == :Unsigned)
363
+ @tsigkey.apply(self)
364
+ end
365
+ end
366
+ end
367
+
368
+ #Return the encoded form of the message
369
+ # If there is a TSIG record present and the record has not been signed
370
+ # then sign it
371
+ def encode
372
+ if ((@tsigkey) && @tsigstate == :Unsigned && !@signing)
373
+ @signing = true
374
+ sign!
375
+ @signing = false
376
+ end
377
+ return MessageEncoder.new {|msg|
378
+ header = @header
379
+ header.encode(msg)
380
+ @question.each {|q|
381
+ msg.put_name(q.qname)
382
+ msg.put_pack('nn', q.qtype.code, q.qclass.code)
383
+ }
384
+ [@answer, @authority, @additional].each {|rr|
385
+ rr.each { |r|
386
+ msg.put_rr(r)
387
+ }
388
+ }
389
+ }.to_s
390
+ end
391
+
392
+ #Decode the encoded message
393
+ def Message.decode(m)
394
+ o = Message.new()
395
+ MessageDecoder.new(m) {|msg|
396
+ o.header = Header.new(msg)
397
+ o.header.qdcount.times {
398
+ question = msg.get_question
399
+ o.question << question
400
+ }
401
+ o.header.ancount.times {
402
+ rr = msg.get_rr
403
+ o.answer << rr
404
+ }
405
+ o.header.nscount.times {
406
+ rr = msg.get_rr
407
+ o.authority << rr
408
+ }
409
+ o.header.arcount.times { |count|
410
+ start = msg.index
411
+ rr = msg.get_rr
412
+ if (rr.type == Types.TSIG)
413
+ if (count!=o.header.arcount-1)
414
+ TheLog.Error("Incoming message has TSIG record before last record")
415
+ raise DecodeError.new("TSIG record present before last record")
416
+ end
417
+ o.tsigstart = start # needed for TSIG verification
418
+ end
419
+ o.additional << rr
420
+ }
421
+ }
422
+ return o
423
+ end
424
+
425
+ #In dynamic update packets, the question section is known as zone and
426
+ #specifies the zone to be updated.
427
+ alias :zone :question
428
+ alias :add_zone :add_question
429
+ alias :each_zone :each_question
430
+ #In dynamic update packets, the answer section is known as pre or
431
+ #prerequisite and specifies the RRs or RRsets which must or
432
+ #must not preexist.
433
+ alias :pre :answer
434
+ alias :add_pre :add_answer
435
+ alias :each_pre :each_answer
436
+ #In dynamic update packets, the answer section is known as pre or
437
+ #prerequisite and specifies the RRs or RRsets which must or
438
+ #must not preexist.
439
+ alias :prerequisite :pre
440
+ alias :add_prerequisite :add_pre
441
+ alias :each_prerequisite :each_pre
442
+ #In dynamic update packets, the authority section is known as update and
443
+ #specifies the RRs or RRsets to be added or delted.
444
+ alias :update :authority
445
+ alias :add_update :add_authority
446
+ alias :each_update :each_authority
447
+
448
+ end
449
+
450
+ #The header portion of a DNS packet
451
+ #
452
+ #RFC 1035 Section 4.1.1
453
+ class Header
454
+ MAX_ID = 65535
455
+
456
+ # The header ID
457
+ attr_accessor :id
458
+
459
+ #The query response flag
460
+ attr_accessor :qr
461
+
462
+ #Authoritative answer flag
463
+ attr_accessor :aa
464
+
465
+ #Truncated flag
466
+ attr_accessor :tc
467
+
468
+ #Recursion Desired flag
469
+ attr_accessor :rd
470
+
471
+ #The Checking Disabled flag
472
+ attr_accessor :cd
473
+
474
+ #The Authenticated Data flag
475
+ attr_accessor :ad
476
+
477
+ #Relevant in DNSSEC context.
478
+ #
479
+ #(The AD bit is only set on answers where signatures have been
480
+ #cryptographically verified or the server is authoritative for the data
481
+ #and is allowed to set the bit by policy.)
482
+ attr_accessor :ad
483
+
484
+ #The query response flag
485
+ attr_accessor :qr
486
+
487
+ #Recursion available flag
488
+ attr_accessor :ra
489
+
490
+ #Query response code
491
+ attr_reader :rcode
492
+
493
+ # The header opcode
494
+ attr_reader :opcode
495
+
496
+ #The number of records in the question section of the message
497
+ attr_accessor :qdcount
498
+ #The number of records in the authoriy section of the message
499
+ attr_accessor :nscount
500
+ #The number of records in the answer section of the message
501
+ attr_accessor :ancount
502
+ #The number of records in the additional record section og the message
503
+ attr_accessor :arcount
504
+
505
+ def initialize(*args)
506
+ if (args.length == 0)
507
+ @id = rand(MAX_ID)
508
+ @qr = false
509
+ @opcode=OpCode.Query
510
+ @aa = false
511
+ @ad=false
512
+ @tc = false
513
+ @rd = false # recursion desired
514
+ @ra = false # recursion available
515
+ @cd=false
516
+ @rcode=RCode.NoError
517
+ @qdcount = 0
518
+ @nscount = 0
519
+ @ancount = 0
520
+ @arcount = 0
521
+ elsif (args.length == 1)
522
+ decode(args[0])
523
+ end
524
+ end
525
+
526
+ def opcode=(op)
527
+ @opcode = OpCode.new(op)
528
+ end
529
+
530
+ def rcode=(rcode)
531
+ @rcode = RCode.new(rcode)
532
+ end
533
+
534
+ def Header.new_from_data(data)
535
+ header = Header.new
536
+ MessageDecoder.new(data) {|msg|
537
+ header.decode(msg)}
538
+ return header
539
+ end
540
+
541
+ def data
542
+ return MessageEncoder.new {|msg|
543
+ self.encode(msg)
544
+ }.to_s
545
+ end
546
+
547
+ def encode(msg)
548
+ msg.put_pack('nnnnnn',
549
+ @id,
550
+ (@qr ? 1:0) << 15 |
551
+ (@opcode.code & 15) << 11 |
552
+ (@aa ? 1:0) << 10 |
553
+ (@tc ? 1:0) << 9 |
554
+ (@rd ? 1:0) << 8 |
555
+ (@ra ? 1:0) << 7 |
556
+ (@ad ? 1:0) << 5 |
557
+ (@cd ? 1:0) << 4 |
558
+ (@rcode.code & 15),
559
+ @qdcount,
560
+ @ancount,
561
+ @nscount,
562
+ @arcount)
563
+ end
564
+
565
+ def Header.decrement_arcount_encoded(bytes)
566
+ header = Header.new
567
+ header_end = 0
568
+ MessageDecoder.new(bytes) {|msg|
569
+ header.decode(msg)
570
+ header_end = msg.index
571
+ }
572
+ header.arcount = header.arcount - 1
573
+ bytes[0,header_end]=MessageEncoder.new {|msg|
574
+ header.encode(msg)}.to_s
575
+ return bytes
576
+ end
577
+
578
+ def ==(other)
579
+ return @qr == other.qr &&
580
+ @opcode == other.opcode &&
581
+ @aa == other.aa &&
582
+ @tc == other.tc &&
583
+ @rd == other.rd &&
584
+ @ra == other.ra &&
585
+ @cd == other.cd &&
586
+ @ad == other.ad &&
587
+ @rcode == other.rcode
588
+ end
589
+
590
+ def to_s
591
+ retval = ";; id = #{@id}\n";
592
+
593
+ if (@opcode == OpCode::Update)
594
+ retval += ";; qr = #{@qr} " +\
595
+ "opcode = #{@opcode.string} "+\
596
+ "rcode = #{@rcode.string}\n";
597
+
598
+ retval += ";; zocount = #{@qdcount} "+\
599
+ "prcount = #{@ancount} " +\
600
+ "upcount = #{@nscount} " +\
601
+ "adcount = #{@arcount}\n";
602
+ else
603
+ retval += ";; qr = #{@qr} " +\
604
+ "opcode = #{@opcode.string} " +\
605
+ "aa = #{@aa} " +\
606
+ "tc = #{@tc} " +\
607
+ "rd = #{@rd}\n";
608
+
609
+ retval += ";; ra = #{@ra} " +\
610
+ "ad = #{@ad} " +\
611
+ "cd = #{@cd} " +\
612
+ "rcode = #{@rcode.string}\n";
613
+
614
+ retval += ";; qdcount = #{@qdcount} " +\
615
+ "ancount = #{@ancount} " +\
616
+ "nscount = #{@nscount} " +\
617
+ "arcount = #{@arcount}\n";
618
+ end
619
+
620
+ return retval;
621
+ end
622
+
623
+ def decode(msg)
624
+ @id, flag, @qdcount, @ancount, @nscount, @arcount =
625
+ msg.get_unpack('nnnnnn')
626
+ @qr = (((flag >> 15)&1)==1)?true:false
627
+ @opcode = OpCode.new((flag >> 11) & 15)
628
+ @aa = (((flag >> 10)&1)==1)?true:false
629
+ @tc = (((flag >> 9)&1)==1)?true:false
630
+ @rd = (((flag >> 8)&1)==1)?true:false
631
+ @ra = (((flag >> 7)&1)==1)?true:false
632
+ @ad = (((flag >> 5)&1)==1)?true:false
633
+ @cd = (((flag >> 4)&1)==1)?true:false
634
+ @rcode = RCode.new(flag & 15)
635
+ end
636
+
637
+ def get_exception
638
+ exception = nil
639
+ if (@rcode==RCode.NXDOMAIN)
640
+ exception = NXDomain.new
641
+ elsif (@rcode==RCode.SERVFAIL)
642
+ exception = ServFail.new
643
+ elsif (@rcode==RCode.FORMERR)
644
+ exception = FormErr.new
645
+ elsif (@rcode==RCode.NOTIMP)
646
+ exception = NotImp.new
647
+ elsif (@rcode==RCode.REFUSED)
648
+ exception = Refused.new
649
+ end
650
+ return exception
651
+ end
652
+
653
+ alias zocount qdcount
654
+ alias zocount= qdcount=
655
+
656
+ alias prcount ancount
657
+ alias prcount= ancount=
658
+
659
+ alias upcount nscount
660
+ alias upcount= nscount=
661
+
662
+ alias adcount arcount
663
+ alias adcount= arcount=
664
+
665
+ end
666
+
667
+ class MessageDecoder #:nodoc: all
668
+ attr_reader :index
669
+ def initialize(data)
670
+ @data = data
671
+ @index = 0
672
+ @limit = data.length
673
+ yield self
674
+ end
675
+
676
+ def has_remaining
677
+ return @limit-@index > 0
678
+ end
679
+
680
+ def get_length16
681
+ len, = self.get_unpack('n')
682
+ save_limit = @limit
683
+ @limit = @index + len
684
+ d = yield(len)
685
+ if @index < @limit
686
+ raise DecodeError.new("junk exists")
687
+ elsif @limit < @index
688
+ raise DecodeError.new("limit exceeded")
689
+ end
690
+ @limit = save_limit
691
+ return d
692
+ end
693
+
694
+ def get_bytes(len = @limit - @index)
695
+ d = @data[@index, len]
696
+ @index += len
697
+ return d
698
+ end
699
+
700
+ def get_unpack(template)
701
+ len = 0
702
+ template.each_byte {|byte|
703
+ case byte
704
+ when ?c, ?C
705
+ len += 1
706
+ when ?h, ?H
707
+ len += 1
708
+ when ?n
709
+ len += 2
710
+ when ?N
711
+ len += 4
712
+ when ?*
713
+ len = @limit-@index
714
+ else
715
+ raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
716
+ end
717
+ }
718
+ raise DecodeError.new("limit exceeded") if @limit < @index + len
719
+ arr = @data.unpack("@#{@index}#{template}")
720
+ @index += len
721
+ return arr
722
+ end
723
+
724
+ def get_string
725
+ len = @data[@index]
726
+ raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
727
+ d = @data[@index + 1, len]
728
+ @index += 1 + len
729
+ return d
730
+ end
731
+
732
+ def get_string_list
733
+ strings = []
734
+ while @index < @limit
735
+ strings << self.get_string
736
+ end
737
+ strings
738
+ end
739
+
740
+ def get_name
741
+ return Name.new(self.get_labels)
742
+ end
743
+
744
+ def get_labels(limit=nil)
745
+ limit = @index if !limit || @index < limit
746
+ d = []
747
+ while true
748
+ case @data[@index]
749
+ when 0
750
+ @index += 1
751
+ return d
752
+ when 192..255
753
+ idx = self.get_unpack('n')[0] & 0x3fff
754
+ if limit <= idx
755
+ raise DecodeError.new("non-backward name pointer")
756
+ end
757
+ save_index = @index
758
+ @index = idx
759
+ d += self.get_labels(limit)
760
+ @index = save_index
761
+ return d
762
+ else
763
+ d << self.get_label
764
+ end
765
+ end
766
+ return d
767
+ end
768
+
769
+ def get_label
770
+ return Name::Label.new(Name::decode(self.get_string))
771
+ end
772
+
773
+ def get_question
774
+ name = self.get_name
775
+ type, klass = self.get_unpack("nn")
776
+ q = Question.new(name, type, klass)
777
+ return q
778
+ end
779
+
780
+ def get_rr
781
+ name = self.get_name
782
+ type, klass, ttl = self.get_unpack('nnN')
783
+ klass = Classes.new(klass)
784
+ typeclass = RR.get_class(type, klass)
785
+ # @TODO@ Trap decode errors here, and somehow mark the record as bad.
786
+ # Need some way to represent raw data only
787
+ rec = self.get_length16 {typeclass.decode_rdata(self)}
788
+ rec.name=name
789
+ rec.ttl=ttl
790
+ rec.type = type
791
+ rec.klass = klass
792
+ return rec
793
+ end
794
+ end
795
+
796
+ class MessageEncoder #:nodoc: all
797
+ def initialize
798
+ @data = ''
799
+ @names = {}
800
+ yield self
801
+ end
802
+
803
+ def to_s
804
+ return @data
805
+ end
806
+
807
+ def put_bytes(d)
808
+ @data << d
809
+ end
810
+
811
+ def put_pack(template, *d)
812
+ @data << d.pack(template)
813
+ end
814
+
815
+ def put_length16
816
+ length_index = @data.length
817
+ @data << "\0\0"
818
+ data_start = @data.length
819
+ yield
820
+ data_end = @data.length
821
+ @data[length_index, 2] = [data_end - data_start].pack("n")
822
+ end
823
+
824
+ def put_string(d)
825
+ self.put_pack("C", d.length)
826
+ @data << d
827
+ end
828
+
829
+ def put_string_list(ds)
830
+ ds.each {|d|
831
+ self.put_string(d)
832
+ }
833
+ end
834
+
835
+ def put_rr(rr, canonical=false)
836
+ # RFC4034 Section 6.2
837
+ put_name(rr.name, canonical)
838
+ put_pack("nnN", rr.type.code, rr.klass.code, rr.ttl)
839
+ put_length16 {rr.encode_rdata(self, canonical)}
840
+ end
841
+
842
+ def put_name(d, canonical=false)
843
+ if (canonical)
844
+ d = d.downcase
845
+ end
846
+ put_labels(d.to_a, canonical)
847
+ end
848
+
849
+ def put_labels(d, do_canonical)
850
+ d.each_index {|i|
851
+ domain = d[i..-1].join(".")
852
+ if (!do_canonical && (idx = @names[domain]))
853
+ self.put_pack("n", 0xc000 | idx)
854
+ return
855
+ else
856
+ @names[domain] = @data.length
857
+ first = d[i]
858
+ self.put_label(first)
859
+ end
860
+ }
861
+ @data << "\0"
862
+ end
863
+
864
+
865
+ def put_label(d)
866
+ s, = Name.encode(d)
867
+ raise RuntimeError, "length of #{s} is #{s.string.length} (larger than 63 octets)" if s.string.length > 63
868
+ self.put_string(s.string)
869
+ end
870
+ end
871
+
872
+ #A Dnsruby::Question object represents a record in the
873
+ #question section of a DNS packet.
874
+ #
875
+ #RFC 1035 Section 4.1.2
876
+ class Question
877
+ # The Question name
878
+ attr_reader :qname
879
+ # The Question type
880
+ attr_reader :qtype
881
+ # The Question class
882
+ attr_reader :qclass
883
+
884
+ #Creates a question object from the domain, type, and class passed
885
+ #as arguments.
886
+ #
887
+ #If a String is passed in, a Name, IPv4 or IPv6 object is created.
888
+ #
889
+ #If an IPv4 or IPv6 object is used then the type is set to PTR.
890
+ def initialize(*args)
891
+ if (args.length > 0)
892
+ @qtype = Types.A
893
+ if (args.length > 1)
894
+ @qtype = Types.new(args[1])
895
+ @qclass = Classes.IN
896
+ if (args.length > 2)
897
+ @qclass = Classes.new(args[2])
898
+ end
899
+ end
900
+ else
901
+ raise ArgumentError.new("Must pass at least a name!")
902
+ end
903
+ # If the name looks like an IP address then do an appropriate
904
+ # PTR query.
905
+ @qname=args[0]
906
+ case @qname
907
+ when IPv4::Regex
908
+ @qname = IPv4.create(@qname).to_name
909
+ @qtype = Types.PTR
910
+ when IPv6::Regex
911
+ @qname = IPv6.create(@qname).to_name
912
+ @qtype = Types.PTR
913
+ when Name
914
+ when IPv6
915
+ @qtype = Types.PTR
916
+ when IPv4
917
+ @qtype = Types.PTR
918
+ else
919
+ @qname = Name.create(@qname)
920
+ end
921
+ end
922
+
923
+ def qtype=(qtype)
924
+ @qtype = Types.new(qtype)
925
+ end
926
+
927
+ def qclass=(qclass)
928
+ @qclass = Classes.new(qclass)
929
+ end
930
+
931
+ def qname=(qname)
932
+ case qname
933
+ when IPv4::Regex
934
+ @qname = IPv4.create(qname).to_name
935
+ @qtype = Types.PTR
936
+ when IPv6::Regex
937
+ @qname = IPv6.create(qname).to_name
938
+ @qtype = Types.PTR
939
+ when Name
940
+ when IPv6
941
+ @qtype = Types.PTR
942
+ when IPv4
943
+ @qtype = Types.PTR
944
+ else
945
+ @qname = Name.create(qname)
946
+ end
947
+ end
948
+
949
+ #Returns a string representation of the question record.
950
+ def to_s
951
+ return "#{@qname}.\t#{@qclass.string}\t#{@qtype.string}";
952
+ end
953
+
954
+ # For Updates, the qname field is redefined to zname (RFC2136, section 2.3)
955
+ alias zname qname
956
+ # For Updates, the qtype field is redefined to ztype (RFC2136, section 2.3)
957
+ alias ztype qtype
958
+ # For Updates, the qclass field is redefined to zclass (RFC2136, section 2.3)
959
+ alias zclass qclass
960
+ end
961
+ end