I have attached to bug #121755 and to this mail a proposed patch to add IPv6 support for ping and traceroute tools. I'm working to add IPv6 support for the other tools KaL -- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Carlos Garcia Campos a.k.a. KaL elkalmail yahoo es carlosgc gnome org Grupo Linups Usuarios de SL/Linux de la UPSAM http://www.linups.org =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= PGP key: http://pgp.rediris.es:11371/pks/lookup?op=get&search=0x523E6462
? gnome-netinfo.diff
? ipv6-ping-tracer.diff
Index: netinfo.c
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/netinfo.c,v
retrieving revision 1.13
diff -u -u -r1.13 netinfo.c
--- netinfo.c 31 Jul 2003 20:34:40 -0000 1.13
+++ netinfo.c 29 Sep 2003 19:34:53 -0000
@@ -23,6 +23,7 @@
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
+#include <netdb.h>
#include "netinfo.h"
#include "utils.h"
@@ -76,6 +77,107 @@
gtk_entry_get_text (GTK_ENTRY
(gnome_entry_gtk_entry
(GNOME_ENTRY (netinfo->user))));
+}
+
+/*static gboolean
+netinfo_ipv4_address_validation (const gchar *ip)
+{
+ gchar **items;
+ gint i;
+
+ items = g_strsplit (ip, ".", 4);
+ if (items == NULL)
+ return FALSE;
+
+ for (i=0; i<4; i++)
+ {
+ if (items[i] == NULL)
+ {
+ g_strfreev (items);
+ return FALSE;
+ }
+
+ if ((atoi (items[i]) < 0) ||
+ (atoi (items[i]) > 255))
+ {
+ g_strfreev (items);
+ return FALSE;
+ }
+ }
+
+ g_strfreev (items);
+ return TRUE;
+}
+
+static gboolean
+netinfo_ipv6_address_validation (const gchar *ip)
+{
+ gchar **items;
+ gint i, j;
+
+ items = g_strsplit (ip, ":", 8);
+ if (items == NULL)
+ return FALSE;
+
+ i = 0;
+ while (items[i] != NULL)
+ {
+ for (j=0; j<strlen (items[i]); j++)
+ if (!g_ascii_isxdigit (items[i][j]))
+ {
+ g_strfreev (items);
+ return FALSE;
+ }
+ i++;
+ }
+
+ g_strfreev (items);
+ return TRUE;
+}*/
+
+gint
+netinfo_get_ip_version (Netinfo * netinfo)
+{
+ gchar *ip;
+ struct hostent *host;
+
+ g_return_val_if_fail (netinfo != NULL, -1);
+ g_return_val_if_fail (GTK_IS_ENTRY
+ (gnome_entry_gtk_entry
+ (GNOME_ENTRY (netinfo->host))), -1);
+
+ ip = g_strdup (gtk_entry_get_text
+ (GTK_ENTRY (gnome_entry_gtk_entry
+ (GNOME_ENTRY (netinfo->host)))));
+
+ if (strlen (ip) > 0)
+ {
+ host = gethostbyname2 (ip, AF_INET6);
+ if (host == NULL)
+ {
+ host = gethostbyname2 (ip, AF_INET);
+ if (host == NULL)
+ return -1;
+ else
+ {
+ g_free (ip);
+ return IPV4;
+ }
+
+ return -1;
+ }
+ else
+ {
+ g_free (ip);
+ return IPV6;
+ }
+
+ }
+
+ if (ip != NULL)
+ g_free (ip);
+
+ return -1;
}
void
Index: netinfo.h
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/netinfo.h,v
retrieving revision 1.13
diff -u -u -r1.13 netinfo.h
--- netinfo.h 31 Jul 2003 20:34:40 -0000 1.13
+++ netinfo.h 29 Sep 2003 19:34:53 -0000
@@ -100,6 +100,11 @@
NUM_PAGES
};
+enum {
+ IPV4,
+ IPV6
+};
+
#endif /* __NETINFO__ */
/* Generic functions */
@@ -110,6 +115,7 @@
gushort netinfo_get_count (Netinfo * netinfo);
const gchar * netinfo_get_host (Netinfo * netinfo);
const gchar * netinfo_get_user (Netinfo * netinfo);
+gint netinfo_get_ip_version (Netinfo * netinfo);
void netinfo_toggle_button (Netinfo * netinfo);
void netinfo_toggle_state (Netinfo * netinfo, gboolean state,
gpointer user_data);
Index: ping.c
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/ping.c,v
retrieving revision 1.19
diff -u -u -r1.19 ping.c
--- ping.c 31 Aug 2003 16:18:24 -0000 1.19
+++ ping.c 29 Sep 2003 19:34:53 -0000
@@ -26,7 +26,7 @@
#include "ping.h"
#include "utils.h"
-static gint strip_line (gchar * line, ping_data * data);
+static gint strip_line (gchar * line, ping_data * data, Netinfo * netinfo);
static gint strip_total_line (gchar * line, gint * packet_total);
static GtkTreeModel *ping_create_model (GtkTreeView * widget);
static gboolean ping_output_foreach (GtkTreeModel * model, GtkTreePath * path,
@@ -59,6 +59,7 @@
gchar stmp[128];
gchar *program;
GtkWidget *parent;
+ gint ip_version;
g_return_if_fail (netinfo != NULL);
@@ -104,20 +105,43 @@
gtk_text_buffer_delete (buffer, &start, &end);
*/
parent = gtk_widget_get_toplevel (netinfo->output);
-
- program = util_find_program_dialog ("ping", parent);
+
+ ip_version = netinfo_get_ip_version (netinfo);
+ switch (ip_version)
+ {
+ case IPV4:
+ program = util_find_program_dialog ("ping", parent);
+ break;
+ case IPV6:
+ program = util_find_program_dialog ("ping6", parent);
+
+ break;
+ case -1:
+ /*invalid host or ip address*/
+ return;
+ }
if (program != NULL) {
#if defined(__sun__) || defined(__hpux__)
- command =
- g_strdup_printf (PING_PROGRAM_FORMAT, program, host,
- // g_strdup_printf (PING_PROGRAM_FORMAT, PING_PROGRAM, host,
- count);
+ if (ip_version == IPV4)
+ command =
+ g_strdup_printf (PING_PROGRAM_FORMAT, program, host,
+ // g_strdup_printf (PING_PROGRAM_FORMAT, PING_PROGRAM, host,
+ count);
+ else
+ command =
+ g_strdup_printf (PING_PROGRAM_FORMAT_6, program, host,
+ count);
#else
- command =
- g_strdup_printf (PING_PROGRAM_FORMAT, program, count,
+ if (ip_version == IPV4)
+ command =
+ g_strdup_printf (PING_PROGRAM_FORMAT, program, count,
// g_strdup_printf (PING_PROGRAM_FORMAT, PING_PROGRAM, count,
- host);
+ host);
+ else
+ command =
+ g_strdup_printf (PING_PROGRAM_FORMAT_6, program, count,
+ host);
#endif
/* command =
@@ -195,7 +219,7 @@
pkt_loss = GTK_LABEL (netinfo->packets_loss);
if (len > 0) { /* there are data to show */
- count = strip_line (line, &data);
+ count = strip_line (line, &data, netinfo);
if ((count == 5) || (count == 6)) {
/* Creation of GtkTreeView */
@@ -303,11 +327,13 @@
}
static gint
-strip_line (gchar * line, ping_data * data)
+strip_line (gchar * line, ping_data * data, Netinfo * netinfo)
{
gint count;
- line = g_strdelimit (line, ":", ' ');
+ if (netinfo_get_ip_version (netinfo) == IPV4)
+ line = g_strdelimit (line, ":", ' ');
+
#ifdef PING_PARAMS_5
count = sscanf (line, PING_FORMAT,
&(data)->bytes, data->ip, &(data)->icmp_seq,
@@ -321,6 +347,7 @@
if (count != 5 && count != 6) {
}
+ /*printf ("DBG: bytes: %d, ip: %s, icmp_seq: %d\n", data->bytes, data->ip, data->icmp_seq);*/
return count;
}
Index: ping.h
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/ping.h,v
retrieving revision 1.11
diff -u -u -r1.11 ping.h
--- ping.h 21 Jul 2003 01:13:52 -0000 1.11
+++ ping.h 29 Sep 2003 19:34:53 -0000
@@ -27,6 +27,7 @@
/* FIXME: Add BSD support */
#if defined(__linux__) || defined(__OSF__)
# define PING_PROGRAM_FORMAT "%s ping -c %d -n %s"
+# define PING_PROGRAM_FORMAT_6 "%s ping6 -c %d -n %s"
# define PING_FORMAT "%d bytes from %s icmp_seq=%d ttl=%d time=%s %s"
# define PING_PARAMS_6
#elif defined(__sun__)
Index: traceroute.c
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/traceroute.c,v
retrieving revision 1.16
diff -u -u -r1.16 traceroute.c
--- traceroute.c 31 Aug 2003 16:18:24 -0000 1.16
+++ traceroute.c 29 Sep 2003 19:34:53 -0000
@@ -64,13 +64,25 @@
parent = gtk_widget_get_toplevel (netinfo->output);
- program = util_find_program_in_path ("tcptraceroute", NULL);
- g_print ("tcptraceroute: %s\n", program);
- if (program != NULL) {
- program_name = g_strdup ("tcptraceroute");
- } else {
- program = util_find_program_dialog ("traceroute", parent);
- program_name = g_strdup ("traceroute");
+ switch (netinfo_get_ip_version (netinfo))
+ {
+ case IPV4:
+ program = util_find_program_in_path ("tcptraceroute", NULL);
+ g_print ("tcptraceroute: %s\n", program);
+ if (program != NULL) {
+ program_name = g_strdup ("tcptraceroute");
+ } else {
+ program = util_find_program_dialog ("traceroute", parent);
+ program_name = g_strdup ("traceroute");
+ }
+ break;
+ case IPV6:
+ program = util_find_program_in_path ("traceroute6", NULL);
+ program_name = g_strdup ("traceroute6");
+ break;
+ default:
+ program = NULL;
+ break;
}
if (program != NULL) {
Attachment:
signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente