2 * Copyright (c) 1994, Garrett Wollman
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * $FreeBSD: src/lib/libc/net/gethostbynis.c,v 1.28 2006/05/12 15:37:23 ume Exp $
26 * $DragonFly: src/lib/libc/net/gethostbynis.c,v 1.4 2005/11/13 02:04:47 swildner Exp $
29 #include <sys/param.h>
30 #include <sys/socket.h>
31 #include <netinet/in.h>
32 #include <arpa/inet.h>
33 #include <arpa/nameser.h>
42 #include <resolv.h> /* XXX */
45 #include <rpcsvc/yp_prot.h>
46 #include <rpcsvc/ypclnt.h>
48 #include "netdb_private.h"
52 _gethostbynis(const char *name
, char *map
, int af
, struct hostent
*he
,
53 struct hostent_data
*hed
)
58 int resultlen
, size
, addrok
= 0;
59 char ypbuf
[YPMAXRECORD
+ 2];
62 statp
= __res_state();
72 RES_SET_H_ERRNO(statp
, NETDB_INTERNAL
);
76 if (hed
->yp_domain
== NULL
)
77 if (yp_get_default_domain (&hed
->yp_domain
)) {
78 RES_SET_H_ERRNO(statp
, NETDB_INTERNAL
);
82 if (yp_match(hed
->yp_domain
, map
, name
, strlen(name
), &result
,
84 RES_SET_H_ERRNO(statp
, HOST_NOT_FOUND
);
88 /* avoid potential memory leak */
89 bcopy((char *)result
, (char *)&ypbuf
, resultlen
);
90 ypbuf
[resultlen
] = '\0';
92 result
= (char *)&ypbuf
;
94 if ((cp
= index(result
, '\n')))
97 cp
= strpbrk(result
, " \t");
99 he
->h_addr_list
= hed
->h_addr_ptrs
;
100 he
->h_addr
= (char *)hed
->host_addr
;
103 addrok
= inet_aton(result
, (struct in_addr
*)hed
->host_addr
);
106 if (statp
->options
& RES_USE_INET6
) {
107 _map_v4v6_address((char *)hed
->host_addr
,
108 (char *)hed
->host_addr
);
114 addrok
= inet_pton(af
, result
, hed
->host_addr
);
118 RES_SET_H_ERRNO(statp
, HOST_NOT_FOUND
);
121 he
->h_addr_list
[1] = NULL
;
124 while (*cp
== ' ' || *cp
== '\t')
127 ep
= hed
->hostbuf
+ sizeof hed
->hostbuf
;
129 q
= he
->h_aliases
= hed
->host_aliases
;
130 p
= strpbrk(cp
, " \t");
133 size
= strlen(cp
) + 1;
134 if (ep
- bp
< size
) {
135 RES_SET_H_ERRNO(statp
, NO_RECOVERY
);
138 strlcpy(bp
, cp
, ep
- bp
);
142 if (*cp
== ' ' || *cp
== '\t') {
146 if (q
>= &hed
->host_aliases
[_MAXALIASES
- 1])
148 p
= strpbrk(cp
, " \t");
151 size
= strlen(cp
) + 1;
154 strlcpy(bp
, cp
, ep
- bp
);
164 _gethostbynisname_r(const char *name
, int af
, struct hostent
*he
,
165 struct hostent_data
*hed
)
171 map
= "hosts.byname";
174 map
= "ipnodes.byname";
177 return (_gethostbynis(name
, map
, af
, he
, hed
));
181 _gethostbynisaddr_r(const void *addr
, socklen_t len
, int af
,
182 struct hostent
*he
, struct hostent_data
*hed
)
189 map
= "hosts.byaddr";
192 map
= "ipnodes.byaddr";
195 if (inet_ntop(af
, addr
, numaddr
, sizeof(numaddr
)) == NULL
)
197 return (_gethostbynis(numaddr
, map
, af
, he
, hed
));
201 /* XXX _gethostbynisname/_gethostbynisaddr only used by getipnodeby*() */
203 _gethostbynisname(const char *name
, int af
)
207 struct hostent_data
*hed
;
212 statp
= __res_state();
213 if ((he
= __hostent_init()) == NULL
||
214 (hed
= __hostent_data_init()) == NULL
) {
215 RES_SET_H_ERRNO(statp
, NETDB_INTERNAL
);
219 oresopt
= statp
->options
;
220 statp
->options
&= ~RES_USE_INET6
;
221 error
= _gethostbynisname_r(name
, af
, he
, hed
);
222 statp
->options
= oresopt
;
223 return (error
== 0) ? he
: NULL
;
230 _gethostbynisaddr(const void *addr
, socklen_t len
, int af
)
234 struct hostent_data
*hed
;
239 statp
= __res_state();
240 if ((he
= __hostent_init()) == NULL
||
241 (hed
= __hostent_data_init()) == NULL
) {
242 RES_SET_H_ERRNO(statp
, NETDB_INTERNAL
);
246 oresopt
= statp
->options
;
247 statp
->options
&= ~RES_USE_INET6
;
248 error
= _gethostbynisaddr_r(addr
, len
, af
, he
, hed
);
249 statp
->options
= oresopt
;
250 return (error
== 0) ? he
: NULL
;
257 _nis_gethostbyname(void *rval
, void *cb_data
, va_list ap
)
264 int *errnop
, *h_errnop
;
265 struct hostent
*hptr
, he
;
266 struct hostent_data
*hed
;
269 name
= va_arg(ap
, const char *);
270 af
= va_arg(ap
, int);
271 hptr
= va_arg(ap
, struct hostent
*);
272 buffer
= va_arg(ap
, char *);
273 buflen
= va_arg(ap
, size_t);
274 errnop
= va_arg(ap
, int *);
275 h_errnop
= va_arg(ap
, int *);
277 *((struct hostent
**)rval
) = NULL
;
279 statp
= __res_state();
280 if ((hed
= __hostent_data_init()) == NULL
) {
281 RES_SET_H_ERRNO(statp
, NETDB_INTERNAL
);
282 *h_errnop
= statp
->res_h_errno
;
283 return (NS_NOTFOUND
);
286 if (_gethostbynisname_r(name
, af
, &he
, hed
) != 0) {
287 *h_errnop
= statp
->res_h_errno
;
288 return (NS_NOTFOUND
);
290 if (__copy_hostent(&he
, hptr
, buffer
, buflen
) != 0) {
291 *h_errnop
= statp
->res_h_errno
;
292 return (NS_NOTFOUND
);
294 *((struct hostent
**)rval
) = hptr
;
297 *((struct hostent
**)rval
) = NULL
;
303 _nis_gethostbyaddr(void *rval
, void *cb_data
, va_list ap
)
311 int *errnop
, *h_errnop
;
312 struct hostent
*hptr
, he
;
313 struct hostent_data
*hed
;
316 addr
= va_arg(ap
, const void *);
317 len
= va_arg(ap
, socklen_t
);
318 af
= va_arg(ap
, int);
319 hptr
= va_arg(ap
, struct hostent
*);
320 buffer
= va_arg(ap
, char *);
321 buflen
= va_arg(ap
, size_t);
322 errnop
= va_arg(ap
, int *);
323 h_errnop
= va_arg(ap
, int *);
325 *((struct hostent
**)rval
) = NULL
;
327 statp
= __res_state();
328 if ((hed
= __hostent_data_init()) == NULL
) {
329 RES_SET_H_ERRNO(statp
, NETDB_INTERNAL
);
330 *h_errnop
= statp
->res_h_errno
;
331 return (NS_NOTFOUND
);
334 if (_gethostbynisaddr_r(addr
, len
, af
, &he
, hed
) != 0) {
335 *h_errnop
= statp
->res_h_errno
;
336 return (NS_NOTFOUND
);
338 if (__copy_hostent(&he
, hptr
, buffer
, buflen
) != 0) {
339 *h_errnop
= statp
->res_h_errno
;
340 return (NS_NOTFOUND
);
342 *((struct hostent
**)rval
) = hptr
;
345 *((struct hostent
**)rval
) = NULL
;