--- a/ChangeLog Fri Sep 25 10:14:23 2009 +0000
+++ b/ChangeLog Fri Sep 25 15:46:38 2009 +0000
@@ -1,3 +1,14 @@
+2009-09-25 Michal Pryc <[email protected]>
+
+ * base-specs/gnome-netstatus.spec: Bump to 2.28.0. Reworked for new patches.
+ * patches/gnome-netstatus-02-kstat-solaris.diff: Reworked and renamed
+ * patches/gnome-netstatus-01-kstat-solaris.diff:
+ * patches/gnome-netstatus-04-default-interface.diff: Reworked and renamed
+ * patches/gnome-netstatus-03-default-interface.diff:
+ * patches/gnome-netstatus-02-restart-wifiinfo.diff: Reworked to use GtkBuilder
+ * patches/gnome-netstatus-05-wifi-info.diff: Merged to *restart-wiinfo.diff
+ * patches/gnome-netstatus-01-restart.diff: Merged to *restart-wiinfo.diff
+
2009-09-25 Dave Lin <[email protected]>
* include/prod.inc: Update version to 2.28.0.
--- a/base-specs/gnome-netstatus.spec Fri Sep 25 10:14:23 2009 +0000
+++ b/base-specs/gnome-netstatus.spec Fri Sep 25 15:46:38 2009 +0000
@@ -11,12 +11,12 @@
Name: gnome-netstatus
License: GPL
Group: System/GUI/GNOME
-Version: 2.26.0
+Version: 2.28.0
Release: 1
Distribution: Java Desktop System
Vendor: Sun Microsystems, Inc.
Summary: The GNOME Network Monitor Applet
-Source: http://ftp.gnome.org/pub/GNOME/sources/gnome-netstatus/2.26/%{name}-%{version}.tar.bz2
+Source: http://ftp.gnome.org/pub/GNOME/sources/gnome-netstatus/2.28/%{name}-%{version}.tar.bz2
%if %build_l10n
Source1: l10n-configure.sh
%endif
@@ -25,13 +25,11 @@
Source3: %{name}-po-sun-%{po_sun_version}.tar.bz2
%endif
#owner:gman date:2005-02-03 type:branding
-Patch1: gnome-netstatus-01-restart.diff
+Patch1: gnome-netstatus-01-kstat-solaris.diff
#owner:gman date:2005-02-03 type:branding
-Patch2: gnome-netstatus-02-kstat-solaris.diff
+Patch2: gnome-netstatus-02-restart-wifiinfo.diff
#owner:mattman date:2007-08-24 type:bug bugster:6577129 bugzilla:469864
-Patch4: gnome-netstatus-04-default-interface.diff
-#owner:dkenny date:2008-06-23 type:feature
-Patch5: gnome-netstatus-05-wifi-info.diff
+Patch3: gnome-netstatus-03-default-interface.diff
URL: http://www.gnome.org
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Docdir: %{_defaultdocdir}/gnome-netstatus
@@ -56,11 +54,9 @@
bzcat %SOURCE3 | tar xf -
cd po-sun; make; cd ..
%endif
-
%patch1 -p1
%patch2 -p1
-%patch4 -p1
-%patch5 -p1
+%patch3 -p1
cd icons
gzip -cd %SOURCE2 | tar xvf -
@@ -139,6 +135,18 @@
%{_datadir}/omf/gnome-netstatus/*.omf
%changelog
+* Fri Sep 25 2009 - [email protected]
+- Bump to 2.28.0
+- Reworked gnome-netstatus-01-kstat-solaris.diff and moved
+ from gnome-netstatus-02-kstat-solaris.diff
+- Merged gnome-netstatus-01-restart.diff and
+ gnome-netstatus-05-wifi-info.diff into
+ gnome-netstatus-02-restart-wifiinfo.diff
+- gnome-netstatus-02-restart-wifiinfo.diff rework needed
+ due to change from libglade to GtkBuilder
+- gnome-netstatus-03-default-interface.diff reworked
+ from gnome-netstatus-04-default-interface.diff
+
* Fri Mar 13 2009 - [email protected]
- Bump to 2.26.0
- Removed upstreamed patch 03-icon-symlink.diff.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/gnome-netstatus-01-kstat-solaris.diff Fri Sep 25 15:46:38 2009 +0000
@@ -0,0 +1,173 @@
+--- gnome-netstatus-2.26.0/configure.in.orig 2009-03-08 05:44:58.000000000 +0000
++++ gnome-netstatus-2.26.0/configure.in 2009-03-18 10:17:17.098639534 +0000
+@@ -79,6 +79,24 @@ else
+ fi
+ AC_SUBST(NETSTATUS_DEBUG_CFLAGS)
+
++case $host in
++*-*-solaris*)
++ ostype=solaris
++ AC_CHECK_LIB(kstat, kstat_open, [
++ AC_CHECK_HEADER(kstat.h, [
++ AC_DEFINE(HAVE_KSTAT, 1, [Define to 1 if you have the <kstat.h> header file.])
++ KSTAT_LIBS=-lkstat
++ AC_SUBST(KSTAT_LIBS)
++ ])
++ ], AC_MSG_ERROR([*** libkstat is required]))
++ AC_DEFINE_UNQUOTED(HAVE_SOLARIS, 1, Define to 1)
++ ;;
++*-*-linux*)
++ ostype=linux
++ AC_DEFINE_UNQUOTED(HAVE_LINUX, 1, Define to 1)
++ ;;
++esac
++
+ dnl
+ dnl whether or not to run glib-mkenums etc.
+ dnl
+
+--- gnome-netstatus-2.7.1/src/Makefile.am 2004-07-22 17:02:37.778210000 +0600
++++ gnome-netstatus-2.7.1-new/src/Makefile.am 2004-07-22 17:01:38.429334000 +0600
+@@ -14,7 +14,7 @@ INCLUDES = \
+
+ libexec_PROGRAMS = gnome-netstatus-applet
+
+-gnome_netstatus_applet_LDADD = $(NETSTATUS_LIBS)
++gnome_netstatus_applet_LDADD = $(NETSTATUS_LIBS) $(KSTAT_LIBS)
+
+ gnome_netstatus_applet_SOURCES = \
+ netstatus-applet.c \
+--- gnome-netstatus-2.26.0/src/netstatus-sysdeps.c.ori 2009-03-13 11:52:01.363555674 +0000
++++ gnome-netstatus-2.26.0/src/netstatus-sysdeps.c 2009-03-13 11:53:18.108631785 +0000
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2003 Sun Microsystems, Inc.
++ * Copyright (C) 2003-2009 Sun Microsystems, Inc.
+ * Copyright (C) 2004 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+@@ -35,6 +35,11 @@
+ #include <glib.h>
+ #include <glib/gi18n.h>
+
++#ifdef HAVE_SOLARIS
++#include <kstat.h>
++#include <stdlib.h>
++#endif
++
+ #ifdef __FreeBSD__
+ #include <sys/types.h>
+ #include <sys/socket.h>
+@@ -78,7 +82,7 @@
+ return TRUE;
+ }
+
+-#if !defined (__FreeBSD__)
++#if !defined (__FreeBSD__) && !defined (__sun)
+
+ static inline char *
+ parse_iface_name (const char *buf)
+@@ -357,6 +361,103 @@
+ return error_message;
+ }
+
++#elif defined (__sun)
++
++char *
++netstatus_sysdeps_read_iface_statistics (const char *iface,
++ gulong *in_packets,
++ gulong *out_packets,
++ gulong *in_bytes,
++ gulong *out_bytes)
++{
++ char *error_message = NULL;
++ static kstat_ctl_t *kc = NULL;
++ kstat_t *ksp;
++ kstat_named_t *kn;
++
++ /*
++ * The linux-specific code uses -1 as the default value. But if we return -1
++ * (see comment below), then it gets interpreted as (unsigned long)-1, which
++ * looks stupid and is definitely more wrong than just showing 0.
++ */
++
++ *in_packets = 0;
++ *out_packets = 0;
++ *in_bytes = 0;
++ *out_bytes = 0;
++
++ if (kc == NULL)
++ {
++ if ((kc = kstat_open ()) == NULL)
++ return g_strdup_printf (_("Cannot open /dev/kstat: %s"),
++ g_strerror (errno));
++ }
++ else
++ {
++ if (kstat_chain_update (kc) < 0)
++ {
++ int e = errno;
++ kstat_close (kc);
++ kc = NULL;
++ return g_strdup_printf (_("Cannot update kstats: %s"),
++ g_strerror (e));
++ }
++ }
++
++ if ((ksp = kstat_lookup (kc, NULL, -1, iface)) == NULL)
++ {
++ kstat_close (kc);
++ kc = NULL;
++ return g_strdup_printf (_("Cannot find information on interface '%s'"),
++ iface);
++ }
++
++ if (kstat_read (kc, ksp, NULL) < 0)
++ {
++ kstat_close (kc);
++ kc = NULL;
++ return g_strdup_printf (_("Cannot read kstat"));
++ }
++
++ if ((kn = kstat_data_lookup (ksp, "ipackets")) != NULL)
++ *in_packets = kn->value.ui32;
++
++ if ((kn = kstat_data_lookup (ksp, "opackets")) != NULL)
++ *out_packets = kn->value.ui32;
++
++ if ((kn = kstat_data_lookup (ksp, "rbytes")) != NULL)
++ *in_bytes = kn->value.ui32;
++
++ if ((kn = kstat_data_lookup (ksp, "obytes")) != NULL)
++ *out_bytes = kn->value.ui32;
++
++ /*
++ * On Solaris, loopback doesn't report bytes, just packets. The behavior of
++ * the linux-specific code reports an error if all the data is not present,
++ * and that shuts the applet down. So perhaps it's best to simply return
++ * success if we can access the data at all.
++ */
++
++ return NULL;
++}
++
++char *
++netstatus_sysdeps_read_iface_wireless_details (const char *iface,
++ gboolean *is_wireless,
++ int *signal_strength)
++{
++ g_return_val_if_fail (iface != NULL, NULL);
++ g_return_val_if_fail (is_wireless != NULL, NULL);
++ g_return_val_if_fail (signal_strength != NULL, NULL);
++
++ if (is_wireless)
++ *is_wireless = FALSE;
++ if (signal_strength)
++ *signal_strength = 0;
++
++ return NULL;
++}
++
+ #else /* defined(__FreeBSD__) */
+
+ static inline void
--- a/patches/gnome-netstatus-01-restart.diff Fri Sep 25 10:14:23 2009 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,954 +0,0 @@
---- gnome-netstatus-2.26.0/src/gnome-netstatus.glade.orig 2009-03-08 05:25:52.000000000 +0000
-+++ gnome-netstatus-2.26.0/src/gnome-netstatus.glade 2009-03-18 10:17:17.001619505 +0000
-@@ -1374,6 +1374,230 @@
- <property name="type">tab</property>
- </packing>
- </child>
-+
-+ <child>
-+ <widget class="GtkVBox" id="vbox3">
-+ <property name="border_width">12</property>
-+ <property name="visible">True</property>
-+ <property name="homogeneous">False</property>
-+ <property name="spacing">18</property>
-+
-+ <child>
-+ <widget class="GtkVBox" id="vbox5">
-+ <property name="visible">True</property>
-+ <property name="homogeneous">False</property>
-+ <property name="spacing">6</property>
-+
-+ <child>
-+ <widget class="GtkLabel" id="label59">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">You may need to restart ths connection if you want to connect to a different network, or if you are experiencing connection problems.</property>
-+ <property name="use_underline">False</property>
-+ <property name="use_markup">False</property>
-+ <property name="justify">GTK_JUSTIFY_LEFT</property>
-+ <property name="wrap">True</property>
-+ <property name="selectable">False</property>
-+ <property name="xalign">0</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xpad">0</property>
-+ <property name="ypad">0</property>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">True</property>
-+ <property name="fill">True</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">False</property>
-+ <property name="fill">True</property>
-+ </packing>
-+ </child>
-+
-+ <child>
-+ <widget class="GtkHBox" id="restart_hbox">
-+ <property name="visible">True</property>
-+ <property name="homogeneous">False</property>
-+ <property name="spacing">0</property>
-+
-+ <child>
-+ <widget class="GtkLabel" id="label65">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"></property>
-+ <property name="use_underline">False</property>
-+ <property name="use_markup">False</property>
-+ <property name="justify">GTK_JUSTIFY_LEFT</property>
-+ <property name="wrap">False</property>
-+ <property name="selectable">False</property>
-+ <property name="xalign">0.5</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xpad">0</property>
-+ <property name="ypad">0</property>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">True</property>
-+ <property name="fill">True</property>
-+ </packing>
-+ </child>
-+
-+ <child>
-+ <widget class="GtkVBox" id="vbox6">
-+ <property name="visible">True</property>
-+ <property name="homogeneous">False</property>
-+ <property name="spacing">0</property>
-+
-+ <child>
-+ <widget class="GtkButton" id="restart_button">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="relief">GTK_RELIEF_NORMAL</property>
-+
-+ <child>
-+ <widget class="GtkAlignment" id="alignment3">
-+ <property name="visible">True</property>
-+ <property name="xalign">0.5</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xscale">0</property>
-+ <property name="yscale">0</property>
-+
-+ <child>
-+ <widget class="GtkHBox" id="hbox15">
-+ <property name="visible">True</property>
-+ <property name="homogeneous">False</property>
-+ <property name="spacing">2</property>
-+
-+ <child>
-+ <widget class="GtkImage" id="restart_button_image">
-+ <property name="visible">True</property>
-+ <property name="stock">gtk-refresh</property>
-+ <property name="icon_size">4</property>
-+ <property name="xalign">0.5</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xpad">0</property>
-+ <property name="ypad">0</property>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+
-+ <child>
-+ <widget class="GtkLabel" id="restart_button_label">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">_Restart</property>
-+ <property name="use_underline">True</property>
-+ <property name="use_markup">False</property>
-+ <property name="justify">GTK_JUSTIFY_LEFT</property>
-+ <property name="wrap">False</property>
-+ <property name="selectable">False</property>
-+ <property name="xalign">0.5</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xpad">0</property>
-+ <property name="ypad">0</property>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ </child>
-+ </widget>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+
-+ <child>
-+ <widget class="GtkLabel" id="label70">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"></property>
-+ <property name="use_underline">False</property>
-+ <property name="use_markup">False</property>
-+ <property name="justify">GTK_JUSTIFY_LEFT</property>
-+ <property name="wrap">False</property>
-+ <property name="selectable">False</property>
-+ <property name="xalign">0.5</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xpad">0</property>
-+ <property name="ypad">0</property>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">True</property>
-+ <property name="fill">True</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">True</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+
-+ <child>
-+ <widget class="GtkLabel" id="label69">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"></property>
-+ <property name="use_underline">False</property>
-+ <property name="use_markup">False</property>
-+ <property name="justify">GTK_JUSTIFY_LEFT</property>
-+ <property name="wrap">False</property>
-+ <property name="selectable">False</property>
-+ <property name="xalign">0.5</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xpad">0</property>
-+ <property name="ypad">0</property>
-+ </widget>
-+ <packing>
-+ <property name="padding">0</property>
-+ <property name="expand">True</property>
-+ <property name="fill">True</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="tab_expand">False</property>
-+ <property name="tab_fill">True</property>
-+ </packing>
-+ </child>
-+
-+ <child>
-+ <widget class="GtkLabel" id="restart_tab_label">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">Restart</property>
-+ <property name="use_underline">False</property>
-+ <property name="use_markup">False</property>
-+ <property name="justify">GTK_JUSTIFY_LEFT</property>
-+ <property name="wrap">False</property>
-+ <property name="selectable">False</property>
-+ <property name="xalign">0.5</property>
-+ <property name="yalign">0.5</property>
-+ <property name="xpad">0</property>
-+ <property name="ypad">0</property>
-+ </widget>
-+ <packing>
-+ <property name="type">tab</property>
-+ </packing>
-+ </child>
- </widget>
- <packing>
- <property name="padding">0</property>
-
---- gnome-netstatus-2.26.0/src/netstatus-dialog.c.orig 2009-03-08 05:25:52.000000000 +0000
-+++ gnome-netstatus-2.26.0/src/netstatus-dialog.c 2009-03-18 10:17:17.003073396 +0000
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (C) 2003 Sun Microsystems, Inc.
-+ * Copyright (C) 2003-2004 Sun Microsystems, Inc.
- * Copyright (C) 2004 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or
-@@ -36,6 +36,27 @@
- #define NETWORK_CONFIG_TOOL_DIR "/apps/netstatus_applet"
- #define NETWORK_CONFIG_TOOL_KEY NETWORK_CONFIG_TOOL_DIR "/config_tool"
-
-+static const gchar * IFRESTART_TAB_LABLE_NAME = "restart_tab_label";
-+static const gchar * IFRESTART_TAB_BUTTON_NAME = "restart_button";
-+static const gchar * IFRESTART_TAB_BUTTON_LABEL_NAME = "restart_button_label";
-+static const gchar * IFRESTART_TAB_BUTTON_IMAGE_NAME = "restart_button_image";
-+static const gchar * IFRESTART_TAB_HBOX_NAME = "restart_hbox";
-+
-+static const gchar * IFRESTART_TAB_BUTTON_LABEL_RESTART = "_Restart";
-+static const gchar * IFRESTART_TAB_BUTTON_LABEL_STOP = "_Stop";
-+
-+static const gchar * IFRESTART_WINDOW_TITLE_FORMAT = "%s: %s";
-+static const gchar * IFRESTART_WINDOW_TITLE = "Restartin Connection";
-+
-+static const gchar * IFRESTART_PROGRESS_FORMAT = "<b>%s</b>: <i>%s</i>";
-+static const gchar * IFRESTART_PROGRESS = "Progress";
-+static const gchar * IFRESTART_PROGRESS_BEGIN = "Click Restart to begin";
-+static const gchar * IFRESTART_PROGRESS_RESTARTING = "Restarting...";
-+static const gchar * IFRESTART_PROGRESS_COMPLETE = "Complete";
-+static const gchar * IFRESTART_PROGRESS_FAILED = "Failed, click here for details";
-+static const gchar * IFRESTART_WARNING = "Warning";
-+static const gchar * IFRESTART_WARNING_NOLO = "Cannot restart this connection";
-+
- static const char *network_config_tools[] = {
- "network-admin --configure %i",
- "redhat-config-network",
-@@ -81,6 +102,11 @@ typedef struct
- GtkWidget *dev_type;
- GtkWidget *dev_addr;
-
-+ GtkWidget *restart_button;
-+ GtkWidget *restart_button_image;
-+ GtkWidget *restart_button_label;
-+ GtkWidget *restart_progress_expander;
-+
- guint iface_list_monitor;
- int n_ifaces;
- } NetstatusDialogData;
-@@ -313,6 +339,46 @@ netstatus_dialog_update_device_support (
- }
-
- static void
-+netstatus_dialog_update_restart_button (NetstatusDialogData *data)
-+{
-+ GtkWidget * widget;
-+ gchar * string;
-+ const char * ifname;
-+
-+ if (data->restart_button == NULL)
-+ return;
-+
-+ /* Disable restart button for nothing and loopback interface */
-+ ifname = netstatus_iface_get_name (data->iface);
-+ if ((ifname != NULL) && (strcmp (ifname, "lo")))
-+ {
-+ gtk_widget_set_sensitive (data->restart_button, TRUE);
-+
-+ /* Set "Press button to restart" progress message */
-+ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
-+ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_BEGIN));
-+ }
-+ else
-+ {
-+ gtk_widget_set_sensitive (data->restart_button, FALSE);
-+
-+ /* Set "Cannot restart this connection" progress message */
-+ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
-+ _(IFRESTART_WARNING), _(IFRESTART_WARNING_NOLO));
-+ }
-+ gtk_expander_set_label (
-+ GTK_EXPANDER (data->restart_progress_expander), string);
-+ g_free (string);
-+
-+ /* Clean up the output of the last restart */
-+ widget = gtk_bin_get_child (GTK_BIN (data->restart_progress_expander));
-+ if (widget != NULL)
-+ {
-+ gtk_label_set_text (GTK_LABEL (widget), "");
-+ }
-+}
-+
-+static void
- netstatus_dialog_iface_state_changed (NetstatusIface *iface,
- GParamSpec *pspec,
- NetstatusDialogData *data)
-@@ -345,6 +411,7 @@ netstatus_dialog_iface_name_changed (Net
- {
- netstatus_dialog_update_name (data);
- netstatus_dialog_update_signal_strength (data);
-+ netstatus_dialog_update_restart_button (data);
- }
-
- static void
-@@ -364,6 +431,136 @@ netstatus_dialog_set_iface_name (Netstat
- }
-
- static void
-+netstatus_dialog_restart_state_changed (
-+ NetstatusIface *iface, NetstatusDialogData *data)
-+{
-+ GtkWidget * widget;
-+ gchar * string;
-+
-+ g_return_if_fail (data != NULL);
-+ g_return_if_fail (data->iface != NULL);
-+
-+ if (netstatus_iface_restart_inprogress (data->iface))
-+ {
-+ /* The restart is in progress */
-+ const char * ifname;
-+
-+ /* Save the current network interface name */
-+ ifname = netstatus_iface_get_name (data->iface);
-+ g_return_if_fail (ifname != NULL);
-+
-+ /* Disable network interface change */
-+ gtk_widget_set_sensitive (data->name, FALSE);
-+
-+ /* Set the restart button to Stop */
-+ gtk_image_set_from_stock (GTK_IMAGE (data->restart_button_image),
-+ GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON);
-+ gtk_label_set_text_with_mnemonic (GTK_LABEL (data->restart_button_label),
-+ _(IFRESTART_TAB_BUTTON_LABEL_STOP));
-+
-+ /* Set dialog window title */
-+ string = g_strdup_printf (IFRESTART_WINDOW_TITLE_FORMAT,
-+ _(IFRESTART_WINDOW_TITLE), ifname);
-+ gtk_window_set_title (GTK_WINDOW (data->dialog), string);
-+ g_free (string);
-+
-+ /* Set the progress message */
-+ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
-+ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_RESTARTING));
-+ gtk_expander_set_label (
-+ GTK_EXPANDER (data->restart_progress_expander), string);
-+ g_free (string);
-+
-+ /* Clean up the output of the script */
-+ widget = gtk_bin_get_child (GTK_BIN (data->restart_progress_expander));
-+ if (widget != NULL)
-+ {
-+ gtk_label_set_text (GTK_LABEL (widget), "");
-+ }
-+ }
-+ else
-+ {
-+ /* The restart is completed */
-+ gint state;
-+
-+ /* Set the restart button to Restart */
-+ gtk_image_set_from_stock (GTK_IMAGE (data->restart_button_image),
-+ GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON);
-+ gtk_label_set_text_with_mnemonic (GTK_LABEL (data->restart_button_label),
-+ _(IFRESTART_TAB_BUTTON_LABEL_RESTART));
-+
-+ /* Enable network interface change */
-+ gtk_widget_set_sensitive (data->name, TRUE);
-+
-+ /* Restore dialog window title */
-+ netstatus_dialog_update_name (data);
-+
-+ /* Set the progress message */
-+ state = netstatus_iface_restart_get_status (data->iface);
-+ if (state == 0)
-+ {
-+ /* Restart has been completed successfully */
-+ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
-+ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_COMPLETE));
-+ }
-+ else if (state > 0)
-+ {
-+ /* Restart has failed */
-+ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
-+ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_FAILED));
-+ }
-+ else
-+ {
-+ /* No restart has been completed or started yet */
-+ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
-+ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_BEGIN));
-+ }
-+ gtk_expander_set_label (
-+ GTK_EXPANDER (data->restart_progress_expander), string);
-+ g_free (string);
-+
-+ /* Set the output of the script */
-+ widget = gtk_bin_get_child (GTK_BIN (data->restart_progress_expander));
-+ if (widget != NULL)
-+ {
-+ string = netstatus_iface_restart_get_output (data->iface);
-+ switch (state)
-+ {
-+ case 9: /* canceled by "Stop" button */
-+ case 3072: /* canceled by root password dialog */
-+ string = _("Connection restart has been stopped.");
-+ break;
-+
-+ case 19: /* there is no ifrestart script */
-+ string = _("Cannot find ifrestart script.");
-+ break;
-+
-+ default:
-+ break;
-+ }
-+ gtk_label_set_text (GTK_LABEL (widget), string);
-+ }
-+ }
-+}
-+
-+static void
-+netstatus_dialog_restart (GtkWidget *button, NetstatusDialogData *data)
-+{
-+ g_return_if_fail (data != NULL);
-+
-+ if (netstatus_iface_restart_inprogress (data->iface))
-+ {
-+ /* Interrupt the network interface restart */
-+ netstatus_iface_restart_interrupt (data->iface);
-+ }
-+ else
-+ {
-+ /* Spawn the network interface restart */
-+ netstatus_iface_restart (data->iface);
-+ }
-+}
-+
-+static void
- netstatus_dialog_response (GtkWidget *dialog,
- int response)
- {
-@@ -441,7 +638,11 @@ netstatus_dialog_destroy (GtkWidget *dia
- data->iface_list_monitor = 0;
-
- if (data->iface)
-- g_object_unref (data->iface);
-+ {
-+ g_signal_handlers_disconnect_matched (
-+ data->iface, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) data);
-+ g_object_unref (data->iface);
-+ }
- data->iface = NULL;
-
- g_free (data);
-@@ -711,6 +912,85 @@ netstatus_dialog_iface_list_monitor (Net
- return TRUE;
- }
-
-+static void
-+netstatus_dialog_setup_restart_tab (NetstatusDialogData *data, GladeXML *xml)
-+{
-+ GtkWidget * widget;
-+
-+ g_return_if_fail (data != NULL);
-+ g_return_if_fail (xml != NULL);
-+
-+ /* Network interface restart tab */
-+ if (netstatus_iface_restart_available (data->iface))
-+ {
-+ /* Restart button */
-+ data->restart_button = glade_xml_get_widget (xml, IFRESTART_TAB_BUTTON_NAME);
-+ if (data->restart_button != NULL)
-+ {
-+ /* Button image */
-+ data->restart_button_image = glade_xml_get_widget (
-+ xml, IFRESTART_TAB_BUTTON_IMAGE_NAME);
-+ /* Button label */
-+ data->restart_button_label = glade_xml_get_widget (
-+ xml, IFRESTART_TAB_BUTTON_LABEL_NAME);
-+ /* Clicked signal handler */
-+ g_signal_connect (G_OBJECT (data->restart_button), "clicked",
-+ G_CALLBACK (netstatus_dialog_restart), (gpointer) data);
-+ }
-+ /* Add progress expander */
-+ widget = glade_xml_get_widget (xml, IFRESTART_TAB_HBOX_NAME);
-+ if (widget != NULL)
-+ {
-+ gtk_box_set_spacing (GTK_BOX (widget), 2);
-+ data->restart_progress_expander = gtk_expander_new ("");
-+ gtk_expander_set_use_markup (
-+ GTK_EXPANDER (data->restart_progress_expander), TRUE);
-+ gtk_box_pack_start (GTK_BOX (widget),
-+ data->restart_progress_expander, FALSE, FALSE, 0);
-+ gtk_box_reorder_child (GTK_BOX (widget),
-+ data->restart_progress_expander, 0);
-+ widget = gtk_label_new ("");
-+ gtk_label_set_selectable (GTK_LABEL (widget), TRUE);
-+ gtk_container_add (
-+ GTK_CONTAINER (data->restart_progress_expander), widget);
-+ gtk_widget_show_all (data->restart_progress_expander);
-+ }
-+
-+ netstatus_dialog_restart_state_changed (data->iface, data);
-+ netstatus_dialog_update_restart_button (data);
-+
-+ g_signal_connect (
-+ data->iface, NETSTATUS_IFACE_SIGNAL_RESTART_STATE,
-+ G_CALLBACK (netstatus_dialog_restart_state_changed), data);
-+ }
-+ else
-+ {
-+ GtkNotebook * notebook;
-+ const gchar * name;
-+ gint idx;
-+
-+ /* Remove the restart tab */
-+ notebook = GTK_NOTEBOOK (glade_xml_get_widget (xml, "notebook1"));
-+ if (notebook != NULL)
-+ {
-+ for (idx = 0; idx < gtk_notebook_get_n_pages (notebook); idx++)
-+ {
-+ widget = gtk_notebook_get_nth_page (notebook, idx);
-+ widget = gtk_notebook_get_tab_label (notebook, widget);
-+ if (widget != NULL)
-+ {
-+ name = gtk_widget_get_name (widget);
-+ if (!strcmp (name, IFRESTART_TAB_LABLE_NAME))
-+ {
-+ gtk_notebook_remove_page (notebook, idx);
-+ break;
-+ }
-+ }
-+ }
-+ }
-+ }
-+}
-+
- GtkWidget *
- netstatus_dialog_new (NetstatusIface *iface)
- {
-@@ -771,6 +1051,7 @@ netstatus_dialog_new (NetstatusIface *if
- netstatus_dialog_setup_inet4_support (data, xml);
- netstatus_dialog_setup_device_support (data, xml);
- netstatus_dialog_setup_configure_button (data, xml);
-+ netstatus_dialog_setup_restart_tab (data, xml);
-
- data->iface_list_monitor = g_timeout_add (2 * 1000,
- (GSourceFunc) netstatus_dialog_iface_list_monitor,
-
---- gnome-netstatus-2.12.0/src/netstatus-iface.c.foo 2005-03-14 22:34:06.000000000 +0800
-+++ gnome-netstatus-2.12.0/src/netstatus-iface.c 2006-10-19 17:01:26.105983000 +0800
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (C) 2003 Sun Microsystems, Inc.
-+ * Copyright (C) 2003-2004 Sun Microsystems, Inc.
- * Copyright (C) 2004 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or
-@@ -40,6 +40,8 @@
- #endif /* HAVE_SYS_SOCKIO_H */
- #include <sys/param.h>
- #include <sys/socket.h>
-+#include <sys/types.h>
-+#include <signal.h>
- #include <net/if.h>
- #include <net/if_arp.h>
- #include <netinet/in.h>
-@@ -55,6 +57,9 @@
- #define NETSTATUS_IFACE_POLLS_IN_ERROR 10 /* no. of polls in error before increasing delay */
- #define NETSTATUS_IFACE_ERROR_POLL_DELAY 5000 /* delay to use when in error state */
-
-+#define NETSTATUS_IFACE_RESTART_SCRIPT_TESTFLAGS (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_SYMLINK | G_FILE_TEST_IS_EXECUTABLE)
-+static const gchar * NETSTATUS_IFACE_RESTART_SCRIPT = "/usr/bin/ifrestart";
-+
- enum
- {
- PROP_0,
-@@ -66,6 +71,12 @@
- PROP_ERROR
- };
-
-+enum
-+{
-+ RESTART_STATE,
-+ LAST_SIGNAL
-+};
-+
- struct _NetstatusIfacePrivate
- {
- char *name;
-@@ -80,6 +91,13 @@
-
- guint error_polling : 1;
- guint is_wireless : 1;
-+
-+ gchar *restart_output;
-+ GPid restart_pid;
-+ gint restart_status;
-+ GIOChannel *restart_outioc;
-+ GIOChannel *restart_errioc;
-+ guint restart_cwsource;
- };
-
- static void netstatus_iface_instance_init (NetstatusIface *iface,
-@@ -96,10 +114,11 @@
- GParamSpec *pspec);
- static gboolean netstatus_iface_monitor_timeout (NetstatusIface *iface);
- static void netstatus_iface_init_monitor (NetstatusIface *iface);
--
-+static gboolean netstatus_iface_restart_collect_output (NetstatusIface *iface);
-
-
- static GObjectClass *parent_class;
-+static guint netstatus_iface_signals[LAST_SIGNAL] = { 0 };
-
- GType
- netstatus_iface_get_type (void)
-@@ -136,6 +155,11 @@
- iface->priv = g_new0 (NetstatusIfacePrivate, 1);
-
- iface->priv->state = NETSTATUS_STATE_DISCONNECTED;
-+
-+ iface->priv->restart_status = -1; /* never restarted */
-+ iface->priv->restart_output = NULL;
-+ iface->priv->restart_outioc = NULL;
-+ iface->priv->restart_errioc = NULL;
- }
-
- static void
-@@ -199,6 +223,15 @@
- _("The current error condition"),
- NETSTATUS_TYPE_G_ERROR,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-+
-+ netstatus_iface_signals[RESTART_STATE] = g_signal_new (
-+ NETSTATUS_IFACE_SIGNAL_RESTART_STATE,
-+ G_TYPE_FROM_CLASS (gobject_class),
-+ G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
-+ G_STRUCT_OFFSET (NetstatusIfaceClass, restart_complete),
-+ NULL, /* accumulator */
-+ NULL, /* accumulator data */
-+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
- }
-
- static void
-@@ -221,6 +254,11 @@
- g_free (iface->priv->name);
- iface->priv->name = NULL;
-
-+ netstatus_iface_restart_collect_output (iface);
-+ if (iface->priv->restart_output != NULL)
-+ g_free (iface->priv->restart_output);
-+ iface->priv->restart_output = NULL;
-+
- g_free (iface->priv);
- iface->priv = NULL;
-
-@@ -1256,3 +1294,221 @@
-
- return interfaces;
- }
-+
-+/*
-+ * Returns TRUE if the ifrestart script is installed.
-+ */
-+gboolean
-+netstatus_iface_restart_available (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail ((iface != NULL), FALSE);
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
-+
-+ return g_file_test (
-+ NETSTATUS_IFACE_RESTART_SCRIPT, NETSTATUS_IFACE_RESTART_SCRIPT_TESTFLAGS);
-+}
-+
-+/*
-+ * Returns TRUE if the restart in progress.
-+ */
-+gboolean
-+netstatus_iface_restart_inprogress (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail ((iface != NULL), FALSE);
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
-+ g_return_val_if_fail ((iface->priv != NULL), 0);
-+
-+ return (iface->priv->restart_status == -2);
-+}
-+
-+/*
-+ * Sets the interface restart status and emmits the signal.
-+ */
-+static void
-+netstatus_iface_restart_set_status (
-+ NetstatusIface *iface, gint status)
-+{
-+ g_return_if_fail (iface != NULL);
-+ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
-+ g_return_if_fail (iface->priv != NULL);
-+
-+ /* Restart process exit status */
-+ iface->priv->restart_status = status;
-+
-+ /* Emit restart complete signal */
-+ g_signal_emit (iface,
-+ netstatus_iface_signals[RESTART_STATE], 0);
-+}
-+
-+/*
-+ * Collect output and release IOChannels.
-+ * This method returns TRUE if the error output was empty.
-+ */
-+static gboolean
-+netstatus_iface_restart_collect_output (NetstatusIface *iface)
-+{
-+ gchar * outstr = NULL;
-+ gsize outsize = 0;
-+ gchar * errstr = NULL;
-+ gsize errsize = 0;
-+ GError * error = NULL;
-+
-+ g_return_val_if_fail ((iface != NULL), FALSE);
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
-+ g_return_val_if_fail ((iface->priv != NULL), FALSE);
-+
-+ /* Release stdout channel */
-+ if (iface->priv->restart_outioc != NULL)
-+ {
-+ g_io_channel_read_to_end (iface->priv->restart_outioc,
-+ &outstr, &outsize, &error);
-+ g_io_channel_shutdown (iface->priv->restart_outioc, FALSE, &error);
-+ g_io_channel_unref (iface->priv->restart_outioc);
-+ iface->priv->restart_outioc = NULL;
-+ }
-+ /* Release stderr channel */
-+ if (iface->priv->restart_errioc != NULL)
-+ {
-+ g_io_channel_read_to_end (iface->priv->restart_errioc,
-+ &errstr, &errsize, &error);
-+ g_io_channel_shutdown (iface->priv->restart_errioc, FALSE, &error);
-+ g_io_channel_unref (iface->priv->restart_errioc);
-+ iface->priv->restart_errioc = NULL;
-+ }
-+ /* Release the last interface restart output */
-+ if (iface->priv->restart_output != NULL)
-+ g_free (iface->priv->restart_output);
-+ iface->priv->restart_output == NULL;
-+ /* New restart output */
-+ if (errsize != 0)
-+ {
-+ iface->priv->restart_output = g_strdup (errstr);
-+ }
-+ else if (outsize != 0)
-+ {
-+ iface->priv->restart_output = g_strdup (outstr);
-+ }
-+ if (outstr != NULL)
-+ g_free (outstr);
-+ if (errstr != NULL)
-+ g_free (errstr);
-+
-+ return (errsize == 0);
-+}
-+
-+/*
-+ * Interface restart completition routine.
-+ */
-+static void
-+netstatus_iface_restart_complete (
-+ GPid pid, gint status, NetstatusIface *iface)
-+{
-+ g_return_if_fail (iface != NULL);
-+ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
-+ g_return_if_fail (iface->priv != NULL);
-+
-+ iface->priv->restart_cwsource = 0;
-+
-+ /* Release the output and error IOChannels */
-+ if (netstatus_iface_restart_collect_output (iface))
-+ {
-+ netstatus_iface_restart_set_status (iface, status);
-+ }
-+ else
-+ {
-+ netstatus_iface_restart_set_status (iface, (status == 0)? 9999: status);
-+ }
-+}
-+
-+/*
-+ * Initiates the restart for current interface and returns pid of
-+ * the restart process. Returns 0 if the restart fails.
-+ */
-+GPid
-+netstatus_iface_restart (NetstatusIface *iface)
-+{
-+ gchar * argv[3];
-+ gint out_fd;
-+ gint err_fd;
-+ gboolean result;
-+ GError * error = NULL;
-+
-+ g_return_val_if_fail ((iface != NULL), 0);
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
-+ g_return_val_if_fail ((iface->priv != NULL), 0);
-+ g_return_val_if_fail ((netstatus_iface_restart_inprogress (iface) == FALSE), 0);
-+ g_return_val_if_fail ((netstatus_iface_get_name (iface) != NULL), 0);
-+
-+ /* Release the last interface restart output */
-+ iface->priv->restart_outioc = NULL;
-+ iface->priv->restart_errioc = NULL;
-+ if (iface->priv->restart_output != NULL)
-+ g_free (iface->priv->restart_output);
-+ iface->priv->restart_output = NULL;
-+ netstatus_iface_restart_set_status (iface, -2); /* is restarting */
-+ argv[0] = g_strdup (NETSTATUS_IFACE_RESTART_SCRIPT);
-+ argv[1] = g_strdup (netstatus_iface_get_name (iface));
-+ argv[2] = NULL;
-+ result = g_spawn_async_with_pipes (
-+ NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
-+ NULL, NULL,
-+ &(iface->priv->restart_pid),
-+ NULL, &(out_fd), &(err_fd),
-+ &error);
-+ g_free (argv[1]);
-+ g_free (argv[0]);
-+ if (result == FALSE)
-+ {
-+ /* Clean up on unsuccessful spawn */
-+ netstatus_iface_restart_complete (0, G_SPAWN_ERROR_FAILED, iface);
-+ return 0;
-+ }
-+
-+ iface->priv->restart_outioc = g_io_channel_unix_new (out_fd);
-+ iface->priv->restart_errioc = g_io_channel_unix_new (err_fd);
-+ /* Set up the completition routine */
-+ iface->priv->restart_cwsource = g_child_watch_add (iface->priv->restart_pid,
-+ (GChildWatchFunc)netstatus_iface_restart_complete, iface);
-+
-+ return iface->priv->restart_pid;
-+}
-+
-+/*
-+ * Returns the process exit status of the last interface restart.
-+ */
-+gint
-+netstatus_iface_restart_get_status (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail ((iface != NULL), -1);
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), -1);
-+ g_return_val_if_fail ((iface->priv != NULL), -1);
-+
-+ return iface->priv->restart_status;
-+}
-+
-+/*
-+ * Returns an output of the last interface restart.
-+ */
-+G_CONST_RETURN gchar *
-+netstatus_iface_restart_get_output (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail ((iface != NULL), "");
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), "");
-+ g_return_val_if_fail ((iface->priv != NULL), "");
-+
-+ return (iface->priv->restart_output)? iface->priv->restart_output: "";
-+}
-+
-+/*
-+ * Interrupts the restart
-+ */
-+void
-+netstatus_iface_restart_interrupt (NetstatusIface *iface)
-+{
-+ g_return_if_fail (iface != NULL);
-+ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
-+ g_return_if_fail (iface->priv != NULL);
-+ g_return_if_fail (netstatus_iface_restart_inprogress (iface) == TRUE);
-+
-+ kill (iface->priv->restart_pid, SIGKILL);
-+}
---- gnome-netstatus-2.12.0/src/netstatus-iface.h.foo 2004-07-06 01:04:56.000000000 +0800
-+++ gnome-netstatus-2.12.0/src/netstatus-iface.h 2006-10-19 17:01:26.106785000 +0800
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (C) 2003 Sun Microsystems, Inc.
-+ * Copyright (C) 2003-2004 Sun Microsystems, Inc.
- * Copyright (C) 2004 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or
-@@ -39,6 +39,8 @@
- #define NETSTATUS_IS_IFACE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), NETSTATUS_TYPE_IFACE))
- #define NETSTATUS_IFACE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NETSTATUS_TYPE_IFACE, NetstatusIfaceClass))
-
-+#define NETSTATUS_IFACE_SIGNAL_RESTART_STATE "restart_state"
-+
- typedef struct _NetstatusIface NetstatusIface;
- typedef struct _NetstatusIfaceClass NetstatusIfaceClass;
- typedef struct _NetstatusIfacePrivate NetstatusIfacePrivate;
-@@ -53,6 +55,8 @@
- struct _NetstatusIfaceClass
- {
- GObjectClass parent_class;
-+
-+ void (*restart_complete) (GObject *iface);
- };
-
- GList * netstatus_list_interface_names (GError **error);
-@@ -86,6 +90,13 @@
- char **hw_addr);
- gboolean netstatus_iface_get_is_loopback (NetstatusIface *iface);
-
-+gboolean netstatus_iface_restart_available (NetstatusIface *iface);
-+gboolean netstatus_iface_restart_inprogress (NetstatusIface *iface);
-+GPid netstatus_iface_restart (NetstatusIface *iface);
-+gint netstatus_iface_restart_get_status (NetstatusIface *iface);
-+G_CONST_RETURN gchar * netstatus_iface_restart_get_output (NetstatusIface *iface);
-+void netstatus_iface_restart_interrupt (NetstatusIface *iface);
-+
- G_END_DECLS
-
- #endif /* __NETSTATUS_IFACE_H__ */
--- a/patches/gnome-netstatus-02-kstat-solaris.diff Fri Sep 25 10:14:23 2009 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
---- gnome-netstatus-2.26.0/configure.in.orig 2009-03-08 05:44:58.000000000 +0000
-+++ gnome-netstatus-2.26.0/configure.in 2009-03-18 10:17:17.098639534 +0000
-@@ -79,6 +79,24 @@ else
- fi
- AC_SUBST(NETSTATUS_DEBUG_CFLAGS)
-
-+case $host in
-+*-*-solaris*)
-+ ostype=solaris
-+ AC_CHECK_LIB(kstat, kstat_open, [
-+ AC_CHECK_HEADER(kstat.h, [
-+ AC_DEFINE(HAVE_KSTAT, 1, [Define to 1 if you have the <kstat.h> header file.])
-+ KSTAT_LIBS=-lkstat
-+ AC_SUBST(KSTAT_LIBS)
-+ ])
-+ ], AC_MSG_ERROR([*** libkstat is required]))
-+ AC_DEFINE_UNQUOTED(HAVE_SOLARIS, 1, Define to 1)
-+ ;;
-+*-*-linux*)
-+ ostype=linux
-+ AC_DEFINE_UNQUOTED(HAVE_LINUX, 1, Define to 1)
-+ ;;
-+esac
-+
- dnl
- dnl whether or not to run glib-mkenums etc.
- dnl
-
---- gnome-netstatus-2.7.1/src/Makefile.am 2004-07-22 17:02:37.778210000 +0600
-+++ gnome-netstatus-2.7.1-new/src/Makefile.am 2004-07-22 17:01:38.429334000 +0600
-@@ -14,7 +14,7 @@ INCLUDES = \
-
- libexec_PROGRAMS = gnome-netstatus-applet
-
--gnome_netstatus_applet_LDADD = $(NETSTATUS_LIBS)
-+gnome_netstatus_applet_LDADD = $(NETSTATUS_LIBS) $(KSTAT_LIBS)
-
- gnome_netstatus_applet_SOURCES = \
- netstatus-applet.c \
---- gnome-netstatus-2.26.0/src/netstatus-sysdeps.c.ori 2009-03-13 11:52:01.363555674 +0000
-+++ gnome-netstatus-2.26.0/src/netstatus-sysdeps.c 2009-03-13 11:53:18.108631785 +0000
-@@ -35,6 +35,10 @@
- #include <glib.h>
- #include <glib/gi18n.h>
-
-+#ifdef HAVE_SOLARIS
-+#include <kstat.h>
-+#endif
-+
- #ifdef __FreeBSD__
- #include <sys/types.h>
- #include <sys/socket.h>
-@@ -78,7 +82,7 @@
- return TRUE;
- }
-
--#if !defined (__FreeBSD__)
-+#if !defined (__FreeBSD__) && !defined (__sun)
-
- static inline char *
- parse_iface_name (const char *buf)
-@@ -357,6 +361,103 @@
- return error_message;
- }
-
-+#elif defined (__sun)
-+
-+char *
-+netstatus_sysdeps_read_iface_statistics (const char *iface,
-+ gulong *in_packets,
-+ gulong *out_packets,
-+ gulong *in_bytes,
-+ gulong *out_bytes)
-+{
-+ char *error_message = NULL;
-+ static kstat_ctl_t *kc = NULL;
-+ kstat_t *ksp;
-+ kstat_named_t *kn;
-+
-+ /*
-+ * The linux-specific code uses -1 as the default value. But if we return -1
-+ * (see comment below), then it gets interpreted as (unsigned long)-1, which
-+ * looks stupid and is definitely more wrong than just showing 0.
-+ */
-+
-+ *in_packets = 0;
-+ *out_packets = 0;
-+ *in_bytes = 0;
-+ *out_bytes = 0;
-+
-+ if (kc == NULL)
-+ {
-+ if ((kc = kstat_open ()) == NULL)
-+ return g_strdup_printf (_("Cannot open /dev/kstat: %s"),
-+ g_strerror (errno));
-+ }
-+ else
-+ {
-+ if (kstat_chain_update (kc) < 0)
-+ {
-+ int e = errno;
-+ kstat_close (kc);
-+ kc = NULL;
-+ return g_strdup_printf (_("Cannot update kstats: %s"),
-+ g_strerror (e));
-+ }
-+ }
-+
-+ if ((ksp = kstat_lookup (kc, NULL, -1, iface)) == NULL)
-+ {
-+ kstat_close (kc);
-+ kc = NULL;
-+ return g_strdup_printf (_("Cannot find information on interface '%s'"),
-+ iface);
-+ }
-+
-+ if (kstat_read (kc, ksp, NULL) < 0)
-+ {
-+ kstat_close (kc);
-+ kc = NULL;
-+ return g_strdup_printf (_("Cannot read kstat"));
-+ }
-+
-+ if ((kn = kstat_data_lookup (ksp, "ipackets")) != NULL)
-+ *in_packets = kn->value.ui32;
-+
-+ if ((kn = kstat_data_lookup (ksp, "opackets")) != NULL)
-+ *out_packets = kn->value.ui32;
-+
-+ if ((kn = kstat_data_lookup (ksp, "rbytes")) != NULL)
-+ *in_bytes = kn->value.ui32;
-+
-+ if ((kn = kstat_data_lookup (ksp, "obytes")) != NULL)
-+ *out_bytes = kn->value.ui32;
-+
-+ /*
-+ * On Solaris, loopback doesn't report bytes, just packets. The behavior of
-+ * the linux-specific code reports an error if all the data is not present,
-+ * and that shuts the applet down. So perhaps it's best to simply return
-+ * success if we can access the data at all.
-+ */
-+
-+ return NULL;
-+}
-+
-+char *
-+netstatus_sysdeps_read_iface_wireless_details (const char *iface,
-+ gboolean *is_wireless,
-+ int *signal_strength)
-+{
-+ g_return_val_if_fail (iface != NULL, NULL);
-+ g_return_val_if_fail (is_wireless != NULL, NULL);
-+ g_return_val_if_fail (signal_strength != NULL, NULL);
-+
-+ if (is_wireless)
-+ *is_wireless = FALSE;
-+ if (signal_strength)
-+ *signal_strength = 0;
-+
-+ return NULL;
-+}
-+
- #else /* defined(__FreeBSD__) */
-
- static inline void
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/gnome-netstatus-02-restart-wifiinfo.diff Fri Sep 25 15:46:38 2009 +0000
@@ -0,0 +1,3921 @@
+--- gnome-netstatus-2.28.0.orig/src/gnome-netstatus.ui 2009-09-25 11:46:34.295333937 +0100
++++ gnome-netstatus-2.28.0/src/gnome-netstatus.ui 2009-09-25 11:46:40.203959391 +0100
+@@ -7,7 +7,7 @@
+ <property name="resizable">False</property>
+ <property name="window_position">center</property>
+ <property name="default_width">300</property>
+- <property name="type_hint">dialog</property>
++ <property name="type_hint">normal</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox2">
+@@ -46,17 +46,53 @@
+ <object class="GtkHBox" id="hbox6">
+ <property name="visible">True</property>
+ <child>
+- <object class="GtkAlignment" id="alignment7">
++ <object class="GtkLabel" id="label43">
+ <property name="visible">True</property>
+- <property name="left_padding">10</property>
++ <property name="label" translatable="yes"> </property>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkHBox" id="connection_hbox">
++ <property name="visible">True</property>
++ <property name="spacing">12</property>
+ <child>
+ <object class="GtkTable" id="connection_table">
+ <property name="visible">True</property>
+- <property name="n_rows">2</property>
++ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
++ <object class="GtkComboBoxEntry" id="name_combo_box_entry">
++ <property name="visible">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkCheckButton" id="track_active_interface">
++ <property name="label" translatable="yes">_Track system active interface</property>
++ <property name="visible">True</property>
++ <property name="can_focus">True</property>
++ <property name="receives_default">False</property>
++ <property name="use_underline">True</property>
++ <property name="draw_indicator">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ <property name="top_attach">2</property>
++ <property name="bottom_attach">3</property>
++ </packing>
++ </child>
++ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+@@ -98,26 +134,13 @@
+ </packing>
+ </child>
+ <child>
+- <object class="GtkComboBoxEntry" id="name_combo_box_entry">
+- <property name="visible">True</property>
+- </object>
+- <packing>
+- <property name="left_attach">1</property>
+- <property name="right_attach">2</property>
+- <property name="x_options">GTK_FILL</property>
+- <property name="y_options">GTK_FILL</property>
+- </packing>
++ <placeholder/>
+ </child>
+ </object>
++ <packing>
++ <property name="position">0</property>
++ </packing>
+ </child>
+- </object>
+- <packing>
+- <property name="position">0</property>
+- </packing>
+- </child>
+- <child>
+- <object class="GtkHBox" id="connection_hbox">
+- <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+@@ -157,9 +180,19 @@
+ </packing>
+ </child>
+ <child>
+- <object class="GtkAlignment" id="alignment8">
++ <object class="GtkHBox" id="hbox8">
+ <property name="visible">True</property>
+- <property name="left_padding">10</property>
++ <child>
++ <object class="GtkLabel" id="label44">
++ <property name="visible">True</property>
++ <property name="label" translatable="yes"> </property>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+@@ -213,6 +246,7 @@
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Sent:</property>
++ <property name="width_chars">2</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+@@ -222,6 +256,9 @@
+ </packing>
+ </child>
+ </object>
++ <packing>
++ <property name="position">1</property>
++ </packing>
+ </child>
+ </object>
+ <packing>
+@@ -242,7 +279,8 @@
+ <object class="GtkLabel" id="label48">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+- <property name="label" translatable="yes">Signal Strength</property>
++ <property name="label" translatable="yes"><b>Wireless</b></property>
++ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+@@ -254,9 +292,98 @@
+ </packing>
+ </child>
+ <child>
+- <object class="GtkAlignment" id="alignment3">
++ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+- <property name="left_padding">10</property>
++ <property name="n_rows">6</property>
++ <property name="n_columns">2</property>
++ <property name="column_spacing">12</property>
++ <property name="row_spacing">6</property>
++ <child>
++ <object class="GtkLabel" id="essid_value_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="selectable">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="bssid_value_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="selectable">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ <property name="top_attach">1</property>
++ <property name="bottom_attach">2</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="bssid_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="label" translatable="yes">Access Point (BSSID):</property>
++ <property name="justify">right</property>
++ </object>
++ <packing>
++ <property name="top_attach">1</property>
++ <property name="bottom_attach">2</property>
++ <property name="x_options">GTK_FILL</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="essid_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="label" translatable="yes">Network Name (ESSID):</property>
++ <property name="justify">right</property>
++ </object>
++ <packing>
++ <property name="x_options">GTK_FILL</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="label6">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="label" translatable="yes">Signal Strength:</property>
++ <property name="ellipsize">middle</property>
++ </object>
++ <packing>
++ <property name="top_attach">5</property>
++ <property name="bottom_attach">6</property>
++ <property name="x_options">GTK_FILL</property>
++ <property name="y_options">GTK_FILL</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="auth_mode_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="yalign">0.49000000953674316</property>
++ <property name="label" translatable="yes">Authentication Mode:</property>
++ </object>
++ <packing>
++ <property name="top_attach">4</property>
++ <property name="bottom_attach">5</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="security_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="label" translatable="yes">Security:</property>
++ </object>
++ <packing>
++ <property name="top_attach">3</property>
++ <property name="bottom_attach">4</property>
++ <property name="x_options">GTK_FILL</property>
++ </packing>
++ </child>
+ <child>
+ <object class="GtkHBox" id="hbox15">
+ <property name="visible">True</property>
+@@ -264,7 +391,6 @@
+ <child>
+ <object class="GtkProgressBar" id="signal_strength_bar">
+ <property name="visible">True</property>
+- <property name="pulse_step">0.10000000149</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+@@ -273,7 +399,7 @@
+ <child>
+ <object class="GtkLabel" id="signal_strength_label">
+ <property name="visible">True</property>
+- <property name="label">0%</property>
++ <property name="label" translatable="yes">0%</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+@@ -281,10 +407,67 @@
+ </packing>
+ </child>
+ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ <property name="top_attach">5</property>
++ <property name="bottom_attach">6</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="auth_mode_value_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="selectable">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ <property name="top_attach">4</property>
++ <property name="bottom_attach">5</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="security_value_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="selectable">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ <property name="top_attach">3</property>
++ <property name="bottom_attach">4</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="bss_mode_value_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="selectable">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="right_attach">2</property>
++ <property name="top_attach">2</property>
++ <property name="bottom_attach">3</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="bss_mode_label">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="label" translatable="yes">Operational Mode (BSS):</property>
++ <property name="justify">right</property>
++ </object>
++ <packing>
++ <property name="top_attach">2</property>
++ <property name="bottom_attach">3</property>
++ <property name="x_options">GTK_FILL</property>
++ </packing>
+ </child>
+ </object>
+ <packing>
+- <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+@@ -294,6 +477,20 @@
+ <property name="position">2</property>
+ </packing>
+ </child>
++ <child>
++ <object class="GtkCheckButton" id="configure_net_auto_cb">
++ <property name="label" translatable="yes">Configure network _automatically</property>
++ <property name="visible">True</property>
++ <property name="can_focus">True</property>
++ <property name="receives_default">False</property>
++ <property name="use_underline">True</property>
++ <property name="active">True</property>
++ <property name="draw_indicator">True</property>
++ </object>
++ <packing>
++ <property name="position">3</property>
++ </packing>
++ </child>
+ </object>
+ </child>
+ <child type="tab">
+@@ -330,9 +527,19 @@
+ </packing>
+ </child>
+ <child>
+- <object class="GtkAlignment" id="alignment4">
++ <object class="GtkHBox" id="hbox11">
+ <property name="visible">True</property>
+- <property name="left_padding">10</property>
++ <child>
++ <object class="GtkLabel" id="label45">
++ <property name="visible">True</property>
++ <property name="label" translatable="yes"> </property>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
+ <child>
+ <object class="GtkTable" id="inet4_table">
+ <property name="visible">True</property>
+@@ -453,6 +660,9 @@
+ </packing>
+ </child>
+ </object>
++ <packing>
++ <property name="position">1</property>
++ </packing>
+ </child>
+ </object>
+ <packing>
+@@ -484,9 +694,19 @@
+ </packing>
+ </child>
+ <child>
+- <object class="GtkAlignment" id="alignment6">
++ <object class="GtkHBox" id="hbox12">
+ <property name="visible">True</property>
+- <property name="left_padding">10</property>
++ <child>
++ <object class="GtkLabel" id="label46">
++ <property name="visible">True</property>
++ <property name="label" translatable="yes"> </property>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
+ <child>
+ <object class="GtkTable" id="table5">
+ <property name="visible">True</property>
+@@ -549,6 +769,9 @@
+ </packing>
+ </child>
+ </object>
++ <packing>
++ <property name="position">1</property>
++ </packing>
+ </child>
+ </object>
+ <packing>
+@@ -581,9 +804,19 @@
+ </packing>
+ </child>
+ <child>
+- <object class="GtkAlignment" id="alignment5">
++ <object class="GtkHBox" id="hbox13">
+ <property name="visible">True</property>
+- <property name="left_padding">10</property>
++ <child>
++ <object class="GtkLabel" id="label47">
++ <property name="visible">True</property>
++ <property name="label" translatable="yes"> </property>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
+ <child>
+ <object class="GtkTable" id="table6">
+ <property name="visible">True</property>
+@@ -646,6 +879,9 @@
+ </packing>
+ </child>
+ </object>
++ <packing>
++ <property name="position">1</property>
++ </packing>
+ </child>
+ </object>
+ <packing>
+@@ -673,6 +909,138 @@
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
++ <child>
++ <object class="GtkVBox" id="vbox3">
++ <property name="visible">True</property>
++ <property name="border_width">12</property>
++ <property name="spacing">18</property>
++ <child>
++ <object class="GtkVBox" id="vbox5">
++ <property name="visible">True</property>
++ <property name="spacing">6</property>
++ <child>
++ <object class="GtkLabel" id="label59">
++ <property name="visible">True</property>
++ <property name="xalign">0</property>
++ <property name="label" translatable="yes">You may need to restart ths connection if you want to connect to a different network, or if you are experiencing connection problems.</property>
++ <property name="wrap">True</property>
++ </object>
++ <packing>
++ <property name="position">0</property>
++ </packing>
++ </child>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkHBox" id="restart_hbox">
++ <property name="visible">True</property>
++ <child>
++ <object class="GtkLabel" id="label65">
++ <property name="visible">True</property>
++ </object>
++ <packing>
++ <property name="position">0</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkVBox" id="vbox6">
++ <property name="visible">True</property>
++ <child>
++ <object class="GtkButton" id="restart_button">
++ <property name="visible">True</property>
++ <property name="can_focus">True</property>
++ <property name="receives_default">False</property>
++ <child>
++ <object class="GtkAlignment" id="alignment3">
++ <property name="visible">True</property>
++ <property name="xscale">0</property>
++ <property name="yscale">0</property>
++ <child>
++ <object class="GtkHBox" id="hbox1">
++ <property name="visible">True</property>
++ <property name="spacing">2</property>
++ <child>
++ <object class="GtkImage" id="restart_button_image">
++ <property name="visible">True</property>
++ <property name="stock">gtk-refresh</property>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="restart_button_label">
++ <property name="visible">True</property>
++ <property name="label" translatable="yes">_Restart</property>
++ <property name="use_underline">True</property>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">1</property>
++ </packing>
++ </child>
++ </object>
++ </child>
++ </object>
++ </child>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">0</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="label70">
++ <property name="visible">True</property>
++ </object>
++ <packing>
++ <property name="position">1</property>
++ </packing>
++ </child>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">False</property>
++ <property name="position">1</property>
++ </packing>
++ </child>
++ </object>
++ <packing>
++ <property name="fill">False</property>
++ <property name="position">1</property>
++ </packing>
++ </child>
++ <child>
++ <object class="GtkLabel" id="label69">
++ <property name="visible">True</property>
++ </object>
++ <packing>
++ <property name="position">2</property>
++ </packing>
++ </child>
++ </object>
++ <packing>
++ <property name="position">2</property>
++ </packing>
++ </child>
++ <child type="tab">
++ <object class="GtkLabel" id="restart_tab_label">
++ <property name="visible">True</property>
++ <property name="label" translatable="yes">Restart</property>
++ </object>
++ <packing>
++ <property name="position">2</property>
++ <property name="tab_fill">False</property>
++ </packing>
++ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+--- gnome-netstatus-2.28.0.orig/src/netstatus-dialog.c 2009-09-25 11:46:34.295026904 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-dialog.c 2009-09-25 11:46:40.205639807 +0100
+@@ -1,6 +1,6 @@
+ /* vim: set sw=2 ts=2 sts=2 et: */
+ /*
+- * Copyright (C) 2003 Sun Microsystems, Inc.
++ * Copyright (C) 2003-2009 Sun Microsystems, Inc.
+ * Copyright (C) 2004 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+@@ -36,6 +36,27 @@
+ #define NETWORK_CONFIG_TOOL_DIR "/apps/netstatus_applet"
+ #define NETWORK_CONFIG_TOOL_KEY NETWORK_CONFIG_TOOL_DIR "/config_tool"
+
++static const gchar * IFRESTART_TAB_LABLE_NAME = "restart_tab_label";
++static const gchar * IFRESTART_TAB_BUTTON_NAME = "restart_button";
++static const gchar * IFRESTART_TAB_BUTTON_LABEL_NAME = "restart_button_label";
++static const gchar * IFRESTART_TAB_BUTTON_IMAGE_NAME = "restart_button_image";
++static const gchar * IFRESTART_TAB_HBOX_NAME = "restart_hbox";
++
++static const gchar * IFRESTART_TAB_BUTTON_LABEL_RESTART = "_Restart";
++static const gchar * IFRESTART_TAB_BUTTON_LABEL_STOP = "_Stop";
++
++static const gchar * IFRESTART_WINDOW_TITLE_FORMAT = "%s: %s";
++static const gchar * IFRESTART_WINDOW_TITLE = "Restartin Connection";
++
++static const gchar * IFRESTART_PROGRESS_FORMAT = "<b>%s</b>: <i>%s</i>";
++static const gchar * IFRESTART_PROGRESS = "Progress";
++static const gchar * IFRESTART_PROGRESS_BEGIN = "Click Restart to begin";
++static const gchar * IFRESTART_PROGRESS_RESTARTING = "Restarting...";
++static const gchar * IFRESTART_PROGRESS_COMPLETE = "Complete";
++static const gchar * IFRESTART_PROGRESS_FAILED = "Failed, click here for details";
++static const gchar * IFRESTART_WARNING = "Warning";
++static const gchar * IFRESTART_WARNING_NOLO = "Cannot restart this connection";
++
+ static const char *network_config_tools[] = {
+ "network-admin --configure %i",
+ "redhat-config-network",
+@@ -64,6 +85,11 @@
+ GtkWidget *signal_strength_frame;
+ GtkWidget *signal_strength_bar;
+ GtkWidget *signal_strength_label;
++ GtkWidget *essid_value_label;
++ GtkWidget *bssid_value_label;
++ GtkWidget *bss_mode_value_label;
++ GtkWidget *security_value_label;
++ GtkWidget *auth_mode_value_label;
+ GtkWidget *configure_button;
+
+ GtkWidget *inet4_frame;
+@@ -81,6 +107,15 @@
+ GtkWidget *dev_type;
+ GtkWidget *dev_addr;
+
++ GtkWidget *track_active_interface_cbox;
++ GtkWidget *configure_net_auto_cbox;
++ gboolean configured_for_auto;
++
++ GtkWidget *restart_button;
++ GtkWidget *restart_button_image;
++ GtkWidget *restart_button_label;
++ GtkWidget *restart_progress_expander;
++
+ guint iface_list_monitor;
+ int n_ifaces;
+ } NetstatusDialogData;
+@@ -184,6 +219,11 @@
+ {
+ int signal_strength;
+ char *str;
++ const char *essid;
++ const char *bssid;
++ const char *bss_mode;
++ const char *auth_mode;
++ const char *security;
+
+ gtk_widget_show (data->signal_strength_frame);
+
+@@ -195,6 +235,18 @@
+ str = g_strdup_printf ("%d%%\n", signal_strength);
+ gtk_label_set_text (GTK_LABEL (data->signal_strength_label), str);
+ g_free (str);
++
++ essid = netstatus_iface_get_essid (data->iface);
++ bssid = netstatus_iface_get_bssid (data->iface);
++ bss_mode = netstatus_iface_get_bss_mode (data->iface);
++ security = netstatus_iface_get_security (data->iface);
++ auth_mode = netstatus_iface_get_auth_mode (data->iface);
++
++ gtk_label_set_text (GTK_LABEL (data->essid_value_label), essid?essid:"" );
++ gtk_label_set_text (GTK_LABEL (data->bssid_value_label), bssid?bssid:"" );
++ gtk_label_set_text (GTK_LABEL (data->bss_mode_value_label), bss_mode?bss_mode:"" );
++ gtk_label_set_text (GTK_LABEL (data->auth_mode_value_label), auth_mode?auth_mode:"" );
++ gtk_label_set_text (GTK_LABEL (data->security_value_label), security?security:"" );
+ }
+ else
+ {
+@@ -313,6 +365,181 @@
+ }
+
+ static void
++netstatus_dialog_set_track_active_interface(NetstatusDialogData *data,
++ GtkToggleButton *toggle)
++{
++ gboolean track_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->track_active_interface_cbox));
++
++ netstatus_iface_set_track_active_interface (data->iface, track_active );
++}
++
++
++static void
++netstatus_dialog_update_track_active_interface (NetstatusDialogData *data)
++{
++ GtkWidget * widget;
++ gboolean track_active = FALSE;
++
++ if ( data->track_active_interface_cbox == NULL )
++ return;
++
++ track_active = netstatus_iface_get_track_active_interface( data->iface );
++
++ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->track_active_interface_cbox), track_active );
++
++ gtk_widget_set_sensitive(GTK_WIDGET(data->name), !track_active );
++
++}
++
++static void
++netstatus_dialog_update_configure_net_auto (NetstatusDialogData *data)
++{
++ GtkWidget * widget;
++ gboolean nwam_enabled = FALSE;
++
++ if ( data->configure_net_auto_cbox == NULL )
++ return;
++
++ nwam_enabled = netstatus_iface_network_config_is_nwam(data->iface );
++
++ data->configured_for_auto = nwam_enabled;
++
++ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->configure_net_auto_cbox), nwam_enabled );
++
++ gtk_widget_set_sensitive(GTK_WIDGET(data->configure_button), !nwam_enabled );
++
++ gtk_widget_set_sensitive(GTK_WIDGET(data->configure_net_auto_cbox), TRUE);
++}
++
++static gboolean
++netstatus_dialog_ask_question(NetstatusDialogData *data, const char* message, const char* question )
++{
++ GtkWidget *dialog;
++ gint result;
++ gboolean ret_val = FALSE;
++
++ dialog = gtk_message_dialog_new (GTK_WINDOW (data->dialog),
++ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
++ GTK_MESSAGE_QUESTION,
++ GTK_BUTTONS_YES_NO,
++ message );
++
++ if (question) {
++ gtk_message_dialog_format_secondary_text( dialog, question );
++ }
++
++ result = gtk_dialog_run (GTK_DIALOG (dialog));
++
++ switch (result) {
++ case GTK_RESPONSE_YES:
++ ret_val = TRUE;
++ break;
++ default:
++ break;
++ }
++
++ gtk_widget_destroy (dialog);
++
++ return( ret_val );
++}
++
++static void
++child_exit_cb(GPid pid, gint status, gpointer user_data)
++{
++ NetstatusDialogData *data = (NetstatusDialogData *)user_data;
++
++ netstatus_dialog_update_configure_net_auto(data);
++
++ g_spawn_close_pid( pid );
++}
++
++static void
++netstatus_dialog_switch_network_config_auto(NetstatusDialogData *data, gboolean automatic )
++{
++ static char* switch_to_auto_command[] = {"/usr/bin/network-admin", "--switch-to-auto", NULL };
++ static char* switch_to_manual_command[] = { "/usr/bin/network-admin", "--switch-to-manual", NULL };
++
++ char** command_line;
++ const char* message;;
++ const char* question;;
++
++ if ( automatic ) {
++ command_line = switch_to_auto_command;
++ /* SUN_BRANDING */
++ message = _("You have selected that the network be automatically configured.");
++ }
++ else {
++ command_line = switch_to_manual_command;
++ /* SUN_BRANDING */
++ message = _("You have selected to manually configure the network..");
++ }
++
++ /* SUN_BRANDING */
++ question = _("This will cause your network to be restarted\nDo you wish to continue?");
++ if ( netstatus_dialog_ask_question(data, message, question ) ) {
++ gint child_pid;
++
++ if ( gdk_spawn_on_screen( gdk_screen_get_default(),
++ NULL, command_line, NULL,
++ G_SPAWN_DO_NOT_REAP_CHILD,
++ NULL, NULL, &child_pid, NULL) ) {
++ g_child_watch_add( child_pid, child_exit_cb, data );
++
++ /* Set as insensitive until child exits */
++ gtk_widget_set_sensitive(GTK_WIDGET(data->configure_net_auto_cbox), FALSE);
++ }
++ else {
++ netstatus_dialog_update_configure_net_auto(data);
++ }
++ }
++ else {
++ netstatus_dialog_update_configure_net_auto(data);
++ }
++
++ return;
++}
++
++static void
++netstatus_dialog_update_restart_button (NetstatusDialogData *data)
++{
++ GtkWidget * widget;
++ gchar * string;
++ const char * ifname;
++
++ if (data->restart_button == NULL)
++ return;
++
++ /* Disable restart button for nothing and loopback interface */
++ ifname = netstatus_iface_get_name (data->iface);
++ if ((ifname != NULL) && (strcmp (ifname, "lo")))
++ {
++ gtk_widget_set_sensitive (data->restart_button, TRUE);
++
++ /* Set "Press button to restart" progress message */
++ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
++ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_BEGIN));
++ }
++ else
++ {
++ gtk_widget_set_sensitive (data->restart_button, FALSE);
++
++ /* Set "Cannot restart this connection" progress message */
++ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
++ _(IFRESTART_WARNING), _(IFRESTART_WARNING_NOLO));
++ }
++ gtk_expander_set_label (
++ GTK_EXPANDER (data->restart_progress_expander), string);
++ g_free (string);
++
++ /* Clean up the output of the last restart */
++ widget = gtk_bin_get_child (GTK_BIN (data->restart_progress_expander));
++ if (widget != NULL)
++ {
++ gtk_label_set_text (GTK_LABEL (widget), "");
++ }
++}
++
++static void
+ netstatus_dialog_iface_state_changed (NetstatusIface *iface,
+ GParamSpec *pspec,
+ NetstatusDialogData *data)
+@@ -339,12 +566,21 @@
+ }
+
+ static void
++netstatus_dialog_iface_track_active_interface_changed(NetstatusIface *iface,
++ GParamSpec *pspec,
++ NetstatusDialogData *data)
++{
++ netstatus_dialog_update_track_active_interface( data );
++}
++
++static void
+ netstatus_dialog_iface_name_changed (NetstatusIface *iface,
+ GParamSpec *pspec,
+ NetstatusDialogData *data)
+ {
+ netstatus_dialog_update_name (data);
+ netstatus_dialog_update_signal_strength (data);
++ netstatus_dialog_update_restart_button (data);
+ }
+
+ static void
+@@ -364,6 +600,136 @@
+ }
+
+ static void
++netstatus_dialog_restart_state_changed (
++ NetstatusIface *iface, NetstatusDialogData *data)
++{
++ GtkWidget * widget;
++ gchar * string;
++
++ g_return_if_fail (data != NULL);
++ g_return_if_fail (data->iface != NULL);
++
++ if (netstatus_iface_restart_inprogress (data->iface))
++ {
++ /* The restart is in progress */
++ const char * ifname;
++
++ /* Save the current network interface name */
++ ifname = netstatus_iface_get_name (data->iface);
++ g_return_if_fail (ifname != NULL);
++
++ /* Disable network interface change */
++ gtk_widget_set_sensitive (data->name, FALSE);
++
++ /* Set the restart button to Stop */
++ gtk_image_set_from_stock (GTK_IMAGE (data->restart_button_image),
++ GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON);
++ gtk_label_set_text_with_mnemonic (GTK_LABEL (data->restart_button_label),
++ _(IFRESTART_TAB_BUTTON_LABEL_STOP));
++
++ /* Set dialog window title */
++ string = g_strdup_printf (IFRESTART_WINDOW_TITLE_FORMAT,
++ _(IFRESTART_WINDOW_TITLE), ifname);
++ gtk_window_set_title (GTK_WINDOW (data->dialog), string);
++ g_free (string);
++
++ /* Set the progress message */
++ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
++ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_RESTARTING));
++ gtk_expander_set_label (
++ GTK_EXPANDER (data->restart_progress_expander), string);
++ g_free (string);
++
++ /* Clean up the output of the script */
++ widget = gtk_bin_get_child (GTK_BIN (data->restart_progress_expander));
++ if (widget != NULL)
++ {
++ gtk_label_set_text (GTK_LABEL (widget), "");
++ }
++ }
++ else
++ {
++ /* The restart is completed */
++ gint state;
++
++ /* Set the restart button to Restart */
++ gtk_image_set_from_stock (GTK_IMAGE (data->restart_button_image),
++ GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON);
++ gtk_label_set_text_with_mnemonic (GTK_LABEL (data->restart_button_label),
++ _(IFRESTART_TAB_BUTTON_LABEL_RESTART));
++
++ /* Enable network interface change */
++ gtk_widget_set_sensitive (data->name, TRUE);
++
++ /* Restore dialog window title */
++ netstatus_dialog_update_name (data);
++
++ /* Set the progress message */
++ state = netstatus_iface_restart_get_status (data->iface);
++ if (state == 0)
++ {
++ /* Restart has been completed successfully */
++ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
++ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_COMPLETE));
++ }
++ else if (state > 0)
++ {
++ /* Restart has failed */
++ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
++ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_FAILED));
++ }
++ else
++ {
++ /* No restart has been completed or started yet */
++ string = g_strdup_printf (IFRESTART_PROGRESS_FORMAT,
++ _(IFRESTART_PROGRESS), _(IFRESTART_PROGRESS_BEGIN));
++ }
++ gtk_expander_set_label (
++ GTK_EXPANDER (data->restart_progress_expander), string);
++ g_free (string);
++
++ /* Set the output of the script */
++ widget = gtk_bin_get_child (GTK_BIN (data->restart_progress_expander));
++ if (widget != NULL)
++ {
++ string = netstatus_iface_restart_get_output (data->iface);
++ switch (state)
++ {
++ case 9: /* canceled by "Stop" button */
++ case 3072: /* canceled by root password dialog */
++ string = _("Connection restart has been stopped.");
++ break;
++
++ case 19: /* there is no ifrestart script */
++ string = _("Cannot find ifrestart script.");
++ break;
++
++ default:
++ break;
++ }
++ gtk_label_set_text (GTK_LABEL (widget), string);
++ }
++ }
++}
++
++static void
++netstatus_dialog_restart (GtkWidget *button, NetstatusDialogData *data)
++{
++ g_return_if_fail (data != NULL);
++
++ if (netstatus_iface_restart_inprogress (data->iface))
++ {
++ /* Interrupt the network interface restart */
++ netstatus_iface_restart_interrupt (data->iface);
++ }
++ else
++ {
++ /* Spawn the network interface restart */
++ netstatus_iface_restart (data->iface);
++ }
++}
++
++static void
+ netstatus_dialog_response (GtkWidget *dialog,
+ int response)
+ {
+@@ -441,7 +807,11 @@
+ data->iface_list_monitor = 0;
+
+ if (data->iface)
+- g_object_unref (data->iface);
++ {
++ g_signal_handlers_disconnect_matched (
++ data->iface, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) data);
++ g_object_unref (data->iface);
++ }
+ data->iface = NULL;
+
+ g_free (data);
+@@ -603,6 +973,57 @@
+ }
+
+ static void
++netstatus_dialog_setup_track_active_interface (NetstatusDialogData *data,
++ GtkBuilder *builder)
++{
++ GtkWidget *cbox;
++
++ cbox = GTK_WIDGET (gtk_builder_get_object (builder, "track_active_interface"));
++
++ gtk_widget_show (cbox);
++
++ data->track_active_interface_cbox = cbox;
++
++ netstatus_dialog_update_track_active_interface(data);
++
++ g_signal_connect_swapped(GTK_TOGGLE_BUTTON (data->track_active_interface_cbox), "toggled",
++ G_CALLBACK (netstatus_dialog_set_track_active_interface),
++ data);
++
++}
++
++static void
++netstatus_dialog_set_configure_net_auto(NetstatusDialogData *data,
++ GtkToggleButton *toggle)
++{
++ gboolean configure_net_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->configure_net_auto_cbox));
++
++ if ( configure_net_auto != data->configured_for_auto ) {
++ netstatus_dialog_switch_network_config_auto(data, configure_net_auto );
++ }
++}
++
++static void
++netstatus_dialog_setup_configure_net_auto (NetstatusDialogData *data,
++ GtkBuilder *builder)
++{
++ GtkWidget *cbox;
++
++ cbox = GTK_WIDGET (gtk_builder_get_object (builder, "configure_net_auto_cb"));
++
++ gtk_widget_show (cbox);
++
++ data->configure_net_auto_cbox = cbox;
++
++ netstatus_dialog_update_configure_net_auto(data);
++
++ g_signal_connect_swapped(GTK_TOGGLE_BUTTON (data->configure_net_auto_cbox), "toggled",
++ G_CALLBACK (netstatus_dialog_set_configure_net_auto),
++ data);
++
++}
++
++static void
+ netstatus_dialog_setup_connection (NetstatusDialogData *data,
+ GtkBuilder *builder)
+ {
+@@ -652,6 +1073,11 @@
+ data->signal_strength_frame = GTK_WIDGET (gtk_builder_get_object (builder, "signal_strength_frame"));
+ data->signal_strength_bar = GTK_WIDGET (gtk_builder_get_object (builder, "signal_strength_bar"));
+ data->signal_strength_label = GTK_WIDGET (gtk_builder_get_object (builder, "signal_strength_label"));
++ data->essid_value_label = GTK_WIDGET (gtk_builder_get_object (builder, "essid_value_label"));
++ data->bssid_value_label = GTK_WIDGET (gtk_builder_get_object (builder, "bssid_value_label"));
++ data->bss_mode_value_label = GTK_WIDGET (gtk_builder_get_object (builder, "bss_mode_value_label"));
++ data->auth_mode_value_label = GTK_WIDGET (gtk_builder_get_object (builder, "auth_mode_value_label"));
++ data->security_value_label = GTK_WIDGET (gtk_builder_get_object (builder, "security_value_label"));
+
+ netstatus_dialog_update_signal_strength (data);
+ }
+@@ -717,9 +1143,98 @@
+ g_free (l->data);
+ g_list_free (iface_names);
+
++ /* Also check nwam status here */
++ if ( GTK_IS_WIDGET(data->dialog) ) {
++ if ( GTK_WIDGET_VISIBLE(data->dialog) ) {
++ netstatus_dialog_update_configure_net_auto(data);
++ }
++ }
++
+ return TRUE;
+ }
+
++static void
++netstatus_dialog_setup_restart_tab (NetstatusDialogData *data, GtkBuilder *builder)
++{
++ GtkWidget * widget;
++
++ g_return_if_fail (data != NULL);
++ g_return_if_fail (builder != NULL);
++
++ /* Network interface restart tab */
++ if (netstatus_iface_restart_available (data->iface))
++ {
++ /* Restart button */
++ data->restart_button = GTK_WIDGET (
++ gtk_builder_get_object (builder, IFRESTART_TAB_BUTTON_NAME));
++ if (data->restart_button != NULL)
++ {
++ /* Button image */
++ data->restart_button_image = GTK_WIDGET (
++ gtk_builder_get_object (builder, IFRESTART_TAB_BUTTON_IMAGE_NAME));
++ /* Button label */
++ data->restart_button_label = GTK_WIDGET (
++ gtk_builder_get_object (builder, IFRESTART_TAB_BUTTON_LABEL_NAME));
++ /* Clicked signal handler */
++ g_signal_connect (G_OBJECT (data->restart_button), "clicked",
++ G_CALLBACK (netstatus_dialog_restart), (gpointer) data);
++ }
++ /* Add progress expander */
++ widget = GTK_WIDGET (
++ gtk_builder_get_object (builder, IFRESTART_TAB_HBOX_NAME));
++ if (widget != NULL)
++ {
++ gtk_box_set_spacing (GTK_BOX (widget), 2);
++ data->restart_progress_expander = gtk_expander_new ("");
++ gtk_expander_set_use_markup (
++ GTK_EXPANDER (data->restart_progress_expander), TRUE);
++ gtk_box_pack_start (GTK_BOX (widget),
++ data->restart_progress_expander, FALSE, FALSE, 0);
++ gtk_box_reorder_child (GTK_BOX (widget),
++ data->restart_progress_expander, 0);
++ widget = gtk_label_new ("");
++ gtk_label_set_selectable (GTK_LABEL (widget), TRUE);
++ gtk_container_add (
++ GTK_CONTAINER (data->restart_progress_expander), widget);
++ gtk_widget_show_all (data->restart_progress_expander);
++ }
++
++ netstatus_dialog_restart_state_changed (data->iface, data);
++ netstatus_dialog_update_restart_button (data);
++
++ g_signal_connect (
++ data->iface, NETSTATUS_IFACE_SIGNAL_RESTART_STATE,
++ G_CALLBACK (netstatus_dialog_restart_state_changed), data);
++ }
++ else
++ {
++ GtkNotebook * notebook;
++ const gchar * name;
++ gint idx;
++
++ /* Remove the restart tab */
++ notebook = GTK_NOTEBOOK (
++ GTK_WIDGET (gtk_builder_get_object (builder, "notebook1")));
++ if (notebook != NULL)
++ {
++ for (idx = 0; idx < gtk_notebook_get_n_pages (notebook); idx++)
++ {
++ widget = gtk_notebook_get_nth_page (notebook, idx);
++ widget = gtk_notebook_get_tab_label (notebook, widget);
++ if (widget != NULL)
++ {
++ name = gtk_widget_get_name (widget);
++ if (!strcmp (name, IFRESTART_TAB_LABLE_NAME))
++ {
++ gtk_notebook_remove_page (notebook, idx);
++ break;
++ }
++ }
++ }
++ }
++ }
++}
++
+ GtkWidget *
+ netstatus_dialog_new (NetstatusIface *iface)
+ {
+@@ -743,7 +1258,7 @@
+ data->dialog = GTK_WIDGET (gtk_builder_get_object (builder, "network_status_dialog"));
+ g_object_set_data (G_OBJECT (data->dialog), "netstatus-dialog-data", data);
+
+- gtk_window_set_icon_name(GTK_WINDOW (data->dialog), "gnome-netstatus-tx");
++ gtk_window_set_icon_name(GTK_WINDOW (data->dialog), "network-transmit");
+
+ data->iface = g_object_ref (iface);
+ netstatus_connect_signal_while_alive (data->iface,
+@@ -771,11 +1286,23 @@
+ data->dialog);
+
+ netstatus_connect_signal_while_alive (data->iface,
++ "notify::connected",
++ G_CALLBACK (netstatus_dialog_iface_signal_strength_changed),
++ data,
++ data->dialog);
++
++ netstatus_connect_signal_while_alive (data->iface,
+ "notify::signal-strength",
+ G_CALLBACK (netstatus_dialog_iface_signal_strength_changed),
+ data,
+ data->dialog);
+
++ netstatus_connect_signal_while_alive (data->iface,
++ "notify::track-active-inteface",
++ G_CALLBACK (netstatus_dialog_iface_track_active_interface_changed),
++ data,
++ data->dialog);
++
+ g_signal_connect (data->dialog, "response",
+ G_CALLBACK (netstatus_dialog_response), NULL);
+
+@@ -783,11 +1310,14 @@
+ G_CALLBACK (netstatus_dialog_destroy), NULL);
+
+ netstatus_dialog_setup_connection (data, builder);
++ netstatus_dialog_setup_track_active_interface (data, builder);
+ netstatus_dialog_setup_activity (data, builder);
+ netstatus_dialog_setup_signal_strength_details (data, builder);
+ netstatus_dialog_setup_inet4_support (data, builder);
+ netstatus_dialog_setup_device_support (data, builder);
+ netstatus_dialog_setup_configure_button (data, builder);
++ netstatus_dialog_setup_configure_net_auto (data, builder);
++ netstatus_dialog_setup_restart_tab (data, builder);
+
+ data->iface_list_monitor = g_timeout_add (2 * 1000,
+ (GSourceFunc) netstatus_dialog_iface_list_monitor,
+--- gnome-netstatus-2.28.0.orig/src/netstatus-iface.c 2009-09-25 11:46:34.296354373 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-iface.c 2009-09-25 11:54:04.125414107 +0100
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2003 Sun Microsystems, Inc.
++ * Copyright (C) 2003-2009 Sun Microsystems, Inc.
+ * Copyright (C) 2004 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+@@ -47,6 +47,9 @@
+ #include <errno.h>
+ #include <unistd.h>
+ #include <string.h>
++#include <signal.h>
++
++#include <libscf.h>
+
+ #include "netstatus-sysdeps.h"
+ #include "netstatus-enums.h"
+@@ -55,6 +58,20 @@
+ #define NETSTATUS_IFACE_POLLS_IN_ERROR 10 /* no. of polls in error before increasing delay */
+ #define NETSTATUS_IFACE_ERROR_POLL_DELAY 5000 /* delay to use when in error state */
+
++#include <gconf/gconf-client.h>
++
++#define NWAM_AUTOMATIC_SELECTION_STRING ("Automatic Selection")
++#define NWAM_AUTOMATIC_ROOT_KEY "/apps/nwam-manager"
++#define NWAM_AUTOMATIC_ACTIVE_INTERFACE_KEY NWAM_AUTOMATIC_ROOT_KEY "/active_interface"
++
++#define NETSTATUS_IFACE_RESTART_SCRIPT_TESTFLAGS (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_SYMLINK | G_FILE_TEST_IS_EXECUTABLE)
++static const gchar * NETSTATUS_IFACE_RESTART_SCRIPT = "/usr/bin/ifrestart";
++
++static void gconf_notify_cb (GConfClient *client,
++ guint cnxn_id,
++ GConfEntry *entry,
++ gpointer user_data);
++
+ enum
+ {
+ PROP_0,
+@@ -63,23 +80,57 @@
+ PROP_STATS,
+ PROP_WIRELESS,
+ PROP_SIGNAL_STRENGTH,
++ PROP_ESSID,
++ PROP_BSSID,
++ PROP_BSS_MODE,
++ PROP_MODE,
++ PROP_CONNECTED,
++ PROP_SECURITY,
++ PROP_AUTH_MODE,
++ PROP_TRACK_ACTIVE_INTERFACE,
+ PROP_ERROR
+ };
+
++enum
++{
++ RESTART_STATE,
++ LAST_SIGNAL
++};
++
+ struct _NetstatusIfacePrivate
+ {
+ char *name;
+
+ NetstatusState state;
+ NetstatusStats stats;
+- int signal_strength;
+ GError *error;
+
++
++ gboolean connected;
++ char *essid;
++ char *bssid;
++ char *bss_mode;
++ char *mode;
++ char *security;
++ char *auth_mode;
++ int signal_strength;
++
+ int sockfd;
+ guint monitor_id;
+
+ guint error_polling : 1;
+ guint is_wireless : 1;
++ GConfClient *client;
++ gchar *active_interface;
++ guint gconf_notify_id;
++ gboolean track_active_interface;
++ gboolean configured_for_nwam;
++ gchar *restart_output;
++ GPid restart_pid;
++ gint restart_status;
++ GIOChannel *restart_outioc;
++ GIOChannel *restart_errioc;
++ guint restart_cwsource;
+ };
+
+ static void netstatus_iface_instance_init (NetstatusIface *iface,
+@@ -97,10 +148,12 @@
+ static gboolean netstatus_iface_monitor_timeout (NetstatusIface *iface);
+ static void netstatus_iface_init_monitor (NetstatusIface *iface);
+
+-
++static gboolean netstatus_iface_restart_collect_output (NetstatusIface *iface);
+
+ static GObjectClass *parent_class;
+
++static guint netstatus_iface_signals[LAST_SIGNAL] = { 0 };
++
+ GType
+ netstatus_iface_get_type (void)
+ {
+@@ -128,14 +181,101 @@
+ return type;
+ }
+
++static void gconf_notify_cb (GConfClient *client,
++ guint cnxn_id,
++ GConfEntry *entry,
++ gpointer user_data)
++{
++ NetstatusIface *iface = NETSTATUS_IFACE(user_data);
++ const char *key;
++ GConfValue *value;
++
++ key = gconf_entry_get_key (entry);
++ value = gconf_entry_get_value (entry);
++
++ if (g_ascii_strcasecmp (key, NWAM_AUTOMATIC_ACTIVE_INTERFACE_KEY) == 0) {
++ const char *new_iface = gconf_value_get_string (value);
++
++ if (iface->priv->active_interface != NULL ) {
++ g_free(iface->priv->active_interface);
++ }
++ iface->priv->active_interface = g_strdup(new_iface);
++
++ if ( iface->priv->track_active_interface ) {
++ if ( iface->priv->active_interface != NULL && strlen(iface->priv->active_interface)> 0 ) {
++ netstatus_iface_set_name( iface, iface->priv->active_interface );
++ }
++ else if ( !iface->priv->configured_for_nwam ) {
++ netstatus_iface_find_active_interface(iface);
++ }
++ }
++ }
++}
++
++gboolean
++netstatus_iface_network_config_is_nwam(NetstatusIface *iface )
++{
++ gboolean retval = FALSE;
++ gchar *output = NULL;
++
++ if ( (output = smf_get_state("svc:/network/physical:nwam")) != NULL ) {
++ char *stripped = g_strstrip(output);
++
++ /* Not in state disabled */
++ if ( stripped != NULL &&
++ strncmp( stripped, SCF_STATE_STRING_DISABLED, strlen(SCF_STATE_STRING_DISABLED) ) != 0 ) {
++ retval = TRUE;
++ }
++ g_free(output);
++ }
++
++ iface->priv->configured_for_nwam = retval;
++
++ return( retval );
++}
++
++static const char*
++netstatus_iface_get_nwam_active_interface(NetstatusIface *iface )
++{
++ return iface->priv->active_interface?iface->priv->active_interface:"";
++}
+
+ static void
+ netstatus_iface_instance_init (NetstatusIface *iface,
+ NetstatusIfaceClass *klass)
+ {
++ GError *err = NULL;
++
+ iface->priv = g_new0 (NetstatusIfacePrivate, 1);
+
+ iface->priv->state = NETSTATUS_STATE_DISCONNECTED;
++
++ iface->priv->restart_status = -1; /* never restarted */
++ iface->priv->restart_output = NULL;
++ iface->priv->restart_outioc = NULL;
++ iface->priv->restart_errioc = NULL;
++
++ iface->priv->track_active_interface = FALSE;
++
++ iface->priv->active_interface = NULL;
++
++ iface->priv->client = gconf_client_get_default ();
++
++ iface->priv->gconf_notify_id = gconf_client_notify_add (iface->priv->client,
++ NWAM_AUTOMATIC_ROOT_KEY,
++ gconf_notify_cb,
++ (gpointer) iface,
++ NULL,
++ NULL);
++
++ gconf_client_add_dir (iface->priv->client,
++ NWAM_AUTOMATIC_ROOT_KEY,
++ GCONF_CLIENT_PRELOAD_ONELEVEL,
++ NULL);
++
++ iface->priv->active_interface = gconf_client_get_string (iface->priv->client, NWAM_AUTOMATIC_ACTIVE_INTERFACE_KEY, &err);
++
++ (void)netstatus_iface_network_config_is_nwam( iface );
+ }
+
+ static void
+@@ -183,6 +323,86 @@
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class,
++ PROP_TRACK_ACTIVE_INTERFACE,
++ g_param_spec_boolean ("track_active_interface",
++ /* SUN_BRANDING */
++ _("Track Active Interface"),
++ /* SUN_BRANDING */
++ _("Whether to track the system's active interface"),
++ FALSE,
++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
++
++ g_object_class_install_property (gobject_class,
++ PROP_ESSID,
++ g_param_spec_string ("essid",
++ /* SUN_BRANDING */
++ _("ESSID"),
++ /* SUN_BRANDING */
++ _("Wireless ESSID"),
++ NULL,
++ G_PARAM_READABLE));
++
++ g_object_class_install_property (gobject_class,
++ PROP_BSSID,
++ g_param_spec_string ("bssid",
++ /* SUN_BRANDING */
++ _("BSSID"),
++ /* SUN_BRANDING */
++ _("Wireless BSSID"),
++ NULL,
++ G_PARAM_READABLE));
++
++ g_object_class_install_property (gobject_class,
++ PROP_BSS_MODE,
++ g_param_spec_string ("bss_mode",
++ /* SUN_BRANDING */
++ _("BSS_MODE"),
++ /* SUN_BRANDING */
++ _("Wireless BSS_Mode"),
++ NULL,
++ G_PARAM_READABLE));
++
++ g_object_class_install_property (gobject_class,
++ PROP_CONNECTED,
++ g_param_spec_boolean ("connected",
++ /* SUN_BRANDING */
++ _("Wireless CONNECTED"),
++ /* SUN_BRANDING */
++ _("Whether the interface is connected"),
++ FALSE,
++ G_PARAM_READABLE));
++
++ g_object_class_install_property (gobject_class,
++ PROP_MODE,
++ g_param_spec_string ("mode",
++ /* SUN_BRANDING */
++ _("MODE"),
++ /* SUN_BRANDING */
++ _("Wireless MODE"),
++ NULL,
++ G_PARAM_READABLE));
++
++ g_object_class_install_property (gobject_class,
++ PROP_SECURITY,
++ g_param_spec_string ("security",
++ /* SUN_BRANDING */
++ _("SECURITY"),
++ /* SUN_BRANDING */
++ _("Wireless SECURITY"),
++ NULL,
++ G_PARAM_READABLE));
++
++ g_object_class_install_property (gobject_class,
++ PROP_AUTH_MODE,
++ g_param_spec_string ("auth_mode",
++ /* SUN_BRANDING */
++ _("AUTH_MODE"),
++ /* SUN_BRANDING */
++ _("Wireless AUTH_MODE"),
++ NULL,
++ G_PARAM_READABLE));
++
++ g_object_class_install_property (gobject_class,
+ PROP_SIGNAL_STRENGTH,
+ g_param_spec_int ("signal-strength",
+ _("Signal"),
+@@ -199,6 +419,16 @@
+ _("The current error condition"),
+ NETSTATUS_TYPE_G_ERROR,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
++
++ netstatus_iface_signals[RESTART_STATE] = g_signal_new (
++ NETSTATUS_IFACE_SIGNAL_RESTART_STATE,
++ G_TYPE_FROM_CLASS (gobject_class),
++ G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
++ G_STRUCT_OFFSET (NetstatusIfaceClass, restart_complete),
++ NULL, /* accumulator */
++ NULL, /* accumulator data */
++ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
++
+ }
+
+ static void
+@@ -206,6 +436,10 @@
+ {
+ NetstatusIface *iface = (NetstatusIface *) object;
+
++ if (iface->priv->gconf_notify_id) {
++ gconf_client_notify_remove (iface->priv->client, iface->priv->gconf_notify_id);
++ }
++
+ if (iface->priv->error)
+ g_error_free (iface->priv->error);
+ iface->priv->error = NULL;
+@@ -221,6 +455,29 @@
+ g_free (iface->priv->name);
+ iface->priv->name = NULL;
+
++ g_free (iface->priv->essid);
++ iface->priv->essid = NULL;
++
++ g_free (iface->priv->bssid);
++ iface->priv->bssid = NULL;
++
++ g_free (iface->priv->bss_mode);
++ iface->priv->bss_mode = NULL;
++
++ g_free (iface->priv->mode);
++ iface->priv->mode = NULL;
++
++ g_free (iface->priv->security);
++ iface->priv->security = NULL;
++
++ g_free (iface->priv->auth_mode);
++ iface->priv->auth_mode = NULL;
++
++ netstatus_iface_restart_collect_output (iface);
++ if (iface->priv->restart_output != NULL)
++ g_free (iface->priv->restart_output);
++ iface->priv->restart_output = NULL;
++
+ g_free (iface->priv);
+ iface->priv = NULL;
+
+@@ -240,6 +497,9 @@
+ case PROP_NAME:
+ netstatus_iface_set_name (iface, g_value_get_string (value));
+ break;
++ case PROP_TRACK_ACTIVE_INTERFACE:
++ netstatus_iface_set_track_active_interface(iface, g_value_get_boolean (value));
++ break;
+ case PROP_ERROR:
+ netstatus_iface_set_error (iface, g_value_get_boxed (value));
+ break;
+@@ -271,9 +531,33 @@
+ case PROP_WIRELESS:
+ g_value_set_boolean (value, iface->priv->is_wireless);
+ break;
++ case PROP_TRACK_ACTIVE_INTERFACE:
++ g_value_set_boolean (value, iface->priv->track_active_interface);
++ break;
++ case PROP_ESSID:
++ g_value_set_string (value, iface->priv->essid);
++ break;
+ case PROP_SIGNAL_STRENGTH:
+ g_value_set_int (value, iface->priv->signal_strength);
+ break;
++ case PROP_BSSID:
++ g_value_set_string (value, iface->priv->bssid);
++ break;
++ case PROP_BSS_MODE:
++ g_value_set_string (value, iface->priv->bss_mode);
++ break;
++ case PROP_MODE:
++ g_value_set_string (value, iface->priv->mode);
++ break;
++ case PROP_CONNECTED:
++ g_value_set_boolean (value, iface->priv->connected);
++ break;
++ case PROP_SECURITY:
++ g_value_set_string (value, iface->priv->security);
++ break;
++ case PROP_AUTH_MODE:
++ g_value_set_string (value, iface->priv->auth_mode);
++ break;
+ case PROP_ERROR:
+ g_value_set_boxed (value, iface->priv->error);
+ default:
+@@ -349,6 +633,14 @@
+ return iface->priv->is_wireless;
+ }
+
++gboolean
++netstatus_iface_get_is_connected (NetstatusIface *iface)
++{
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
++
++ return iface->priv->connected;
++}
++
+ int
+ netstatus_iface_get_signal_strength (NetstatusIface *iface)
+ {
+@@ -357,6 +649,116 @@
+ return iface->priv->signal_strength;
+ }
+
++G_CONST_RETURN char *
++netstatus_iface_get_essid (NetstatusIface *iface)
++{
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
++
++ return iface->priv->essid;
++}
++
++G_CONST_RETURN char *
++netstatus_iface_get_bssid (NetstatusIface *iface)
++{
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
++
++ return iface->priv->bssid;
++}
++
++G_CONST_RETURN char *
++netstatus_iface_get_bss_mode (NetstatusIface *iface)
++{
++ const char* bss_mode = NULL;
++
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), bss_mode );
++
++ if ( iface->priv->bss_mode == NULL ) {
++ return( bss_mode );
++ }
++
++ if ( strcmp( iface->priv->bss_mode, "bss") == 0 ) {
++ /* SUN_BRANDING */
++ bss_mode = _("Infrastructure");
++ }
++ else
++ if ( strcmp( iface->priv->bss_mode, "ibss") == 0 ) {
++ /* SUN_BRANDING */
++ bss_mode = _("Computer-to-Computer (Ad Hoc)");
++ }
++ else if ( strcmp( iface->priv->bss_mode, "any") == 0 ) {
++ /* SUN_BRANDING */
++ bss_mode = _("Any");
++ }
++
++
++ return bss_mode;
++}
++
++G_CONST_RETURN char *
++netstatus_iface_get_mode (NetstatusIface *iface)
++{
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
++
++ return iface->priv->mode;
++}
++
++G_CONST_RETURN char *
++netstatus_iface_get_security (NetstatusIface *iface)
++{
++ const char* security = NULL;
++
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
++
++ if ( iface->priv->security == NULL ) {
++ return( security );
++ }
++
++ if ( strcmp( iface->priv->security, "none") == 0 ) {
++ /* SUN_BRANDING */
++ security = _("None");
++ }
++ else
++ if ( strcmp( iface->priv->security, "wep") == 0 ) {
++ security = "WEP";
++ }
++ else
++ if ( strcmp( iface->priv->security, "wpa") == 0 ) {
++ security = "WPA";
++ }
++ else {
++ security = iface->priv->security;
++ }
++
++ return security;
++}
++
++G_CONST_RETURN char *
++netstatus_iface_get_auth_mode (NetstatusIface *iface)
++{
++ const char* auth_mode = NULL;
++
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
++
++ if ( iface->priv->auth_mode == NULL ) {
++ return( auth_mode );
++ }
++
++ if ( strcmp( iface->priv->auth_mode, "open") == 0 ) {
++ /* SUN_BRANDING */
++ auth_mode = _("Open");
++ }
++ else
++ if ( strcmp( iface->priv->auth_mode, "shared") == 0 ) {
++ /* SUN_BRANDING */
++ auth_mode = _("Shared");
++ }
++ else {
++ auth_mode = iface->priv->auth_mode;
++ }
++
++ return auth_mode;
++}
++
+ void
+ netstatus_iface_set_error (NetstatusIface *iface,
+ const GError *error)
+@@ -553,14 +955,57 @@
+
+ static gboolean
+ netstatus_iface_poll_wireless_details (NetstatusIface *iface,
+- int *signal_strength)
++ int *signal_strength,
++ gboolean *connected,
++ char **essid,
++ char **bssid,
++ char **bss_mode,
++ char **mode,
++ char **security,
++ char **auth_mode )
+ {
+ char *error_message;
+ gboolean is_wireless;
++#if defined(__sun)
++ wifi_info_t* wi = netstatus_sysdeps_read_iface_wireless_details (iface->priv->name);
++
++ if ( wi != NULL ) {
++ is_wireless = TRUE;
++ if ( signal_strength )
++ *signal_strength = wi->signal_strength;
++
++ if ( connected )
++ *connected = wi->connected;
+
++ if ( essid ) {
++ *essid = g_strdup( wi->essid );
++ }
++ if ( bssid ) {
++ *bssid = g_strdup( wi->bssid );
++ }
++ if ( bss_mode ) {
++ *bss_mode = g_strdup( wi->bss_mode );
++ }
++ if ( mode ) {
++ *mode = g_strdup( wi->mode );
++ }
++ if ( security ) {
++ *security = g_strdup( wi->security );
++ }
++ if ( auth_mode ) {
++ *auth_mode = g_strdup( wi->auth_mode );
++ }
++ netstatus_wifi_info_free(wi);
++ }
++ else {
++ is_wireless = FALSE;
++ }
++#else
+ error_message = netstatus_sysdeps_read_iface_wireless_details (iface->priv->name,
+ &is_wireless,
+- signal_strength);
++ signal_strength,
++ essid,
++ max_essid_len );
+
+ if (error_message)
+ {
+@@ -574,6 +1019,7 @@
+
+ netstatus_iface_clear_error (iface, NETSTATUS_ERROR_WIRELESS_DETAILS);
+
++#endif
+ return is_wireless;
+ }
+
+@@ -611,12 +1057,21 @@
+ }
+ }
+
++#define MAX_ESSID_LEN 128
++
+ static gboolean
+ netstatus_iface_monitor_timeout (NetstatusIface *iface)
+ {
+ NetstatusState state;
+ int signal_strength;
+- gboolean is_wireless;
++ char *essid = NULL;
++ char *bssid = NULL;
++ char *bss_mode = NULL;
++ gboolean connected = FALSE;
++ char *mode = NULL;
++ char *security = NULL;
++ char *auth_mode = NULL;
++ gboolean is_wireless = NULL;
+
+ state = netstatus_iface_poll_state (iface);
+
+@@ -627,19 +1082,118 @@
+ g_object_notify (G_OBJECT (iface), "state");
+ }
+
+- is_wireless = netstatus_iface_poll_wireless_details (iface, &signal_strength);
++ if ( !iface->priv->configured_for_nwam &&
++ (state == NETSTATUS_STATE_DISCONNECTED || state == NETSTATUS_STATE_ERROR) ) {
++ /* Look for another interface it tracking active i/f */
++ netstatus_iface_find_active_interface (iface);
++ }
++
++ is_wireless = netstatus_iface_poll_wireless_details (iface, &signal_strength, &connected, &essid,
++ &bssid, &bss_mode, &mode, &security, &auth_mode );
+ if (iface->priv->is_wireless != is_wireless)
+ {
+ iface->priv->is_wireless = is_wireless;
+ g_object_notify (G_OBJECT (iface), "wireless");
+ }
+
+- if (iface->priv->signal_strength != signal_strength)
+- {
+- iface->priv->signal_strength = signal_strength;
+- g_object_notify (G_OBJECT (iface), "signal-strength");
++ if ( is_wireless ) {
++ if (iface->priv->connected != connected)
++ {
++ iface->priv->connected = connected;
++ g_object_notify (G_OBJECT (iface), "connected");
++ }
++
++ if (iface->priv->signal_strength != signal_strength)
++ {
++ iface->priv->signal_strength = signal_strength;
++ g_object_notify (G_OBJECT (iface), "signal-strength");
++ }
++
++ if (iface->priv->essid == NULL ||
++ ( essid != NULL && strcmp(iface->priv->essid, essid ) != 0 ) )
++ {
++ if ( iface->priv->essid != NULL )
++ g_free(iface->priv->essid);
++
++ iface->priv->essid = essid;
++
++ g_object_notify (G_OBJECT (iface), "essid");
++ }
++ else if ( essid ) {
++ g_free(essid);
++ }
++
++ if (iface->priv->bssid == NULL ||
++ ( bssid != NULL && strcmp(iface->priv->bssid, bssid ) != 0 ) )
++ {
++ if ( iface->priv->bssid != NULL )
++ g_free(iface->priv->bssid);
++
++ iface->priv->bssid = bssid;
++
++ g_object_notify (G_OBJECT (iface), "bssid");
++ }
++ else if ( bssid ) {
++ g_free(bssid);
+ }
+
++ if (iface->priv->bss_mode == NULL ||
++ ( bss_mode != NULL && strcmp(iface->priv->bss_mode, bss_mode ) != 0 ) )
++ {
++ if ( iface->priv->bss_mode != NULL )
++ g_free(iface->priv->bss_mode);
++
++ iface->priv->bss_mode = bss_mode;
++
++ g_object_notify (G_OBJECT (iface), "bss_mode");
++ }
++ else if ( bss_mode ) {
++ g_free(bss_mode);
++ }
++
++ if (iface->priv->mode == NULL ||
++ ( mode != NULL && strcmp(iface->priv->mode, mode ) != 0 ) )
++ {
++ if ( iface->priv->mode != NULL )
++ g_free(iface->priv->mode);
++
++ iface->priv->mode = mode;
++
++ g_object_notify (G_OBJECT (iface), "mode");
++ }
++ else if ( mode ) {
++ g_free(mode);
++ }
++
++ if (iface->priv->security == NULL ||
++ ( security != NULL && strcmp(iface->priv->security, security ) != 0 ) )
++ {
++ if ( iface->priv->security != NULL )
++ g_free(iface->priv->security);
++
++ iface->priv->security = security;
++
++ g_object_notify (G_OBJECT (iface), "security");
++ }
++ else if ( security ) {
++ g_free(security);
++ }
++
++ if (iface->priv->auth_mode == NULL ||
++ ( auth_mode != NULL && strcmp(iface->priv->auth_mode, auth_mode ) != 0 ) )
++ {
++ if ( iface->priv->auth_mode != NULL )
++ g_free(iface->priv->auth_mode);
++
++ iface->priv->auth_mode = auth_mode;
++
++ g_object_notify (G_OBJECT (iface), "auth_mode");
++ }
++ else if ( auth_mode ) {
++ g_free(auth_mode);
++ }
++ }
++
+ netstatus_iface_increase_poll_delay_in_error (iface);
+
+ return TRUE;
+@@ -653,12 +1207,20 @@
+ iface->priv->stats.in_bytes = 0;
+ iface->priv->stats.out_bytes = 0;
+ iface->priv->signal_strength = 0;
++ iface->priv->essid = NULL;
+ iface->priv->is_wireless = FALSE;
++ iface->priv->connected = FALSE;
++ iface->priv->bssid = NULL;
++ iface->priv->bss_mode = NULL;
++ iface->priv->mode = NULL;
++ iface->priv->security = NULL;
++ iface->priv->auth_mode = NULL;
+
+ g_object_freeze_notify (G_OBJECT (iface));
+ g_object_notify (G_OBJECT (iface), "state");
+ g_object_notify (G_OBJECT (iface), "wireless");
+ g_object_notify (G_OBJECT (iface), "signal-strength");
++ g_object_notify (G_OBJECT (iface), "essid");
+ g_object_thaw_notify (G_OBJECT (iface));
+
+ if (iface->priv->monitor_id)
+@@ -1192,6 +1754,7 @@
+
+ struct ifconf *if_conf;
+ GList *interfaces;
++ GList *point_to_points;
+ GList *loopbacks;
+ char *p;
+ int fd;
+@@ -1214,11 +1777,13 @@
+
+ interfaces = NULL;
+ loopbacks = NULL;
++ point_to_points = NULL;
+
+ for (p = if_conf->ifc_buf; p < if_conf->ifc_buf + if_conf->ifc_len;)
+ {
+ struct ifreq *if_req = (struct ifreq *) p;
+ gboolean loopback = FALSE;
++ gboolean p2p = FALSE;
+
+ p += sizeof (if_req->ifr_name) + NETSTATUS_SA_LEN (&if_req->ifr_addr);
+
+@@ -1233,16 +1798,21 @@
+ else
+ {
+ loopback = (if_req->ifr_flags & IFF_LOOPBACK);
++ p2p = (if_req->ifr_flags & IFF_POINTOPOINT);
+ }
+
+- if (!loopback)
+- interfaces = netstatus_list_insert_unique (interfaces,
++ if (loopback)
++ loopbacks = netstatus_list_insert_unique (loopbacks,
++ g_strdup (if_req->ifr_name));
++ else if (p2p)
++ point_to_points = netstatus_list_insert_unique (point_to_points,
+ g_strdup (if_req->ifr_name));
+ else
+- loopbacks = netstatus_list_insert_unique (loopbacks,
++ interfaces = netstatus_list_insert_unique (interfaces,
+ g_strdup (if_req->ifr_name));
+ }
+
++ interfaces = g_list_concat (interfaces, point_to_points );
+ interfaces = g_list_concat (interfaces, loopbacks);
+
+ g_free (if_conf->ifc_buf);
+@@ -1256,3 +1826,323 @@
+
+ return interfaces;
+ }
++
++
++/*
++ * Returns TRUE if the ifrestart script is installed.
++ */
++gboolean
++netstatus_iface_restart_available (NetstatusIface *iface)
++{
++ g_return_val_if_fail ((iface != NULL), FALSE);
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
++
++ return g_file_test (
++ NETSTATUS_IFACE_RESTART_SCRIPT, NETSTATUS_IFACE_RESTART_SCRIPT_TESTFLAGS);
++}
++
++/*
++ * Returns TRUE if the restart in progress.
++ */
++gboolean
++netstatus_iface_restart_inprogress (NetstatusIface *iface)
++{
++ g_return_val_if_fail ((iface != NULL), FALSE);
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
++ g_return_val_if_fail ((iface->priv != NULL), 0);
++
++ return (iface->priv->restart_status == -2);
++}
++
++/*
++ * Sets the interface restart status and emmits the signal.
++ */
++static void
++netstatus_iface_restart_set_status (
++ NetstatusIface *iface, gint status)
++{
++ g_return_if_fail (iface != NULL);
++ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
++ g_return_if_fail (iface->priv != NULL);
++
++ /* Restart process exit status */
++ iface->priv->restart_status = status;
++
++ /* Emit restart complete signal */
++ g_signal_emit (iface,
++ netstatus_iface_signals[RESTART_STATE], 0);
++}
++
++/*
++ * Collect output and release IOChannels.
++ * This method returns TRUE if the error output was empty.
++ */
++static gboolean
++netstatus_iface_restart_collect_output (NetstatusIface *iface)
++{
++ gchar * outstr = NULL;
++ gsize outsize = 0;
++ gchar * errstr = NULL;
++ gsize errsize = 0;
++ GError * error = NULL;
++
++ g_return_val_if_fail ((iface != NULL), FALSE);
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
++ g_return_val_if_fail ((iface->priv != NULL), FALSE);
++
++ /* Release stdout channel */
++ if (iface->priv->restart_outioc != NULL)
++ {
++ g_io_channel_read_to_end (iface->priv->restart_outioc,
++ &outstr, &outsize, &error);
++ g_io_channel_shutdown (iface->priv->restart_outioc, FALSE, &error);
++ g_io_channel_unref (iface->priv->restart_outioc);
++ iface->priv->restart_outioc = NULL;
++ }
++ /* Release stderr channel */
++ if (iface->priv->restart_errioc != NULL)
++ {
++ g_io_channel_read_to_end (iface->priv->restart_errioc,
++ &errstr, &errsize, &error);
++ g_io_channel_shutdown (iface->priv->restart_errioc, FALSE, &error);
++ g_io_channel_unref (iface->priv->restart_errioc);
++ iface->priv->restart_errioc = NULL;
++ }
++ /* Release the last interface restart output */
++ if (iface->priv->restart_output != NULL)
++ g_free (iface->priv->restart_output);
++ iface->priv->restart_output == NULL;
++ /* New restart output */
++ if (errsize != 0)
++ {
++ iface->priv->restart_output = g_strdup (errstr);
++ }
++ else if (outsize != 0)
++ {
++ iface->priv->restart_output = g_strdup (outstr);
++ }
++ if (outstr != NULL)
++ g_free (outstr);
++ if (errstr != NULL)
++ g_free (errstr);
++
++ return (errsize == 0);
++}
++
++/*
++ * Interface restart completition routine.
++ */
++static void
++netstatus_iface_restart_complete (
++ GPid pid, gint status, NetstatusIface *iface)
++{
++ g_return_if_fail (iface != NULL);
++ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
++ g_return_if_fail (iface->priv != NULL);
++
++ iface->priv->restart_cwsource = 0;
++
++ /* Release the output and error IOChannels */
++ if (netstatus_iface_restart_collect_output (iface))
++ {
++ netstatus_iface_restart_set_status (iface, status);
++ }
++ else
++ {
++ netstatus_iface_restart_set_status (iface, (status == 0)? 9999: status);
++ }
++}
++
++/*
++ * Initiates the restart for current interface and returns pid of
++ * the restart process. Returns 0 if the restart fails.
++ */
++GPid
++netstatus_iface_restart (NetstatusIface *iface)
++{
++ gchar * argv[3];
++ gint out_fd;
++ gint err_fd;
++ gboolean result;
++ GError * error = NULL;
++
++ g_return_val_if_fail ((iface != NULL), 0);
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
++ g_return_val_if_fail ((iface->priv != NULL), 0);
++ g_return_val_if_fail ((netstatus_iface_restart_inprogress (iface) == FALSE), 0);
++ g_return_val_if_fail ((netstatus_iface_get_name (iface) != NULL), 0);
++
++ /* Release the last interface restart output */
++ iface->priv->restart_outioc = NULL;
++ iface->priv->restart_errioc = NULL;
++ if (iface->priv->restart_output != NULL)
++ g_free (iface->priv->restart_output);
++ iface->priv->restart_output = NULL;
++ netstatus_iface_restart_set_status (iface, -2); /* is restarting */
++ argv[0] = g_strdup (NETSTATUS_IFACE_RESTART_SCRIPT);
++ argv[1] = g_strdup (netstatus_iface_get_name (iface));
++ argv[2] = NULL;
++ result = g_spawn_async_with_pipes (
++ NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
++ NULL, NULL,
++ &(iface->priv->restart_pid),
++ NULL, &(out_fd), &(err_fd),
++ &error);
++ g_free (argv[1]);
++ g_free (argv[0]);
++ if (result == FALSE)
++ {
++ /* Clean up on unsuccessful spawn */
++ netstatus_iface_restart_complete (0, G_SPAWN_ERROR_FAILED, iface);
++ return 0;
++ }
++
++ iface->priv->restart_outioc = g_io_channel_unix_new (out_fd);
++ iface->priv->restart_errioc = g_io_channel_unix_new (err_fd);
++ /* Set up the completition routine */
++ iface->priv->restart_cwsource = g_child_watch_add (iface->priv->restart_pid,
++ (GChildWatchFunc)netstatus_iface_restart_complete, iface);
++
++ return iface->priv->restart_pid;
++}
++
++/*
++ * Returns the process exit status of the last interface restart.
++ */
++gint
++netstatus_iface_restart_get_status (NetstatusIface *iface)
++{
++ g_return_val_if_fail ((iface != NULL), -1);
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), -1);
++ g_return_val_if_fail ((iface->priv != NULL), -1);
++
++ return iface->priv->restart_status;
++}
++
++/*
++ * Returns an output of the last interface restart.
++ */
++G_CONST_RETURN gchar *
++netstatus_iface_restart_get_output (NetstatusIface *iface)
++{
++ g_return_val_if_fail ((iface != NULL), "");
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), "");
++ g_return_val_if_fail ((iface->priv != NULL), "");
++
++ return (iface->priv->restart_output)? iface->priv->restart_output: "";
++}
++
++/*
++ * Interrupts the restart
++ */
++void
++netstatus_iface_restart_interrupt (NetstatusIface *iface)
++{
++ g_return_if_fail (iface != NULL);
++ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
++ g_return_if_fail (iface->priv != NULL);
++ g_return_if_fail (netstatus_iface_restart_inprogress (iface) == TRUE);
++
++ kill (iface->priv->restart_pid, SIGKILL);
++}
++
++gboolean
++netstatus_iface_get_track_active_interface (NetstatusIface *iface)
++{
++ gboolean track_active = FALSE;
++
++ g_return_val_if_fail (iface != NULL, track_active );
++ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), track_active );
++ g_return_val_if_fail (iface->priv != NULL, track_active );
++
++ track_active = iface->priv->track_active_interface;
++
++ return( track_active );
++}
++
++void
++netstatus_iface_set_track_active_interface (NetstatusIface *iface, gboolean track_active )
++{
++ g_return_if_fail (iface != NULL);
++ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
++ g_return_if_fail (iface->priv != NULL);
++
++ if ( iface->priv->track_active_interface != track_active ) {
++ iface->priv->track_active_interface = track_active;
++
++ if ( track_active ) {
++ if ( iface->priv->active_interface != NULL && strlen(iface->priv->active_interface)> 0 ) {
++ netstatus_iface_set_name( iface, iface->priv->active_interface );
++ }
++ else {
++ netstatus_iface_find_active_interface(iface);
++ }
++ }
++
++ g_object_notify (G_OBJECT (iface), "track_active_interface");
++ }
++}
++
++static void
++netstatus_iface_find_active_interface (NetstatusIface *iface )
++{
++ GError *error = NULL;
++ GList *iface_names;
++ gchar *iface_name = NULL;
++
++ g_return_if_fail (iface != NULL);
++ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
++ g_return_if_fail (iface->priv != NULL);
++
++ if (!iface->priv->track_active_interface)
++ return;
++
++ iface_names = netstatus_list_interface_names (&error);
++
++ if (iface_names)
++ {
++ GList *l;
++ gulong in_packets, out_packets;
++ gulong in_bytes, out_bytes;
++ char *error_message;
++ /*
++ * Find first non error interface.
++ */
++ for (l = iface_names; l; l = l->next) {
++ if ( l->data && strncmp(l->data, "lo", 2) &&
++ (error_message = netstatus_sysdeps_read_iface_statistics (l->data,
++ &in_packets, &out_packets, &in_bytes, &out_bytes)) == NULL ) {
++ gchar *old_name = iface->priv->name;
++
++ /* Temporarily set the name, but don't use set_name function
++ * since it would signal a notification which we don't want here.
++ */
++ iface->priv->name = l->data;
++ NetstatusState state = netstatus_iface_poll_state (iface);
++ iface->priv->name = old_name;
++
++ if ( state != NETSTATUS_STATE_DISCONNECTED &&
++ state != NETSTATUS_STATE_ERROR ) {
++ /* Success !! make this the iface_name */
++ iface_name = l->data;
++ break;
++ }
++ } else if (error_message != NULL ) {
++ g_free (error_message);
++ }
++ }
++
++ for (l = iface_names; l; l = l->next) {
++ /* Only free non used names */
++ if (iface_name == NULL || strcmp(l->data, iface_name)) {
++ g_free (l->data);
++ }
++ }
++ g_list_free (iface_names);
++
++ if ( iface_name ) {
++ netstatus_iface_set_name( iface, iface_name );
++ g_free( iface_name );
++ }
++ }
++}
+--- gnome-netstatus-2.28.0.orig/src/netstatus-iface.h 2009-09-25 11:46:34.295457025 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-iface.h 2009-09-25 11:46:40.208885640 +0100
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2003 Sun Microsystems, Inc.
++ * Copyright (C) 2003-2009 Sun Microsystems, Inc.
+ * Copyright (C) 2004 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+@@ -39,6 +39,8 @@
+ #define NETSTATUS_IS_IFACE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), NETSTATUS_TYPE_IFACE))
+ #define NETSTATUS_IFACE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NETSTATUS_TYPE_IFACE, NetstatusIfaceClass))
+
++#define NETSTATUS_IFACE_SIGNAL_RESTART_STATE "restart_state"
++
+ typedef struct _NetstatusIface NetstatusIface;
+ typedef struct _NetstatusIfaceClass NetstatusIfaceClass;
+ typedef struct _NetstatusIfacePrivate NetstatusIfacePrivate;
+@@ -53,6 +55,8 @@
+ struct _NetstatusIfaceClass
+ {
+ GObjectClass parent_class;
++
++ void (*restart_complete) (GObject *iface);
+ };
+
+ GList * netstatus_list_interface_names (GError **error);
+@@ -69,6 +73,13 @@
+ NetstatusStats *stats);
+ gboolean netstatus_iface_get_is_wireless (NetstatusIface *iface);
+ int netstatus_iface_get_signal_strength (NetstatusIface *iface);
++gboolean netstatus_iface_get_is_connected (NetstatusIface *iface);
++G_CONST_RETURN char * netstatus_iface_get_essid (NetstatusIface *iface);
++G_CONST_RETURN char * netstatus_iface_get_bssid (NetstatusIface *iface);
++G_CONST_RETURN char * netstatus_iface_get_bss_mode (NetstatusIface *iface);
++G_CONST_RETURN char * netstatus_iface_get_mode (NetstatusIface *iface);
++G_CONST_RETURN char * netstatus_iface_get_security (NetstatusIface *iface);
++G_CONST_RETURN char * netstatus_iface_get_auth_mode (NetstatusIface *iface);
+
+ void netstatus_iface_set_error (NetstatusIface *iface,
+ const GError *error);
+@@ -86,6 +97,18 @@
+ char **hw_addr);
+ gboolean netstatus_iface_get_is_loopback (NetstatusIface *iface);
+
++gboolean netstatus_iface_restart_available (NetstatusIface *iface);
++gboolean netstatus_iface_restart_inprogress (NetstatusIface *iface);
++GPid netstatus_iface_restart (NetstatusIface *iface);
++gint netstatus_iface_restart_get_status (NetstatusIface *iface);
++G_CONST_RETURN gchar * netstatus_iface_restart_get_output (NetstatusIface *iface);
++void netstatus_iface_restart_interrupt (NetstatusIface *iface);
++
++gboolean netstatus_iface_get_track_active_interface (NetstatusIface *iface);
++void netstatus_iface_set_track_active_interface (NetstatusIface *iface, gboolean track_active );
++void netstatus_iface_find_active_interface (NetstatusIface *iface );
++gboolean netstatus_iface_network_config_is_nwam(NetstatusIface *iface );
++
+ G_END_DECLS
+
+ #endif /* __NETSTATUS_IFACE_H__ */
+--- gnome-netstatus-2.28.0.orig/src/netstatus.schemas.in 2009-09-25 11:46:34.295222345 +0100
++++ gnome-netstatus-2.28.0/src/netstatus.schemas.in 2009-09-25 11:46:40.209120418 +0100
+@@ -12,6 +12,17 @@
+ </locale>
+ </schema>
+
++ <schema>
++ <key>/schemas/apps/netstatus_applet/prefs/track_active_interface</key>
++ <owner>netstatus-applet</owner>
++ <type>bool</type>
++ <default>false</default>
++ <locale name="C">
++ <short>Track active Network Interface</short>
++ <long>Have Network Monitor keep track of the active Network Interface</long>
++ </locale>
++ </schema>
++
+ <!-- Yes, this key is purposely global to all instances of the applet -->
+ <schema>
+ <key>/schemas/apps/netstatus_applet/config_tool</key>
+--- gnome-netstatus-2.28.0.orig/src/netstatus-applet.c 2009-09-25 11:46:34.295930633 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-applet.c 2009-09-25 12:07:05.866671745 +0100
+@@ -45,6 +45,7 @@
+
+ GConfClient *client;
+ guint notify_id;
++ guint track_active_interface_id;
+ };
+
+ static void netstatus_applet_instance_init (NetstatusApplet *applet,
+@@ -69,6 +70,7 @@
+ NetstatusApplet *applet);
+ static void netstatus_applet_display_status_dialog (NetstatusApplet *applet);
+ static void netstatus_applet_iface_name_changed (NetstatusApplet *applet);
++static void netstatus_applet_iface_track_active_changed(NetstatusApplet *applet);
+
+ static GObjectClass *parent_class;
+
+@@ -127,6 +129,10 @@
+ G_CALLBACK (netstatus_applet_iface_name_changed),
+ applet);
+
++ g_signal_connect_swapped (applet->priv->iface, "notify::track-active-interface",
++ G_CALLBACK (netstatus_applet_iface_track_active_changed),
++ applet);
++
+ g_signal_connect_swapped (applet->priv->icon, "invoked",
+ G_CALLBACK (netstatus_applet_display_status_dialog),
+ applet);
+@@ -168,6 +174,10 @@
+ gconf_client_notify_remove (applet->priv->client, applet->priv->notify_id);
+ applet->priv->notify_id = 0;
+
++ if (applet->priv->track_active_interface_id)
++ gconf_client_notify_remove (applet->priv->client, applet->priv->track_active_interface_id);
++ applet->priv->track_active_interface_id = 0;
++
+ if (applet->priv->client)
+ g_object_unref (applet->priv->client);
+ applet->priv->client = NULL;
+@@ -375,6 +385,19 @@
+ }
+
+ static void
++netstatus_applet_iface_track_active_changed(NetstatusApplet *applet)
++{
++ gboolean track_active;
++
++ track_active = netstatus_iface_get_track_active_interface (applet->priv->iface);
++ panel_applet_gconf_set_bool(PANEL_APPLET (applet),
++ "track_active_interface",
++ track_active,
++ NULL);
++
++}
++
++static void
+ netstatus_applet_iface_name_changed (NetstatusApplet *applet)
+ {
+ const char *iface_name;
+@@ -397,10 +420,29 @@
+ {
+ if (entry->value && entry->value->type == GCONF_VALUE_STRING)
+ {
++ gboolean track_active;
+ const char *iface_name;
+
+- iface_name = gconf_value_get_string (entry->value);
+- netstatus_iface_set_name (applet->priv->iface, iface_name);
++ track_active = netstatus_iface_get_track_active_interface(applet->priv->iface);
++ if ( !track_active ) {
++ iface_name = gconf_value_get_string (entry->value);
++ netstatus_iface_set_name (applet->priv->iface, iface_name);
++ }
++ }
++}
++
++static void
++netstatus_applet_iface_track_active_interface_changed (GConfClient *client,
++ guint cnxn_id,
++ GConfEntry *entry,
++ NetstatusApplet *applet)
++{
++ if (entry->value && entry->value->type == GCONF_VALUE_BOOL)
++ {
++ gboolean track_active;
++
++ track_active = gconf_value_get_bool(entry->value);
++ netstatus_iface_set_track_active_interface (applet->priv->iface, track_active);
+ }
+ }
+
+@@ -408,6 +450,7 @@
+ netstatus_applet_create (NetstatusApplet *applet,
+ const char *iid)
+ {
++ gboolean track_active = FALSE;
+ char *iface_name;
+ char *key;
+
+@@ -424,45 +467,53 @@
+ panel_applet_add_preferences (PANEL_APPLET (applet),
+ "/schemas/apps/netstatus_applet/prefs",
+ NULL);
+-
+- iface_name = panel_applet_gconf_get_string (PANEL_APPLET (applet),
+- "interface",
+- NULL);
+- if (!iface_name || !iface_name [0])
+- {
+- GError *error = NULL;
+- GList *iface_names;
+-
+- g_free (iface_name);
+- iface_name = NULL;
+-
+- iface_names = netstatus_list_interface_names (&error);
+- if (iface_names)
+- {
+- GList *l;
+-
+- /* FIXME: instead of picking the first one we should
+- * figure out what interfaces aren't currently
+- * displayed in an applet.
+- */
+- iface_name = iface_names->data;
+-
+- for (l = iface_names->next; l; l = l->next)
+- g_free (l->data);
+- g_list_free (iface_names);
+- }
+- else
+- {
+- g_assert (error != NULL);
+- g_object_set (G_OBJECT (applet->priv->iface),
+- "error", error,
+- NULL);
+- g_error_free (error);
+- }
+- }
+-
+- netstatus_iface_set_name (applet->priv->iface, iface_name);
+- g_free (iface_name);
++ track_active = panel_applet_gconf_get_bool (PANEL_APPLET (applet),
++ "track_active_interface",
++ NULL);
++
++ if ( track_active ) {
++ netstatus_iface_set_track_active_interface (applet->priv->iface, track_active );
++ }
++ else {
++ iface_name = panel_applet_gconf_get_string (PANEL_APPLET (applet),
++ "interface",
++ NULL);
++ if (!iface_name || !iface_name [0])
++ {
++ GError *error = NULL;
++ GList *iface_names;
++
++ g_free (iface_name);
++ iface_name = NULL;
++
++ iface_names = netstatus_list_interface_names (&error);
++ if (iface_names)
++ {
++ GList *l;
++
++ /* FIXME: instead of picking the first one we should
++ * figure out what interfaces aren't currently
++ * displayed in an applet.
++ */
++ iface_name = iface_names->data;
++
++ for (l = iface_names->next; l; l = l->next)
++ g_free (l->data);
++ g_list_free (iface_names);
++ }
++ else
++ {
++ g_assert (error != NULL);
++ g_object_set (G_OBJECT (applet->priv->iface),
++ "error", error,
++ NULL);
++ g_error_free (error);
++ }
++ }
++
++ netstatus_iface_set_name (applet->priv->iface, iface_name);
++ g_free (iface_name);
++ }
+
+ key = panel_applet_gconf_get_full_key (PANEL_APPLET (applet), "interface");
+ applet->priv->notify_id =
+@@ -474,6 +525,17 @@
+ NULL);
+ g_free (key);
+
++ key = panel_applet_gconf_get_full_key (PANEL_APPLET (applet), "track_active_interface");
++
++ applet->priv->track_active_interface_id =
++ gconf_client_notify_add (applet->priv->client,
++ key,
++ (GConfClientNotifyFunc) netstatus_applet_iface_track_active_interface_changed,
++ applet,
++ NULL,
++ NULL);
++ g_free (key);
++
+ return TRUE;
+ }
+
+--- gnome-netstatus-2.28.0.orig/icons/Makefile.am 2009-09-25 11:46:34.274343975 +0100
++++ gnome-netstatus-2.28.0/icons/Makefile.am 2009-09-25 11:46:40.210390602 +0100
+@@ -1,15 +1,4 @@
+-icondir = $(datadir)/icons/hicolor/48x48/apps
+-icon_DATA = \
+- gnome-netstatus-disconn.png \
+- gnome-netstatus-idle.png \
+- gnome-netstatus-rx.png \
+- gnome-netstatus-tx.png \
+- gnome-netstatus-txrx.png \
+- gnome-netstatus-error.png \
+- gnome-netstatus-0-24.png \
+- gnome-netstatus-25-49.png \
+- gnome-netstatus-50-74.png \
+- gnome-netstatus-75-100.png
++SUBDIRS= hicolor
+
+ gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+ install-data-hook: update-icon-cache
+@@ -23,4 +12,3 @@
+ echo "*** $(gtk_update_icon_cache)"; \
+ fi
+
+-EXTRA_DIST = $(icon_DATA)
+--- gnome-netstatus-2.28.0.orig/src/netstatus-icon.c 2009-09-25 11:46:34.295164389 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-icon.c 2009-09-25 11:46:40.211557569 +0100
+@@ -54,15 +54,21 @@
+ GdkPixbuf *icons [NETSTATUS_STATE_LAST];
+ GdkPixbuf *scaled_icons [NETSTATUS_STATE_LAST];
+
++ GdkPixbuf *wireless_icons [NETSTATUS_STATE_LAST];
++ GdkPixbuf *scaled_wireless_icons [NETSTATUS_STATE_LAST];
++
+ GdkPixbuf *signal_icons [NETSTATUS_SIGNAL_LAST];
+ GdkPixbuf *rotated_signal_icons [NETSTATUS_SIGNAL_LAST];
+ GdkPixbuf *scaled_signal_icons [NETSTATUS_SIGNAL_LAST];
+
++ GdkPixbuf *rendered_wireless_pixbufs[NETSTATUS_STATE_LAST][NETSTATUS_SIGNAL_LAST];
++
+ GtkOrientation orientation;
+ int size;
+
++ gulong query_tooltip_id;
++
+ gulong state_changed_id;
+- gulong name_changed_id;
+ gulong wireless_changed_id;
+ gulong signal_changed_id;
+
+@@ -119,23 +125,44 @@
+
+ for (i = 0; i < NETSTATUS_STATE_LAST; i++)
+ {
+- g_object_unref (icon->priv->scaled_icons [i]);
+- icon->priv->scaled_icons [i] = NULL;
++ if ( icon->priv->scaled_icons [i] != NULL ) {
++ g_object_unref (icon->priv->scaled_icons [i]);
++ icon->priv->scaled_icons [i] = NULL;
++ }
+
+ g_object_unref (icon->priv->icons [i]);
+ icon->priv->icons [i] = NULL;
++
++ g_object_unref (icon->priv->wireless_icons [i]);
++ icon->priv->wireless_icons [i] = NULL;
++
++ if ( icon->priv->scaled_wireless_icons [i] != NULL ) {
++ g_object_unref(icon->priv->scaled_wireless_icons [i]);
++ icon->priv->scaled_wireless_icons [i] = NULL;
++ }
+ }
+
+ for (i = 0; i < NETSTATUS_SIGNAL_LAST; i++)
+ {
+- g_object_unref (icon->priv->scaled_signal_icons [i]);
+- icon->priv->scaled_signal_icons [i] = NULL;
+-
+- g_object_unref (icon->priv->signal_icons [i]);
+- icon->priv->signal_icons [i] = NULL;
++ if ( icon->priv->scaled_signal_icons [i] != NULL ) {
++ g_object_unref (icon->priv->scaled_signal_icons [i]);
++ icon->priv->scaled_signal_icons [i] = NULL;
++ }
++
++ if ( icon->priv->signal_icons [i] != NULL ) {
++ g_object_unref (icon->priv->signal_icons [i]);
++ icon->priv->signal_icons [i] = NULL;
++ }
++ }
++
++ for (i = 0; i < NETSTATUS_STATE_LAST; i++) {
++ for (int j = 0; j < NETSTATUS_SIGNAL_LAST; j++) {
++ if ( icon->priv->rendered_wireless_pixbufs[i][j] != NULL ) {
++ g_object_unref(icon->priv->rendered_wireless_pixbufs[i][j]);
++ }
++ icon->priv->rendered_wireless_pixbufs[i][j] = NULL;
+ }
+-
+- netstatus_icon_init_pixbufs (icon);
++ }
+
+ if (icon->priv->size)
+ {
+@@ -153,6 +180,10 @@
+ screen = gtk_widget_get_screen (GTK_WIDGET (icon));
+ icon->priv->icon_theme = gtk_icon_theme_get_for_screen (screen);
+
++ gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
++ NETSTATUS_DATA_DIR G_DIR_SEPARATOR_S "icons");
++
++
+ g_signal_connect_object (icon->priv->icon_theme, "changed",
+ G_CALLBACK (netstatus_icon_theme_changed),
+ icon,
+@@ -286,32 +317,32 @@
+ {
+ netstatus_icon_init_pixbuf (icon,
+ &icon->priv->icons [NETSTATUS_STATE_DISCONNECTED],
+- "gnome-netstatus-disconn");
++ "network-offline");
+ icon->priv->scaled_icons [NETSTATUS_STATE_DISCONNECTED] = NULL;
+
+ netstatus_icon_init_pixbuf (icon,
+ &icon->priv->icons [NETSTATUS_STATE_IDLE],
+- "gnome-netstatus-idle");
++ "network-idle");
+ icon->priv->scaled_icons [NETSTATUS_STATE_IDLE] = NULL;
+
+ netstatus_icon_init_pixbuf (icon,
+ &icon->priv->icons [NETSTATUS_STATE_TX],
+- "gnome-netstatus-tx");
++ "network-transmit");
+ icon->priv->scaled_icons [NETSTATUS_STATE_TX] = NULL;
+
+ netstatus_icon_init_pixbuf (icon,
+ &icon->priv->icons [NETSTATUS_STATE_RX],
+- "gnome-netstatus-rx");
++ "network-receive");
+ icon->priv->scaled_icons [NETSTATUS_STATE_RX] = NULL;
+
+ netstatus_icon_init_pixbuf (icon,
+ &icon->priv->icons [NETSTATUS_STATE_TX_RX],
+- "gnome-netstatus-txrx");
++ "network-transmit-receive");
+ icon->priv->scaled_icons [NETSTATUS_STATE_TX_RX] = NULL;
+
+ netstatus_icon_init_pixbuf (icon,
+ &icon->priv->icons [NETSTATUS_STATE_ERROR],
+- "gnome-netstatus-error");
++ "network-error");
+ icon->priv->scaled_icons [NETSTATUS_STATE_ERROR] = NULL;
+
+ netstatus_icon_init_pixbuf (icon,
+@@ -338,6 +369,38 @@
+ icon->priv->rotated_signal_icons [NETSTATUS_SIGNAL_75_100] = NULL;
+ icon->priv->scaled_signal_icons [NETSTATUS_SIGNAL_75_100] = NULL;
+
++ /* Load rx, tx, error, disconnect icons for wireless */
++ netstatus_icon_init_pixbuf (icon,
++ &icon->priv->wireless_icons [NETSTATUS_STATE_TX],
++ "gnome-netstatus-wireless-transmit");
++ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_TX] = NULL;
++
++ netstatus_icon_init_pixbuf (icon,
++ &icon->priv->wireless_icons [NETSTATUS_STATE_RX],
++ "gnome-netstatus-wireless-receive");
++
++ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_RX] = NULL;
++
++ netstatus_icon_init_pixbuf (icon,
++ &icon->priv->wireless_icons [NETSTATUS_STATE_TX_RX],
++ "gnome-netstatus-wireless-transmit-receive");
++ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_TX_RX] = NULL;
++
++ netstatus_icon_init_pixbuf (icon,
++ &icon->priv->wireless_icons [NETSTATUS_STATE_DISCONNECTED],
++ "gnome-netstatus-wireless-offline");
++ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_DISCONNECTED] = NULL;
++
++ netstatus_icon_init_pixbuf (icon,
++ &icon->priv->wireless_icons [NETSTATUS_STATE_IDLE],
++ "gnome-netstatus-wireless-idle");
++ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_IDLE] = NULL;
++
++ netstatus_icon_init_pixbuf (icon,
++ &icon->priv->wireless_icons [NETSTATUS_STATE_ERROR],
++ "gnome-netstatus-wireless-error");
++ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_ERROR] = NULL;
++
+ netstatus_icon_rotate_signal_icons (icon, icon->priv->orientation);
+ }
+
+@@ -356,40 +419,129 @@
+ if (gtk_image_get_pixbuf (GTK_IMAGE (icon->priv->image)) != pixbuf)
+ gtk_image_set_from_pixbuf (GTK_IMAGE (icon->priv->image), pixbuf);
+
+- pixbuf = icon->priv->scaled_signal_icons [icon->priv->signal_strength];
+- if (!pixbuf)
+- pixbuf = icon->priv->rotated_signal_icons [icon->priv->signal_strength];
+-
+- if (gtk_image_get_pixbuf (GTK_IMAGE (icon->priv->signal_image)) != pixbuf)
+- gtk_image_set_from_pixbuf (GTK_IMAGE (icon->priv->signal_image), pixbuf);
++ if (netstatus_iface_get_is_wireless (icon->priv->iface)) {
++ /* Merge Signal + Status Pixmaps for wireless icon */
++ GdkPixbuf *wireless_state_pixbuf;
++
++ if ( icon->priv->rendered_wireless_pixbufs[icon->priv->state][icon->priv->signal_strength] == NULL ) {
++ /* Render for first time */
++ GdkPixbuf *rendered_pixbuf;
++ GdkPixbuf *state_pixbuf;
++ GdkPixbuf *signal_pixbuf;
++ gint back_width;
++ gint back_height;
++
++ state_pixbuf = icon->priv->scaled_wireless_icons [icon->priv->state];
++ if (!state_pixbuf)
++ state_pixbuf = icon->priv->wireless_icons [icon->priv->state];
++
++ signal_pixbuf = icon->priv->scaled_signal_icons [icon->priv->signal_strength];
++ if (!signal_pixbuf)
++ signal_pixbuf = icon->priv->rotated_signal_icons [icon->priv->signal_strength];
++
++ rendered_pixbuf = gdk_pixbuf_copy(signal_pixbuf);
++ back_width = gdk_pixbuf_get_width (rendered_pixbuf);
++ back_height = gdk_pixbuf_get_height (rendered_pixbuf);
++
++ gdk_pixbuf_composite (state_pixbuf,
++ rendered_pixbuf,
++ 0, 0,
++ back_width, back_height,
++ 0, 0,
++ 1.0, 1.0,
++ GDK_INTERP_NEAREST,
++ 255 );
++
++ icon->priv->rendered_wireless_pixbufs[icon->priv->state][icon->priv->signal_strength] = rendered_pixbuf;
++ }
++
++ /* TODO - Do we handle rotation?
++ pixbuf = icon->priv->scaled_signal_icons [icon->priv->signal_strength];
++ if (!pixbuf)
++ pixbuf = icon->priv->rotated_signal_icons [icon->priv->signal_strength];
++ */
++
++ pixbuf = icon->priv->rendered_wireless_pixbufs[icon->priv->state][icon->priv->signal_strength];
++ if (gtk_image_get_pixbuf (GTK_IMAGE (icon->priv->signal_image)) != pixbuf)
++ gtk_image_set_from_pixbuf (GTK_IMAGE (icon->priv->signal_image), pixbuf);
++ }
+ }
+
+-static void
+-netstatus_icon_name_changed (NetstatusIface *iface,
+- GParamSpec *pspec,
+- NetstatusIcon *icon)
+-{
+- const char *iface_name;
+- const char *tip;
+- char *freeme = NULL;
+-
+- iface_name = netstatus_iface_get_name (icon->priv->iface);
+- if (iface_name)
+- {
+- const char *state_string;
+-
+- state_string = netstatus_get_state_string (icon->priv->state);
+- freeme = g_strdup_printf (_("Network Connection: %s\n%s"), iface_name, state_string);
+- tip = freeme;
+- }
+- else
+- {
+- tip = _("Network Connection");
+- }
+-
+- gtk_widget_set_tooltip_text (GTK_WIDGET (icon), tip);
++static gboolean
++netstatus_icon_query_tooltip( NetstatusIcon *icon,
++ gint x,
++ gint y,
++ gboolean keyboard_mode,
++ GtkTooltip *tooltip,
++ gpointer user_data)
++{
++ const char *iface_name = NULL;
++ char *ipaddr = NULL;
++ GString *tooltip_markup = g_string_new("<tt>");
++ char *cstr;
++
++ if ( !icon->priv->tooltips_enabled )
++ return( FALSE );
++
++ if (icon->priv->iface != NULL ) {
++ if ( netstatus_iface_get_is_wireless (icon->priv->iface)) {
++ const char *iface_essid;
++ const char *iface_bss_mode;
++ gint signal_strength;
++
++ iface_essid = netstatus_iface_get_essid (icon->priv->iface);
++ iface_bss_mode = netstatus_iface_get_bss_mode (icon->priv->iface);
++ signal_strength = netstatus_iface_get_signal_strength (icon->priv->iface);
++
++ if ( iface_essid != NULL ) {
++ /* SUN_BRANDING */
++ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"),
++ /* SUN_BRANDING */
++ _("Wireless Network"), iface_essid );
++ g_string_append(tooltip_markup, "\n");
++ }
++
++ /* SUN_BRANDING */
++ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %d%%"),
++ /* SUN_BRANDING */
++ _("Signal Strength"), signal_strength );
++ g_string_append(tooltip_markup, "\n");
++
++ if ( iface_bss_mode != NULL ) {
++ /* SUN_BRANDING */
++ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"),
++ /* SUN_BRANDING */
++ _("Operational Mode"), iface_bss_mode );
++ g_string_append(tooltip_markup, "\n");
++ }
++ }
++
++ iface_name = netstatus_iface_get_name (icon->priv->iface);
++ netstatus_iface_get_inet4_details (icon->priv->iface, &ipaddr, NULL, NULL, NULL );
++
++ if ( ipaddr != NULL ) {
++ /* SUN_BRANDING */
++ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"),
++ /* SUN_BRANDING */
++ _("IP Address (v4)"), ipaddr );
++ g_string_append(tooltip_markup, "\n");
++ }
++
++ }
++ if ( iface_name != NULL ) {
++ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"), _("Network Connection"), iface_name );
++ }
++ else {
++ g_string_append_printf(tooltip_markup, _("Network Connection") );
++ }
++
++ g_string_append(tooltip_markup, "</tt>");
++ cstr = g_string_free(tooltip_markup, FALSE);
++ gtk_tooltip_set_markup( tooltip, cstr );
++ g_free(cstr);
+
+- g_free (freeme);
++ g_free(ipaddr);
++ return( TRUE );
+ }
+
+ static void
+@@ -408,7 +560,6 @@
+ icon->priv->state = state;
+
+ netstatus_icon_update_image (icon);
+- netstatus_icon_name_changed (icon->priv->iface, NULL, icon);
+ }
+ }
+
+@@ -417,10 +568,16 @@
+ GParamSpec *pspec,
+ NetstatusIcon *icon)
+ {
+- if (netstatus_iface_get_is_wireless (iface) && icon->priv->show_signal)
++ netstatus_icon_update_image (icon);
++
++ if (netstatus_iface_get_is_wireless (iface) && icon->priv->show_signal) {
++ gtk_widget_hide (icon->priv->image);
+ gtk_widget_show (icon->priv->signal_image);
+- else
++ }
++ else {
++ gtk_widget_show (icon->priv->image);
+ gtk_widget_hide (icon->priv->signal_image);
++ }
+ }
+
+ static void
+@@ -459,21 +616,23 @@
+ gtk_widget_destroy (icon->priv->error_dialog);
+ icon->priv->error_dialog = NULL;
+
++ if ( icon->priv->query_tooltip_id ) {
++ g_signal_handler_disconnect (icon,
++ icon->priv->query_tooltip_id);
++ }
++ icon->priv->query_tooltip_id = 0;
++
+ if (icon->priv->state_changed_id)
+ {
+ g_assert (icon->priv->iface != NULL);
+- g_assert (icon->priv->name_changed_id != 0);
+ g_signal_handler_disconnect (icon->priv->iface,
+ icon->priv->state_changed_id);
+ g_signal_handler_disconnect (icon->priv->iface,
+- icon->priv->name_changed_id);
+- g_signal_handler_disconnect (icon->priv->iface,
+ icon->priv->wireless_changed_id);
+ g_signal_handler_disconnect (icon->priv->iface,
+ icon->priv->signal_changed_id);
+ }
+ icon->priv->state_changed_id = 0;
+- icon->priv->name_changed_id = 0;
+ icon->priv->wireless_changed_id = 0;
+ icon->priv->signal_changed_id = 0;
+
+@@ -566,6 +725,16 @@
+ TRUE);
+ }
+
++ for (i = 0; i < NETSTATUS_STATE_LAST; i++)
++ {
++ if (icon->priv->scaled_wireless_icons [i])
++ g_object_unref (icon->priv->scaled_wireless_icons [i]);
++ icon->priv->scaled_wireless_icons [i] = scale_pixbuf (icon->priv->wireless_icons [i],
++ icon->priv->orientation,
++ size,
++ TRUE);
++ }
++
+ for (i = 0; i < NETSTATUS_SIGNAL_LAST; i++)
+ {
+ if (icon->priv->scaled_signal_icons [i])
+@@ -573,8 +742,18 @@
+ icon->priv->scaled_signal_icons [i] = scale_pixbuf (icon->priv->rotated_signal_icons [i],
+ icon->priv->orientation,
+ size,
+- FALSE);
++ TRUE);
+ }
++
++ /* Invalidate rendered icons */
++ for (i = 0; i < NETSTATUS_STATE_LAST; i++) {
++ for (int j = 0; j < NETSTATUS_SIGNAL_LAST; j++) {
++ if ( icon->priv->rendered_wireless_pixbufs[i][j] != NULL ) {
++ g_object_unref(icon->priv->rendered_wireless_pixbufs[i][j]);
++ }
++ icon->priv->rendered_wireless_pixbufs[i][j] = NULL;
++ }
++ }
+
+ netstatus_icon_update_image (icon);
+ }
+@@ -862,12 +1041,15 @@
+
+ icon->priv->image = gtk_image_new ();
+ gtk_container_add (GTK_CONTAINER (icon), icon->priv->image);
+- gtk_widget_show (icon->priv->image);
++ gtk_widget_hide (icon->priv->image);
+
+ icon->priv->signal_image = gtk_image_new ();
+ gtk_container_add (GTK_CONTAINER (icon), icon->priv->signal_image);
+ gtk_widget_hide (icon->priv->signal_image);
+
++ icon->priv->query_tooltip_id = g_signal_connect(icon, "query-tooltip",
++ G_CALLBACK (netstatus_icon_query_tooltip), NULL);
++
+ gtk_widget_add_events (GTK_WIDGET (icon),
+ GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
+ }
+@@ -971,12 +1153,9 @@
+ if (icon->priv->state_changed_id)
+ {
+ g_assert (icon->priv->iface != NULL);
+- g_assert (icon->priv->name_changed_id != 0);
+ g_signal_handler_disconnect (icon->priv->iface,
+ icon->priv->state_changed_id);
+ g_signal_handler_disconnect (icon->priv->iface,
+- icon->priv->name_changed_id);
+- g_signal_handler_disconnect (icon->priv->iface,
+ icon->priv->wireless_changed_id);
+ g_signal_handler_disconnect (icon->priv->iface,
+ icon->priv->signal_changed_id);
+@@ -991,15 +1170,12 @@
+
+ icon->priv->state_changed_id = g_signal_connect (icon->priv->iface, "notify::state",
+ G_CALLBACK (netstatus_icon_state_changed), icon);
+- icon->priv->name_changed_id = g_signal_connect (icon->priv->iface, "notify::name",
+- G_CALLBACK (netstatus_icon_name_changed), icon);
+ icon->priv->wireless_changed_id = g_signal_connect (icon->priv->iface, "notify::wireless",
+ G_CALLBACK (netstatus_icon_is_wireless_changed), icon);
+ icon->priv->signal_changed_id = g_signal_connect (icon->priv->iface, "notify::signal-strength",
+ G_CALLBACK (netstatus_icon_signal_changed), icon);
+
+ netstatus_icon_state_changed (icon->priv->iface, NULL, icon);
+- netstatus_icon_name_changed (icon->priv->iface, NULL, icon);
+ netstatus_icon_is_wireless_changed (icon->priv->iface, NULL, icon);
+ netstatus_icon_signal_changed (icon->priv->iface, NULL, icon);
+
+--- gnome-netstatus-2.28.0.orig/src/netstatus-sysdeps.h 2009-09-25 11:46:34.295394995 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-sysdeps.h 2009-09-25 11:46:40.212586971 +0100
+@@ -34,9 +34,36 @@
+ gulong *out_packets,
+ gulong *in_bytes,
+ gulong *out_bytes);
++#if defined (__sun)
++
++typedef struct {
++ char *essid;
++ gboolean connected;
++ char *bssid;
++ char *bss_mode;
++ int signal_strength;
++ char *mode;
++ char *security;
++ char *auth_mode;
++} wifi_info_t;
++
++wifi_info_t* netstatus_wifi_info_new( char *essid,
++ gboolean connected,
++ char *bssid,
++ char *bss_mode,
++ int signal_strength,
++ char *mode,
++ char *security,
++ char *auth_mode );
++
++void netstatus_wifi_info_free( wifi_info_t * wi );
++
++wifi_info_t *netstatus_sysdeps_read_iface_wireless_details (const char *iface);
++#else
+ char *netstatus_sysdeps_read_iface_wireless_details (const char *iface,
+ gboolean *is_wireless,
+ int *signal_strength);
++#endif
+
+ G_END_DECLS
+
+--- gnome-netstatus-2.28.0.orig/src/wifi_info.c 1970-01-01 01:00:00.000000000 +0100
++++ gnome-netstatus-2.28.0/src/wifi_info.c 2009-09-25 11:46:40.212927446 +0100
+@@ -0,0 +1,379 @@
++/*
++ * Simple test program, that takes a wireles device as an argument, and then
++ * tries to gather various configuration information from it.
++ */
++
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <stropts.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <inet/wifi_ioctl.h>
++#include <net/if_types.h>
++#include <net/if_dl.h> /*_link_ntoa*/
++
++#define TRUE (1)
++#define FALSE (0)
++
++#define DEV_PATH_PREFIX "/dev/"
++
++const int debug = 0;
++
++wldp_t *gbuf = NULL;
++
++int
++get_value( int fd, wldp_t *buf, int prop_id )
++{
++ int rc;
++ struct strioctl stri;
++
++ (void) memset(gbuf, 0, MAX_BUF_LEN);
++
++ gbuf->wldp_type = NET_802_11;
++ gbuf->wldp_id = prop_id;
++ gbuf->wldp_length = sizeof( wldp_t );
++ stri.ic_timout = 0;
++ stri.ic_dp = (char*)gbuf;
++ stri.ic_cmd = WLAN_GET_PARAM;
++ stri.ic_len = sizeof( wldp_t );
++
++ if ( (rc = ioctl( fd, I_STR, &stri )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_value( %d ): rc = %d\n", prop_id, rc);
++ return( -1 );
++ }
++ return( rc );
++}
++
++int
++is_connected( int fd )
++{
++ int rc;
++
++ if ( (rc = get_value( fd, gbuf, WL_LINKSTATUS )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "is_connected: rc = %d\n", rc);
++ return( -1 );
++ }
++
++ return((*(wl_linkstatus_t *)((gbuf)->wldp_buf) == WL_CONNECTED));
++}
++
++int
++is_wifi( int fd )
++{
++ return( (get_value(fd, gbuf, WL_BSS_TYPE ) < 0 )?FALSE:TRUE );
++}
++
++int
++get_signal_strength( int fd )
++{
++ int rc;
++
++ if ( (rc = get_value( fd, gbuf, WL_RSSI )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_signal_strength: rc = %d\n", rc);
++ return( -1 );
++ }
++
++ return( *(wl_rssi_t *)(gbuf->wldp_buf) ); // Get Signal Value
++}
++
++char*
++get_essid( int fd )
++{
++ char *str;
++ int rc;
++
++ str = calloc(256,sizeof(char));
++
++ if ( (rc = get_value( fd, gbuf, WL_ESSID )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_essid: rc = %d\n", rc);
++ return( str );
++ }
++
++ // Get ESSID Value
++ (void) strlcpy(str, ((wl_essid_t*)(gbuf->wldp_buf))->wl_essid_essid, 256);
++ return( str );
++}
++
++extern char *_link_ntoa(const unsigned char *, char *, int, int);
++
++char*
++get_bssid( int fd )
++{
++ char *str;
++ int rc;
++
++ str = calloc(256,sizeof(char));
++
++ if ( (rc = get_value( fd, gbuf, WL_BSSID )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_bssid: rc = %d\n", rc);
++ return( str );
++ }
++
++ // Get BSSID Value
++ _link_ntoa((const unsigned char*)gbuf->wldp_buf, str, 6, IFT_OTHER);
++
++ return( str );
++}
++
++const char*
++get_bss_mode( int fd )
++{
++ const char *str;
++ int rc;
++ wl_bss_type_t bsstype;
++
++ str = "";
++
++ if ( (rc = get_value( fd, gbuf, WL_BSS_TYPE )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_bss_mode: rc = %d\n", rc);
++ return( str );
++ }
++
++ // Get BSS Type Value
++ bsstype = *(wl_bss_type_t *)(gbuf->wldp_buf);
++
++ switch (bsstype) {
++ case WL_BSS_BSS:
++ str = "bss";
++ break;
++ case WL_BSS_IBSS:
++ str = "ibss";
++ break;
++ case WL_BSS_ANY:
++ str = "any";
++ break;
++ default:
++ break;
++ }
++
++ return( str );
++}
++
++const char*
++get_encryption( int fd )
++{
++ char *str = "none";
++ int rc;
++ wl_encryption_t encryption;
++
++ if ( (rc = get_value( fd, gbuf, WL_ENCRYPTION )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_encryption: rc = %d\n", rc);
++
++ return( str );
++ }
++
++ encryption = *(wl_encryption_t *)(gbuf->wldp_buf);
++
++ switch (encryption) {
++ case WL_ENC_WEP:
++ str = "wep";
++ break;
++ case WL_ENC_WPA:
++ str = "wpa";
++ break;
++ case WL_NOENCRYPTION:
++ /* fall-through */
++ default:
++ /* already default = none */
++ break;
++ }
++
++ return( str );
++}
++
++const char*
++get_auth_mode( int fd )
++{
++ char *str = "open";
++ int rc;
++ wl_authmode_t authmode;
++
++ if ( (rc = get_value( fd, gbuf, WL_AUTH_MODE )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_authmode: rc = %d\n", rc);
++
++ return( str );
++ }
++
++ authmode = *(wl_authmode_t *)(gbuf->wldp_buf);
++
++ switch (authmode) {
++ case WL_SHAREDKEY:
++ str = "shared";
++ break;
++ case WL_OPENSYSTEM:
++ /* fall-through */
++ default:
++ /* already default = open */
++ break;
++ }
++
++ return( str );
++}
++
++
++const char*
++get_mode( int fd )
++{
++ char *str = "";
++ int rc;
++ wl_phy_conf_t *phy_conf;
++
++ if ( (rc = get_value( fd, gbuf, WL_PHY_CONFIG )) != 0 ) {
++ if (debug)
++ fprintf(stderr, "get_mode: rc = %d\n", rc);
++
++ return( str );
++ }
++
++ phy_conf = (wl_phy_conf_t *)(gbuf->wldp_buf);
++
++ switch (phy_conf->wl_phy_fhss_conf.wl_fhss_subtype) {
++ case WL_ERP:
++ str = "g";
++ break;
++ case WL_OFDM:
++ str = "a";
++ break;
++ case WL_DSSS:
++ case WL_FHSS:
++ str = "b";
++ break;
++ default:
++ break;
++ }
++
++ return (str);
++}
++
++int
++handle_dev( const char* dev )
++{
++ char *devpath = NULL;
++ int fd = -1;
++ int iswifi = FALSE;
++ int isconnected = FALSE;
++ char *essid = NULL;
++ char *bssid = NULL;
++ const char *bss_mode = NULL;
++ const char *mode = NULL;
++ const char *auth_mode = NULL;
++ const char *encryption = NULL;
++ int signal = 0;
++ const char *dev_no_path = NULL;
++
++ if ( dev == NULL ) {
++ return( 1 );
++ }
++
++ if ( (dev_no_path = strchr(dev, '/')) == NULL ) {
++ /* Prefix with /dev/net/ */
++ int buflen = strlen(DEV_PATH_PREFIX) + strlen(dev) + 2;
++
++ devpath = malloc( buflen );
++ (void)snprintf(devpath, buflen, "%s%s", DEV_PATH_PREFIX, dev );
++
++ dev_no_path = dev; /* Pass back what was used as arg */
++ }
++ else {
++ devpath = strdup( dev );
++ dev_no_path++; /* Skip '/' */
++ }
++
++ if ( (fd = open( devpath, O_RDONLY )) < 0 ) {
++ if ( debug )
++ fprintf(stderr,"Unable to open dev %s\n", dev);
++ /* Output something so caller doesn't block waiting for response */
++ printf("%s;%d;%d;%s;%d;%s;%s;%s;%s\n",
++ dev_no_path,
++ iswifi?TRUE:FALSE,
++ isconnected?TRUE:FALSE,
++ essid?essid:"",
++ signal,
++ mode?mode:"",
++ bssid?bssid:"",
++ encryption?encryption:"",
++ auth_mode?auth_mode:""
++ );
++ fflush(stdout);
++ free(devpath);
++ return (1);
++ }
++
++ iswifi = is_wifi(fd);
++ isconnected = is_connected(fd);
++
++ if ( iswifi && isconnected ) {
++
++ essid = get_essid(fd);
++ bssid = get_bssid(fd);
++ bss_mode = get_bss_mode(fd);
++ mode = get_mode(fd);
++ auth_mode = get_auth_mode(fd);
++ encryption = get_encryption(fd);
++ signal = get_signal_strength(fd);
++
++ }
++
++ printf("%s;%d;%d;%s;%d;%s;%s;%s;%s;%s\n",
++ dev_no_path,
++ iswifi?TRUE:FALSE,
++ isconnected?TRUE:FALSE,
++ essid?essid:"",
++ signal,
++ mode?mode:"",
++ bssid?bssid:"",
++ bss_mode?bss_mode:"",
++ encryption?encryption:"",
++ auth_mode?auth_mode:""
++ );
++
++ fflush(stdout);
++
++ close(fd);
++
++ free(devpath);
++
++ if ( essid != NULL ) {
++ free(essid);
++ free(bssid);
++ }
++
++ return(0);
++}
++
++int
++main( int argc, char* argv[] )
++{
++ char stdin_buffer[MAXPATHLEN];
++
++ if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) {
++ return (1);
++ }
++
++
++ setbuf(stdin, NULL );
++
++ while ( fgets( stdin_buffer, MAXPATHLEN, stdin ) != NULL ) {
++ char *eol = strrchr( stdin_buffer, '\n' );
++ if ( eol != NULL )
++ *eol = '\0';
++
++ handle_dev( stdin_buffer );
++ }
++
++ free(gbuf);
++
++ return(0);
++}
+--- gnome-netstatus-2.28.0.orig/configure.in 2009-09-25 11:46:34.280990226 +0100
++++ gnome-netstatus-2.28.0/configure.in 2009-09-25 11:46:40.213217851 +0100
+@@ -49,6 +49,11 @@
+
+ AC_CHECK_HEADERS(sys/sockio.h)
+
++dnl *** checks for socket, nsl and scf libraries ***
++AC_CHECK_FUNC(socket,,[AC_CHECK_LIB(socket,socket)])
++AC_CHECK_FUNC(gethostbyname,,[AC_CHECK_LIB(nsl,gethostbyname)])
++AC_CHECK_FUNC(smf_get_state,,[AC_CHECK_LIB(scf,smf_get_state)])
++
+ # Blatantly stolen from configure.in in the sample code from
+ # "UNIX Network Programming, Volume 1" by W. Richard Stevens
+ AC_CACHE_CHECK(if sockaddr has sa_len member,
+@@ -100,6 +105,17 @@
+ po/Makefile.in
+ src/Makefile
+ icons/Makefile
++icons/hicolor/Makefile
++icons/hicolor/24x24/Makefile
++icons/hicolor/24x24/status/Makefile
++icons/hicolor/24x24/emblems/Makefile
++icons/hicolor/scalable/status/Makefile
++icons/hicolor/scalable/Makefile
++icons/hicolor/scalable/emblems/Makefile
++icons/hicolor/32x32/status/Makefile
++icons/hicolor/32x32/emblems/Makefile
++icons/hicolor/32x32/Makefile
++rbac/Makefile
+ help/Makefile
+ help/ja/Makefile
+ help/ko/Makefile
+--- gnome-netstatus-2.28.0.orig/Makefile.am 2009-09-25 11:46:34.281278169 +0100
++++ gnome-netstatus-2.28.0/Makefile.am 2009-09-25 11:46:40.213410469 +0100
+@@ -1,4 +1,4 @@
+-SUBDIRS = src icons help po packaging
++SUBDIRS = src icons help po packaging rbac
+
+ EXTRA_DIST = \
+ MAINTAINERS \
+--- gnome-netstatus-2.28.0.orig/src/Makefile.am 2009-09-25 11:46:34.296413697 +0100
++++ gnome-netstatus-2.28.0/src/Makefile.am 2009-09-25 11:46:40.213683924 +0100
+@@ -8,11 +8,14 @@
+ $(NETSTATUS_CFLAGS) \
+ $(NETSTATUS_DEBUG_CFLAGS) \
+ $(WARN_CFLAGS) \
+- -DNETSTATUS_ICONDIR=\""$(datadir)/icons/gnome-netstatus\"" \
++ -DNETSTATUS_DATA_DIR=\""$(pkgdatadir)\"" \
+ -DNETSTATUS_BUILDERDIR=\""$(builderdir)\"" \
+ -DGNOMELOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\"
+
+-libexec_PROGRAMS = gnome-netstatus-applet
++libexec_PROGRAMS = gnome-netstatus-applet gnome-netstatus-wifi-info
++
++gnome_netstatus_wifi_info_SOURCES = \
++ wifi_info.c
+
+ gnome_netstatus_applet_LDADD = $(NETSTATUS_LIBS) $(KSTAT_LIBS)
+
+--- gnome-netstatus-2.28.0.orig/rbac/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gnome-netstatus-2.28.0/rbac/Makefile.am 2009-09-25 11:46:40.213880587 +0100
+@@ -0,0 +1,7 @@
++rbacdir = $(sysconfdir)/security
++
++rbac_DATA = \
++ exec_attr \
++ prof_attr
++
++EXTRA_DIST = $(rbac_DATA)
+--- gnome-netstatus-2.28.0.orig/rbac/exec_attr 1970-01-01 01:00:00.000000000 +0100
++++ gnome-netstatus-2.28.0/rbac/exec_attr 2009-09-25 11:46:40.214063763 +0100
+@@ -0,0 +1,28 @@
++# CDDL HEADER START
++#
++# The contents of this file are subject to the terms of the
++# Common Development and Distribution License (the "License").
++# You may not use this file except in compliance with the License.
++#
++# You can obtain a copy of the license at src/sun_nws/OPENSOLARIS.LICENSE
++# or http://www.opensolaris.org/os/licensing.
++# See the License for the specific language governing permissions
++# and limitations under the License.
++#
++# When distributing Covered Code, include this CDDL HEADER in each
++# file and include the License file at src/sun_nws/OPENSOLARIS.LICENSE.
++# If applicable, add the following below this CDDL HEADER, with the
++# fields enclosed by brackets "[]" replaced with your own identifying
++# information: Portions Copyright [yyyy] [name of copyright owner]
++#
++# CDDL HEADER END
++#
++#
++# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
++# Use is subject to license terms.
++#
++#ident "@(#)exec_attr 1.2 06/09/15 SMI"
++#
++# execution attributes for profiles. see exec_attr(4)
++#
++Network Wifi Info:solaris:cmd:::/usr/lib/gnome-netstatus-wifi-info:privs=net_rawaccess,file_dac_read;limitprivs=net_rawaccess,file_dac_read,!proc_session,!proc_fork,!proc_exec,!proc_info,!file_link_any
+--- gnome-netstatus-2.28.0.orig/rbac/prof_attr 1970-01-01 01:00:00.000000000 +0100
++++ gnome-netstatus-2.28.0/rbac/prof_attr 2009-09-25 11:46:40.214239165 +0100
+@@ -0,0 +1,18 @@
++# CDDL HEADER START
++# The contents of this file are subject to the terms of the
++# Common Development and Distribution License (the "License").
++# You may not use this file except in compliance with the License.
++# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
++# or http://www.opensolaris.org/os/licensing.
++# See the License for the specific language governing permissions
++# and limitations under the License.
++# When distributing Covered Code, include this CDDL HEADER in each
++# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
++# If applicable, add the following below this CDDL HEADER, with the
++# fields enclosed by brackets "[]" replaced with your own identifying
++# information: Portions Copyright [yyyy] [name of copyright owner]
++# CDDL HEADER END
++# Copyright (c) 2007 by Sun Microsystems, Inc. All rights reserved.
++Console User:::Manage System as the Console User:profiles=Network Wifi Info;help=RtConsUser.html
++Network Wifi Info:::Obtain Wireless Information:
++Network Management:::Manage the host and network configuration:profiles=Network Wifi Info;help=RtNetMngmnt.html
+--- gnome-netstatus-2.28.0.orig/src/netstatus-sysdeps.c 2009-09-25 13:20:00.177042518 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-sysdeps.c 2009-09-25 13:25:09.054558210 +0100
+@@ -442,23 +442,178 @@
+ return NULL;
+ }
+
++typedef struct {
++ gboolean started;
++ GPid pid;
++ gint standard_input;
++ gint standard_output;
++ gint standard_error;
++ FILE* in;
++ FILE* out;
++ FILE* err;
++} child_info_t;
++
++static child_info_t child_info = { FALSE, 0, -1, -1, -1, NULL, NULL, NULL };
++
++static void
++child_watch_func( GPid pid, gint status, gpointer data)
++ {
++ child_info_t* info = (child_info_t*)data;
++
++ g_return_if_fail( info != NULL );
++
++ fclose( info->in );
++ fclose( info->out );
++ fclose( info->err );
++
++ memset( info, 0, sizeof( child_info_t ) );
++
++ info->started = FALSE;
++}
++
+ char *
+-netstatus_sysdeps_read_iface_wireless_details (const char *iface,
+- gboolean *is_wireless,
+- int *signal_strength)
++read_wireless_info( const char *iface ) {
++ static char *child_argv[] = {
++ "/usr/bin/pfexec",
++ "/usr/lib/gnome-netstatus-wifi-info",
++ NULL
++ };
++
++ if ( iface == NULL ) {
++ return ( NULL );
++ }
++
++ if ( ! child_info.started ) {
++ child_info.started = g_spawn_async_with_pipes( NULL, child_argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL,
++ NULL, &child_info.pid, &child_info.standard_input,
++ &child_info.standard_output, &child_info.standard_error, NULL);
++
++ if ( child_info.started ) {
++ g_child_watch_add(child_info.pid, child_watch_func, &child_info);
++ child_info.in = fdopen( child_info.standard_input, "w");
++ setbuf(child_info.in, NULL);
++ child_info.out = fdopen( child_info.standard_output, "r");
++ setbuf(child_info.out, NULL);
++ child_info.err = fdopen( child_info.standard_error, "r");
++ setbuf(child_info.err, NULL);
++ }
++ }
++
++ if ( child_info.started ) {
++ char buf[1024];
++ int n;
++
++ fprintf( child_info.in, "%s\n", iface );
++
++ if ( fgets( buf, 1024, child_info.out ) == NULL ) {
++ return(NULL);
++ }
++
++ return( g_strdup( buf ) );
++ }
++
++ return (NULL);
++}
++
++wifi_info_t*
++netstatus_wifi_info_new( char *essid,
++ gboolean connected,
++ char *bssid,
++ char *bss_mode,
++ int signal_strength,
++ char *mode,
++ char *security,
++ char *auth_mode )
+ {
+- g_return_val_if_fail (iface != NULL, NULL);
+- g_return_val_if_fail (is_wireless != NULL, NULL);
+- g_return_val_if_fail (signal_strength != NULL, NULL);
+-
+- if (is_wireless)
+- *is_wireless = FALSE;
+- if (signal_strength)
+- *signal_strength = 0;
+-
+- return NULL;
++ wifi_info_t* wi = g_new0( wifi_info_t, 1 );
++
++ wi->essid = g_strdup(essid?essid:"");
++ wi->connected = connected;
++ wi->bssid = g_strdup(bssid?bssid:"");
++ wi->bss_mode = g_strdup(bss_mode?bss_mode:"");
++ wi->signal_strength = signal_strength;
++ wi->mode = g_strdup(mode?mode:"");
++ wi->security = g_strdup(security?security:"");
++ wi->auth_mode = g_strdup(auth_mode?auth_mode:"");
++
++ return( wi );
++}
++
++void
++netstatus_wifi_info_free( wifi_info_t * wi )
++{
++ g_return_if_fail( wi != NULL );
++
++ if ( wi->essid )
++ g_free(wi->essid);
++ if ( wi->bssid )
++ g_free(wi->bssid);
++ if ( wi->bss_mode )
++ g_free(wi->bss_mode);
++ if ( wi->mode )
++ g_free(wi->mode);
++ if ( wi->security )
++ g_free(wi->security);
++ if ( wi->auth_mode )
++ g_free(wi->auth_mode);
++
++ g_free(wi);
+ }
+
++wifi_info_t *
++netstatus_sysdeps_read_iface_wireless_details (const char *iface)
++{
++ gchar* str = NULL;
++ wifi_info_t *wi = NULL;
++ gboolean is_wireless = FALSE;
++
++ g_return_val_if_fail (iface != NULL, NULL);
++
++ if ( (str = read_wireless_info( iface )) == NULL ) {
++ /* Not wireless, return NULL */
++ return NULL;
++ }
++ else {
++ gchar** fields = g_strsplit_set( g_strchomp(str), ";", 10 );
++
++ is_wireless = (fields[1] != NULL && fields[1][0] == '1')?TRUE:FALSE;
++
++ if ( is_wireless ) {
++ gboolean connected = (fields[2] != NULL && fields[2][0] == '1')?TRUE:FALSE;
++ char *essid = fields[3];
++ int signal_strength = (fields[4] != NULL)?atoi(fields[4]):0;
++ char *mode = fields[5];
++ char *bssid = fields[6];
++ char *bss_mode = fields[7];
++ char *security = fields[8];
++ char *auth_mode = fields[9];
++
++ /* Using the Linux code above, log() will provide a smoother
++ * transition between signal strengths than simple division */
++ /* *signal_strength = ((*signal_strength * 100) / 15 ); */
++ signal_strength = (int) rint ((log (signal_strength) / log (15)) * 100.0);
++ signal_strength = CLAMP( signal_strength, 0, 100);
++
++ wi = netstatus_wifi_info_new( essid,
++ connected,
++ bssid,
++ bss_mode,
++ signal_strength,
++ mode,
++ security,
++ auth_mode );
++
++ }
++
++ if ( fields != NULL )
++ g_strfreev(fields);
++
++ g_free( str );
++ }
++
++ return wi;
++ }
++
+ #else /* defined(__FreeBSD__) */
+
+ static inline void
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/gnome-netstatus-03-default-interface.diff Fri Sep 25 15:46:38 2009 +0000
@@ -0,0 +1,54 @@
+--- gnome-netstatus-2.28.0.orig/src/netstatus-applet.c 2009-09-25 13:29:53.358922003 +0100
++++ gnome-netstatus-2.28.0/src/netstatus-applet.c 2009-09-25 13:34:49.693188336 +0100
+@@ -32,6 +32,7 @@
+
+ #include "netstatus-icon.h"
+ #include "netstatus-iface.h"
++#include "netstatus-sysdeps.h"
+ #include "netstatus-dialog.h"
+
+ struct _NetstatusAppletPrivate
+@@ -481,6 +482,9 @@
+ {
+ GError *error = NULL;
+ GList *iface_names;
++ gulong in_packets, out_packets;
++ gulong in_bytes, out_bytes;
++ char *error_message;
+
+ g_free (iface_name);
+ iface_name = NULL;
+@@ -494,10 +498,29 @@
+ * figure out what interfaces aren't currently
+ * displayed in an applet.
+ */
+- iface_name = iface_names->data;
+-
+- for (l = iface_names->next; l; l = l->next)
+- g_free (l->data);
++ /* Process list of interfaces, and instead of showing first one,
++ * Show first non error interface.
++ */
++ for (l = iface_names; l; l = l->next) {
++ if ((error_message = netstatus_sysdeps_read_iface_statistics (l->data,
++ &in_packets, &out_packets, &in_bytes, &out_bytes)) == NULL) {
++ /* Success !! make this the iface_name */
++ iface_name = l->data;
++ break;
++ } else {
++ g_free (error_message);
++ }
++ }
++
++ if (!iface_name || !iface_name [0])
++ iface_name = iface_names->data;
++
++ for (l = iface_names; l; l = l->next) {
++ /* Only free non used names */
++ if (strcmp(l->data, iface_name)) {
++ g_free (l->data);
++ }
++ }
+ g_list_free (iface_names);
+ }
+ else
--- a/patches/gnome-netstatus-04-default-interface.diff Fri Sep 25 10:14:23 2009 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
---- gnome-netstatus-2.26.0/src/netstatus-applet.c.orig 2009-03-08 05:25:52.000000000 +0000
-+++ gnome-netstatus-2.26.0/src/netstatus-applet.c 2009-03-18 10:17:17.173596247 +0000
-@@ -32,6 +32,7 @@
-
- #include "netstatus-icon.h"
- #include "netstatus-iface.h"
-+#include "netstatus-sysdeps.h"
- #include "netstatus-dialog.h"
-
- struct _NetstatusAppletPrivate
-@@ -440,15 +441,37 @@ netstatus_applet_create (NetstatusApplet
- if (iface_names)
- {
- GList *l;
-+ gulong in_packets, out_packets;
-+ gulong in_bytes, out_bytes;
-+ char *error_message;
-
- /* FIXME: instead of picking the first one we should
- * figure out what interfaces aren't currently
- * displayed in an applet.
- */
-- iface_name = iface_names->data;
--
-- for (l = iface_names->next; l; l = l->next)
-- g_free (l->data);
-+ /* Process list of interfaces, and instead of showing first one,
-+ * Show first non error interface.
-+ */
-+ for (l = iface_names; l; l = l->next) {
-+ if ((error_message = netstatus_sysdeps_read_iface_statistics (l->data,
-+ &in_packets, &out_packets, &in_bytes, &out_bytes)) == NULL) {
-+ /* Success !! make this the iface_name */
-+ iface_name = l->data;
-+ break;
-+ } else {
-+ g_free (error_message);
-+ }
-+ }
-+
-+ if (!iface_name || !iface_name [0])
-+ iface_name = iface_names->data;
-+
-+ for (l = iface_names; l; l = l->next) {
-+ /* Only free non used names */
-+ if (strcmp(l->data, iface_name)) {
-+ g_free (l->data);
-+ }
-+ }
- g_list_free (iface_names);
- }
- else
-
-
--- a/patches/gnome-netstatus-05-wifi-info.diff Fri Sep 25 10:14:23 2009 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5499 +0,0 @@
-diff -up gnome-netstatus-2.12.1/src/netstatus.schemas.in.orig gnome-netstatus-2.12.1/src/netstatus.schemas.in
---- gnome-netstatus-2.12.1/src/netstatus.schemas.in.orig 2007-02-13 09:39:19.000000000 +0000
-+++ gnome-netstatus-2.12.1/src/netstatus.schemas.in 2008-08-28 07:38:49.844136328 +0100
-@@ -12,6 +12,17 @@
- </locale>
- </schema>
-
-+ <schema>
-+ <key>/schemas/apps/netstatus_applet/prefs/track_active_interface</key>
-+ <owner>netstatus-applet</owner>
-+ <type>bool</type>
-+ <default>false</default>
-+ <locale name="C">
-+ <short>Track active Network Interface</short>
-+ <long>Have Network Monitor keep track of the active Network Interface</long>
-+ </locale>
-+ </schema>
-+
- <!-- Yes, this key is purposely global to all instances of the applet -->
- <schema>
- <key>/schemas/apps/netstatus_applet/config_tool</key>
-
-
-diff -up gnome-netstatus-2.26.0/src/netstatus-applet.c.orig gnome-netstatus-2.26.0/src/netstatus-applet.c
---- gnome-netstatus-2.26.0/src/netstatus-applet.c.orig 2009-03-18 10:39:57.140021138 +0000
-+++ gnome-netstatus-2.26.0/src/netstatus-applet.c 2009-03-18 10:39:57.146340723 +0000
-@@ -46,6 +46,7 @@ struct _NetstatusAppletPrivate
-
- GConfClient *client;
- guint notify_id;
-+ guint track_active_interface_id;
- };
-
- static void netstatus_applet_instance_init (NetstatusApplet *applet,
-@@ -70,6 +71,7 @@ static void netstatus_applet_display
- NetstatusApplet *applet);
- static void netstatus_applet_display_status_dialog (NetstatusApplet *applet);
- static void netstatus_applet_iface_name_changed (NetstatusApplet *applet);
-+static void netstatus_applet_iface_track_active_changed(NetstatusApplet *applet);
-
- static GObjectClass *parent_class;
-
-@@ -128,6 +130,10 @@ netstatus_applet_instance_init (Netstatu
- G_CALLBACK (netstatus_applet_iface_name_changed),
- applet);
-
-+ g_signal_connect_swapped (applet->priv->iface, "notify::track-active-interface",
-+ G_CALLBACK (netstatus_applet_iface_track_active_changed),
-+ applet);
-+
- g_signal_connect_swapped (applet->priv->icon, "invoked",
- G_CALLBACK (netstatus_applet_display_status_dialog),
- applet);
-@@ -169,6 +175,10 @@ netstatus_applet_finalize (GObject *obje
- gconf_client_notify_remove (applet->priv->client, applet->priv->notify_id);
- applet->priv->notify_id = 0;
-
-+ if (applet->priv->track_active_interface_id)
-+ gconf_client_notify_remove (applet->priv->client, applet->priv->track_active_interface_id);
-+ applet->priv->track_active_interface_id = 0;
-+
- if (applet->priv->client)
- g_object_unref (applet->priv->client);
- applet->priv->client = NULL;
-@@ -376,6 +386,19 @@ netstatus_applet_orientation_changed (Ne
- }
-
- static void
-+netstatus_applet_iface_track_active_changed(NetstatusApplet *applet)
-+{
-+ gboolean track_active;
-+
-+ track_active = netstatus_iface_get_track_active_interface (applet->priv->iface);
-+ panel_applet_gconf_set_bool(PANEL_APPLET (applet),
-+ "track_active_interface",
-+ track_active,
-+ NULL);
-+
-+}
-+
-+static void
- netstatus_applet_iface_name_changed (NetstatusApplet *applet)
- {
- const char *iface_name;
-@@ -398,10 +421,29 @@ netstatus_applet_iface_pref_changed (GCo
- {
- if (entry->value && entry->value->type == GCONF_VALUE_STRING)
- {
-+ gboolean track_active;
- const char *iface_name;
-
-- iface_name = gconf_value_get_string (entry->value);
-- netstatus_iface_set_name (applet->priv->iface, iface_name);
-+ track_active = netstatus_iface_get_track_active_interface(applet->priv->iface);
-+ if ( !track_active ) {
-+ iface_name = gconf_value_get_string (entry->value);
-+ netstatus_iface_set_name (applet->priv->iface, iface_name);
-+ }
-+ }
-+}
-+
-+static void
-+netstatus_applet_iface_track_active_interface_changed (GConfClient *client,
-+ guint cnxn_id,
-+ GConfEntry *entry,
-+ NetstatusApplet *applet)
-+{
-+ if (entry->value && entry->value->type == GCONF_VALUE_BOOL)
-+ {
-+ gboolean track_active;
-+
-+ track_active = gconf_value_get_bool(entry->value);
-+ netstatus_iface_set_track_active_interface (applet->priv->iface, track_active);
- }
- }
-
-@@ -409,6 +451,7 @@ static gboolean
- netstatus_applet_create (NetstatusApplet *applet,
- const char *iid)
- {
-+ gboolean track_active = FALSE;
- char *iface_name;
- char *key;
-
-@@ -426,66 +469,75 @@ netstatus_applet_create (NetstatusApplet
- "/schemas/apps/netstatus_applet/prefs",
- NULL);
-
-- iface_name = panel_applet_gconf_get_string (PANEL_APPLET (applet),
-- "interface",
-+ track_active = panel_applet_gconf_get_bool (PANEL_APPLET (applet),
-+ "track_active_interface",
- NULL);
-- if (!iface_name || !iface_name [0])
-- {
-- GError *error = NULL;
-- GList *iface_names;
-
-- g_free (iface_name);
-- iface_name = NULL;
--
-- iface_names = netstatus_list_interface_names (&error);
-- if (iface_names)
-- {
-- GList *l;
-- gulong in_packets, out_packets;
-- gulong in_bytes, out_bytes;
-- char *error_message;
--
-- /* FIXME: instead of picking the first one we should
-- * figure out what interfaces aren't currently
-- * displayed in an applet.
-- */
-- /* Process list of interfaces, and instead of showing first one,
-- * Show first non error interface.
-- */
-- for (l = iface_names; l; l = l->next) {
-- if ((error_message = netstatus_sysdeps_read_iface_statistics (l->data,
-- &in_packets, &out_packets, &in_bytes, &out_bytes)) == NULL) {
-- /* Success !! make this the iface_name */
-- iface_name = l->data;
-- break;
-- } else {
-- g_free (error_message);
-- }
-- }
--
-- if (!iface_name || !iface_name [0])
-- iface_name = iface_names->data;
--
-- for (l = iface_names; l; l = l->next) {
-- /* Only free non used names */
-- if (strcmp(l->data, iface_name)) {
-- g_free (l->data);
-- }
-- }
-- g_list_free (iface_names);
-- }
-- else
-- {
-- g_assert (error != NULL);
-- g_object_set (G_OBJECT (applet->priv->iface),
-- "error", error,
-- NULL);
-- g_error_free (error);
-- }
-- }
-+ if ( track_active ) {
-+ netstatus_iface_set_track_active_interface (applet->priv->iface, track_active );
-+ }
-+ else {
-+ iface_name = panel_applet_gconf_get_string (PANEL_APPLET (applet),
-+ "interface",
-+ NULL);
-+ if (!iface_name || !iface_name [0])
-+ {
-+ GError *error = NULL;
-+ GList *iface_names;
-+
-+ g_free (iface_name);
-+ iface_name = NULL;
-+
-+ iface_names = netstatus_list_interface_names (&error);
-+ if (iface_names)
-+ {
-+ GList *l;
-+ gulong in_packets, out_packets;
-+ gulong in_bytes, out_bytes;
-+ char *error_message;
-+
-+ /* FIXME: instead of picking the first one we should
-+ * figure out what interfaces aren't currently
-+ * displayed in an applet.
-+ */
-+ /* Process list of interfaces, and instead of showing first one,
-+ * Show first non error interface.
-+ */
-+ for (l = iface_names; l; l = l->next) {
-+ if ((error_message = netstatus_sysdeps_read_iface_statistics (l->data,
-+ &in_packets, &out_packets, &in_bytes, &out_bytes)) == NULL) {
-+ /* Success !! make this the iface_name */
-+ iface_name = l->data;
-+ break;
-+ } else {
-+ g_free (error_message);
-+ }
-+ }
-+
-+ if (!iface_name || !iface_name [0])
-+ iface_name = iface_names->data;
-+
-+ for (l = iface_names; l; l = l->next) {
-+ /* Only free non used names */
-+ if (strcmp(l->data, iface_name)) {
-+ g_free (l->data);
-+ }
-+ }
-+ g_list_free (iface_names);
-+ }
-+ else
-+ {
-+ g_assert (error != NULL);
-+ g_object_set (G_OBJECT (applet->priv->iface),
-+ "error", error,
-+ NULL);
-+ g_error_free (error);
-+ }
-+ }
-
-- netstatus_iface_set_name (applet->priv->iface, iface_name);
-- g_free (iface_name);
-+ netstatus_iface_set_name (applet->priv->iface, iface_name);
-+ g_free (iface_name);
-+ }
-
- key = panel_applet_gconf_get_full_key (PANEL_APPLET (applet), "interface");
- applet->priv->notify_id =
-@@ -497,6 +549,17 @@ netstatus_applet_create (NetstatusApplet
- NULL);
- g_free (key);
-
-+ key = panel_applet_gconf_get_full_key (PANEL_APPLET (applet), "track_active_interface");
-+
-+ applet->priv->track_active_interface_id =
-+ gconf_client_notify_add (applet->priv->client,
-+ key,
-+ (GConfClientNotifyFunc) netstatus_applet_iface_track_active_interface_changed,
-+ applet,
-+ NULL,
-+ NULL);
-+ g_free (key);
-+
- return TRUE;
- }
-
-
-diff -up gnome-netstatus-2.12.1/icons/Makefile.am.orig gnome-netstatus-2.12.1/icons/Makefile.am
---- gnome-netstatus-2.12.1/icons/Makefile.am.orig 2008-09-15 17:04:22.590619122 +0100
-+++ gnome-netstatus-2.12.1/icons/Makefile.am 2008-09-15 17:05:46.172252679 +0100
-@@ -1,15 +1,4 @@
--icondir = $(datadir)/icons/hicolor/48x48/apps
--icon_DATA = \
-- gnome-netstatus-disconn.png \
-- gnome-netstatus-idle.png \
-- gnome-netstatus-rx.png \
-- gnome-netstatus-tx.png \
-- gnome-netstatus-txrx.png \
-- gnome-netstatus-error.png \
-- gnome-netstatus-0-24.png \
-- gnome-netstatus-25-49.png \
-- gnome-netstatus-50-74.png \
-- gnome-netstatus-75-100.png
-+SUBDIRS= hicolor
-
- gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
- install-data-hook: update-icon-cache
-@@ -23,4 +12,3 @@ update-icon-cache:
- echo "*** $(gtk_update_icon_cache)"; \
- fi
-
--EXTRA_DIST = $(icon_DATA)
-
-diff -up gnome-netstatus-2.26.0/src/netstatus-icon.c.orig gnome-netstatus-2.26.0/src/netstatus-icon.c
---- gnome-netstatus-2.26.0/src/netstatus-icon.c.orig 2009-03-18 11:45:09.775547673 +0000
-+++ gnome-netstatus-2.26.0/src/netstatus-icon.c 2009-03-18 11:47:00.624537186 +0000
-@@ -54,15 +54,21 @@ struct _NetstatusIconPrivate
- GdkPixbuf *icons [NETSTATUS_STATE_LAST];
- GdkPixbuf *scaled_icons [NETSTATUS_STATE_LAST];
-
-+ GdkPixbuf *wireless_icons [NETSTATUS_STATE_LAST];
-+ GdkPixbuf *scaled_wireless_icons [NETSTATUS_STATE_LAST];
-+
- GdkPixbuf *signal_icons [NETSTATUS_SIGNAL_LAST];
- GdkPixbuf *rotated_signal_icons [NETSTATUS_SIGNAL_LAST];
- GdkPixbuf *scaled_signal_icons [NETSTATUS_SIGNAL_LAST];
-
-+ GdkPixbuf *rendered_wireless_pixbufs[NETSTATUS_STATE_LAST][NETSTATUS_SIGNAL_LAST];
-+
- GtkOrientation orientation;
- int size;
-
-+ gulong query_tooltip_id;
-+
- gulong state_changed_id;
-- gulong name_changed_id;
- gulong wireless_changed_id;
- gulong signal_changed_id;
-
-@@ -119,23 +125,44 @@ netstatus_icon_theme_changed (NetstatusI
-
- for (i = 0; i < NETSTATUS_STATE_LAST; i++)
- {
-- g_object_unref (icon->priv->scaled_icons [i]);
-- icon->priv->scaled_icons [i] = NULL;
-+ if ( icon->priv->scaled_icons [i] != NULL ) {
-+ g_object_unref (icon->priv->scaled_icons [i]);
-+ icon->priv->scaled_icons [i] = NULL;
-+ }
-
- g_object_unref (icon->priv->icons [i]);
- icon->priv->icons [i] = NULL;
-+
-+ g_object_unref (icon->priv->wireless_icons [i]);
-+ icon->priv->wireless_icons [i] = NULL;
-+
-+ if ( icon->priv->scaled_wireless_icons [i] != NULL ) {
-+ g_object_unref(icon->priv->scaled_wireless_icons [i]);
-+ icon->priv->scaled_wireless_icons [i] = NULL;
-+ }
- }
-
- for (i = 0; i < NETSTATUS_SIGNAL_LAST; i++)
- {
-- g_object_unref (icon->priv->scaled_signal_icons [i]);
-- icon->priv->scaled_signal_icons [i] = NULL;
--
-- g_object_unref (icon->priv->signal_icons [i]);
-- icon->priv->signal_icons [i] = NULL;
-+ if ( icon->priv->scaled_signal_icons [i] != NULL ) {
-+ g_object_unref (icon->priv->scaled_signal_icons [i]);
-+ icon->priv->scaled_signal_icons [i] = NULL;
-+ }
-+
-+ if ( icon->priv->signal_icons [i] != NULL ) {
-+ g_object_unref (icon->priv->signal_icons [i]);
-+ icon->priv->signal_icons [i] = NULL;
-+ }
-+ }
-+
-+ for (i = 0; i < NETSTATUS_STATE_LAST; i++) {
-+ for (int j = 0; j < NETSTATUS_SIGNAL_LAST; j++) {
-+ if ( icon->priv->rendered_wireless_pixbufs[i][j] != NULL ) {
-+ g_object_unref(icon->priv->rendered_wireless_pixbufs[i][j]);
-+ }
-+ icon->priv->rendered_wireless_pixbufs[i][j] = NULL;
- }
--
-- netstatus_icon_init_pixbufs (icon);
-+ }
-
- if (icon->priv->size)
- {
-@@ -153,6 +180,10 @@ netstatus_icon_get_icon_theme (Netstatus
- screen = gtk_widget_get_screen (GTK_WIDGET (icon));
- icon->priv->icon_theme = gtk_icon_theme_get_for_screen (screen);
-
-+ gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
-+ NETSTATUS_DATA_DIR G_DIR_SEPARATOR_S "icons");
-+
-+
- g_signal_connect_object (icon->priv->icon_theme, "changed",
- G_CALLBACK (netstatus_icon_theme_changed),
- icon,
-@@ -286,32 +317,32 @@ netstatus_icon_init_pixbufs (NetstatusIc
- {
- netstatus_icon_init_pixbuf (icon,
- &icon->priv->icons [NETSTATUS_STATE_DISCONNECTED],
-- "gnome-netstatus-disconn");
-+ "network-offline");
- icon->priv->scaled_icons [NETSTATUS_STATE_DISCONNECTED] = NULL;
-
- netstatus_icon_init_pixbuf (icon,
- &icon->priv->icons [NETSTATUS_STATE_IDLE],
-- "gnome-netstatus-idle");
-+ "network-idle");
- icon->priv->scaled_icons [NETSTATUS_STATE_IDLE] = NULL;
-
- netstatus_icon_init_pixbuf (icon,
- &icon->priv->icons [NETSTATUS_STATE_TX],
-- "gnome-netstatus-tx");
-+ "network-transmit");
- icon->priv->scaled_icons [NETSTATUS_STATE_TX] = NULL;
-
- netstatus_icon_init_pixbuf (icon,
- &icon->priv->icons [NETSTATUS_STATE_RX],
-- "gnome-netstatus-rx");
-+ "network-receive");
- icon->priv->scaled_icons [NETSTATUS_STATE_RX] = NULL;
-
- netstatus_icon_init_pixbuf (icon,
- &icon->priv->icons [NETSTATUS_STATE_TX_RX],
-- "gnome-netstatus-txrx");
-+ "network-transmit-receive");
- icon->priv->scaled_icons [NETSTATUS_STATE_TX_RX] = NULL;
-
- netstatus_icon_init_pixbuf (icon,
- &icon->priv->icons [NETSTATUS_STATE_ERROR],
-- "gnome-netstatus-error");
-+ "network-error");
- icon->priv->scaled_icons [NETSTATUS_STATE_ERROR] = NULL;
-
- netstatus_icon_init_pixbuf (icon,
-@@ -338,6 +369,38 @@ netstatus_icon_init_pixbufs (NetstatusIc
- icon->priv->rotated_signal_icons [NETSTATUS_SIGNAL_75_100] = NULL;
- icon->priv->scaled_signal_icons [NETSTATUS_SIGNAL_75_100] = NULL;
-
-+ /* Load rx, tx, error, disconnect icons for wireless */
-+ netstatus_icon_init_pixbuf (icon,
-+ &icon->priv->wireless_icons [NETSTATUS_STATE_TX],
-+ "gnome-netstatus-wireless-transmit");
-+ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_TX] = NULL;
-+
-+ netstatus_icon_init_pixbuf (icon,
-+ &icon->priv->wireless_icons [NETSTATUS_STATE_RX],
-+ "gnome-netstatus-wireless-receive");
-+
-+ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_RX] = NULL;
-+
-+ netstatus_icon_init_pixbuf (icon,
-+ &icon->priv->wireless_icons [NETSTATUS_STATE_TX_RX],
-+ "gnome-netstatus-wireless-transmit-receive");
-+ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_TX_RX] = NULL;
-+
-+ netstatus_icon_init_pixbuf (icon,
-+ &icon->priv->wireless_icons [NETSTATUS_STATE_DISCONNECTED],
-+ "gnome-netstatus-wireless-offline");
-+ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_DISCONNECTED] = NULL;
-+
-+ netstatus_icon_init_pixbuf (icon,
-+ &icon->priv->wireless_icons [NETSTATUS_STATE_IDLE],
-+ "gnome-netstatus-wireless-idle");
-+ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_IDLE] = NULL;
-+
-+ netstatus_icon_init_pixbuf (icon,
-+ &icon->priv->wireless_icons [NETSTATUS_STATE_ERROR],
-+ "gnome-netstatus-wireless-error");
-+ icon->priv->scaled_wireless_icons [NETSTATUS_STATE_ERROR] = NULL;
-+
- netstatus_icon_rotate_signal_icons (icon, icon->priv->orientation);
- }
-
-@@ -356,40 +419,129 @@ netstatus_icon_update_image (NetstatusIc
- if (gtk_image_get_pixbuf (GTK_IMAGE (icon->priv->image)) != pixbuf)
- gtk_image_set_from_pixbuf (GTK_IMAGE (icon->priv->image), pixbuf);
-
-- pixbuf = icon->priv->scaled_signal_icons [icon->priv->signal_strength];
-- if (!pixbuf)
-- pixbuf = icon->priv->rotated_signal_icons [icon->priv->signal_strength];
--
-- if (gtk_image_get_pixbuf (GTK_IMAGE (icon->priv->signal_image)) != pixbuf)
-- gtk_image_set_from_pixbuf (GTK_IMAGE (icon->priv->signal_image), pixbuf);
-+ if (netstatus_iface_get_is_wireless (icon->priv->iface)) {
-+ /* Merge Signal + Status Pixmaps for wireless icon */
-+ GdkPixbuf *wireless_state_pixbuf;
-+
-+ if ( icon->priv->rendered_wireless_pixbufs[icon->priv->state][icon->priv->signal_strength] == NULL ) {
-+ /* Render for first time */
-+ GdkPixbuf *rendered_pixbuf;
-+ GdkPixbuf *state_pixbuf;
-+ GdkPixbuf *signal_pixbuf;
-+ gint back_width;
-+ gint back_height;
-+
-+ state_pixbuf = icon->priv->scaled_wireless_icons [icon->priv->state];
-+ if (!state_pixbuf)
-+ state_pixbuf = icon->priv->wireless_icons [icon->priv->state];
-+
-+ signal_pixbuf = icon->priv->scaled_signal_icons [icon->priv->signal_strength];
-+ if (!signal_pixbuf)
-+ signal_pixbuf = icon->priv->rotated_signal_icons [icon->priv->signal_strength];
-+
-+ rendered_pixbuf = gdk_pixbuf_copy(signal_pixbuf);
-+ back_width = gdk_pixbuf_get_width (rendered_pixbuf);
-+ back_height = gdk_pixbuf_get_height (rendered_pixbuf);
-+
-+ gdk_pixbuf_composite (state_pixbuf,
-+ rendered_pixbuf,
-+ 0, 0,
-+ back_width, back_height,
-+ 0, 0,
-+ 1.0, 1.0,
-+ GDK_INTERP_NEAREST,
-+ 255 );
-+
-+ icon->priv->rendered_wireless_pixbufs[icon->priv->state][icon->priv->signal_strength] = rendered_pixbuf;
-+ }
-+
-+ /* TODO - Do we handle rotation?
-+ pixbuf = icon->priv->scaled_signal_icons [icon->priv->signal_strength];
-+ if (!pixbuf)
-+ pixbuf = icon->priv->rotated_signal_icons [icon->priv->signal_strength];
-+ */
-+
-+ pixbuf = icon->priv->rendered_wireless_pixbufs[icon->priv->state][icon->priv->signal_strength];
-+ if (gtk_image_get_pixbuf (GTK_IMAGE (icon->priv->signal_image)) != pixbuf)
-+ gtk_image_set_from_pixbuf (GTK_IMAGE (icon->priv->signal_image), pixbuf);
-+ }
- }
-
--static void
--netstatus_icon_name_changed (NetstatusIface *iface,
-- GParamSpec *pspec,
-- NetstatusIcon *icon)
--{
-- const char *iface_name;
-- const char *tip;
-- char *freeme = NULL;
--
-- iface_name = netstatus_iface_get_name (icon->priv->iface);
-- if (iface_name)
-- {
-- const char *state_string;
--
-- state_string = netstatus_get_state_string (icon->priv->state);
-- freeme = g_strdup_printf (_("Network Connection: %s\n%s"), iface_name, state_string);
-- tip = freeme;
-- }
-- else
-- {
-- tip = _("Network Connection");
-- }
--
-- gtk_widget_set_tooltip_text (GTK_WIDGET (icon), tip);
-+static gboolean
-+netstatus_icon_query_tooltip( NetstatusIcon *icon,
-+ gint x,
-+ gint y,
-+ gboolean keyboard_mode,
-+ GtkTooltip *tooltip,
-+ gpointer user_data)
-+{
-+ const char *iface_name = NULL;
-+ char *ipaddr = NULL;
-+ GString *tooltip_markup = g_string_new("<tt>");
-+ char *cstr;
-+
-+ if ( !icon->priv->tooltips_enabled )
-+ return( FALSE );
-+
-+ if (icon->priv->iface != NULL ) {
-+ if ( netstatus_iface_get_is_wireless (icon->priv->iface)) {
-+ const char *iface_essid;
-+ const char *iface_bss_mode;
-+ gint signal_strength;
-+
-+ iface_essid = netstatus_iface_get_essid (icon->priv->iface);
-+ iface_bss_mode = netstatus_iface_get_bss_mode (icon->priv->iface);
-+ signal_strength = netstatus_iface_get_signal_strength (icon->priv->iface);
-+
-+ if ( iface_essid != NULL ) {
-+ /* SUN_BRANDING */
-+ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"),
-+ /* SUN_BRANDING */
-+ _("Wireless Network"), iface_essid );
-+ g_string_append(tooltip_markup, "\n");
-+ }
-+
-+ /* SUN_BRANDING */
-+ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %d%%"),
-+ /* SUN_BRANDING */
-+ _("Signal Strength"), signal_strength );
-+ g_string_append(tooltip_markup, "\n");
-+
-+ if ( iface_bss_mode != NULL ) {
-+ /* SUN_BRANDING */
-+ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"),
-+ /* SUN_BRANDING */
-+ _("Operational Mode"), iface_bss_mode );
-+ g_string_append(tooltip_markup, "\n");
-+ }
-+ }
-+
-+ iface_name = netstatus_iface_get_name (icon->priv->iface);
-+ netstatus_iface_get_inet4_details (icon->priv->iface, &ipaddr, NULL, NULL, NULL );
-+
-+ if ( ipaddr != NULL ) {
-+ /* SUN_BRANDING */
-+ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"),
-+ /* SUN_BRANDING */
-+ _("IP Address (v4)"), ipaddr );
-+ g_string_append(tooltip_markup, "\n");
-+ }
-+
-+ }
-+ if ( iface_name != NULL ) {
-+ g_string_append_printf(tooltip_markup, _("<b>%-20s</b>: %s"), _("Network Connection"), iface_name );
-+ }
-+ else {
-+ g_string_append_printf(tooltip_markup, _("Network Connection") );
-+ }
-+
-+ g_string_append(tooltip_markup, "</tt>");
-+ cstr = g_string_free(tooltip_markup, FALSE);
-+ gtk_tooltip_set_markup( tooltip, cstr );
-+ g_free(cstr);
-
-- g_free (freeme);
-+ g_free(ipaddr);
-+ return( TRUE );
- }
-
- static void
-@@ -408,7 +560,6 @@ netstatus_icon_state_changed (NetstatusI
- icon->priv->state = state;
-
- netstatus_icon_update_image (icon);
-- netstatus_icon_name_changed (icon->priv->iface, NULL, icon);
- }
- }
-
-@@ -417,10 +568,16 @@ netstatus_icon_is_wireless_changed (Nets
- GParamSpec *pspec,
- NetstatusIcon *icon)
- {
-- if (netstatus_iface_get_is_wireless (iface) && icon->priv->show_signal)
-+ netstatus_icon_update_image (icon);
-+
-+ if (netstatus_iface_get_is_wireless (iface) && icon->priv->show_signal) {
-+ gtk_widget_hide (icon->priv->image);
- gtk_widget_show (icon->priv->signal_image);
-- else
-+ }
-+ else {
-+ gtk_widget_show (icon->priv->image);
- gtk_widget_hide (icon->priv->signal_image);
-+ }
- }
-
- static void
-@@ -459,21 +616,23 @@ netstatus_icon_destroy (GtkObject *widge
- gtk_widget_destroy (icon->priv->error_dialog);
- icon->priv->error_dialog = NULL;
-
-+ if ( icon->priv->query_tooltip_id ) {
-+ g_signal_handler_disconnect (icon,
-+ icon->priv->query_tooltip_id);
-+ }
-+ icon->priv->query_tooltip_id = 0;
-+
- if (icon->priv->state_changed_id)
- {
- g_assert (icon->priv->iface != NULL);
-- g_assert (icon->priv->name_changed_id != 0);
- g_signal_handler_disconnect (icon->priv->iface,
- icon->priv->state_changed_id);
- g_signal_handler_disconnect (icon->priv->iface,
-- icon->priv->name_changed_id);
-- g_signal_handler_disconnect (icon->priv->iface,
- icon->priv->wireless_changed_id);
- g_signal_handler_disconnect (icon->priv->iface,
- icon->priv->signal_changed_id);
- }
- icon->priv->state_changed_id = 0;
-- icon->priv->name_changed_id = 0;
- icon->priv->wireless_changed_id = 0;
- icon->priv->signal_changed_id = 0;
-
-@@ -566,6 +725,16 @@ netstatus_icon_scale_icons (NetstatusIco
- TRUE);
- }
-
-+ for (i = 0; i < NETSTATUS_STATE_LAST; i++)
-+ {
-+ if (icon->priv->scaled_wireless_icons [i])
-+ g_object_unref (icon->priv->scaled_wireless_icons [i]);
-+ icon->priv->scaled_wireless_icons [i] = scale_pixbuf (icon->priv->wireless_icons [i],
-+ icon->priv->orientation,
-+ size,
-+ TRUE);
-+ }
-+
- for (i = 0; i < NETSTATUS_SIGNAL_LAST; i++)
- {
- if (icon->priv->scaled_signal_icons [i])
-@@ -573,8 +742,18 @@ netstatus_icon_scale_icons (NetstatusIco
- icon->priv->scaled_signal_icons [i] = scale_pixbuf (icon->priv->rotated_signal_icons [i],
- icon->priv->orientation,
- size,
-- FALSE);
-+ TRUE);
- }
-+
-+ /* Invalidate rendered icons */
-+ for (i = 0; i < NETSTATUS_STATE_LAST; i++) {
-+ for (int j = 0; j < NETSTATUS_SIGNAL_LAST; j++) {
-+ if ( icon->priv->rendered_wireless_pixbufs[i][j] != NULL ) {
-+ g_object_unref(icon->priv->rendered_wireless_pixbufs[i][j]);
-+ }
-+ icon->priv->rendered_wireless_pixbufs[i][j] = NULL;
-+ }
-+ }
-
- netstatus_icon_update_image (icon);
- }
-@@ -862,12 +1041,15 @@ netstatus_icon_instance_init (NetstatusI
-
- icon->priv->image = gtk_image_new ();
- gtk_container_add (GTK_CONTAINER (icon), icon->priv->image);
-- gtk_widget_show (icon->priv->image);
-+ gtk_widget_hide (icon->priv->image);
-
- icon->priv->signal_image = gtk_image_new ();
- gtk_container_add (GTK_CONTAINER (icon), icon->priv->signal_image);
- gtk_widget_hide (icon->priv->signal_image);
-
-+ icon->priv->query_tooltip_id = g_signal_connect(icon, "query-tooltip",
-+ G_CALLBACK (netstatus_icon_query_tooltip), NULL);
-+
- gtk_widget_add_events (GTK_WIDGET (icon),
- GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
- }
-@@ -971,12 +1153,9 @@ netstatus_icon_set_iface (NetstatusIcon
- if (icon->priv->state_changed_id)
- {
- g_assert (icon->priv->iface != NULL);
-- g_assert (icon->priv->name_changed_id != 0);
- g_signal_handler_disconnect (icon->priv->iface,
- icon->priv->state_changed_id);
- g_signal_handler_disconnect (icon->priv->iface,
-- icon->priv->name_changed_id);
-- g_signal_handler_disconnect (icon->priv->iface,
- icon->priv->wireless_changed_id);
- g_signal_handler_disconnect (icon->priv->iface,
- icon->priv->signal_changed_id);
-@@ -991,15 +1170,12 @@ netstatus_icon_set_iface (NetstatusIcon
-
- icon->priv->state_changed_id = g_signal_connect (icon->priv->iface, "notify::state",
- G_CALLBACK (netstatus_icon_state_changed), icon);
-- icon->priv->name_changed_id = g_signal_connect (icon->priv->iface, "notify::name",
-- G_CALLBACK (netstatus_icon_name_changed), icon);
- icon->priv->wireless_changed_id = g_signal_connect (icon->priv->iface, "notify::wireless",
- G_CALLBACK (netstatus_icon_is_wireless_changed), icon);
- icon->priv->signal_changed_id = g_signal_connect (icon->priv->iface, "notify::signal-strength",
- G_CALLBACK (netstatus_icon_signal_changed), icon);
-
- netstatus_icon_state_changed (icon->priv->iface, NULL, icon);
-- netstatus_icon_name_changed (icon->priv->iface, NULL, icon);
- netstatus_icon_is_wireless_changed (icon->priv->iface, NULL, icon);
- netstatus_icon_signal_changed (icon->priv->iface, NULL, icon);
-
-
-diff -up gnome-netstatus-2.26.0/src/netstatus-dialog.c.orig gnome-netstatus-2.26.0/src/netstatus-dialog.c
---- gnome-netstatus-2.26.0/src/netstatus-dialog.c.orig 2009-03-18 10:39:57.128044855 +0000
-+++ gnome-netstatus-2.26.0/src/netstatus-dialog.c 2009-03-18 10:39:57.153119228 +0000
-@@ -85,6 +85,11 @@ typedef struct
- GtkWidget *signal_strength_frame;
- GtkWidget *signal_strength_bar;
- GtkWidget *signal_strength_label;
-+ GtkWidget *essid_value_label;
-+ GtkWidget *bssid_value_label;
-+ GtkWidget *bss_mode_value_label;
-+ GtkWidget *security_value_label;
-+ GtkWidget *auth_mode_value_label;
- GtkWidget *configure_button;
-
- GtkWidget *inet4_frame;
-@@ -102,6 +107,10 @@ typedef struct
- GtkWidget *dev_type;
- GtkWidget *dev_addr;
-
-+ GtkWidget *track_active_interface_cbox;
-+ GtkWidget *configure_net_auto_cbox;
-+ gboolean configured_for_auto;
-+
- GtkWidget *restart_button;
- GtkWidget *restart_button_image;
- GtkWidget *restart_button_label;
-@@ -210,6 +219,11 @@ netstatus_dialog_update_signal_strength
- {
- int signal_strength;
- char *str;
-+ const char *essid;
-+ const char *bssid;
-+ const char *bss_mode;
-+ const char *auth_mode;
-+ const char *security;
-
- gtk_widget_show (data->signal_strength_frame);
-
-@@ -221,6 +235,18 @@ netstatus_dialog_update_signal_strength
- str = g_strdup_printf ("%d%%\n", signal_strength);
- gtk_label_set_text (GTK_LABEL (data->signal_strength_label), str);
- g_free (str);
-+
-+ essid = netstatus_iface_get_essid (data->iface);
-+ bssid = netstatus_iface_get_bssid (data->iface);
-+ bss_mode = netstatus_iface_get_bss_mode (data->iface);
-+ security = netstatus_iface_get_security (data->iface);
-+ auth_mode = netstatus_iface_get_auth_mode (data->iface);
-+
-+ gtk_label_set_text (GTK_LABEL (data->essid_value_label), essid?essid:"" );
-+ gtk_label_set_text (GTK_LABEL (data->bssid_value_label), bssid?bssid:"" );
-+ gtk_label_set_text (GTK_LABEL (data->bss_mode_value_label), bss_mode?bss_mode:"" );
-+ gtk_label_set_text (GTK_LABEL (data->auth_mode_value_label), auth_mode?auth_mode:"" );
-+ gtk_label_set_text (GTK_LABEL (data->security_value_label), security?security:"" );
- }
- else
- {
-@@ -339,6 +365,141 @@ netstatus_dialog_update_device_support (
- }
-
- static void
-+netstatus_dialog_set_track_active_interface(NetstatusDialogData *data,
-+ GtkToggleButton *toggle)
-+{
-+ gboolean track_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->track_active_interface_cbox));
-+
-+ netstatus_iface_set_track_active_interface (data->iface, track_active );
-+}
-+
-+
-+static void
-+netstatus_dialog_update_track_active_interface (NetstatusDialogData *data)
-+{
-+ GtkWidget * widget;
-+ gboolean track_active = FALSE;
-+
-+ if ( data->track_active_interface_cbox == NULL )
-+ return;
-+
-+ track_active = netstatus_iface_get_track_active_interface( data->iface );
-+
-+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->track_active_interface_cbox), track_active );
-+
-+ gtk_widget_set_sensitive(GTK_WIDGET(data->name), !track_active );
-+
-+}
-+
-+static void
-+netstatus_dialog_update_configure_net_auto (NetstatusDialogData *data)
-+{
-+ GtkWidget * widget;
-+ gboolean nwam_enabled = FALSE;
-+
-+ if ( data->configure_net_auto_cbox == NULL )
-+ return;
-+
-+ nwam_enabled = netstatus_iface_network_config_is_nwam(data->iface );
-+
-+ data->configured_for_auto = nwam_enabled;
-+
-+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->configure_net_auto_cbox), nwam_enabled );
-+
-+ gtk_widget_set_sensitive(GTK_WIDGET(data->configure_button), !nwam_enabled );
-+
-+ gtk_widget_set_sensitive(GTK_WIDGET(data->configure_net_auto_cbox), TRUE);
-+}
-+
-+static gboolean
-+netstatus_dialog_ask_question(NetstatusDialogData *data, const char* message, const char* question )
-+{
-+ GtkWidget *dialog;
-+ gint result;
-+ gboolean ret_val = FALSE;
-+
-+ dialog = gtk_message_dialog_new (GTK_WINDOW (data->dialog),
-+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-+ GTK_MESSAGE_QUESTION,
-+ GTK_BUTTONS_YES_NO,
-+ message );
-+
-+ if (question) {
-+ gtk_message_dialog_format_secondary_text( dialog, question );
-+ }
-+
-+ result = gtk_dialog_run (GTK_DIALOG (dialog));
-+
-+ switch (result) {
-+ case GTK_RESPONSE_YES:
-+ ret_val = TRUE;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ gtk_widget_destroy (dialog);
-+
-+ return( ret_val );
-+}
-+
-+static void
-+child_exit_cb(GPid pid, gint status, gpointer user_data)
-+{
-+ NetstatusDialogData *data = (NetstatusDialogData *)user_data;
-+
-+ netstatus_dialog_update_configure_net_auto(data);
-+
-+ g_spawn_close_pid( pid );
-+}
-+
-+static void
-+netstatus_dialog_switch_network_config_auto(NetstatusDialogData *data, gboolean automatic )
-+{
-+ static char* switch_to_auto_command[] = {"/usr/bin/network-admin", "--switch-to-auto", NULL };
-+ static char* switch_to_manual_command[] = { "/usr/bin/network-admin", "--switch-to-manual", NULL };
-+
-+ char** command_line;
-+ const char* message;;
-+ const char* question;;
-+
-+ if ( automatic ) {
-+ command_line = switch_to_auto_command;
-+ /* SUN_BRANDING */
-+ message = _("You have selected that the network be automatically configured.");
-+ }
-+ else {
-+ command_line = switch_to_manual_command;
-+ /* SUN_BRANDING */
-+ message = _("You have selected to manually configure the network..");
-+ }
-+
-+ /* SUN_BRANDING */
-+ question = _("This will cause your network to be restarted\nDo you wish to continue?");
-+ if ( netstatus_dialog_ask_question(data, message, question ) ) {
-+ gint child_pid;
-+
-+ if ( gdk_spawn_on_screen( gdk_screen_get_default(),
-+ NULL, command_line, NULL,
-+ G_SPAWN_DO_NOT_REAP_CHILD,
-+ NULL, NULL, &child_pid, NULL) ) {
-+ g_child_watch_add( child_pid, child_exit_cb, data );
-+
-+ /* Set as insensitive until child exits */
-+ gtk_widget_set_sensitive(GTK_WIDGET(data->configure_net_auto_cbox), FALSE);
-+ }
-+ else {
-+ netstatus_dialog_update_configure_net_auto(data);
-+ }
-+ }
-+ else {
-+ netstatus_dialog_update_configure_net_auto(data);
-+ }
-+
-+ return;
-+}
-+
-+static void
- netstatus_dialog_update_restart_button (NetstatusDialogData *data)
- {
- GtkWidget * widget;
-@@ -405,6 +566,14 @@ netstatus_dialog_iface_signal_strength_c
- }
-
- static void
-+netstatus_dialog_iface_track_active_interface_changed(NetstatusIface *iface,
-+ GParamSpec *pspec,
-+ NetstatusDialogData *data)
-+{
-+ netstatus_dialog_update_track_active_interface( data );
-+}
-+
-+static void
- netstatus_dialog_iface_name_changed (NetstatusIface *iface,
- GParamSpec *pspec,
- NetstatusDialogData *data)
-@@ -804,6 +973,57 @@ netstatus_dialog_setup_configure_button
- }
-
- static void
-+netstatus_dialog_setup_track_active_interface (NetstatusDialogData *data,
-+ GladeXML *xml)
-+{
-+ GtkWidget *cbox;
-+
-+ cbox = glade_xml_get_widget (xml, "track_active_interface");
-+
-+ gtk_widget_show (cbox);
-+
-+ data->track_active_interface_cbox = cbox;
-+
-+ netstatus_dialog_update_track_active_interface(data);
-+
-+ g_signal_connect_swapped(GTK_TOGGLE_BUTTON (data->track_active_interface_cbox), "toggled",
-+ G_CALLBACK (netstatus_dialog_set_track_active_interface),
-+ data);
-+
-+}
-+
-+static void
-+netstatus_dialog_set_configure_net_auto(NetstatusDialogData *data,
-+ GtkToggleButton *toggle)
-+{
-+ gboolean configure_net_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->configure_net_auto_cbox));
-+
-+ if ( configure_net_auto != data->configured_for_auto ) {
-+ netstatus_dialog_switch_network_config_auto(data, configure_net_auto );
-+ }
-+}
-+
-+static void
-+netstatus_dialog_setup_configure_net_auto (NetstatusDialogData *data,
-+ GladeXML *xml)
-+{
-+ GtkWidget *cbox;
-+
-+ cbox = glade_xml_get_widget (xml, "configure_net_auto_cb");
-+
-+ gtk_widget_show (cbox);
-+
-+ data->configure_net_auto_cbox = cbox;
-+
-+ netstatus_dialog_update_configure_net_auto(data);
-+
-+ g_signal_connect_swapped(GTK_TOGGLE_BUTTON (data->configure_net_auto_cbox), "toggled",
-+ G_CALLBACK (netstatus_dialog_set_configure_net_auto),
-+ data);
-+
-+}
-+
-+static void
- netstatus_dialog_setup_connection (NetstatusDialogData *data,
- GladeXML *xml)
- {
-@@ -844,6 +1064,11 @@ netstatus_dialog_setup_signal_strength_d
- data->signal_strength_frame = glade_xml_get_widget (xml, "signal_strength_frame");
- data->signal_strength_bar = glade_xml_get_widget (xml, "signal_strength_bar");
- data->signal_strength_label = glade_xml_get_widget (xml, "signal_strength_label");
-+ data->essid_value_label = glade_xml_get_widget (xml, "essid_value_label");
-+ data->bssid_value_label = glade_xml_get_widget (xml, "bssid_value_label");
-+ data->bss_mode_value_label = glade_xml_get_widget (xml, "bss_mode_value_label");
-+ data->auth_mode_value_label = glade_xml_get_widget (xml, "auth_mode_value_label");
-+ data->security_value_label = glade_xml_get_widget (xml, "security_value_label");
-
- netstatus_dialog_update_signal_strength (data);
- }
-@@ -909,6 +1134,13 @@ netstatus_dialog_iface_list_monitor (Net
- g_free (l->data);
- g_list_free (iface_names);
-
-+ /* Also check nwam status here */
-+ if ( GTK_IS_WIDGET(data->dialog) ) {
-+ if ( GTK_WIDGET_VISIBLE(data->dialog) ) {
-+ netstatus_dialog_update_configure_net_auto(data);
-+ }
-+ }
-+
- return TRUE;
- }
-
-@@ -1006,7 +1238,7 @@ netstatus_dialog_new (NetstatusIface *if
- data->dialog = glade_xml_get_widget (xml, "network_status_dialog");
- g_object_set_data (G_OBJECT (data->dialog), "netstatus-dialog-data", data);
-
-- gtk_window_set_icon_name(GTK_WINDOW (data->dialog), "gnome-netstatus-tx");
-+ gtk_window_set_icon_name(GTK_WINDOW (data->dialog), "network-transmit");
-
- data->iface = g_object_ref (iface);
- netstatus_connect_signal_while_alive (data->iface,
-@@ -1034,11 +1266,23 @@ netstatus_dialog_new (NetstatusIface *if
- data->dialog);
-
- netstatus_connect_signal_while_alive (data->iface,
-+ "notify::connected",
-+ G_CALLBACK (netstatus_dialog_iface_signal_strength_changed),
-+ data,
-+ data->dialog);
-+
-+ netstatus_connect_signal_while_alive (data->iface,
- "notify::signal-strength",
- G_CALLBACK (netstatus_dialog_iface_signal_strength_changed),
- data,
- data->dialog);
-
-+ netstatus_connect_signal_while_alive (data->iface,
-+ "notify::track-active-inteface",
-+ G_CALLBACK (netstatus_dialog_iface_track_active_interface_changed),
-+ data,
-+ data->dialog);
-+
- g_signal_connect (data->dialog, "response",
- G_CALLBACK (netstatus_dialog_response), NULL);
-
-@@ -1046,11 +1290,13 @@ netstatus_dialog_new (NetstatusIface *if
- G_CALLBACK (netstatus_dialog_destroy), NULL);
-
- netstatus_dialog_setup_connection (data, xml);
-+ netstatus_dialog_setup_track_active_interface (data, xml);
- netstatus_dialog_setup_activity (data, xml);
- netstatus_dialog_setup_signal_strength_details (data, xml);
- netstatus_dialog_setup_inet4_support (data, xml);
- netstatus_dialog_setup_device_support (data, xml);
- netstatus_dialog_setup_configure_button (data, xml);
-+ netstatus_dialog_setup_configure_net_auto (data, xml);
- netstatus_dialog_setup_restart_tab (data, xml);
-
- data->iface_list_monitor = g_timeout_add (2 * 1000,
-
-
-
-diff -up gnome-netstatus-2.12.1/src/netstatus-iface.c-clean gnome-netstatus-2.12.1/src/netstatus-iface.c
---- gnome-netstatus-2.12.1/src/netstatus-iface.c-clean 2008-08-19 13:17:40.000000000 +0100
-+++ gnome-netstatus-2.12.1/src/netstatus-iface.c 2008-09-26 20:31:29.002750149 +0100
-@@ -1,5 +1,6 @@
- /*
- * Copyright (C) 2003-2004 Sun Microsystems, Inc.
-+ *
- * Copyright (C) 2004 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or
-@@ -50,6 +51,8 @@
- #include <unistd.h>
- #include <string.h>
-
-+#include <libscf.h>
-+
- #include "netstatus-sysdeps.h"
- #include "netstatus-enums.h"
-
-@@ -60,6 +63,17 @@
- #define NETSTATUS_IFACE_RESTART_SCRIPT_TESTFLAGS (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_SYMLINK | G_FILE_TEST_IS_EXECUTABLE)
- static const gchar * NETSTATUS_IFACE_RESTART_SCRIPT = "/usr/bin/ifrestart";
-
-+#include <gconf/gconf-client.h>
-+
-+#define NWAM_AUTOMATIC_SELECTION_STRING ("Automatic Selection")
-+#define NWAM_AUTOMATIC_ROOT_KEY "/apps/nwam-manager"
-+#define NWAM_AUTOMATIC_ACTIVE_INTERFACE_KEY NWAM_AUTOMATIC_ROOT_KEY "/active_interface"
-+
-+static void gconf_notify_cb (GConfClient *client,
-+ guint cnxn_id,
-+ GConfEntry *entry,
-+ gpointer user_data);
-+
- enum
- {
- PROP_0,
-@@ -68,6 +82,14 @@ enum
- PROP_STATS,
- PROP_WIRELESS,
- PROP_SIGNAL_STRENGTH,
-+ PROP_ESSID,
-+ PROP_BSSID,
-+ PROP_BSS_MODE,
-+ PROP_MODE,
-+ PROP_CONNECTED,
-+ PROP_SECURITY,
-+ PROP_AUTH_MODE,
-+ PROP_TRACK_ACTIVE_INTERFACE,
- PROP_ERROR
- };
-
-@@ -83,9 +105,18 @@ struct _NetstatusIfacePrivate
-
- NetstatusState state;
- NetstatusStats stats;
-- int signal_strength;
- GError *error;
-
-+
-+ gboolean connected;
-+ char *essid;
-+ char *bssid;
-+ char *bss_mode;
-+ char *mode;
-+ char *security;
-+ char *auth_mode;
-+ int signal_strength;
-+
- int sockfd;
- guint monitor_id;
-
-@@ -98,6 +129,12 @@ struct _NetstatusIfacePrivate
- GIOChannel *restart_outioc;
- GIOChannel *restart_errioc;
- guint restart_cwsource;
-+
-+ GConfClient *client;
-+ gchar *active_interface;
-+ guint gconf_notify_id;
-+ gboolean track_active_interface;
-+ gboolean configured_for_nwam;
- };
-
- static void netstatus_iface_instance_init (NetstatusIface *iface,
-@@ -147,19 +184,102 @@ netstatus_iface_get_type (void)
- return type;
- }
-
-+static void gconf_notify_cb (GConfClient *client,
-+ guint cnxn_id,
-+ GConfEntry *entry,
-+ gpointer user_data)
-+{
-+ NetstatusIface *iface = NETSTATUS_IFACE(user_data);
-+ const char *key;
-+ GConfValue *value;
-+
-+ key = gconf_entry_get_key (entry);
-+ value = gconf_entry_get_value (entry);
-+
-+ if (g_ascii_strcasecmp (key, NWAM_AUTOMATIC_ACTIVE_INTERFACE_KEY) == 0) {
-+ const char *new_iface = gconf_value_get_string (value);
-+
-+ if (iface->priv->active_interface != NULL ) {
-+ g_free(iface->priv->active_interface);
-+ }
-+ iface->priv->active_interface = g_strdup(new_iface);
-+
-+ if ( iface->priv->track_active_interface ) {
-+ if ( iface->priv->active_interface != NULL && strlen(iface->priv->active_interface)> 0 ) {
-+ netstatus_iface_set_name( iface, iface->priv->active_interface );
-+ }
-+ else if ( !iface->priv->configured_for_nwam ) {
-+ netstatus_iface_find_active_interface(iface);
-+ }
-+ }
-+ }
-+}
-+
-+gboolean
-+netstatus_iface_network_config_is_nwam(NetstatusIface *iface )
-+{
-+ gboolean retval = FALSE;
-+ gchar *output = NULL;
-+
-+ if ( (output = smf_get_state("svc:/network/physical:nwam")) != NULL ) {
-+ char *stripped = g_strstrip(output);
-+
-+ /* Not in state disabled */
-+ if ( stripped != NULL &&
-+ strncmp( stripped, SCF_STATE_STRING_DISABLED, strlen(SCF_STATE_STRING_DISABLED) ) != 0 ) {
-+ retval = TRUE;
-+ }
-+ g_free(output);
-+ }
-+
-+ iface->priv->configured_for_nwam = retval;
-+
-+ return( retval );
-+}
-+
-+static const char*
-+netstatus_iface_get_nwam_active_interface(NetstatusIface *iface )
-+{
-+ return iface->priv->active_interface?iface->priv->active_interface:"";
-+}
-
- static void
- netstatus_iface_instance_init (NetstatusIface *iface,
- NetstatusIfaceClass *klass)
- {
-+ GError *err = NULL;
-+
- iface->priv = g_new0 (NetstatusIfacePrivate, 1);
-
- iface->priv->state = NETSTATUS_STATE_DISCONNECTED;
-
-+ iface->priv->track_active_interface = FALSE;
-+
-+ iface->priv->active_interface = NULL;
-+
-+ iface->priv->client = gconf_client_get_default ();
-+
-+ iface->priv->gconf_notify_id = gconf_client_notify_add (iface->priv->client,
-+ NWAM_AUTOMATIC_ROOT_KEY,
-+ gconf_notify_cb,
-+ (gpointer) iface,
-+ NULL,
-+ NULL);
-+
-+ gconf_client_add_dir (iface->priv->client,
-+ NWAM_AUTOMATIC_ROOT_KEY,
-+ GCONF_CLIENT_PRELOAD_ONELEVEL,
-+ NULL);
-+
-+ iface->priv->active_interface = gconf_client_get_string (iface->priv->client, NWAM_AUTOMATIC_ACTIVE_INTERFACE_KEY, &err);
-+
- iface->priv->restart_status = -1; /* never restarted */
- iface->priv->restart_output = NULL;
- iface->priv->restart_outioc = NULL;
- iface->priv->restart_errioc = NULL;
-+
-+ (void)netstatus_iface_network_config_is_nwam( iface );
-+
- }
-
- static void
-@@ -207,6 +327,86 @@ netstatus_iface_class_init (NetstatusIfa
- G_PARAM_READABLE));
-
- g_object_class_install_property (gobject_class,
-+ PROP_TRACK_ACTIVE_INTERFACE,
-+ g_param_spec_boolean ("track_active_interface",
-+ /* SUN_BRANDING */
-+ _("Track Active Interface"),
-+ /* SUN_BRANDING */
-+ _("Whether to track the system's active interface"),
-+ FALSE,
-+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-+
-+ g_object_class_install_property (gobject_class,
-+ PROP_ESSID,
-+ g_param_spec_string ("essid",
-+ /* SUN_BRANDING */
-+ _("ESSID"),
-+ /* SUN_BRANDING */
-+ _("Wireless ESSID"),
-+ NULL,
-+ G_PARAM_READABLE));
-+
-+ g_object_class_install_property (gobject_class,
-+ PROP_BSSID,
-+ g_param_spec_string ("bssid",
-+ /* SUN_BRANDING */
-+ _("BSSID"),
-+ /* SUN_BRANDING */
-+ _("Wireless BSSID"),
-+ NULL,
-+ G_PARAM_READABLE));
-+
-+ g_object_class_install_property (gobject_class,
-+ PROP_BSS_MODE,
-+ g_param_spec_string ("bss_mode",
-+ /* SUN_BRANDING */
-+ _("BSS_MODE"),
-+ /* SUN_BRANDING */
-+ _("Wireless BSS_Mode"),
-+ NULL,
-+ G_PARAM_READABLE));
-+
-+ g_object_class_install_property (gobject_class,
-+ PROP_CONNECTED,
-+ g_param_spec_boolean ("connected",
-+ /* SUN_BRANDING */
-+ _("Wireless CONNECTED"),
-+ /* SUN_BRANDING */
-+ _("Whether the interface is connected"),
-+ FALSE,
-+ G_PARAM_READABLE));
-+
-+ g_object_class_install_property (gobject_class,
-+ PROP_MODE,
-+ g_param_spec_string ("mode",
-+ /* SUN_BRANDING */
-+ _("MODE"),
-+ /* SUN_BRANDING */
-+ _("Wireless MODE"),
-+ NULL,
-+ G_PARAM_READABLE));
-+
-+ g_object_class_install_property (gobject_class,
-+ PROP_SECURITY,
-+ g_param_spec_string ("security",
-+ /* SUN_BRANDING */
-+ _("SECURITY"),
-+ /* SUN_BRANDING */
-+ _("Wireless SECURITY"),
-+ NULL,
-+ G_PARAM_READABLE));
-+
-+ g_object_class_install_property (gobject_class,
-+ PROP_AUTH_MODE,
-+ g_param_spec_string ("auth_mode",
-+ /* SUN_BRANDING */
-+ _("AUTH_MODE"),
-+ /* SUN_BRANDING */
-+ _("Wireless AUTH_MODE"),
-+ NULL,
-+ G_PARAM_READABLE));
-+
-+ g_object_class_install_property (gobject_class,
- PROP_SIGNAL_STRENGTH,
- g_param_spec_int ("signal-strength",
- _("Signal"),
-@@ -239,6 +439,10 @@ netstatus_iface_finalize (GObject *objec
- {
- NetstatusIface *iface = (NetstatusIface *) object;
-
-+ if (iface->priv->gconf_notify_id) {
-+ gconf_client_notify_remove (iface->priv->client, iface->priv->gconf_notify_id);
-+ }
-+
- if (iface->priv->error)
- g_error_free (iface->priv->error);
- iface->priv->error = NULL;
-@@ -254,6 +458,24 @@ netstatus_iface_finalize (GObject *objec
- g_free (iface->priv->name);
- iface->priv->name = NULL;
-
-+ g_free (iface->priv->essid);
-+ iface->priv->essid = NULL;
-+
-+ g_free (iface->priv->bssid);
-+ iface->priv->bssid = NULL;
-+
-+ g_free (iface->priv->bss_mode);
-+ iface->priv->bss_mode = NULL;
-+
-+ g_free (iface->priv->mode);
-+ iface->priv->mode = NULL;
-+
-+ g_free (iface->priv->security);
-+ iface->priv->security = NULL;
-+
-+ g_free (iface->priv->auth_mode);
-+ iface->priv->auth_mode = NULL;
-+
- netstatus_iface_restart_collect_output (iface);
- if (iface->priv->restart_output != NULL)
- g_free (iface->priv->restart_output);
-@@ -278,6 +500,9 @@ netstatus_iface_set_property (GObject
- case PROP_NAME:
- netstatus_iface_set_name (iface, g_value_get_string (value));
- break;
-+ case PROP_TRACK_ACTIVE_INTERFACE:
-+ netstatus_iface_set_track_active_interface(iface, g_value_get_boolean (value));
-+ break;
- case PROP_ERROR:
- netstatus_iface_set_error (iface, g_value_get_boxed (value));
- break;
-@@ -309,9 +534,33 @@ netstatus_iface_get_property (GObject
- case PROP_WIRELESS:
- g_value_set_boolean (value, iface->priv->is_wireless);
- break;
-+ case PROP_TRACK_ACTIVE_INTERFACE:
-+ g_value_set_boolean (value, iface->priv->track_active_interface);
-+ break;
-+ case PROP_ESSID:
-+ g_value_set_string (value, iface->priv->essid);
-+ break;
- case PROP_SIGNAL_STRENGTH:
- g_value_set_int (value, iface->priv->signal_strength);
- break;
-+ case PROP_BSSID:
-+ g_value_set_string (value, iface->priv->bssid);
-+ break;
-+ case PROP_BSS_MODE:
-+ g_value_set_string (value, iface->priv->bss_mode);
-+ break;
-+ case PROP_MODE:
-+ g_value_set_string (value, iface->priv->mode);
-+ break;
-+ case PROP_CONNECTED:
-+ g_value_set_boolean (value, iface->priv->connected);
-+ break;
-+ case PROP_SECURITY:
-+ g_value_set_string (value, iface->priv->security);
-+ break;
-+ case PROP_AUTH_MODE:
-+ g_value_set_string (value, iface->priv->auth_mode);
-+ break;
- case PROP_ERROR:
- g_value_set_boxed (value, iface->priv->error);
- default:
-@@ -387,6 +636,14 @@ netstatus_iface_get_is_wireless (Netstat
- return iface->priv->is_wireless;
- }
-
-+gboolean
-+netstatus_iface_get_is_connected (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), FALSE);
-+
-+ return iface->priv->connected;
-+}
-+
- int
- netstatus_iface_get_signal_strength (NetstatusIface *iface)
- {
-@@ -395,6 +652,116 @@ netstatus_iface_get_signal_strength (Net
- return iface->priv->signal_strength;
- }
-
-+G_CONST_RETURN char *
-+netstatus_iface_get_essid (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
-+
-+ return iface->priv->essid;
-+}
-+
-+G_CONST_RETURN char *
-+netstatus_iface_get_bssid (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
-+
-+ return iface->priv->bssid;
-+}
-+
-+G_CONST_RETURN char *
-+netstatus_iface_get_bss_mode (NetstatusIface *iface)
-+{
-+ const char* bss_mode = NULL;
-+
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), bss_mode );
-+
-+ if ( iface->priv->bss_mode == NULL ) {
-+ return( bss_mode );
-+ }
-+
-+ if ( strcmp( iface->priv->bss_mode, "bss") == 0 ) {
-+ /* SUN_BRANDING */
-+ bss_mode = _("Infrastructure");
-+ }
-+ else
-+ if ( strcmp( iface->priv->bss_mode, "ibss") == 0 ) {
-+ /* SUN_BRANDING */
-+ bss_mode = _("Computer-to-Computer (Ad Hoc)");
-+ }
-+ else if ( strcmp( iface->priv->bss_mode, "any") == 0 ) {
-+ /* SUN_BRANDING */
-+ bss_mode = _("Any");
-+ }
-+
-+
-+ return bss_mode;
-+}
-+
-+G_CONST_RETURN char *
-+netstatus_iface_get_mode (NetstatusIface *iface)
-+{
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
-+
-+ return iface->priv->mode;
-+}
-+
-+G_CONST_RETURN char *
-+netstatus_iface_get_security (NetstatusIface *iface)
-+{
-+ const char* security = NULL;
-+
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
-+
-+ if ( iface->priv->security == NULL ) {
-+ return( security );
-+ }
-+
-+ if ( strcmp( iface->priv->security, "none") == 0 ) {
-+ /* SUN_BRANDING */
-+ security = _("None");
-+ }
-+ else
-+ if ( strcmp( iface->priv->security, "wep") == 0 ) {
-+ security = "WEP";
-+ }
-+ else
-+ if ( strcmp( iface->priv->security, "wpa") == 0 ) {
-+ security = "WPA";
-+ }
-+ else {
-+ security = iface->priv->security;
-+ }
-+
-+ return security;
-+}
-+
-+G_CONST_RETURN char *
-+netstatus_iface_get_auth_mode (NetstatusIface *iface)
-+{
-+ const char* auth_mode = NULL;
-+
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), 0);
-+
-+ if ( iface->priv->auth_mode == NULL ) {
-+ return( auth_mode );
-+ }
-+
-+ if ( strcmp( iface->priv->auth_mode, "open") == 0 ) {
-+ /* SUN_BRANDING */
-+ auth_mode = _("Open");
-+ }
-+ else
-+ if ( strcmp( iface->priv->auth_mode, "shared") == 0 ) {
-+ /* SUN_BRANDING */
-+ auth_mode = _("Shared");
-+ }
-+ else {
-+ auth_mode = iface->priv->auth_mode;
-+ }
-+
-+ return auth_mode;
-+}
-+
- void
- netstatus_iface_set_error (NetstatusIface *iface,
- const GError *error)
-@@ -591,14 +958,57 @@ netstatus_iface_poll_state (NetstatusIfa
-
- static gboolean
- netstatus_iface_poll_wireless_details (NetstatusIface *iface,
-- int *signal_strength)
-+ int *signal_strength,
-+ gboolean *connected,
-+ char **essid,
-+ char **bssid,
-+ char **bss_mode,
-+ char **mode,
-+ char **security,
-+ char **auth_mode )
- {
- char *error_message;
- gboolean is_wireless;
-+#if defined(__sun)
-+ wifi_info_t* wi = netstatus_sysdeps_read_iface_wireless_details (iface->priv->name);
-+
-+ if ( wi != NULL ) {
-+ is_wireless = TRUE;
-+ if ( signal_strength )
-+ *signal_strength = wi->signal_strength;
-+
-+ if ( connected )
-+ *connected = wi->connected;
-
-+ if ( essid ) {
-+ *essid = g_strdup( wi->essid );
-+ }
-+ if ( bssid ) {
-+ *bssid = g_strdup( wi->bssid );
-+ }
-+ if ( bss_mode ) {
-+ *bss_mode = g_strdup( wi->bss_mode );
-+ }
-+ if ( mode ) {
-+ *mode = g_strdup( wi->mode );
-+ }
-+ if ( security ) {
-+ *security = g_strdup( wi->security );
-+ }
-+ if ( auth_mode ) {
-+ *auth_mode = g_strdup( wi->auth_mode );
-+ }
-+ netstatus_wifi_info_free(wi);
-+ }
-+ else {
-+ is_wireless = FALSE;
-+ }
-+#else
- error_message = netstatus_sysdeps_read_iface_wireless_details (iface->priv->name,
- &is_wireless,
-- signal_strength);
-+ signal_strength,
-+ essid,
-+ max_essid_len );
-
- if (error_message)
- {
-@@ -612,6 +1022,7 @@ netstatus_iface_poll_wireless_details (N
-
- netstatus_iface_clear_error (iface, NETSTATUS_ERROR_WIRELESS_DETAILS);
-
-+#endif
- return is_wireless;
- }
-
-@@ -649,12 +1060,21 @@ netstatus_iface_increase_poll_delay_in_e
- }
- }
-
-+#define MAX_ESSID_LEN 128
-+
- static gboolean
- netstatus_iface_monitor_timeout (NetstatusIface *iface)
- {
- NetstatusState state;
- int signal_strength;
-- gboolean is_wireless;
-+ char *essid = NULL;
-+ char *bssid = NULL;
-+ char *bss_mode = NULL;
-+ gboolean connected = FALSE;
-+ char *mode = NULL;
-+ char *security = NULL;
-+ char *auth_mode = NULL;
-+ gboolean is_wireless = NULL;
-
- state = netstatus_iface_poll_state (iface);
-
-@@ -665,19 +1085,118 @@ netstatus_iface_monitor_timeout (Netstat
- g_object_notify (G_OBJECT (iface), "state");
- }
-
-- is_wireless = netstatus_iface_poll_wireless_details (iface, &signal_strength);
-+ if ( !iface->priv->configured_for_nwam &&
-+ (state == NETSTATUS_STATE_DISCONNECTED || state == NETSTATUS_STATE_ERROR) ) {
-+ /* Look for another interface it tracking active i/f */
-+ netstatus_iface_find_active_interface (iface);
-+ }
-+
-+ is_wireless = netstatus_iface_poll_wireless_details (iface, &signal_strength, &connected, &essid,
-+ &bssid, &bss_mode, &mode, &security, &auth_mode );
- if (iface->priv->is_wireless != is_wireless)
- {
- iface->priv->is_wireless = is_wireless;
- g_object_notify (G_OBJECT (iface), "wireless");
- }
-
-- if (iface->priv->signal_strength != signal_strength)
-- {
-- iface->priv->signal_strength = signal_strength;
-- g_object_notify (G_OBJECT (iface), "signal-strength");
-+ if ( is_wireless ) {
-+ if (iface->priv->connected != connected)
-+ {
-+ iface->priv->connected = connected;
-+ g_object_notify (G_OBJECT (iface), "connected");
-+ }
-+
-+ if (iface->priv->signal_strength != signal_strength)
-+ {
-+ iface->priv->signal_strength = signal_strength;
-+ g_object_notify (G_OBJECT (iface), "signal-strength");
-+ }
-+
-+ if (iface->priv->essid == NULL ||
-+ ( essid != NULL && strcmp(iface->priv->essid, essid ) != 0 ) )
-+ {
-+ if ( iface->priv->essid != NULL )
-+ g_free(iface->priv->essid);
-+
-+ iface->priv->essid = essid;
-+
-+ g_object_notify (G_OBJECT (iface), "essid");
-+ }
-+ else if ( essid ) {
-+ g_free(essid);
- }
-
-+ if (iface->priv->bssid == NULL ||
-+ ( bssid != NULL && strcmp(iface->priv->bssid, bssid ) != 0 ) )
-+ {
-+ if ( iface->priv->bssid != NULL )
-+ g_free(iface->priv->bssid);
-+
-+ iface->priv->bssid = bssid;
-+
-+ g_object_notify (G_OBJECT (iface), "bssid");
-+ }
-+ else if ( bssid ) {
-+ g_free(bssid);
-+ }
-+
-+ if (iface->priv->bss_mode == NULL ||
-+ ( bss_mode != NULL && strcmp(iface->priv->bss_mode, bss_mode ) != 0 ) )
-+ {
-+ if ( iface->priv->bss_mode != NULL )
-+ g_free(iface->priv->bss_mode);
-+
-+ iface->priv->bss_mode = bss_mode;
-+
-+ g_object_notify (G_OBJECT (iface), "bss_mode");
-+ }
-+ else if ( bss_mode ) {
-+ g_free(bss_mode);
-+ }
-+
-+ if (iface->priv->mode == NULL ||
-+ ( mode != NULL && strcmp(iface->priv->mode, mode ) != 0 ) )
-+ {
-+ if ( iface->priv->mode != NULL )
-+ g_free(iface->priv->mode);
-+
-+ iface->priv->mode = mode;
-+
-+ g_object_notify (G_OBJECT (iface), "mode");
-+ }
-+ else if ( mode ) {
-+ g_free(mode);
-+ }
-+
-+ if (iface->priv->security == NULL ||
-+ ( security != NULL && strcmp(iface->priv->security, security ) != 0 ) )
-+ {
-+ if ( iface->priv->security != NULL )
-+ g_free(iface->priv->security);
-+
-+ iface->priv->security = security;
-+
-+ g_object_notify (G_OBJECT (iface), "security");
-+ }
-+ else if ( security ) {
-+ g_free(security);
-+ }
-+
-+ if (iface->priv->auth_mode == NULL ||
-+ ( auth_mode != NULL && strcmp(iface->priv->auth_mode, auth_mode ) != 0 ) )
-+ {
-+ if ( iface->priv->auth_mode != NULL )
-+ g_free(iface->priv->auth_mode);
-+
-+ iface->priv->auth_mode = auth_mode;
-+
-+ g_object_notify (G_OBJECT (iface), "auth_mode");
-+ }
-+ else if ( auth_mode ) {
-+ g_free(auth_mode);
-+ }
-+ }
-+
- netstatus_iface_increase_poll_delay_in_error (iface);
-
- return TRUE;
-@@ -691,12 +1210,20 @@ netstatus_iface_init_monitor (NetstatusI
- iface->priv->stats.in_bytes = 0;
- iface->priv->stats.out_bytes = 0;
- iface->priv->signal_strength = 0;
-+ iface->priv->essid = NULL;
- iface->priv->is_wireless = FALSE;
-+ iface->priv->connected = FALSE;
-+ iface->priv->bssid = NULL;
-+ iface->priv->bss_mode = NULL;
-+ iface->priv->mode = NULL;
-+ iface->priv->security = NULL;
-+ iface->priv->auth_mode = NULL;
-
- g_object_freeze_notify (G_OBJECT (iface));
- g_object_notify (G_OBJECT (iface), "state");
- g_object_notify (G_OBJECT (iface), "wireless");
- g_object_notify (G_OBJECT (iface), "signal-strength");
-+ g_object_notify (G_OBJECT (iface), "essid");
- g_object_thaw_notify (G_OBJECT (iface));
-
- if (iface->priv->monitor_id)
-@@ -1230,6 +1757,7 @@ netstatus_list_interface_names (GError *
-
- struct ifconf *if_conf;
- GList *interfaces;
-+ GList *point_to_points;
- GList *loopbacks;
- char *p;
- int fd;
-@@ -1252,11 +1780,13 @@ netstatus_list_interface_names (GError *
-
- interfaces = NULL;
- loopbacks = NULL;
-+ point_to_points = NULL;
-
- for (p = if_conf->ifc_buf; p < if_conf->ifc_buf + if_conf->ifc_len;)
- {
- struct ifreq *if_req = (struct ifreq *) p;
- gboolean loopback = FALSE;
-+ gboolean p2p = FALSE;
-
- p += sizeof (if_req->ifr_name) + NETSTATUS_SA_LEN (&if_req->ifr_addr);
-
-@@ -1271,16 +1801,21 @@ netstatus_list_interface_names (GError *
- else
- {
- loopback = (if_req->ifr_flags & IFF_LOOPBACK);
-+ p2p = (if_req->ifr_flags & IFF_POINTOPOINT);
- }
-
-- if (!loopback)
-- interfaces = netstatus_list_insert_unique (interfaces,
-+ if (loopback)
-+ loopbacks = netstatus_list_insert_unique (loopbacks,
-+ g_strdup (if_req->ifr_name));
-+ else if (p2p)
-+ point_to_points = netstatus_list_insert_unique (point_to_points,
- g_strdup (if_req->ifr_name));
- else
-- loopbacks = netstatus_list_insert_unique (loopbacks,
-+ interfaces = netstatus_list_insert_unique (interfaces,
- g_strdup (if_req->ifr_name));
- }
-
-+ interfaces = g_list_concat (interfaces, point_to_points );
- interfaces = g_list_concat (interfaces, loopbacks);
-
- g_free (if_conf->ifc_buf);
-@@ -1512,3 +2047,104 @@ netstatus_iface_restart_interrupt (Netst
-
- kill (iface->priv->restart_pid, SIGKILL);
- }
-+
-+gboolean
-+netstatus_iface_get_track_active_interface (NetstatusIface *iface)
-+{
-+ gboolean track_active = FALSE;
-+
-+ g_return_val_if_fail (iface != NULL, track_active );
-+ g_return_val_if_fail (NETSTATUS_IS_IFACE (iface), track_active );
-+ g_return_val_if_fail (iface->priv != NULL, track_active );
-+
-+ track_active = iface->priv->track_active_interface;
-+
-+ return( track_active );
-+}
-+
-+void
-+netstatus_iface_set_track_active_interface (NetstatusIface *iface, gboolean track_active )
-+{
-+ g_return_if_fail (iface != NULL);
-+ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
-+ g_return_if_fail (iface->priv != NULL);
-+
-+ if ( iface->priv->track_active_interface != track_active ) {
-+ iface->priv->track_active_interface = track_active;
-+
-+ if ( track_active ) {
-+ if ( iface->priv->active_interface != NULL && strlen(iface->priv->active_interface)> 0 ) {
-+ netstatus_iface_set_name( iface, iface->priv->active_interface );
-+ }
-+ else {
-+ netstatus_iface_find_active_interface(iface);
-+ }
-+ }
-+
-+ g_object_notify (G_OBJECT (iface), "track_active_interface");
-+ }
-+}
-+
-+static void
-+netstatus_iface_find_active_interface (NetstatusIface *iface )
-+{
-+ GError *error = NULL;
-+ GList *iface_names;
-+ gchar *iface_name = NULL;
-+
-+ g_return_if_fail (iface != NULL);
-+ g_return_if_fail (NETSTATUS_IS_IFACE (iface));
-+ g_return_if_fail (iface->priv != NULL);
-+
-+ if (!iface->priv->track_active_interface)
-+ return;
-+
-+ iface_names = netstatus_list_interface_names (&error);
-+
-+ if (iface_names)
-+ {
-+ GList *l;
-+ gulong in_packets, out_packets;
-+ gulong in_bytes, out_bytes;
-+ char *error_message;
-+ /*
-+ * Find first non error interface.
-+ */
-+ for (l = iface_names; l; l = l->next) {
-+ if ( l->data && strncmp(l->data, "lo", 2) &&
-+ (error_message = netstatus_sysdeps_read_iface_statistics (l->data,
-+ &in_packets, &out_packets, &in_bytes, &out_bytes)) == NULL ) {
-+ gchar *old_name = iface->priv->name;
-+
-+ /* Temporarily set the name, but don't use set_name function
-+ * since it would signal a notification which we don't want here.
-+ */
-+ iface->priv->name = l->data;
-+ NetstatusState state = netstatus_iface_poll_state (iface);
-+ iface->priv->name = old_name;
-+
-+ if ( state != NETSTATUS_STATE_DISCONNECTED &&
-+ state != NETSTATUS_STATE_ERROR ) {
-+ /* Success !! make this the iface_name */
-+ iface_name = l->data;
-+ break;
-+ }
-+ } else if (error_message != NULL ) {
-+ g_free (error_message);
-+ }
-+ }
-+
-+ for (l = iface_names; l; l = l->next) {
-+ /* Only free non used names */
-+ if (iface_name == NULL || strcmp(l->data, iface_name)) {
-+ g_free (l->data);
-+ }
-+ }
-+ g_list_free (iface_names);
-+
-+ if ( iface_name ) {
-+ netstatus_iface_set_name( iface, iface_name );
-+ g_free( iface_name );
-+ }
-+ }
-+}
-
-
-
-diff -up gnome-netstatus-2.12.1/src/netstatus-iface.h-clean gnome-netstatus-2.12.1/src/netstatus-iface.h
---- gnome-netstatus-2.12.1/src/netstatus-iface.h-clean 2008-08-19 13:17:40.000000000 +0100
-+++ gnome-netstatus-2.12.1/src/netstatus-iface.h 2008-09-17 20:19:47.791864324 +0100
-@@ -73,6 +73,13 @@ void netstatus_iface_g
- NetstatusStats *stats);
- gboolean netstatus_iface_get_is_wireless (NetstatusIface *iface);
- int netstatus_iface_get_signal_strength (NetstatusIface *iface);
-+gboolean netstatus_iface_get_is_connected (NetstatusIface *iface);
-+G_CONST_RETURN char * netstatus_iface_get_essid (NetstatusIface *iface);
-+G_CONST_RETURN char * netstatus_iface_get_bssid (NetstatusIface *iface);
-+G_CONST_RETURN char * netstatus_iface_get_bss_mode (NetstatusIface *iface);
-+G_CONST_RETURN char * netstatus_iface_get_mode (NetstatusIface *iface);
-+G_CONST_RETURN char * netstatus_iface_get_security (NetstatusIface *iface);
-+G_CONST_RETURN char * netstatus_iface_get_auth_mode (NetstatusIface *iface);
-
- void netstatus_iface_set_error (NetstatusIface *iface,
- const GError *error);
-@@ -97,6 +104,11 @@ gint netstatus_iface_r
- G_CONST_RETURN gchar * netstatus_iface_restart_get_output (NetstatusIface *iface);
- void netstatus_iface_restart_interrupt (NetstatusIface *iface);
-
-+gboolean netstatus_iface_get_track_active_interface (NetstatusIface *iface);
-+void netstatus_iface_set_track_active_interface (NetstatusIface *iface, gboolean track_active );
-+void netstatus_iface_find_active_interface (NetstatusIface *iface );
-+gboolean netstatus_iface_network_config_is_nwam(NetstatusIface *iface );
-+
- G_END_DECLS
-
- #endif /* __NETSTATUS_IFACE_H__ */
-
-
-diff -up gnome-netstatus-2.12.2/src/netstatus-sysdeps.c-clean gnome-netstatus-2.12.2/src/netstatus-sysdeps.c
---- gnome-netstatus-2.12.2/src/netstatus-sysdeps.c-clean 2008-11-05 11:35:20.000000000 +0000
-+++ gnome-netstatus-2.12.2/src/netstatus-sysdeps.c 2008-11-06 11:30:32.186669791 +0000
-@@ -37,6 +37,7 @@
-
- #ifdef HAVE_SOLARIS
- #include <kstat.h>
-+#include <stdlib.h>
- #endif
-
- #ifdef __FreeBSD__
-@@ -441,21 +442,176 @@ netstatus_sysdeps_read_iface_statistics
- return NULL;
- }
-
--char *
--netstatus_sysdeps_read_iface_wireless_details (const char *iface,
-- gboolean *is_wireless,
-- int *signal_strength)
-+typedef struct {
-+ gboolean started;
-+ GPid pid;
-+ gint standard_input;
-+ gint standard_output;
-+ gint standard_error;
-+ FILE* in;
-+ FILE* out;
-+ FILE* err;
-+} child_info_t;
-+
-+static child_info_t child_info = { FALSE, 0, -1, -1, -1, NULL, NULL, NULL };
-+
-+static void
-+child_watch_func( GPid pid, gint status, gpointer data)
- {
-+ child_info_t* info = (child_info_t*)data;
-+
-+ g_return_if_fail( info != NULL );
-+
-+ fclose( info->in );
-+ fclose( info->out );
-+ fclose( info->err );
-+
-+ memset( info, 0, sizeof( child_info_t ) );
-+
-+ info->started = FALSE;
-+}
-+
-+char *
-+read_wireless_info( const char *iface ) {
-+ static char *child_argv[] = {
-+ "/usr/bin/pfexec",
-+ "/usr/lib/gnome-netstatus-wifi-info",
-+ NULL
-+ };
-+
-+ if ( iface == NULL ) {
-+ return ( NULL );
-+ }
-+
-+ if ( ! child_info.started ) {
-+ child_info.started = g_spawn_async_with_pipes( NULL, child_argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL,
-+ NULL, &child_info.pid, &child_info.standard_input,
-+ &child_info.standard_output, &child_info.standard_error, NULL);
-+
-+ if ( child_info.started ) {
-+ g_child_watch_add(child_info.pid, child_watch_func, &child_info);
-+ child_info.in = fdopen( child_info.standard_input, "w");
-+ setbuf(child_info.in, NULL);
-+ child_info.out = fdopen( child_info.standard_output, "r");
-+ setbuf(child_info.out, NULL);
-+ child_info.err = fdopen( child_info.standard_error, "r");
-+ setbuf(child_info.err, NULL);
-+ }
-+ }
-+
-+ if ( child_info.started ) {
-+ char buf[1024];
-+ int n;
-+
-+ fprintf( child_info.in, "%s\n", iface );
-+
-+ if ( fgets( buf, 1024, child_info.out ) == NULL ) {
-+ return(NULL);
-+ }
-+
-+ return( g_strdup( buf ) );
-+ }
-+
-+ return (NULL);
-+}
-+
-+wifi_info_t*
-+netstatus_wifi_info_new( char *essid,
-+ gboolean connected,
-+ char *bssid,
-+ char *bss_mode,
-+ int signal_strength,
-+ char *mode,
-+ char *security,
-+ char *auth_mode )
-+{
-+ wifi_info_t* wi = g_new0( wifi_info_t, 1 );
-+
-+ wi->essid = g_strdup(essid?essid:"");
-+ wi->connected = connected;
-+ wi->bssid = g_strdup(bssid?bssid:"");
-+ wi->bss_mode = g_strdup(bss_mode?bss_mode:"");
-+ wi->signal_strength = signal_strength;
-+ wi->mode = g_strdup(mode?mode:"");
-+ wi->security = g_strdup(security?security:"");
-+ wi->auth_mode = g_strdup(auth_mode?auth_mode:"");
-+
-+ return( wi );
-+}
-+
-+void
-+netstatus_wifi_info_free( wifi_info_t * wi )
-+{
-+ g_return_if_fail( wi != NULL );
-+
-+ if ( wi->essid )
-+ g_free(wi->essid);
-+ if ( wi->bssid )
-+ g_free(wi->bssid);
-+ if ( wi->bss_mode )
-+ g_free(wi->bss_mode);
-+ if ( wi->mode )
-+ g_free(wi->mode);
-+ if ( wi->security )
-+ g_free(wi->security);
-+ if ( wi->auth_mode )
-+ g_free(wi->auth_mode);
-+
-+ g_free(wi);
-+}
-+
-+wifi_info_t *
-+netstatus_sysdeps_read_iface_wireless_details (const char *iface)
-+{
-+ gchar* str = NULL;
-+ wifi_info_t *wi = NULL;
-+ gboolean is_wireless = FALSE;
-+
- g_return_val_if_fail (iface != NULL, NULL);
-- g_return_val_if_fail (is_wireless != NULL, NULL);
-- g_return_val_if_fail (signal_strength != NULL, NULL);
--
-- if (is_wireless)
-- *is_wireless = FALSE;
-- if (signal_strength)
-- *signal_strength = 0;
-+
-+ if ( (str = read_wireless_info( iface )) == NULL ) {
-+ /* Not wireless, return NULL */
-+ return NULL;
-+ }
-+ else {
-+ gchar** fields = g_strsplit_set( g_strchomp(str), ";", 10 );
-+
-+ is_wireless = (fields[1] != NULL && fields[1][0] == '1')?TRUE:FALSE;
-+
-+ if ( is_wireless ) {
-+ gboolean connected = (fields[2] != NULL && fields[2][0] == '1')?TRUE:FALSE;
-+ char *essid = fields[3];
-+ int signal_strength = (fields[4] != NULL)?atoi(fields[4]):0;
-+ char *mode = fields[5];
-+ char *bssid = fields[6];
-+ char *bss_mode = fields[7];
-+ char *security = fields[8];
-+ char *auth_mode = fields[9];
-+
-+ /* Using the Linux code above, log() will provide a smoother
-+ * transition between signal strengths than simple division */
-+ /* *signal_strength = ((*signal_strength * 100) / 15 ); */
-+ signal_strength = (int) rint ((log (signal_strength) / log (15)) * 100.0);
-+ signal_strength = CLAMP( signal_strength, 0, 100);
-+
-+ wi = netstatus_wifi_info_new( essid,
-+ connected,
-+ bssid,
-+ bss_mode,
-+ signal_strength,
-+ mode,
-+ security,
-+ auth_mode );
-+
-+ }
-+
-+ if ( fields != NULL )
-+ g_strfreev(fields);
-+
-+ g_free( str );
-+ }
-
-- return NULL;
-+ return wi;
- }
-
- #else /* defined(__FreeBSD__) */
-
-diff -up gnome-netstatus-2.26.0/src/netstatus-sysdeps.h.orig gnome-netstatus-2.26.0/src/netstatus-sysdeps.h
---- gnome-netstatus-2.26.0/src/netstatus-sysdeps.h.orig 2009-03-08 05:25:52.000000000 +0000
-+++ gnome-netstatus-2.26.0/src/netstatus-sysdeps.h 2009-03-18 10:39:57.159003615 +0000
-@@ -34,9 +34,36 @@ char *netstatus_sysdeps_read_iface_stati
- gulong *out_packets,
- gulong *in_bytes,
- gulong *out_bytes);
-+#if defined (__sun)
-+
-+typedef struct {
-+ char *essid;
-+ gboolean connected;
-+ char *bssid;
-+ char *bss_mode;
-+ int signal_strength;
-+ char *mode;
-+ char *security;
-+ char *auth_mode;
-+} wifi_info_t;
-+
-+wifi_info_t* netstatus_wifi_info_new( char *essid,
-+ gboolean connected,
-+ char *bssid,
-+ char *bss_mode,
-+ int signal_strength,
-+ char *mode,
-+ char *security,
-+ char *auth_mode );
-+
-+void netstatus_wifi_info_free( wifi_info_t * wi );
-+
-+wifi_info_t *netstatus_sysdeps_read_iface_wireless_details (const char *iface);
-+#else
- char *netstatus_sysdeps_read_iface_wireless_details (const char *iface,
- gboolean *is_wireless,
- int *signal_strength);
-+#endif
-
- G_END_DECLS
-
-
-diff -up gnome-netstatus-2.12.1/src/wifi_info.c-clean gnome-netstatus-2.12.1/src/wifi_info.c
---- gnome-netstatus-2.12.1/src/wifi_info.c-clean 2008-09-17 20:47:28.029413763 +0100
-+++ gnome-netstatus-2.12.1/src/wifi_info.c 2008-09-17 19:18:01.187032954 +0100
-@@ -0,0 +1,379 @@
-+/*
-+ * Simple test program, that takes a wireles device as an argument, and then
-+ * tries to gather various configuration information from it.
-+ */
-+
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <unistd.h>
-+#include <stropts.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <inet/wifi_ioctl.h>
-+#include <net/if_types.h>
-+#include <net/if_dl.h> /*_link_ntoa*/
-+
-+#define TRUE (1)
-+#define FALSE (0)
-+
-+#define DEV_PATH_PREFIX "/dev/"
-+
-+const int debug = 0;
-+
-+wldp_t *gbuf = NULL;
-+
-+int
-+get_value( int fd, wldp_t *buf, int prop_id )
-+{
-+ int rc;
-+ struct strioctl stri;
-+
-+ (void) memset(gbuf, 0, MAX_BUF_LEN);
-+
-+ gbuf->wldp_type = NET_802_11;
-+ gbuf->wldp_id = prop_id;
-+ gbuf->wldp_length = sizeof( wldp_t );
-+ stri.ic_timout = 0;
-+ stri.ic_dp = (char*)gbuf;
-+ stri.ic_cmd = WLAN_GET_PARAM;
-+ stri.ic_len = sizeof( wldp_t );
-+
-+ if ( (rc = ioctl( fd, I_STR, &stri )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_value( %d ): rc = %d\n", prop_id, rc);
-+ return( -1 );
-+ }
-+ return( rc );
-+}
-+
-+int
-+is_connected( int fd )
-+{
-+ int rc;
-+
-+ if ( (rc = get_value( fd, gbuf, WL_LINKSTATUS )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "is_connected: rc = %d\n", rc);
-+ return( -1 );
-+ }
-+
-+ return((*(wl_linkstatus_t *)((gbuf)->wldp_buf) == WL_CONNECTED));
-+}
-+
-+int
-+is_wifi( int fd )
-+{
-+ return( (get_value(fd, gbuf, WL_BSS_TYPE ) < 0 )?FALSE:TRUE );
-+}
-+
-+int
-+get_signal_strength( int fd )
-+{
-+ int rc;
-+
-+ if ( (rc = get_value( fd, gbuf, WL_RSSI )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_signal_strength: rc = %d\n", rc);
-+ return( -1 );
-+ }
-+
-+ return( *(wl_rssi_t *)(gbuf->wldp_buf) ); // Get Signal Value
-+}
-+
-+char*
-+get_essid( int fd )
-+{
-+ char *str;
-+ int rc;
-+
-+ str = calloc(256,sizeof(char));
-+
-+ if ( (rc = get_value( fd, gbuf, WL_ESSID )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_essid: rc = %d\n", rc);
-+ return( str );
-+ }
-+
-+ // Get ESSID Value
-+ (void) strlcpy(str, ((wl_essid_t*)(gbuf->wldp_buf))->wl_essid_essid, 256);
-+ return( str );
-+}
-+
-+extern char *_link_ntoa(const unsigned char *, char *, int, int);
-+
-+char*
-+get_bssid( int fd )
-+{
-+ char *str;
-+ int rc;
-+
-+ str = calloc(256,sizeof(char));
-+
-+ if ( (rc = get_value( fd, gbuf, WL_BSSID )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_bssid: rc = %d\n", rc);
-+ return( str );
-+ }
-+
-+ // Get BSSID Value
-+ _link_ntoa((const unsigned char*)gbuf->wldp_buf, str, 6, IFT_OTHER);
-+
-+ return( str );
-+}
-+
-+const char*
-+get_bss_mode( int fd )
-+{
-+ const char *str;
-+ int rc;
-+ wl_bss_type_t bsstype;
-+
-+ str = "";
-+
-+ if ( (rc = get_value( fd, gbuf, WL_BSS_TYPE )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_bss_mode: rc = %d\n", rc);
-+ return( str );
-+ }
-+
-+ // Get BSS Type Value
-+ bsstype = *(wl_bss_type_t *)(gbuf->wldp_buf);
-+
-+ switch (bsstype) {
-+ case WL_BSS_BSS:
-+ str = "bss";
-+ break;
-+ case WL_BSS_IBSS:
-+ str = "ibss";
-+ break;
-+ case WL_BSS_ANY:
-+ str = "any";
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return( str );
-+}
-+
-+const char*
-+get_encryption( int fd )
-+{
-+ char *str = "none";
-+ int rc;
-+ wl_encryption_t encryption;
-+
-+ if ( (rc = get_value( fd, gbuf, WL_ENCRYPTION )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_encryption: rc = %d\n", rc);
-+
-+ return( str );
-+ }
-+
-+ encryption = *(wl_encryption_t *)(gbuf->wldp_buf);
-+
-+ switch (encryption) {
-+ case WL_ENC_WEP:
-+ str = "wep";
-+ break;
-+ case WL_ENC_WPA:
-+ str = "wpa";
-+ break;
-+ case WL_NOENCRYPTION:
-+ /* fall-through */
-+ default:
-+ /* already default = none */
-+ break;
-+ }
-+
-+ return( str );
-+}
-+
-+const char*
-+get_auth_mode( int fd )
-+{
-+ char *str = "open";
-+ int rc;
-+ wl_authmode_t authmode;
-+
-+ if ( (rc = get_value( fd, gbuf, WL_AUTH_MODE )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_authmode: rc = %d\n", rc);
-+
-+ return( str );
-+ }
-+
-+ authmode = *(wl_authmode_t *)(gbuf->wldp_buf);
-+
-+ switch (authmode) {
-+ case WL_SHAREDKEY:
-+ str = "shared";
-+ break;
-+ case WL_OPENSYSTEM:
-+ /* fall-through */
-+ default:
-+ /* already default = open */
-+ break;
-+ }
-+
-+ return( str );
-+}
-+
-+
-+const char*
-+get_mode( int fd )
-+{
-+ char *str = "";
-+ int rc;
-+ wl_phy_conf_t *phy_conf;
-+
-+ if ( (rc = get_value( fd, gbuf, WL_PHY_CONFIG )) != 0 ) {
-+ if (debug)
-+ fprintf(stderr, "get_mode: rc = %d\n", rc);
-+
-+ return( str );
-+ }
-+
-+ phy_conf = (wl_phy_conf_t *)(gbuf->wldp_buf);
-+
-+ switch (phy_conf->wl_phy_fhss_conf.wl_fhss_subtype) {
-+ case WL_ERP:
-+ str = "g";
-+ break;
-+ case WL_OFDM:
-+ str = "a";
-+ break;
-+ case WL_DSSS:
-+ case WL_FHSS:
-+ str = "b";
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return (str);
-+}
-+
-+int
-+handle_dev( const char* dev )
-+{
-+ char *devpath = NULL;
-+ int fd = -1;
-+ int iswifi = FALSE;
-+ int isconnected = FALSE;
-+ char *essid = NULL;
-+ char *bssid = NULL;
-+ const char *bss_mode = NULL;
-+ const char *mode = NULL;
-+ const char *auth_mode = NULL;
-+ const char *encryption = NULL;
-+ int signal = 0;
-+ const char *dev_no_path = NULL;
-+
-+ if ( dev == NULL ) {
-+ return( 1 );
-+ }
-+
-+ if ( (dev_no_path = strchr(dev, '/')) == NULL ) {
-+ /* Prefix with /dev/net/ */
-+ int buflen = strlen(DEV_PATH_PREFIX) + strlen(dev) + 2;
-+
-+ devpath = malloc( buflen );
-+ (void)snprintf(devpath, buflen, "%s%s", DEV_PATH_PREFIX, dev );
-+
-+ dev_no_path = dev; /* Pass back what was used as arg */
-+ }
-+ else {
-+ devpath = strdup( dev );
-+ dev_no_path++; /* Skip '/' */
-+ }
-+
-+ if ( (fd = open( devpath, O_RDONLY )) < 0 ) {
-+ if ( debug )
-+ fprintf(stderr,"Unable to open dev %s\n", dev);
-+ /* Output something so caller doesn't block waiting for response */
-+ printf("%s;%d;%d;%s;%d;%s;%s;%s;%s\n",
-+ dev_no_path,
-+ iswifi?TRUE:FALSE,
-+ isconnected?TRUE:FALSE,
-+ essid?essid:"",
-+ signal,
-+ mode?mode:"",
-+ bssid?bssid:"",
-+ encryption?encryption:"",
-+ auth_mode?auth_mode:""
-+ );
-+ fflush(stdout);
-+ free(devpath);
-+ return (1);
-+ }
-+
-+ iswifi = is_wifi(fd);
-+ isconnected = is_connected(fd);
-+
-+ if ( iswifi && isconnected ) {
-+
-+ essid = get_essid(fd);
-+ bssid = get_bssid(fd);
-+ bss_mode = get_bss_mode(fd);
-+ mode = get_mode(fd);
-+ auth_mode = get_auth_mode(fd);
-+ encryption = get_encryption(fd);
-+ signal = get_signal_strength(fd);
-+
-+ }
-+
-+ printf("%s;%d;%d;%s;%d;%s;%s;%s;%s;%s\n",
-+ dev_no_path,
-+ iswifi?TRUE:FALSE,
-+ isconnected?TRUE:FALSE,
-+ essid?essid:"",
-+ signal,
-+ mode?mode:"",
-+ bssid?bssid:"",
-+ bss_mode?bss_mode:"",
-+ encryption?encryption:"",
-+ auth_mode?auth_mode:""
-+ );
-+
-+ fflush(stdout);
-+
-+ close(fd);
-+
-+ free(devpath);
-+
-+ if ( essid != NULL ) {
-+ free(essid);
-+ free(bssid);
-+ }
-+
-+ return(0);
-+}
-+
-+int
-+main( int argc, char* argv[] )
-+{
-+ char stdin_buffer[MAXPATHLEN];
-+
-+ if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) {
-+ return (1);
-+ }
-+
-+
-+ setbuf(stdin, NULL );
-+
-+ while ( fgets( stdin_buffer, MAXPATHLEN, stdin ) != NULL ) {
-+ char *eol = strrchr( stdin_buffer, '\n' );
-+ if ( eol != NULL )
-+ *eol = '\0';
-+
-+ handle_dev( stdin_buffer );
-+ }
-+
-+ free(gbuf);
-+
-+ return(0);
-+}
-
-diff -up gnome-netstatus-2.26.0/configure.in.orig gnome-netstatus-2.26.0/configure.in
---- gnome-netstatus-2.26.0/configure.in.orig 2009-03-18 10:39:57.134251059 +0000
-+++ gnome-netstatus-2.26.0/configure.in 2009-03-18 10:39:57.160568707 +0000
-@@ -50,6 +50,11 @@ PKG_CHECK_MODULES(NETSTATUS,
-
- AC_CHECK_HEADERS(sys/sockio.h)
-
-+dnl *** checks for socket, nsl and scf libraries ***
-+AC_CHECK_FUNC(socket,,[AC_CHECK_LIB(socket,socket)])
-+AC_CHECK_FUNC(gethostbyname,,[AC_CHECK_LIB(nsl,gethostbyname)])
-+AC_CHECK_FUNC(smf_get_state,,[AC_CHECK_LIB(scf,smf_get_state)])
-+
- # Blatantly stolen from configure.in in the sample code from
- # "UNIX Network Programming, Volume 1" by W. Richard Stevens
- AC_CACHE_CHECK(if sockaddr has sa_len member,
-@@ -119,6 +124,17 @@ Makefile
- po/Makefile.in
- src/Makefile
- icons/Makefile
-+icons/hicolor/Makefile
-+icons/hicolor/24x24/Makefile
-+icons/hicolor/24x24/status/Makefile
-+icons/hicolor/24x24/emblems/Makefile
-+icons/hicolor/scalable/status/Makefile
-+icons/hicolor/scalable/Makefile
-+icons/hicolor/scalable/emblems/Makefile
-+icons/hicolor/32x32/status/Makefile
-+icons/hicolor/32x32/emblems/Makefile
-+icons/hicolor/32x32/Makefile
-+rbac/Makefile
- help/Makefile
- help/de/Makefile
- help/ja/Makefile
-
-diff -up gnome-netstatus-2.12.1/Makefile.am.orig gnome-netstatus-2.12.1/Makefile.am
---- gnome-netstatus-2.12.1/Makefile.am.orig 2007-02-13 09:39:24.000000000 +0000
-+++ gnome-netstatus-2.12.1/Makefile.am 2008-06-26 13:36:00.710054231 +0100
-@@ -1,4 +1,4 @@
--SUBDIRS = src icons help po packaging
-+SUBDIRS = src icons help po packaging rbac
-
- EXTRA_DIST = \
- MAINTAINERS \
-
-diff -up gnome-netstatus-2.12.1/rbac/Makefile.am.orig gnome-netstatus-2.12.1/rbac/Makefile.am
---- gnome-netstatus-2.12.1/rbac/Makefile.am.orig 2008-06-26 13:17:12.257300719 +0100
-+++ gnome-netstatus-2.12.1/rbac/Makefile.am 2008-06-26 13:18:54.813651469 +0100
-@@ -0,0 +1,7 @@
-+rbacdir = $(sysconfdir)/security
-+
-+rbac_DATA = \
-+ exec_attr \
-+ prof_attr
-+
-+EXTRA_DIST = $(rbac_DATA)
-
-diff -up gnome-netstatus-2.12.1/rbac/exec_attr.orig gnome-netstatus-2.12.1/rbac/exec_attr
---- gnome-netstatus-2.12.1/rbac/exec_attr.orig 2008-06-26 13:17:02.989642393 +0100
-+++ gnome-netstatus-2.12.1/rbac/exec_attr 2008-06-26 13:13:39.792226992 +0100
-@@ -0,0 +1,28 @@
-+# CDDL HEADER START
-+#
-+# The contents of this file are subject to the terms of the
-+# Common Development and Distribution License (the "License").
-+# You may not use this file except in compliance with the License.
-+#
-+# You can obtain a copy of the license at src/sun_nws/OPENSOLARIS.LICENSE
-+# or http://www.opensolaris.org/os/licensing.
-+# See the License for the specific language governing permissions
-+# and limitations under the License.
-+#
-+# When distributing Covered Code, include this CDDL HEADER in each
-+# file and include the License file at src/sun_nws/OPENSOLARIS.LICENSE.
-+# If applicable, add the following below this CDDL HEADER, with the
-+# fields enclosed by brackets "[]" replaced with your own identifying
-+# information: Portions Copyright [yyyy] [name of copyright owner]
-+#
-+# CDDL HEADER END
-+#
-+#
-+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
-+# Use is subject to license terms.
-+#
-+#ident "@(#)exec_attr 1.2 06/09/15 SMI"
-+#
-+# execution attributes for profiles. see exec_attr(4)
-+#
-+Network Wifi Info:solaris:cmd:::/usr/lib/gnome-netstatus-wifi-info:privs=net_rawaccess,file_dac_read;limitprivs=net_rawaccess,file_dac_read,!proc_session,!proc_fork,!proc_exec,!proc_info,!file_link_any
-
-diff -up gnome-netstatus-2.12.1/rbac/prof_attr-clean gnome-netstatus-2.12.1/rbac/prof_attr
---- gnome-netstatus-2.12.1/rbac/prof_attr-clean 2008-08-29 11:08:17.915209911 +0100
-+++ gnome-netstatus-2.12.1/rbac/prof_attr 2008-08-29 11:07:09.995335773 +0100
-@@ -0,0 +1,18 @@
-+# CDDL HEADER START
-+# The contents of this file are subject to the terms of the
-+# Common Development and Distribution License (the "License").
-+# You may not use this file except in compliance with the License.
-+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-+# or http://www.opensolaris.org/os/licensing.
-+# See the License for the specific language governing permissions
-+# and limitations under the License.
-+# When distributing Covered Code, include this CDDL HEADER in each
-+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-+# If applicable, add the following below this CDDL HEADER, with the
-+# fields enclosed by brackets "[]" replaced with your own identifying
-+# information: Portions Copyright [yyyy] [name of copyright owner]
-+# CDDL HEADER END
-+# Copyright (c) 2007 by Sun Microsystems, Inc. All rights reserved.
-+Console User:::Manage System as the Console User:profiles=Network Wifi Info;help=RtConsUser.html
-+Network Wifi Info:::Obtain Wireless Information:
-+Network Management:::Manage the host and network configuration:profiles=Network Wifi Info;help=RtNetMngmnt.html
-
---- gnome-netstatus-2.12.2/src/Makefile.am-orig 2009-01-22 16:01:42.268804000 -0600
-+++ gnome-netstatus-2.12.2/src/Makefile.am 2009-01-22 16:02:39.836807000 -0600
-@@ -8,11 +8,14 @@ INCLUDES = \
- $(NETSTATUS_CFLAGS) \
- $(NETSTATUS_DEBUG_CFLAGS) \
- $(WARN_CFLAGS) \
-- -DNETSTATUS_ICONDIR=\""$(datadir)/icons/gnome-netstatus\"" \
-+ -DNETSTATUS_DATA_DIR=\""$(pkgdatadir)\"" \
- -DNETSTATUS_GLADEDIR=\""$(gladedir)\"" \
- -DGNOMELOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\"
-
--libexec_PROGRAMS = gnome-netstatus-applet
-+libexec_PROGRAMS = gnome-netstatus-applet gnome-netstatus-wifi-info
-+
-+gnome_netstatus_wifi_info_SOURCES = \
-+ wifi_info.c
-
- gnome_netstatus_applet_LDADD = $(NETSTATUS_LIBS) $(KSTAT_LIBS)
-
-diff -up gnome-netstatus-2.26.0/src/gnome-netstatus.glade.orig gnome-netstatus-2.26.0/src/gnome-netstatus.glade
---- gnome-netstatus-2.26.0/src/gnome-netstatus.glade.orig 2009-03-18 12:48:02.044789701 +0000
-+++ gnome-netstatus-2.26.0/src/gnome-netstatus.glade 2009-03-18 12:49:33.603031287 +0000
-@@ -1,1612 +1,1099 @@
--<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
--<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
--
-+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-+<!--*- mode: xml -*-->
- <glade-interface>
--<requires lib="gnome"/>
--
--<widget class="GtkDialog" id="network_status_dialog">
-- <property name="border_width">5</property>
-- <property name="title" translatable="yes"></property>
-- <property name="type">GTK_WINDOW_TOPLEVEL</property>
-- <property name="window_position">GTK_WIN_POS_CENTER</property>
-- <property name="modal">False</property>
-- <property name="default_width">300</property>
-- <property name="resizable">False</property>
-- <property name="destroy_with_parent">False</property>
-- <property name="decorated">True</property>
-- <property name="skip_taskbar_hint">False</property>
-- <property name="skip_pager_hint">False</property>
-- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-- <property name="focus_on_map">True</property>
-- <property name="urgency_hint">False</property>
-- <property name="has_separator">False</property>
--
-- <child internal-child="vbox">
-- <widget class="GtkVBox" id="dialog-vbox2">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">2</property>
--
-- <child internal-child="action_area">
-- <widget class="GtkHButtonBox" id="dialog-action_area2">
-- <property name="visible">True</property>
-- <property name="layout_style">GTK_BUTTONBOX_END</property>
--
-- <child>
-- <widget class="GtkButton" id="helpbutton1">
-- <property name="visible">True</property>
-- <property name="can_default">True</property>
-- <property name="has_default">True</property>
-- <property name="can_focus">True</property>
-- <property name="label">gtk-help</property>
-- <property name="use_stock">True</property>
-- <property name="relief">GTK_RELIEF_NORMAL</property>
-- <property name="focus_on_click">True</property>
-- <property name="response_id">-11</property>
-- </widget>
-- </child>
--
-- <child>
-- <widget class="GtkButton" id="configure_button">
-- <property name="visible">True</property>
-- <property name="can_default">True</property>
-- <property name="can_focus">True</property>
-- <property name="relief">GTK_RELIEF_NORMAL</property>
-- <property name="focus_on_click">True</property>
-- <property name="response_id">0</property>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment2">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">0</property>
-- <property name="yscale">0</property>
-- <property name="top_padding">0</property>
-- <property name="bottom_padding">0</property>
-- <property name="left_padding">0</property>
-- <property name="right_padding">0</property>
--
-- <child>
-- <widget class="GtkHBox" id="hbox5">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">2</property>
--
-- <child>
-- <widget class="GtkImage" id="image2">
-- <property name="visible">True</property>
-- <property name="stock">gtk-preferences</property>
-- <property name="icon_size">4</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label42">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Con_figure</property>
-- <property name="use_underline">True</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- </child>
--
-- <child>
-- <widget class="GtkButton" id="close_button">
-- <property name="visible">True</property>
-- <property name="can_default">True</property>
-- <property name="has_default">True</property>
-- <property name="can_focus">True</property>
-- <property name="label">gtk-close</property>
-- <property name="use_stock">True</property>
-- <property name="relief">GTK_RELIEF_NORMAL</property>
-- <property name="focus_on_click">True</property>
-- <property name="response_id">-7</property>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- <property name="pack_type">GTK_PACK_END</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkNotebook" id="notebook1">
-- <property name="border_width">5</property>
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="show_tabs">True</property>
-- <property name="show_border">True</property>
-- <property name="tab_pos">GTK_POS_TOP</property>
-- <property name="scrollable">False</property>
-- <property name="enable_popup">False</property>
--
-- <child>
-- <widget class="GtkVBox" id="vbox1">
-- <property name="border_width">12</property>
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">18</property>
--
-- <child>
-- <widget class="GtkVBox" id="connection_frame">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkLabel" id="label3">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"><b>Connection</b></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">True</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkHBox" id="hbox6">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">0</property>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment7">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">1</property>
-- <property name="yscale">1</property>
-- <property name="top_padding">0</property>
-- <property name="bottom_padding">0</property>
-- <property name="left_padding">10</property>
-- <property name="right_padding">0</property>
--
-- <child>
-- <widget class="GtkTable" id="connection_table">
-- <property name="visible">True</property>
-- <property name="n_rows">2</property>
-- <property name="n_columns">2</property>
-- <property name="homogeneous">False</property>
-- <property name="row_spacing">6</property>
-- <property name="column_spacing">12</property>
--
-- <child>
-- <widget class="GtkLabel" id="label5">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Status:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="status_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label16">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">_Name:</property>
-- <property name="use_underline">True</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkComboBoxEntry" id="name_combo_box_entry">
-- <property name="visible">True</property>
-- <property name="add_tearoffs">False</property>
-- <property name="has_frame">True</property>
-- <property name="focus_on_click">True</property>
-- <property name="items"> </property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options">fill</property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkHBox" id="connection_hbox">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">0</property>
--
-- <child>
-- <placeholder/>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkVBox" id="activity_frame">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkLabel" id="label4">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"><b>Activity</b></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">True</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment8">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">1</property>
-- <property name="yscale">1</property>
-- <property name="top_padding">0</property>
-- <property name="bottom_padding">0</property>
-- <property name="left_padding">10</property>
-- <property name="right_padding">0</property>
--
-- <child>
-- <widget class="GtkTable" id="table2">
-- <property name="visible">True</property>
-- <property name="n_rows">2</property>
-- <property name="n_columns">2</property>
-- <property name="homogeneous">False</property>
-- <property name="row_spacing">6</property>
-- <property name="column_spacing">12</property>
--
-- <child>
-- <widget class="GtkLabel" id="received_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="sent_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label11">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Received:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label12">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Sent:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkVBox" id="signal_strength_frame">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkLabel" id="label48">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"><b>Signal Strength</b></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">True</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment3">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">1</property>
-- <property name="yscale">1</property>
-- <property name="top_padding">0</property>
-- <property name="bottom_padding">0</property>
-- <property name="left_padding">10</property>
-- <property name="right_padding">0</property>
--
-- <child>
-- <widget class="GtkHBox" id="hbox15">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkProgressBar" id="signal_strength_bar">
-- <property name="visible">True</property>
-- <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
-- <property name="fraction">0</property>
-- <property name="pulse_step">0.10000000149</property>
-- <property name="text" translatable="yes"></property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="signal_strength_label">
-- <property name="visible">True</property>
-- <property name="label">0%</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="tab_expand">False</property>
-- <property name="tab_fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label1">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">General</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="type">tab</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkVBox" id="vbox2">
-- <property name="border_width">12</property>
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">18</property>
--
-- <child>
-- <widget class="GtkVBox" id="inet4_frame">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkLabel" id="label25">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"><b>Internet Protocol (IPv4)</b></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">True</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment4">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">1</property>
-- <property name="yscale">1</property>
-- <property name="top_padding">0</property>
-- <property name="bottom_padding">0</property>
-- <property name="left_padding">10</property>
-- <property name="right_padding">0</property>
--
-- <child>
-- <widget class="GtkTable" id="inet4_table">
-- <property name="visible">True</property>
-- <property name="n_rows">4</property>
-- <property name="n_columns">2</property>
-- <property name="homogeneous">False</property>
-- <property name="row_spacing">6</property>
-- <property name="column_spacing">12</property>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_addr_title">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Address:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_dest_title">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Destination:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_bcast_title">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Broadcast:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">2</property>
-- <property name="bottom_attach">3</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_mask_title">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Subnet Mask:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">3</property>
-- <property name="bottom_attach">4</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_addr_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_dest_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_bcast_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">2</property>
-- <property name="bottom_attach">3</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet4_mask_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">3</property>
-- <property name="bottom_attach">4</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkVBox" id="inet6_frame">
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkLabel" id="label26">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"><b>Internet Protocol (IPv6)</b></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">True</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment6">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">1</property>
-- <property name="yscale">1</property>
-- <property name="top_padding">0</property>
-- <property name="bottom_padding">0</property>
-- <property name="left_padding">10</property>
-- <property name="right_padding">0</property>
--
-- <child>
-- <widget class="GtkTable" id="table5">
-- <property name="visible">True</property>
-- <property name="n_rows">2</property>
-- <property name="n_columns">2</property>
-- <property name="homogeneous">False</property>
-- <property name="row_spacing">6</property>
-- <property name="column_spacing">12</property>
--
-- <child>
-- <widget class="GtkLabel" id="label39">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Address:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label40">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Scope:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet6_addr_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="inet6_scope_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkVBox" id="dev_frame">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkLabel" id="dev_label">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"><b>Network Device</b></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">True</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment5">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">1</property>
-- <property name="yscale">1</property>
-- <property name="top_padding">0</property>
-- <property name="bottom_padding">0</property>
-- <property name="left_padding">10</property>
-- <property name="right_padding">0</property>
--
-- <child>
-- <widget class="GtkTable" id="table6">
-- <property name="visible">True</property>
-- <property name="n_rows">2</property>
-- <property name="n_columns">2</property>
-- <property name="homogeneous">False</property>
-- <property name="row_spacing">6</property>
-- <property name="column_spacing">12</property>
--
-- <child>
-- <widget class="GtkLabel" id="dev_addr_title">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Address:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="dev_addr_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">1</property>
-- <property name="bottom_attach">2</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="dev_type_label">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">True</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">1</property>
-- <property name="right_attach">2</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="dev_type_title">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Type:</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="left_attach">0</property>
-- <property name="right_attach">1</property>
-- <property name="top_attach">0</property>
-- <property name="bottom_attach">1</property>
-- <property name="x_options">fill</property>
-- <property name="y_options"></property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="tab_expand">False</property>
-- <property name="tab_fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label2">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Support</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-- <property name="width_chars">-1</property>
-- <property name="single_line_mode">False</property>
-- <property name="angle">0</property>
-- </widget>
-- <packing>
-- <property name="type">tab</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkVBox" id="vbox3">
-- <property name="border_width">12</property>
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">18</property>
--
-- <child>
-- <widget class="GtkVBox" id="vbox5">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">6</property>
--
-- <child>
-- <widget class="GtkLabel" id="label59">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">You may need to restart ths connection if you want to connect to a different network, or if you are experiencing connection problems.</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">True</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkHBox" id="restart_hbox">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">0</property>
--
-- <child>
-- <widget class="GtkLabel" id="label65">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkVBox" id="vbox6">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">0</property>
--
-- <child>
-- <widget class="GtkButton" id="restart_button">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="relief">GTK_RELIEF_NORMAL</property>
--
-- <child>
-- <widget class="GtkAlignment" id="alignment3">
-- <property name="visible">True</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xscale">0</property>
-- <property name="yscale">0</property>
--
-- <child>
-- <widget class="GtkHBox" id="hbox15">
-- <property name="visible">True</property>
-- <property name="homogeneous">False</property>
-- <property name="spacing">2</property>
--
-- <child>
-- <widget class="GtkImage" id="restart_button_image">
-- <property name="visible">True</property>
-- <property name="stock">gtk-refresh</property>
-- <property name="icon_size">4</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="restart_button_label">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">_Restart</property>
-- <property name="use_underline">True</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label70">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">False</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">False</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="label69">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes"></property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="tab_expand">False</property>
-- <property name="tab_fill">True</property>
-- </packing>
-- </child>
--
-- <child>
-- <widget class="GtkLabel" id="restart_tab_label">
-- <property name="visible">True</property>
-- <property name="label" translatable="yes">Restart</property>
-- <property name="use_underline">False</property>
-- <property name="use_markup">False</property>
-- <property name="justify">GTK_JUSTIFY_LEFT</property>
-- <property name="wrap">False</property>
-- <property name="selectable">False</property>
-- <property name="xalign">0.5</property>
-- <property name="yalign">0.5</property>
-- <property name="xpad">0</property>
-- <property name="ypad">0</property>
-- </widget>
-- <packing>
-- <property name="type">tab</property>
-- </packing>
-- </child>
-- </widget>
-- <packing>
-- <property name="padding">0</property>
-- <property name="expand">True</property>
-- <property name="fill">True</property>
-- </packing>
-- </child>
-- </widget>
-- </child>
--</widget>
--
-+ <widget class="GtkDialog" id="network_status_dialog">
-+ <property name="border_width">5</property>
-+ <property name="resizable">False</property>
-+ <property name="window_position">GTK_WIN_POS_CENTER</property>
-+ <property name="default_width">300</property>
-+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-+ <property name="has_separator">False</property>
-+ <child internal-child="vbox">
-+ <widget class="GtkVBox" id="dialog-vbox2">
-+ <property name="visible">True</property>
-+ <property name="spacing">2</property>
-+ <child>
-+ <widget class="GtkNotebook" id="notebook1">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="border_width">5</property>
-+ <child>
-+ <widget class="GtkVBox" id="vbox1">
-+ <property name="visible">True</property>
-+ <property name="border_width">12</property>
-+ <property name="spacing">18</property>
-+ <child>
-+ <widget class="GtkVBox" id="connection_frame">
-+ <property name="visible">True</property>
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="label3">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes"><b>Connection</b></property>
-+ <property name="use_markup">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="hbox6">
-+ <property name="visible">True</property>
-+ <child>
-+ <widget class="GtkLabel" id="label43">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"> </property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="connection_hbox">
-+ <property name="visible">True</property>
-+ <property name="spacing">12</property>
-+ <child>
-+ <widget class="GtkTable" id="connection_table">
-+ <property name="visible">True</property>
-+ <property name="n_rows">3</property>
-+ <property name="n_columns">2</property>
-+ <property name="column_spacing">12</property>
-+ <property name="row_spacing">6</property>
-+ <child>
-+ <widget class="GtkComboBoxEntry" id="name_combo_box_entry">
-+ <property name="visible">True</property>
-+ <property name="add_tearoffs">False</property>
-+ <property name="has_frame">True</property>
-+ <property name="focus_on_click">True</property>
-+ <property name="items"> </property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <placeholder/>
-+ </child>
-+ <child>
-+ <widget class="GtkCheckButton" id="track_active_interface">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="label" translatable="yes">_Track system active interface</property>
-+ <property name="use_underline">True</property>
-+ <property name="response_id">0</property>
-+ <property name="draw_indicator">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">2</property>
-+ <property name="bottom_attach">3</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label5">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Status:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="status_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label16">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">_Name:</property>
-+ <property name="use_underline">True</property>
-+ </widget>
-+ <packing>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ </widget>
-+ </child>
-+ <child>
-+ <placeholder/>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkVBox" id="activity_frame">
-+ <property name="visible">True</property>
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="label4">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes"><b>Activity</b></property>
-+ <property name="use_markup">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="hbox8">
-+ <property name="visible">True</property>
-+ <child>
-+ <widget class="GtkLabel" id="label44">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"> </property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkTable" id="table2">
-+ <property name="visible">True</property>
-+ <property name="n_rows">2</property>
-+ <property name="n_columns">2</property>
-+ <property name="column_spacing">12</property>
-+ <property name="row_spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="received_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="sent_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label11">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Received:</property>
-+ </widget>
-+ <packing>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label12">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Sent:</property>
-+ <property name="width_chars">2</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkVBox" id="signal_strength_frame">
-+ <property name="visible">True</property>
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="label48">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes"><b>Wireless</b></property>
-+ <property name="use_markup">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkTable" id="table1">
-+ <property name="visible">True</property>
-+ <property name="n_rows">6</property>
-+ <property name="n_columns">2</property>
-+ <property name="column_spacing">12</property>
-+ <property name="row_spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="essid_value_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="bssid_value_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="bssid_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Access Point (BSSID):</property>
-+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="essid_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Network Name (ESSID):</property>
-+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
-+ </widget>
-+ <packing>
-+ <property name="x_options">GTK_FILL</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label6">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Signal Strength:</property>
-+ <property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">5</property>
-+ <property name="bottom_attach">6</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options">GTK_FILL</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="auth_mode_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="yalign">0.49000000953674316</property>
-+ <property name="label" translatable="yes">Authentication Mode:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">4</property>
-+ <property name="bottom_attach">5</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="security_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Security:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">3</property>
-+ <property name="bottom_attach">4</property>
-+ <property name="x_options">GTK_FILL</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="hbox15">
-+ <property name="visible">True</property>
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkProgressBar" id="signal_strength_bar">
-+ <property name="visible">True</property>
-+ </widget>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="signal_strength_label">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">0%</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">5</property>
-+ <property name="bottom_attach">6</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="auth_mode_value_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">4</property>
-+ <property name="bottom_attach">5</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="security_value_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">3</property>
-+ <property name="bottom_attach">4</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="bss_mode_value_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">2</property>
-+ <property name="bottom_attach">3</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="bss_mode_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Operational Mode (BSS):</property>
-+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">2</property>
-+ <property name="bottom_attach">3</property>
-+ <property name="x_options">GTK_FILL</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="position">2</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkCheckButton" id="configure_net_auto_cb">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="label" translatable="yes">Configure network _automatically</property>
-+ <property name="use_underline">True</property>
-+ <property name="response_id">0</property>
-+ <property name="active">True</property>
-+ <property name="draw_indicator">True</property>
-+ </widget>
-+ <packing>
-+ <property name="position">3</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label1">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">General</property>
-+ </widget>
-+ <packing>
-+ <property name="type">tab</property>
-+ <property name="tab_fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkVBox" id="vbox2">
-+ <property name="visible">True</property>
-+ <property name="border_width">12</property>
-+ <property name="spacing">18</property>
-+ <child>
-+ <widget class="GtkVBox" id="inet4_frame">
-+ <property name="visible">True</property>
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="label25">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes"><b>Internet Protocol (IPv4)</b></property>
-+ <property name="use_markup">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="hbox11">
-+ <property name="visible">True</property>
-+ <child>
-+ <widget class="GtkLabel" id="label45">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"> </property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkTable" id="inet4_table">
-+ <property name="visible">True</property>
-+ <property name="n_rows">4</property>
-+ <property name="n_columns">2</property>
-+ <property name="column_spacing">12</property>
-+ <property name="row_spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_addr_title">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Address:</property>
-+ </widget>
-+ <packing>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_dest_title">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Destination:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_bcast_title">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Broadcast:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">2</property>
-+ <property name="bottom_attach">3</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_mask_title">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Subnet Mask:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">3</property>
-+ <property name="bottom_attach">4</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_addr_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_dest_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_bcast_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">2</property>
-+ <property name="bottom_attach">3</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet4_mask_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">3</property>
-+ <property name="bottom_attach">4</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkVBox" id="inet6_frame">
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="label26">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes"><b>Internet Protocol (IPv6)</b></property>
-+ <property name="use_markup">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="hbox12">
-+ <property name="visible">True</property>
-+ <child>
-+ <widget class="GtkLabel" id="label46">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"> </property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkTable" id="table5">
-+ <property name="visible">True</property>
-+ <property name="n_rows">2</property>
-+ <property name="n_columns">2</property>
-+ <property name="column_spacing">12</property>
-+ <property name="row_spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="label39">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Address:</property>
-+ </widget>
-+ <packing>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label40">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Scope:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet6_addr_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="inet6_scope_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkVBox" id="dev_frame">
-+ <property name="visible">True</property>
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="dev_label">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes"><b>Network Device</b></property>
-+ <property name="use_markup">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="hbox13">
-+ <property name="visible">True</property>
-+ <child>
-+ <widget class="GtkLabel" id="label47">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes"> </property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkTable" id="table6">
-+ <property name="visible">True</property>
-+ <property name="n_rows">2</property>
-+ <property name="n_columns">2</property>
-+ <property name="column_spacing">12</property>
-+ <property name="row_spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="dev_addr_title">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Address:</property>
-+ </widget>
-+ <packing>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="dev_addr_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="top_attach">1</property>
-+ <property name="bottom_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="dev_type_label">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="xalign">0</property>
-+ <property name="selectable">True</property>
-+ </widget>
-+ <packing>
-+ <property name="left_attach">1</property>
-+ <property name="right_attach">2</property>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="dev_type_title">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">Type:</property>
-+ </widget>
-+ <packing>
-+ <property name="x_options">GTK_FILL</property>
-+ <property name="y_options"></property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="position">2</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label2">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">Support</property>
-+ </widget>
-+ <packing>
-+ <property name="type">tab</property>
-+ <property name="position">1</property>
-+ <property name="tab_fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkVBox" id="vbox3">
-+ <property name="visible">True</property>
-+ <property name="border_width">12</property>
-+ <property name="spacing">18</property>
-+ <child>
-+ <widget class="GtkVBox" id="vbox5">
-+ <property name="visible">True</property>
-+ <property name="spacing">6</property>
-+ <child>
-+ <widget class="GtkLabel" id="label59">
-+ <property name="visible">True</property>
-+ <property name="xalign">0</property>
-+ <property name="label" translatable="yes">You may need to restart ths connection if you want to connect to a different network, or if you are experiencing connection problems.</property>
-+ <property name="wrap">True</property>
-+ </widget>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkHBox" id="restart_hbox">
-+ <property name="visible">True</property>
-+ <child>
-+ <widget class="GtkLabel" id="label65">
-+ <property name="visible">True</property>
-+ </widget>
-+ </child>
-+ <child>
-+ <widget class="GtkVBox" id="vbox6">
-+ <property name="visible">True</property>
-+ <child>
-+ <widget class="GtkButton" id="restart_button">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="response_id">0</property>
-+ <child>
-+ <widget class="GtkAlignment" id="alignment3">
-+ <property name="visible">True</property>
-+ <property name="xscale">0</property>
-+ <property name="yscale">0</property>
-+ <child>
-+ <widget class="GtkHBox" id="hbox1">
-+ <property name="visible">True</property>
-+ <property name="spacing">2</property>
-+ <child>
-+ <widget class="GtkImage" id="restart_button_image">
-+ <property name="visible">True</property>
-+ <property name="stock">gtk-refresh</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="restart_button_label">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">_Restart</property>
-+ <property name="use_underline">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ </child>
-+ </widget>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label70">
-+ <property name="visible">True</property>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="fill">False</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label69">
-+ <property name="visible">True</property>
-+ </widget>
-+ <packing>
-+ <property name="position">2</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">2</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="restart_tab_label">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">Restart</property>
-+ </widget>
-+ <packing>
-+ <property name="type">tab</property>
-+ <property name="position">2</property>
-+ <property name="tab_fill">False</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ <child internal-child="action_area">
-+ <widget class="GtkHButtonBox" id="dialog-action_area2">
-+ <property name="visible">True</property>
-+ <property name="layout_style">GTK_BUTTONBOX_END</property>
-+ <child>
-+ <widget class="GtkButton" id="helpbutton1">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="can_default">True</property>
-+ <property name="has_default">True</property>
-+ <property name="label">gtk-help</property>
-+ <property name="use_stock">True</property>
-+ <property name="response_id">-11</property>
-+ </widget>
-+ </child>
-+ <child>
-+ <widget class="GtkButton" id="configure_button">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="can_default">True</property>
-+ <property name="response_id">0</property>
-+ <child>
-+ <widget class="GtkAlignment" id="alignment2">
-+ <property name="visible">True</property>
-+ <property name="xscale">0</property>
-+ <property name="yscale">0</property>
-+ <child>
-+ <widget class="GtkHBox" id="hbox5">
-+ <property name="visible">True</property>
-+ <property name="spacing">2</property>
-+ <child>
-+ <widget class="GtkImage" id="image2">
-+ <property name="visible">True</property>
-+ <property name="stock">gtk-preferences</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkLabel" id="label42">
-+ <property name="visible">True</property>
-+ <property name="label" translatable="yes">Con_figure</property>
-+ <property name="use_underline">True</property>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="fill">False</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ </child>
-+ </widget>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
-+ <child>
-+ <widget class="GtkButton" id="close_button">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="can_default">True</property>
-+ <property name="has_default">True</property>
-+ <property name="label">gtk-close</property>
-+ <property name="use_stock">True</property>
-+ <property name="response_id">-7</property>
-+ </widget>
-+ <packing>
-+ <property name="position">2</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ <packing>
-+ <property name="expand">False</property>
-+ <property name="pack_type">GTK_PACK_END</property>
-+ </packing>
-+ </child>
-+ </widget>
-+ </child>
-+ </widget>
- </glade-interface>
-