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

Comparing projects/cms/source/ihost/libstatgrab/disk_stat.c (file contents):
Revision 1.1 by pajs, Sun May 12 22:14:15 2002 UTC vs.
Revision 1.11 by tdb, Tue May 21 16:47:12 2002 UTC

# Line 1 | Line 1
1 + /*
2 + * i-scream central monitoring system
3 + * http://www.i-scream.org.uk
4 + * Copyright (C) 2000-2002 i-scream
5 + *
6 + * This program is free software; you can redistribute it and/or
7 + * modify it under the terms of the GNU General Public License
8 + * as published by the Free Software Foundation; either version 2
9 + * of the License, or (at your option) any later version.
10 + *
11 + * This program is distributed in the hope that it will be useful,
12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 + * GNU General Public License for more details.
15 + *
16 + * You should have received a copy of the GNU General Public License
17 + * along with this program; if not, write to the Free Software
18 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 + */
20 +
21   #include <stdlib.h>
22   #include <stdio.h>
23 < #include <ukcprog.h>
24 < #include <strings.h>
23 > #include "ukcprog.h"
24 > #include <string.h>
25  
26   #ifdef SOLARIS
27   #include <sys/mnttab.h>
28   #include <sys/types.h>
29   #include <sys/statvfs.h>
30   #endif
31 <
31 > #ifdef LINUX
32 > #include <mntent.h>
33 > #include <sys/vfs.h>
34 > #endif
35 > #ifdef FREEBSD
36 > #include <sys/param.h>
37 > #include <sys/ucred.h>
38 > #include <sys/mount.h>
39 > #endif
40   typedef struct {
41          char *device_name;
42          char *mnt_point;
# Line 24 | Line 52 | typedef struct system_disks_t{
52          struct system_disks_t *next_disk;
53   }system_disks_t;
54  
55 < char *disk_stats(){
55 > char *get_disk_stats(){
56          system_disks_t *sd=NULL;
57          system_disks_t *sd_ptr=sd;
30        FILE *f;
58          int counter=0;
59 +        char *xml_disk_stats;
60 +        char *xml_disk_stats_ptr;
61   #ifdef SOLARIS
62          struct mnttab mp;
63          struct statvfs df;
64 +        FILE *f;
65   #endif
66   #ifdef LINUX
67          struct mntent *mp;
68          struct statfs df;
69 +        FILE *f;
70   #endif
71   #ifdef FREEBSD
72          int nummnt;
# Line 53 | Line 84 | char *disk_stats(){
84                          continue;
85                  }
86                  if((((strcmp(mp.mnt_fstype,"ufs"))==0) || (strcmp(mp.mnt_fstype,"tmpfs")) ==0)){
87 <                        sd_ptr=malloc(sizeof(system_disks_t));  
88 <                        sd_ptr->disk=malloc(sizeof(disk_stat_t));
89 <                        sd_ptr->disk->device_name=strdup(mp.mnt_special);
90 <                        sd_ptr->disk->mnt_point=strdup(mp.mnt_mountp);
87 >                        if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
88 >                                errf("malloc failed (%m)");
89 >                                return NULL;
90 >                        }
91 >                        if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
92 >                                errf("malloc failed (%m)");
93 >                                return NULL;
94 >                        }
95 >                        if((sd_ptr->disk->device_name=strdup(mp.mnt_special)) == NULL) {
96 >                                errf("strdup failed (%m)");    
97 >                                return NULL;
98 >                        }
99 >                        if((sd_ptr->disk->mnt_point=strdup(mp.mnt_mountp)) == NULL){
100 >                                errf("strdup failed (%m)");    
101 >                                return NULL;
102 >                        }
103                          sd_ptr->disk->size=((df.f_frsize/1024) * df.f_blocks);
104                          sd_ptr->disk->used=(((df.f_frsize/1024) * df.f_blocks) -((df.f_frsize/1024) * df.f_bfree));
105                          sd_ptr->disk->avail=(df.f_frsize/1024) * df.f_bavail;
# Line 68 | Line 111 | char *disk_stats(){
111  
112          }
113  
114 +        if((fclose(f))!=0){
115 +                errf("Failed to close mnttab");
116 +                return NULL;
117 +        }
118 +
119   #endif
120 <        sd_ptr=sd;
121 <        while(sd_ptr!=NULL){
122 <                printf("%s\n", sd_ptr->disk->device_name);
123 <                printf("%s\n", sd_ptr->disk->mnt_point);
124 <                printf("%ld\n", sd_ptr->disk->size);
77 <                printf("%ld\n", sd_ptr->disk->used);
78 <                printf("%ld\n", sd_ptr->disk->avail);
120 > #ifdef LINUX
121 >        if ((f=setmntent("/etc/mtab", "r" ))==NULL){
122 >                errf("Failed to open mounts (%m)");
123 >                return NULL;
124 >        }
125  
126 <                sd_ptr=sd_ptr->next_disk;
126 >        while((mp=getmntent(f))){
127 >                if ((statfs(mp->mnt_dir, &df)) !=0){
128 >                        errf("Failed to gets fs stats (%m)");
129 >                        continue;
130 >                }
131 >
132 >                if((((strcmp(mp->mnt_type, MNTTYPE_NFS))==0) ||  (strcmp(mp->mnt_type,MNTTYPE_IGNORE)) ==0)) continue;
133 >                if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
134 >                        errf("malloc failed (%m)");
135 >                        return NULL;
136 >                }
137 >                if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
138 >                        errf("malloc failed (%m)");
139 >                        return NULL;
140 >                }
141 >                if((sd_ptr->disk->device_name=strdup(mp->mnt_fsname)) == NULL){
142 >                        errf("strdup failed (%m)");
143 >                        return NULL;
144 >                }
145 >                if((sd_ptr->disk->mnt_point=strdup(mp->mnt_dir)) == NULL){
146 >                        errf("strdup failed (%m)");
147 >                        return NULL;
148 >                }
149 >                sd_ptr->disk->size=((df.f_bsize/1024) * df.f_blocks);
150 >                sd_ptr->disk->used=((df.f_bsize/1024) * df.f_blocks) -((df.f_bsize/1024) * df.f_bfree);
151 >                sd_ptr->disk->avail=((df.f_bsize/1024) * df.f_bavail);
152 >                sd_ptr->disk->t_inodes=df.f_files;
153 >                sd_ptr->disk->f_inodes=df.f_ffree;
154 >                sd_ptr->next_disk=sd;
155 >                sd=sd_ptr;
156          }
157  
158 <        return "jibble";
159 < }
158 >        if ((endmntent(f)) != 0) {
159 >                errf("Failed to close file (%m)");
160 >                return NULL;
161 >        }
162  
163 < int main(){
164 <        printf("%s",disk_stats());
165 <        exit(0);
166 < }      
167 <                        
163 > #endif
164 > #ifdef FREEBSD
165 >        nummnt=getmntinfo(&mp , MNT_LOCAL);
166 >        if (nummnt<=0){
167 >                errf("Failed to get disk stats (%m)");
168 >                return NULL;
169 >        }
170 >        
171 >        for(counter=0;counter<nummnt;counter++){
172 >                if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
173 >                        errf("malloc failed (%m)");
174 >                        return NULL;
175 >                }
176 >                if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
177 >                        errf("malloc failed (%m)");
178 >                        return NULL;
179 >                }
180 >                if((sd_ptr->disk->device_name=strdup(mp->f_mntfromname))==NULL){
181 >                        errf("strdup failed (%m)");
182 >                        return NULL;
183 >                }
184 >                if((sd_ptr->disk->mnt_point=strdup(mp->f_mntonname))==NULL){
185 >                        errf("strdup failed (%m)");
186 >                        return NULL;
187 >                }
188 >                sd_ptr->disk->size=((mp->f_bsize/1024) * mp->f_blocks);
189 >                sd_ptr->disk->used=((mp->f_bsize/1024) * mp->f_blocks) -((mp->f_bsize/1024) * mp->f_bfree);
190 >                sd_ptr->disk->avail=((mp->f_bsize/1024) * mp->f_bavail);
191 >                sd_ptr->disk->t_inodes=mp->f_files;
192 >                sd_ptr->disk->f_inodes=mp->f_ffree;
193 >                sd_ptr->next_disk=sd;
194 >                sd=sd_ptr;
195 >                mp++;
196 >        }
197 > #endif
198  
199 +
200 +        sd_ptr=sd;
201 +        xml_disk_stats=strdup("<disk>");
202          
203 +        for(counter=0;sd_ptr!=NULL;counter++){
204 +                xml_disk_stats_ptr=xml_disk_stats;
205 +                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){
206 +                        errf("strf failed (%m)");
207 +                        return NULL;
208 +                }
209 +                free(xml_disk_stats_ptr);
210 +                sd_ptr=sd_ptr->next_disk;
211 +        }
212 +        xml_disk_stats_ptr=xml_disk_stats;
213 +        xml_disk_stats=strf("%s</disk>",xml_disk_stats);
214 +        free(xml_disk_stats_ptr);      
215 +
216 +        /* Cleaning up */
217 +        sd_ptr=sd;
218 +        while(sd_ptr!=NULL){
219 +                sd=sd_ptr->next_disk;
220 +                free(sd_ptr->disk->device_name);
221 +                free(sd_ptr->disk->mnt_point);
222 +                free(sd_ptr->disk);
223 +                free(sd_ptr);
224 +                sd_ptr=sd;
225 +        }
226 +
227 +        return xml_disk_stats;
228 + }
229 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines