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
Error occurred while calculating annotation data.
Log Message:
Following up on Pete's commit of the new ihost - the new configure stuff.
Also dropped the old libstatgrab.

File Contents

# Content
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 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <stdlib.h>
26 #include <stdio.h>
27 #include "ukcprog.h"
28 #include <string.h>
29
30 #ifdef SOLARIS
31 #include <sys/mnttab.h>
32 #include <sys/types.h>
33 #include <sys/statvfs.h>
34 #endif
35 #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 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 char *get_disk_stats(){
60 system_disks_t *sd=NULL;
61 system_disks_t *sd_ptr=sd;
62 int counter=0;
63 char *xml_disk_stats;
64 char *xml_disk_stats_ptr;
65 #ifdef SOLARIS
66 struct mnttab mp;
67 struct statvfs df;
68 FILE *f;
69 #endif
70 #ifdef LINUX
71 struct mntent *mp;
72 struct statfs df;
73 FILE *f;
74 #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 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 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 if((fclose(f))!=0){
119 errf("Failed to close mnttab");
120 return NULL;
121 }
122
123 #endif
124 #ifdef LINUX
125 if ((f=setmntent("/etc/mtab", "r" ))==NULL){
126 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 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 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
162 endmntent(f);
163
164 #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 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 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 mp++;
197 }
198 #endif
199
200
201 sd_ptr=sd;
202 xml_disk_stats=strdup("<disk>");
203
204 for(counter=0;sd_ptr!=NULL;counter++){
205 xml_disk_stats_ptr=xml_disk_stats;
206 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 free(xml_disk_stats_ptr);
211 sd_ptr=sd_ptr->next_disk;
212 }
213 xml_disk_stats_ptr=xml_disk_stats;
214 xml_disk_stats=strf("%s</disk>",xml_disk_stats);
215 free(xml_disk_stats_ptr);
216
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
228 return xml_disk_stats;
229 }
230