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