]>
git.saurik.com Git - apple/libinfo.git/blob - dns.subproj/getnetnamadr.c
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.1 (the "License"). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
14 * The Original Code and all software distributed under the License are
15 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
22 * @APPLE_LICENSE_HEADER_END@
24 /* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
25 * Dep. Matematica Universidade de Coimbra, Portugal, Europe
27 * Permission to use, copy, modify, and distribute this software for any
28 * purpose with or without fee is hereby granted, provided that the above
29 * copyright notice and this permission notice appear in all copies.
32 * Copyright (c) 1983, 1993
33 * The Regents of the University of California. All rights reserved.
35 * Redistribution and use in source and binary forms, with or without
36 * modification, are permitted provided that the following conditions
38 * 1. Redistributions of source code must retain the above copyright
39 * notice, this list of conditions and the following disclaimer.
40 * 2. Redistributions in binary form must reproduce the above copyright
41 * notice, this list of conditions and the following disclaimer in the
42 * documentation and/or other materials provided with the distribution.
43 * 3. All advertising materials mentioning features or use of this software
44 * must display the following acknowledgement:
45 * This product includes software developed by the University of
46 * California, Berkeley and its contributors.
47 * 4. Neither the name of the University nor the names of its contributors
48 * may be used to endorse or promote products derived from this software
49 * without specific prior written permission.
51 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
52 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
54 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
55 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
59 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
60 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64 #if defined(LIBC_SCCS) && !defined(lint)
65 static char sccsid
[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93";
66 static char sccsid_
[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03";
67 static char rcsid
[] = "$Id: getnetnamadr.c,v 1.3.44.1 2002/11/19 01:20:51 bbraun Exp $";
68 #endif /* LIBC_SCCS and not lint */
70 #include <sys/param.h>
71 #include <sys/socket.h>
72 #include <netinet/in.h>
73 #include <arpa/inet.h>
74 #include <arpa/nameser.h>
86 #if defined(mips) && defined(SYSTYPE_BSD43)
90 struct netent
*_getnetbyaddr
__P((long net
, int type
));
91 struct netent
*_getnetbyname
__P((const char *name
));
98 #define MAXPACKET PACKETSZ
100 #define MAXPACKET 1024
105 u_char buf
[MAXPACKET
];
113 static struct netent
*
114 getnetanswer(answer
, anslen
, net_i
)
124 int type
, class, buflen
, ancount
, qdcount
, haveanswer
, i
, nchar
;
125 char aux1
[30], aux2
[30], *in
, *st
, *pauxt
, *bp
, **ap
,
126 *paux1
= &aux1
[0], *paux2
= &aux2
[0], flag
= 0;
127 static struct netent net_entry
;
128 static char *net_aliases
[MAXALIASES
], *netbuf
= NULL
;
129 static char ans
[MAXDNAME
];
131 if (netbuf
== NULL
) {
132 netbuf
= malloc(BUFSIZ
+1);
139 * find first satisfactory answer
141 * answer --> +------------+ ( MESSAGE )
144 * | Question | the question for the name server
146 * | Answer | RRs answering the question
148 * | Authority | RRs pointing toward an authority
149 * | Additional | RRs holding additional information
152 eom
= answer
->buf
+ anslen
;
154 ancount
= ntohs(hp
->ancount
); /* #/records in the answer section */
155 qdcount
= ntohs(hp
->qdcount
); /* #/entries in the question section */
157 cp
= answer
->buf
+ HFIXEDSZ
;
160 h_errno
= HOST_NOT_FOUND
;
165 while (qdcount
-- > 0) {
166 n
= __dn_skipname(cp
, eom
);
167 if (n
< 0 || (cp
+ n
+ QFIXEDSZ
) > eom
) {
168 h_errno
= NO_RECOVERY
;
175 net_entry
.n_aliases
= net_aliases
;
177 while (--ancount
>= 0 && cp
< eom
) {
178 n
= dn_expand(answer
->buf
, eom
, cp
, bp
, buflen
);
183 (void)strcpy(ans
, bp
);
186 cp
+= INT32SZ
; /* TTL */
188 if (class == C_IN
&& type
== T_PTR
) {
189 n
= dn_expand(answer
->buf
, eom
, cp
, bp
, buflen
);
195 if ((ap
+ 2) < &net_aliases
[MAXALIASES
]) {
197 bp
+= strlen(bp
) + 1;
198 net_entry
.n_addrtype
=
199 (class == C_IN
) ? AF_INET
: AF_UNSPEC
;
208 net_entry
.n_name
= *net_entry
.n_aliases
;
209 net_entry
.n_net
= 0L;
212 ap
= net_entry
.n_aliases
;
216 h_errno
= HOST_NOT_FOUND
;
219 net_entry
.n_name
= ans
;
221 for (i
= 0; i
< 4; i
++) {
222 for (st
= in
, nchar
= 0;
223 isdigit((unsigned char)*st
);
227 if (*st
!= '.' || nchar
== 0 || nchar
> 3)
231 (void)strncpy(paux1
, in
, nchar
);
234 paux2
= strcat(paux1
, paux2
);
239 if (strcasecmp(in
, "IN-ADDR.ARPA") != 0)
241 net_entry
.n_net
= inet_network(paux2
);
244 net_entry
.n_aliases
++;
252 getnetbyaddr(net
, net_type
)
254 register int net_type
;
256 unsigned int netbr
[4];
261 struct netent
*net_entry
;
263 if (net_type
!= AF_INET
)
264 #if defined(__APPLE__)
267 return (_getnetbyaddr(net
, net_type
));
270 for (nn
= 4, net2
= net
; net2
; net2
>>= 8)
271 netbr
[--nn
] = net2
& 0xff;
273 case 3: /* Class A */
274 sprintf(qbuf
, "0.0.0.%u.in-addr.arpa", netbr
[3]);
276 case 2: /* Class B */
277 sprintf(qbuf
, "0.0.%u.%u.in-addr.arpa", netbr
[3], netbr
[2]);
279 case 1: /* Class C */
280 sprintf(qbuf
, "0.%u.%u.%u.in-addr.arpa", netbr
[3], netbr
[2],
283 case 0: /* Class D - E */
284 sprintf(qbuf
, "%u.%u.%u.%u.in-addr.arpa", netbr
[3], netbr
[2],
288 anslen
= res_query(qbuf
, C_IN
, T_PTR
, (u_char
*)&buf
, sizeof(buf
));
291 if (_res
.options
& RES_DEBUG
)
292 printf("res_query failed\n");
294 #if !defined(__APPLE__)
295 if (errno
== ECONNREFUSED
)
296 return (_getnetbyaddr(net
, net_type
));
300 net_entry
= getnetanswer(&buf
, anslen
, BYADDR
);
302 unsigned u_net
= net
; /* maybe net should be unsigned ? */
304 /* Strip trailing zeros */
305 while ((u_net
& 0xff) == 0 && u_net
!= 0)
307 net_entry
->n_net
= u_net
;
310 #if defined(__APPLE__)
313 return (_getnetbyaddr(net
, net_type
));
319 register const char *net
;
324 struct netent
*net_entry
;
326 if ((_res
.options
& RES_INIT
) == 0 && res_init() == -1) {
327 h_errno
= NETDB_INTERNAL
;
330 strcpy(&qbuf
[0], net
);
331 anslen
= res_search(qbuf
, C_IN
, T_PTR
, (u_char
*)&buf
, sizeof(buf
));
334 if (_res
.options
& RES_DEBUG
)
335 printf("res_query failed\n");
337 #if defined(__APPLE__)
340 if (errno
== ECONNREFUSED
)
341 return (_getnetbyname(net
));
342 return (_getnetbyname(net
));
345 net_entry
= getnetanswer(&buf
, anslen
, BYNAME
);
348 #if defined(__APPLE__)
351 return (_getnetbyname(net
));