|
|
1.1 root 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.8 (Berkeley) 6/21/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 + dlen) > eom)
170: return (NULL);
171: return (cp);
172: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.