wks_11.c revision 63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews/*
7d32c065c7bb56f281651ae3dd2888f32ce4f1d9Bob Halley * Copyright (C) 1999, 2000 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews * Permission to use, copy, modify, and distribute this software for any
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews * purpose with or without fee is hereby granted, provided that the above
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
15a44745412679c30a6d022733925af70a38b715David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
15a44745412679c30a6d022733925af70a38b715David Lawrence * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
15a44745412679c30a6d022733925af70a38b715David Lawrence * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
15a44745412679c30a6d022733925af70a38b715David Lawrence * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson/* $Id: wks_11.c,v 1.38 2000/12/01 01:40:59 gson Exp $ */
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff/* Reviewed: Fri Mar 17 15:01:49 PST 2000 by explorer */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews#ifndef RDATA_IN_1_WKS_11_C
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews#define RDATA_IN_1_WKS_11_C
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews#include <limits.h>
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews#include <stdlib.h>
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
8360c3dc0f8ab25f4839c79e30d6865838d9a4daBob Halley#include <isc/net.h>
8360c3dc0f8ab25f4839c79e30d6865838d9a4daBob Halley#include <isc/netdb.h>
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff#define RRTYPE_WKS_ATTRIBUTES (0)
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencefromtext_in_wks(ARGS_FROMTEXT) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_token_t token;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t region;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews struct in_addr addr;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews struct protoent *pe;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews struct servent *se;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews char *e;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews long proto;
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews unsigned char bm[8*1024]; /* 64k bits */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews long port;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews long maxport = -1;
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence const char *ps = NULL;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews unsigned int n;
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews char service[32];
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews int i;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdclass == 1);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(origin);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(downcase);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(rdclass);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson
34b394b43e2207e8f8f3703f0402422121455638David Lawrence /*
34b394b43e2207e8f8f3703f0402422121455638David Lawrence * IPv4 dotted quad.
34b394b43e2207e8f8f3703f0402422121455638David Lawrence */
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington ISC_FALSE));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence isc_buffer_availableregion(target, &region);
8360c3dc0f8ab25f4839c79e30d6865838d9a4daBob Halley if (inet_aton(token.value.as_pointer, &addr) != 1)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews return (DNS_R_BADDOTTEDQUAD);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (region.length < 4)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_NOSPACE);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews memcpy(region.base, &addr, 4);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_buffer_add(target, 4);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
34b394b43e2207e8f8f3703f0402422121455638David Lawrence /*
34b394b43e2207e8f8f3703f0402422121455638David Lawrence * Protocol.
34b394b43e2207e8f8f3703f0402422121455638David Lawrence */
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington ISC_FALSE));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews proto = strtol(token.value.as_pointer, &e, 10);
5d15501996f597d9bbb734d88d4549828e28000bMark Andrews if (*e == 0)
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff ;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews else if ((pe = getprotobyname(token.value.as_pointer)) != NULL)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews proto = pe->p_proto;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews else
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_UNEXPECTED);
df7f20ae77fbe03d2973d1768d6a68da1063af84Andreas Gustafsson if (proto < 0 || proto > 0xff)
34b394b43e2207e8f8f3703f0402422121455638David Lawrence return (ISC_R_RANGE);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (proto == IPPROTO_TCP)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews ps = "tcp";
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews else if (proto == IPPROTO_UDP)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews ps = "udp";
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
df7f20ae77fbe03d2973d1768d6a68da1063af84Andreas Gustafsson RETERR(uint8_tobuffer(proto, target));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews memset(bm, 0, sizeof bm);
19c5c23ef6e38965949c996592bd92478da0612cMark Andrews do {
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington RETERR(isc_lex_getmastertoken(lexer, &token,
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington isc_tokentype_string, ISC_TRUE));
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews if (token.type != isc_tokentype_string)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews break;
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews /*
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews * Lowercase the service string as some getservbyname() are
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews * case sensitive and the database is usually in lowercase.
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews */
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews strncpy(service, token.value.as_pointer, sizeof(service));
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews service[sizeof(service)-1] = '\0';
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews for (i = strlen(service) - 1; i >= 0; i--)
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews if (isupper(service[i]&0xff))
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews service[i] = tolower(service[i]);
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews port = strtol(token.value.as_pointer, &e, 10);
5d15501996f597d9bbb734d88d4549828e28000bMark Andrews if (*e == 0)
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff ;
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews else if ((se = getservbyname(service, ps)) != NULL)
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews port = ntohs(se->s_port);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews else if ((se = getservbyname(token.value.as_pointer, ps))
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews != NULL)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews port = ntohs(se->s_port);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews else
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_UNEXPECTED);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (port < 0 || port > 0xffff)
34b394b43e2207e8f8f3703f0402422121455638David Lawrence return (ISC_R_RANGE);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (port > maxport)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews maxport = port;
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff bm[port / 8] |= (0x80 >> (port % 8));
19c5c23ef6e38965949c996592bd92478da0612cMark Andrews } while (1);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
34b394b43e2207e8f8f3703f0402422121455638David Lawrence /*
34b394b43e2207e8f8f3703f0402422121455638David Lawrence * Let upper layer handle eol/eof.
34b394b43e2207e8f8f3703f0402422121455638David Lawrence */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_lex_ungettoken(lexer, &token);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews n = (maxport + 8) / 8;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews return (mem_tobuffer(target, bm, n));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencetotext_in_wks(ARGS_TOTEXT) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t sr;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t tr;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews unsigned short proto;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews char buf[sizeof "65535"];
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews unsigned int i, j;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff UNUSED(tctx);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(rdata->type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdata->rdclass == 1);
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews REQUIRE(rdata->length != 0);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews dns_rdata_toregion(rdata, &sr);
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence isc_buffer_availableregion(target, &tr);
8360c3dc0f8ab25f4839c79e30d6865838d9a4daBob Halley if (inet_ntop(AF_INET, sr.base, (char *)tr.base, tr.length) == NULL)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_NOSPACE);
af6dfd762ef13de674c84f70488067ae78d2573eBob Halley isc_buffer_add(target, strlen((char *)tr.base));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_consume(&sr, 4);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
df7f20ae77fbe03d2973d1768d6a68da1063af84Andreas Gustafsson proto = uint8_fromregion(&sr);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews sprintf(buf, "%u", proto);
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews RETERR(str_totext(" ", target));
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews RETERR(str_totext(buf, target));
b538f54ad3bc526bb1a79d652e71a2816e3c306aAndreas Gustafsson isc_region_consume(&sr, 1);
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews for (i = 0 ; i < sr.length ; i++) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (sr.base[i] != 0)
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff for (j = 0 ; j < 8 ; j++)
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff if ((sr.base[i] & (0x80 >> j)) != 0) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews sprintf(buf, "%u", i * 8 + j);
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews RETERR(str_totext(" ", target));
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews RETERR(str_totext(buf, target));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews }
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews }
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_SUCCESS);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencefromwire_in_wks(ARGS_FROMWIRE) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t sr;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t tr;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdclass == 1);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(dctx);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(downcase);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(rdclass);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence isc_buffer_activeregion(source, &sr);
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence isc_buffer_availableregion(target, &tr);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
df7f20ae77fbe03d2973d1768d6a68da1063af84Andreas Gustafsson if (sr.length < 5)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_UNEXPECTEDEND);
df7f20ae77fbe03d2973d1768d6a68da1063af84Andreas Gustafsson if (sr.length > 8 * 1024 + 5)
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews return (DNS_R_EXTRADATA);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (tr.length < sr.length)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_NOSPACE);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews memcpy(tr.base, sr.base, sr.length);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_buffer_add(target, sr.length);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_buffer_forward(source, sr.length);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_SUCCESS);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencetowire_in_wks(ARGS_TOWIRE) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t sr;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff UNUSED(cctx);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(rdata->type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdata->rdclass == 1);
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews REQUIRE(rdata->length != 0);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews dns_rdata_toregion(rdata, &sr);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews return (mem_tobuffer(target, sr.base, sr.length));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
4529cdaedaf1a0a5f8ff89aeca510b7a4475446cBob Halleystatic inline int
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencecompare_in_wks(ARGS_COMPARE) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t r1;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t r2;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(rdata1->type == rdata2->type);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdata1->rdclass == rdata2->rdclass);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(rdata1->type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdata1->rdclass == 1);
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews REQUIRE(rdata1->length != 0);
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews REQUIRE(rdata2->length != 0);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews dns_rdata_toregion(rdata1, &r1);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews dns_rdata_toregion(rdata2, &r2);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews return (compare_region(&r1, &r2));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencefromstruct_in_wks(ARGS_FROMSTRUCT) {
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews dns_rdata_in_wks_t *wks = source;
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews isc_uint32_t a;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdclass == 1);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews REQUIRE(source != NULL);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews REQUIRE(wks->common.rdtype == type);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews REQUIRE(wks->common.rdclass == rdclass);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(rdclass);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews a = ntohl(wks->in_addr.s_addr);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews RETERR(uint32_tobuffer(a, target));
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews RETERR(uint16_tobuffer(wks->protocol, target));
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews return (mem_tobuffer(target, wks->map, wks->map_len));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencetostruct_in_wks(ARGS_TOSTRUCT) {
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews dns_rdata_in_wks_t *wks = target;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews isc_uint32_t n;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews isc_region_t region;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews REQUIRE(rdata->type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdata->rdclass == 1);
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews REQUIRE(rdata->length != 0);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->common.rdclass = rdata->rdclass;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->common.rdtype = rdata->type;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews ISC_LINK_INIT(&wks->common, link);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews dns_rdata_toregion(rdata, &region);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews n = uint32_fromregion(&region);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->in_addr.s_addr = htonl(n);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews isc_region_consume(&region, 4);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->protocol = uint16_fromregion(&region);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews isc_region_consume(&region, 2);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->map_len = region.length;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews if (wks->map_len > 0) {
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->map = mem_maybedup(mctx, region.base, region.length);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews if (wks->map == NULL)
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews return (ISC_R_NOMEMORY);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews } else
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->map = NULL;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->mctx = mctx;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews return (ISC_R_SUCCESS);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews
4529cdaedaf1a0a5f8ff89aeca510b7a4475446cBob Halleystatic inline void
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencefreestruct_in_wks(ARGS_FREESTRUCT) {
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews dns_rdata_in_wks_t *wks = source;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews REQUIRE(source != NULL);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews REQUIRE(wks->common.rdtype == 11);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews REQUIRE(wks->common.rdclass == 1);
82ca33427bdd4f3bc4ed3431e86bd810fe751674Andreas Gustafsson
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews if (wks->mctx == NULL)
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews return;
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews if (wks->map != NULL)
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews isc_mem_free(wks->mctx, wks->map);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->mctx = NULL;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews}
d981ca645597116d227a48bf37cc5edc061c854dBob Halley
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrenceadditionaldata_in_wks(ARGS_ADDLDATA) {
82ca33427bdd4f3bc4ed3431e86bd810fe751674Andreas Gustafsson UNUSED(rdata);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff UNUSED(add);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff UNUSED(arg);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdata->type == 11);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley REQUIRE(rdata->rdclass == 1);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_SUCCESS);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley}
d981ca645597116d227a48bf37cc5edc061c854dBob Halley
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencedigest_in_wks(ARGS_DIGEST) {
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley isc_region_t r;
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley REQUIRE(rdata->type == 11);
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley REQUIRE(rdata->rdclass == 1);
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley dns_rdata_toregion(rdata, &r);
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley return ((digest)(arg, &r));
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley}
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews#endif /* RDATA_IN_1_WKS_11_C */