1: /*
   2:  *******************************************************************************
   3:  *
   4:  *  skip.c --
   5:  *
   6:  *	Routines to skip over portions of a query buffer.
   7:  *
   8:  *	Note: this file has been submitted for inclusion in
   9:  *	BIND resolver library. When this has been done, this file
  10:  *	is no longer necessary (assuming there haven't been any
  11:  *	changes).
  12:  *
  13:  *	Adapted from 4.3BSD BIND res_debug.c
  14:  *
  15:  *	Copyright (c) 1985 Regents of the University of California.
  16:  *	All rights reserved.  The Berkeley software License Agreement
  17:  *	specifies the terms and conditions for redistribution.
  18:  *
  19:  *******************************************************************************
  20:  */
  21: 
  22: #ifndef lint
  23: static char sccsid[] = "@(#)skip.c	5.1 (Berkeley) 11/29/85";
  24: #endif not lint
  25: 
  26: #include <sys/types.h>
  27: #include <netinet/in.h>
  28: #include <stdio.h>
  29: #include <arpa/nameser.h>
  30: 
  31: char *res_skip_rr();
  32: 
  33: 
  34: /*
  35:  *******************************************************************************
  36:  *
  37:  *  res_skip --
  38:  *
  39:  * 	Skip the contents of a query.
  40:  *
  41:  * 	Interpretation of numFieldsToSkip argument:
  42:  *            res_skip returns pointer to:
  43:  *    	1 ->  start of question records.
  44:  *    	2 ->  start of authoritative answer records.
  45:  *    	3 ->  start of additional records.
  46:  *    	4 ->  first byte after end of additional records.
  47:  *
  48:  *   Results:
  49:  *	(address)	- success operation.
  50:  *  	NULL 		- a resource record had an incorrect format.
  51:  *
  52:  *******************************************************************************
  53:  */
  54: 
  55: char *
  56: res_skip(msg, numFieldsToSkip)
  57:     char *msg;
  58:     int numFieldsToSkip;
  59: {
  60:     register char *cp;
  61:     register HEADER *hp;
  62:     register int tmp;
  63:     register int n;
  64: 
  65:     /*
  66: 	 * Skip the header fields.
  67: 	 */
  68:     hp = (HEADER *)msg;
  69:     cp = msg + sizeof(HEADER);
  70: 
  71:     /*
  72: 	 * skip question records.
  73: 	 */
  74:     if (n = ntohs(hp->qdcount) ) {
  75:         while (--n >= 0) {
  76:             tmp = dn_skip(cp);
  77:             if (tmp == -1) return(NULL);
  78:             cp += tmp;
  79:             cp += sizeof(u_short);  /* type 	*/
  80:             cp += sizeof(u_short);  /* class 	*/
  81:         }
  82:     }
  83:     if (--numFieldsToSkip <= 0) return(cp);
  84: 
  85:     /*
  86: 	 * skip authoritative answer records
  87: 	 */
  88:     if (n = ntohs(hp->ancount)) {
  89:         while (--n >= 0) {
  90:             cp = res_skip_rr(cp);
  91:             if (cp == NULL) return(NULL);
  92:         }
  93:     }
  94:     if (--numFieldsToSkip == 0) return(cp);
  95: 
  96:     /*
  97: 	 * skip name server records
  98: 	 */
  99:     if (n = ntohs(hp->nscount)) {
 100:         while (--n >= 0) {
 101:             cp = res_skip_rr(cp);
 102:             if (cp == NULL) return(NULL);
 103:         }
 104:     }
 105:     if (--numFieldsToSkip == 0) return(cp);
 106: 
 107:     /*
 108: 	 * skip additional records
 109: 	 */
 110:     if (n = ntohs(hp->arcount)) {
 111:         while (--n >= 0) {
 112:             cp = res_skip_rr(cp);
 113:             if (cp == NULL) return(NULL);
 114:         }
 115:     }
 116: 
 117:     return(cp);
 118: }
 119: 
 120: 
 121: /*
 122:  *******************************************************************************
 123:  *
 124:  *  res_skip_rr --
 125:  *
 126:  * 	Skip over resource record fields.
 127:  *
 128:  *   Results:
 129:  *	(address)	- success operation.
 130:  *  	NULL 		- a resource record had an incorrect format.
 131:  *******************************************************************************
 132:  */
 133: 
 134: char *
 135: res_skip_rr(cp)
 136:     char *cp;
 137: {
 138:     int tmp;
 139:     int dlen;
 140: 
 141:     if ((tmp = dn_skip(cp)) == -1)
 142:         return (NULL);          /* compression error */
 143:     cp += tmp;
 144:     cp += sizeof(u_short);  /* 	type 	*/
 145:     cp += sizeof(u_short);  /* 	class 	*/
 146:     cp += sizeof(u_long);   /* 	ttl 	*/
 147:     dlen = getshort(cp);
 148:     cp += sizeof(u_short);  /* 	dlen 	*/
 149:     cp += dlen;
 150:     return (cp);
 151: }

Defined functions

res_skip_rr defined in line 134; used 4 times

Defined variables

sccsid defined in line 23; never used
Last modified: 1985-11-30
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 942
Valid CSS Valid XHTML 1.0 Strict