1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

Added <ifaddrs.h> interface with functions getifaddrs', freeifaddrs'.

This implementation supports only IPv4.
	* inet/ifaddrs.h: New file.
	* sysdeps/generic/ifaddrs.c: New file.
	* sysdeps/gnu/ifaddrs.c: New file.
	* inet/test-ifaddrs.c: New file.
	* inet/Makefile (routines): Add ifaddrs.
	(headers): Add ifaddrs.h here.
	(tests): Add test-ifaddrs.
	* inet/Versions (GLIBC_2.3): New set, add getifaddrs and freeifaddrs.

	* resolv/res_hconf.c (_res_hconf_reorder_addrs): Use an explicit
	socket call to get an AF_INET socket, instead of using __opensock.
	The SIOCGIFNETMASK ioctl will work only with a PF_INET socket.

	* sysdeps/generic/ifreq.h (__ifreq): Take third argument SOCKFD,
	if not -1 use it instead of calling __opensock.
	* sysdeps/unix/sysv/linux/ifreq.h (__ifreq): Likewise.
	* sysdeps/mach/hurd/ifreq.h (__ifreq): Take new argument and ignore it.
	* resolv/res_hconf.c (_res_hconf_reorder_addrs): Pass new argument.

	* sysdeps/mach/hurd/ifreq.h: New file.
	* sysdeps/generic/ifreq.h (__if_freereq): Take second argument NUM_IFS.
	* sysdeps/unix/sysv/linux/ifreq.h (__if_freereq): Likewise.
	* resolv/res_hconf.c (_res_hconf_reorder_addrs): Update caller.
This commit is contained in:
Roland McGrath
2002-07-24 22:56:44 +00:00
parent 11d657d727
commit 7f1deee65e
11 changed files with 485 additions and 22 deletions

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999 Free Software Foundation, Inc.
/* Copyright (C) 1999,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>.
@ -34,21 +34,23 @@ static int old_siocgifconf;
static inline void
__ifreq (struct ifreq **ifreqs, int *num_ifs)
__ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
{
int fd = __opensock ();
int fd = sockfd;
struct ifconf ifc;
int rq_len;
int nifs;
# define RQ_IFS 4
if (fd < 0)
fd = __opensock ();
if (fd < 0)
{
*num_ifs = 0;
*ifreqs = NULL;
return;
}
ifc.ifc_buf = NULL;
/* We may be able to get the needed buffer size directly, rather than
@ -79,8 +81,9 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs)
{
if (ifc.ifc_buf)
free (ifc.ifc_buf);
__close (fd);
if (fd != sockfd)
__close (fd);
*num_ifs = 0;
*ifreqs = NULL;
@ -91,14 +94,16 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs)
while (ifc.ifc_len == rq_len && old_siocgifconf);
nifs = ifc.ifc_len / sizeof (struct ifreq);
__close (fd);
if (fd != sockfd)
__close (fd);
*num_ifs = nifs;
*ifreqs = realloc (ifc.ifc_buf, nifs * sizeof (struct ifreq));
}
static inline void
__if_freereq (struct ifreq *ifreqs)
__if_freereq (struct ifreq *ifreqs, int num_ifs)
{
free (ifreqs);
}