gentoo-overlay/net-analyzer/gnome-nettool/files/gnome-nettool-2.18.0-fbsd.patch

343 lines
9.7 KiB
Diff

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 <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>
@@ -38,6 +42,11 @@
#include <sys/ioctl.h>
#include <stdlib.h>
#include <net/if.h>
+#ifdef __FreeBSD__
+#include <sys/sysctl.h>
+#include <net/if_dl.h>
+#include <net/if_media.h>
+#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 <gtk/gtk.h>
#include <glib/gi18n.h>
#include <glib/gprintf.h>
+#include <sys/types.h>
#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 <string.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <netinet/in.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
@@ -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 <stdlib.h>
+#include <limits.h>
#include <string.h>
#include <glib/gi18n.h>
@@ -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) {