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.14
Committed: Mon Mar 3 12:32:36 2003 UTC (21 years, 6 months ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.13: +0 -0 lines
State: FILE REMOVED
Log Message:
Following up on Pete's commit of the new ihost - the new configure stuff.
Also dropped the old libstatgrab.

File Contents

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