|
|
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
6: * provided that this notice is preserved and that due credit is given
7: * to the University of California at Berkeley. The name of the University
8: * may not be used to endorse or promote products derived from this
9: * software without specific prior written permission. This software
10: * is provided ``as is'' without express or implied warranty.
11: */
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)skip.c 5.4 (Berkeley) 2/17/88";
15: #endif /* not lint */
16:
17: /*
18: *******************************************************************************
19: *
20: * skip.c --
21: *
22: * Routines to skip over portions of a query buffer.
23: *
24: * Note: this file has been submitted for inclusion in
25: * BIND resolver library. When this has been done, this file
26: * is no longer necessary (assuming there haven't been any
27: * changes).
28: *
29: * Adapted from 4.3BSD BIND res_debug.c
30: *
31: *******************************************************************************
32: */
33:
34: #include <sys/types.h>
35: #include <netinet/in.h>
36: #include <stdio.h>
37: #include <arpa/nameser.h>
38:
39: char *res_skip_rr();
40:
41:
42: /*
43: *******************************************************************************
44: *
45: * res_skip --
46: *
47: * Skip the contents of a query.
48: *
49: * Interpretation of numFieldsToSkip argument:
50: * res_skip returns pointer to:
51: * 1 -> start of question records.
52: * 2 -> start of authoritative answer records.
53: * 3 -> start of additional records.
54: * 4 -> first byte after end of additional records.
55: *
56: * Results:
57: * (address) - success operation.
58: * NULL - a resource record had an incorrect format.
59: *
60: *******************************************************************************
61: */
62:
63: char *
64: res_skip(msg, numFieldsToSkip, eom)
65: char *msg;
66: int numFieldsToSkip;
67: char *eom;
68: {
69: register char *cp;
70: register HEADER *hp;
71: register int tmp;
72: register int n;
73:
74: /*
75: * Skip the header fields.
76: */
77: hp = (HEADER *)msg;
78: cp = msg + sizeof(HEADER);
79:
80: /*
81: * skip question records.
82: */
83: if (n = ntohs(hp->qdcount) ) {
84: while (--n >= 0) {
85: tmp = dn_skipname(cp, eom);
86: if (tmp == -1) return(NULL);
87: cp += tmp;
88: cp += sizeof(u_short); /* type */
89: cp += sizeof(u_short); /* class */
90: }
91: }
92: if (--numFieldsToSkip <= 0) return(cp);
93:
94: /*
95: * skip authoritative answer records
96: */
97: if (n = ntohs(hp->ancount)) {
98: while (--n >= 0) {
99: cp = res_skip_rr(cp, eom);
100: if (cp == NULL) return(NULL);
101: }
102: }
103: if (--numFieldsToSkip == 0) return(cp);
104:
105: /*
106: * skip name server records
107: */
108: if (n = ntohs(hp->nscount)) {
109: while (--n >= 0) {
110: cp = res_skip_rr(cp, eom);
111: if (cp == NULL) return(NULL);
112: }
113: }
114: if (--numFieldsToSkip == 0) return(cp);
115:
116: /*
117: * skip additional records
118: */
119: if (n = ntohs(hp->arcount)) {
120: while (--n >= 0) {
121: cp = res_skip_rr(cp, eom);
122: if (cp == NULL) return(NULL);
123: }
124: }
125:
126: return(cp);
127: }
128:
129:
130: /*
131: *******************************************************************************
132: *
133: * res_skip_rr --
134: *
135: * Skip over resource record fields.
136: *
137: * Results:
138: * (address) - success operation.
139: * NULL - a resource record had an incorrect format.
140: *******************************************************************************
141: */
142:
143: char *
144: res_skip_rr(cp, eom)
145: char *cp;
146: char *eom;
147: {
148: int tmp;
149: int dlen;
150:
151: if ((tmp = dn_skipname(cp, eom)) == -1)
152: return (NULL); /* compression error */
153: cp += tmp;
154: cp += sizeof(u_short); /* type */
155: cp += sizeof(u_short); /* class */
156: cp += sizeof(u_long); /* ttl */
157: dlen = _getshort(cp);
158: cp += sizeof(u_short); /* dlen */
159: cp += dlen;
160: return (cp);
161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.