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

parse.c
Go to the documentation of this file.
00001 /*
00002  * parse.c
00003  * - parsing assistance functions (mainly for domains inside datagrams)
00004  */
00005 /*
00006  *  This file is
00007  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
00008  *
00009  *  It is part of adns, which is
00010  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
00011  *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
00012  *
00013  *  This program is free software; you can redistribute it and/or modify
00014  *  it under the terms of the GNU General Public License as published by
00015  *  the Free Software Foundation; either version 2, or (at your option)
00016  *  any later version.
00017  *
00018  *  This program is distributed in the hope that it will be useful,
00019  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00020  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021  *  GNU General Public License for more details.
00022  *
00023  *  You should have received a copy of the GNU General Public License
00024  *  along with this program; if not, write to the Free Software Foundation,
00025  *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00026  */
00027 
00028 #ifdef ADNS_JGAA_WIN32
00029 # include "adns_win32.h"
00030 #endif
00031 
00032 #include "internal.h"
00033 
00034 int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len) {
00035   char qbuf[10];
00036   int i, ch;
00037 
00038   while (len) {
00039     qbuf[0]= 0;
00040     for (i=0; i<len; i++) {
00041       ch= buf[i];
00042       if (ch <= ' ' || ch >= 127) {
00043     sprintf(qbuf,"\\%03o",ch);
00044     break;
00045       } else if (!ctype_domainunquoted(ch)) {
00046     sprintf(qbuf,"\\%c",ch);
00047     break;
00048       }
00049     }
00050     if (!adns__vbuf_append(vb,buf,i) || !adns__vbuf_append(vb,(byte*)qbuf,(int)  strlen(qbuf)))
00051       return 0;
00052     if (i<len) i++;
00053     buf+= i;
00054     len-= i;
00055   }
00056   return 1;
00057 }
00058 
00059 void adns__findlabel_start(findlabel_state *fls, adns_state ads,
00060                int serv, adns_query qu,
00061                const byte *dgram, int dglen, int max,
00062                int dmbegin, int *dmend_rlater) {
00063   fls->ads= ads;
00064   fls->qu= qu;
00065   fls->serv= serv;
00066   fls->dgram= dgram;
00067   fls->dglen= dglen;
00068   fls->max= max;
00069   fls->cbyte= dmbegin;
00070   fls->namelen= 0;
00071   fls->dmend_r= dmend_rlater;
00072 }
00073 
00074 adns_status adns__findlabel_next(findlabel_state *fls,
00075                  int *lablen_r, int *labstart_r) {
00076   int lablen, jumpto;
00077   const char *dgram;
00078 
00079   dgram= (char*)fls->dgram;
00080   for (;;) {
00081     if (fls->cbyte >= fls->dglen) goto x_truncated;
00082     if (fls->cbyte >= fls->max) goto x_badresponse;
00083     GET_B(fls->cbyte,lablen);
00084     if (!(lablen & 0x0c0)) break;
00085     if ((lablen & 0x0c0) != 0x0c0) return adns_s_unknownformat;
00086     if (fls->cbyte >= fls->dglen) goto x_truncated;
00087     if (fls->cbyte >= fls->max) goto x_badresponse;
00088     GET_B(fls->cbyte,jumpto);
00089     jumpto |= (lablen&0x3f)<<8;
00090     if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte;
00091     fls->cbyte= jumpto;
00092     fls->dmend_r= 0; fls->max= fls->dglen+1;
00093   }
00094   if (labstart_r) *labstart_r= fls->cbyte;
00095   if (lablen) {
00096     if (fls->namelen) fls->namelen++;
00097     fls->namelen+= lablen;
00098     if (fls->namelen > DNS_MAXDOMAIN) return adns_s_answerdomaintoolong;
00099     fls->cbyte+= lablen;
00100     if (fls->cbyte > fls->dglen) goto x_truncated;
00101     if (fls->cbyte > fls->max) goto x_badresponse;
00102   } else {
00103     if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte;
00104   }
00105   *lablen_r= lablen;
00106   return adns_s_ok;
00107 
00108  x_truncated:
00109   *lablen_r= -1;
00110   return adns_s_ok;
00111 
00112  x_badresponse:
00113   adns__diag(fls->ads,fls->serv,fls->qu,"label in domain runs beyond end of domain");
00114   return adns_s_invalidresponse;
00115 }
00116 
00117 adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
00118                    vbuf *vb, adns_queryflags flags,
00119                    const byte *dgram, int dglen, int *cbyte_io, int max) {
00120   findlabel_state fls;
00121 
00122   adns__findlabel_start(&fls,ads, serv,qu, dgram,dglen,max, *cbyte_io,cbyte_io);
00123   vb->used= 0;
00124   return adns__parse_domain_more(&fls,ads,qu, vb,flags,dgram);
00125 }
00126 
00127 adns_status adns__parse_domain_more(findlabel_state *fls, adns_state ads,
00128                     adns_query qu, vbuf *vb, parsedomain_flags flags,
00129                     const byte *dgram) {
00130   int lablen, labstart, i, ch, first;
00131   adns_status st;
00132 
00133   first= 1;
00134   for (;;) {
00135     st= adns__findlabel_next(fls,&lablen,&labstart);
00136     if (st) return st;
00137     if (lablen<0) { vb->used=0; return adns_s_ok; }
00138     if (!lablen) break;
00139     if (first) {
00140       first= 0;
00141     } else {
00142       if (!adns__vbuf_append(vb,(byte*)".",1)) return adns_s_nomemory;
00143     }
00144     if (flags & pdf_quoteok) {
00145       if (!vbuf__append_quoted1035(vb,dgram+labstart,lablen))
00146     return adns_s_nomemory;
00147     } else {
00148       ch= dgram[labstart];
00149       if (!ctype_alpha(ch) && !ctype_digit(ch)) return adns_s_answerdomaininvalid;
00150       for (i= labstart+1; i<labstart+lablen; i++) {
00151     ch= dgram[i];
00152     if (ch != '-' && !ctype_alpha(ch) && !ctype_digit(ch))
00153       return adns_s_answerdomaininvalid;
00154       }
00155       if (!adns__vbuf_append(vb,dgram+labstart,lablen))
00156     return adns_s_nomemory;
00157     }
00158   }
00159   if (!adns__vbuf_append(vb,(byte*)"",1)) return adns_s_nomemory;
00160   return adns_s_ok;
00161 }
00162 
00163 adns_status adns__findrr_anychk(adns_query qu, int serv,
00164                 const byte *dgram, int dglen, int *cbyte_io,
00165                 int *type_r, int *class_r, unsigned long *ttl_r,
00166                 int *rdlen_r, int *rdstart_r,
00167                 const byte *eo_dgram, int eo_dglen, int eo_cbyte,
00168                 int *eo_matched_r) {
00169   findlabel_state fls, eo_fls;
00170   int cbyte;
00171 
00172   int tmp, rdlen, mismatch;
00173   unsigned long ttl;
00174   int lablen, labstart, ch;
00175   int eo_lablen, eo_labstart, eo_ch;
00176   adns_status st;
00177 
00178   cbyte= *cbyte_io;
00179 
00180   adns__findlabel_start(&fls,qu->ads, serv,qu, dgram,dglen,dglen,cbyte,&cbyte);
00181   if (eo_dgram) {
00182     adns__findlabel_start(&eo_fls,qu->ads, -1,0, eo_dgram,eo_dglen,eo_dglen,eo_cbyte,0);
00183     mismatch= 0;
00184   } else {
00185     mismatch= 1;
00186   }
00187 
00188   for (;;) {
00189     st= adns__findlabel_next(&fls,&lablen,&labstart);
00190     if (st) return st;
00191     if (lablen<0) goto x_truncated;
00192 
00193     if (!mismatch) {
00194       st= adns__findlabel_next(&eo_fls,&eo_lablen,&eo_labstart);
00195       assert(!st); assert(eo_lablen>=0);
00196       if (lablen != eo_lablen) mismatch= 1;
00197       while (!mismatch && eo_lablen-- > 0) {
00198     ch= dgram[labstart++]; if (ctype_alpha(ch)) ch &= ~32;
00199     eo_ch= eo_dgram[eo_labstart++]; if (ctype_alpha(eo_ch)) eo_ch &= ~32;
00200     if (ch != eo_ch) mismatch= 1;
00201       }
00202     }
00203     if (!lablen) break;
00204   }
00205   if (eo_matched_r) *eo_matched_r= !mismatch;
00206 
00207   if (cbyte+10>dglen) goto x_truncated;
00208   GET_W(cbyte,tmp); *type_r= tmp;
00209   GET_W(cbyte,tmp); *class_r= tmp;
00210 
00211   GET_L(cbyte,ttl);
00212   if (ttl > MAXTTLBELIEVE) ttl= MAXTTLBELIEVE;
00213   *ttl_r= ttl;
00214 
00215   GET_W(cbyte,rdlen); if (rdlen_r) *rdlen_r= rdlen;
00216   if (rdstart_r) *rdstart_r= cbyte;
00217   cbyte+= rdlen;
00218   if (cbyte>dglen) goto x_truncated;
00219   *cbyte_io= cbyte;
00220   return adns_s_ok;
00221 
00222  x_truncated:
00223   *type_r= -1;
00224   return 0;
00225 }
00226 
00227 adns_status adns__findrr(adns_query qu, int serv,
00228              const byte *dgram, int dglen, int *cbyte_io,
00229              int *type_r, int *class_r, unsigned long *ttl_r,
00230              int *rdlen_r, int *rdstart_r,
00231              int *ownermatchedquery_r) {
00232   if (!ownermatchedquery_r) {
00233     return adns__findrr_anychk(qu,serv,
00234                    dgram,dglen,cbyte_io,
00235                    type_r,class_r,ttl_r,rdlen_r,rdstart_r,
00236                    0,0,0, 0);
00237   } else if (!qu->cname_dgram) {
00238     return adns__findrr_anychk(qu,serv,
00239                    dgram,dglen,cbyte_io,
00240                    type_r,class_r,ttl_r,rdlen_r,rdstart_r,
00241                    qu->query_dgram,qu->query_dglen,DNS_HDRSIZE,
00242                    ownermatchedquery_r);
00243   } else {
00244     return adns__findrr_anychk(qu,serv,
00245                    dgram,dglen,cbyte_io,
00246                    type_r,class_r,ttl_r,rdlen_r,rdstart_r,
00247                    qu->cname_dgram,qu->cname_dglen,qu->cname_begin,
00248                    ownermatchedquery_r);
00249   }
00250 }

Generated on Sat May 26 2012 04:18:02 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.