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

https://bitbucket.org/freebsd/freebsd-head/ · C · 329 lines · 237 code · 74 blank · 18 comment · 50 complexity · b1df454c5dc7938e681f08ee9f9adefb 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: minfo_14.c,v 1.47 2009/12/04 22:06:37 tbox Exp $ */
  18. /* reviewed: Wed Mar 15 17:45:32 PST 2000 by brister */
  19. #ifndef RDATA_GENERIC_MINFO_14_C
  20. #define RDATA_GENERIC_MINFO_14_C
  21. #define RRTYPE_MINFO_ATTRIBUTES (0)
  22. static inline isc_result_t
  23. fromtext_minfo(ARGS_FROMTEXT) {
  24. isc_token_t token;
  25. dns_name_t name;
  26. isc_buffer_t buffer;
  27. int i;
  28. isc_boolean_t ok;
  29. REQUIRE(type == 14);
  30. UNUSED(type);
  31. UNUSED(rdclass);
  32. UNUSED(callbacks);
  33. for (i = 0; i < 2; i++) {
  34. RETERR(isc_lex_getmastertoken(lexer, &token,
  35. isc_tokentype_string,
  36. ISC_FALSE));
  37. dns_name_init(&name, NULL);
  38. buffer_fromregion(&buffer, &token.value.as_region);
  39. origin = (origin != NULL) ? origin : dns_rootname;
  40. RETTOK(dns_name_fromtext(&name, &buffer, origin,
  41. options, target));
  42. ok = ISC_TRUE;
  43. if ((options & DNS_RDATA_CHECKNAMES) != 0)
  44. ok = dns_name_ismailbox(&name);
  45. if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0)
  46. RETTOK(DNS_R_BADNAME);
  47. if (!ok && callbacks != NULL)
  48. warn_badname(&name, lexer, callbacks);
  49. }
  50. return (ISC_R_SUCCESS);
  51. }
  52. static inline isc_result_t
  53. totext_minfo(ARGS_TOTEXT) {
  54. isc_region_t region;
  55. dns_name_t rmail;
  56. dns_name_t email;
  57. dns_name_t prefix;
  58. isc_boolean_t sub;
  59. REQUIRE(rdata->type == 14);
  60. REQUIRE(rdata->length != 0);
  61. dns_name_init(&rmail, NULL);
  62. dns_name_init(&email, NULL);
  63. dns_name_init(&prefix, NULL);
  64. dns_rdata_toregion(rdata, &region);
  65. dns_name_fromregion(&rmail, &region);
  66. isc_region_consume(&region, rmail.length);
  67. dns_name_fromregion(&email, &region);
  68. isc_region_consume(&region, email.length);
  69. sub = name_prefix(&rmail, tctx->origin, &prefix);
  70. RETERR(dns_name_totext(&prefix, sub, target));
  71. RETERR(str_totext(" ", target));
  72. sub = name_prefix(&email, tctx->origin, &prefix);
  73. return (dns_name_totext(&prefix, sub, target));
  74. }
  75. static inline isc_result_t
  76. fromwire_minfo(ARGS_FROMWIRE) {
  77. dns_name_t rmail;
  78. dns_name_t email;
  79. REQUIRE(type == 14);
  80. UNUSED(type);
  81. UNUSED(rdclass);
  82. dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
  83. dns_name_init(&rmail, NULL);
  84. dns_name_init(&email, NULL);
  85. RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
  86. return (dns_name_fromwire(&email, source, dctx, options, target));
  87. }
  88. static inline isc_result_t
  89. towire_minfo(ARGS_TOWIRE) {
  90. isc_region_t region;
  91. dns_name_t rmail;
  92. dns_name_t email;
  93. dns_offsets_t roffsets;
  94. dns_offsets_t eoffsets;
  95. REQUIRE(rdata->type == 14);
  96. REQUIRE(rdata->length != 0);
  97. dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
  98. dns_name_init(&rmail, roffsets);
  99. dns_name_init(&email, eoffsets);
  100. dns_rdata_toregion(rdata, &region);
  101. dns_name_fromregion(&rmail, &region);
  102. isc_region_consume(&region, name_length(&rmail));
  103. RETERR(dns_name_towire(&rmail, cctx, target));
  104. dns_name_fromregion(&rmail, &region);
  105. isc_region_consume(&region, rmail.length);
  106. return (dns_name_towire(&rmail, cctx, target));
  107. }
  108. static inline int
  109. compare_minfo(ARGS_COMPARE) {
  110. isc_region_t region1;
  111. isc_region_t region2;
  112. dns_name_t name1;
  113. dns_name_t name2;
  114. int order;
  115. REQUIRE(rdata1->type == rdata2->type);
  116. REQUIRE(rdata1->rdclass == rdata2->rdclass);
  117. REQUIRE(rdata1->type == 14);
  118. REQUIRE(rdata1->length != 0);
  119. REQUIRE(rdata2->length != 0);
  120. dns_name_init(&name1, NULL);
  121. dns_name_init(&name2, NULL);
  122. dns_rdata_toregion(rdata1, &region1);
  123. dns_rdata_toregion(rdata2, &region2);
  124. dns_name_fromregion(&name1, &region1);
  125. dns_name_fromregion(&name2, &region2);
  126. order = dns_name_rdatacompare(&name1, &name2);
  127. if (order != 0)
  128. return (order);
  129. isc_region_consume(&region1, name_length(&name1));
  130. isc_region_consume(&region2, name_length(&name2));
  131. dns_name_init(&name1, NULL);
  132. dns_name_init(&name2, NULL);
  133. dns_name_fromregion(&name1, &region1);
  134. dns_name_fromregion(&name2, &region2);
  135. order = dns_name_rdatacompare(&name1, &name2);
  136. return (order);
  137. }
  138. static inline isc_result_t
  139. fromstruct_minfo(ARGS_FROMSTRUCT) {
  140. dns_rdata_minfo_t *minfo = source;
  141. isc_region_t region;
  142. REQUIRE(type == 14);
  143. REQUIRE(source != NULL);
  144. REQUIRE(minfo->common.rdtype == type);
  145. REQUIRE(minfo->common.rdclass == rdclass);
  146. UNUSED(type);
  147. UNUSED(rdclass);
  148. dns_name_toregion(&minfo->rmailbox, &region);
  149. RETERR(isc_buffer_copyregion(target, &region));
  150. dns_name_toregion(&minfo->emailbox, &region);
  151. return (isc_buffer_copyregion(target, &region));
  152. }
  153. static inline isc_result_t
  154. tostruct_minfo(ARGS_TOSTRUCT) {
  155. dns_rdata_minfo_t *minfo = target;
  156. isc_region_t region;
  157. dns_name_t name;
  158. isc_result_t result;
  159. REQUIRE(rdata->type == 14);
  160. REQUIRE(target != NULL);
  161. REQUIRE(rdata->length != 0);
  162. minfo->common.rdclass = rdata->rdclass;
  163. minfo->common.rdtype = rdata->type;
  164. ISC_LINK_INIT(&minfo->common, link);
  165. dns_name_init(&name, NULL);
  166. dns_rdata_toregion(rdata, &region);
  167. dns_name_fromregion(&name, &region);
  168. dns_name_init(&minfo->rmailbox, NULL);
  169. RETERR(name_duporclone(&name, mctx, &minfo->rmailbox));
  170. isc_region_consume(&region, name_length(&name));
  171. dns_name_fromregion(&name, &region);
  172. dns_name_init(&minfo->emailbox, NULL);
  173. result = name_duporclone(&name, mctx, &minfo->emailbox);
  174. if (result != ISC_R_SUCCESS)
  175. goto cleanup;
  176. minfo->mctx = mctx;
  177. return (ISC_R_SUCCESS);
  178. cleanup:
  179. if (mctx != NULL)
  180. dns_name_free(&minfo->rmailbox, mctx);
  181. return (ISC_R_NOMEMORY);
  182. }
  183. static inline void
  184. freestruct_minfo(ARGS_FREESTRUCT) {
  185. dns_rdata_minfo_t *minfo = source;
  186. REQUIRE(source != NULL);
  187. REQUIRE(minfo->common.rdtype == 14);
  188. if (minfo->mctx == NULL)
  189. return;
  190. dns_name_free(&minfo->rmailbox, minfo->mctx);
  191. dns_name_free(&minfo->emailbox, minfo->mctx);
  192. minfo->mctx = NULL;
  193. }
  194. static inline isc_result_t
  195. additionaldata_minfo(ARGS_ADDLDATA) {
  196. REQUIRE(rdata->type == 14);
  197. UNUSED(rdata);
  198. UNUSED(add);
  199. UNUSED(arg);
  200. return (ISC_R_SUCCESS);
  201. }
  202. static inline isc_result_t
  203. digest_minfo(ARGS_DIGEST) {
  204. isc_region_t r;
  205. dns_name_t name;
  206. isc_result_t result;
  207. REQUIRE(rdata->type == 14);
  208. dns_rdata_toregion(rdata, &r);
  209. dns_name_init(&name, NULL);
  210. dns_name_fromregion(&name, &r);
  211. result = dns_name_digest(&name, digest, arg);
  212. if (result != ISC_R_SUCCESS)
  213. return (result);
  214. isc_region_consume(&r, name_length(&name));
  215. dns_name_init(&name, NULL);
  216. dns_name_fromregion(&name, &r);
  217. return (dns_name_digest(&name, digest, arg));
  218. }
  219. static inline isc_boolean_t
  220. checkowner_minfo(ARGS_CHECKOWNER) {
  221. REQUIRE(type == 14);
  222. UNUSED(name);
  223. UNUSED(type);
  224. UNUSED(rdclass);
  225. UNUSED(wildcard);
  226. return (ISC_TRUE);
  227. }
  228. static inline isc_boolean_t
  229. checknames_minfo(ARGS_CHECKNAMES) {
  230. isc_region_t region;
  231. dns_name_t name;
  232. REQUIRE(rdata->type == 14);
  233. UNUSED(owner);
  234. dns_rdata_toregion(rdata, &region);
  235. dns_name_init(&name, NULL);
  236. dns_name_fromregion(&name, &region);
  237. if (!dns_name_ismailbox(&name)) {
  238. if (bad != NULL)
  239. dns_name_clone(&name, bad);
  240. return (ISC_FALSE);
  241. }
  242. isc_region_consume(&region, name_length(&name));
  243. dns_name_fromregion(&name, &region);
  244. if (!dns_name_ismailbox(&name)) {
  245. if (bad != NULL)
  246. dns_name_clone(&name, bad);
  247. return (ISC_FALSE);
  248. }
  249. return (ISC_TRUE);
  250. }
  251. static inline int
  252. casecompare_minfo(ARGS_COMPARE) {
  253. return (compare_minfo(rdata1, rdata2));
  254. }
  255. #endif /* RDATA_GENERIC_MINFO_14_C */