summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Marcus Clarke <marcus@FreeBSD.org>2003-02-16 23:32:35 +0000
committerJoe Marcus Clarke <marcus@FreeBSD.org>2003-02-16 23:32:35 +0000
commit5e94494e9c552f20f5cb4b711537d3ea429e8498 (patch)
treeca638a7eae3006eb21482c3c8035d164086cb003
parentUpdate to 1.2.8. (diff)
Add FreeBSD Aironet support to the wireless applet. This uses code
borrowed from ancontrol. It was tested with PC340 and PC350 Aironet cards. Since I don't own any wi-driven cards, I was not able to add support for those. Contributions welcome...
Notes
Notes: svn path=/head/; revision=75669
-rw-r--r--x11/gnome-applets/Makefile1
-rw-r--r--x11/gnome-applets/files/patch-wireless_wireless-applet.c232
-rw-r--r--x11/gnomeapplets2/Makefile1
-rw-r--r--x11/gnomeapplets2/files/patch-wireless_wireless-applet.c232
4 files changed, 466 insertions, 0 deletions
diff --git a/x11/gnome-applets/Makefile b/x11/gnome-applets/Makefile
index b0eeba4d3e62..13d2de49c425 100644
--- a/x11/gnome-applets/Makefile
+++ b/x11/gnome-applets/Makefile
@@ -7,6 +7,7 @@
PORTNAME= gnomeapplets2
PORTVERSION= 2.2.0
+PORTREVISION= 1
CATEGORIES= x11 gnome
MASTER_SITES= ${MASTER_SITE_GNOME}
MASTER_SITE_SUBDIR= sources/gnome-applets/2.2
diff --git a/x11/gnome-applets/files/patch-wireless_wireless-applet.c b/x11/gnome-applets/files/patch-wireless_wireless-applet.c
new file mode 100644
index 000000000000..11615ad4fa10
--- /dev/null
+++ b/x11/gnome-applets/files/patch-wireless_wireless-applet.c
@@ -0,0 +1,232 @@
+--- wireless/wireless-applet.c.orig Sun Feb 16 00:12:42 2003
++++ wireless/wireless-applet.c Sun Feb 16 18:19:34 2003
+@@ -30,12 +30,24 @@
+ #include <math.h>
+ #include <dirent.h>
+
++#ifdef __FreeBSD__
++#include <sys/socket.h>
++#include <sys/ioctl.h>
++#include <net/if.h>
++#include <net/if_var.h>
++#include <dev/an/if_aironet_ieee.h>
++#endif
++
+ #include <gnome.h>
+ #include <panel-applet.h>
+ #include <panel-applet-gconf.h>
+ #include <glade/glade.h>
+
++#ifdef __FreeBSD__
++#define CFG_DEVICE "an0"
++#else
+ #define CFG_DEVICE "eth0"
++#endif
+ #define CFG_UPDATE_INTERVAL 2
+
+ typedef enum {
+@@ -93,6 +105,10 @@
+ WirelessApplet *applet);
+ static void wireless_applet_about_cb (BonoboUIComponent *uic,
+ WirelessApplet *applet);
++#ifdef __FreeBSD__
++static int an_getval(WirelessApplet *applet, char *device, struct an_req *areq);
++static void get_an_data(WirelessApplet *applet, char *device, long int *level);
++#endif
+
+ static const BonoboUIVerb wireless_menu_verbs [] = {
+ BONOBO_UI_UNSAFE_VERB ("WirelessProperties",
+@@ -150,7 +166,9 @@
+ g_free (tmp);
+
+ /* Update the image */
++#ifndef __FreeBSD__
+ percent = CLAMP (percent, 0, 100);
++#endif
+
+ if (applet->pixmaps[percent] != applet->current_pixmap)
+ {
+@@ -234,6 +252,7 @@
+ int percent;
+
+ /* Calculate the percentage based on the link quality */
++#ifndef __FreeBSD__
+ if (level < 0) {
+ percent = -1;
+ } else {
+@@ -244,6 +263,9 @@
+ percent = CLAMP (percent, 0, 100);
+ }
+ }
++#else
++ percent = (int)level;
++#endif
+
+ if (percent < 0) {
+ applet->state = BUSTED_LINK;
+@@ -387,22 +409,107 @@
+ applet->show_dialogs = show;
+ }
+
++#ifdef __FreeBSD__
++static int
++an_getval(WirelessApplet *applet, char *device, struct an_req *areq)
++{
++ struct ifreq ifr;
++ int s;
++
++ bzero((char *)&ifr, sizeof(ifr));
++
++ strlcpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
++ ifr.ifr_data = (caddr_t)areq;
++
++ s = socket(AF_INET, SOCK_DGRAM, 0);
++
++ if (s == -1) {
++ gtk_tooltips_set_tip (applet->tips,
++ GTK_WIDGET (applet),
++ "Socket Error",
++ NULL);
++ return 0;
++ }
++
++ if (ioctl(s, SIOCGAIRONET, &ifr) == -1) {
++ gtk_tooltips_set_tip (applet->tips,
++ GTK_WIDGET (applet),
++ "ioctl Error",
++ NULL);
++ return 0;
++ }
++
++ close(s);
++ return 1;
++}
++
++static void
++get_an_data (WirelessApplet *applet, char *device, long int *level)
++{
++ struct an_req areq;
++ struct an_ltv_status *sts;
++ struct an_ltv_rssi_map an_rssimap;
++ long int signal_strength;
++ int rssimap_valid = 0;
++
++ an_rssimap.an_len = sizeof(an_rssimap);
++ an_rssimap.an_type = AN_RID_RSSI_MAP;
++ rssimap_valid = an_getval(applet, device, (struct an_req*)&an_rssimap);
++
++ areq.an_len = sizeof(areq);
++ areq.an_type = AN_RID_STATUS;
++
++ (void)an_getval(applet, device, &areq);
++
++ sts = (struct an_ltv_status *)&areq;
++ if (rssimap_valid)
++ signal_strength = (long int)(an_rssimap.an_entries[
++ sts->an_normalized_strength].an_rss_pct);
++ else
++ signal_strength = (long int)(sts->an_normalized_strength);
++
++ memcpy(level, &signal_strength, sizeof(level));
++}
++#endif
++
+ /* check stats, modify the state attribute */
+ static void
+ wireless_applet_read_device_state (WirelessApplet *applet)
+ {
+- long int level, noise;
+- double link;
++ long int level;
+ char device[256];
++#ifdef __FreeBSD__
++ struct if_nameindex *ifstart, *ifs;
++#else
++ long int noise;
++ double link;
+ char line[256];
++#endif
+
+ /* resest list of available wireless devices */
+ g_list_foreach (applet->devices, (GFunc)g_free, NULL);
+ g_list_free (applet->devices);
+ applet->devices = NULL;
+
++#ifdef __FreeBSD__
++ ifs = ifstart = if_nameindex();
++#endif
+ /* Here we begin to suck... */
+ do {
++#ifdef __FreeBSD__
++ if (ifs == NULL || ifs->if_name == NULL) {
++ break;
++ }
++ strlcpy(device, ifs->if_name, 6);
++ if (g_strncasecmp(device, "an", 2)==0) {
++ applet->devices = g_list_prepend (applet->devices, g_strdup (device));
++ if (g_strcasecmp(applet->device, device)==0) {
++ get_an_data(applet, device, &level);
++ wireless_applet_update_state (applet, device, 0, level, 0);
++ }
++ }
++ ifs++;
++#else
+ char *ptr;
+
+ fgets (line, 256, applet->file);
+@@ -435,6 +542,7 @@
+ wireless_applet_update_state (applet, device, link, level, noise);
+ }
+ }
++#endif
+ } while (1);
+
+ if (g_list_length (applet->devices)==1) {
+@@ -446,15 +554,21 @@
+ }
+
+ /* rewind the /proc/net/wireless file */
++#ifdef __FreeBSD__
++ if_freenameindex(ifstart);
++#else
+ rewind (applet->file);
++#endif
+ }
+
+ static int
+ wireless_applet_timeout_handler (WirelessApplet *applet)
+ {
++#ifndef __FreeBSD__
+ if (applet->file == NULL) {
+ return FALSE;
+ }
++#endif
+
+ wireless_applet_read_device_state (applet);
+
+@@ -517,6 +631,7 @@
+ static void
+ start_file_read (WirelessApplet *applet)
+ {
++#ifndef __FreeBSD__
+ applet->file = fopen ("/proc/net/wireless", "rt");
+ if (applet->file == NULL) {
+ gtk_tooltips_set_tip (applet->tips,
+@@ -525,6 +640,7 @@
+ NULL);
+ show_error_dialog (_("There doesn't seem to be any wireless devices configured on your system.\nPlease verify your configuration if you think this is incorrect."));
+ }
++#endif
+ }
+
+ static void
+@@ -766,7 +882,9 @@
+ applet->prefs = NULL;
+ }
+
++#ifndef __FreeBSD__
+ fclose (applet->file);
++#endif
+ }
+
+ static GtkWidget *
diff --git a/x11/gnomeapplets2/Makefile b/x11/gnomeapplets2/Makefile
index b0eeba4d3e62..13d2de49c425 100644
--- a/x11/gnomeapplets2/Makefile
+++ b/x11/gnomeapplets2/Makefile
@@ -7,6 +7,7 @@
PORTNAME= gnomeapplets2
PORTVERSION= 2.2.0
+PORTREVISION= 1
CATEGORIES= x11 gnome
MASTER_SITES= ${MASTER_SITE_GNOME}
MASTER_SITE_SUBDIR= sources/gnome-applets/2.2
diff --git a/x11/gnomeapplets2/files/patch-wireless_wireless-applet.c b/x11/gnomeapplets2/files/patch-wireless_wireless-applet.c
new file mode 100644
index 000000000000..11615ad4fa10
--- /dev/null
+++ b/x11/gnomeapplets2/files/patch-wireless_wireless-applet.c
@@ -0,0 +1,232 @@
+--- wireless/wireless-applet.c.orig Sun Feb 16 00:12:42 2003
++++ wireless/wireless-applet.c Sun Feb 16 18:19:34 2003
+@@ -30,12 +30,24 @@
+ #include <math.h>
+ #include <dirent.h>
+
++#ifdef __FreeBSD__
++#include <sys/socket.h>
++#include <sys/ioctl.h>
++#include <net/if.h>
++#include <net/if_var.h>
++#include <dev/an/if_aironet_ieee.h>
++#endif
++
+ #include <gnome.h>
+ #include <panel-applet.h>
+ #include <panel-applet-gconf.h>
+ #include <glade/glade.h>
+
++#ifdef __FreeBSD__
++#define CFG_DEVICE "an0"
++#else
+ #define CFG_DEVICE "eth0"
++#endif
+ #define CFG_UPDATE_INTERVAL 2
+
+ typedef enum {
+@@ -93,6 +105,10 @@
+ WirelessApplet *applet);
+ static void wireless_applet_about_cb (BonoboUIComponent *uic,
+ WirelessApplet *applet);
++#ifdef __FreeBSD__
++static int an_getval(WirelessApplet *applet, char *device, struct an_req *areq);
++static void get_an_data(WirelessApplet *applet, char *device, long int *level);
++#endif
+
+ static const BonoboUIVerb wireless_menu_verbs [] = {
+ BONOBO_UI_UNSAFE_VERB ("WirelessProperties",
+@@ -150,7 +166,9 @@
+ g_free (tmp);
+
+ /* Update the image */
++#ifndef __FreeBSD__
+ percent = CLAMP (percent, 0, 100);
++#endif
+
+ if (applet->pixmaps[percent] != applet->current_pixmap)
+ {
+@@ -234,6 +252,7 @@
+ int percent;
+
+ /* Calculate the percentage based on the link quality */
++#ifndef __FreeBSD__
+ if (level < 0) {
+ percent = -1;
+ } else {
+@@ -244,6 +263,9 @@
+ percent = CLAMP (percent, 0, 100);
+ }
+ }
++#else
++ percent = (int)level;
++#endif
+
+ if (percent < 0) {
+ applet->state = BUSTED_LINK;
+@@ -387,22 +409,107 @@
+ applet->show_dialogs = show;
+ }
+
++#ifdef __FreeBSD__
++static int
++an_getval(WirelessApplet *applet, char *device, struct an_req *areq)
++{
++ struct ifreq ifr;
++ int s;
++
++ bzero((char *)&ifr, sizeof(ifr));
++
++ strlcpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
++ ifr.ifr_data = (caddr_t)areq;
++
++ s = socket(AF_INET, SOCK_DGRAM, 0);
++
++ if (s == -1) {
++ gtk_tooltips_set_tip (applet->tips,
++ GTK_WIDGET (applet),
++ "Socket Error",
++ NULL);
++ return 0;
++ }
++
++ if (ioctl(s, SIOCGAIRONET, &ifr) == -1) {
++ gtk_tooltips_set_tip (applet->tips,
++ GTK_WIDGET (applet),
++ "ioctl Error",
++ NULL);
++ return 0;
++ }
++
++ close(s);
++ return 1;
++}
++
++static void
++get_an_data (WirelessApplet *applet, char *device, long int *level)
++{
++ struct an_req areq;
++ struct an_ltv_status *sts;
++ struct an_ltv_rssi_map an_rssimap;
++ long int signal_strength;
++ int rssimap_valid = 0;
++
++ an_rssimap.an_len = sizeof(an_rssimap);
++ an_rssimap.an_type = AN_RID_RSSI_MAP;
++ rssimap_valid = an_getval(applet, device, (struct an_req*)&an_rssimap);
++
++ areq.an_len = sizeof(areq);
++ areq.an_type = AN_RID_STATUS;
++
++ (void)an_getval(applet, device, &areq);
++
++ sts = (struct an_ltv_status *)&areq;
++ if (rssimap_valid)
++ signal_strength = (long int)(an_rssimap.an_entries[
++ sts->an_normalized_strength].an_rss_pct);
++ else
++ signal_strength = (long int)(sts->an_normalized_strength);
++
++ memcpy(level, &signal_strength, sizeof(level));
++}
++#endif
++
+ /* check stats, modify the state attribute */
+ static void
+ wireless_applet_read_device_state (WirelessApplet *applet)
+ {
+- long int level, noise;
+- double link;
++ long int level;
+ char device[256];
++#ifdef __FreeBSD__
++ struct if_nameindex *ifstart, *ifs;
++#else
++ long int noise;
++ double link;
+ char line[256];
++#endif
+
+ /* resest list of available wireless devices */
+ g_list_foreach (applet->devices, (GFunc)g_free, NULL);
+ g_list_free (applet->devices);
+ applet->devices = NULL;
+
++#ifdef __FreeBSD__
++ ifs = ifstart = if_nameindex();
++#endif
+ /* Here we begin to suck... */
+ do {
++#ifdef __FreeBSD__
++ if (ifs == NULL || ifs->if_name == NULL) {
++ break;
++ }
++ strlcpy(device, ifs->if_name, 6);
++ if (g_strncasecmp(device, "an", 2)==0) {
++ applet->devices = g_list_prepend (applet->devices, g_strdup (device));
++ if (g_strcasecmp(applet->device, device)==0) {
++ get_an_data(applet, device, &level);
++ wireless_applet_update_state (applet, device, 0, level, 0);
++ }
++ }
++ ifs++;
++#else
+ char *ptr;
+
+ fgets (line, 256, applet->file);
+@@ -435,6 +542,7 @@
+ wireless_applet_update_state (applet, device, link, level, noise);
+ }
+ }
++#endif
+ } while (1);
+
+ if (g_list_length (applet->devices)==1) {
+@@ -446,15 +554,21 @@
+ }
+
+ /* rewind the /proc/net/wireless file */
++#ifdef __FreeBSD__
++ if_freenameindex(ifstart);
++#else
+ rewind (applet->file);
++#endif
+ }
+
+ static int
+ wireless_applet_timeout_handler (WirelessApplet *applet)
+ {
++#ifndef __FreeBSD__
+ if (applet->file == NULL) {
+ return FALSE;
+ }
++#endif
+
+ wireless_applet_read_device_state (applet);
+
+@@ -517,6 +631,7 @@
+ static void
+ start_file_read (WirelessApplet *applet)
+ {
++#ifndef __FreeBSD__
+ applet->file = fopen ("/proc/net/wireless", "rt");
+ if (applet->file == NULL) {
+ gtk_tooltips_set_tip (applet->tips,
+@@ -525,6 +640,7 @@
+ NULL);
+ show_error_dialog (_("There doesn't seem to be any wireless devices configured on your system.\nPlease verify your configuration if you think this is incorrect."));
+ }
++#endif
+ }
+
+ static void
+@@ -766,7 +882,9 @@
+ applet->prefs = NULL;
+ }
+
++#ifndef __FreeBSD__
+ fclose (applet->file);
++#endif
+ }
+
+ static GtkWidget *