$OpenBSD: patch-src_info_c,v 1.4 2011/06/16 11:01:36 ajacoutot Exp $

https://bugzilla.gnome.org/show_bug.cgi?id=652713
https://bugzilla.gnome.org/show_bug.cgi?id=647896

--- src/info.c.orig	Thu Dec  2 10:26:14 2010
+++ src/info.c	Thu Jun 16 12:43:17 2011
@@ -20,6 +20,12 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <glib/gprintf.h>
+#if defined (__FreeBSD__) || defined (__OpenBSD__)
+#include <sys/types.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#endif
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
@@ -37,6 +43,9 @@
 #include <sys/ioctl.h>
 #include <stdlib.h>
 #include <net/if.h>
+#if defined (__FreeBSD__) || defined (__OpenBSD__)
+#include <net/if_media.h>
+#endif
 
 #include <glibtop.h>
 #include <glibtop/netlist.h>
@@ -131,9 +140,39 @@ info_get_interface_from_dev_name (const gchar *dev_nam
 {
 	gint i;
 	gchar *path;
+	gchar *dev_type = NULL;
 	
+#if defined (__FreeBSD__) || defined (__OpenBSD__)
+	int s;
+	struct ifmediareq ifmr;
+
+	if ((s = socket (AF_INET, SOCK_DGRAM, 0)) > -1) {
+
+		(void) memset (&ifmr, 0, sizeof (ifmr));
+		(void) strncpy (ifmr.ifm_name, dev_name, sizeof (ifmr.ifm_name));
+
+		if (ioctl (s, SIOCGIFMEDIA, (caddr_t) &ifmr) > -1) {
+			switch (IFM_TYPE (ifmr.ifm_active)) {
+				case IFM_ETHER:
+					dev_type = "eth";
+					break;
+				case IFM_IEEE80211:
+					dev_type = "wlan";
+					break;
+				default:
+					dev_type = "other_type";
+					break;
+			}
+		}
+		close (s);
+	}
+#endif /* defined (__FreeBSD__) || defined (__OpenBSD__) */
+
+	if (!dev_type)
+		dev_type = (gchar *) dev_name;
+
 	for (i = 0; info_iface_desc[i].name; i++)
-		if (strstr (dev_name, info_iface_desc[i].prefix) == dev_name) {
+		if (strstr (dev_type, info_iface_desc[i].prefix) == dev_type) {
 			(*iface) = g_strdup_printf ("%s (%s)", _(info_iface_desc[i].name), dev_name);
 			if (info_iface_desc[i].pixbuf == NULL) {
 				path = g_build_filename (PIXMAPS_DIR, info_iface_desc[i].icon, NULL);
@@ -200,13 +239,13 @@ info_load_iface (Netinfo *info)
 	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (info->combo), renderer, TRUE);
 	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (info->combo), renderer,
 					"pixbuf", 0, NULL);
-	g_object_unref (renderer);
+	/* g_object_unref (renderer); */
 
 	renderer = gtk_cell_renderer_text_new ();
 	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (info->combo), renderer, TRUE);
 	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (info->combo), renderer,
 					"markup", 1, NULL);
-	g_object_unref (renderer);
+	/* g_object_unref (renderer); */
 
 	gtk_combo_box_set_active (GTK_COMBO_BOX (info->combo), 0);
 }
