diff options
author | downsj <> | 1997-04-03 07:31:55 +0000 |
---|---|---|
committer | downsj <> | 1997-04-03 07:31:55 +0000 |
commit | 44847a3d852bdde589a683b45dfb0f0c201c0f70 (patch) | |
tree | bf5d47d8d9dd376393f185c2bc0afb10a863b714 /src | |
parent | 398592cb431ba21dcadc98e80f75246cf1c0cf21 (diff) | |
download | openbsd-44847a3d852bdde589a683b45dfb0f0c201c0f70.tar.gz openbsd-44847a3d852bdde589a683b45dfb0f0c201c0f70.tar.bz2 openbsd-44847a3d852bdde589a683b45dfb0f0c201c0f70.zip |
Full implementation of lookups support, plus some bug fixes. Still no YP.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libc/net/getnetnamadr.c | 165 |
1 files changed, 97 insertions, 68 deletions
diff --git a/src/lib/libc/net/getnetnamadr.c b/src/lib/libc/net/getnetnamadr.c index 7a5ff39cbb..2f4ff3e971 100644 --- a/src/lib/libc/net/getnetnamadr.c +++ b/src/lib/libc/net/getnetnamadr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: getnetnamadr.c,v 1.2 1997/04/03 02:15:16 kstailey Exp $ */ | 1 | /* $OpenBSD: getnetnamadr.c,v 1.3 1997/04/03 07:31:55 downsj Exp $ */ |
2 | 2 | ||
3 | /* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro | 3 | /* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro |
4 | * Dep. Matematica Universidade de Coimbra, Portugal, Europe | 4 | * Dep. Matematica Universidade de Coimbra, Portugal, Europe |
@@ -46,7 +46,7 @@ static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93"; | |||
46 | static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; | 46 | static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; |
47 | static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $"; | 47 | static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $"; |
48 | #else | 48 | #else |
49 | static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.2 1997/04/03 02:15:16 kstailey Exp $"; | 49 | static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.3 1997/04/03 07:31:55 downsj Exp $"; |
50 | #endif | 50 | #endif |
51 | #endif /* LIBC_SCCS and not lint */ | 51 | #endif /* LIBC_SCCS and not lint */ |
52 | 52 | ||
@@ -103,8 +103,8 @@ getnetanswer(answer, anslen, net_i) | |||
103 | int type, class, buflen, ancount, qdcount, haveanswer, i, nchar; | 103 | int type, class, buflen, ancount, qdcount, haveanswer, i, nchar; |
104 | char aux1[30], aux2[30], ans[30], *in, *st, *pauxt, *bp, **ap, | 104 | char aux1[30], aux2[30], ans[30], *in, *st, *pauxt, *bp, **ap, |
105 | *paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0; | 105 | *paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0; |
106 | static struct netent net_entry; | 106 | static struct netent net_entry; |
107 | static char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1]; | 107 | static char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1]; |
108 | 108 | ||
109 | /* | 109 | /* |
110 | * find first satisfactory answer | 110 | * find first satisfactory answer |
@@ -217,8 +217,8 @@ getnetbyaddr(net, net_type) | |||
217 | char lookups[MAXDNSLUS]; | 217 | char lookups[MAXDNSLUS]; |
218 | int i; | 218 | int i; |
219 | 219 | ||
220 | if (net_type != AF_INET) | 220 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) |
221 | return (_getnetbyaddr(net, net_type)); | 221 | return(_getnetbyaddr(net, net_type)); |
222 | 222 | ||
223 | bcopy(_res.lookups, lookups, sizeof lookups); | 223 | bcopy(_res.lookups, lookups, sizeof lookups); |
224 | if (lookups[0] == '\0') | 224 | if (lookups[0] == '\0') |
@@ -226,60 +226,67 @@ getnetbyaddr(net, net_type) | |||
226 | 226 | ||
227 | for (i = 0; i < MAXDNSLUS && lookups[i]; i++) { | 227 | for (i = 0; i < MAXDNSLUS && lookups[i]; i++) { |
228 | switch (lookups[i]) { | 228 | switch (lookups[i]) { |
229 | #if 0 /* def YP */ | 229 | #ifdef YP |
230 | case 'y': | 230 | case 'y': |
231 | /* YP only supports AF_INET. */ | 231 | /* There is no YP support. */ |
232 | if (af == AF_INET) | ||
233 | hp = _yp_gethtbyaddr(addr); | ||
234 | break; | 232 | break; |
235 | #endif | 233 | #endif /* YP */ |
236 | case 'b': | 234 | case 'b': |
237 | break; | 235 | if (net_type != AF_INET) |
238 | case 'f': | 236 | break; /* DNS only supports AF_INET? */ |
239 | return (_getnetbyaddr(net, net_type)); | ||
240 | } | ||
241 | } | ||
242 | 237 | ||
243 | for (nn = 4, net2 = net; net2; net2 >>= 8) | 238 | for (nn = 4, net2 = net; net2; net2 >>= 8) |
244 | netbr[--nn] = net2 & 0xff; | 239 | netbr[--nn] = net2 & 0xff; |
245 | switch (nn) { | 240 | switch (nn) { |
246 | case 3: /* Class A */ | 241 | case 3: /* Class A */ |
247 | snprintf(qbuf, sizeof(qbuf), "0.0.0.%u.in-addr.arpa", netbr[3]); | 242 | snprintf(qbuf, sizeof(qbuf), |
248 | break; | 243 | "0.0.0.%u.in-addr.arpa", netbr[3]); |
249 | case 2: /* Class B */ | 244 | break; |
250 | snprintf(qbuf, sizeof(qbuf), "0.0.%u.%u.in-addr.arpa", | 245 | case 2: /* Class B */ |
251 | netbr[3], netbr[2]); | 246 | snprintf(qbuf, sizeof(qbuf), |
252 | break; | 247 | "0.0.%u.%u.in-addr.arpa", |
253 | case 1: /* Class C */ | 248 | netbr[3], netbr[2]); |
254 | snprintf(qbuf, sizeof(qbuf), "0.%u.%u.%u.in-addr.arpa", | 249 | break; |
255 | netbr[3], netbr[2], netbr[1]); | 250 | case 1: /* Class C */ |
256 | break; | 251 | snprintf(qbuf, sizeof(qbuf), |
257 | case 0: /* Class D - E */ | 252 | "0.%u.%u.%u.in-addr.arpa", |
258 | snprintf(qbuf, sizeof(qbuf), "%u.%u.%u.%u.in-addr.arpa", | 253 | netbr[3], netbr[2], netbr[1]); |
259 | netbr[3], netbr[2], netbr[1], netbr[0]); | 254 | break; |
260 | break; | 255 | case 0: /* Class D - E */ |
261 | } | 256 | snprintf(qbuf, sizeof(qbuf), |
262 | anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); | 257 | "%u.%u.%u.%u.in-addr.arpa", |
263 | if (anslen < 0) { | 258 | netbr[3], netbr[2], netbr[1], netbr[0]); |
259 | break; | ||
260 | } | ||
261 | anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, | ||
262 | sizeof(buf)); | ||
263 | if (anslen < 0) { | ||
264 | #ifdef DEBUG | 264 | #ifdef DEBUG |
265 | if (_res.options & RES_DEBUG) | 265 | if (_res.options & RES_DEBUG) |
266 | printf("res_query failed\n"); | 266 | printf("res_query failed\n"); |
267 | #endif | 267 | #endif |
268 | if (errno == ECONNREFUSED) | 268 | break; |
269 | return (_getnetbyaddr(net, net_type)); | 269 | } |
270 | return (NULL); | 270 | net_entry = getnetanswer(&buf, anslen, BYADDR); |
271 | } | 271 | if (net_entry != NULL) { |
272 | net_entry = getnetanswer(&buf, anslen, BYADDR); | 272 | unsigned u_net = net; /* maybe net should be unsigned ? */ |
273 | if (net_entry) { | ||
274 | unsigned u_net = net; /* maybe net should be unsigned ? */ | ||
275 | 273 | ||
276 | /* Strip trailing zeros */ | 274 | /* Strip trailing zeros */ |
277 | while ((u_net & 0xff) == 0 && u_net != 0) | 275 | while ((u_net & 0xff) == 0 && u_net != 0) |
278 | u_net >>= 8; | 276 | u_net >>= 8; |
279 | net_entry->n_net = u_net; | 277 | net_entry->n_net = u_net; |
280 | return (net_entry); | 278 | return (net_entry); |
279 | } | ||
280 | break; | ||
281 | case 'f': | ||
282 | net_entry = _getnetbyaddr(net, net_type); | ||
283 | if (net_entry != NULL) | ||
284 | return (net_entry); | ||
285 | } | ||
281 | } | 286 | } |
282 | return (_getnetbyaddr(net, net_type)); | 287 | |
288 | /* Nothing matched. */ | ||
289 | return (NULL); | ||
283 | } | 290 | } |
284 | 291 | ||
285 | struct netent * | 292 | struct netent * |
@@ -290,24 +297,46 @@ getnetbyname(net) | |||
290 | querybuf buf; | 297 | querybuf buf; |
291 | char qbuf[MAXDNAME]; | 298 | char qbuf[MAXDNAME]; |
292 | struct netent *net_entry; | 299 | struct netent *net_entry; |
300 | char lookups[MAXDNSLUS]; | ||
301 | int i; | ||
293 | 302 | ||
294 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) { | 303 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) |
295 | h_errno = NETDB_INTERNAL; | 304 | return (_getnetbyname(net)); |
296 | return (NULL); | 305 | |
297 | } | 306 | bcopy(_res.lookups, lookups, sizeof lookups); |
298 | strcpy(&qbuf[0], net); | 307 | if (lookups[0] == '\0') |
299 | anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); | 308 | strncpy(lookups, "bf", sizeof lookups); |
300 | if (anslen < 0) { | 309 | |
310 | for (i = 0; i < MAXDNSLUS && lookups[i]; i++) { | ||
311 | switch (lookups[i]) { | ||
312 | #ifdef YP | ||
313 | case 'y': | ||
314 | /* There is no YP support. */ | ||
315 | break; | ||
316 | #endif /* YP */ | ||
317 | case 'b': | ||
318 | strcpy(&qbuf[0], net); | ||
319 | anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, | ||
320 | sizeof(buf)); | ||
321 | if (anslen < 0) { | ||
301 | #ifdef DEBUG | 322 | #ifdef DEBUG |
302 | if (_res.options & RES_DEBUG) | 323 | if (_res.options & RES_DEBUG) |
303 | printf("res_query failed\n"); | 324 | printf("res_query failed\n"); |
304 | #endif | 325 | #endif |
305 | if (errno == ECONNREFUSED) | 326 | break; |
306 | return (_getnetbyname(net)); | 327 | } |
307 | return (_getnetbyname(net)); | 328 | net_entry = getnetanswer(&buf, anslen, BYNAME); |
329 | if (net_entry != NULL) | ||
330 | return (net_entry); | ||
331 | break; | ||
332 | case 'f': | ||
333 | net_entry = _getnetbyname(net); | ||
334 | if (net_entry != NULL) | ||
335 | return (net_entry); | ||
336 | break; | ||
337 | } | ||
308 | } | 338 | } |
309 | net_entry = getnetanswer(&buf, anslen, BYNAME); | 339 | |
310 | if (net_entry) | 340 | /* Nothing matched. */ |
311 | return (net_entry); | 341 | return (NULL); |
312 | return (_getnetbyname(net)); | ||
313 | } | 342 | } |