3 Routines for fetching useful system information
7 Written by Jonas Aaberg <cja@gmx.net> September 2003.
8 Updated for Linux 2.6 August 2004.
26 static char *status_sensors_dir = NULL;
29 static char *status_sensors_get_dir(void)
31 char *chip_dir = NULL, tmp[1024];
36 glob("/sys/bus/i2c/devices/*",GLOB_NOSORT, NULL, &globbuf);
38 for(i=0;i<globbuf.gl_pathc;i++){
39 g_snprintf(tmp,1024,"%s/temp1_input", globbuf.gl_pathv[i]);
40 testfile = fopen(tmp, "r");
42 chip_dir = g_strdup(globbuf.gl_pathv[i]);
50 int status_sensors(int sensor_type)
57 if(sensor_type == SENSORS_TEMP1 || sensor_type == SENSORS_TEMP2 || sensor_type == SENSORS_TEMP3 || sensor_type == SENSORS_TEMP4)
58 sprintf(chip_buff,"%s/temp%d_input",status_sensors_dir, sensor_type);
60 if(sensor_type == SENSORS_FAN1 || sensor_type == SENSORS_FAN2 || sensor_type == SENSORS_FAN3)
61 sprintf(chip_buff,"%s/fan%d_input",status_sensors_dir, sensor_type - SENSORS_TEMP4);
64 status_file = fopen(chip_buff,"r");
65 if(status_file == NULL)
68 fscanf(status_file, "%d", &status);
79 int swap_total, swap_used;
81 swap_file = fopen("/proc/swaps", "r");
83 fscanf(swap_file, "%*s %*s %*s %*s %*s");
84 fscanf(swap_file, "%*s %*s %d %d %*d",
85 &swap_total, &swap_used);
88 return (int)(100*swap_used/swap_total);
91 int status_disc(char *disk)
93 struct statfs stat_buf;
95 if(statfs(disk, &stat_buf)!=0)
97 return (100-(int)((float)stat_buf.f_bavail/(float)stat_buf.f_blocks*100.0));
100 /* returns current CPU load in percent, 0 to 100 */
104 static int firsttimes = 0, current = 0;
105 static int cpu_average_list[CPUSMOOTHNESS];
106 static u_int64_t oload = 0, ototal = 0;
108 unsigned int cpuload;
109 u_int64_t load, total;
110 u_int64_t ab, ac, ad, ae;
114 stat = fopen("/proc/stat", "r");
115 fscanf(stat, "%*s %Ld %Ld %Ld %Ld", &ab, &ac, &ad, &ae);
118 if (firsttimes == 0) {
119 for (i = 0; i < CPUSMOOTHNESS; i++)
120 cpu_average_list[i] = 0;
122 /* Wait until we have CPUSMOOTHNESS messures */
123 if (firsttimes != CPUSMOOTHNESS)
126 /* Find out the CPU load */
129 load = ab + ac + ad; /* cpu.user + cpu.sys; */
130 total = ab + ac + ad + ae; /* cpu.total; */
132 /* Calculates and average from the last CPUSMOOTHNESS messures */
134 cpu_average_list[current] = (100 * (load - oload)) / (total - ototal);
136 cpu_average_list[current] = (load - oload);
139 if (current == CPUSMOOTHNESS)
146 if (firsttimes != CPUSMOOTHNESS)
151 for (i = 0; i < CPUSMOOTHNESS; i++)
152 cpuload += cpu_average_list[i];
154 return (cpuload / CPUSMOOTHNESS);
160 int mem_total, mem_free, mem_buffers, mem_cached;
162 mem_file = fopen("/proc/meminfo", "r");
164 fscanf(mem_file,"MemTotal: %d kB\n",&mem_total);
165 fscanf(mem_file,"MemFree: %d kB\n", &mem_free);
166 fscanf(mem_file,"Buffers: %d kB\n", &mem_buffers);
167 fscanf(mem_file,"Cached: %d kB\n", &mem_cached);
170 return (int) (100*(mem_total - (mem_free + mem_buffers + mem_cached))/mem_total);
173 int status_net(int type, int direction)
176 char dev[256]; /* dummy[256], */
178 char devices[][10] = {{"lo:"},
183 long int recv_bytes=0, sent_bytes=0, work_at=0;
186 static long int old_trans[NET_Y][NET_X];
187 static int first_time = 1;
190 memset(&old_trans,0,NET_Y*NET_X*sizeof(long int));
195 net_file = fopen("/proc/net/dev","r");
198 // fgets(dummy,256,net_file);
199 // fgets(dummy,256,net_file);
201 while(!feof(net_file)){
202 fscanf(net_file,"%s "
210 if(!strcmp(devices[type],dev)){
211 if(direction == NET_RECV)
212 work_at = recv_bytes;
214 work_at = sent_bytes;
220 diff = (int)(work_at - old_trans[type][direction]);
222 if(old_trans[type][direction] == 0)
225 old_trans[type][direction] = work_at;
231 void status_exit(void)
233 if(status_sensors_dir != NULL)
234 g_free(status_sensors_dir);
235 status_sensors_dir = NULL;
238 void status_init(void)
241 status_sensors_dir = status_sensors_get_dir();