Here is a slightly more stetic version of the connection information
dialog, rediffed against current CVS.
Any consensus on this? It is pretty simple and definitely needed, in my
opinion. May I commit?
Robert Love
? gnome/applet/wireless-applet.gladep
Index: gnome/applet/applet.c
===
RCS file: /cvs/gnome/NetworkManager/gnome/applet/applet.c,v
retrieving revision 1.17
diff -u -u -r1.17 applet.c
--- gnome/applet/applet.c 23 Jun 2005 20:34:57 - 1.17
+++ gnome/applet/applet.c 26 Jun 2005 04:09:09 -
@@ -33,6 +33,7 @@
#include string.h
#include stdlib.h
+#include unistd.h
#include sys/types.h
#include sys/wait.h
#include ctype.h
@@ -41,6 +42,12 @@
#include math.h
#include dirent.h
#include time.h
+#include sys/ioctl.h
+#include sys/socket.h
+#include netinet/in.h
+#include arpa/inet.h
+#include sys/un.h
+#include net/if.h
#include gtk/gtk.h
#include glib/gi18n.h
@@ -159,8 +166,181 @@
return obj;
}
+static GtkWidget * get_label (GtkWidget *info_dialog, GladeXML *xml, const char *name)
+{
+ GtkWidget *label;
+
+ if (xml != NULL)
+ {
+ label = glade_xml_get_widget (xml, name);
+ g_object_set_data (G_OBJECT (info_dialog), name, label);
+ }
+ else
+ label = g_object_get_data (G_OBJECT (info_dialog), name);
+
+ return label;
+}
+
+static void nmwa_show_socket_err (GtkWidget *info_dialog, const char *err)
+{
+ GtkWidget *error_dialog;
+ char *msg;
+
+ msg = g_strdup_printf (span weight=\bold\ size=\larger\%s/span\n\n%s,
+ _(Error displaying connection information: ), err);
+ error_dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (info_dialog),
+ 0, GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK, msg);
+ gtk_dialog_run (GTK_DIALOG (error_dialog));
+ gtk_widget_destroy (error_dialog);
+ g_free (msg);
+}
+
+static gboolean nmwa_update_info (NMWirelessApplet *applet)
+{
+ GtkWidget *info_dialog;
+ char *addr = NULL, *mask = NULL, *broadcast = NULL;
+ char *dest = NULL, *mac = NULL, *iface_and_type = NULL;
+ GtkWidget *label;
+ struct ifreq ifr;
+ int fd, flags;
+ gboolean ret_val = TRUE;
+ const char *iface;
+ NetworkDevice *dev;
+ gboolean ret = TRUE;
+
+ info_dialog = glade_xml_get_widget (applet-info_dialog_xml, info_dialog);
+ if (!info_dialog)
+ {
+ char *err = g_strdup (_(Could not find some required resources (the glade file)!));
+ nmwa_show_socket_err (info_dialog, err);
+ g_free (err);
+ return FALSE;
+ }
+
+ dev = nmwa_get_first_active_device (applet-gui_device_list);
+ iface = network_device_get_iface (dev);
+ if (!dev || !iface)
+ {
+ char *err = g_strdup (_(No active connections!));
+ nmwa_show_socket_err (info_dialog, err);
+ g_free (err);
+ return FALSE;
+ }
+
+ fd = socket (AF_INET, SOCK_DGRAM, 0);
+ if (fd 0)
+ {
+ char *err = g_strdup (_(Could not open socket!));
+ nmwa_show_socket_err (info_dialog, err);
+ g_free (err);
+ return FALSE;
+ }
+
+ ifr.ifr_addr.sa_family = AF_INET;
+
+ g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name));
+ if (ioctl (fd, SIOCGIFADDR, ifr) == 0)
+ addr = g_strdup (inet_ntoa (((struct sockaddr_in *) ifr.ifr_addr)-sin_addr));
+
+ g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name));
+ if (ioctl (fd, SIOCGIFFLAGS, ifr) 0)
+ {
+ char *err = g_strdup (_(SIOCGIFFLAGS failed on socket!));
+ nmwa_show_socket_err (info_dialog, err);
+ g_free (err);
+ ret = FALSE;
+ goto out;
+ }
+ flags = ifr.ifr_flags;
+
+ g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name));
+ if (flags IFF_BROADCAST ioctl (fd, SIOCGIFBRDADDR, ifr) == 0)
+ broadcast = g_strdup (inet_ntoa (((struct sockaddr_in *) ifr.ifr_broadaddr)-sin_addr));
+
+ g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name));
+ if (ioctl (fd, SIOCGIFNETMASK, ifr) == 0)
+ mask = g_strdup (inet_ntoa (((struct sockaddr_in *) ifr.ifr_addr)-sin_addr));
+
+ g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name));
+ if (flags IFF_POINTOPOINT ioctl (fd, SIOCGIFDSTADDR, ifr) == 0)
+ dest = g_strdup (inet_ntoa (((struct sockaddr_in *) ifr.ifr_dstaddr)-sin_addr));
+
+ g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name));
+ if (ioctl (fd, SIOCGIFHWADDR, ifr) == 0)
+ mac = g_strdup_printf (%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X,
+ (unsigned char) ifr.ifr_hwaddr.sa_data[0],
+ (unsigned char) ifr.ifr_hwaddr.sa_data[1],
+ (unsigned char) ifr.ifr_hwaddr.sa_data[2],
+ (unsigned char) ifr.ifr_hwaddr.sa_data[3],
+ (unsigned char) ifr.ifr_hwaddr.sa_data[4],
+ (unsigned char) ifr.ifr_hwaddr.sa_data[5]);
+
+ label = get_label (info_dialog, applet-info_dialog_xml, label-interface);
+ gtk_label_set_text (GTK_LABEL (label), iface);
+ if (network_device_is_wired (dev))
+ iface_and_type = g_strdup_printf (_(Wired Ethernet (%s)), iface);
+ else
+ iface_and_type = g_strdup_printf (_(Wireless Ethernet (%s)), iface);
+ gtk_label_set_text (GTK_LABEL (label), iface_and_type);
+
+ label = get_label (info_dialog, applet-info_dialog_xml, label-ip-address);
+