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

Remove pre-2.2 Linux kernel support.

This commit is contained in:
Joseph Myers
2012-05-14 14:11:02 +00:00
parent 1bfb72913b
commit ffb7875d03
40 changed files with 333 additions and 1447 deletions

View File

@ -1,5 +1,4 @@
/* Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2007
Free Software Foundation, Inc.
/* Copyright (C) 1997-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -32,14 +31,6 @@
#include "netlinkaccess.h"
/* Variable to signal whether SIOCGIFCONF is not available. */
# if __ASSUME_SIOCGIFNAME == 0
static int old_siocgifconf;
#else
# define old_siocgifconf 0
#endif
unsigned int
if_nametoindex (const char *ifname)
{
@ -101,38 +92,20 @@ if_nameindex_ioctl (void)
/* We may be able to get the needed buffer size directly, rather than
guessing. */
if (! old_siocgifconf)
{
ifc.ifc_buf = NULL;
ifc.ifc_len = 0;
if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0 || ifc.ifc_len == 0)
{
# if __ASSUME_SIOCGIFNAME == 0
old_siocgifconf = 1;
# endif
rq_len = RQ_IFS * sizeof (struct ifreq);
}
else
rq_len = ifc.ifc_len;
}
else
ifc.ifc_buf = NULL;
ifc.ifc_len = 0;
if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0 || ifc.ifc_len == 0)
rq_len = RQ_IFS * sizeof (struct ifreq);
else
rq_len = ifc.ifc_len;
/* Read all the interfaces out of the kernel. */
ifc.ifc_buf = alloca (rq_len);
ifc.ifc_len = rq_len;
while (1)
if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0)
{
if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0)
{
close_not_cancel_no_status (fd);
return NULL;
}
if (ifc.ifc_len < rq_len || ! old_siocgifconf)
break;
ifc.ifc_buf = extend_alloca (ifc.ifc_buf, rq_len, 2 * rq_len);
ifc.ifc_len = rq_len;
close_not_cancel_no_status (fd);
return NULL;
}
nifs = ifc.ifc_len / sizeof (struct ifreq);
@ -314,161 +287,31 @@ libc_hidden_def (if_nameindex)
char *
if_indextoname (unsigned int ifindex, char *ifname)
{
#if !defined SIOCGIFINDEX && __ASSUME_SIOCGIFNAME == 0
__set_errno (ENOSYS);
return NULL;
#else
# if __ASSUME_SIOCGIFNAME == 0
struct if_nameindex *idx;
struct if_nameindex *p;
char *result = NULL;
# endif
# if defined SIOCGIFNAME || __ASSUME_SIOCGIFNAME > 0
/* We may be able to do the conversion directly, rather than searching a
list. This ioctl is not present in kernels before version 2.1.50. */
struct ifreq ifr;
int fd;
# if __ASSUME_SIOCGIFNAME == 0
static int siocgifname_works_not;
int status;
if (!siocgifname_works_not)
# endif
{
# if __ASSUME_SIOCGIFNAME == 0
int serrno = errno;
# endif
int status;
fd = __opensock ();
if (fd < 0)
return NULL;
ifr.ifr_ifindex = ifindex;
status = __ioctl (fd, SIOCGIFNAME, &ifr);
close_not_cancel_no_status (fd);
if (status < 0)
{
# if __ASSUME_SIOCGIFNAME == 0
if (errno == EINVAL)
siocgifname_works_not = 1; /* Don't make the same mistake twice. */
else
# endif
{
if (errno == ENODEV)
/* POSIX requires ENXIO. */
__set_errno (ENXIO);
return NULL;
}
}
else
return strncpy (ifname, ifr.ifr_name, IFNAMSIZ);
# if __ASSUME_SIOCGIFNAME == 0
__set_errno (serrno);
# endif
}
# endif
# if __ASSUME_SIOCGIFNAME == 0
idx = if_nameindex ();
if (idx != NULL)
{
for (p = idx; p->if_index || p->if_name; ++p)
if (p->if_index == ifindex)
{
result = strncpy (ifname, p->if_name, IFNAMSIZ);
break;
}
if_freenameindex (idx);
if (result == NULL)
__set_errno (ENXIO);
}
return result;
# endif
#endif
}
libc_hidden_def (if_indextoname)
#if 0
void
internal_function
__protocol_available (int *have_inet, int *have_inet6)
{
int fd = __opensock ();
unsigned int nifs;
int rq_len;
struct ifconf ifc;
# define RQ_IFS 4
/* Wirst case assumption. */
*have_inet = 0;
*have_inet6 = 0;
fd = __opensock ();
if (fd < 0)
/* We cannot open the socket. No networking at all? */
return;
return NULL;
/* We may be able to get the needed buffer size directly, rather than
guessing. */
if (! old_siocgifconf)
{
ifc.ifc_buf = NULL;
ifc.ifc_len = 0;
if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0 || ifc.ifc_len == 0)
{
# if __ASSUME_SIOCGIFNAME == 0
old_siocgifconf = 1;
# endif
rq_len = RQ_IFS * sizeof (struct ifreq);
}
else
rq_len = ifc.ifc_len;
}
else
rq_len = RQ_IFS * sizeof (struct ifreq);
/* Read all the interfaces out of the kernel. */
do
{
ifc.ifc_buf = alloca (ifc.ifc_len = rq_len);
if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0)
{
close_not_cancel_no_status (fd);
return;
}
rq_len *= 2;
}
while (ifc.ifc_len == rq_len && old_siocgifconf);
nifs = ifc.ifc_len / sizeof (struct ifreq);
/* Go through all the interfaces and get the address. */
while (nifs-- > 0)
if (__ioctl (fd, SIOCGIFADDR, &ifc.ifc_req[nifs]) >= 0)
{
/* We successfully got information about this interface. Now
test whether it is an IPv4 or IPv6 address. */
if (ifc.ifc_req[nifs].ifr_addr.sa_family == AF_INET)
*have_inet = 1;
else if (ifc.ifc_req[nifs].ifr_addr.sa_family == AF_INET6)
*have_inet6 = 1;
/* Note, this is & not &&. It works since the values are always
0 or 1. */
if (*have_inet & *have_inet6)
/* We can stop early. */
break;
}
ifr.ifr_ifindex = ifindex;
status = __ioctl (fd, SIOCGIFNAME, &ifr);
close_not_cancel_no_status (fd);
if (status < 0)
{
if (errno == ENODEV)
/* POSIX requires ENXIO. */
__set_errno (ENXIO);
return NULL;
}
else
return strncpy (ifname, ifr.ifr_name, IFNAMSIZ);
}
#endif
libc_hidden_def (if_indextoname)