ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/disk_stats.c
(Generate patch)

Comparing projects/libstatgrab/src/libstatgrab/disk_stats.c (file contents):
Revision 1.3 by tdb, Thu Feb 20 13:19:52 2003 UTC vs.
Revision 1.9 by pajs, Tue Mar 4 12:55:14 2003 UTC

# Line 22 | Line 22
22   #include "config.h"
23   #endif
24  
25 #include "statgrab.h"
25   #include <stdlib.h>
27 #include <stdio.h>
26   #include <string.h>
27 + #include "statgrab.h"
28  
29   #ifdef SOLARIS
30 + #include <stdio.h>
31   #include <sys/mnttab.h>
32 #include <sys/types.h>
32   #include <sys/statvfs.h>
33 <
33 > #include <kstat.h>
34   #define VALID_FS_TYPES {"ufs", "tmpfs"}
35 + #endif
36  
37 + #ifdef LINUX
38 + #include <stdio.h>
39 + #include <sys/vfs.h>
40 + #include <mntent.h>
41 + #define VALID_FS_TYPES {"ext2", "ext3", "xfs", "reiserfs", "vfat", "tmpfs"}
42   #endif
43  
44   #define START_VAL 1
# Line 60 | Line 65 | void init_disk_stat(int start, int end, disk_stat_t *d
65                  
66                  disk_stats++;
67          }
63
68   }
69  
70   disk_stat_t *get_disk_stats(int *entries){
# Line 70 | Line 74 | disk_stat_t *get_disk_stats(int *entries){
74  
75          char *fs_types[] = VALID_FS_TYPES;
76          int x, valid_type;
73
77          int num_disks=0;
75        struct mnttab mp;
76        struct statvfs fs;
78          FILE *f;
79  
80          disk_stat_t *disk_ptr;
81  
82 + #ifdef SOLARIS
83 +        struct mnttab *mp;
84 +        struct statvfs fs;
85 + #endif
86 + #ifdef LINUX
87 +        struct mntent *mp;
88 +        struct statfs fs;
89 + #endif
90 +
91          if(watermark==-1){
92                  disk_stats=malloc(START_VAL * sizeof(disk_stat_t));
93                  if(disk_stats==NULL){
# Line 86 | Line 96 | disk_stat_t *get_disk_stats(int *entries){
96                  watermark=START_VAL;
97                  init_disk_stat(0, watermark-1, disk_stats);
98          }
99 + #ifdef LINUX
100 +        if ((f=setmntent("/etc/mtab", "r" ))==NULL){
101 +                return NULL;
102 +        }
103  
104 +        while((mp=getmntent(f))){
105 +                if((statfs(mp->mnt_dir, &fs)) !=0){
106 +                        continue;
107 +                }      
108  
109 +                valid_type=0;
110 +                for(x=0;x<((sizeof(fs_types))/(sizeof(char*)));x++){
111 +                        if(strcmp(mp->mnt_type, fs_types[x]) ==0){
112 +                                valid_type=1;
113 +                                break;
114 +                        }
115 +                }
116 + #endif
117 +
118 + #ifdef SOLARIS
119          if ((f=fopen("/etc/mnttab", "r" ))==NULL){
120                  return NULL;
121          }
# Line 95 | Line 123 | disk_stat_t *get_disk_stats(int *entries){
123                  if ((statvfs(mp.mnt_mountp, &fs)) !=0){
124                          continue;
125                  }
98
126                  valid_type=0;
127                  for(x=0;x<((sizeof(fs_types))/(sizeof(char*)));x++){
128                          if(strcmp(mp.mnt_fstype, fs_types[x]) ==0){
# Line 103 | Line 130 | disk_stat_t *get_disk_stats(int *entries){
130                                  break;
131                          }
132                  }
133 + #endif
134  
135                  if(valid_type){
136                          if(num_disks>watermark-1){
# Line 117 | Line 145 | disk_stat_t *get_disk_stats(int *entries){
145                          }
146  
147                          disk_ptr=disk_stats+num_disks;
148 <        
148 > #ifdef LINUX
149 >                        if((disk_ptr->device_name=copy_string(disk_ptr->device_name, mp->mnt_fsname))==NULL){
150 >                                return NULL;
151 >                        }
152 >                                
153 >                        if((disk_ptr->fs_type=copy_string(disk_ptr->fs_type, mp->mnt_type))==NULL){    
154 >                                return NULL;
155 >                        }
156 >
157 >                        if((disk_ptr->mnt_point=copy_string(disk_ptr->mnt_point, mp->mnt_dir))==NULL){
158 >                                return NULL;
159 >                        }
160 >                        disk_ptr->size = (long long)fs.f_bsize * (long long)fs.f_blocks;
161 >                        disk_ptr->avail = (long long)fs.f_bsize * (long long)fs.f_bavail;
162 >                        disk_ptr->used = (disk_ptr->size) - ((long long)fs.f_bsize * (long long)fs.f_bfree);
163 >
164 >                        disk_ptr->total_inodes=(long long)fs.f_files;
165 >                        disk_ptr->free_inodes=(long long)fs.f_ffree;
166 >                        /* Linux doesn't have a "available" inodes */
167 >                        disk_ptr->used_inodes=disk_ptr->total_inodes-disk_ptr->free_inodes;
168 > #endif
169 >
170 > #ifdef SOLARIS
171                          /* Memory leak in event of realloc failing */
172                          /* Maybe make this char[bigenough] and do strncpy's and put a null in the end?
173 <                           Downside is its a bit hungry for a lot of mounts, as MNT_MAX_SIZE woul prob be upwards
174 <                           of a k each */
173 >                         * Downside is its a bit hungry for a lot of mounts, as MNT_MAX_SIZE would prob
174 >                         * be upwards of a k each
175 >                         */
176                          if((disk_ptr->device_name=copy_string(disk_ptr->device_name, mp.mnt_special))==NULL){
177                                  return NULL;
178                          }
# Line 141 | Line 192 | disk_stat_t *get_disk_stats(int *entries){
192                          disk_ptr->total_inodes=(long long)fs.f_files;
193                          disk_ptr->used_inodes=disk_ptr->total_inodes - (long long)fs.f_ffree;
194                          disk_ptr->free_inodes=(long long)fs.f_favail;
195 <
195 > #endif
196                          num_disks++;
197                  }
198          }
# Line 154 | Line 205 | disk_stat_t *get_disk_stats(int *entries){
205          return disk_stats;
206  
207   }
208 + #ifdef SOLARIS
209 + void diskio_stat_init(int start, int end, diskio_stat_t *diskio_stats){
210  
211 +        for(diskio_stats+=start; start<end; start++){
212 +                diskio_stats->disk_name=NULL;
213 +                
214 +                diskio_stats++;
215 +        }
216 + }
217 +
218 + diskio_stat_t *diskio_stat_malloc(int needed_entries, int *cur_entries, diskio_stat_t *diskio_stats){
219 +
220 +        if(diskio_stats==NULL){
221 +
222 +                if((diskio_stats=malloc(needed_entries * sizeof(diskio_stat_t)))==NULL){
223 +                        return NULL;
224 +                }
225 +                diskio_stat_init(0, needed_entries, diskio_stats);
226 +                *cur_entries=needed_entries;
227 +
228 +                return diskio_stats;
229 +        }
230 +
231 +
232 +        if(*cur_entries<needed_entries){
233 +                diskio_stats=realloc(diskio_stats, (sizeof(diskio_stat_t)*needed_entries));
234 +                if(diskio_stats==NULL){
235 +                        return NULL;
236 +                }
237 +                diskio_stat_init(*cur_entries, needed_entries, diskio_stats);
238 +                *cur_entries=needed_entries;
239 +        }
240 +
241 +        return diskio_stats;
242 + }
243 +
244 + static diskio_stat_t *diskio_stats=NULL;        
245 + static int num_diskio=0;        
246 +
247   diskio_stat_t *get_diskio_stats(int *entries){
248  
249 <        /* Do jibble */
250 <        return NULL;
249 >        static int sizeof_diskio_stats=0;
250 >        diskio_stat_t *diskio_stats_ptr;
251 >
252 >        kstat_ctl_t *kc;
253 >        kstat_t *ksp;
254 >        kstat_io_t kios;
255 >
256 >        if ((kc = kstat_open()) == NULL) {
257 >                return NULL;
258 >        }
259 >
260 >        num_diskio=0;
261 >
262 >        for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) {
263 >                if (!strcmp(ksp->ks_class, "disk")) {
264 >
265 >                        if(ksp->ks_type != KSTAT_TYPE_IO) continue;
266 >                        /* We dont want metadevices appearins as num_diskio */
267 >                        if(strcmp(ksp->ks_module, "md")==0) continue;
268 >                        if((kstat_read(kc, ksp, &kios))==-1){  
269 >                        }
270 >                        
271 >                        if((diskio_stats=diskio_stat_malloc(num_diskio+1, &sizeof_diskio_stats, diskio_stats))==NULL){
272 >                                kstat_close(kc);
273 >                                return NULL;
274 >                        }
275 >                        diskio_stats_ptr=diskio_stats+num_diskio;
276 >                        
277 >                        diskio_stats_ptr->read_bytes=kios.nread;
278 >                        
279 >                        diskio_stats_ptr->write_bytes=kios.nwritten;
280 >
281 >                        if(diskio_stats_ptr->disk_name!=NULL) free(diskio_stats_ptr->disk_name);
282 >
283 >                        diskio_stats_ptr->disk_name=strdup(ksp->ks_name);
284 >                        num_diskio++;
285 >                }
286 >        }
287 >
288 >        kstat_close(kc);
289 >
290 >        *entries=num_diskio;
291 >
292 >        return diskio_stats;
293   }
294 +
295 + diskio_stat_t *get_diskio_stats_diff(int *entries){
296 +        static diskio_stat_t *diskio_stats_diff=NULL;
297 +        static int sizeof_diskio_stats_diff=0;
298 +        diskio_stat_t *diskio_stats_diff_ptr, *diskio_stats_ptr;
299 +        int disks, x, y;
300 +
301 +        if(diskio_stats==NULL){
302 +                diskio_stats_ptr=get_diskio_stats(&disks);
303 +                *entries=disks;
304 +                return diskio_stats_ptr;
305 +        }
306 +
307 +        diskio_stats_diff=diskio_stat_malloc(num_diskio, &sizeof_diskio_stats_diff, diskio_stats_diff);
308 +        if(diskio_stats_diff==NULL){
309 +                return NULL;
310 +        }
311 +
312 +        diskio_stats_diff_ptr=diskio_stats_diff;
313 +        diskio_stats_ptr=diskio_stats;
314 +
315 +        for(disks=0;disks<num_diskio;disks++){
316 +                if(diskio_stats_diff_ptr->disk_name!=NULL){
317 +                        free(diskio_stats_diff_ptr->disk_name);
318 +                }
319 +                diskio_stats_diff_ptr->disk_name=strdup(diskio_stats_ptr->disk_name);
320 +                diskio_stats_diff_ptr->read_bytes=diskio_stats_ptr->read_bytes;
321 +                diskio_stats_diff_ptr->write_bytes=diskio_stats_ptr->write_bytes;
322 +                diskio_stats_diff_ptr->systime=diskio_stats_ptr->systime;
323 +
324 +                diskio_stats_diff_ptr++;
325 +                diskio_stats_ptr++;
326 +        }
327 +
328 +        diskio_stats_ptr=get_diskio_stats(&disks);
329 +        diskio_stats_diff_ptr=diskio_stats_diff;
330 +
331 +        for(x=0;x<sizeof_diskio_stats_diff;x++){
332 +
333 +                if((strcmp(diskio_stats_diff_ptr->disk_name, diskio_stats_ptr->disk_name))==0){
334 +                        diskio_stats_diff_ptr->read_bytes=diskio_stats_ptr->read_bytes-diskio_stats_diff_ptr->read_bytes;
335 +                        diskio_stats_diff_ptr->write_bytes=diskio_stats_ptr->write_bytes-diskio_stats_diff_ptr->write_bytes;
336 +                        diskio_stats_diff_ptr->systime=diskio_stats_ptr->systime-diskio_stats_diff_ptr->systime;
337 +                }else{
338 +                        diskio_stats_ptr=diskio_stats;
339 +                        for(y=0;y<disks;y++){
340 +                                if((strcmp(diskio_stats_diff_ptr->disk_name, diskio_stats_ptr->disk_name))==0){
341 +                                        diskio_stats_diff_ptr->read_bytes=diskio_stats_ptr->read_bytes-diskio_stats_diff_ptr->read_bytes;
342 +                                        diskio_stats_diff_ptr->write_bytes=diskio_stats_ptr->write_bytes-diskio_stats_diff_ptr->write_bytes;
343 +                                        diskio_stats_diff_ptr->systime=diskio_stats_ptr->systime-diskio_stats_diff_ptr->systime;
344 +
345 +                                        break;
346 +                                }
347 +                                
348 +                                diskio_stats_ptr++;
349 +                        }
350 +                }
351 +
352 +                diskio_stats_ptr++;
353 +                diskio_stats_diff_ptr++;        
354 +
355 +        }
356 +        
357 +        *entries=sizeof_diskio_stats_diff;
358 +        return diskio_stats_diff;
359 + }
360 + #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines