--- src/info.c.orig 2022-04-06 01:52:01 UTC +++ src/info.c @@ -20,6 +20,10 @@ #include #include #include +#include +#include +#include +#include #ifdef HAVE_CONFIG_H # include @@ -37,6 +41,9 @@ #include #include #include +#ifdef __FreeBSD__ +#include +#endif #include #include @@ -61,6 +68,7 @@ static InfoInterfaceDescription info_iface_desc [] = { { 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_("Infiniband Interface"), INFO_INTERFACE_IB, "network.png", "ib", NULL }, @@ -132,9 +140,35 @@ info_get_interface_from_dev_name (const gchar *dev_nam { 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_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);