>From 53535a9863de0addec81adb913da64d49e1363ae Mon Sep 17 00:00:00 2001 From: Ashish Shukla Date: Tue, 30 Sep 2008 18:29:35 +0530 Subject: [PATCH] 2008-09-30 Ashish Shukla * libroute/bsd_show.c (bsd_parse_msg): Added support for returning destination mask lengths, which is required for 'ip' like output. --- ChangeLog | 5 +++++ libroute/bsd_show.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 0 deletions(-) diff --git a/ChangeLog b/ChangeLog index 269e5e7..446289b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-09-30 Ashish Shukla + + * libroute/bsd_show.c (bsd_parse_msg): Added support for returning + destination mask lengths, which is required for 'ip' like output. + 2008-09-30 Debarshi Ray * hostname/hostname.c (get_name_action_t, set_name_action_t): diff --git a/libroute/bsd_show.c b/libroute/bsd_show.c index 7dfb81e..7ad41b1 100644 --- a/libroute/bsd_show.c +++ b/libroute/bsd_show.c @@ -217,14 +217,42 @@ bsd_parse_msg (const sa_family_t sa_family, if ((msg->rtm_addrs & RTA_NETMASK) != 0) { char buffer[sizeof(struct sockaddr_in6)]; + unsigned char* s_addr; + socklen_t s_len; memset (buffer, 0, sizeof(struct sockaddr_in6)); strncpy (buffer, (char *) sock_addr, sock_addr->sa_len); ((struct sockaddr *) buffer)->sa_family = sa_family; + s_addr = &(sock_addr->sa_data[2]); + s_len = sock_addr->sa_len; + route_info->dest_len = 0; + + if(s_len) + { + /* Figure out the length of address in the sockaddr structure, by subtracting + * the offset portion of the address (in sockaddr structure) from the length + * of sockaddr structure. + * NOTE: the length will be dynamic as this is a netmask represented in a sockaddr. + */ + s_len -= (sa_family == AF_INET) ? + (socklen_t)((char*)(&((struct sockaddr_in*)sock_addr)->sin_addr) - (char*)sock_addr): + (socklen_t)((char*)(&((struct sockaddr_in6*)sock_addr)->sin6_addr) - (char*)sock_addr); + } + bsd_conv_addr_to_name ((struct sockaddr *) buffer, route_info->dest_mask, sizeof(route_info->dest_mask), 0); + + while(s_len--) + { + while(*s_addr & 0x80) + { + route_info->dest_len++; + *s_addr <<= 1; + } + s_addr++; + } } next: -- 1.6.0.2