From: corinna Date: Tue, 10 Jun 2008 19:58:58 +0000 (+0000) Subject: * fhandler_procnet.cc (get_scope): New static function to evaluate X-Git-Tag: pre-ripout-set_console_state_for_spawn~9 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=469503aa2464714401a9a7e76a066498c51e0837;p=pf3gnuchains%2Fpf3gnuchains4x.git * 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. --- diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 775c710a1d..63eb45d5ea 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,15 @@ 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. (if_indextoname): Prefer IPv6 loopback device name over IPv4 loopback device name on pre-Vista systems. diff --git a/winsup/cygwin/fhandler_procnet.cc b/winsup/cygwin/fhandler_procnet.cc index f9fd947078..7b2423c2ab 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); }