home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / ns2tab / part01 / skip.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-04  |  4.2 KB  |  173 lines

  1. /*
  2.  * Copyright (c) 1985 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted provided
  6.  * that: (1) source distributions retain this entire copyright notice and
  7.  * comment, and (2) distributions including binaries display the following
  8.  * acknowledgement:  ``This product includes software developed by the
  9.  * University of California, Berkeley and its contributors'' in the
  10.  * documentation or other materials provided with the distribution and in
  11.  * all advertising materials mentioning features or use of this software.
  12.  * Neither the name of the University nor the names of its contributors may
  13.  * be used to endorse or promote products derived from this software without
  14.  * specific prior written permission.
  15.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  16.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  17.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  */
  19.  
  20. #ifndef lint
  21. static char sccsid[] = "@(#)skip.c    5.9 (Berkeley) 8/3/90";
  22. #endif /* not lint */
  23.  
  24. /*
  25.  *******************************************************************************
  26.  *
  27.  *  skip.c --
  28.  *
  29.  *    Routines to skip over portions of a query buffer.
  30.  *
  31.  *    Note: this file has been submitted for inclusion in
  32.  *    BIND resolver library. When this has been done, this file
  33.  *    is no longer necessary (assuming there haven't been any
  34.  *    changes).
  35.  *
  36.  *    Adapted from 4.3BSD BIND res_debug.c
  37.  *
  38.  *******************************************************************************
  39.  */
  40.  
  41. #include <sys/types.h>
  42. #include <netinet/in.h>
  43. #include <stdio.h>
  44. #include <arpa/nameser.h>
  45.  
  46. char *res_skip_rr();
  47.  
  48.  
  49. /*
  50.  *******************************************************************************
  51.  *
  52.  *  res_skip --
  53.  *
  54.  *     Skip the contents of a query.
  55.  *
  56.  *     Interpretation of numFieldsToSkip argument:
  57.  *            res_skip returns pointer to:
  58.  *        1 ->  start of question records.
  59.  *        2 ->  start of authoritative answer records.
  60.  *        3 ->  start of additional records.
  61.  *        4 ->  first byte after end of additional records.
  62.  *
  63.  *   Results:
  64.  *    (address)    - success operation.
  65.  *      NULL         - a resource record had an incorrect format.
  66.  *
  67.  *******************************************************************************
  68.  */
  69.  
  70. char *
  71. res_skip(msg, numFieldsToSkip, eom)
  72.     char *msg;
  73.     int numFieldsToSkip;
  74.     char *eom;
  75. {
  76.     register char *cp;
  77.     register HEADER *hp;
  78.     register int tmp;
  79.     register int n;
  80.  
  81.     /*
  82.      * Skip the header fields.
  83.      */
  84.     hp = (HEADER *)msg;
  85.     cp = msg + sizeof(HEADER);
  86.  
  87.     /*
  88.      * skip question records.
  89.      */
  90.     if (n = ntohs(hp->qdcount) ) {
  91.         while (--n >= 0 && cp < eom) {
  92.             tmp = dn_skipname(cp, eom);
  93.             if (tmp == -1) return(NULL);
  94.             cp += tmp;
  95.             cp += sizeof(u_short);    /* type     */
  96.             cp += sizeof(u_short);    /* class     */
  97.         }
  98.     }
  99.     if (--numFieldsToSkip <= 0) return(cp);
  100.  
  101.     /*
  102.      * skip authoritative answer records
  103.      */
  104.     if (n = ntohs(hp->ancount)) {
  105.         while (--n >= 0 && cp < eom) {
  106.             cp = res_skip_rr(cp, eom);
  107.             if (cp == NULL) return(NULL);
  108.         }
  109.     }
  110.     if (--numFieldsToSkip == 0) return(cp);
  111.  
  112.     /*
  113.      * skip name server records
  114.      */
  115.     if (n = ntohs(hp->nscount)) {
  116.         while (--n >= 0 && cp < eom) {
  117.             cp = res_skip_rr(cp, eom);
  118.             if (cp == NULL) return(NULL);
  119.         }
  120.     }
  121.     if (--numFieldsToSkip == 0) return(cp);
  122.  
  123.     /*
  124.      * skip additional records
  125.      */
  126.     if (n = ntohs(hp->arcount)) {
  127.         while (--n >= 0 && cp < eom) {
  128.             cp = res_skip_rr(cp, eom);
  129.             if (cp == NULL) return(NULL);
  130.         }
  131.     }
  132.  
  133.     return(cp);
  134. }
  135.  
  136.  
  137. /*
  138.  *******************************************************************************
  139.  *
  140.  *  res_skip_rr --
  141.  *
  142.  *     Skip over resource record fields.
  143.  *
  144.  *   Results:
  145.  *    (address)    - success operation.
  146.  *      NULL         - a resource record had an incorrect format.
  147.  *******************************************************************************
  148.  */
  149.  
  150. char *
  151. res_skip_rr(cp, eom)
  152.     char *cp;
  153.     char *eom;
  154. {
  155.     int tmp;
  156.     int dlen;
  157.  
  158.     if ((tmp = dn_skipname(cp, eom)) == -1)
  159.         return (NULL);            /* compression error */
  160.     cp += tmp;
  161.     if ((cp + RRFIXEDSZ) > eom)
  162.         return (NULL);
  163.     cp += sizeof(u_short);    /*     type     */
  164.     cp += sizeof(u_short);    /*     class     */
  165.     cp += sizeof(u_long);    /*     ttl     */
  166.     dlen = _getshort(cp);
  167.     cp += sizeof(u_short);    /*     dlen     */
  168.     cp += dlen;
  169.     if (cp > eom)
  170.         return (NULL);
  171.     return (cp);
  172. }
  173.