rdata.html revision 499b34cea04a46823d003d4c0520c8b03e8513cb
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<!--
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - Copyright (C) 1999-2001 Internet Software Consortium.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews -
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - Permission to use, copy, modify, and distribute this software for any
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - purpose with or without fee is hereby granted, provided that the above
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - copyright notice and this permission notice appear in all copies.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews -
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews - WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews-->
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<!-- $Id: rdata.html,v 1.12 2001/01/09 21:47:02 bwelling Exp $ -->
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<HTML>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<HEAD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews <TITLE>Adding new RDATA type</TITLE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</HEAD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<BODY>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Overview</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThe dns rdata routines (<CODE>dns_rdata_fromtext()</CODE>,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>dns_rdata_totext()</CODE>, <CODE>dns_rdata_fromwire()</CODE>,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>dns_rdata_towire()</CODE> <CODE>dns_rdata_fromstruct()</CODE>,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>dns_rdata_tostruct()</CODE> and <CODE>dns_rdata_compare()</CODE>)
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsare designed to provide a single set of routines
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsfor encoding, decoding and comparing dns data preventing the problems that
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsoccurred in BIND 8.x and earlier where there were multiple places in the
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewscode base that
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsdecoded wire format to internal format or compared rdata sometimes with
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewssubtly different behaviour (bugs) or didn't support a particular type leading
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsto internal inconsistancy.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsEach of these generic routines calls type specific routines that provide
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthe type specific details.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsFrom time to time new types are defined and it is necessary to add these types
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsinto the existing structure.
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis document is written to provide instruction on how to do this.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Adding new RDATA types</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsAdding a new rdata type requires determining if the new rdata type is class
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsspecific or generic.
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsWriting code to perform the following set of operations
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsand then integrating it into the build by placing the code into the rdata
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewshierachy at the correct place.
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsRunning <CODE>make clean</CODE> followed <CODE>make</CODE> in
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>lib/dns</CODE> will cause the new rdata type to be picked up.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsEach rdata module must perform the following operations:
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT>Convert from text format to internal format</DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT>Convert from internal format to text format</DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT>Convert from wire format to internal format</DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT>Convert from internal format to wire format</DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT>Convert from a structure to internal format</DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT>Convert from internal format to a structure</DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT>Compare two rdata in internal format<DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThere is an additional set of support <A HREF="#functions">functions</A> and
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<A HREF="#macros">macros</A> only available to
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsto rdata code.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>RDATA Hierarchy</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThe <CODE>rdata</CODE> hierarchy has the following format.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews rdata/
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews generic/
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews <I>typename_typenumber</I>.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews <I>classname_classnumber</I>/
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews <I>typename_typenumber</I>.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsInitial rdata hierarchy:
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews rdata/
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews generic/
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews ns_2.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews md_3.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews mf_4.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews cname_5.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews soa_6.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews mb_7.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews mg_8.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews mr_9.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews null_10.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews ptr_12.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews hinfo_13.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews minfo_14.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews mx_15.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews txt_16.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews rp_17.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews afsdb_18.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews x25_19.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isdn_20.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews rt_21.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews sig_24.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews key_25.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews gpos_27.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews loc_29.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews nxt_30.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews cert_37.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews dname_39.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews unspec_103.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews tkey_249.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews in_1/
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews a_1.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews wks_11.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews nsap_22.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews nsap-ptr_23.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews px_26.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews aaaa_28.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews srv_33.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews naptr_35.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews kx_36.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews a6_38.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews any_255/
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews tsig_250.h
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>CLASSNAME and TYPENAME</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsClass and type names must be from the following alphabet and less that 11
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewscharacters in length or otherwise they will be ignored.
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsPermissible alphabet: a to z, 0 to 9 and dash (-).
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsDash is mapped to underscore (_) for the C function names below.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Internal Format</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThe internal format chosen is DNS wire format without any compression being
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsapplied to domain names in the rdata.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Convert from text format to internal format</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThe functions to convert from text format has the following call formats and
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsis declared as follows for class generic functions.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsfromtext_<I>typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_lex_t *lexer, dns_name_t *origin,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_boolean_t downcase, isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsClass specific functions contain the class name in addition to the
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstype name.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsfromtext_<I>classname_typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_lex_t *lexer, dns_name_t *origin,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_boolean_t downcase, isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>class</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis argument should be ignored when used with a class generic RR type
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsotherwise <CODE>REQUIRE(class == #)</CODE> should be present at the start
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsof the function.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>type</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis should be tested with a <CODE>REQUIRE(type == #)</CODE> statement at
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthe begining of the function.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>lexer</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is used to read the input text stream.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>origin</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is a absolute name used to qualify unqualified / partially qualified
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsdomainnames in the text stream.
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsIt is passed to the name parsing routines.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>downcase</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is passed to the name parsing routines to determine whether to downcase
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthe names it generates or leave them in the case they are pesented in.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>target</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is a <CODE>BINARY</CODE> buffer used to write the internal format of the rdata record being read in to.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>fromtext_<I>typename</I>()</CODE> reads tokens from <CODE>lexer</CODE>,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsup to but not including the end of line (EOL) token or end of file (EOF) token.
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsIf the EOL / EOF token is read it should be returned to the input stream.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<A HREF="#gettoken"><CODE>gettoken()</CODE></A>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsshould be used to read the next token from the input stream and
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewswill return EOL / EOF tokens
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsautomatically unless
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthey are specifcally requested.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>isc_lex_ungettoken()</CODE> should
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsbe used to return EOL / EOF (or any other token) to the input stream if
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthe EOL / EOF token is read.
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsUnused tokens will cause <CODE>dns_rdata_fromtext()</CODE> to return
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>DNS_R_EXTRATOKEN</CODE> if <CODE>fromtext_<I>typename</I>()</CODE> was successful.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>fromtext_<I>typename</I>()</CODE> reads external input and as such is a high security area and must be paranoid about its input.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Convert from internal format to text format</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstotext_<I>typename</I>(dns_rdata_t *rdata, dns_name_t *origin,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstotext_<I>classname_typename</I>(dns_rdata_t *rdata, dns_name_t *origin,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>rdata</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is the rdata record to be converted from internal format to text.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>rdata->type</CODE> and <CODE>rdata->class</CODE> for class specific
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsRR types should be checked at the start of the function with
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>REQUIRE(rdata->type ==�#)</CODE> statements.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>origin</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsIf this in non <CODE>NULL</CODE> then any domainnames with this suffix
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsshould be written out unqualified.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<A HREF="#name_prefix"><CODE>name_prefix()</CODE></A> can be used to
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewscheck if <CODE>origin</CODE> is <CODE>NULL</CODE> and provide the correct
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsarguments to the name conversion routines.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>target</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is a <CODE>TEXT</CODE> buffer used to hold the output.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Convert from wire format to internal format</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsfromwire_<I>typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_buffer_t *source, dns_decompress_t *dctx,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_boolean_t downcase, isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsfromwire_<I>classname_typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_buffer_t *source, dns_decompress_t *dctx,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_boolean_t downcase, isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>fromwire_<I>classname_typename</I>()</CODE> is required to set the valid
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsdecompression methods if there is a domain name in the rdata.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>if (dns_decompress_edns(dctx) >= # || !dns_decompress_strict(dctx))
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews dns_decompress_setmethods(dctx, DNS_COMPRESS_ALL);
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewselse
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>class</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis argument should be ignored when used with a class generic RR type
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsotherwise <CODE>REQUIRE(class == #)</CODE> should be present at the start
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsof the function.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>type</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis should be tested with a <CODE>REQUIRE(type == #)</CODE> statement at
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthe begining of the function.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>source</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is a <CODE>BINARY</CODE> buffer with the <CODE>active</CODE> region
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewscontaining a RR record in wire format.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>dctx</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is the decompression context and is passed to
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>dns_name_fromwire()</CODE>,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsalong with <CODE>downcase</CODE>, to enable a compressed domain name
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsto be extracted from the source.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>downcase</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is passed to <CODE>dns_name_fromwire()</CODE> to say whether the
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsextracted domainname should be downcased during the extraction.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>target</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is a <CODE>BINARY</CODE> buffer where the decompressed and checked
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsRR record is written.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>fromwire_<I>typename</I>()</CODE> is a security sensitive routine
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsas it reads external data and should take extreme care to ensure that
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthe input data matches its description.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsIf the <CODE>active</CODE> buffer is not empty at completion and
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>fromwire_<I>typename</I>()</CODE> was otherwise successful
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>dns_rdata_fromwire()</CODE> will return <CODE>DNS_R_EXTRADATA</CODE>.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Convert from internal format to wire format</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstowire_<I>typename</I>(dns_rdata_t *rdata, dns_compress_t *cctx,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstowire_<I>classname_typename</I>(dns_rdata_t *rdata, dns_compress_t *cctx,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews isc_buffer_t *target);<CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<P>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>towire_<I>classname_typename</I>()</CODE> is required to set the
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsallowed name compression methods based on EDNS version if there is a
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsdomain name in the rdata.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>if (dns_compress_getedns(cctx) >= #)
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewselse
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>rdata</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is the rdata record to be converted from internal format to text.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>rdata->type</CODE> and <CODE>rdata->class</CODE> for class specific
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsRR types should be checked at the start of the function with
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>REQUIRE(rdata->type ==�#)</CODE> statements.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>cctx</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is the compression context, it should be passed to <CODE>dns_name_towire()</CODE> when putting domainnames on the wire.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>target</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is a <CODE>BINARY</CODE> buffer used to write the rdata to.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsSimple RR types without domainnames can use the following code to
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstransfer the contents of the <CODE>rdata</CODE> to the target buffer.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews <CODE>return (<A HREF="#mem_tobuffer">mem_tobuffer</A>(target, rdata->data, rdata->length));</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Convert from a structure to internal format</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsfromstruct_<I>typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews void *source, isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsfromstruct_<I>classname_typename</I>(dns_rdataclass_t class, dns_rdatatype_t type,
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews void *source, isc_buffer_t *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>class</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis argument should be ignored when used with a class generic RR type
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsotherwise <CODE>REQUIRE(class == #)</CODE> should be present at the start
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsof the function.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>type</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis should be tested with a <CODE>REQUIRE(type == #)</CODE> statement at
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsthe beginning of the function.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>source</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis points to a type specific structure.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>target</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is a <CODE>BINARY</CODE> buffer used to write the internal format of the rdata record being read in to.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Convert from internal format to a structure</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstostruct_<I>typename</I>(dns_rdata_t *rdata, void *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static dns_result_t
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewstostruct_<I>classname_typename</I>(dns_rdata_t *rdata, void *target);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>rdata</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsThis is the rdata record to be converted from internal format to a structure.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>rdata->type</CODE> and <CODE>rdata->class</CODE> for class specific
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsRR types should be checked at the start of the function with
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>REQUIRE(rdata->type ==�#)</CODE> statements.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DT><CODE>target</CODE></DT>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<DD>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsPointer to a type specific structure.
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</DL>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<H2>Compare two rdata in internal format</H2>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static int
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewscompare_<I>typename</I>(dns_rdata_t *rdata1, dns_rdata_t *rdata2);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews<CODE>static int
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewscompare_<I>classname_typename</I>(dns_rdata_t *rdata1, dns_rdata_t *rdata2);</CODE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews</PRE>
63dd46733010bb9622810faa17d88c3e3c28b730Mark AndrewsCompares <CODE>rdata1</CODE> and <CODE>rdata2<CODE> as required for DNSSEC
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsordering. The routine should
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrewsensure 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>