44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews/*
a134177ed9f82189504191d90f3ed9e97c2b47cbTinderbox User * Copyright (C) 1999-2002, 2004, 2007, 2009, 2011-2017 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
28a8f5b0de57d269cf2845c69cb6abe18cbd3b3aMark Andrews/* $Id$ */
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>
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews#include <isc/once.h>
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff#define RRTYPE_WKS_ATTRIBUTES (0)
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrewsstatic isc_mutex_t wks_lock;
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrewsstatic void init_lock(void) {
b9e911c71cf0fbdc054b5bc7ef1a3233e2b4a4faAutomatic Updater RUNTIME_CHECK(isc_mutex_init(&wks_lock) == ISC_R_SUCCESS);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews}
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrewsstatic isc_boolean_t
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrewsmygetprotobyname(const char *name, long *proto) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews struct protoent *pe;
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews LOCK(&wks_lock);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews pe = getprotobyname(name);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews if (pe != NULL)
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews *proto = pe->p_proto;
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews UNLOCK(&wks_lock);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews return (ISC_TF(pe != NULL));
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews}
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrewsstatic isc_boolean_t
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrewsmygetservbyname(const char *name, const char *proto, long *port) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews struct servent *se;
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews LOCK(&wks_lock);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews se = getservbyname(name, proto);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews if (se != NULL)
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews *port = ntohs(se->s_port);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews UNLOCK(&wks_lock);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews return (ISC_TF(se != NULL));
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews}
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#ifdef _WIN32
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#include <windows.h>
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#include <winsock2.h>
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#include <ws2tcpip.h>
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#endif
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencefromtext_in_wks(ARGS_FROMTEXT) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews static isc_once_t once = ISC_ONCE_INIT;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_token_t token;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t region;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews struct in_addr addr;
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;
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews isc_result_t result;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdclass == dns_rdataclass_in);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington UNUSED(type);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(origin);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(options);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(rdclass);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews RUNTIME_CHECK(isc_once_do(&once, init_lock) == ISC_R_SUCCESS);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#ifdef _WIN32
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews {
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews WORD wVersionRequested;
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews WSADATA wsaData;
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews int err;
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews wVersionRequested = MAKEWORD(2, 0);
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews err = WSAStartup(wVersionRequested, &wsaData );
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews if (err != 0)
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews return (ISC_R_FAILURE);
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews }
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#endif
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews
34b394b43e2207e8f8f3703f0402422121455638David Lawrence /*
34b394b43e2207e8f8f3703f0402422121455638David Lawrence * IPv4 dotted quad.
34b394b43e2207e8f8f3703f0402422121455638David Lawrence */
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECK(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington ISC_FALSE));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence isc_buffer_availableregion(target, &region);
c46f10e4a1702191b003cf8f8fc5059c15d29c48Mark Andrews if (getquad(DNS_AS_STR(token), &addr, lexer, callbacks) != 1)
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECKTOK(DNS_R_BADDOTTEDQUAD);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (region.length < 4)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_NOSPACE);
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt memmove(region.base, &addr, 4);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_buffer_add(target, 4);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
34b394b43e2207e8f8f3703f0402422121455638David Lawrence /*
34b394b43e2207e8f8f3703f0402422121455638David Lawrence * Protocol.
34b394b43e2207e8f8f3703f0402422121455638David Lawrence */
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECK(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington ISC_FALSE));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
c46f10e4a1702191b003cf8f8fc5059c15d29c48Mark Andrews proto = strtol(DNS_AS_STR(token), &e, 10);
5d15501996f597d9bbb734d88d4549828e28000bMark Andrews if (*e == 0)
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff ;
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews else if (!mygetprotobyname(DNS_AS_STR(token), &proto))
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECKTOK(DNS_R_UNKNOWNPROTO);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
df7f20ae77fbe03d2973d1768d6a68da1063af84Andreas Gustafsson if (proto < 0 || proto > 0xff)
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECKTOK(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
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECK(uint8_tobuffer(proto, target));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(bm, 0, sizeof(bm));
19c5c23ef6e38965949c996592bd92478da0612cMark Andrews do {
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECK(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 */
c46f10e4a1702191b003cf8f8fc5059c15d29c48Mark Andrews strncpy(service, DNS_AS_STR(token), 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))
ffcbf9ea917725d49be6b006efa02613de5ef242Mark Andrews service[i] = tolower(service[i]&0xff);
251705f6831d3d1357627ba2d54fc898487dec09Mark Andrews
c46f10e4a1702191b003cf8f8fc5059c15d29c48Mark Andrews port = strtol(DNS_AS_STR(token), &e, 10);
5d15501996f597d9bbb734d88d4549828e28000bMark Andrews if (*e == 0)
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff ;
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews else if (!mygetservbyname(service, ps, &port) &&
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews !mygetservbyname(DNS_AS_STR(token), ps, &port))
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECKTOK(DNS_R_UNKNOWNSERVICE);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (port < 0 || port > 0xffff)
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews CHECKTOK(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;
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews result = mem_tobuffer(target, bm, n);
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews cleanup:
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#ifdef _WIN32
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews WSACleanup();
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews#endif
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews
82a50a619afa73ae9a212399505b9f1b327128cdMark Andrews return (result);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews}
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic inline isc_result_t
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrencetotext_in_wks(ARGS_TOTEXT) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_t sr;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews unsigned short proto;
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson char buf[sizeof("65535")];
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews unsigned int i, j;
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff UNUSED(tctx);
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->rdclass == dns_rdataclass_in);
330705066b03f6ce0bc08a4bbfc5d2418038c68dBrian Wellington REQUIRE(rdata->length >= 5);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews dns_rdata_toregion(rdata, &sr);
330705066b03f6ce0bc08a4bbfc5d2418038c68dBrian Wellington RETERR(inet_totext(AF_INET, &sr, target));
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews isc_region_consume(&sr, 4);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
df7f20ae77fbe03d2973d1768d6a68da1063af84Andreas Gustafsson proto = uint8_fromregion(&sr);
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(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
e502b133d630bda0ee64c1e2ce6729d96750d8abMark Andrews INSIST(sr.length <= 8*1024);
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (i = 0; i < sr.length; i++) {
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews if (sr.base[i] != 0)
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson for (j = 0; j < 8; j++)
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff if ((sr.base[i] & (0x80 >> j)) != 0) {
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(buf),
ad1317338af79edad878c9c3e4361798503310baMark Andrews "%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
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdclass == dns_rdataclass_in);
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington UNUSED(type);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(dctx);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(options);
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
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt memmove(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
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->rdclass == dns_rdataclass_in);
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);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata1->type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata1->rdclass == dns_rdataclass_in);
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);
90e303b114e56db5809fdd19805243457fa43cd9Olafur Gudmundsson return (isc_region_compare(&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
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdclass == dns_rdataclass_in);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews REQUIRE(source != NULL);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews REQUIRE(wks->common.rdtype == type);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews REQUIRE(wks->common.rdclass == rdclass);
e502b133d630bda0ee64c1e2ce6729d96750d8abMark Andrews REQUIRE((wks->map != NULL && wks->map_len <= 8*1024) ||
e502b133d630bda0ee64c1e2ce6729d96750d8abMark Andrews wks->map_len == 0);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington UNUSED(type);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson UNUSED(rdclass);
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews a = ntohl(wks->in_addr.s_addr);
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews RETERR(uint32_tobuffer(a, target));
34416a7954da96c5a5f5803fe02f059cb94bf6fdMark Andrews RETERR(uint8_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
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->rdclass == dns_rdataclass_in);
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);
34416a7954da96c5a5f5803fe02f059cb94bf6fdMark Andrews wks->protocol = uint8_fromregion(&region);
34416a7954da96c5a5f5803fe02f059cb94bf6fdMark Andrews isc_region_consume(&region, 1);
5159c427839689d5070e2f9c6c9a0168dd9f6583Mark Andrews wks->map_len = region.length;
85bdc128fcda11c89ec1d76ea4221f4fa8e4fc24Mark Andrews wks->map = mem_maybedup(mctx, region.base, region.length);
85bdc128fcda11c89ec1d76ea4221f4fa8e4fc24Mark Andrews if (wks->map == NULL)
85bdc128fcda11c89ec1d76ea4221f4fa8e4fc24Mark Andrews return (ISC_R_NOMEMORY);
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);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(wks->common.rdtype == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(wks->common.rdclass == dns_rdataclass_in);
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
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->rdclass == dns_rdataclass_in);
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
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->rdclass == dns_rdataclass_in);
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley dns_rdata_toregion(rdata, &r);
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley return ((digest)(arg, &r));
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley}
20dbb03b72d786d37ead9156f2884322d2743a3aBob Halley
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewsstatic inline isc_boolean_t
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewscheckowner_in_wks(ARGS_CHECKOWNER) {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdclass == dns_rdataclass_in);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(type);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(rdclass);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews return (dns_name_ishostname(name, wildcard));
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews}
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewsstatic inline isc_boolean_t
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewschecknames_in_wks(ARGS_CHECKNAMES) {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_wks);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->rdclass == dns_rdataclass_in);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(rdata);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(owner);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(bad);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews return (ISC_TRUE);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews}
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrewsstatic inline int
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrewscasecompare_in_wks(ARGS_COMPARE) {
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews return (compare_in_wks(rdata1, rdata2));
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews}
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews#endif /* RDATA_IN_1_WKS_11_C */