/contrib/bind9/lib/dns/rdata/generic/ns_2.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 256 lines · 177 code · 61 blank · 18 comment · 37 complexity · 51a84af013a1f6659f30a3c3964e87b4 MD5 · raw file

  1. /*
  2. * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
  3. * Copyright (C) 1998-2001 Internet Software Consortium.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  10. * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  11. * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  12. * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  13. * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  14. * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  15. * PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. /* $Id: ns_2.c,v 1.48 2009/12/04 22:06:37 tbox Exp $ */
  18. /* Reviewed: Wed Mar 15 18:15:00 PST 2000 by bwelling */
  19. #ifndef RDATA_GENERIC_NS_2_C
  20. #define RDATA_GENERIC_NS_2_C
  21. #define RRTYPE_NS_ATTRIBUTES (DNS_RDATATYPEATTR_ZONECUTAUTH)
  22. static inline isc_result_t
  23. fromtext_ns(ARGS_FROMTEXT) {
  24. isc_token_t token;
  25. dns_name_t name;
  26. isc_buffer_t buffer;
  27. isc_boolean_t ok;
  28. REQUIRE(type == 2);
  29. UNUSED(type);
  30. UNUSED(rdclass);
  31. UNUSED(callbacks);
  32. RETERR(isc_lex_getmastertoken(lexer, &token,isc_tokentype_string,
  33. ISC_FALSE));
  34. dns_name_init(&name, NULL);
  35. buffer_fromregion(&buffer, &token.value.as_region);
  36. origin = (origin != NULL) ? origin : dns_rootname;
  37. RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target));
  38. ok = ISC_TRUE;
  39. if ((options & DNS_RDATA_CHECKNAMES) != 0)
  40. ok = dns_name_ishostname(&name, ISC_FALSE);
  41. if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0)
  42. RETTOK(DNS_R_BADNAME);
  43. if (!ok && callbacks != NULL)
  44. warn_badname(&name, lexer, callbacks);
  45. return (ISC_R_SUCCESS);
  46. }
  47. static inline isc_result_t
  48. totext_ns(ARGS_TOTEXT) {
  49. isc_region_t region;
  50. dns_name_t name;
  51. dns_name_t prefix;
  52. isc_boolean_t sub;
  53. REQUIRE(rdata->type == 2);
  54. REQUIRE(rdata->length != 0);
  55. dns_name_init(&name, NULL);
  56. dns_name_init(&prefix, NULL);
  57. dns_rdata_toregion(rdata, &region);
  58. dns_name_fromregion(&name, &region);
  59. sub = name_prefix(&name, tctx->origin, &prefix);
  60. return (dns_name_totext(&prefix, sub, target));
  61. }
  62. static inline isc_result_t
  63. fromwire_ns(ARGS_FROMWIRE) {
  64. dns_name_t name;
  65. REQUIRE(type == 2);
  66. UNUSED(type);
  67. UNUSED(rdclass);
  68. dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
  69. dns_name_init(&name, NULL);
  70. return (dns_name_fromwire(&name, source, dctx, options, target));
  71. }
  72. static inline isc_result_t
  73. towire_ns(ARGS_TOWIRE) {
  74. dns_name_t name;
  75. dns_offsets_t offsets;
  76. isc_region_t region;
  77. REQUIRE(rdata->type == 2);
  78. REQUIRE(rdata->length != 0);
  79. dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
  80. dns_name_init(&name, offsets);
  81. dns_rdata_toregion(rdata, &region);
  82. dns_name_fromregion(&name, &region);
  83. return (dns_name_towire(&name, cctx, target));
  84. }
  85. static inline int
  86. compare_ns(ARGS_COMPARE) {
  87. dns_name_t name1;
  88. dns_name_t name2;
  89. isc_region_t region1;
  90. isc_region_t region2;
  91. REQUIRE(rdata1->type == rdata2->type);
  92. REQUIRE(rdata1->rdclass == rdata2->rdclass);
  93. REQUIRE(rdata1->type == 2);
  94. REQUIRE(rdata1->length != 0);
  95. REQUIRE(rdata2->length != 0);
  96. dns_name_init(&name1, NULL);
  97. dns_name_init(&name2, NULL);
  98. dns_rdata_toregion(rdata1, &region1);
  99. dns_rdata_toregion(rdata2, &region2);
  100. dns_name_fromregion(&name1, &region1);
  101. dns_name_fromregion(&name2, &region2);
  102. return (dns_name_rdatacompare(&name1, &name2));
  103. }
  104. static inline isc_result_t
  105. fromstruct_ns(ARGS_FROMSTRUCT) {
  106. dns_rdata_ns_t *ns = source;
  107. isc_region_t region;
  108. REQUIRE(type == 2);
  109. REQUIRE(source != NULL);
  110. REQUIRE(ns->common.rdtype == type);
  111. REQUIRE(ns->common.rdclass == rdclass);
  112. UNUSED(type);
  113. UNUSED(rdclass);
  114. dns_name_toregion(&ns->name, &region);
  115. return (isc_buffer_copyregion(target, &region));
  116. }
  117. static inline isc_result_t
  118. tostruct_ns(ARGS_TOSTRUCT) {
  119. isc_region_t region;
  120. dns_rdata_ns_t *ns = target;
  121. dns_name_t name;
  122. REQUIRE(rdata->type == 2);
  123. REQUIRE(target != NULL);
  124. REQUIRE(rdata->length != 0);
  125. ns->common.rdclass = rdata->rdclass;
  126. ns->common.rdtype = rdata->type;
  127. ISC_LINK_INIT(&ns->common, link);
  128. dns_name_init(&name, NULL);
  129. dns_rdata_toregion(rdata, &region);
  130. dns_name_fromregion(&name, &region);
  131. dns_name_init(&ns->name, NULL);
  132. RETERR(name_duporclone(&name, mctx, &ns->name));
  133. ns->mctx = mctx;
  134. return (ISC_R_SUCCESS);
  135. }
  136. static inline void
  137. freestruct_ns(ARGS_FREESTRUCT) {
  138. dns_rdata_ns_t *ns = source;
  139. REQUIRE(source != NULL);
  140. if (ns->mctx == NULL)
  141. return;
  142. dns_name_free(&ns->name, ns->mctx);
  143. ns->mctx = NULL;
  144. }
  145. static inline isc_result_t
  146. additionaldata_ns(ARGS_ADDLDATA) {
  147. dns_name_t name;
  148. dns_offsets_t offsets;
  149. isc_region_t region;
  150. REQUIRE(rdata->type == 2);
  151. dns_name_init(&name, offsets);
  152. dns_rdata_toregion(rdata, &region);
  153. dns_name_fromregion(&name, &region);
  154. return ((add)(arg, &name, dns_rdatatype_a));
  155. }
  156. static inline isc_result_t
  157. digest_ns(ARGS_DIGEST) {
  158. isc_region_t r;
  159. dns_name_t name;
  160. REQUIRE(rdata->type == 2);
  161. dns_rdata_toregion(rdata, &r);
  162. dns_name_init(&name, NULL);
  163. dns_name_fromregion(&name, &r);
  164. return (dns_name_digest(&name, digest, arg));
  165. }
  166. static inline isc_boolean_t
  167. checkowner_ns(ARGS_CHECKOWNER) {
  168. REQUIRE(type == 2);
  169. UNUSED(name);
  170. UNUSED(type);
  171. UNUSED(rdclass);
  172. UNUSED(wildcard);
  173. return (ISC_TRUE);
  174. }
  175. static inline isc_boolean_t
  176. checknames_ns(ARGS_CHECKNAMES) {
  177. isc_region_t region;
  178. dns_name_t name;
  179. REQUIRE(rdata->type == 2);
  180. UNUSED(owner);
  181. dns_rdata_toregion(rdata, &region);
  182. dns_name_init(&name, NULL);
  183. dns_name_fromregion(&name, &region);
  184. if (!dns_name_ishostname(&name, ISC_FALSE)) {
  185. if (bad != NULL)
  186. dns_name_clone(&name, bad);
  187. return (ISC_FALSE);
  188. }
  189. return (ISC_TRUE);
  190. }
  191. static inline int
  192. casecompare_ns(ARGS_COMPARE) {
  193. return (compare_ns(rdata1, rdata2));
  194. }
  195. #endif /* RDATA_GENERIC_NS_2_C */