File wmmon-1.0b2.patch of Package WindowMaker-applets
--- wmgeneral/wmgeneral.c
+++ wmgeneral/wmgeneral.c
@@ -12,6 +12,8 @@
---
CHANGES:
---
+ 10/10/2003 (Simon Law, sfllaw@debian.org)
+ * changed the parse_rcfile function to use getline instead of fgets.
02/05/1998 (Martijn Pieterse, pieterse@xs4all.nl)
* changed the read_rc_file to parse_rcfile, as suggester by Marcelo E. Magallon
* debugged the parse_rc file.
@@ -21,6 +23,7 @@
*/
+#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -83,17 +86,18 @@
void parse_rcfile(const char *filename, rckeys *keys) {
char *p;
- char temp[128];
+ char *line = NULL;
+ size_t line_size = 0;
char *tokens = " :\t\n";
FILE *fp;
int i,key;
fp = fopen(filename, "r");
if (fp) {
- while (fgets(temp, 128, fp)) {
+ while (getline(&line, &line_size, fp) >= 0) {
key = 0;
while (key >= 0 && keys[key].label) {
- if ((p = strstr(temp, keys[key].label))) {
+ if ((p = strstr(line, keys[key].label))) {
p += strlen(keys[key].label);
p += strspn(p, tokens);
if ((i = strcspn(p, "#\n"))) p[i] = 0;
@@ -270,6 +274,7 @@
unsigned int borderwidth = 1;
XClassHint classHint;
char *display_name = NULL;
+ char *geometry = NULL;
char *wname = argv[0];
XTextProperty name;
@@ -282,7 +287,9 @@
for (i=1; argv[i]; i++) {
if (!strcmp(argv[i], "-display"))
- display_name = argv[i+1];
+ display_name = argv[++i];
+ else if (!strcmp(argv[i], "-geometry"))
+ geometry = argv[++i];
}
if (!(display = XOpenDisplay(display_name))) {
@@ -307,7 +314,11 @@
fore_pix = GetColor("black");
XWMGeometry(display, screen, Geometry, NULL, borderwidth, &mysizehints,
- &mysizehints.x, &mysizehints.y,&mysizehints.width,&mysizehints.height, &dummy);
+ &mysizehints.x, &mysizehints.y,
+ &mysizehints.width, &mysizehints.height, &dummy);
+ if (geometry)
+ XParseGeometry(geometry, &mysizehints.x, &mysizehints.y,
+ &mysizehints.width, &mysizehints.height);
mysizehints.width = 64;
mysizehints.height = 64;
@@ -364,3 +375,6 @@
XMapWindow(display, win);
}
+
+/* vim: sw=4 ts=4 columns=82
+ */
--- wmmon/Makefile
+++ wmmon/Makefile
@@ -7,7 +7,7 @@
.c.o:
- cc -c -O2 -Wall $< -o $*.o
+ cc -c -O2 -Wall $< -o $*.o $(CFLAGS)
wmmon: $(OBJS)
cc -o wmmon $^ $(LIBDIR) $(LIBS)
--- wmmon/wmmon.c
+++ wmmon/wmmon.c
@@ -28,6 +28,12 @@
Changes:
----
+ 15/05/2004 (Simon Law, sfllaw@debian.org)
+ * Support disabling of mode-cycling
+ 23/10/2003 (Simon Law, sfllaw@debian.org)
+ * Eliminated exploitable static buffers
+ * Added -geometry support.
+ * /proc/meminfo support for Linux 2.6
18/05/1998 (Antoine Nulle, warp@xs4all.nl)
* MEM/SWAP/UPTIME only updated when visible
* Using global file descriptors to reduce file
@@ -65,6 +71,7 @@
* First Working Version
*/
+#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
@@ -100,31 +107,28 @@
/* Global Variables */
/********************/
-char *ProgName;
int stat_current = 0; /* now global */
+int mode_cycling = 1; /* Allow mode-cycling */
FILE *fp_meminfo;
FILE *fp_stat;
FILE *fp_loadavg;
/* functions */
-void usage(void);
+void usage(char*);
void printversion(void);
void DrawStats(int *, int, int, int, int);
void DrawStats_io(int *, int, int, int, int);
void wmmon_routine(int, char **);
-void main(int argc, char *argv[]) {
+int main(int argc, char *argv[]) {
int i;
+ char *name = argv[0];
/* Parse Command Line */
- ProgName = argv[0];
- if (strlen(ProgName) >= 5)
- ProgName += (strlen(ProgName) - 5);
-
for (i=1; i<argc; i++) {
char *arg = argv[i];
@@ -132,13 +136,17 @@
switch (arg[1]) {
case 'd' :
if (strcmp(arg+1, "display")) {
- usage();
- exit(1);
+ usage(name);
+ return 1;
}
break;
- case 'v' :
- printversion();
- exit(0);
+ case 'g' :
+ if (strcmp(arg+1, "geometry")) {
+ usage(name);
+ return 1;
+ }
+ case 'l' :
+ mode_cycling = 0;
break;
case 'i' :
stat_current = 1;
@@ -146,15 +154,20 @@
case 's' :
stat_current = 2;
break;
+ case 'v' :
+ printversion();
+ return 0;
default:
- usage();
- exit(0);
- break;
+ usage(name);
+ return 1;
}
}
}
wmmon_routine(argc, argv);
+
+ exit (0);
+
}
/*******************************************************************************\
@@ -214,8 +227,7 @@
long idle;
FILE *fp;
- char temp[128];
- char *p;
+ char *conffile = NULL;
int xpm_X = 0, xpm_Y = 0;
@@ -246,16 +258,21 @@
if (RIGHT_ACTION) right_action = strdup(RIGHT_ACTION);
if (MIDDLE_ACTION) middle_action = strdup(MIDDLE_ACTION);
- strcpy(temp, "/etc/wmmonrc");
- parse_rcfile(temp, wmmon_keys);
+ /* Scan through the .rc files */
+ if (asprintf(&conffile, "/etc/wmmonrc") >= 0) {
+ parse_rcfile(conffile, wmmon_keys);
+ free(conffile);
+ }
- p = getenv("HOME");
- strcpy(temp, p);
- strcat(temp, "/.wmmonrc");
- parse_rcfile(temp, wmmon_keys);
-
- strcpy(temp, "/etc/wmmonrc.fixed");
- parse_rcfile(temp, wmmon_keys);
+ if (asprintf(&conffile, "%s/.wmmonrc", getenv("HOME")) >= 0) {
+ parse_rcfile(conffile, wmmon_keys);
+ free(conffile);
+ }
+
+ if (asprintf(&conffile, "/etc/wmmonrc.fixed") >= 0) {
+ parse_rcfile(conffile, wmmon_keys);
+ free(conffile);
+ }
stat_online = checksysdevs();
@@ -269,26 +286,36 @@
starttime = time(0);
nexttime = starttime + 10;
+ /* Collect information on each panel */
for (i=0; i<stat_online; i++) {
get_statistics(stat_device[i].name, &k, &istat, &idle);
stat_device[i].statlast = istat;
stat_device[i].idlelast = idle;
}
- if (stat_current == 0) DrawStats(stat_device[stat_current].his, 54, 40, 5, 58);
- if (stat_current == 1) {
- DrawStats_io(stat_device[stat_current].his, 54, 40, 5, 58);
- }
- if (stat_current == 2) {
- xpm_X = 64;
- setMaskXY(-64, 0);
- } else {
- xpm_X = 0;
- setMaskXY(0, 0);
+
+ /* Set the mask for the current window */
+ switch (stat_current) {
+ case 0:
+ case 1:
+ xpm_X = 0;
+ setMaskXY(0, 0);
+ break;
+ case 2:
+ xpm_X = 64;
+ setMaskXY(-64, 0);
+ default:
+ break;
}
+
+ /* Draw statistics */
+ if (stat_current == 0)
+ DrawStats(stat_device[stat_current].his, 54, 40, 5, 58);
+ if (stat_current == 1)
+ DrawStats_io(stat_device[stat_current].his, 54, 40, 5, 58);
DrawActive(stat_device[stat_current].name);
while (1) {
- curtime = time(0);
+ curtime = time(NULL);
waitpid(0, NULL, WNOHANG);
@@ -377,6 +404,9 @@
if (curtime >= nexttime) {
nexttime+=10;
+ if (curtime > nexttime) /* dont let APM suspends make this crazy */
+ nexttime = curtime;
+
for (i=0; i<stat_online; i++) {
if (stat_device[i].his[54])
stat_device[i].his[54] /= stat_device[i].hisaddcnt;
@@ -411,7 +441,7 @@
break;
case ButtonRelease:
i = CheckMouseRegion(Event.xbutton.x, Event.xbutton.y);
- if (but_stat == i && but_stat >= 0) {
+ if (but_stat == i && but_stat >= 0 && mode_cycling) {
switch (but_stat) {
case 0:
switch (Event.xbutton.button) {
@@ -430,7 +460,6 @@
}
case 1:
stat_current++;
- printf("current stat is :%d\n", stat_current);
if (stat_current == stat_online)
stat_current = 0;
@@ -499,43 +528,80 @@
void update_stat_mem(stat_dev *st, stat_dev *st2) {
- char temp[128];
+ static char *line = NULL;
+ static size_t line_size = 0;
+
+ unsigned long swapfree;
unsigned long free, shared, buffers, cached;
freopen("/proc/meminfo", "r", fp_meminfo);
- while (fgets(temp, 128, fp_meminfo)) {
- if (strstr(temp, "Mem:")) {
- sscanf(temp, "Mem: %ld %ld %ld %ld %ld %ld",
- &st->rt_idle, &st->rt_stat,
- &free, &shared, &buffers, &cached);
- st->rt_idle >>= 10;
- st->rt_stat -= buffers+cached;
- st->rt_stat >>= 10;
-// break;
- }
- if (strstr(temp, "Swap:")) {
- sscanf(temp, "Swap: %ld %ld", &st2->rt_idle, &st2->rt_stat);
- st2->rt_idle >>= 10;
- st2->rt_stat >>= 10;
- break;
+ while ((getline(&line, &line_size, fp_meminfo)) > 0) {
+ /* The original format for the first two lines of /proc/meminfo was
+ * Mem: total used free shared buffers cached
+ * Swap: total used free
+ *
+ * As of at least 2.5.47 these two lines were removed, so that the
+ * required information has to come from the rest of the lines.
+ * On top of that, used is no longer recorded - you have to work
+ * this out yourself, from total - free.
+ *
+ * So, these changes below should work. They should also work with
+ * older kernels, too, since the new format has been available for
+ * ages.
+ */
+ if (strstr(line, "MemTotal:")) {
+ sscanf(line, "MemTotal: %ld", &st->rt_idle);
+ }
+ else if (strstr(line, "MemFree:")) {
+ sscanf(line, "MemFree: %ld", &free);
+ }
+ else if (strstr(line, "MemShared:")) {
+ sscanf(line, "MemShared: %ld", &shared);
+ }
+ else if (strstr(line, "Buffers:")) {
+ sscanf(line, "Buffers: %ld", &buffers);
+ }
+ else if (strstr(line, "Cached:")) {
+ sscanf(line, "Cached: %ld", &cached);
+ }
+ else if (strstr(line, "SwapTotal:")) {
+ sscanf(line, "SwapTotal: %ld", &st2->rt_idle);
+ }
+ else if (strstr(line, "SwapFree:")) {
+ sscanf(line, "SwapFree: %ld", &swapfree);
}
}
+
+ /* memory use - rt_stat is the amount used, it seems, and this isn't
+ * recorded in current version of /proc/meminfo (as of 2.5.47), so we
+ * calculate it from MemTotal - MemFree
+ */
+ st->rt_stat = st->rt_idle - free;
+ st->rt_stat -= buffers+cached;
+ /* As with the amount of memory used, it's not recorded any more, so
+ * we have to calculate it ourselves.
+ */
+ st2->rt_stat = st2->rt_idle - swapfree;
}
void update_stat_swp(stat_dev *st) {
- char temp[128];
+ static char *line = NULL;
+ static size_t line_size = 0;
+ unsigned long swapfree;
fseek(fp_meminfo, 0, SEEK_SET);
- while (fgets(temp, 128, fp_meminfo)) {
- if (strstr(temp, "Swap:")) {
- sscanf(temp, "Swap: %ld %ld", &st->rt_idle, &st->rt_stat);
- st->rt_idle >>= 10;
- st->rt_stat >>= 10;
- break;
+ while ((getline(&line, &line_size, fp_meminfo)) > 0) {
+ /* As with update_stat_mem(), the format change to /proc/meminfo has
+ * forced some changes here. */
+ if (strstr(line, "SwapTotal:")) {
+ sscanf(line, "SwapTotal: %ld", &st->rt_idle);
+ }
+ else if (strstr(line, "SwapFree:")) {
+ sscanf(line, "SwapFree: %ld", &swapfree);
}
}
-
+ st->rt_stat = st->rt_idle - swapfree;
}
/*******************************************************************************\
@@ -545,11 +611,11 @@
void get_statistics(char *devname, long *is, long *ds, long *idle) {
int i;
- char temp[128];
+ static char *line = NULL;
+ static size_t line_size = 0;
char *p;
char *tokens = " \t\n";
float f;
- long maxdiskio=0;
*is = 0;
*ds = 0;
@@ -557,9 +623,9 @@
if (!strncmp(devname, "cpu", 3)) {
fseek(fp_stat, 0, SEEK_SET);
- while (fgets(temp, 128, fp_stat)) {
- if (strstr(temp, "cpu")) {
- p = strtok(temp, tokens);
+ while ((getline(&line, &line_size, fp_stat)) > 0) {
+ if (strstr(line, "cpu ")) {
+ p = strtok(line, tokens);
/* 1..3, 4 == idle, we don't want idle! */
for (i=0; i<3; i++) {
p = strtok(NULL, tokens);
@@ -577,17 +643,35 @@
if (!strncmp(devname, "i/o", 3)) {
fseek(fp_stat, 0, SEEK_SET);
- while (fgets(temp, 128, fp_stat)) {
- if (strstr(temp, "disk_rio") || strstr(temp, "disk_wio")) {
- p = strtok(temp, tokens);
+ while ((getline(&line, &line_size, fp_stat)) > 0) {
+ if (strstr(line, "disk_rio") || strstr(line, "disk_wio")) {
+ p = strtok(line, tokens);
/* 1..4 */
for (i=0; i<4; i++) {
p = strtok(NULL, tokens);
*ds += atol(p);
}
}
+ else if (strstr(line, "disk_io")) {
+ int val;
+ unsigned int a, b, c, d, e, h, g;
+
+ p = strtok(line, tokens);
+
+ while ((p = strtok(NULL, tokens))) {
+ val = sscanf (p,
+ "(%d,%d):(%d,%d,%d,%d,%d)",
+ &a, &b, &c, &d, &e, &h,
+ &g);
+
+ if (val != 7)
+ continue;
+
+ *ds += d;
+ *ds += h;
+ }
+ }
}
- if (*ds > maxdiskio) maxdiskio = *ds;
}
}
@@ -715,16 +799,17 @@
|* usage *|
\*******************************************************************************/
-void usage(void) {
-
- fprintf(stderr, "\nwmmon - programming: tijno, (de)bugging & design warp, webhosting: bobby\n\n");
- fprintf(stderr, "usage:\n");
- fprintf(stderr, "\t-display <display name>\n");
- fprintf(stderr, "\t-h\tthis screen\n");
- fprintf(stderr, "\t-v\tprint the version number\n");
- fprintf(stderr, "\t-i\tstartup in DiskIO mode\n");
- fprintf(stderr, "\t-s\tstartup in SysInfo mode\n");
- fprintf(stderr, "\n");
+void usage(char *name) {
+ printf("Usage: %s [OPTION]...\n", name);
+ printf("WindowMaker dockapp that displays system information.\n");
+ printf("\n");
+ printf(" -display DISPLAY contact the DISPLAY X server\n");
+ printf(" -geometry GEOMETRY position the clock at GEOMETRY\n");
+ printf(" -l locked view - cannot cycle modes\n");
+ printf(" -i start in Disk I/O mode\n");
+ printf(" -s start in System Info mode\n");
+ printf(" -h display this help and exit\n");
+ printf(" -v output version information and exit\n");
}
/*******************************************************************************\
@@ -733,7 +818,7 @@
void printversion(void) {
- if (!strcmp(ProgName, "wmmon")) {
- fprintf(stderr, "%s\n", WMMON_VERSION);
- }
+ printf("WMMon version %s\n", WMMON_VERSION);
}
+/* vim: sw=4 ts=4 columns=82
+ */