1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18: #if defined(LIBC_SCCS) && !defined(lint)
19: static const char rcsid[] = "$BINDId: res_data.c,v 8.17 1999/10/13 17:11:31 vixie Exp $";
20: #endif
21:
22: #include <sys/types.h>
23: #include <sys/param.h>
24: #include <sys/socket.h>
25: #include <sys/time.h>
26:
27: #include <netinet/in.h>
28: #include <arpa/inet.h>
29: #include <arpa/nameser.h>
30:
31: #include <ctype.h>
32: #include <netdb.h>
33: #include <resolv.h>
34: #ifdef BIND_UPDATE
35: #include <res_update.h>
36: #endif
37: #include <stdio.h>
38: #include <stdlib.h>
39: #include <string.h>
40: #include <unistd.h>
41:
42: const char *_res_opcodes[] = {
43: "QUERY",
44: "IQUERY",
45: "CQUERYM",
46: "CQUERYU",
47: "NOTIFY",
48: "UPDATE",
49: "6",
50: "7",
51: "8",
52: "9",
53: "10",
54: "11",
55: "12",
56: "13",
57: "ZONEINIT",
58: "ZONEREF",
59: };
60: libresolv_hidden_data_def (_res_opcodes)
61:
62: #ifdef BIND_UPDATE
63: const char *_res_sectioncodes[] attribute_hidden = {
64: "ZONE",
65: "PREREQUISITES",
66: "UPDATE",
67: "ADDITIONAL",
68: };
69: #endif
70:
71: #ifndef __BIND_NOSTATIC
72: #ifdef _LIBC
73:
74: #else
75: #undef _res
76: struct __res_state _res
77: # if defined(__BIND_RES_TEXT)
78: = { RES_TIMEOUT, }
79: # endif
80: ;
81: #endif
82:
83:
84: #ifndef _LIBC
85: int res_ourserver_p(const res_state, const struct sockaddr_in *);
86: void res_pquery(const res_state, const u_char *, int, FILE *);
87: #endif
88:
89: #ifndef _LIBC
90:
91:
92: int
93: res_init(void) {
94: extern int __res_vinit(res_state, int);
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115: if (!_res.retrans)
116: _res.retrans = RES_TIMEOUT;
117: if (!_res.retry)
118: _res.retry = 4;
119: if (!(_res.options & RES_INIT))
120: _res.options = RES_DEFAULT;
121:
122:
123:
124:
125:
126: if (!_res.id)
127: _res.id = res_randomid();
128:
129: return (__res_vinit(&_res, 1));
130: }
131: #endif
132:
133: void
134: p_query(const u_char *msg) {
135: fp_query(msg, stdout);
136: }
137:
138: void
139: fp_query(const u_char *msg, FILE *file) {
140: fp_nquery(msg, PACKETSZ, file);
141: }
142: libresolv_hidden_def (fp_query)
143:
144: void
145: fp_nquery(const u_char *msg, int len, FILE *file) {
146: if (__res_maybe_init (&_res, 0) == -1)
147: return;
148:
149: res_pquery(&_res, msg, len, file);
150: }
151: libresolv_hidden_def (fp_nquery)
152:
153: int
154: res_mkquery(int op,
155: const char *dname,
156: int class, int type,
157: const u_char *data,
158: int datalen,
159: const u_char *newrr_in,
160: u_char *buf,
161: int buflen)
162: {
163: if (__res_maybe_init (&_res, 1) == -1) {
164: RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
165: return (-1);
166: }
167: return (res_nmkquery(&_res, op, dname, class, type,
168: data, datalen,
169: newrr_in, buf, buflen));
170: }
171:
172: #ifdef BIND_UPDATE
173: int
174: res_mkupdate(ns_updrec *rrecp_in, u_char *buf, int buflen) {
175: if (__res_maybe_init (&_res, 1) == -1) {
176: RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
177: return (-1);
178: }
179:
180: return (res_nmkupdate(&_res, rrecp_in, buf, buflen));
181: }
182: #endif
183:
184: int
185: res_query(const char *name,
186: int class, int type,
187: u_char *answer,
188: int anslen)
189: {
190: if (__res_maybe_init (&_res, 1) == -1) {
191: RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
192: return (-1);
193: }
194: return (res_nquery(&_res, name, class, type, answer, anslen));
195: }
196:
197: void
198: res_send_setqhook(res_send_qhook hook) {
199: _res.qhook = hook;
200: }
201:
202: void
203: res_send_setrhook(res_send_rhook hook) {
204: _res.rhook = hook;
205: }
206:
207: int
208: res_isourserver(const struct sockaddr_in *inp) {
209: return (res_ourserver_p(&_res, (const struct sockaddr_in6 *) inp));
210: }
211:
212: int
213: res_send(const u_char *buf, int buflen, u_char *ans, int anssiz) {
214: if (__res_maybe_init (&_res, 1) == -1) {
215:
216: return (-1);
217: }
218:
219: return (res_nsend(&_res, buf, buflen, ans, anssiz));
220: }
221:
222: #ifndef _LIBC
223: int
224: res_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key,
225: u_char *ans, int anssiz)
226: {
227: if (__res_maybe_init (&_res, 1) == -1) {
228:
229: return (-1);
230: }
231:
232: return (res_nsendsigned(&_res, buf, buflen, key, ans, anssiz));
233: }
234: #endif
235:
236: void
237: res_close(void) {
238: #ifdef _LIBC
239:
240:
241:
242:
243:
244:
245:
246: if ((_res.options & RES_INIT) == 0)
247: return;
248: #endif
249:
250:
251: __res_iclose(&_res, false);
252: }
253:
254: #ifdef BIND_UPDATE
255: int
256: res_update(ns_updrec *rrecp_in) {
257: if (__res_maybe_init (&_res, 1) == -1) {
258: RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
259: return (-1);
260: }
261:
262: return (res_nupdate(&_res, rrecp_in, NULL));
263: }
264: #endif
265:
266: int
267: res_search(const char *name,
268: int class, int type,
269: u_char *answer,
270: int anslen)
271: {
272: if (__res_maybe_init (&_res, 1) == -1) {
273: RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
274: return (-1);
275: }
276:
277: return (res_nsearch(&_res, name, class, type, answer, anslen));
278: }
279:
280: int
281: res_querydomain(const char *name,
282: const char *domain,
283: int class, int type,
284: u_char *answer,
285: int anslen)
286: {
287: if (__res_maybe_init (&_res, 1) == -1) {
288: RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
289: return (-1);
290: }
291:
292: return (res_nquerydomain(&_res, name, domain,
293: class, type,
294: answer, anslen));
295: }
296:
297: const char *
298: hostalias(const char *name) {
299: static char abuf[MAXDNAME];
300:
301: return (res_hostalias(&_res, name, abuf, sizeof abuf));
302: }
303: libresolv_hidden_def (hostalias)
304:
305: #ifdef ultrix
306: int
307: local_hostname_length(const char *hostname) {
308: int len_host, len_domain;
309:
310: if (!*_res.defdname)
311: res_init();
312: len_host = strlen(hostname);
313: len_domain = strlen(_res.defdname);
314: if (len_host > len_domain &&
315: !strcasecmp(hostname + len_host - len_domain, _res.defdname) &&
316: hostname[len_host - len_domain - 1] == '.')
317: return (len_host - len_domain - 1);
318: return (0);
319: }
320: #endif
321:
322: #endif
323: ^L
324:
325: #include <shlib-compat.h>
326:
327: #if SHLIB_COMPAT(libresolv, GLIBC_2_0, GLIBC_2_2)
328: # undef res_mkquery
329: # undef res_query
330: # undef res_querydomain
331: # undef res_search
332: weak_alias (__res_mkquery, res_mkquery);
333: weak_alias (__res_query, res_query);
334: weak_alias (__res_querydomain, res_querydomain);
335: weak_alias (__res_search, res_search);
336: #endif