Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-06-10 22:15:57 +0400
committerCorinna Vinschen <corinna@vinschen.de>2008-06-10 22:15:57 +0400
commitbbfcc68ad284e0ae779559e8836f513ad78b4204 (patch)
treedd1f85f4c4d32a074e7c03e91a7372b9d24b4ecc /winsup
parent7a2c0a0d6bec344172130ecdcfb3b40bbcca4873 (diff)
* net.cc (if_nametoindex): Fix typo in call to get_adapters_addresses.
(if_indextoname): Prefer IPv6 loopback device name over IPv4 loopback device name on pre-Vista systems. (if_nameindex): Ditto.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/net.cc23
2 files changed, 29 insertions, 1 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 70501713d..775c710a1 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,12 @@
2008-06-10 Corinna Vinschen <corinna@vinschen.de>
+ * net.cc (if_nametoindex): Fix typo in call to get_adapters_addresses.
+ (if_indextoname): Prefer IPv6 loopback device name over IPv4 loopback
+ device name on pre-Vista systems.
+ (if_nameindex): Ditto.
+
+2008-06-10 Corinna Vinschen <corinna@vinschen.de>
+
* fhandler_procnet.cc (format_procnet_ifinet6): Use sprintf rather than
__small_sprintf.
* net.cc (if_nametoindex): Prefer IPv6IfIndex over IfIndex for
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index d8d426b98..c18a775de 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -2037,7 +2037,7 @@ if_nametoindex (const char *name)
return 0;
if (wincap.has_gaa_prefixes ()
- && get_adapters_addresses (&pap, AF_UNSPEC))
+ && get_adapters_addresses (&pa0, AF_UNSPEC))
{
char lname[IF_NAMESIZE], *c;
@@ -2072,6 +2072,19 @@ if_indextoname (unsigned ifindex, char *ifname)
for (pap = pa0; pap; pap = pap->Next)
if (ifindex == (pap->Ipv6IfIndex ?: pap->IfIndex))
{
+ /* Unfortunately the pre-Vista IPv6 stack has a distinct loopback
+ device with the same Ipv6IfIndex as the IfIndex of the IPv4
+ loopback device, but with a different adapter name.
+ For consistency with /proc/net/if_inet6, try to find the
+ IPv6 loopback device and use that adapter name instead.
+ We identify the loopback device by its IfIndex of 1. */
+ if (pap->IfIndex == 1 && pap->Ipv6IfIndex == 0)
+ for (PIP_ADAPTER_ADDRESSES pap2 = pa0; pap2; pap2 = pap2->Next)
+ if (pap2->Ipv6IfIndex == 1)
+ {
+ pap = pap2;
+ break;
+ }
name = strcpy (ifname, pap->AdapterName);
break;
}
@@ -2114,6 +2127,14 @@ if_nameindex (void)
goto outer_loop;
iflist[cnt].if_index = pap->Ipv6IfIndex ?: pap->IfIndex;
strcpy (iflist[cnt].if_name = ifnamelist[cnt], pap->AdapterName);
+ /* See comment in if_indextoname. */
+ if (pap->IfIndex == 1 && pap->Ipv6IfIndex == 0)
+ for (PIP_ADAPTER_ADDRESSES pap2 = pa0; pap2; pap2 = pap2->Next)
+ if (pap2->Ipv6IfIndex == 1)
+ {
+ strcpy (ifnamelist[cnt], pap2->AdapterName);
+ break;
+ }
++cnt;
outer_loop:
;