rdata.html revision 2f8d63983c297c62630044d28a6f66676b4d339d
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<!--
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen - Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen - Copyright (C) 1999-2001 Internet Software Consortium.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen -
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen - Permission to use, copy, modify, and/or distribute this software for any
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen - purpose with or without fee is hereby granted, provided that the above
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen - copyright notice and this permission notice appear in all copies.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen -
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen - THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen - AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen - PERFORMANCE OF THIS SOFTWARE.
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen-->
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
8f7b00599e73fe71b1d2c6c65f8ae98aac1b23fbTimo Sirainen<!-- $Id: rdata.html,v 1.14 2007/06/18 23:37:20 marka Exp $ -->
8f7b00599e73fe71b1d2c6c65f8ae98aac1b23fbTimo Sirainen
6825360d446542046757b06064282301c4c6b27cTimo Sirainen<HTML>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen<HEAD>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen <TITLE>Adding new RDATA type</TITLE>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen</HEAD>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen<BODY>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen<H2>Overview</H2>
d051664df497582e1eb75a9f238d04b65e858db8Timo SirainenThe dns rdata routines (<CODE>dns_rdata_fromtext()</CODE>,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen<CODE>dns_rdata_totext()</CODE>, <CODE>dns_rdata_fromwire()</CODE>,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>dns_rdata_towire()</CODE> <CODE>dns_rdata_fromstruct()</CODE>,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>dns_rdata_tostruct()</CODE> and <CODE>dns_rdata_compare()</CODE>)
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainenare designed to provide a single set of routines
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenfor encoding, decoding and comparing dns data preventing the problems that
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenoccurred in BIND 8.x and earlier where there were multiple places in the
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainencode base that
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainendecoded wire format to internal format or compared rdata sometimes with
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainensubtly different behaviour (bugs) or didn't support a particular type leading
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainento internal inconsistancy.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<P>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenEach of these generic routines calls type specific routines that provide
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenthe type specific details.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<P>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenFrom time to time new types are defined and it is necessary to add these types
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Siraineninto the existing structure.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThis document is written to provide instruction on how to do this.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<H2>Adding new RDATA types</H2>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenAdding a new rdata type requires determining if the new rdata type is class
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenspecific or generic.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenWriting code to perform the following set of operations
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenand then integrating it into the build by placing the code into the rdata
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenhierachy at the correct place.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenRunning <CODE>make clean</CODE> followed <CODE>make</CODE> in
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>lib/dns</CODE> will cause the new rdata type to be picked up.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<P>
d1c2f6dd39ebb7f6b220ae2afda1162ba72ab43bTimo SirainenEach rdata module must perform the following operations:
d1c2f6dd39ebb7f6b220ae2afda1162ba72ab43bTimo Sirainen<DL>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT>Convert from text format to internal format</DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT>Convert from internal format to text format</DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT>Convert from wire format to internal format</DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT>Convert from internal format to wire format</DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT>Convert from a structure to internal format</DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT>Convert from internal format to a structure</DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT>Compare two rdata in internal format<DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen</DL>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<P>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThere is an additional set of support <A HREF="#functions">functions</A> and
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<A HREF="#macros">macros</A> only available to
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainento rdata code.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<H2>RDATA Hierarchy</H2>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThe <CODE>rdata</CODE> hierarchy has the following format.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen rdata/
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen generic/
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen <I>typename_typenumber</I>.h
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen <I>classname_classnumber</I>/
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen <I>typename_typenumber</I>.h
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<P>
02752bc8d64df8cd361f464e55422f7b3f2f143eTimo SirainenInitial rdata hierarchy:
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<P>
02752bc8d64df8cd361f464e55422f7b3f2f143eTimo Sirainen<PRE>
02752bc8d64df8cd361f464e55422f7b3f2f143eTimo Sirainen rdata/
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen generic/
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen ns_2.h
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen md_3.h
3281669db44d09a087a203201248abbc81b3cc1aTimo Sirainen mf_4.h
3281669db44d09a087a203201248abbc81b3cc1aTimo Sirainen cname_5.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen soa_6.h
02752bc8d64df8cd361f464e55422f7b3f2f143eTimo Sirainen mb_7.h
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen mg_8.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen mr_9.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen null_10.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen ptr_12.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen hinfo_13.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen minfo_14.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen mx_15.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen txt_16.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen rp_17.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen afsdb_18.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen x25_19.h
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen isdn_20.h
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen rt_21.h
02752bc8d64df8cd361f464e55422f7b3f2f143eTimo Sirainen sig_24.h
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen key_25.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen gpos_27.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen loc_29.h
08f03325b34becc0e9f2bb130ac013bf54b9cca3Timo Sirainen nxt_30.h
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen cert_37.h
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen dname_39.h
08f03325b34becc0e9f2bb130ac013bf54b9cca3Timo Sirainen unspec_103.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen tkey_249.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen in_1/
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen a_1.h
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen wks_11.h
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen nsap_22.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen nsap-ptr_23.h
08f03325b34becc0e9f2bb130ac013bf54b9cca3Timo Sirainen px_26.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen aaaa_28.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen srv_33.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen naptr_35.h
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen kx_36.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen a6_38.h
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen any_255/
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen tsig_250.h
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen</PRE>
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen<H2>CLASSNAME and TYPENAME</H2>
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo SirainenClass and type names must be from the following alphabet and less that 11
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainencharacters in length or otherwise they will be ignored.
055a42c6987f93fb88291f64813dfceb1b25895dTimo SirainenPermissible alphabet: a to z, 0 to 9 and dash (-).
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo SirainenDash is mapped to underscore (_) for the C function names below.
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen<H2>Internal Format</H2>
7ded22760598b78ee29f9418eacc0abe3fb51055Timo SirainenThe internal format chosen is DNS wire format without any compression being
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainenapplied to domain names in the rdata.
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<H2>Convert from text format to internal format</H2>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThe functions to convert from text format has the following call formats and
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainenis declared as follows for class generic functions.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>static dns_result_t
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenfromtext_<I>typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen isc_lex_t *lexer, dns_name_t *origin,
d721a5f55d3a4a100ae593ab85fa13661d2134abTimo Sirainen isc_boolean_t downcase, isc_buffer_t *target);</CODE>
d721a5f55d3a4a100ae593ab85fa13661d2134abTimo Sirainen</PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenClass specific functions contain the class name in addition to the
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainentype name.
d721a5f55d3a4a100ae593ab85fa13661d2134abTimo Sirainen<PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>static dns_result_t
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenfromtext_<I>classname_typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen isc_lex_t *lexer, dns_name_t *origin,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen isc_boolean_t downcase, isc_buffer_t *target);</CODE>
d721a5f55d3a4a100ae593ab85fa13661d2134abTimo Sirainen</PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DL>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>class</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThis argument should be ignored when used with a class generic RR type
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenotherwise <CODE>REQUIRE(class == #)</CODE> should be present at the start
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenof the function.
bf045aa2e9c3846ecde84db303db6588b173bbaeTimo Sirainen<DT><CODE>type</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis should be tested with a <CODE>REQUIRE(type == #)</CODE> statement at
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenthe begining of the function.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DT><CODE>lexer</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis is used to read the input text stream.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>origin</CODE></DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DD>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThis is a absolute name used to qualify unqualified / partially qualified
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainendomainnames in the text stream.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenIt is passed to the name parsing routines.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>downcase</CODE></DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DD>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThis is passed to the name parsing routines to determine whether to downcase
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainenthe names it generates or leave them in the case they are pesented in.
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<DT><CODE>target</CODE></DT>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<DD>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThis is a <CODE>BINARY</CODE> buffer used to write the internal format of the rdata record being read in to.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen</DL>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>fromtext_<I>typename</I>()</CODE> reads tokens from <CODE>lexer</CODE>,
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainenup to but not including the end of line (EOL) token or end of file (EOF) token.
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo SirainenIf the EOL / EOF token is read it should be returned to the input stream.
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen<A HREF="#gettoken"><CODE>gettoken()</CODE></A>
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainenshould be used to read the next token from the input stream and
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenwill return EOL / EOF tokens
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenautomatically unless
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenthey are specifcally requested.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>isc_lex_ungettoken()</CODE> should
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainenbe used to return EOL / EOF (or any other token) to the input stream if
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenthe EOL / EOF token is read.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenUnused tokens will cause <CODE>dns_rdata_fromtext()</CODE> to return
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<CODE>DNS_R_EXTRATOKEN</CODE> if <CODE>fromtext_<I>typename</I>()</CODE> was successful.
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<P>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<CODE>fromtext_<I>typename</I>()</CODE> reads external input and as such is a high security area and must be paranoid about its input.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<H2>Convert from internal format to text format</H2>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>static dns_result_t
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainentotext_<I>typename</I>(dns_rdata_t *rdata, dns_name_t *origin,
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen isc_buffer_t *target);</CODE>
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen</PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<PRE>
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen<CODE>static dns_result_t
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainentotext_<I>classname_typename</I>(dns_rdata_t *rdata, dns_name_t *origin,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen isc_buffer_t *target);</CODE>
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen</PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DL>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DT><CODE>rdata</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo SirainenThis is the rdata record to be converted from internal format to text.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<CODE>rdata->type</CODE> and <CODE>rdata->class</CODE> for class specific
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenRR types should be checked at the start of the function with
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>REQUIRE(rdata->type ==�#)</CODE> statements.
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DT><CODE>origin</CODE></DT>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DD>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo SirainenIf this in non <CODE>NULL</CODE> then any domainnames with this suffix
d7c8280f58292cc292eba9209dcc9024fe96cf06Timo Sirainenshould be written out unqualified.
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen<A HREF="#name_prefix"><CODE>name_prefix()</CODE></A> can be used to
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainencheck if <CODE>origin</CODE> is <CODE>NULL</CODE> and provide the correct
41bb0aa8e357876bc9a1916a37c9e3e78e5f8185Timo Sirainenarguments to the name conversion routines.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DT><CODE>target</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis is a <CODE>TEXT</CODE> buffer used to hold the output.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</DL>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<H2>Convert from wire format to internal format</H2>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<PRE>
8f7b00599e73fe71b1d2c6c65f8ae98aac1b23fbTimo Sirainen<CODE>static dns_result_t
8f7b00599e73fe71b1d2c6c65f8ae98aac1b23fbTimo Sirainenfromwire_<I>typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen isc_buffer_t *source, dns_decompress_t *dctx,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen isc_boolean_t downcase, isc_buffer_t *target);</CODE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</PRE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<PRE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<CODE>static dns_result_t
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainenfromwire_<I>classname_typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen isc_buffer_t *source, dns_decompress_t *dctx,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen isc_boolean_t downcase, isc_buffer_t *target);</CODE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</PRE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<P>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<CODE>fromwire_<I>classname_typename</I>()</CODE> is required to set the valid
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainendecompression methods if there is a domain name in the rdata.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<PRE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<CODE>if (dns_decompress_edns(dctx) >= # || !dns_decompress_strict(dctx))
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen dns_decompress_setmethods(dctx, DNS_COMPRESS_ALL);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainenelse
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);</CODE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</PRE>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DL>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>class</CODE></DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DD>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenThis argument should be ignored when used with a class generic RR type
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenotherwise <CODE>REQUIRE(class == #)</CODE> should be present at the start
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenof the function.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>type</CODE></DT>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis should be tested with a <CODE>REQUIRE(type == #)</CODE> statement at
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenthe begining of the function.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DT><CODE>source</CODE></DT>
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis is a <CODE>BINARY</CODE> buffer with the <CODE>active</CODE> region
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainencontaining a RR record in wire format.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>dctx</CODE></DT>
d200ae87140a1985fe527e6527bc4bd3035189b1Timo Sirainen<DD>
d200ae87140a1985fe527e6527bc4bd3035189b1Timo SirainenThis is the decompression context and is passed to
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<CODE>dns_name_fromwire()</CODE>,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainenalong with <CODE>downcase</CODE>, to enable a compressed domain name
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainento be extracted from the source.
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen<DT><CODE>downcase</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis is passed to <CODE>dns_name_fromwire()</CODE> to say whether the
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenextracted domainname should be downcased during the extraction.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>target</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
d051664df497582e1eb75a9f238d04b65e858db8Timo SirainenThis is a <CODE>BINARY</CODE> buffer where the decompressed and checked
d051664df497582e1eb75a9f238d04b65e858db8Timo SirainenRR record is written.
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen</DL>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<CODE>fromwire_<I>typename</I>()</CODE> is a security sensitive routine
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainenas it reads external data and should take extreme care to ensure that
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainenthe input data matches its description.
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen<P>
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo SirainenIf the <CODE>active</CODE> buffer is not empty at completion and
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<CODE>fromwire_<I>typename</I>()</CODE> was otherwise successful
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>dns_rdata_fromwire()</CODE> will return <CODE>DNS_R_EXTRADATA</CODE>.
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<H2>Convert from internal format to wire format</H2>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<PRE>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<CODE>static dns_result_t
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainentowire_<I>typename</I>(dns_rdata_t *rdata, dns_compress_t *cctx,
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen isc_buffer_t *target);</CODE>
f0559b6bd1914e9118772d49415defe3dbb1817bTimo Sirainen</PRE>
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen<PRE>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<CODE>static dns_result_t
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainentowire_<I>classname_typename</I>(dns_rdata_t *rdata, dns_compress_t *cctx,
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen isc_buffer_t *target);<CODE>
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen</PRE>
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen<P>
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen<CODE>towire_<I>classname_typename</I>()</CODE> is required to set the
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainenallowed name compression methods based on EDNS version if there is a
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainendomain name in the rdata.
d051664df497582e1eb75a9f238d04b65e858db8Timo Sirainen<PRE>
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen<CODE>if (dns_compress_getedns(cctx) >= #)
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenelse
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);</CODE>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen</PRE>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DL>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DT><CODE>rdata</CODE></DT>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DD>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo SirainenThis is the rdata record to be converted from internal format to text.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>rdata->type</CODE> and <CODE>rdata->class</CODE> for class specific
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenRR types should be checked at the start of the function with
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<CODE>REQUIRE(rdata->type ==�#)</CODE> statements.
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DT><CODE>cctx</CODE></DT>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis is the compression context, it should be passed to <CODE>dns_name_towire()</CODE> when putting domainnames on the wire.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DT><CODE>target</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis is a <CODE>BINARY</CODE> buffer used to write the rdata to.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</DL>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenSimple RR types without domainnames can use the following code to
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainentransfer the contents of the <CODE>rdata</CODE> to the target buffer.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<PRE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen <CODE>return (<A HREF="#mem_tobuffer">mem_tobuffer</A>(target, rdata->data, rdata->length));</CODE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</PRE>
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen<H2>Convert from a structure to internal format</H2>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<PRE>
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen<CODE>static dns_result_t
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainenfromstruct_<I>typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen void *source, isc_buffer_t *target);</CODE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</PRE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<PRE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<CODE>static dns_result_t
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainenfromstruct_<I>classname_typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen void *source, isc_buffer_t *target);</CODE>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen</PRE>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DL>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DT><CODE>class</CODE></DT>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DD>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo SirainenThis argument should be ignored when used with a class generic RR type
d7c8280f58292cc292eba9209dcc9024fe96cf06Timo Sirainenotherwise <CODE>REQUIRE(class == #)</CODE> should be present at the start
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainenof the function.
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DT><CODE>type</CODE></DT>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen<DD>
20b9283d4af31e45e588014da427fb2dbcd3227aTimo SirainenThis should be tested with a <CODE>REQUIRE(type == #)</CODE> statement at
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainenthe beginning of the function.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DT><CODE>source</CODE></DT>
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DD>
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenThis points to a type specific structure.
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen<DT><CODE>target</CODE></DT>
<DD>
This is a <CODE>BINARY</CODE> buffer used to write the internal format of the rdata record being read in to.
</DL>
<H2>Convert from internal format to a structure</H2>
<PRE>
<CODE>static dns_result_t
tostruct_<I>typename</I>(dns_rdata_t *rdata, void *target);</CODE>
</PRE>
<PRE>
<CODE>static dns_result_t
tostruct_<I>classname_typename</I>(dns_rdata_t *rdata, void *target);</CODE>
</PRE>
<DL>
<DT><CODE>rdata</CODE></DT>
<DD>
This is the rdata record to be converted from internal format to a structure.
<CODE>rdata->type</CODE> and <CODE>rdata->class</CODE> for class specific
RR types should be checked at the start of the function with
<CODE>REQUIRE(rdata->type ==�#)</CODE> statements.
<DT><CODE>target</CODE></DT>
<DD>
Pointer to a type specific structure.
</DL>
<H2>Compare two rdata in internal format</H2>
<PRE>
<CODE>static int
compare_<I>typename</I>(dns_rdata_t *rdata1, dns_rdata_t *rdata2);</CODE>
</PRE>
<PRE>
<CODE>static int
compare_<I>classname_typename</I>(dns_rdata_t *rdata1, dns_rdata_t *rdata2);</CODE>
</PRE>
Compares <CODE>rdata1</CODE> and <CODE>rdata2<CODE> as required for DNSSEC
ordering. The routine should
ensure that the <CODE>type</CODE> and <CODE>class</CODE> of the two rdata
match with <CODE>REQUIRE(rdata1->type == rdata2->type);</CODE> and
<CODE>REQUIRE(rdata1->class == rdata2->class);</CODE> statements. The
<CODE>rdata->type</CODE> should also be verified and if the RR type is
class specific the <CODE>rdata->class</CLASS>.
<P>
<CODE>compare_<I>classname_typename</I>()</CODE> returns -1, 0, 1.
<H2><A NAME="functions">Support Functions</A></H2>
The following static support functions are available to use.
<DL>
<DT><CODE>static unsigned int<BR>
name_length(dns_name_t *name);</CODE></DT>
<DD>
<P>
Returns the length of <CODE>name</CODE>.
<P>
<DT><CODE>static dns_result_t<BR>
txt_totext(isc_region_t *source, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Extracts the octet length tagged text string at the start of
<CODE>source</CODE> and writes it as a quoted string to <CODE>target</CODE>.
<CODE>source</CODE> is adjusted so that it points to first octet after the
text string.
<P>
Returns <CODE>DNS_R_NOSPACE</CODE> or <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static dns_result_t<BR>
txt_fromtext(isc_textregion_t *source, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Take the text region <CODE>source</CODE> and convert it to a length tagged
text string writing it to <CODE>target</CODE>.
<P>
Returns <CODE>DNS_R_NOSPACE</CODE>, <CODE>DNS_R_TEXTTOLONG</CODE>
or <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static dns_result_t<BR>
txt_fromwire(isc_buffer_t *source, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Read a octet length tagged text string from <CODE>source</CODE> and
write it to <CODE>target</CODE>.
Ensures that octet length tagged text string was wholly within the active
area of <CODE>source</CODE>.
Adjusts the active area of <CODE>source</CODE> so that it refers to the first
octet after the octet length tagged text string.
<P>
Returns <CODE>DNS_R_UNEXPECTEDEND</CODE>, <CODE>DNS_R_NOSPACE</CODE> or
<CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><A NAME="name_prefix"><CODE>static isc_boolean_t<BR>
name_prefix(dns_name_t *name, dns_name_t *origin, dns_name_t *target);</CODE>
</A></DT>
<DD>
<P>
If <CODE>origin</CODE> is NULL or the root label set <CODE>target<CODE> to
refer to <CODE>name</CODE> and return <CODE>ISC_FALSE</CODE>.
Otherwise see if <CODE>name</CODE> is a sub domain of <CODE>origin</CODE>
and are not equal.
If so make <CODE>target</CODE> refer to the prefix of <CODE>name</CODE> and
return <CODE>ISC_TRUE</CODE>.
Otherwise make <CODE>target</CODE> refer to <CODE>name</CODE> and return
<CODE>ISC_FALSE</CODE>.
<P>
Typical use:
<PRE><CODE>
static dns_result_t
totext_<I>typename</I>(dns_rdata_t *rdata, dns_name_t *origin,
isc_buffer_t * target)
{
isc_region_t region;
dns_name_t name, prefix;
isc_boolean_t sub;
dns_name_init(&amp;name, NULL);
dns_name_init(&amp;prefix, NULL);
dns_rdata_toregion(rdata, &amp;region);
dns_name_fromregion(&amp;name, &amp;region);
sub = <B>name_prefix</B>(&amp;name, origin, &amp;prefix);
return (dns_name_totext(&amp;prefix, sub, target));
}
</CODE></PRE>
<DT><CODE>static dns_result_t<BR>
str_totext(char *source, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
This adds the <CODE>NULL</CODE> terminated string <CODE>source</CODE>
up to but not including <CODE>NULL</CODE> to <CODE>target</CODE>.
<P>
Returns <CODE>DNS_R_NOSPACE</CODE> and <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static isc_boolean_t<BR>
buffer_empty(isc_buffer_t *source);</CODE></DT>
<DD>
<P>
Returns <CODE>ISC_TRUE</CODE> if the active region of <CODE>source</CODE> is
empty otherwise <CODE>ISC_FALSE</CODE>.
<P>
<DT><CODE>static void<BR>
buffer_fromregion(isc_buffer_t *buffer, isc_region_t *region,
unsigned int type);</CODE></DT>
<DD>
<P>
Make <CODE>buffer</CODE> refer to the memory in <CODE>region</CODE> and
make it active.
<P>
<DT><CODE>static dns_result_t<BR>
uint32_tobuffer(isc_uint32_t value, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Write the 32 bit <CODE>value</CODE> in network order to <CODE>target</CODE>.
<P>
Returns <CODE>DNS_R_NOSPACE</CODE> and <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static dns_result_t<BR>
uint16_tobuffer(isc_uint32_t value, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Write them 16 bit <CODE>value</CODE> in network order to <CODE>target</CODE>.
<P>
Returns <CODE>ISC_R_RANGE</CODE>, <CODE>DNS_R_NOSPACE</CODE> and <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static isc_uint32_t<BR>
uint32_fromregion(isc_region_t *region);</CODE></DT>
<DD>
<P>
Returns the 32 bit at the start of <CODE>region</CODE> in host order.
<P>
Requires <CODE>(region->length >= 4)</CODE>.
<P>
<DT><CODE>static isc_uint16_t<BR>
uint16_fromregion(isc_region_t *region);</CODE></DT>
<DD>
<P>
Returns the 16 bit at the start of <CODE>region</CODE> in host order.
<P>
Requires <CODE>(region->length >= 2)</CODE>.
<P>
<DT><CODE>static dns_result_t<BR>
<A NAME="gettoken">gettoken</A>(isc_lex_t *lexer, isc_token_t *token, isc_tokentype_t expect, isc_boolean_t eol);</CODE></DT>
<DD>
<P>
Gets the next token from the input stream <CODE>lexer</CODE>. Ensure that the
returned token matches <CODE>expect</CODE> (isc_tokentype_qstring can also
return isc_tokentype_string), or isc_tokentype_eol and isc_tokentype_eof if
<CODE>eol</CODE> is <CODE>ISC_TRUE</CODE>.
<P>
Returns <CODE>DNS_R_UNEXPECTED</CODE>, <CODE>DNS_R_UNEXPECTEDEND</CODE>,
<CODE>DNS_R_UNEXPECTEDTOKEN</CODE> and <CODE>DNS_R_SUCCESS</CODE>.
<P>
</DT>
<DT><CODE>static dns_result_t<BR>
<A NAME="mem_tobuffer">mem_tobuffer</A>(isc_buffer_t *target, void *base, unsigned int length);</CODE></DT>
<DD>
<P>
Add the memory referred to by <CODE>base</CODE> to <CODE>target</CODE>.
<P>
Returns <CODE>DNS_R_NOSPACE</CODE> and <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static int<BR>
compare_region(isc_region_t *r1, isc_region_t *r2)</CODE></DT>
<DD>
<P>
Compares two regions returning -1, 0, 1 based on their DNSSEC ordering.
<P>
<DT><CODE>static int<BR>
hexvalue(char value);</CODE></DT>
<DD>
<P>
Returns the hexadecimal value of <CODE>value</CODE> or -1 if not
a hexadecimal character.
<P>
<DT><CODE>static int<BR>
decvalue(char value);</CODE></DT>
<DD>
<P>
Returns the decimal value of <CODE>value</CODE> or -1 if not
a decimal character.
<P>
<DT><CODE>static dns_result_t<BR>
base64_totext(isc_region_t *source, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Convert the region referred to by <CODE>source</CODE> to base64 encoded text
and put it into <CODE>target</CODE>.
<P>
Returns <CODE>DNS_R_NOSPACE</CODE> or <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static dns_result_t<BR>
base64_tobuffer(isc_lex_t *lexer, isc_buffer_t *target,
int length);</CODE></DT>
<DD>
<P>
Read a series of tokens from <CODE>lexer</CODE> that containing base64 data
until one of end of line, <CODE>length</CODE> (<CODE>length</CODE> &gt;= 0)
bytes have been read or base64 pad characters are seen.
If <CODE>length</CODE> &lt; 0 it is ignored otherwise it is an error if there
are not <CODE>length</CODE> octets of data or when processing a token
<CODE>length</CODE> octets would have been exceeded.
<P>
Returns <CODE>DNS_R_BADBASE64</CODE>, <CODE>DNS_R_UNEXPECTED</CODE>,
<CODE>DNS_R_UNEXPECTEDEND</CODE>, <CODE>DNS_R_UNEXPECTEDTOKEN</CODE>
and <CODE>DNS_R_SUCCESS</CODE>.
<P>
<DT><CODE>static dns_result_t<BR>
time_totext(unsigned long value, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Convert the date represented by <CODE>value</CODE> into YYYYMMDDHHMMSS format
taking into account the active epochs. This code is Y2K and Y2038 compliant.
<P>
Returns <CODE>DNS_R_NOSPACE</CODE> and <CODE>DNS_R_SUCCESS</CODE>.
<DT><CODE>static dns_result_t<BR>
time_tobuffer(char *source, isc_buffer_t *target);</CODE></DT>
<DD>
<P>
Take the date in <CODE>source</CODE> and convert it seconds since January 1,
1970 (ignoring leap seconds) and place the least significant 32 bits into
<CODE>target</CODE>.
<P>
Returns <CODE>ISC_R_RANGE</CODE>, <CODE>DNS_R_SYNTAX</CODE>,
<CODE>DNS_R_NOSPACE</CODE> and <CODE>DNS_R_SUCCESS</CODE>.
</DL>
<H2><A NAME="macros">Support Macros<A></H2>
The following macro is available:
<DL>
<DT><CODE>RETERR(x)</CODE><DT>
<DD>
<P>
Evaluate <CODE>x</CODE> and call <CODE>return (<I>&lt;value of x&gt;</I>);</CODE> if the result is not <CODE>DNS_R_SUCCESS</CODE>.
</DL>
</BODY>
</HTML>