patch: net/wmwave: more portable data gathering
wmwave works on Prism cards but not on Lucent ones (minipci and PCMCIA tested) since wireq.wi_val is empty. I've patched it to use a more portable way for data acquisition known from gkrellm and other tools. PR: ports/54511 Submitted by: Hendrik Scholz <hendrik@scholz.net> Approved by: Bruce M Simpson <bms@spc.org>
This commit is contained in:
parent
60c908d57b
commit
c8e27ac5dc
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=88055
2 changed files with 93 additions and 97 deletions
|
@ -7,7 +7,7 @@
|
|||
|
||||
PORTNAME= wmwave
|
||||
PORTVERSION= 0.4
|
||||
PORTREVISION= 1
|
||||
PORTREVISION= 2
|
||||
CATEGORIES= net
|
||||
MASTER_SITES= http://www.schuermann.org/~dockapps/dist/
|
||||
DISTNAME= ${PORTNAME}-${PORTVERSION:S/./-/}
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
--- wmwave.c.orig Fri Aug 20 09:44:21 1999
|
||||
+++ wmwave.c Mon Jun 17 18:53:19 2002
|
||||
@@ -1,38 +1,21 @@
|
||||
--- wmwave.c.orig Fri Aug 29 23:52:38 2003
|
||||
+++ wmwave.c Fri Aug 29 23:52:43 2003
|
||||
@@ -1,38 +1,23 @@
|
||||
/*
|
||||
+ * $Id$
|
||||
+ *
|
||||
* wmtop.c -- WindowMaker process view dock app
|
||||
- * wmtop.c -- WindowMaker process view dock app
|
||||
- * Derived by Carsten Schuermann carsten@schuermann.org
|
||||
- * http://www.schuermann.org/~carsten
|
||||
- * from
|
||||
|
@ -12,6 +10,10 @@
|
|||
- * http://www.tanelorn.demon.co.uk
|
||||
- * who derived it
|
||||
- * from code originally contained in wmsysmon by Dave Clark (clarkd@skynet.ca)
|
||||
+ * $Id$
|
||||
+ *
|
||||
+ * wmwave.c -- WindowMaker IEEE802.11 status dock app
|
||||
+ * based on wmtop.c from Dan Piponi
|
||||
+ *
|
||||
* This software is licensed through the GNU General Public License.
|
||||
- * $Log: wmwave.c,v $
|
||||
|
@ -38,6 +40,7 @@
|
|||
- *
|
||||
+ *
|
||||
+ * Authors (in reverse chronological order):
|
||||
+ * Hendrik Scholz <hscholz@raisdorf.net>
|
||||
+ * Bruce M. Simpson <bms@spc.org>
|
||||
+ * Carsten Schuermann <carsten@schuermann.org>
|
||||
+ * Dan Piponi <dan@tanelorn.demon.co.uk>
|
||||
|
@ -52,7 +55,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
@@ -45,313 +28,389 @@
|
||||
@@ -45,313 +30,384 @@
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
|
@ -95,16 +98,18 @@
|
|||
-char wmwave_mask_bits[64*64];
|
||||
-int wmwave_mask_width = 64;
|
||||
-int wmwave_mask_height = 64;
|
||||
-
|
||||
-#define WMWAVE_VERSION "0.4"
|
||||
+char wmwave_mask_bits[64 * 64];
|
||||
+int wmwave_mask_width = 64;
|
||||
+int wmwave_mask_height = 64;
|
||||
+
|
||||
+#define WMWAVE_DEFAULT_INTERFACE "wi0"
|
||||
+#define WMWAVE_VERSION "0.4_FreeBSD"
|
||||
+#define WMWAVE_VERSION "0.4_FreeBSD-2"
|
||||
+
|
||||
+int update_rate = 100000;
|
||||
+char *ProgName;
|
||||
+char *iface = WMWAVE_DEFAULT_INTERFACE;
|
||||
+char *iface = WMWAVE_DEFAULT_INTERFACE;
|
||||
+time_t curtime;
|
||||
+time_t prevtime;
|
||||
+int mode = 0; /* default: no card detected */
|
||||
|
@ -118,8 +123,6 @@
|
|||
+void DrawBar(float percent, int dx, int dy);
|
||||
+void DrawGreenBar(float percent, int dx, int dy);
|
||||
|
||||
-#define WMWAVE_VERSION "0.4"
|
||||
-
|
||||
-int update_rate=100000;
|
||||
-
|
||||
-char *ProgName;
|
||||
|
@ -160,56 +163,74 @@
|
|||
- tx = (float)((float)54 * ((float)percent / (float)100.0));
|
||||
- copyXPMArea(67, 58, tx, 4, dx, dy);
|
||||
- copyXPMArea(67, 43, 54-tx, 4, dx+tx, dy);
|
||||
-}
|
||||
+inline void
|
||||
+DrawGreenBar(float percent, int dx, int dy)
|
||||
+{
|
||||
+ int tx;
|
||||
|
||||
-inline void DrawRedDot() {
|
||||
- copyXPMArea(80, 65, 6, 6, 52, 5);
|
||||
+
|
||||
+ tx = (float)((float)54 * ((float)percent / (float)100.0));
|
||||
+ copyXPMArea(67, 58, tx, 4, dx, dy);
|
||||
+ copyXPMArea(67, 43, 54 - tx, 4, dx + tx, dy);
|
||||
}
|
||||
|
||||
-inline void DrawYellowDot() {
|
||||
- copyXPMArea(86, 65, 6, 6, 52, 5);
|
||||
-inline void DrawRedDot() {
|
||||
- copyXPMArea(80, 65, 6, 6, 52, 5);
|
||||
+inline void
|
||||
+DrawRedDot()
|
||||
+{
|
||||
+ copyXPMArea(80, 65, 6, 6, 52, 5);
|
||||
}
|
||||
|
||||
-inline void DrawGreenDot() {
|
||||
- copyXPMArea(92, 65, 6, 6, 52, 5);
|
||||
-inline void DrawYellowDot() {
|
||||
- copyXPMArea(86, 65, 6, 6, 52, 5);
|
||||
+inline void
|
||||
+DrawYellowDot()
|
||||
+{
|
||||
+ copyXPMArea(86, 65, 6, 6, 52, 5);
|
||||
}
|
||||
|
||||
-inline void DrawEmptyDot() {
|
||||
- copyXPMArea(98, 65, 6, 6, 52, 5);
|
||||
-inline void DrawGreenDot() {
|
||||
- copyXPMArea(92, 65, 6, 6, 52, 5);
|
||||
+inline void
|
||||
+DrawGreenDot()
|
||||
+{
|
||||
+ copyXPMArea(92, 65, 6, 6, 52, 5);
|
||||
}
|
||||
|
||||
-float min (float x, float y) {
|
||||
- if (x < y) {return x;}
|
||||
- else {return y;}
|
||||
-inline void DrawEmptyDot() {
|
||||
- copyXPMArea(98, 65, 6, 6, 52, 5);
|
||||
+inline void
|
||||
+DrawEmptyDot()
|
||||
+{
|
||||
+ copyXPMArea(98, 65, 6, 6, 52, 5);
|
||||
}
|
||||
|
||||
/*
|
||||
- * Find CPU times for all processes
|
||||
-float min (float x, float y) {
|
||||
- if (x < y) {return x;}
|
||||
- else {return y;}
|
||||
+/*
|
||||
+ * XXX: redefining min() to operate on floats is a bad idea;
|
||||
+ * changed to _fmin().
|
||||
+ */
|
||||
+float
|
||||
+_fmin(float x, float y)
|
||||
+{
|
||||
+ if (x < y) {
|
||||
+ return x;
|
||||
+ } else {
|
||||
+ return y;
|
||||
+ }
|
||||
}
|
||||
|
||||
/*
|
||||
- * Find CPU times for all processes
|
||||
+ * XXX: Fetch OS-specific wireless statistics.
|
||||
+ *
|
||||
+ * These are: quality, signal, noise. On NetBSD, the
|
||||
+ * statistics kept on an AP-basis for the driver are valid.
|
||||
+ * On FreeBSD, it is necessary to interrogate the WICACHE.
|
||||
+ * For the purposes of keeping things simple, this code will only
|
||||
+ * look at the first slot in the WICACHE table.
|
||||
*/
|
||||
-void DisplayWireless(void) {
|
||||
- FILE *wireless; // File handle for /proc/net/wireless
|
||||
|
@ -263,7 +284,34 @@
|
|||
- DrawGreenBar(0.0, 4, 55);
|
||||
- break;
|
||||
- };
|
||||
- }
|
||||
+void
|
||||
+DisplayWireless(void)
|
||||
+{
|
||||
+ struct ifreq ifr;
|
||||
+ struct wi_req wireq;
|
||||
+ struct wi_sigcache *wisigsp;
|
||||
+ int *wisigsnp, s, mode, err;
|
||||
+ float link, level, noise;
|
||||
+ enum {
|
||||
+ MODE_NO_CARD = 0,
|
||||
+ MODE_HAVE_CARD = 1
|
||||
+ };
|
||||
+
|
||||
+ s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
+ if (s == -1)
|
||||
+ errx(errno, "socket");
|
||||
+ bzero(&ifr, sizeof(ifr));
|
||||
+ strncpy(ifr.ifr_name, iface, strlen(iface));
|
||||
+ bzero(&wireq, sizeof(wireq));
|
||||
+ wireq.wi_type = WI_RID_COMMS_QUALITY;
|
||||
+ wireq.wi_len = WI_MAX_DATALEN;
|
||||
+ ifr.ifr_data = (void *) &wireq;
|
||||
+
|
||||
+ err = ioctl(s, SIOCGWAVELAN, (caddr_t)&ifr);
|
||||
+ if (err < 0) {
|
||||
+ mode = MODE_NO_CARD;
|
||||
+ goto draw;
|
||||
}
|
||||
- else {
|
||||
- printf ("Wirless device /proc/net/wireless not found\nEnable radio networking and recompile your kernel\n");
|
||||
- exit (0);
|
||||
|
@ -296,63 +344,13 @@
|
|||
- if (strcmp(arg+1, "display")) {
|
||||
- usage();
|
||||
- exit(1);
|
||||
+float
|
||||
+_fmin(float x, float y)
|
||||
+{
|
||||
+ if (x < y) {
|
||||
+ return x;
|
||||
+ } else {
|
||||
+ return y;
|
||||
}
|
||||
- }
|
||||
- break;
|
||||
- case 'g' :
|
||||
- if (strcmp(arg+1, "geometry")) {
|
||||
- usage();
|
||||
- exit(1);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * XXX: Fetch OS-specific wireless statistics.
|
||||
+ *
|
||||
+ * These are: quality, signal, noise. On NetBSD, the
|
||||
+ * statistics kept on an AP-basis for the driver are valid.
|
||||
+ * On FreeBSD, it is necessary to interrogate the WICACHE.
|
||||
+ * For the purposes of keeping things simple, this code will only
|
||||
+ * look at the first slot in the WICACHE table.
|
||||
+ */
|
||||
+void
|
||||
+DisplayWireless(void)
|
||||
+{
|
||||
+ struct ifreq ifr;
|
||||
+ struct wi_req wireq;
|
||||
+ struct wi_sigcache *wisigsp;
|
||||
+ int *wisigsnp, s, mode, err;
|
||||
+ float link, level, noise;
|
||||
+ enum {
|
||||
+ MODE_NO_CARD = 0,
|
||||
+ MODE_HAVE_CARD = 1
|
||||
+ };
|
||||
+
|
||||
+ s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
+ if (s == -1)
|
||||
+ errx(errno, "socket");
|
||||
+ bzero(&ifr, sizeof(ifr));
|
||||
+ strncpy(ifr.ifr_name, iface, strlen(iface));
|
||||
+ bzero(&wireq, sizeof(wireq));
|
||||
+ wireq.wi_type = WI_RID_READ_CACHE;
|
||||
+ wireq.wi_len = WI_MAX_DATALEN;
|
||||
+ ifr.ifr_data = (void *) &wireq;
|
||||
+
|
||||
+ err = ioctl(s, SIOCGWAVELAN, (caddr_t)&ifr);
|
||||
+ if (err < 0) {
|
||||
+ mode = MODE_NO_CARD;
|
||||
+ goto draw;
|
||||
+ }
|
||||
+ wisigsnp = (int *) &wireq.wi_val;
|
||||
+ if (*wisigsnp < 1) {
|
||||
+ mode = MODE_NO_CARD;
|
||||
+ goto draw;
|
||||
}
|
||||
- }
|
||||
- break;
|
||||
- case 'v' :
|
||||
- printversion();
|
||||
|
@ -364,10 +362,10 @@
|
|||
- i++;
|
||||
+
|
||||
+ mode = MODE_HAVE_CARD;
|
||||
+ wisigsp = (struct wi_sigcache *) (wisigsnp+1);
|
||||
+ link = wisigsp->quality * 1.0;
|
||||
+ level = wisigsp->signal * -1.0;
|
||||
+ noise = wisigsp->noise * -1.0;
|
||||
+ link = wireq.wi_val[0];
|
||||
+ level = wireq.wi_val[1];
|
||||
+ noise = wireq.wi_val[2];
|
||||
+
|
||||
+draw:
|
||||
+ /*
|
||||
+ * Print channel information, and signal ratio
|
||||
|
@ -382,9 +380,9 @@
|
|||
+ } else {
|
||||
+ DrawGreenDot();
|
||||
+ };
|
||||
+ BlitString("Link ", 4, 18);
|
||||
+ BlitString("Quality ", 4, 18);
|
||||
+ DrawBar(_fmin((int)(link * 1.8), 100.0), 4, 27);
|
||||
+ BlitString("Level ", 4, 32);
|
||||
+ BlitString("Signal ", 4, 32);
|
||||
+ DrawGreenBar(_fmin((int)(level * 0.3), 100.0), 4, 41);
|
||||
+ BlitString("Noise ", 4, 46);
|
||||
+ DrawGreenBar(_fmin((int)(noise * 0.3), 100.0), 4, 55);
|
||||
|
@ -618,15 +616,6 @@
|
|||
-
|
||||
- }
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-void BlitNum(int num, int x, int y) {
|
||||
- char buf[1024];
|
||||
- int newx=x;
|
||||
-
|
||||
- sprintf(buf, "%03i", num);
|
||||
-
|
||||
- BlitString(buf, newx, y);
|
||||
+void
|
||||
+BlitString(char *name, int x, int y)
|
||||
+{
|
||||
|
@ -653,8 +642,15 @@
|
|||
+
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
}
|
||||
|
||||
-void BlitNum(int num, int x, int y) {
|
||||
- char buf[1024];
|
||||
- int newx=x;
|
||||
-
|
||||
- sprintf(buf, "%03i", num);
|
||||
-
|
||||
- BlitString(buf, newx, y);
|
||||
+void
|
||||
+BlitNum(int num, int x, int y)
|
||||
+{
|
||||
|
|
Loading…
Reference in a new issue