>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