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, 6 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

# Content
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include "ukcprog.h"
4 #include <string.h>
5
6 #ifdef SOLARIS
7 #include <sys/mnttab.h>
8 #include <sys/types.h>
9 #include <sys/statvfs.h>
10 #endif
11 #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 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 char *get_disk_stats(){
36 system_disks_t *sd=NULL;
37 system_disks_t *sd_ptr=sd;
38 int counter=0;
39 char *xml_disk_stats;
40 char *xml_disk_stats_ptr;
41 #ifdef SOLARIS
42 struct mnttab mp;
43 struct statvfs df;
44 FILE *f;
45 #endif
46 #ifdef LINUX
47 struct mntent *mp;
48 struct statfs df;
49 FILE *f;
50 #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 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 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 if((fclose(f))!=0){
95 errf("Failed to close mnttab");
96 return NULL;
97 }
98
99 #endif
100 #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 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 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 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 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 mp++;
170 }
171 #endif
172
173
174 sd_ptr=sd;
175 xml_disk_stats=strdup("<disk>");
176
177 while(sd_ptr!=NULL){
178 xml_disk_stats_ptr=xml_disk_stats;
179 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 free(xml_disk_stats_ptr);
184 sd_ptr=sd_ptr->next_disk;
185 counter++;
186 }
187 xml_disk_stats_ptr=xml_disk_stats;
188 xml_disk_stats=strf("%s</disk>",xml_disk_stats);
189 free(xml_disk_stats_ptr);
190
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
202 return xml_disk_stats;
203 }
204