summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordownsj <>1997-04-03 07:31:55 +0000
committerdownsj <>1997-04-03 07:31:55 +0000
commit44847a3d852bdde589a683b45dfb0f0c201c0f70 (patch)
treebf5d47d8d9dd376393f185c2bc0afb10a863b714 /src
parent398592cb431ba21dcadc98e80f75246cf1c0cf21 (diff)
downloadopenbsd-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.c165
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";
46static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; 46static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03";
47static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $"; 47static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $";
48#else 48#else
49static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.2 1997/04/03 02:15:16 kstailey Exp $"; 49static 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;
106static struct netent net_entry; 106 static struct netent net_entry;
107static 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
285struct netent * 292struct 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}