ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/ihost/libstatgrab/disk_stat.c
Revision: 1.6
Committed: Thu May 16 17:02:43 2002 UTC (22 years, 4 months ago) by pajs
Content type: text/plain
Branch: MAIN
Changes since 1.5: +7 -1 lines
Log Message:
Fixed forgetting to close files and memory leaks

File Contents

# User Rev Content
1 pajs 1.1 #include <stdlib.h>
2     #include <stdio.h>
3 pajs 1.4 #include "ukcprog.h"
4 pajs 1.2 #include <string.h>
5 pajs 1.1
6     #ifdef SOLARIS
7     #include <sys/mnttab.h>
8     #include <sys/types.h>
9     #include <sys/statvfs.h>
10     #endif
11 pajs 1.2 #ifdef LINUX
12     #include <mntent.h>
13     #include <sys/vfs.h>
14     #endif
15     #ifdef FREEBSD
16     #include <sys/param.h>
17     #include <sys/ucred.h>
18     #include <sys/mount.h>
19     #endif
20 pajs 1.1 typedef struct {
21     char *device_name;
22     char *mnt_point;
23     long size;
24     long used;
25     long avail;
26     long t_inodes;
27     long f_inodes;
28     }disk_stat_t;
29    
30     typedef struct system_disks_t{
31     disk_stat_t *disk;
32     struct system_disks_t *next_disk;
33     }system_disks_t;
34    
35 pajs 1.2 char *get_disk_stats(){
36 pajs 1.1 system_disks_t *sd=NULL;
37     system_disks_t *sd_ptr=sd;
38     int counter=0;
39 pajs 1.4 char *xml_disk_stats;
40 pajs 1.5 char *xml_disk_stats_ptr;
41 pajs 1.1 #ifdef SOLARIS
42     struct mnttab mp;
43     struct statvfs df;
44 pajs 1.3 FILE *f;
45 pajs 1.1 #endif
46     #ifdef LINUX
47     struct mntent *mp;
48     struct statfs df;
49 pajs 1.3 FILE *f;
50 pajs 1.1 #endif
51     #ifdef FREEBSD
52     int nummnt;
53     struct statfs *mp;
54     #endif
55    
56     #ifdef SOLARIS
57     if ((f=fopen("/etc/mnttab", "r" ))==NULL){
58     errf("Failed to open mounts (%m)");
59     return NULL;
60     }
61     while((getmntent(f, &mp)) == 0){
62     if ((statvfs(mp.mnt_mountp, &df)) !=0){
63     errf("Failed to gets fs stats (%m)");
64     continue;
65     }
66     if((((strcmp(mp.mnt_fstype,"ufs"))==0) || (strcmp(mp.mnt_fstype,"tmpfs")) ==0)){
67 pajs 1.4 if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
68     errf("malloc failed (%m)");
69     return NULL;
70     }
71     if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
72     errf("malloc failed (%m)");
73     return NULL;
74     }
75     if((sd_ptr->disk->device_name=strdup(mp.mnt_special)) == NULL) {
76     errf("strdup failed (%m)");
77     return NULL;
78     }
79     if((sd_ptr->disk->mnt_point=strdup(mp.mnt_mountp)) == NULL){
80     errf("strdup failed (%m)");
81     return NULL;
82     }
83 pajs 1.1 sd_ptr->disk->size=((df.f_frsize/1024) * df.f_blocks);
84     sd_ptr->disk->used=(((df.f_frsize/1024) * df.f_blocks) -((df.f_frsize/1024) * df.f_bfree));
85     sd_ptr->disk->avail=(df.f_frsize/1024) * df.f_bavail;
86     sd_ptr->disk->t_inodes=df.f_files;
87     sd_ptr->disk->f_inodes=df.f_ffree;
88     sd_ptr->next_disk=sd;
89     sd=sd_ptr;
90     }
91    
92     }
93    
94 pajs 1.6 if((fclose(f))!=0){
95     errf("Failed to close mnttab");
96     return NULL;
97     }
98    
99 pajs 1.1 #endif
100 pajs 1.2 #ifdef linux
101     if ((f=fopen("/etc/mtab", "r" ))==NULL){
102     errf("Failed to open mounts (%m)");
103     return NULL;
104     }
105    
106     while((mp=getmntent(f))){
107     if ((statfs(mp->mnt_dir, &df)) !=0){
108     errf("Failed to gets fs stats (%m)");
109     continue;
110     }
111    
112     if((((strcmp(mp->mnt_type, MNTTYPE_NFS))==0) || (strcmp(mp->mnt_type,MNTTYPE_IGNORE)) ==0)) continue;
113 pajs 1.4 if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
114     errf("malloc failed (%m)");
115     return NULL;
116     }
117     if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
118     errf("malloc failed (%m)");
119     return NULL;
120     }
121     if((sd_ptr->disk->device_name=strdup(mp->mnt_fsname)) == NULL){
122     errf("strdup failed (%m)");
123     return NULL;
124     }
125     if((sd_ptr->disk->mnt_point=strdup(mp->mnt_dir)) == NULL){
126     errf("strdup failed (%m)");
127     return NULL;
128     }
129 pajs 1.2 sd_ptr->disk->size=((df.f_bsize/1024) * df.f_blocks);
130     sd_ptr->disk->used=((df.f_bsize/1024) * df.f_blocks) -((df.f_bsize/1024) * df.f_bfree);
131     sd_ptr->disk->avail=((df.f_bsize/1024) * df.f_bavail);
132     sd_ptr->disk->t_inodes=df.f_files;
133     sd_ptr->disk->f_inodes=df.f_ffree;
134     sd_ptr->next_disk=sd;
135     sd=sd_ptr;
136     }
137     #endif
138     #ifdef FREEBSD
139     nummnt=getmntinfo(&mp , MNT_LOCAL);
140     if (nummnt<=0){
141     errf("Failed to get disk stats (%m)");
142     return NULL;
143     }
144    
145 pajs 1.4 for(counter=0;counter<nummnt;counter++){
146     if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
147     errf("malloc failed (%m)");
148     return NULL;
149     }
150     if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
151     errf("malloc failed (%m)");
152     return NULL;
153     }
154     if((sd_ptr->disk->device_name=strdup(mp->f_mntfromname))==NULL){
155     errf("strdup failed (%m)");
156     return NULL;
157     }
158     if((sd_ptr->disk->mnt_point=strdup(mp->f_mntonname))==NULL){
159     errf("strdup failed (%m)");
160     return NULL;
161     }
162 pajs 1.2 sd_ptr->disk->size=((mp->f_bsize/1024) * mp->f_blocks);
163     sd_ptr->disk->used=((mp->f_bsize/1024) * mp->f_blocks) -((mp->f_bsize/1024) * mp->f_bfree);
164     sd_ptr->disk->avail=((mp->f_bsize/1024) * mp->f_bavail);
165     sd_ptr->disk->t_inodes=mp->f_files;
166     sd_ptr->disk->f_inodes=mp->f_ffree;
167     sd_ptr->next_disk=sd;
168     sd=sd_ptr;
169 pajs 1.3 mp++;
170 pajs 1.2 }
171     #endif
172    
173    
174 pajs 1.1 sd_ptr=sd;
175 pajs 1.4 xml_disk_stats=strdup("<disk>");
176    
177 pajs 1.1 while(sd_ptr!=NULL){
178 pajs 1.5 xml_disk_stats_ptr=xml_disk_stats;
179 pajs 1.4 if((xml_disk_stats=strf("%s<p%d name=\"%s\" mount=\"%s\" kbytes=\"%ld\" used=\"%ld\" avail=\"%ld\" totalinodes=\"%ld\" freeinodes=\"%ld\"></p%d>", xml_disk_stats, counter, sd_ptr->disk->device_name, sd_ptr->disk->mnt_point, sd_ptr->disk->size, sd_ptr->disk->used, sd_ptr->disk->avail, sd_ptr->disk->t_inodes, sd_ptr->disk->f_inodes, counter)) == NULL){
180     errf("strf failed (%m)");
181     return NULL;
182     }
183 pajs 1.5 free(xml_disk_stats_ptr);
184 pajs 1.1 sd_ptr=sd_ptr->next_disk;
185 pajs 1.2 counter++;
186 pajs 1.1 }
187 pajs 1.6 xml_disk_stats_ptr=xml_disk_stats;
188 pajs 1.4 xml_disk_stats=strf("%s</disk>",xml_disk_stats);
189 pajs 1.6 free(xml_disk_stats_ptr);
190 pajs 1.5
191     /* Cleaning up */
192     sd_ptr=sd;
193     while(sd_ptr!=NULL){
194     sd=sd_ptr->next_disk;
195     free(sd_ptr->disk->device_name);
196     free(sd_ptr->disk->mnt_point);
197     free(sd_ptr->disk);
198     free(sd_ptr);
199     sd_ptr=sd;
200     }
201 pajs 1.4
202     return xml_disk_stats;
203 pajs 1.1 }
204