--- projects/libstatgrab/src/libstatgrab/memory_stats.c 2003/02/28 22:59:35 1.4 +++ projects/libstatgrab/src/libstatgrab/memory_stats.c 2003/03/05 21:00:59 1.5 @@ -22,12 +22,16 @@ #include "config.h" #endif -#include #include "statgrab.h" #ifdef SOLARIS #include #include #endif +#ifdef LINUX +#include +#include +#include "tools.h" +#endif mem_stat_t *get_memory_stats(){ @@ -40,6 +44,10 @@ mem_stat_t *get_memory_stats(){ long totalmem; int pagesize; #endif +#ifdef LINUX + char *line_ptr; + FILE *f; +#endif #ifdef SOLARIS if((pagesize=sysconf(_SC_PAGESIZE)) == -1){ @@ -67,6 +75,33 @@ mem_stat_t *get_memory_stats(){ mem_stat.total = (long long)totalmem * (long long)pagesize; mem_stat.free = ((long long)kn->value.ul) * (long long)pagesize; mem_stat.used = mem_stat.total - mem_stat.free; +#endif + +#ifdef LINUX + f=fopen("/proc/meminfo", "r"); + if(f==NULL){ + return NULL; + } + + if((line_ptr=f_read_line(f, "Mem:"))==NULL){ + fclose(f); + return NULL; + } + + fclose(f); + + /* Linux actually stores this as a unsigned long long, but + * our structures are just long longs. This shouldn't be a + * problem for sometime yet :) + */ + if((sscanf(line_ptr,"Mem: %lld %lld %lld %*d %*d %lld", \ + &mem_stat.total, \ + &mem_stat.used, \ + &mem_stat.free, \ + &mem_stat.cache))!=4){ + return NULL; + } + #endif return &mem_stat;