ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

internal.h
Go to the documentation of this file.
00001 /*
00002  * internal.h
00003  * - declarations of private objects with external linkage (adns__*)
00004  * - definitons of internal macros
00005  * - comments regarding library data structures
00006  */
00007 /*
00008  *  This file is
00009  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
00010  *
00011  *  It is part of adns, which is
00012  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
00013  *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
00014  *
00015  *  This program is free software; you can redistribute it and/or modify
00016  *  it under the terms of the GNU General Public License as published by
00017  *  the Free Software Foundation; either version 2, or (at your option)
00018  *  any later version.
00019  *
00020  *  This program is distributed in the hope that it will be useful,
00021  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  *  GNU General Public License for more details.
00024  *
00025  *  You should have received a copy of the GNU General Public License
00026  *  along with this program; if not, write to the Free Software Foundation,
00027  *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00028  */
00029 
00030 #ifndef ADNS_INTERNAL_H_INCLUDED
00031 #define ADNS_INTERNAL_H_INCLUDED
00032 
00033 #include "config.h"
00034 
00035 #ifndef ADNS_JGAA_WIN32
00036 typedef unsigned char byte;
00037 #endif
00038 
00039 
00040 #include <stdarg.h>
00041 #include <assert.h>
00042 
00043 #ifndef ADNS_JGAA_WIN32
00044 # include <unistd.h>
00045 #endif
00046 #include <signal.h>
00047 #include <errno.h>
00048 #include <string.h>
00049 
00050 #ifndef ADNS_JGAA_WIN32
00051 #  include <sys/time.h>
00052 #endif
00053 
00054 #include "adns.h"
00055 #include "dlist.h"
00056 
00057 #ifdef ADNS_REGRESS_TEST
00058 # include "hredirect.h"
00059 #endif
00060 
00061 /* Configuration and constants */
00062 
00063 #define MAXSERVERS 5
00064 #define MAXSORTLIST 15
00065 #define UDPMAXRETRIES 15
00066 #define UDPRETRYMS 2000
00067 #define TCPWAITMS 30000
00068 #define TCPCONNMS 14000
00069 #define TCPIDLEMS 30000
00070 #define MAXTTLBELIEVE (7*86400) /* any TTL > 7 days is capped */
00071 
00072 #define DNS_PORT 53
00073 #define DNS_MAXUDP 512
00074 #define DNS_MAXLABEL 63
00075 #define DNS_MAXDOMAIN 255
00076 #define DNS_HDRSIZE 12
00077 #define DNS_IDOFFSET 0
00078 #define DNS_CLASS_IN 1
00079 
00080 #define DNS_INADDR_ARPA "in-addr", "arpa"
00081 
00082 #define MAX_POLLFDS  ADNS_POLLFDS_RECOMMENDED
00083 
00084 typedef enum {
00085   cc_user,
00086   cc_entex,
00087   cc_freq
00088 } consistency_checks;
00089 
00090 typedef enum {
00091   rcode_noerror,
00092   rcode_formaterror,
00093   rcode_servfail,
00094   rcode_nxdomain,
00095   rcode_notimp,
00096   rcode_refused
00097 } dns_rcode;
00098 
00099 /* Shared data structures */
00100 
00101 typedef union {
00102   adns_status status;
00103   char *cp;
00104   adns_rrtype type;
00105   int i;
00106   struct in_addr ia;
00107   unsigned long ul;
00108 } rr_align;
00109 
00110 typedef struct {
00111   int used, avail;
00112   byte *buf;
00113 } vbuf;
00114 
00115 typedef struct {
00116   adns_state ads;
00117   adns_query qu;
00118   int serv;
00119   const byte *dgram;
00120   int dglen, nsstart, nscount, arcount;
00121   struct timeval now;
00122 } parseinfo;
00123 
00124 typedef struct {
00125   adns_rrtype type;
00126   const char *rrtname;
00127   const char *fmtname;
00128   int rrsz;
00129 
00130   void (*makefinal)(adns_query qu, void *data);
00131   /* Change memory management of *data.
00132    * Previously, used alloc_interim, now use alloc_final.
00133    */
00134 
00135   adns_status (*convstring)(vbuf *vb, const void *data);
00136   /* Converts the RR data to a string representation in vbuf.
00137    * vbuf will be appended to (it must have been initialised),
00138    * and will not be null-terminated by convstring.
00139    */
00140 
00141   adns_status (*parse)(const parseinfo *pai, int cbyte, int max, void *store_r);
00142   /* Parse one RR, in dgram of length dglen, starting at cbyte and
00143    * extending until at most max.
00144    *
00145    * The RR should be stored at *store_r, of length qu->typei->rrsz.
00146    *
00147    * If there is an overrun which might indicate truncation, it should set
00148    * *rdstart to -1; otherwise it may set it to anything else positive.
00149    *
00150    * nsstart is the offset of the authority section.
00151    */
00152 
00153   int (*diff_needswap)(adns_state ads, const void *datap_a, const void *datap_b);
00154   /* Returns !0 if RR a should be strictly after RR b in the sort order,
00155    * 0 otherwise.  Must not fail.
00156    */
00157 } typeinfo;
00158 
00159 typedef struct allocnode {
00160   struct allocnode *next, *back;
00161 } allocnode;
00162 
00163 union maxalign {
00164   byte d[1];
00165   struct in_addr ia;
00166   long l;
00167   void *p;
00168   void (*fp)(void);
00169   union maxalign *up;
00170 };
00171 
00172 typedef struct {
00173   void *ext;
00174   void (*callback)(adns_query parent, adns_query child);
00175   union {
00176     adns_rr_addr ptr_parent_addr;
00177     adns_rr_hostaddr *hostaddr;
00178   } info;
00179 } qcontext;
00180 
00181 struct adns__query {
00182   adns_state ads;
00183   enum { query_tosend, query_tcpw, query_childw, query_done } state;
00184   adns_query back, next, parent;
00185   struct { adns_query head, tail; } children;
00186   struct { adns_query back, next; } siblings;
00187   struct { allocnode *head, *tail; } allocations;
00188   int interim_allocd, preserved_allocd;
00189   void *final_allocspace;
00190 
00191   const typeinfo *typei;
00192   byte *query_dgram;
00193   int query_dglen;
00194 
00195   vbuf vb;
00196   /* General-purpose messing-about buffer.
00197    * Wherever a `big' interface is crossed, this may be corrupted/changed
00198    * unless otherwise specified.
00199    */
00200 
00201   adns_answer *answer;
00202   /* This is allocated when a query is submitted, to avoid being unable
00203    * to relate errors to queries if we run out of memory.  During
00204    * query processing status, rrs is 0.  cname is set if
00205    * we found a cname (this corresponds to cname_dgram in the query
00206    * structure).  type is set from the word go.  nrrs and rrs
00207    * are set together, when we find how many rrs there are.
00208    * owner is set during querying unless we're doing searchlist,
00209    * in which case it is set only when we find an answer.
00210    */
00211 
00212   byte *cname_dgram;
00213   int cname_dglen, cname_begin;
00214   /* If non-0, has been allocated using . */
00215 
00216   vbuf search_vb;
00217   int search_origlen, search_pos, search_doneabs;
00218   /* Used by the searching algorithm.  The query domain in textual form
00219    * is copied into the vbuf, and _origlen set to its length.  Then
00220    * we walk the searchlist, if we want to.  _pos says where we are
00221    * (next entry to try), and _doneabs says whether we've done the
00222    * absolute query yet (0=not yet, 1=done, -1=must do straight away,
00223    * but not done yet).  If flags doesn't have adns_qf_search then
00224    * the vbuf is initialised but empty and everything else is zero.
00225    */
00226 
00227   int id, flags, retries;
00228   int udpnextserver;
00229   unsigned long udpsent; /* bitmap indexed by server */
00230   struct timeval timeout;
00231   time_t expires; /* Earliest expiry time of any record we used. */
00232 
00233   qcontext ctx;
00234 
00235   /* Possible states:
00236    *
00237    *  state   Queue   child  id   nextudpserver  udpsent     tcpfailed
00238    *
00239    *  tosend  NONE    null   >=0  0              zero        zero
00240    *  tosend  udpw    null   >=0  any            nonzero     zero
00241    *  tosend  NONE    null   >=0  any            nonzero     zero
00242    *
00243    *  tcpw    tcpw    null   >=0  irrelevant     any         any
00244    *
00245    *  child   childw  set    >=0  irrelevant     irrelevant  irrelevant
00246    *  child   NONE    null   >=0  irrelevant     irrelevant  irrelevant
00247    *  done    output  null   -1   irrelevant     irrelevant  irrelevant
00248    *
00249    * Queries are only not on a queue when they are actually being processed.
00250    * Queries in state tcpw/tcpw have been sent (or are in the to-send buffer)
00251    * iff the tcp connection is in state server_ok.
00252    *
00253    *                  +------------------------+
00254    *             START -----> |      tosend/NONE       |
00255    *                  +------------------------+
00256    *                         /                       |\  \
00257    *        too big for UDP /             UDP timeout  \  \ send via UDP
00258    *        send via TCP   /              more retries  \  \
00259    *        when conn'd   /                  desired     \  \
00260    *                     |                                |  |
00261    *                     v                |  v
00262    *              +-----------+                     +-------------+
00263    *              | tcpw/tcpw | ________                | tosend/udpw |
00264    *              +-----------+         \           +-------------+
00265    *                 |    |              |     UDP timeout | |
00266    *                 |    |              |      no more    | |
00267    *                 |    |              |      retries    | |
00268    *                  \   | TCP died     |      desired    | |
00269    *                   \   \ no more     |                 | |
00270    *                    \   \ servers    | TCP            /  |
00271    *                     \   \ to try    | timeout       /   |
00272    *                  got \   \          v             |_    | got
00273    *                 reply \   _| +------------------+      / reply
00274    *                        \     | done/output FAIL |     /
00275    *                         \    +------------------+    /
00276    *                          \                          /
00277    *                           _|                      |_
00278    *                             (..... got reply ....)
00279    *                              /                   \
00280    *        need child query/ies /                     \ no child query
00281    *                            /                       \
00282    *                          |_                         _|
00283    *           +---------------+               +----------------+
00284    *               | childw/childw | ----------------> | done/output OK |
00285    *               +---------------+  children done    +----------------+
00286    */
00287 };
00288 
00289 struct query_queue { adns_query head, tail; };
00290 
00291 struct adns__state {
00292   adns_initflags iflags;
00293   FILE *diagfile;
00294   int configerrno;
00295   struct query_queue udpw, tcpw, childw, output;
00296   adns_query forallnext;
00297   int nextid;
00298   ADNS_SOCKET udpsocket, tcpsocket;
00299   vbuf tcpsend, tcprecv;
00300   int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip;
00301   enum adns__tcpstate {
00302     server_disconnected, server_connecting,
00303     server_ok, server_broken
00304   } tcpstate;
00305   struct timeval tcptimeout;
00306   /* This will have tv_sec==0 if it is not valid.  It will always be
00307    * valid if tcpstate _connecting.  When _ok, it will be nonzero if
00308    * we are idle (ie, tcpw queue is empty), in which case it is the
00309    * absolute time when we will close the connection.
00310    */
00311 #ifndef ADNS_JGAA_WIN32
00312   struct sigaction stdsigpipe;
00313   sigset_t stdsigmask;
00314 #endif
00315   struct pollfd pollfds_buf[MAX_POLLFDS];
00316   struct server {
00317     struct in_addr addr;
00318   } servers[MAXSERVERS];
00319   struct sortlist {
00320     struct in_addr base, mask;
00321   } sortlist[MAXSORTLIST];
00322   char **searchlist;
00323 };
00324 
00325 /* From setup.c: */
00326 
00327 int adns__setnonblock(adns_state ads, ADNS_SOCKET fd); /* => errno value */
00328 
00329 /* From general.c: */
00330 
00331 void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
00332          int serv, adns_query qu, const char *fmt, va_list al);
00333 
00334 void adns__debug(adns_state ads, int serv, adns_query qu,
00335          const char *fmt, ...) PRINTFFORMAT(4,5);
00336 void adns__warn(adns_state ads, int serv, adns_query qu,
00337         const char *fmt, ...) PRINTFFORMAT(4,5);
00338 void adns__diag(adns_state ads, int serv, adns_query qu,
00339         const char *fmt, ...) PRINTFFORMAT(4,5);
00340 
00341 int adns__vbuf_ensure(vbuf *vb, int want);
00342 int adns__vbuf_appendstr(vbuf *vb, const char *data); /* does not include nul */
00343 int adns__vbuf_append(vbuf *vb, const byte *data, int len);
00344 /* 1=>success, 0=>realloc failed */
00345 void adns__vbuf_appendq(vbuf *vb, const byte *data, int len);
00346 void adns__vbuf_init(vbuf *vb);
00347 void adns__vbuf_free(vbuf *vb);
00348 
00349 const char *adns__diag_domain(adns_state ads, int serv, adns_query qu,
00350                   vbuf *vb, const byte *dgram, int dglen, int cbyte);
00351 /* Unpicks a domain in a datagram and returns a string suitable for
00352  * printing it as.  Never fails - if an error occurs, it will
00353  * return some kind of string describing the error.
00354  *
00355  * serv may be -1 and qu may be 0.  vb must have been initialised,
00356  * and will be left in an arbitrary consistent state.
00357  *
00358  * Returns either vb->buf, or a pointer to a string literal.  Do not modify
00359  * vb before using the return value.
00360  */
00361 
00362 void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
00363          int (*needswap)(void *context, const void *a, const void *b),
00364          void *context);
00365 /* Does an insertion sort of array which must contain nobjs objects
00366  * each sz bytes long.  tempbuf must point to a buffer at least
00367  * sz bytes long.  needswap should return !0 if a>b (strictly, ie
00368  * wrong order) 0 if a<=b (ie, order is fine).
00369  */
00370 
00371 void adns__sigpipe_protect(adns_state);
00372 void adns__sigpipe_unprotect(adns_state);
00373 /* If SIGPIPE protection is not disabled, will block all signals except
00374  * SIGPIPE, and set SIGPIPE's disposition to SIG_IGN.  (And then restore.)
00375  * Each call to _protect must be followed by a call to _unprotect before
00376  * any significant amount of code gets to run, since the old signal mask
00377  * is stored in the adns structure.
00378  */
00379 
00380 /* From transmit.c: */
00381 
00382 adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r,
00383               const char *owner, int ol,
00384               const typeinfo *typei, adns_queryflags flags);
00385 /* Assembles a query packet in vb.  A new id is allocated and returned.
00386  */
00387 
00388 adns_status adns__mkquery_frdgram(adns_state ads, vbuf *vb, int *id_r,
00389                   const byte *qd_dgram, int qd_dglen, int qd_begin,
00390                   adns_rrtype type, adns_queryflags flags);
00391 /* Same as adns__mkquery, but takes the owner domain from an existing datagram.
00392  * That domain must be correct and untruncated.
00393  */
00394 
00395 void adns__querysend_tcp(adns_query qu, struct timeval now);
00396 /* Query must be in state tcpw/tcpw; it will be sent if possible and
00397  * no further processing can be done on it for now.  The connection
00398  * might be broken, but no reconnect will be attempted.
00399  */
00400 
00401 void adns__query_send(adns_query qu, struct timeval now);
00402 /* Query must be in state tosend/NONE; it will be moved to a new state,
00403  * and no further processing can be done on it for now.
00404  * (Resulting state is one of udp/timew, tcpwait/timew (if server not connected),
00405  *  tcpsent/timew, child/childw or done/output.)
00406  * __query_send may decide to use either UDP or TCP depending whether
00407  * _qf_usevc is set (or has become set) and whether the query is too
00408  * large.
00409  */
00410 
00411 /* From query.c: */
00412 
00413 adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
00414                   const typeinfo *typei, vbuf *qumsg_vb, int id,
00415                   adns_queryflags flags, struct timeval now,
00416                   const qcontext *ctx);
00417 /* Submits a query (for internal use, called during external submits).
00418  *
00419  * The new query is returned in *query_r, or we return adns_s_nomemory.
00420  *
00421  * The query datagram should already have been assembled in qumsg_vb;
00422  * the memory for it is _taken over_ by this routine whether it
00423  * succeeds or fails (if it succeeds, the vbuf is reused for qu->vb).
00424  *
00425  * *ctx is copied byte-for-byte into the query.
00426  *
00427  * When the child query is done, ctx->callback will be called.  The
00428  * child will already have been taken off both the global list of
00429  * queries in ads and the list of children in the parent.  The child
00430  * will be freed when the callback returns.  The parent will have been
00431  * taken off the global childw queue.
00432  *
00433  * The callback should either call adns__query_done, if it is
00434  * complete, or adns__query_fail, if an error has occurred, in which
00435  * case the other children (if any) will be cancelled.  If the parent
00436  * has more unfinished children (or has just submitted more) then the
00437  * callback may choose to wait for them - it must then put the parent
00438  * back on the childw queue.
00439  */
00440 
00441 void adns__search_next(adns_state ads, adns_query qu, struct timeval now);
00442 /* Walks down the searchlist for a query with adns_qf_search.
00443  * The query should have just had a negative response, or not had
00444  * any queries sent yet, and should not be on any queue.
00445  * The query_dgram if any will be freed and forgotten and a new
00446  * one constructed from the search_* members of the query.
00447  *
00448  * Cannot fail (in case of error, calls adns__query_fail).
00449  */
00450 
00451 void *adns__alloc_interim(adns_query qu, size_t sz);
00452 void *adns__alloc_preserved(adns_query qu, size_t sz);
00453 /* Allocates some memory, and records which query it came from
00454  * and how much there was.
00455  *
00456  * If an error occurs in the query, all the memory from _interim is
00457  * simply freed.  If the query succeeds, one large buffer will be made
00458  * which is big enough for all these allocations, and then
00459  * adns__alloc_final will get memory from this buffer.
00460  *
00461  * _alloc_interim can fail (and return 0).
00462  * The caller must ensure that the query is failed.
00463  *
00464  * The memory from _preserved is is kept and transferred into the
00465  * larger buffer - unless we run out of memory, in which case it too
00466  * is freed.  When you use _preserved you have to add code to the
00467  * x_nomem error exit case in adns__makefinal_query to clear out the
00468  * pointers you made to those allocations, because that's when they're
00469  * thrown away; you should also make a note in the declaration of
00470  * those pointer variables, to note that they are _preserved rather
00471  * than _interim.  If they're in the answer, note it here:
00472  *  answer->cname and answer->owner are _preserved.
00473  */
00474 
00475 void adns__transfer_interim(adns_query from, adns_query to, void *block, size_t sz);
00476 /* Transfers an interim allocation from one query to another, so that
00477  * the `to' query will have room for the data when we get to makefinal
00478  * and so that the free will happen when the `to' query is freed
00479  * rather than the `from' query.
00480  *
00481  * It is legal to call adns__transfer_interim with a null pointer; this
00482  * has no effect.
00483  *
00484  * _transfer_interim also ensures that the expiry time of the `to' query
00485  * is no later than that of the `from' query, so that child queries'
00486  * TTLs get inherited by their parents.
00487  */
00488 
00489 void *adns__alloc_mine(adns_query qu, size_t sz);
00490 /* Like _interim, but does not record the length for later
00491  * copying into the answer.  This just ensures that the memory
00492  * will be freed when we're done with the query.
00493  */
00494 
00495 void *adns__alloc_final(adns_query qu, size_t sz);
00496 /* Cannot fail, and cannot return 0.
00497  */
00498 
00499 void adns__makefinal_block(adns_query qu, void **blpp, size_t sz);
00500 void adns__makefinal_str(adns_query qu, char **strp);
00501 
00502 void adns__reset_preserved(adns_query qu);
00503 /* Resets all of the memory management stuff etc. to take account of
00504  * only the _preserved stuff from _alloc_preserved.  Used when we find
00505  * an error somewhere and want to just report the error (with perhaps
00506  * CNAME, owner, etc. info), and also when we're halfway through RRs
00507  * in a datagram and discover that we need to retry the query.
00508  */
00509 
00510 void adns__query_done(adns_query qu);
00511 void adns__query_fail(adns_query qu, adns_status stat);
00512 
00513 /* From reply.c: */
00514 
00515 void adns__procdgram(adns_state ads, const byte *dgram, int len,
00516              int serv, int viatcp, struct timeval now);
00517 /* This function is allowed to cause new datagrams to be constructed
00518  * and sent, or even new queries to be started.  However,
00519  * query-sending functions are not allowed to call any general event
00520  * loop functions in case they accidentally call this.
00521  *
00522  * Ie, receiving functions may call sending functions.
00523  * Sending functions may NOT call receiving functions.
00524  */
00525 
00526 /* From types.c: */
00527 
00528 const typeinfo *adns__findtype(adns_rrtype type);
00529 
00530 /* From parse.c: */
00531 
00532 typedef struct {
00533   adns_state ads;
00534   adns_query qu;
00535   int serv;
00536   const byte *dgram;
00537   int dglen, max, cbyte, namelen;
00538   int *dmend_r;
00539 } findlabel_state;
00540 
00541 void adns__findlabel_start(findlabel_state *fls, adns_state ads,
00542                int serv, adns_query qu,
00543                const byte *dgram, int dglen, int max,
00544                int dmbegin, int *dmend_rlater);
00545 /* Finds labels in a domain in a datagram.
00546  *
00547  * Call this routine first.
00548  * dmend_rlater may be null.  ads (and of course fls) may not be.
00549  * serv may be -1, qu may be null - they are for error reporting.
00550  */
00551 
00552 adns_status adns__findlabel_next(findlabel_state *fls, int *lablen_r, int *labstart_r);
00553 /* Then, call this one repeatedly.
00554  *
00555  * It will return adns_s_ok if all is well, and tell you the length
00556  * and start of successive labels.  labstart_r may be null, but
00557  * lablen_r must not be.
00558  *
00559  * After the last label, it will return with *lablen_r zero.
00560  * Do not then call it again; instead, just throw away the findlabel_state.
00561  *
00562  * *dmend_rlater will have been set to point to the next part of
00563  * the datagram after the label (or after the uncompressed part,
00564  * if compression was used).  *namelen_rlater will have been set
00565  * to the length of the domain name (total length of labels plus
00566  * 1 for each intervening dot).
00567  *
00568  * If the datagram appears to be truncated, *lablen_r will be -1.
00569  * *dmend_rlater, *labstart_r and *namelen_r may contain garbage.
00570  * Do not call _next again.
00571  *
00572  * There may also be errors, in which case *dmend_rlater,
00573  * *namelen_rlater, *lablen_r and *labstart_r may contain garbage.
00574  * Do not then call findlabel_next again.
00575  */
00576 
00577 typedef enum {
00578   pdf_quoteok= 0x001
00579 } parsedomain_flags;
00580 
00581 adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
00582                    vbuf *vb, adns_queryflags flags,
00583                    const byte *dgram, int dglen, int *cbyte_io, int max);
00584 /* vb must already have been initialised; it will be reset if necessary.
00585  * If there is truncation, vb->used will be set to 0; otherwise
00586  * (if there is no error) vb will be null-terminated.
00587  * If there is an error vb and *cbyte_io may be left indeterminate.
00588  *
00589  * serv may be -1 and qu may be 0 - they are used for error reporting only.
00590  */
00591 
00592 adns_status adns__parse_domain_more(findlabel_state *fls, adns_state ads,
00593                     adns_query qu, vbuf *vb, parsedomain_flags flags,
00594                     const byte *dgram);
00595 /* Like adns__parse_domain, but you pass it a pre-initialised findlabel_state,
00596  * for continuing an existing domain or some such of some kind.  Also, unlike
00597  * _parse_domain, the domain data will be appended to vb, rather than replacing
00598  * the existing contents.
00599  */
00600 
00601 adns_status adns__findrr(adns_query qu, int serv,
00602              const byte *dgram, int dglen, int *cbyte_io,
00603              int *type_r, int *class_r, unsigned long *ttl_r,
00604              int *rdlen_r, int *rdstart_r,
00605              int *ownermatchedquery_r);
00606 /* Finds the extent and some of the contents of an RR in a datagram
00607  * and does some checks.  The datagram is *dgram, length dglen, and
00608  * the RR starts at *cbyte_io (which is updated afterwards to point
00609  * to the end of the RR).
00610  *
00611  * The type, class, TTL and RRdata length and start are returned iff
00612  * the corresponding pointer variables are not null.  type_r, class_r
00613  * and ttl_r may not be null.  The TTL will be capped.
00614  *
00615  * If ownermatchedquery_r != 0 then the owner domain of this
00616  * RR will be compared with that in the query (or, if the query
00617  * has gone to a CNAME lookup, with the canonical name).
00618  * In this case, *ownermatchedquery_r will be set to 0 or 1.
00619  * The query datagram (or CNAME datagram) MUST be valid and not truncated.
00620  *
00621  * If there is truncation then *type_r will be set to -1 and
00622  * *cbyte_io, *class_r, *rdlen_r, *rdstart_r and *eo_matched_r will be
00623  * undefined.
00624  *
00625  * qu must obviously be non-null.
00626  *
00627  * If an error is returned then *type_r will be undefined too.
00628  */
00629 
00630 adns_status adns__findrr_anychk(adns_query qu, int serv,
00631                 const byte *dgram, int dglen, int *cbyte_io,
00632                 int *type_r, int *class_r, unsigned long *ttl_r,
00633                 int *rdlen_r, int *rdstart_r,
00634                 const byte *eo_dgram, int eo_dglen, int eo_cbyte,
00635                 int *eo_matched_r);
00636 /* Like adns__findrr_checked, except that the datagram and
00637  * owner to compare with can be specified explicitly.
00638  *
00639  * If the caller thinks they know what the owner of the RR ought to
00640  * be they can pass in details in eo_*: this is another (or perhaps
00641  * the same datagram), and a pointer to where the putative owner
00642  * starts in that datagram.  In this case *eo_matched_r will be set
00643  * to 1 if the datagram matched or 0 if it did not.  Either
00644  * both eo_dgram and eo_matched_r must both be non-null, or they
00645  * must both be null (in which case eo_dglen and eo_cbyte will be ignored).
00646  * The eo datagram and contained owner domain MUST be valid and
00647  * untruncated.
00648  */
00649 
00650 void adns__update_expires(adns_query qu, unsigned long ttl, struct timeval now);
00651 /* Updates the `expires' field in the query, so that it doesn't exceed
00652  * now + ttl.
00653  */
00654 
00655 int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len);
00656 
00657 /* From event.c: */
00658 
00659 void adns__tcp_broken(adns_state ads, const char *what, const char *why);
00660 /* what and why may be both 0, or both non-0. */
00661 
00662 void adns__tcp_tryconnect(adns_state ads, struct timeval now);
00663 
00664 void adns__autosys(adns_state ads, struct timeval now);
00665 /* Make all the system calls we want to if the application wants us to.
00666  * Must not be called from within adns internal processing functions,
00667  * lest we end up in recursive descent !
00668  */
00669 
00670 void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,
00671                  struct timeval *tv_buf);
00672 
00673 int adns__pollfds(adns_state ads, struct pollfd pollfds_buf[MAX_POLLFDS]);
00674 void adns__fdevents(adns_state ads,
00675             const struct pollfd *pollfds, int npollfds,
00676             int maxfd, const fd_set *readfds,
00677             const fd_set *writefds, const fd_set *exceptfds,
00678             struct timeval now, int *r_r);
00679 int adns__internal_check(adns_state ads,
00680              adns_query *query_io,
00681              adns_answer **answer,
00682              void **context_r);
00683 
00684 void adns__timeouts(adns_state ads, int act,
00685             struct timeval **tv_io, struct timeval *tvbuf,
00686             struct timeval now);
00687 /* If act is !0, then this will also deal with the TCP connection
00688  * if previous events broke it or require it to be connected.
00689  */
00690 
00691 /* From check.c: */
00692 
00693 void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc);
00694 
00695 /* Useful static inline functions: */
00696 
00697 static inline int ctype_whitespace(int c) { return c==' ' || c=='\n' || c=='\t'; }
00698 static inline int ctype_digit(int c) { return c>='0' && c<='9'; }
00699 static inline int ctype_alpha(int c) {
00700   return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
00701 }
00702 static inline int ctype_822special(int c) { return strchr("()<>@,;:\\\".[]",c) != 0; }
00703 static inline int ctype_domainunquoted(int c) {
00704   return ctype_alpha(c) || ctype_digit(c) || (strchr("-_/+",c) != 0);
00705 }
00706 
00707 static inline int errno_resources(int e) { return e==ENOMEM || e==ENOBUFS; }
00708 
00709 /* Useful macros */
00710 
00711 #define MEM_ROUND(sz) \
00712   (( ((sz)+sizeof(union maxalign)-1) / sizeof(union maxalign) ) \
00713    * sizeof(union maxalign) )
00714 
00715 #define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ff)
00716 #define GET_B(cb,tv) ((tv)= GETIL_B((cb)))
00717 #define GET_W(cb,tv) ((tv)=0, (tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))
00718 #define GET_L(cb,tv) ( (tv)=0, \
00719                (tv)|=(GETIL_B((cb))<<24), \
00720                (tv)|=(GETIL_B((cb))<<16), \
00721                (tv)|=(GETIL_B((cb))<<8), \
00722                (tv)|=GETIL_B(cb), \
00723                (tv) )
00724 
00725 #endif

Generated on Fri May 25 2012 04:17:28 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.