diff options
author | Roland McGrath <roland@gnu.org> | 2002-11-26 03:29:06 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-11-26 03:29:06 +0000 |
commit | 6938e63f714b15c377d8cbf8e97b6f15b0e1b692 (patch) | |
tree | 953d8b439443cb9e73dd8021709ddefc06786aea /sysdeps/generic | |
parent | 14fa7a214c1ad32997db99c6560d7f93ceb254aa (diff) | |
download | glibc-6938e63f714b15c377d8cbf8e97b6f15b0e1b692.tar.gz glibc-6938e63f714b15c377d8cbf8e97b6f15b0e1b692.tar.xz glibc-6938e63f714b15c377d8cbf8e97b6f15b0e1b692.zip |
* inet/test-ifaddrs.c (main: addr_string): Handle null SA.
Grok AF_LINK if defined. From Momchil Velikov <velco@fadata.bg>. * sysdeps/gnu/ifaddrs.c (getifaddrs): If ioctl fails for netmask, brdaddr, or dstaddr, just set those pointers to null and don't fail. Reported by Momchil Velikov <velco@fadata.bg>. * sysdeps/generic/ifreq.h (__if_nextreq) [_HAVE_SA_LEN]: If sa_len is > sizeof IFR->ifa_addr, advance past the whole longer length. (__ifreq): Count up NIFS that way too. Reported by Momchil Velikov <velco@fadata.bg>. * sysdeps/mach/hurd/lchmod.c: Include <fcntl.h>.
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/ifreq.h | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/sysdeps/generic/ifreq.h b/sysdeps/generic/ifreq.h index 0d975be61c..4871c8d1d8 100644 --- a/sysdeps/generic/ifreq.h +++ b/sysdeps/generic/ifreq.h @@ -24,6 +24,15 @@ #include <sys/socket.h> #include <sys/ioctl.h> +static inline struct ifreq * +__if_nextreq (struct ifreq *ifr) +{ +#ifdef _HAVE_SA_LEN + if (ifr->ifa_addr > sizeof ifr->ifa_addr) + return (struct ifreq *) ((char *) &ifr->ifa_addr + ifr->ifa_addr.sa_len); +#endif + return ifr + 1; +} static inline void __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd) @@ -63,23 +72,28 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd) } while (rq_len < sizeof (struct ifreq) + ifc.ifc_len); - nifs = ifc.ifc_len / sizeof (struct ifreq); - if (fd != sockfd) __close (fd); +#ifdef _HAVE_SA_LEN + struct ifreq *ifr = ifreqs; + nifs = 0; + while ((char *) ifr < ifc.ifc_buf + ifc.ifc_len) + { + ++nifs; + ifr = __if_nextreq (ifr); + if (ifr == NULL) + break; + } +#else + nifs = ifc.ifc_len / sizeof (struct ifreq); +#endif + *num_ifs = nifs; *ifreqs = realloc (ifc.ifc_buf, nifs * sizeof (struct ifreq)); } -static inline struct ifreq * -__if_nextreq (struct ifreq *ifr) -{ - return ifr + 1; -} - - static inline void __if_freereq (struct ifreq *ifreqs, int num_ifs) { |