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:
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user