Howdy Y'all,

Heres a little patch against e16/epplets/E-MemWatch.c to make it work
properly with 2.6 Kernels.

elemental0125

--- E-MemWatch.c.~1.15.~        Wed Jan  5 16:24:00 2000
+++ E-MemWatch.c        Mon Mar 15 20:12:29 2004
@@ -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 @@
 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 @@
     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 @@
     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 @@
 
   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);

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to