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