3 Routines for fetching useful system information
7 Written by Jonas Aaberg <cja@gmx.net> September 2003.
24 static char *status_sensors_dir;
26 static char *status_sensors_get_dir(void)
32 chip_file = fopen("/proc/sys/dev/sensors/chips","r");
36 chip_name = g_malloc0(1024);
37 fscanf(chip_file,"%d %s\n",&foo, chip_name);
42 int status_sensors(int sensor_type)
45 float status1f, status2f, status3f;
49 if(sensor_type == SENSORS_TEMP1 || sensor_type == SENSORS_TEMP2)
50 sprintf(chip_buff,"/proc/sys/dev/sensors/%s/temp%d",status_sensors_dir, sensor_type);
51 if(sensor_type == SENSORS_FAN1 || sensor_type == SENSORS_FAN2)
52 sprintf(chip_buff,"/proc/sys/dev/sensors/%s/fan%d",status_sensors_dir, sensor_type-2);
55 status_file = fopen(chip_buff,"r");
56 if(status_file == NULL)
59 if(sensor_type == SENSORS_TEMP1 || sensor_type == SENSORS_TEMP2){
60 fscanf(status_file,"%f %f %f\n", &status1f, &status2f, &status3f);
65 if(sensor_type == SENSORS_FAN1 || sensor_type == SENSORS_FAN2){
66 fscanf(status_file,"%d %d\n", &status1, &status2);
79 swap_file = fopen("/proc/swaps", "r");
82 fgets(dummy,256,swap_file);
83 fscanf(swap_file,"%*s %*s %d %d", &size, &used);
85 return (int)((float)used/(float)size*100.0);
88 int status_disc(char *disk)
90 struct statfs stat_buf;
92 if(statfs(disk, &stat_buf)!=0)
94 return (100-(int)((float)stat_buf.f_bavail/(float)stat_buf.f_blocks*100.0));
97 /* returns current CPU load in percent, 0 to 100 */
101 static int firsttimes = 0, current = 0;
102 static int cpu_average_list[CPUSMOOTHNESS];
103 static u_int64_t oload = 0, ototal = 0;
105 unsigned int cpuload;
106 u_int64_t load, total;
107 u_int64_t ab, ac, ad, ae;
111 stat = fopen("/proc/stat", "r");
112 fscanf(stat, "%*s %Ld %Ld %Ld %Ld", &ab, &ac, &ad, &ae);
115 if (firsttimes == 0) {
116 for (i = 0; i < CPUSMOOTHNESS; i++)
117 cpu_average_list[i] = 0;
119 /* Wait until we have CPUSMOOTHNESS messures */
120 if (firsttimes != CPUSMOOTHNESS)
123 /* Find out the CPU load */
126 load = ab + ac + ad; /* cpu.user + cpu.sys; */
127 total = ab + ac + ad + ae; /* cpu.total; */
129 /* Calculates and average from the last CPUSMOOTHNESS messures */
131 cpu_average_list[current] = (100 * (load - oload)) / (total - ototal);
133 cpu_average_list[current] = (load - oload);
136 if (current == CPUSMOOTHNESS)
143 if (firsttimes != CPUSMOOTHNESS)
148 for (i = 0; i < CPUSMOOTHNESS; i++)
149 cpuload += cpu_average_list[i];
151 return (cpuload / CPUSMOOTHNESS);
158 unsigned int mem_total,mem_used,mem_free, mem_shared, mem_buffers, mem_cached;
160 mem_file = fopen("/proc/meminfo","r");
163 fgets(dummy,256,mem_file);
164 fscanf(mem_file,"%*s %d %d %d %d %d %d\n",
165 &mem_total,&mem_used,&mem_free,&mem_shared,&mem_buffers,&mem_cached);
167 return (int)((float)(mem_used-mem_shared-mem_buffers-mem_cached)/(float)mem_total*100.0);
172 int status_net(int type, int direction)
175 char dummy[256], dev[256];
177 char devices[][10] = {{"lo:"},
182 long int recv_bytes=0, sent_bytes=0, work_at=0;
185 static long int old_trans[NET_Y][NET_X];
186 static int first_time = 1;
189 memset(&old_trans,0,NET_Y*NET_X*sizeof(long int));
194 net_file = fopen("/proc/net/dev","r");
197 fgets(dummy,256,net_file);
198 fgets(dummy,256,net_file);
200 while(!feof(net_file)){
201 fscanf(net_file,"%s "
209 if(!strcmp(devices[type],dev)){
210 if(direction == NET_RECV)
211 work_at = recv_bytes;
213 work_at = sent_bytes;
219 diff = (int)(work_at - old_trans[type][direction]);
221 if(old_trans[type][direction] == 0)
224 old_trans[type][direction] = work_at;
229 void status_init(void)
231 status_sensors_dir= status_sensors_get_dir();
234 void status_exit(void)
236 g_free(status_sensors_dir);