From c9227bf8a7a339b12d957d918b536cf876a46ca0 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 10 Jun 2008 19:58:58 +0000 Subject: * fhandler_procnet.cc (get_scope): New static function to evaluate scope. (dad_to_flags): New static array to convert Windows DAD state to Linux values. (format_procnet_ifinet6): Drop asking for IfIndex, just use Ipv6IfIndex. Use get_scope and dad_to_flags to generate more accurate linux-like output. --- winsup/cygwin/ChangeLog | 10 ++++++++++ winsup/cygwin/fhandler_procnet.cc | 33 +++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 4 deletions(-) (limited to 'winsup') diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 775c710a1..63eb45d5e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +2008-06-10 Corinna Vinschen + + * fhandler_procnet.cc (get_scope): New static function to evaluate + scope. + (dad_to_flags): New static array to convert Windows DAD state to + Linux values. + (format_procnet_ifinet6): Drop asking for IfIndex, just use Ipv6IfIndex. + Use get_scope and dad_to_flags to generate more accurate linux-like + output. + 2008-06-10 Corinna Vinschen * net.cc (if_nametoindex): Fix typo in call to get_adapters_addresses. diff --git a/winsup/cygwin/fhandler_procnet.cc b/winsup/cygwin/fhandler_procnet.cc index f9fd94707..7b2423c2a 100644 --- a/winsup/cygwin/fhandler_procnet.cc +++ b/winsup/cygwin/fhandler_procnet.cc @@ -229,6 +229,31 @@ fhandler_procnet::fill_filebuf () return true; } +/* Return the same scope values as Linux. */ +static unsigned int +get_scope (struct in6_addr *addr) +{ + if (IN6_IS_ADDR_LOOPBACK (addr)) + return 0x10; + if (IN6_IS_ADDR_LINKLOCAL (addr)) + return 0x20; + if (IN6_IS_ADDR_SITELOCAL (addr)) + return 0x40; + if (IN6_IS_ADDR_V4COMPAT (addr)) + return 0x80; + return 0x0; +} + +/* Convert DAD state into Linux compatible values. */ +static unsigned int dad_to_flags[] = +{ + 0x02, /* Invalid -> NODAD */ + 0x40, /* Tentative -> TENTATIVE */ + 0xc0, /* Duplicate to PERMANENT | TENTATIVE */ + 0x20, /* Deprecated -> DEPRECATED */ + 0x80 /* Preferred -> PERMANENT */ +}; + static _off64_t format_procnet_ifinet6 (char *&filebuf) { @@ -262,11 +287,11 @@ format_procnet_ifinet6 (char *&filebuf) filebuf[filesize++] = ' '; filesize += sprintf (filebuf + filesize, "%02lx %02x %02x %02x %s\n", - pap->IfIndex ?: pap->Ipv6IfIndex, + pap->Ipv6IfIndex, ip_addr_prefix (pua, pap->FirstPrefix), - ((struct sockaddr_in6 *) - pua->Address.lpSockaddr)->sin6_scope_id, - pua->DadState, + get_scope (&((struct sockaddr_in6 *) + pua->Address.lpSockaddr)->sin6_addr), + dad_to_flags [pua->DadState], pap->AdapterName); } -- cgit v1.2.3