aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2016-03-10 18:00:00 +0100
committerCorinna Vinschen <corinna@vinschen.de>2016-03-10 18:00:00 +0100
commit65231f415a9f69486b6d9890d4b736f5676aef11 (patch)
tree13b5ab5f0ff62bdf7b6087f514c24f15078aeb8d
parentc86b2f8e932b8b3baeecfa5439f91249243c4453 (diff)
downloadnewlib-65231f415a9f69486b6d9890d4b736f5676aef11.zip
newlib-65231f415a9f69486b6d9890d4b736f5676aef11.tar.gz
newlib-65231f415a9f69486b6d9890d4b736f5676aef11.tar.bz2
getifaddrs: Return pointer to extended interface info in ifa_data member
According to https://cygwin.com/ml/cygwin/2016-03/msg00124.html it's a problem to collect friendlyname info using AF_INET6 sockets. Fix problem by exposing additional hardware info for all collected interfaces via the pointer in the ifaddrs::ifa_data member. * include/ifaddrs.h (struct ifaddrs_hwdata): Define as struct of not yet exposed members of struct ifall, defined in net.cc. * net.cc (struct ifall): Replace hardware dta members with struct ifaddrs_hwdata. Accommodate throughout. (get_ifs): Let ifaddrs ifa_data member point to ifall::ifa_hwdata member. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/include/ifaddrs.h13
-rw-r--r--winsup/cygwin/net.cc45
2 files changed, 36 insertions, 22 deletions
diff --git a/winsup/cygwin/include/ifaddrs.h b/winsup/cygwin/include/ifaddrs.h
index f6c28e7..cbe716a 100644
--- a/winsup/cygwin/include/ifaddrs.h
+++ b/winsup/cygwin/include/ifaddrs.h
@@ -38,6 +38,19 @@ struct ifaddrs {
void *ifa_data;
};
+#ifdef __CYGWIN__
+#include <cygwin/if.h>
+/* On Cygwin the ifa_data member points to this structure, independent of
+ the address family. */
+struct ifaddrs_hwdata {
+ struct sockaddr ifa_hwaddr;
+ int ifa_metric;
+ int ifa_mtu;
+ int ifa_ifindex;
+ struct ifreq_frndlyname ifa_frndlyname;
+};
+#endif
+
/*
* This may have been defined in <net/if.h>. Note that if <net/if.h> is
* to be included it must be included before this header file.
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index 0f3946a..f046a3b 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -1950,11 +1950,7 @@ struct ifall {
struct sockaddr_storage ifa_addr;
struct sockaddr_storage ifa_brddstaddr;
struct sockaddr_storage ifa_netmask;
- struct sockaddr ifa_hwaddr;
- int ifa_metric;
- int ifa_mtu;
- int ifa_ifindex;
- struct ifreq_frndlyname ifa_frndlyname;
+ struct ifaddrs_hwdata ifa_hwdata;
};
static unsigned int
@@ -2104,7 +2100,7 @@ static void
get_friendlyname (struct ifall *ifp, PIP_ADAPTER_ADDRESSES pap)
{
struct ifreq_frndlyname *iff = (struct ifreq_frndlyname *)
- &ifp->ifa_frndlyname;
+ &ifp->ifa_hwdata.ifa_frndlyname;
iff->ifrf_len = sys_wcstombs (iff->ifrf_friendlyname,
IFRF_FRIENDLYNAMESIZ,
pap->FriendlyName) + 1;
@@ -2115,9 +2111,9 @@ get_hwaddr (struct ifall *ifp, PIP_ADAPTER_ADDRESSES pap)
{
for (UINT i = 0; i < IFHWADDRLEN; ++i)
if (i >= pap->PhysicalAddressLength)
- ifp->ifa_hwaddr.sa_data[i] = '\0';
+ ifp->ifa_hwdata.ifa_hwaddr.sa_data[i] = '\0';
else
- ifp->ifa_hwaddr.sa_data[i] = pap->PhysicalAddress[i];
+ ifp->ifa_hwdata.ifa_hwaddr.sa_data[i] = pap->PhysicalAddress[i];
}
/*
@@ -2233,13 +2229,15 @@ get_ifs (ULONG family)
/* Hardware address */
get_hwaddr (ifp, pap);
/* Metric */
- ifp->ifa_metric = 1;
+ ifp->ifa_hwdata.ifa_metric = 1;
/* MTU */
- ifp->ifa_mtu = pap->Mtu;
+ ifp->ifa_hwdata.ifa_mtu = pap->Mtu;
/* Interface index */
- ifp->ifa_ifindex = pap->IfIndex;
+ ifp->ifa_hwdata.ifa_ifindex = pap->IfIndex;
/* Friendly name */
get_friendlyname (ifp, pap);
+ /* Let ifa_data member point to "ifaddrs_hwdata" data. */
+ ifp->ifa_ifa.ifa_data = &ifp->ifa_hwdata;
++ifp;
}
else
@@ -2327,17 +2325,20 @@ get_ifs (ULONG family)
get_hwaddr (ifp, pap);
/* Metric */
if (wincap.has_gaa_on_link_prefix ())
- ifp->ifa_metric = (sa->sa_family == AF_INET
- ? ((PIP_ADAPTER_ADDRESSES_LH) pap)->Ipv4Metric
- : ((PIP_ADAPTER_ADDRESSES_LH) pap)->Ipv6Metric);
+ ifp->ifa_hwdata.ifa_metric
+ = (sa->sa_family == AF_INET)
+ ? ((PIP_ADAPTER_ADDRESSES_LH) pap)->Ipv4Metric
+ : ((PIP_ADAPTER_ADDRESSES_LH) pap)->Ipv6Metric;
else
- ifp->ifa_metric = 1;
+ ifp->ifa_hwdata.ifa_metric = 1;
/* MTU */
- ifp->ifa_mtu = pap->Mtu;
+ ifp->ifa_hwdata.ifa_mtu = pap->Mtu;
/* Interface index */
- ifp->ifa_ifindex = pap->IfIndex;
+ ifp->ifa_hwdata.ifa_ifindex = pap->IfIndex;
/* Friendly name */
get_friendlyname (ifp, pap);
+ /* Let ifa_data member point to "ifaddrs_hwdata" data. */
+ ifp->ifa_ifa.ifa_data = &ifp->ifa_hwdata;
++ifp;
# undef sin
# undef sin6
@@ -2432,20 +2433,20 @@ get_ifconf (struct ifconf *ifc, int what)
}
break;
case SIOCGIFHWADDR:
- memcpy (&ifr->ifr_hwaddr, &ifp->ifa_hwaddr,
+ memcpy (&ifr->ifr_hwaddr, &ifp->ifa_hwdata.ifa_hwaddr,
sizeof ifr->ifr_hwaddr);
break;
case SIOCGIFMETRIC:
- ifr->ifr_metric = ifp->ifa_metric;
+ ifr->ifr_metric = ifp->ifa_hwdata.ifa_metric;
break;
case SIOCGIFMTU:
- ifr->ifr_mtu = ifp->ifa_mtu;
+ ifr->ifr_mtu = ifp->ifa_hwdata.ifa_mtu;
break;
case SIOCGIFINDEX:
- ifr->ifr_ifindex = ifp->ifa_ifindex;
+ ifr->ifr_ifindex = ifp->ifa_hwdata.ifa_ifindex;
break;
case SIOCGIFFRNDLYNAM:
- memcpy (ifr->ifr_frndlyname, &ifp->ifa_frndlyname,
+ memcpy (ifr->ifr_frndlyname, &ifp->ifa_hwdata.ifa_frndlyname,
sizeof (struct ifreq_frndlyname));
}
if ((caddr_t) ++ifr >