summaryrefslogtreecommitdiffstats
path: root/net/gnome-nettool/files/patch-src_info.c
blob: 88a107e6f825ee6325d2bc48c5290a20c31c2833 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
--- src/info.c.orig 2008-12-08 23:29:39.000000000 -0500
+++ src/info.c  2009-02-27 16:33:49.000000000 -0500
@@ -20,6 +20,10 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <glib/gprintf.h>
+#include <sys/types.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
@@ -37,6 +41,9 @@
 #include <sys/ioctl.h>
 #include <stdlib.h>
 #include <net/if.h>
+#ifdef __FreeBSD__
+#include <net/if_media.h>
+#endif
 
 #include <glibtop.h>
 #include <glibtop/netlist.h>
@@ -61,6 +68,7 @@ static InfoInterfaceDescription info_ifa
    { N_("Ethernet Interface"),      INFO_INTERFACE_ETH,     "16_ethernet.xpm", "eth",        NULL },
    { N_("Wireless Interface"),      INFO_INTERFACE_WLAN,    "wavelan-16.png",  "wlan",       NULL },
    { N_("Modem Interface"),         INFO_INTERFACE_PPP,     "16_ppp.xpm",      "ppp",        NULL },
+   { N_("Modem Interface"),         INFO_INTERFACE_PPP,     "16_ppp.xpm",      "tun",        NULL },
    { N_("Parallel Line Interface"), INFO_INTERFACE_PLIP,    "16_plip.xpm",     "plip",       NULL },
    { N_("Infrared Interface"),      INFO_INTERFACE_IRLAN,   "irda-16.png",     "irlan",      NULL },
    { N_("Loopback Interface"),      INFO_INTERFACE_LO,      "16_loopback.xpm", "lo",         NULL },
@@ -131,9 +139,42 @@ info_get_interface_from_dev_name (const 
 {
    gint i;
    gchar *path;
-   
+   gchar *dev_type = NULL;
+#if defined(__FreeBSD__)
+   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_FDDI:
+               case IFM_TOKEN:
+#ifdef IFM_ATM
+               case IFM_ATM:
+#endif
+                   dev_type = "other_type";
+                   break;
+               case IFM_IEEE80211:
+                   dev_type = "wlan";
+                   break;
+           }
+       }
+       close (s);
+   }
+#endif /* defined(__FreeBSD__) */
+
+   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);