1 /* IPv4-only variant of gethostbyname.
2 Copyright (C) 2016-2017 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public License as
7 published by the Free Software Foundation; either version 2.1 of the
8 License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If
17 not, see <http://www.gnu.org/licenses/>. */
22 #include <scratch_buffer.h>
26 __libc_rpc_gethostbyname (const char *host
, struct sockaddr_in
*addr
)
28 struct hostent hostbuf
;
29 struct hostent
*hp
= NULL
;
31 struct scratch_buffer tmpbuf
;
32 scratch_buffer_init (&tmpbuf
);
34 while (__gethostbyname2_r (host
, AF_INET
,
35 &hostbuf
, tmpbuf
.data
, tmpbuf
.length
, &hp
,
38 if (herr
!= NETDB_INTERNAL
|| errno
!= ERANGE
)
40 struct rpc_createerr
*ce
= &get_rpc_createerr ();
41 ce
->cf_stat
= RPC_UNKNOWNHOST
;
42 scratch_buffer_free (&tmpbuf
);
47 if (!scratch_buffer_grow (&tmpbuf
))
49 /* If memory allocation failed, allocating the RPC error
50 structure might could as well, so this could lead to a
52 struct rpc_createerr
*ce
= &get_rpc_createerr ();
53 ce
->cf_stat
= RPC_SYSTEMERROR
;
54 ce
->cf_error
.re_errno
= ENOMEM
;
59 if (hp
->h_addrtype
!= AF_INET
|| hp
->h_length
!= sizeof (addr
->sin_addr
))
61 struct rpc_createerr
*ce
= &get_rpc_createerr ();
62 ce
->cf_stat
= RPC_SYSTEMERROR
;
63 ce
->cf_error
.re_errno
= EAFNOSUPPORT
;
64 scratch_buffer_free (&tmpbuf
);
68 addr
->sin_family
= AF_INET
;
69 addr
->sin_port
= htons (0);
70 memcpy (&addr
->sin_addr
, hp
->h_addr
, sizeof (addr
->sin_addr
));
71 scratch_buffer_free (&tmpbuf
);