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
Defined variables