diff --exclude-from=/home/dang/.scripts/diffrc -up -ruN gnome-nettool-2.18.0.orig/src/info.c gnome-nettool-2.18.0/src/info.c --- gnome-nettool-2.18.0.orig/src/info.c 2007-02-16 19:53:16.000000000 -0500 +++ gnome-nettool-2.18.0/src/info.c 2007-08-06 20:28:16.000000000 -0400 @@ -20,6 +20,10 @@ #include #include #include +#include +#include +#include +#include #ifdef HAVE_CONFIG_H # include @@ -38,6 +42,11 @@ #include #include #include +#ifdef __FreeBSD__ +#include +#include +#include +#endif #include "info.h" #include "utils.h" @@ -128,9 +137,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); @@ -218,38 +260,87 @@ info_nic_update_stats (gpointer data) 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)); text = info_get_nic (info); if (!text) return FALSE; - + #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 (gchar *) * 12); + 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) { /* @@ -277,7 +368,9 @@ info_nic_update_stats (gpointer data) } g_io_channel_unref (io); -#endif /* defined(__linux__) */ +#if defined(__FreeBSD__) + close (pipe_out); +#endif /* defined(__FreeBSD__) */ return TRUE; } @@ -425,8 +518,19 @@ info_get_nic_information (const gchar *n #ifdef __linux__ mii_data_result data; #endif +#ifdef __FreeBSD__ + gint hwmib[6]; + size_t hwlen; + gchar *hwbuf; + guchar *hwptr; + struct if_msghdr *hwifm; + struct sockaddr_dl *hwsinptr; +#endif - getifaddrs (&ifa0); + if (getifaddrs (&ifa0) != 0) { + g_warning ("getifaddrs failed: %s", g_strerror (errno)); + goto fail; + } for (ifr6 = ifa0; ifr6; ifr6 = ifr6->ifa_next) { if (strcmp (ifr6->ifa_name, nic) != 0) { @@ -510,6 +614,45 @@ info_get_nic_information (const gchar *n (int) ((guchar *) &ifrcopy.ifr_hwaddr.sa_data)[3], (int) ((guchar *) &ifrcopy.ifr_hwaddr.sa_data)[4], (int) ((guchar *) &ifrcopy.ifr_hwaddr.sa_data)[5]); +#elif defined(__FreeBSD__) + hwmib[0] = CTL_NET; + hwmib[1] = AF_ROUTE; + hwmib[2] = 0; + hwmib[3] = AF_LINK; + hwmib[4] = NET_RT_IFLIST; + if ((hwmib[5] = if_nametoindex (nic)) == 0) { + g_sprintf (dst, NOT_AVAILABLE); + goto hwfail; + } + if (sysctl (hwmib, 6, NULL, &hwlen, NULL, 0) < 0) { + g_sprintf (dst, NOT_AVAILABLE); + goto hwfail; + } + if ((hwbuf = g_malloc (hwlen)) == NULL) { + g_sprintf (dst, NOT_AVAILABLE); + goto hwfail; + } + if (sysctl (hwmib, 6, hwbuf, &hwlen, NULL, 0) < 0) { + g_sprintf (dst, NOT_AVAILABLE); + goto hwfail; + } + + hwifm = (struct if_msghdr *) hwbuf; + hwsinptr = (struct sockaddr_dl *) (hwifm + 1); + hwptr = (guchar *) LLADDR (hwsinptr); + if (*hwptr != 0 || *(hwptr + 1) != 0 || + *(hwptr + 2) != 0 || *(hwptr + 3) != 0 || + *(hwptr + 4) != 0 || *(hwptr + 5) != 0) { + g_sprintf (dst, "%02x:%02x:%02x:%02x:%02x:%02x", + *hwptr, *(hwptr + 1), *(hwptr + 2), + *(hwptr + 3), *(hwptr + 4), *(hwptr + 5)); + } + else { + g_sprintf (dst, NOT_AVAILABLE); + } + g_free (hwbuf); + +hwfail: #else g_sprintf (dst, NOT_AVAILABLE); #endif /* SIOCGIFHWADDR */ @@ -625,6 +768,8 @@ info_get_nic_information (const gchar *n } freeifaddrs (ifa0); +fail: + ; } static gint * diff --exclude-from=/home/dang/.scripts/diffrc -up -ruN gnome-nettool-2.18.0.orig/src/lookup.c gnome-nettool-2.18.0/src/lookup.c --- gnome-nettool-2.18.0.orig/src/lookup.c 2007-02-16 19:53:16.000000000 -0500 +++ gnome-nettool-2.18.0/src/lookup.c 2007-08-06 20:28:16.000000000 -0400 @@ -21,6 +21,7 @@ #include #include #include +#include #include "lookup.h" #include "utils.h" diff --exclude-from=/home/dang/.scripts/diffrc -up -ruN gnome-nettool-2.18.0.orig/src/netstat.c gnome-nettool-2.18.0/src/netstat.c --- gnome-nettool-2.18.0.orig/src/netstat.c 2007-02-16 19:53:16.000000000 -0500 +++ gnome-nettool-2.18.0/src/netstat.c 2007-08-06 20:28:16.000000000 -0400 @@ -110,12 +110,17 @@ netstat_get_active_option (Netinfo * net g_return_val_if_fail (netinfo != NULL, NULL); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (netinfo->routing))) { +#ifdef __FreeBSD__ + /* XXX We only support ipv4 now */ + option = g_strdup ("-rn -f inet"); +#else /* Works for Solaris and Linux */ if (netinfo_is_ipv6_enable ()) { option = g_strdup ("-rn -A inet -A inet6"); } else { option = g_strdup ("-rn -A inet"); } +#endif if (netinfo->stbar_text) g_free (netinfo->stbar_text); diff --exclude-from=/home/dang/.scripts/diffrc -up -ruN gnome-nettool-2.18.0.orig/src/nettool.c gnome-nettool-2.18.0/src/nettool.c --- gnome-nettool-2.18.0.orig/src/nettool.c 2007-02-16 19:53:16.000000000 -0500 +++ gnome-nettool-2.18.0/src/nettool.c 2007-08-06 20:28:16.000000000 -0400 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -361,6 +362,10 @@ netinfo_io_text_buffer_dialog (GIOChanne len, NULL); } + g_free (text); + + return TRUE; + } else if (status == G_IO_STATUS_AGAIN) { char buf[1]; @@ -372,12 +377,13 @@ netinfo_io_text_buffer_dialog (GIOChanne } g_string_append_c (netinfo->command_output, buf[0]); } + + g_free (text); + return TRUE; } else if (status == G_IO_STATUS_EOF) { } g_free (text); - - return TRUE; } /* The condition is not G_IO_HUP | G_IO_ERR | G_IO_NVAL, so diff --exclude-from=/home/dang/.scripts/diffrc -up -ruN gnome-nettool-2.18.0.orig/src/utils.c gnome-nettool-2.18.0/src/utils.c --- gnome-nettool-2.18.0.orig/src/utils.c 2007-02-16 19:53:16.000000000 -0500 +++ gnome-nettool-2.18.0/src/utils.c 2007-08-06 20:28:16.000000000 -0400 @@ -24,6 +24,8 @@ on GNOME 2.0 */ #include "utils.h" +#include +#include #include #include @@ -240,7 +242,7 @@ util_legible_bytes (gchar *bytes) const gchar *unit = "B"; gchar *result; - sscanf (bytes, "%lld", &rx); + rx = strtoull (bytes, (char **)NULL, 10); short_rx = rx * 10; if (rx > 1125899906842624ull) {