Hi all,
Two months ago I sent a patch that added IPv6 support for netstat tool.
Germán approved it but I forgot to apply it :-P so I send now again the
patch, but updated for the current CVS.
The patch also fixes a minor bug: the tree_model doesn't change when you
toggle between protocol and route twice
------------------------------------------------------------------------
Index: netstat.c
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/netstat.c,v
retrieving revision 1.11
diff -u -u -r1.11 netstat.c
--- netstat.c 20 Nov 2003 21:12:43 -0000 1.11
+++ netstat.c 9 Dec 2003 17:54:20 -0000
@@ -109,11 +109,11 @@
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (netinfo->routing))) {
/* Works for Solaris and Linux */
- option = g_strdup ("-r");
+ option = g_strdup ("-rn -A inet -A inet6");
}
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (netinfo->protocol))) {
/* Only works for Solaris */
- option = g_strdup ("-A inet -ln");
+ option = g_strdup ("-A inet -A inet6 -ln");
}
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (netinfo->multicast))) {
/* It works for Solaris and Linux */
@@ -266,10 +266,10 @@
g_return_if_fail (line != NULL);
count = strip_protocol_line (line, &data);
- if (count == 7 || count == 8) {
+ if (count == 5 || count == 6) {
#ifdef DEBUG
g_print ("%s\t%s:%s\t%s\n", data.protocol,
- data.ip_src, data.port_src, data.state);
+ data.ip_src, data.port_src, data.state);
#endif /* DEBUG */
/* Creation of GtkTreeView */
@@ -284,41 +284,43 @@
model = gtk_tree_view_get_model (widget);
- if (protocol_model == NULL || gtk_tree_model_get_n_columns (model) != 4) {
+ /*if (protocol_model == NULL || gtk_tree_model_get_n_columns (model) != 4) {*/
+ if (protocol_model == NULL || protocol_model != model) {
clean_gtk_tree_view (widget);
protocol_model = GTK_TREE_MODEL (gtk_list_store_new
- (4,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING));
+ (4,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING));
netstat_create_protocol_model (widget);
- gtk_tree_view_set_model (widget, protocol_model);
+ /*gtk_tree_view_set_model (widget, protocol_model);*/
}
-
+ gtk_tree_view_set_model (widget, protocol_model);
+
model = gtk_tree_view_get_model (widget);
gtk_tree_view_get_cursor (widget, &path, NULL);
-
+
if (path != NULL) {
gtk_tree_model_get_iter (model, &sibling, path);
gtk_list_store_insert_after (GTK_LIST_STORE
- (model),
- &iter,
- &sibling);
+ (model),
+ &iter,
+ &sibling);
} else {
gtk_list_store_append (GTK_LIST_STORE
- (model), &iter);
+ (model), &iter);
}
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- 0, data.protocol,
- 1, data.ip_src,
- 2, data.port_src,
- 3, data.state, -1);
-
+ 0, data.protocol,
+ 1, data.ip_src,
+ 2, data.port_src,
+ 3, data.state, -1);
+
gtk_tree_view_set_model (widget, model);
path = gtk_tree_model_get_path (model, &iter);
gtk_tree_view_set_cursor (widget, path, NULL, FALSE);
@@ -331,17 +333,24 @@
strip_protocol_line (gchar * line, netstat_protocol_data *data)
{
gint count = 0;
- gchar s6[30], s7[30];
+ gchar s6[30], laddr[50];
gint n2, n3;
-
- line = g_strdelimit (line, ":", ' ');
+ gchar *port;
count = sscanf (line, NETSTAT_PROTOCOL_FORMAT,
data->protocol, &n2, &n3,
- data->ip_src, data->port_src,
- s6, s7, data->state);
+ laddr, s6, data->state);
+
+ port = g_strrstr (laddr, ":");
- if (count == 7) {
+ if (port != NULL) {
+ g_strlcpy (data->ip_src, laddr, 50 * sizeof (gchar));
+ data->ip_src[strlen (laddr) - strlen (port)] = '\0';
+ port ++;
+ g_strlcpy (data->port_src, port, 30 * sizeof (gchar));
+ }
+
+ if (count == 5) {
bzero (&(data)->state, 30);
}
@@ -359,31 +368,31 @@
renderer = gtk_cell_renderer_text_new ();
/* Transport Protocol that runs over */
column =
- gtk_tree_view_column_new_with_attributes
- (_("Protocol"), renderer, "text", 0, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Protocol"), renderer, "text", 0, NULL);
gtk_tree_view_append_column (widget, column);
renderer = gtk_cell_renderer_text_new ();
/* IP address where to accept connections */
column =
- gtk_tree_view_column_new_with_attributes
- (_("IP Source"), renderer, "text", 1, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("IP Source"), renderer, "text", 1, NULL);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_append_column (widget, column);
renderer = gtk_cell_renderer_text_new ();
/* Number of port where the service is listening */
column =
- gtk_tree_view_column_new_with_attributes
- (_("Port/Service"), renderer, "text", 2, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Port/Service"), renderer, "text", 2, NULL);
g_object_set (G_OBJECT (renderer), "xalign", 1.0, NULL);
gtk_tree_view_append_column (widget, column);
renderer = gtk_cell_renderer_text_new ();
/* State of the service (commonly LISTEN) */
column =
- gtk_tree_view_column_new_with_attributes
- (_("State"), renderer, "text", 3, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("State"), renderer, "text", 3, NULL);
gtk_tree_view_append_column (widget, column);
/* return model;*/
@@ -403,13 +412,13 @@
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
g_return_if_fail (line != NULL);
-
+
count = strip_route_line (line, &data);
- if (count == 8) {
+ if ((count == 8) || (count == 7)) {
#ifdef DEBUG
g_print ("%s\t%s:%s\t%d\t%s\n", data.destination,
- data.gateway, data.netmask, data.metric,
- data.iface);
+ data.gateway, data.netmask, data.metric,
+ data.iface);
#endif /* DEBUG */
/* Creation of GtkTreeView */
@@ -424,19 +433,21 @@
model = gtk_tree_view_get_model (widget);
- if (route_model == NULL || gtk_tree_model_get_n_columns (model) != 4) {
+ /*if (route_model == NULL || gtk_tree_model_get_n_columns (model) != 4) {*/
+ if (route_model == NULL || route_model != model) {
clean_gtk_tree_view (widget);
route_model = GTK_TREE_MODEL (gtk_list_store_new
- (4,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING));
+ (4,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING));
netstat_create_route_model (widget);
- gtk_tree_view_set_model (widget, route_model);
+ /*gtk_tree_view_set_model (widget, route_model);*/
}
+ gtk_tree_view_set_model (widget, route_model);
model = gtk_tree_view_get_model (widget);
@@ -473,13 +484,30 @@
gint count = 0;
gchar flags[30];
gint ref, use;
-
+ gchar dest[50];
+ gchar **items;
+
count = sscanf (line, NETSTAT_ROUTE_FORMAT,
data->destination,
- data->gateway, data->netmask,
- flags, &(data)->metric, &ref, &use,
+ data->gateway, data->netmask,
+ flags, &(data)->metric, &ref, &use,
data->iface);
+ if (count == 6) {
+ count = sscanf (line, NETSTAT_ROUTE6_FORMAT,
+ dest, data->netmask,
+ flags, &(data)->metric,
+ &ref, &use, data->iface);
+
+ items = g_strsplit (dest, "/", 2);
+ if (items != NULL) {
+ g_strlcpy (data->destination, items[0], 50 * sizeof (gchar));
+ g_strlcpy (data->netmask, items[1], 50 * sizeof (gchar));
+
+ g_strfreev (items);
+ }
+ }
+
return count;
}
@@ -492,28 +520,28 @@
renderer = gtk_cell_renderer_text_new ();
column =
- gtk_tree_view_column_new_with_attributes
- (_("Destination"), renderer, "text", 0, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Destination"), renderer, "text", 0, NULL);
gtk_tree_view_append_column (widget, column);
-
+
renderer = gtk_cell_renderer_text_new ();
column =
- gtk_tree_view_column_new_with_attributes
- (_("Gateway"), renderer, "text", 1, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Gateway"), renderer, "text", 1, NULL);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_append_column (widget, column);
-
+
renderer = gtk_cell_renderer_text_new ();
column =
- gtk_tree_view_column_new_with_attributes
- (_("Netmask"), renderer, "text", 2, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Netmask"), renderer, "text", 2, NULL);
gtk_tree_view_append_column (widget, column);
-
+
renderer = gtk_cell_renderer_text_new ();
column =
- gtk_tree_view_column_new_with_attributes
- (_("Interface"), renderer, "text", 3, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Interface"), renderer, "text", 3, NULL);
gtk_tree_view_append_column (widget, column);
}
/* END ROUTE */
@@ -551,7 +579,8 @@
model = gtk_tree_view_get_model (widget);
- if (multicast_model == NULL || gtk_tree_model_get_n_columns (model) != 3) {
+ /*if (multicast_model == NULL || gtk_tree_model_get_n_columns (model) != 3) {*/
+ if (multicast_model == NULL || multicast_model != model) {
clean_gtk_tree_view (widget);
multicast_model = GTK_TREE_MODEL (gtk_list_store_new
@@ -561,8 +590,9 @@
G_TYPE_STRING));
netstat_create_multicast_model (widget);
- gtk_tree_view_set_model (widget, multicast_model);
+ /*gtk_tree_view_set_model (widget, multicast_model);*/
}
+ gtk_tree_view_set_model (widget, multicast_model);
model = gtk_tree_view_get_model (widget);
@@ -618,23 +648,23 @@
renderer = gtk_cell_renderer_text_new ();
/* Interface of multicast group associated */
column =
- gtk_tree_view_column_new_with_attributes
- (_("Interface"), renderer, "text", 0, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Interface"), renderer, "text", 0, NULL);
gtk_tree_view_append_column (widget, column);
renderer = gtk_cell_renderer_text_new ();
/* Members of multicast group */
column =
- gtk_tree_view_column_new_with_attributes
- (_("Member"), renderer, "text", 1, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Member"), renderer, "text", 1, NULL);
g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL);
gtk_tree_view_append_column (widget, column);
-
+
renderer = gtk_cell_renderer_text_new ();
/* Multicast group */
column =
- gtk_tree_view_column_new_with_attributes
- (_("Group"), renderer, "text", 2, NULL);
+ gtk_tree_view_column_new_with_attributes
+ (_("Group"), renderer, "text", 2, NULL);
gtk_tree_view_append_column (widget, column);
}
/* END MULTICAST */
@@ -657,7 +687,7 @@
column = gtk_tree_view_get_column (widget, i-1);
gtk_tree_view_remove_column (widget, column);
}
-
+
g_list_free (columns);
}
Index: netstat.h
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/netstat.h,v
retrieving revision 1.4
diff -u -u -r1.4 netstat.h
--- netstat.h 21 Jul 2003 02:31:57 -0000 1.4
+++ netstat.h 9 Dec 2003 17:54:20 -0000
@@ -25,9 +25,13 @@
#if defined(__linux__)
/* proto 0 0 ip port ip port state */
-# define NETSTAT_PROTOCOL_FORMAT "%s %d %d %s %s %s %s %s"
+/*# define NETSTAT_PROTOCOL_FORMAT "%s %d %d %s %s %s %s %s"
# define NETSTAT_ROUTE_FORMAT "%s %s %s %s %d %d %d %s"
-# define NETSTAT_MULTICAST_FORMAT "%s %d %s"
+# define NETSTAT_MULTICAST_FORMAT "%s %d %s" */
+# define NETSTAT_PROTOCOL_FORMAT "%s %d %d %s %s %s"
+# define NETSTAT_ROUTE_FORMAT "%s %s %s %s %d %d %d %s"
+# define NETSTAT_ROUTE6_FORMAT "%s %s %s %d %d %d %s"
+# define NETSTAT_MULTICAST_FORMAT "%s %d %s"
#endif
@@ -42,7 +46,7 @@
struct _netstat_protocol_data {
gchar protocol[30];
- gchar ip_src[30];
+ gchar ip_src[50];
gchar port_src[30];
// gint port_src;
gchar state[30];
@@ -51,8 +55,8 @@
typedef struct _netstat_route_data netstat_route_data;
struct _netstat_route_data {
- gchar destination[30];
- gchar gateway[30];
+ gchar destination[50];
+ gchar gateway[50];
gchar netmask[30];
gint metric;
gchar iface[30];
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gnome-network/gnome-netinfo/ChangeLog,v
retrieving revision 1.102
diff -u -u -r1.102 ChangeLog
--- ChangeLog 5 Dec 2003 02:27:22 -0000 1.102
+++ ChangeLog 9 Dec 2003 17:54:25 -0000
@@ -1,3 +1,17 @@
+2003-12-09 Carlos García Campos <carlosgc gnome org>
+
+ * netstat.c (get_active_option, strip_protocol_line,
+ strip_route_line, *_tree_insert): IPv6 support
+
+ * netstat.c (*_tree_insert): the tree_model doesn't change when
+ you toggle between protocol and route twice
+
2003-12-01 Bastien Nocera <hadess hadess net>
* main.c: (load_whois_widgets_from_xml): we don't have a "user"