aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--x11/lxpanel/files/patch-src-plugins-netstatus-netstatus-sysdeps.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/x11/lxpanel/files/patch-src-plugins-netstatus-netstatus-sysdeps.c b/x11/lxpanel/files/patch-src-plugins-netstatus-netstatus-sysdeps.c
new file mode 100644
index 000000000000..f7510c6bb7cd
--- /dev/null
+++ b/x11/lxpanel/files/patch-src-plugins-netstatus-netstatus-sysdeps.c
@@ -0,0 +1,204 @@
+--- src/plugins/netstatus/netstatus-sysdeps.c.orig Wed Nov 8 23:12:06 2006
++++ src/plugins/netstatus/netstatus-sysdeps.c Mon Aug 13 11:24:42 2007
+@@ -37,13 +37,26 @@
+
+ #ifdef __FreeBSD__
+ #include <sys/types.h>
++#include <sys/param.h>
+ #include <sys/socket.h>
+ #include <sys/ioctl.h>
++#include <ifaddrs.h>
+ #include <net/if.h>
++#include <net/if_media.h>
+ #include <net/if_var.h>
++#if __FreeBSD_version < 700046
+ #include <dev/an/if_aironet_ieee.h>
+ #include <dev/wi/if_wavelan_ieee.h>
+ #endif
++#if __FreeBSD_version >= 602000
++#include <net80211/ieee80211.h>
++#include <net80211/ieee80211_ioctl.h>
++#endif
++#include <stdlib.h>
++#ifndef IEEE80211_ADDR_COPY
++#define IEEE80211_ADDR_COPY(dst, src) memcpy(dst, src, IEEE80211_ADDR_LEN)
++#endif
++#endif
+
+ static inline gboolean
+ parse_stats (char *buf,
+@@ -426,15 +439,16 @@
+ return TRUE;
+ }
+
++#if __FreeBSD_version < 700046
+ static inline char *
+ get_an_data (const char *iface,
+ int *signal_strength)
+ {
++ struct an_ltv_status *sts;
++ struct an_req areq;
+ #ifdef AN_RID_RSSI_MAP
+ struct an_ltv_rssi_map an_rssimap;
+ #endif
+- struct an_req areq;
+- struct an_ltv_status *sts;
+ int level;
+ char *error = NULL;
+ gboolean rssimap_valid = FALSE;
+@@ -486,11 +500,11 @@
+ level = (int) wreq.wi_val[1];
+
+ #ifdef WI_RID_READ_APS
+- if (signal_strength <= 0)
++ if (level <= 0)
+ {
+ /* we fail to get signal strength by usual means, try another way */
+ static time_t last_scan;
+- static long int cached;
++ static int cached;
+ time_t now;
+
+ now = time (NULL);
+@@ -510,15 +524,15 @@
+ if (nstations > 0)
+ {
+ w = (struct wi_apinfo *)(((char *) &wreq.wi_val) + sizeof (int));
+- signal_strength = (long int) w->signal;
++ level = w->signal;
+ }
+
+- cached = signal_strength;
++ cached = level;
+ last_scan = now;
+ }
+ else
+ {
+- signal_strength = cached;
++ level = cached;
+ }
+ }
+ #endif
+@@ -527,6 +541,77 @@
+
+ return error;
+ }
++#endif
++
++#if __FreeBSD_version >= 602000
++static inline char *
++get_net80211_data (const char *iface,
++ int *signal_strength)
++{
++ struct ieee80211req_sta_info *si;
++ struct ieee80211req ireq;
++ int level;
++ int s;
++ uint8_t mac[IEEE80211_ADDR_LEN];
++ int8_t noise;
++ char *error = NULL;
++ union {
++ struct ieee80211req_sta_req info;
++ char buf[1024];
++ } u_info;
++
++ memset (&u_info, 0, sizeof (u_info));
++ memset (&ireq, 0, sizeof (ireq));
++
++ strlcpy (ireq.i_name, iface, sizeof (ireq.i_name));
++ ireq.i_type = IEEE80211_IOC_BSSID;
++ ireq.i_data = mac;
++ ireq.i_len = IEEE80211_ADDR_LEN;
++
++ s = socket (AF_INET, SOCK_DGRAM, 0);
++ if (s == -1)
++ {
++ error = g_strdup_printf (_("Could not connect to interface, '%s'"), iface);
++ return error;
++ }
++
++ if (ioctl (s, SIOCG80211, &ireq) == -1)
++ {
++ error = g_strdup_printf (_("Could not get MAC for interface, '%s'"), iface);
++ close (s);
++ return error;
++ }
++
++ IEEE80211_ADDR_COPY (u_info.info.is_u.macaddr, mac);
++ ireq.i_type = IEEE80211_IOC_STA_INFO;
++ ireq.i_data = (caddr_t) &u_info;
++ ireq.i_len = sizeof (u_info);
++
++ if (ioctl (s, SIOCG80211, &ireq) == -1)
++ {
++ error = g_strdup_printf (_("Could not send ioctl to interface, '%s'"), iface);
++ close (s);
++ return error;
++ }
++
++ close (s);
++
++ si = &u_info.info.info[0];
++ noise = si->isi_noise;
++ if (si->isi_rssi == 0)
++ level = 0;
++ else
++ {
++ if (noise == 0)
++ noise = -95;
++ level = (int) abs (rint ((si->isi_rssi / (si->isi_rssi/2. + noise)) * 100.0));
++ level = CLAMP (level, 0, 100);
++ }
++
++ memcpy (signal_strength, &level, sizeof (signal_strength));
++ return error;
++}
++#endif
+
+ char *
+ netstatus_sysdeps_read_iface_wireless_details (const char *iface,
+@@ -548,21 +633,44 @@
+ g_strncasecmp (iface, "wi", 2) &&
+ g_strncasecmp (iface, "ath", 3) &&
+ g_strncasecmp (iface, "ndis", 4) &&
++ g_strncasecmp (iface, "ural", 4) &&
++ g_strncasecmp (iface, "ral", 3) &&
+ g_strncasecmp (iface, "ipw", 3) &&
+ g_strncasecmp (iface, "iwi", 3) &&
++ g_strncasecmp (iface, "rum", 3) &&
++ g_strncasecmp (iface, "ray", 3) &&
+ g_strncasecmp (iface, "acx", 3))
+ return error_message;
+
++#if __FreeBSD_version < 700046
+ if (g_strncasecmp (iface, "an", 2) == 0)
+ {
+ error_message = get_an_data (iface, signal_strength);
+ *is_wireless = TRUE;
+ }
++#endif
++#if __FreeBSD_version >= 602000
++#if __FreeBSD_version < 700046
++ else if (g_strncasecmp (iface, "wi", 2) == 0)
++ {
++ error_message = get_wi_data (iface, signal_strength);
++ *is_wireless = TRUE;
++ }
++ else
++#endif
++ {
++ error_message = get_net80211_data (iface, signal_strength);
++ *is_wireless = TRUE;
++ }
++#else
++#if __FreeBSD_version < 700046
+ else
+ {
+ error_message = get_wi_data (iface, signal_strength);
+ *is_wireless = TRUE;
+ }
++#endif
++#endif
+
+ return error_message;
+ }