a_1.c revision 499b34cea04a46823d003d4c0520c8b03e8513cb
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 1998-2001 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * copyright notice and this permission notice appear in all copies.
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews *
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
89b117b7560a7efae552539bf4a56e4b62fbac38Bob Halley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
89b117b7560a7efae552539bf4a56e4b62fbac38Bob Halley * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence */
364a82f7c25b62967678027043425201a5e5171aBob Halley
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews/* $Id: a_1.c,v 1.42 2001/01/09 21:55:03 bwelling Exp $ */
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
a2b97d054fd267ea5e40264700c779f0951a75f7Mark Andrews/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
7b4e52d119674756ee145677c37531975cf52736David Lawrence
09f22ac5b09e70bc526015f37168ba33e21ea91fDavid Lawrence#ifndef RDATA_IN_1_A_1_C
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews#define RDATA_IN_1_A_1_C
92ef1a9b9dbd48ecb507b42ac62c15afefdaf838David Lawrence
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <string.h>
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
92ef1a9b9dbd48ecb507b42ac62c15afefdaf838David Lawrence#include <isc/net.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
1ef8965366d91e02a4672c35a187d30aa4a4c72cMark Andrews#define RRTYPE_A_ATTRIBUTES (0)
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaramanstatic inline isc_result_t
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaramanfromtext_in_a(ARGS_FROMTEXT) {
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman isc_token_t token;
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman struct in_addr addr;
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman isc_region_t region;
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman REQUIRE(type == 1);
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman REQUIRE(rdclass == 1);
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman UNUSED(origin);
1ef8965366d91e02a4672c35a187d30aa4a4c72cMark Andrews UNUSED(downcase);
1ef8965366d91e02a4672c35a187d30aa4a4c72cMark Andrews UNUSED(rdclass);
1ef8965366d91e02a4672c35a187d30aa4a4c72cMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff ISC_FALSE));
a231769eaae9add23b16124388e1d474fb488873David Lawrence
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews if (inet_aton(token.value.as_pointer, &addr) != 1)
c569a0e4d518bf30be1b2ba9cc3592fe470e9822Mark Andrews return (DNS_R_BADDOTTEDQUAD);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews isc_buffer_availableregion(target, &region);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews if (region.length < 4)
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews return (ISC_R_NOSPACE);
575737b964590103f60542849d4536b5ccd4eb3cBrian Wellington memcpy(region.base, &addr, 4);
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman isc_buffer_add(target, 4);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews return (ISC_R_SUCCESS);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff}
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrewsstatic inline isc_result_t
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrewstotext_in_a(ARGS_TOTEXT) {
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews isc_region_t region;
575737b964590103f60542849d4536b5ccd4eb3cBrian Wellington
575737b964590103f60542849d4536b5ccd4eb3cBrian Wellington REQUIRE(rdata->type == 1);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(rdata->rdclass == 1);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(rdata->length == 4);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman UNUSED(tctx);
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman isc_buffer_availableregion(target, &region);
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman if (inet_ntop(AF_INET, rdata->data,
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman (char *)region.base, region.length) == NULL)
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman return (ISC_R_NOSPACE);
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman isc_buffer_add(target, strlen((char *)region.base));
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman return (ISC_R_SUCCESS);
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman}
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaramanstatic inline isc_result_t
575737b964590103f60542849d4536b5ccd4eb3cBrian Wellingtonfromwire_in_a(ARGS_FROMWIRE) {
575737b964590103f60542849d4536b5ccd4eb3cBrian Wellington isc_region_t sregion;
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman isc_region_t tregion;
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(type == 1);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(rdclass == 1);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews UNUSED(dctx);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews UNUSED(downcase);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews UNUSED(rdclass);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews isc_buffer_activeregion(source, &sregion);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews isc_buffer_availableregion(target, &tregion);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews if (sregion.length < 4)
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews return (ISC_R_UNEXPECTEDEND);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews if (tregion.length < 4)
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews return (ISC_R_NOSPACE);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews memcpy(tregion.base, sregion.base, 4);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews isc_buffer_forward(source, 4);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews isc_buffer_add(target, 4);
bfd4b9e11aa9e8c2b43022a6b7a896b26bd5d7a0Witold Krecicki return (ISC_R_SUCCESS);
bfd4b9e11aa9e8c2b43022a6b7a896b26bd5d7a0Witold Krecicki}
bfd4b9e11aa9e8c2b43022a6b7a896b26bd5d7a0Witold Krecicki
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaramanstatic inline isc_result_t
bfd4b9e11aa9e8c2b43022a6b7a896b26bd5d7a0Witold Krecickitowire_in_a(ARGS_TOWIRE) {
bfd4b9e11aa9e8c2b43022a6b7a896b26bd5d7a0Witold Krecicki isc_region_t region;
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews REQUIRE(rdata->type == 1);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews REQUIRE(rdata->rdclass == 1);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews REQUIRE(rdata->length == 4);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews UNUSED(cctx);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews isc_buffer_availableregion(target, &region);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews if (region.length < rdata->length)
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews return (ISC_R_NOSPACE);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews memcpy(region.base, rdata->data, rdata->length);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews isc_buffer_add(target, 4);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews return (ISC_R_SUCCESS);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews}
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrewsstatic inline int
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrewscompare_in_a(ARGS_COMPARE) {
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews isc_region_t r1;
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews isc_region_t r2;
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(rdata1->type == rdata2->type);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(rdata1->rdclass == rdata2->rdclass);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(rdata1->type == 1);
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington REQUIRE(rdata1->rdclass == 1);
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington REQUIRE(rdata1->length == 4);
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington REQUIRE(rdata2->length == 4);
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington dns_rdata_toregion(rdata1, &r1);
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington dns_rdata_toregion(rdata2, &r2);
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington return (compare_region(&r1, &r2));
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington}
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellingtonstatic inline isc_result_t
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellingtonfromstruct_in_a(ARGS_FROMSTRUCT) {
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington dns_rdata_in_a_t *a = source;
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington isc_uint32_t n;
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrews REQUIRE(type == 1);
29daf5bc7738f1cdab7914562269e1129c81acdcBrian Wellington REQUIRE(rdclass == 1);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews REQUIRE(source != NULL);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(a->common.rdtype == type);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(a->common.rdclass == rdclass);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington UNUSED(rdclass);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews n = ntohl(a->in_addr.s_addr);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews return (uint32_tobuffer(n, target));
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaraman}
bfd4b9e11aa9e8c2b43022a6b7a896b26bd5d7a0Witold Krecicki
bfd4b9e11aa9e8c2b43022a6b7a896b26bd5d7a0Witold Krecicki
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaramanstatic inline isc_result_t
27bc16fcdc67f9afefefb54ae98dfdae3a5bc1f8Mukund Sivaramantostruct_in_a(ARGS_TOSTRUCT) {
64e7f8541ddaee30c5e84394602eaeac69cb9b16Brian Wellington dns_rdata_in_a_t *a = target;
64e7f8541ddaee30c5e84394602eaeac69cb9b16Brian Wellington isc_uint32_t n;
64e7f8541ddaee30c5e84394602eaeac69cb9b16Brian Wellington isc_region_t region;
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(rdata->type == 1);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(rdata->rdclass == 1);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(rdata->length == 4);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington UNUSED(mctx);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington a->common.rdclass = rdata->rdclass;
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington a->common.rdtype = rdata->type;
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington ISC_LINK_INIT(&a->common, link);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington dns_rdata_toregion(rdata, &region);
2d6a6174f108f58458ebafe4120d6df8e28d3e36Brian Wellington n = uint32_fromregion(&region);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews a->in_addr.s_addr = htonl(n);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews return (ISC_R_SUCCESS);
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews}
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrews
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrewsstatic inline void
39c7fc7e00af20144b94ef332943f62c1b3a622fMark Andrewsfreestruct_in_a(ARGS_FREESTRUCT) {
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington dns_rdata_in_a_t *a = source;
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(source != NULL);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(a->common.rdtype == 1);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington REQUIRE(a->common.rdclass == 1);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington UNUSED(a);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington}
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellingtonstatic inline isc_result_t
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellingtonadditionaldata_in_a(ARGS_ADDLDATA) {
29daf5bc7738f1cdab7914562269e1129c81acdcBrian Wellington REQUIRE(rdata->type == 1);
82ecc44b96189ba24628d4e045deff2a85d923a1Brian Wellington REQUIRE(rdata->rdclass == 1);
29daf5bc7738f1cdab7914562269e1129c81acdcBrian Wellington
82ecc44b96189ba24628d4e045deff2a85d923a1Brian Wellington UNUSED(rdata);
29daf5bc7738f1cdab7914562269e1129c81acdcBrian Wellington UNUSED(add);
a8da00ef95ba37b9d071c2b8db1a0c967e060106Mark Andrews UNUSED(arg);
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews return (ISC_R_SUCCESS);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews}
5d18f1205a3027a3a7156a8054b4dada5d00ed19Brian Wellington
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsstatic inline isc_result_t
5d18f1205a3027a3a7156a8054b4dada5d00ed19Brian Wellingtondigest_in_a(ARGS_DIGEST) {
5d18f1205a3027a3a7156a8054b4dada5d00ed19Brian Wellington isc_region_t r;
5d18f1205a3027a3a7156a8054b4dada5d00ed19Brian Wellington
5d18f1205a3027a3a7156a8054b4dada5d00ed19Brian Wellington REQUIRE(rdata->type == 1);
5d18f1205a3027a3a7156a8054b4dada5d00ed19Brian Wellington REQUIRE(rdata->rdclass == 1);
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrews dns_rdata_toregion(rdata, &r);
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrews
1c33761bcff783815a952e6e1fb9d5e07a3e1363Brian Wellington return ((digest)(arg, &r));
a8da00ef95ba37b9d071c2b8db1a0c967e060106Mark Andrews}
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington
dacf0cc454c7497859ec35ca011a456e58e5d31aBrian Wellington#endif /* RDATA_IN_1_A_1_C */
1c33761bcff783815a952e6e1fb9d5e07a3e1363Brian Wellington