lwres.html revision d4ef65050feac78554addf6e16a06c6e2e0bd331
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<!--
dcfda24abf565c442d058cbf81b2180d847a1b3eAutomatic Updater - Copyright (C) 2001 Internet Software Consortium.
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews -
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - Permission to use, copy, modify, and distribute this software for any
4a14ce5ba00ab7bc55c99ffdcf59c7a4ab902721Automatic Updater - purpose with or without fee is hereby granted, provided that the above
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - copyright notice and this permission notice appear in all copies.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein -
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein - WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein-->
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<!-- $Id: lwres.html,v 1.2 2001/04/10 21:51:16 bwelling Exp $ -->
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<HTML
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><HEAD
e21a2904f02a03fa06b6db04d348f65fe9c67b2bMark Andrews><TITLE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres</TITLE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><META
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinNAME="GENERATOR"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCONTENT="Modular DocBook HTML Stylesheet Version 1.61
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein"></HEAD
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><BODY
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFENTRY"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinBGCOLOR="#FFFFFF"
71c66a876ecca77923638d3f94cc0783152b2f03Mark AndrewsTEXT="#000000"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinLINK="#0000FF"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinVLINK="#840084"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinALINK="#0000FF"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><H1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinNAME="AEN1"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres</A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></H1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFNAMEDIV"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinNAME="AEN8"
71c66a876ecca77923638d3f94cc0783152b2f03Mark Andrews></A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>Name</H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres&nbsp;--&nbsp;introduction to the lightweight resolver library</DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFSYNOPSISDIV"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><A
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic UpdaterNAME="AEN11"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>Synopsis</H2
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCSYNOPSIS"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><A
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic UpdaterNAME="AEN12"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater></P
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><PRE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCSYNOPSISINFO"
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater>#include &lt;lwres/lwres.h&gt;</PRE
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><P
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater></P
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater></DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></DIV
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><DIV
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic UpdaterCLASS="REFSECT1"
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><A
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic UpdaterNAME="AEN14"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></A
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>DESCRIPTION</H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>The BIND 9 lightweight resolver library is a simple, name service
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinindependent stub resolver library. It provides hostname-to-address
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinand address-to-hostname lookup services to applications by
a1ad6695ed6f988406cf155aa26376f84f73bcb9Automatic Updatertransmitting lookup requests to a resolver daemon
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater<B
a1ad6695ed6f988406cf155aa26376f84f73bcb9Automatic UpdaterCLASS="COMMAND"
44d0f0256fbdce130a18655023c3b06bacacbd61Automatic Updater>lwresd</B
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater>
2895f101b5585a19015ac2c2c1e1812ac467fa12Automatic Updaterrunning on the local host. The resover daemon performs the
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updaterlookup using the DNS or possibly other name service protocols,
44d0f0256fbdce130a18655023c3b06bacacbd61Automatic Updaterand returns the results to the application through the library.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinThe library and resolver daemon communicate using a simple
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinUDP-based protocol.</P
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater></DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFSECT1"
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinNAME="AEN18"
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater></A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>OVERVIEW</H2
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>The lwresd library implements multiple name service APIs.
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic UpdaterThe standard
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater<TT
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic UpdaterCLASS="FUNCTION"
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews>gethostbyname()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
507151045be68c671ffd4e2f37e17cdfa0376fc4Automatic Updater<TT
507151045be68c671ffd4e2f37e17cdfa0376fc4Automatic UpdaterCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>gethostbyaddr()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
71c66a876ecca77923638d3f94cc0783152b2f03Mark AndrewsCLASS="FUNCTION"
71c66a876ecca77923638d3f94cc0783152b2f03Mark Andrews>gethostbyname_r()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
71c66a876ecca77923638d3f94cc0783152b2f03Mark Andrews<TT
71c66a876ecca77923638d3f94cc0783152b2f03Mark AndrewsCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>gethostbyaddr_r()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
71c66a876ecca77923638d3f94cc0783152b2f03Mark Andrews<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>getaddrinfo()</TT
71c66a876ecca77923638d3f94cc0783152b2f03Mark Andrews>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>getipnodebyname()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinand
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>getipnodebyaddr()</TT
71c66a876ecca77923638d3f94cc0783152b2f03Mark Andrews>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfunctions are all supported. To allow the lwres library to coexist
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinwith system libraries that define functions of the same name,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinthe library defines these functions with names prefixed by
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="LITERAL"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinTo define the standard names, applications must include the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinheader file
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FILENAME"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>&lt;lwres/netdb.h&gt;</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinwhich contains macro definitions mapping the standard function names
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeininto
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="LITERAL"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinprefixed ones. Operating system vendors who integrate the lwres
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinlibrary into their base distributions should rename the functions
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinin the library proper so that the renaming macros are not needed.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>The library also provides a native API consisting of the functions
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_getaddrsbyname()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinand
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_getnamebyaddr()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinThese may be called by applications that require more detailed
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeincontrol over the lookup process than the standard functions
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinprovide.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>In addition to these name service independent address lookup
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfunctions, the library implements a new, experimental API
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfor looking up arbitrary DNS resource records, using the
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews<TT
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsCLASS="FUNCTION"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews>lwres_getaddrsbyname()</TT
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews>
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfunction.</P
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews><P
b05bdb520d83f7ecaad708fe305268c3420be01dMark Andrews>Finally, there is a low-level API for converting lookup
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsrequests and responses to and from raw lwres protocol packets.
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsThis API can be used by clients requiring nonblocking operation,
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsand is also used when implementing the server side of the lwres
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsprotocol, for example in the
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews<B
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsCLASS="COMMAND"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews>lwresd</B
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinresolver daemon. The use of this low-level API in clients
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinand servers is outlined in the following sections.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFSECT1"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinNAME="AEN38"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>CLIENT-SIDE LOW-LEVEL API CALL FLOW</H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>When a client program wishes to make an lwres request using the
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updaternative low-level API, it typically performs the following
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updatersequence of actions.</P
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater><P
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater>(1) Allocate or use an existing <SPAN
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic UpdaterCLASS="TYPE"
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater>lwres_packet_t</SPAN
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater>,
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updatercalled <TT
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic UpdaterCLASS="VARNAME"
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater>pkt</TT
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater> below.</P
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater><P
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater>(2) Set <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="STRUCTFIELD"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>pkt.recvlength</I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> to the maximum length we will accept.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinThis is done so the receiver of our packets knows how large our receive
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinbuffer is. The "default" is a constant in
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FILENAME"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres.h</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>: <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CONSTANT"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>LWRES_RECVLENGTH = 4096</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(3) Set <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="STRUCTFIELD"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>pkt.serial</I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinto a unique serial number. This value is echoed
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinback to the application by the remote server.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(4) Set <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="STRUCTFIELD"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>pkt.pktflags</I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>. Usually this is set to 0.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(5) Set <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="STRUCTFIELD"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>pkt.result</I
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews></TT
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews> to 0.</P
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews><P
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>(6) Call <TT
ceeb18e6907a10547859faa340ecad83bedae90cMark AndrewsCLASS="FUNCTION"
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>lwres_*request_render()</TT
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>,
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrewsor marshall in the data using the primitives
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrewssuch as <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>lwres_packet_render()</TT
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrewsand storing the packet data.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>(7) Transmit the resulting buffer.</P
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews><P
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>(8) Call <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_*response_parse()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinto parse any packets received.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(9) Verify that the opcode and serial match a request, and process the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinpacket specific information contained in the body.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFSECT1"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinNAME="AEN61"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>SERVER-SIDE LOW-LEVEL API CALL FLOW</H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>When implementing the server side of the lightweight resolver
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinprotocol using the lwres library, a sequence of actions like the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfollowing is typically involved in processing each request packet.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>Note that the same <SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="TYPE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_packet_t</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> is used
bea931e17b7567f09107f93ab7e25c7f00abeb9cMark Andrewsin both the <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>_parse()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> and <TT
b05bdb520d83f7ecaad708fe305268c3420be01dMark AndrewsCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>_render()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> calls,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinwith only a few modifications made
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinto the packet header's contents between uses. This method is recommended
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinas it keeps the serial, opcode, and other fields correct.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(1) When a packet is received, call <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_*request_parse()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> to
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinunmarshall it. This returns a <SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="TYPE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_packet_t</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> (also called <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="VARNAME"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>pkt</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>, below)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinas well as a data specific type, such as <SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="TYPE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_gabnrequest_t</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(2) Process the request in the data specific type.</P
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews><P
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>(3) Set the <TT
ceeb18e6907a10547859faa340ecad83bedae90cMark AndrewsCLASS="STRUCTFIELD"
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews><I
ceeb18e6907a10547859faa340ecad83bedae90cMark Andrews>pkt.result</I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="STRUCTFIELD"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>pkt.recvlength</I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> as above. All other fields can
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinbe left untouched since they were filled in by the <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>*_parse()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> call
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinabove. If using <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_*response_render()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="STRUCTFIELD"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>pkt.pktflags</I
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> will be set up
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinproperly. Otherwise, the <TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CONSTANT"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>LWRES_LWPACKETFLAG_RESPONSE</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein> bit should be
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinset.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(4) Call the data specific rendering function, such as
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="FUNCTION"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_gabnresponse_render()</TT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(5) Send the resulting packet to the client.</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></DIV
b05bdb520d83f7ecaad708fe305268c3420be01dMark Andrews><DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFSECT1"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinNAME="AEN85"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></A
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>SEE ALSO</H2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CITEREFENTRY"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFENTRYTITLE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_gethostent</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(3)</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CITEREFENTRY"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFENTRYTITLE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_getipnode</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>(3)</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>,
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater<SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic UpdaterCLASS="CITEREFENTRY"
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater><SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic UpdaterCLASS="REFENTRYTITLE"
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>lwres_getnameinfo</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>(3)</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>,
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater<SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic UpdaterCLASS="CITEREFENTRY"
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater><SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic UpdaterCLASS="REFENTRYTITLE"
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>lwres_noop</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>(3)</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>,
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater<SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic UpdaterCLASS="CITEREFENTRY"
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater><SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic UpdaterCLASS="REFENTRYTITLE"
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>lwres_gabn</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>(3)</SPAN
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater>,
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CITEREFENTRY"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFENTRYTITLE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_gnba</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(3)</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CITEREFENTRY"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews><SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFENTRYTITLE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwres_context</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(3)</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<SPAN
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsCLASS="CITEREFENTRY"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews><SPAN
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsCLASS="REFENTRYTITLE"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews>lwres_config</SPAN
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews>(3)</SPAN
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CITEREFENTRY"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFENTRYTITLE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>resolver</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(5)</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="CITEREFENTRY"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein><SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCLASS="REFENTRYTITLE"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>lwresd</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>(8)</SPAN
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>.&#13;</P
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></DIV
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></BODY
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein></HTML
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein>