adapated for Maemo
[shermanaquarium] / sherman-aquarium / shermans / status_linux24.c
1 /* 
2
3  Routines for fetching useful system information 
4
5  Linux 2.4 only.
6
7  Written by Jonas Aaberg <cja@gmx.net> September 2003.
8
9  Released under GPL.
10
11 */
12
13
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <unistd.h>
19 #include <sys/vfs.h>
20 #include <gtk/gtk.h>
21
22 #include "status.h"
23
24 static char *status_sensors_dir;
25
26 static char *status_sensors_get_dir(void)
27 {
28     int foo;
29     char *chip_name;
30     FILE *chip_file;
31     
32     chip_file = fopen("/proc/sys/dev/sensors/chips","r");
33     if(chip_file == NULL)
34         return NULL;
35
36     chip_name = g_malloc0(1024);        
37     fscanf(chip_file,"%d %s\n",&foo, chip_name);
38     fclose(chip_file);
39     return chip_name;
40 }
41
42 int status_sensors(int sensor_type)
43 {
44     int status1, status2;
45     float status1f, status2f, status3f;
46     FILE *status_file;
47     char chip_buff[1024];
48
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);
53     
54     
55     status_file = fopen(chip_buff,"r");
56     if(status_file == NULL)
57         return -1;
58
59     if(sensor_type == SENSORS_TEMP1 || sensor_type == SENSORS_TEMP2){
60         fscanf(status_file,"%f %f %f\n", &status1f, &status2f, &status3f);
61         fclose(status_file);
62         return (int)status3f;
63     }
64
65     if(sensor_type == SENSORS_FAN1 || sensor_type == SENSORS_FAN2){
66         fscanf(status_file,"%d %d\n", &status1, &status2);
67         fclose(status_file);
68         return status2;
69     }
70
71     return -1;
72 }
73
74 int status_swap(void)
75 {
76     FILE *swap_file;
77     int size, used;
78     char dummy[256];
79     swap_file = fopen("/proc/swaps", "r");
80     if(swap_file == NULL)
81         return 0;
82     fgets(dummy,256,swap_file);
83     fscanf(swap_file,"%*s %*s %d %d", &size, &used);
84     fclose(swap_file);
85     return (int)((float)used/(float)size*100.0);
86 }       
87
88 int status_disc(char *disk)
89 {
90     struct statfs stat_buf;
91     
92     if(statfs(disk, &stat_buf)!=0)
93         return 0;
94     return (100-(int)((float)stat_buf.f_bavail/(float)stat_buf.f_blocks*100.0));
95 }
96
97 /* returns current CPU load in percent, 0 to 100 */
98
99 int status_cpu(void)
100 {
101     static int firsttimes = 0, current = 0;
102     static int cpu_average_list[CPUSMOOTHNESS];
103     static u_int64_t oload = 0, ototal = 0;
104
105     unsigned int cpuload;
106     u_int64_t load, total;
107     u_int64_t ab, ac, ad, ae;
108     FILE *stat;
109     int i;
110
111     stat = fopen("/proc/stat", "r");
112     fscanf(stat, "%*s %Ld %Ld %Ld %Ld", &ab, &ac, &ad, &ae);
113     fclose(stat);
114
115     if (firsttimes == 0) {
116         for (i = 0; i < CPUSMOOTHNESS; i++)
117             cpu_average_list[i] = 0;
118     }
119     /* Wait until we have CPUSMOOTHNESS messures */
120     if (firsttimes != CPUSMOOTHNESS)
121         firsttimes++;
122
123     /* Find out the CPU load */
124     /* user + sys = load
125      * total = total */
126     load = ab + ac + ad;        /* cpu.user + cpu.sys; */
127     total = ab + ac + ad + ae;  /* cpu.total; */
128
129     /* Calculates and average from the last CPUSMOOTHNESS messures */
130     if(total!=ototal)
131         cpu_average_list[current] = (100 * (load - oload)) / (total - ototal);
132     else
133         cpu_average_list[current] = (load - oload);
134         
135     current++;
136     if (current == CPUSMOOTHNESS)
137         current = 0;
138
139     oload = load;
140     ototal = total;
141
142
143     if (firsttimes != CPUSMOOTHNESS)
144         return 0;
145
146     cpuload = 0;
147
148     for (i = 0; i < CPUSMOOTHNESS; i++)
149         cpuload += cpu_average_list[i];
150
151     return (cpuload / CPUSMOOTHNESS);
152 }
153
154 int status_mem(void)
155 {
156     FILE *mem_file;
157     char dummy[256];
158     unsigned int mem_total,mem_used,mem_free, mem_shared, mem_buffers, mem_cached;
159     
160     mem_file = fopen("/proc/meminfo","r");
161     if(mem_file == NULL)
162         return 0;
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);
166     fclose(mem_file);
167     return (int)((float)(mem_used-mem_shared-mem_buffers-mem_cached)/(float)mem_total*100.0);
168     
169
170 }
171
172 int status_net(int type, int direction)
173 {
174     FILE *net_file;
175     char dummy[256], dev[256];
176
177     char devices[][10] = {{"lo:"},
178                       {"eth0:"},
179                       {"eth1:"},
180                       {"ppp0:"}};
181
182     long int recv_bytes=0, sent_bytes=0, work_at=0;
183     int diff;
184
185     static long int old_trans[NET_Y][NET_X];
186     static int first_time = 1;
187
188     if(first_time){
189         memset(&old_trans,0,NET_Y*NET_X*sizeof(long int));
190         first_time = 0;
191     }
192
193
194     net_file = fopen("/proc/net/dev","r");
195     if(net_file == NULL)
196         return 0;
197     fgets(dummy,256,net_file);
198     fgets(dummy,256,net_file);
199
200     while(!feof(net_file)){
201         fscanf(net_file,"%s "
202                "%ld %*d %*d %*d "
203                "%*d %*d %*d %*d "
204                "%ld %*d %*d %*d "
205                "%*d %*d %*d %*d\n",
206                dev,
207                &recv_bytes,
208                &sent_bytes);
209         if(!strcmp(devices[type],dev)){
210             if(direction == NET_RECV)
211                 work_at = recv_bytes;
212             else
213                 work_at = sent_bytes;
214             break;
215         }
216     }
217     fclose(net_file);
218
219     diff = (int)(work_at - old_trans[type][direction]);
220
221     if(old_trans[type][direction] == 0)
222         diff = 0;
223
224     old_trans[type][direction] = work_at;
225
226     return diff;
227 }
228
229 void status_init(void)
230 {
231     status_sensors_dir= status_sensors_get_dir();
232 }
233
234 void status_exit(void)
235 {
236     g_free(status_sensors_dir);
237 }