El mar, 30-09-2003 a las 23:07, Rodrigo Moya escribió:
> On Mon, 2003-09-29 at 21:49 +0200, Carlos Garcia Campos wrote:
> > 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
> >
> cool! Since Germán is not approving this patch, I'll approve it
> myself :-)
thanks ;-)
> It looks good to me, although it's missing a ChangeLog entry and it
> doesn't use GNOME coding guidelines in some places, like the { for an if
> starting in its own line (it should be in the same line as the if
> sentence).
ok, I fixed it
> Apart from that, it looks good, and when you send the fixed patch, if
> Germán or William dont say anything, I'll apply it.
>
> thanks again for the patch, and sorry for the delay
I have attached another patch to this mail that fixes GNOME coding
guidelines errors and includes a Changelog entry. It also includes IPv6
support for the scanning tool
Currently, the IPv6 situation in gnome-network is:
info: None
ping: full IPv6 support
netstat: I am working on it. I think is better to use -putan parameters
instead of -A inet for the active services view. What do you think?
traceroute: full IPv6 support
scan: full IPv6 support
lookup: full IPv6 support, is not necessary to do any changes because
dig supports IPv6 natively
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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-scan.diff
? ipv6-ping-tracer.diff
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/ChangeLog,v
retrieving revision 1.92
diff -u -u -r1.92 ChangeLog
--- ChangeLog 31 Aug 2003 16:18:24 -0000 1.92
+++ ChangeLog 2 Oct 2003 19:29:55 -0000
@@ -1,3 +1,10 @@
+2003-10-02 Carlos García Campos <carlosgc gnome org>
+ * netinfo.c (get_ip_version): added a function to get the
+ ip version (IPv4 or IPv6) of a host or ip address
+ * ping.c (ping_do, strip_line): IPv6 support
+ * scan.c (scan_do): IPv6 support
+ * traceroute.c (traceroute_do): IPv6 support
+
2003-08-31 German Poo-Caaman~o <gpoo ubiobio cl>
* lookup.c (lookup_create_model):
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 2 Oct 2003 19:29:55 -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,47 @@
gtk_entry_get_text (GTK_ENTRY
(gnome_entry_gtk_entry
(GNOME_ENTRY (netinfo->user))));
+}
+
+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 2 Oct 2003 19:29:55 -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 2 Oct 2003 19:29:55 -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 2 Oct 2003 19:29:55 -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: scan.c
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/scan.c,v
retrieving revision 1.5
diff -u -u -r1.5 scan.c
--- scan.c 25 Jul 2003 13:33:54 -0000 1.5
+++ scan.c 2 Oct 2003 19:29:55 -0000
@@ -52,6 +52,7 @@
GtkTreeModel *model;
struct sockaddr_in addr;
+ struct sockaddr_in6 addr6;
struct hostent *hp = NULL;
struct servent *service = NULL;
gint i, sock, start_port = 1, end_port = 7000;
@@ -62,6 +63,7 @@
gint nread;
gchar buf[SIZE];
gchar *service_name = NULL;
+ gint ip_version, pf;
g_return_if_fail (netinfo != NULL);
@@ -73,13 +75,25 @@
gtk_list_store_clear (GTK_LIST_STORE (model));
}
- if ((hp = gethostbyname (host)) == NULL) {
+ switch (ip_version = netinfo_get_ip_version (netinfo))
+ {
+ case -1:
#ifdef DEBUG
g_print ("Error: Host unkown\n");
#endif /* DEBUG */
- g_return_if_fail (hp != NULL);
+ return;
+ /*g_return_if_fail (hp != NULL);*/
+ break;
+ case IPV4:
+ pf = PF_INET;
+ break;
+ case IPV6:
+ pf = PF_INET6;
+ break;
}
+ hp = gethostbyname2 (host, pf);
+
if (pipe (pfd) == -1) {
perror ("pipe failed");
return;
@@ -96,7 +110,7 @@
/* child */
close (pfd[0]);
for (i = start_port; i <= end_port; i++) {
- if ((sock = socket (PF_INET, SOCK_STREAM, 0)) == -1) {
+ if ((sock = socket (pf, SOCK_STREAM, 0)) == -1) {
#ifdef DEBUG
g_print ("Unable to create socket\n");
#endif /* DEBUG */
@@ -105,12 +119,20 @@
channel = g_io_channel_unix_new (sock);
- addr.sin_family = PF_INET;
- addr.sin_addr.s_addr = htonl (INADDR_ANY);
- addr.sin_port = htons (i);
- bcopy (hp->h_addr, &addr.sin_addr, hp->h_length);
-
- if (connect (sock, (struct sockaddr *) &addr, sizeof (addr)) == 0) {
+ if (ip_version == IPV4) {
+ addr.sin_family = PF_INET;
+ bcopy (hp->h_addr, &addr.sin_addr, hp->h_length);
+ addr.sin_port = htons (i);
+ }
+ else {
+ addr6.sin6_family = PF_INET6;
+ addr6.sin6_flowinfo = 0;
+ bcopy (hp->h_addr, &addr6.sin6_addr, hp->h_length);
+ addr6.sin6_port = htons(i);
+ }
+
+ if ((connect (sock, (struct sockaddr *) &addr, sizeof (addr)) == 0) ||
+ (connect (sock, (struct sockaddr *) &addr6, sizeof (addr6)) == 0)) {
service = getservbyport (htons(i), "tcp");
if (service != NULL) {
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 2 Oct 2003 19:29:55 -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