>From 368e3df20bb4eaaa7e3d5852177715ee0e660e96 Mon Sep 17 00:00:00 2001 From: Ashish Shukla Date: Wed, 1 Oct 2008 17:40:01 +0530 Subject: [PATCH] 2008-10-01 Ashish Shukla * route/route.c (parse_opt, main): Added support for 'inet6' address family in the command-line options. (show_route_header, show_route): Fixed output of route command for alignment of inet6 addresses. * libroute/route_common.c (conv_name_to_addr): Added support for 'inet6' address family. --- ChangeLog | 10 ++++++++++ libroute/route_common.c | 42 ++++++++++++++++++++++++++---------------- route/route.c | 32 ++++++++++++++++++++------------ 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/ChangeLog b/ChangeLog index 446289b..6c21658 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-10-01 Ashish Shukla + + * route/route.c (parse_opt, main): Added support for 'inet6' address + family in the command-line options. + (show_route_header, show_route): Fixed output of route command for + alignment of inet6 addresses. + + * libroute/route_common.c (conv_name_to_addr): Added support for + 'inet6' address family. + 2008-09-30 Ashish Shukla * libroute/bsd_show.c (bsd_parse_msg): Added support for returning diff --git a/libroute/route_common.c b/libroute/route_common.c index 765ef8e..20b5b5e 100644 --- a/libroute/route_common.c +++ b/libroute/route_common.c @@ -106,6 +106,9 @@ conv_name_to_addr (const int format, const char *const name, case AF_INET: addr_size = sizeof (struct in_addr); break; + case AF_INET6: + addr_size = sizeof (struct in6_addr); + break; } if (buffer_size < addr_size) @@ -117,36 +120,43 @@ conv_name_to_addr (const int format, const char *const name, /* First get rid of the idiosyncrasies. */ if (strcmp ("default", name) == 0 || strcmp ("*", name) == 0) { - status = inet_pton (format, "0.0.0.0", buffer); + status = inet_pton (format, + (format == AF_INET ? "0.0.0.0":"::"), buffer); if (status < 0) error (EXIT_FAILURE, errno, "inet_pton"); else if (status == 0) - error (EXIT_FAILURE, 0, "invalid address (%s)", "0.0.0.0"); + error (EXIT_FAILURE, 0, "invalid address (%s)", + (format == AF_INET ? "0.0.0.0":"::")); } /* Next try to resolve host or network name. gethostbyname does not seem to mind if it is fed network addresses instead of names. */ else { - /* FIXME: use gethostbyname2 if it is present in GNULib. */ - ht = gethostbyname (name); + ht = gethostbyname2 (name, format); if (ht == NULL) { - /* FIXME: IPv4 specific. */ - nt = getnetbyname (name); - if (nt == NULL) - error (EXIT_FAILURE, 0, "invalid name (%s)", name); - - network = (uint32_t) nt->n_net; - network = htonl (network); - memmove (buffer, (void *) &network, sizeof (network)); + if(format == AF_INET) + { + /* FIXME: IPv4 specific. */ + nt = getnetbyname (name); + if (nt == NULL) + error (EXIT_FAILURE, 0, "invalid name (%s)", name); + + network = (uint32_t) nt->n_net; + network = htonl (network); + memmove (buffer, (void *) &network, sizeof (network)); + } + else + error (EXIT_FAILURE, 0, "invalid name (%s)", name); } + else /* We have already checked the buffer size. No harm in doing it twice. Better safe than sorry. */ - else if (ht->h_length > buffer_size) - error (EXIT_FAILURE, 0, "insufficient buffer size"); - else - memmove (buffer, (void *) ht->h_addr, ht->h_length); + if (ht->h_length > buffer_size) + error (EXIT_FAILURE, 0, "insufficient buffer size"); + else + memmove (buffer, (void *) ht->h_addr, ht->h_length); } } else diff --git a/route/route.c b/route/route.c index 031da2d..78e6e64 100644 --- a/route/route.c +++ b/route/route.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "libinetutils.h" #include "progname.h" @@ -166,7 +167,10 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case 'g': - options->route_gw_addr_size = sizeof (struct in_addr); + options->route_gw_addr_size = (options->route_sa_family == AF_INET ? + sizeof (struct in_addr): + sizeof (struct in6_addr)); + options->route_gw_addr = xmalloc (options->route_gw_addr_size); conv_name_to_addr (options->route_sa_family, arg, options->route_gw_addr, @@ -175,13 +179,15 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case ARG_HOST: - options->route_dest_addr_size = sizeof (struct in_addr); + options->route_dest_addr_size = (options->route_sa_family == AF_INET ? + sizeof (struct in_addr): + sizeof (struct in6_addr)); options->route_dest_addr = xmalloc (options->route_dest_addr_size); conv_name_to_addr (options->route_sa_family, arg, options->route_dest_addr, options->route_dest_addr_size, options->route_resolve_names); - options->route_dest_len = sizeof (struct in_addr) * 8; + options->route_dest_len = options->route_dest_addr_size * 8; break; case ARG_IP: @@ -190,7 +196,9 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case ARG_NET: - options->route_dest_addr_size = sizeof (struct in_addr); + options->route_dest_addr_size = (options->route_sa_family == AF_INET ? + sizeof (struct in_addr): + sizeof (struct in6_addr)); options->route_dest_addr = xmalloc (options->route_dest_addr_size); conv_name_to_addr (options->route_sa_family, arg, options->route_dest_addr, @@ -278,7 +286,7 @@ main (int argc, char *argv[]) switch (options.route_command) { case ROUTE_COMMAND_ADD: - (*route_backend->add) (AF_INET, + (*route_backend->add) (options.route_sa_family, options.route_dest_addr, options.route_dest_addr_size, options.route_dest_len, @@ -288,7 +296,7 @@ main (int argc, char *argv[]) break; case ROUTE_COMMAND_APPEND: - (*route_backend->append) (AF_INET, + (*route_backend->append) (options.route_sa_family, options.route_dest_addr, options.route_dest_addr_size, options.route_dest_len, @@ -298,7 +306,7 @@ main (int argc, char *argv[]) break; case ROUTE_COMMAND_CHANGE: - (*route_backend->change) (AF_INET, + (*route_backend->change) (options.route_sa_family, options.route_dest_addr, options.route_dest_addr_size, options.route_dest_len, @@ -308,14 +316,14 @@ main (int argc, char *argv[]) break; case ROUTE_COMMAND_DELETE: - (*route_backend->delete) (AF_INET, + (*route_backend->delete) (options.route_sa_family, options.route_dest_addr, options.route_dest_addr_size, options.route_dest_len); break; case ROUTE_COMMAND_PREPEND: - (*route_backend->prepend) (AF_INET, + (*route_backend->prepend) (options.route_sa_family, options.route_dest_addr, options.route_dest_addr_size, options.route_dest_len, @@ -325,7 +333,7 @@ main (int argc, char *argv[]) break; case ROUTE_COMMAND_REPLACE: - (*route_backend->replace) (AF_INET, + (*route_backend->replace) (options.route_sa_family, options.route_dest_addr, options.route_dest_addr_size, options.route_dest_len, @@ -403,7 +411,7 @@ void show_route_header (void) { puts ("Kernel network routing table"); - printf ("%-15s %-17s %-15s %-5s %-6s %-5s %-5s %-5s\n", + printf ("%-40s %-40s %-40s %-5s %-6s %-5s %-5s %-5s\n", "Destination", "Gateway", "Netmask", @@ -450,7 +458,7 @@ show_netstat_info (const route_info_t * const route_info) void show_route_info (const route_info_t * const route_info) { - printf ("%-15s %-17s %-15s %-5s %-6"PRIu32" %-5"PRIu32" %-5"PRIu32" %-5s\n", + printf ("%-40s %-40s %-40s %-5s %-6"PRIu32" %-5"PRIu32" %-5"PRIu32" %-5s\n", route_info->dest, route_info->gateway, route_info->dest_mask, -- 1.6.0.2