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/gnu | |
parent | 14fa7a214c1ad32997db99c6560d7f93ceb254aa (diff) | |
download | glibc-6938e63f714b15c377d8cbf8e97b6f15b0e1b692.tar.gz |
* 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/gnu')
-rw-r--r-- | sysdeps/gnu/ifaddrs.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/sysdeps/gnu/ifaddrs.c b/sysdeps/gnu/ifaddrs.c index 0c1ae5bf05..6ecc457e50 100644 --- a/sysdeps/gnu/ifaddrs.c +++ b/sysdeps/gnu/ifaddrs.c @@ -79,11 +79,9 @@ getifaddrs (struct ifaddrs **ifap) ifr = ifreqs; do { - /* Fill in all pointers to the storage we've already allocated. */ + /* Fill in pointers to the storage we've already allocated. */ storage[i].ia.ifa_next = &storage[i + 1].ia; storage[i].ia.ifa_addr = &storage[i].addr; - storage[i].ia.ifa_netmask = &storage[i].netmask; - storage[i].ia.ifa_broadaddr = &storage[i].broadaddr; /* & dstaddr */ /* Now copy the information we already have from SIOCGIFCONF. */ storage[i].ia.ifa_name = strncpy (storage[i].name, ifr->ifr_name, @@ -100,26 +98,36 @@ getifaddrs (struct ifaddrs **ifap) ifr->ifr_addr = storage[i].addr; if (__ioctl (fd, SIOCGIFNETMASK, ifr) < 0) - break; - storage[i].netmask = ifr->ifr_netmask; + storage[i].ia.ifa_netmask = NULL; + else + { + storage[i].ia.ifa_netmask = &storage[i].netmask; + storage[i].netmask = ifr->ifr_netmask; + } if (ifr->ifr_flags & IFF_BROADCAST) { ifr->ifr_addr = storage[i].addr; if (__ioctl (fd, SIOCGIFBRDADDR, ifr) < 0) - break; - storage[i].broadaddr = ifr->ifr_broadaddr; + storage[i].ia.ifa_broadaddr = NULL; + { + storage[i].ia.ifa_broadaddr = &storage[i].broadaddr; + storage[i].broadaddr = ifr->ifr_broadaddr; + } } else if (ifr->ifr_flags & IFF_POINTOPOINT) { ifr->ifr_addr = storage[i].addr; if (__ioctl (fd, SIOCGIFDSTADDR, ifr) < 0) - break; - storage[i].broadaddr = ifr->ifr_dstaddr; + storage[i].ia.ifa_broadaddr = NULL; + else + { + storage[i].ia.ifa_broadaddr = &storage[i].broadaddr; + storage[i].broadaddr = ifr->ifr_dstaddr; + } } else - /* Just 'cause. */ - memset (&storage[i].broadaddr, 0, sizeof storage[i].broadaddr); + storage[i].ia.ifa_broadaddr = NULL; storage[i].ia.ifa_data = NULL; /* Nothing here for now. */ |