diff options
author | Joe Marcus Clarke <marcus@FreeBSD.org> | 2004-07-05 19:36:26 +0000 |
---|---|---|
committer | Joe Marcus Clarke <marcus@FreeBSD.org> | 2004-07-05 19:36:26 +0000 |
commit | 3d440251017e0a5e603ce2a99fe25dd3108ad272 (patch) | |
tree | fbb792ef54e26896243f4e07fe0a81dc7854ca51 /net/gnome-nettool/files/patch-src_info.c | |
parent | Chase master-site (diff) |
Add gnomenettool after a repo-copy from gnomenetwork. Gnome-nettool is the
netinfo piece of gnome-network broken out into its own distribution.
Gnome-nettool is a MacOS X-like Network Utility that disaplys interface
information as well as front-ends many useful network tools like ping,
netstat, traceroute, host, finger, and whois.
Diffstat (limited to 'net/gnome-nettool/files/patch-src_info.c')
-rw-r--r-- | net/gnome-nettool/files/patch-src_info.c | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/net/gnome-nettool/files/patch-src_info.c b/net/gnome-nettool/files/patch-src_info.c new file mode 100644 index 000000000000..7b6e43a5fcf4 --- /dev/null +++ b/net/gnome-nettool/files/patch-src_info.c @@ -0,0 +1,191 @@ +--- src/info.c.orig Fri Jun 11 07:14:17 2004 ++++ src/info.c Mon Jul 5 15:25:09 2004 +@@ -37,6 +37,9 @@ + #include <sys/ioctl.h> + #include <stdlib.h> + #include <net/if.h> ++#ifdef __FreeBSD__ ++#include <net/if_media.h> ++#endif + + #include "info.h" + #include "utils.h" +@@ -57,10 +60,11 @@ + { 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 }, +- { N_("Unknown Interface"), INFO_INTERFACE_UNKNOWN, "network.png", NULL, NULL }, ++ { N_("Unknown Interface"), INFO_INTERFACE_UNKNOWN, "network.png", "", NULL }, + { NULL, INFO_INTERFACE_UNKNOWN, NULL, NULL, NULL } + }; + +@@ -97,9 +101,39 @@ + { + 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: ++ 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); +@@ -187,17 +221,26 @@ + gchar tx[10], tx_error[10], tx_drop[10], tx_ovr[10]; + */ + gchar iface[30]; /*, flags[30]; */ +- gchar rx_bytes[16], rx_pkt[10], rx_error[10], rx_drop[10], rx_fifo[10]; +- gchar frame[10], compressed[10], multicast[10]; +- gchar tx_bytes[16], tx_pkt[10], tx_error[10], tx_drop[10], tx_fifo[10]; ++ gchar rx_bytes[16], rx_pkt[10], rx_error[10]; ++ gchar tx_bytes[16], tx_pkt[10], tx_error[10]; + gchar collissions[10]; ++#if defined(__linux__) ++ gchar rx_drop[10], rx_fifo[10]; ++ gchar frame[10], compressed[10], multicast[10]; ++ gchar tx_drop[10], tx_fifo[10]; ++#elif defined(__FreeBSD__) ++ char *p; ++ gchar **tokens, **argv; ++ int i; ++ int pipe_out; ++#endif + + GIOChannel *io = NULL; + gchar *line; + gboolean title = TRUE; + const gchar *text; + gchar *text_tx_bytes, *text_rx_bytes; +- ++ + g_return_val_if_fail (info != NULL, FALSE); + + model = gtk_combo_box_get_model (GTK_COMBO_BOX (info->combo)); +@@ -206,21 +249,61 @@ + else + return FALSE; + /*text = gtk_entry_get_text (GTK_ENTRY (info->nic));*/ +- ++ + #if defined(__linux__) + io = g_io_channel_new_file ("/proc/net/dev", "r", NULL); +- ++#elif defined(__FreeBSD__) ++ if (!g_shell_parse_argv ("/usr/bin/netstat -in -b -f link", NULL, &argv, NULL)) { ++ return FALSE; ++ } ++ if (!g_spawn_async_with_pipes (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, &pipe_out, NULL, NULL)) { ++ g_strfreev (argv); ++ return FALSE; ++ } ++ ++ g_strfreev (argv); ++ ++ io = g_io_channel_unix_new (pipe_out); ++#endif /* defined(__linux__) */ ++ + while (g_io_channel_read_line (io, &line, NULL, NULL, NULL) == G_IO_STATUS_NORMAL) { + if (title) { + title = FALSE; + g_free (line); + continue; + } ++#if defined(__linux__) + line = g_strdelimit (line, ":", ' '); + sscanf (line, "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", iface, + rx_bytes, rx_pkt, rx_error, rx_drop, rx_fifo, frame, + compressed, multicast, + tx_bytes, tx_pkt, tx_error, tx_drop, tx_fifo, collissions); ++#elif defined(__FreeBSD__) ++ tokens = (gchar **) g_malloc0 ((sizeof (char)) * (strlen (line) + 2)); ++ p = strtok (line, " \t\n"); ++ /* We only care about 11 fields for now */ ++ for (i = 0; i < 11 && p; i++, p = strtok (NULL, " \t\n")) { ++ tokens[i] = g_strdup (p); ++ } ++ ++ if (i == 0 || i < 10) { ++ g_free (line); ++ g_strfreev (tokens); ++ continue; ++ } ++ ++ g_strlcpy (iface, tokens[0], sizeof (iface)); ++ ++ g_strlcpy (collissions, tokens[--i], sizeof (collissions)); ++ g_strlcpy (tx_bytes, tokens[--i], sizeof (tx_bytes)); ++ g_strlcpy (tx_error, tokens[--i], sizeof (tx_error)); ++ g_strlcpy (tx_pkt, tokens[--i], sizeof (tx_pkt)); ++ g_strlcpy (rx_bytes, tokens[--i], sizeof (rx_bytes)); ++ g_strlcpy (rx_error, tokens[--i], sizeof (rx_error)); ++ g_strlcpy (rx_pkt, tokens[--i], sizeof (rx_pkt)); ++ ++ g_strfreev (tokens); ++#endif /* defined(__linux__) */ + + if (g_ascii_strcasecmp (iface, text) == 0) { + /* +@@ -248,7 +331,9 @@ + } + + g_io_channel_unref (io); +-#endif /* defined(__linux__) */ ++#if defined(__FreeBSD__) ++ close (pipe_out); ++#endif /* defined(__FreeBSD__) */ + + return TRUE; + } +@@ -384,6 +469,7 @@ + mii_data_result data; + + getifaddrs (&ifa0); ++ memset (&data, 0, sizeof (data)); + + for (ifr6 = ifa0; ifr6; ifr6 = ifr6->ifa_next) { + if (strcmp (ifr6->ifa_name, nic) != 0) { +@@ -425,7 +511,9 @@ + ifc.ifc_req = (struct ifreq *) buf; + ioctl (sockfd, SIOCGIFCONF, &ifc); + ++#if defined(__linux__) + data = mii_get_basic (nic); ++#endif /* defined(__linux__) */ + + for (ptr = buf; ptr < buf + ifc.ifc_len;) { + ifr = (struct ifreq *) ptr; |