From 8741181adfca4866de91a945d5ba235f3586b74d Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 16 Mar 2004 01:59:15 +0000 Subject: [PATCH] patch from elemental... :) SVN revision: 9361 --- epplets/E-MemWatch.c | 83 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 9 deletions(-) diff --git a/epplets/E-MemWatch.c b/epplets/E-MemWatch.c index 242f24e..1ec3108 100644 --- a/epplets/E-MemWatch.c +++ b/epplets/E-MemWatch.c @@ -48,6 +48,7 @@ Epplet_gadget close_button, mem_bar, swap_bar, mem_label, swap_label, title, cfg_button; int mem_val = 0, swap_val = 0; int show_title = 1; +int kernel_2_6 = 0; static void timer_cb(void *data); static void close_cb(void *data); @@ -58,7 +59,7 @@ static void timer_cb(void *data) { char buff[1024]; - unsigned long total, used, buffers, cached; + unsigned long total, used, buffers, cached, free; #ifdef HAVE_LIBGTOP int check=0; @@ -77,11 +78,33 @@ timer_cb(void *data) { D(("Failed to open /proc/meminfo -- %s\n", strerror(errno))); return; } - fgets(buff, sizeof(buff), fp); /* Ignore the first line */ - fgets(buff, sizeof(buff), fp); - sscanf(buff, "%*s %lu %lu %*u %*u %lu %lu", - &total, &used, &buffers, &cached); -#endif + + if( kernel_2_6 ) { + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu", &total); + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu", &free); + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu", &buffers); + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu", &cached); + + total *= 1024; + free *= 1024; + buffers *= 1024; + cached *= 1024; + used = total - free; + + } else { + + fgets(buff, sizeof(buff), fp); /* Ignore the first line */ + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu %lu %*u %*u %lu %lu", + &total, &used, &buffers, &cached); + } + +#endif /* HAVE_LIBGTOP */ + used -= (buffers + cached); mem_val = (int) ((((float) used) / total) * 100.0); D(("%d = 100 * %lu / %lu\n", (100 * used) / total, used, total)); @@ -107,11 +130,32 @@ timer_cb(void *data) { used=(unsigned long)swap.used; } while (swap.total==0 && swap.used==0 && check++<15); #else - fgets(buff, sizeof(buff), fp); - sscanf(buff, "%*s %lu %lu", &total, &used); + + if( kernel_2_6 ) { + fgets(buff, sizeof(buff), fp); + fgets(buff, sizeof(buff), fp); + fgets(buff, sizeof(buff), fp); + fgets(buff, sizeof(buff), fp); + fgets(buff, sizeof(buff), fp); + fgets(buff, sizeof(buff), fp); + fgets(buff, sizeof(buff), fp); + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu", &total); + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu", &free);; + + total *= 1024; + free *= 1024; + used = total - free; + + } else { + + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %lu %lu", &total, &used); + } fclose(fp); -#endif +#endif /* HAVE_LIBGTOP */ swap_val = (int) ((((float) used) / total) * 100.0); /*printf ("Swap: %lu %lu %d%%\n", total, used, swap_val); */ @@ -194,6 +238,27 @@ main(int argc, char **argv) { int prio; + + /* check for Kernel 2.6 */ + FILE *fp; + char version[8], buff[1024]; + + if ((fp = fopen("/proc/version", "r")) == NULL) { + D(("Failed to open /proc/version -- %s\nWill assume not 2.6 kernel" + , strerror(errno))); + return; + } + + fgets(buff, sizeof(buff), fp); + sscanf(buff, "%*s %*s %s", version); + + if(version[2] == '6') { + kernel_2_6 = 1; + } + + close(fp); + /* end check for Kernel 2.6 */ + atexit(Epplet_cleanup); prio = getpriority(PRIO_PROCESS, getpid()); setpriority(PRIO_PROCESS, getpid(), prio + 10);