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.5 by pajs, Mon May 13 13:21:36 2002 UTC

# Line 1 | Line 1
1   #include <stdlib.h>
2   #include <stdio.h>
3 < #include <ukcprog.h>
4 < #include <strings.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 <
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;
# Line 24 | Line 32 | typedef struct system_disks_t{
32          struct system_disks_t *next_disk;
33   }system_disks_t;
34  
35 < char *disk_stats(){
35 > char *get_disk_stats(){
36          system_disks_t *sd=NULL;
37          system_disks_t *sd_ptr=sd;
30        FILE *f;
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;
# Line 53 | Line 64 | char *disk_stats(){
64                          continue;
65                  }
66                  if((((strcmp(mp.mnt_fstype,"ufs"))==0) || (strcmp(mp.mnt_fstype,"tmpfs")) ==0)){
67 <                        sd_ptr=malloc(sizeof(system_disks_t));  
68 <                        sd_ptr->disk=malloc(sizeof(disk_stat_t));
69 <                        sd_ptr->disk->device_name=strdup(mp.mnt_special);
70 <                        sd_ptr->disk->mnt_point=strdup(mp.mnt_mountp);
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;
# Line 69 | Line 92 | char *disk_stats(){
92          }
93  
94   #endif
95 + #ifdef linux
96 +        if ((f=fopen("/etc/mtab", "r" ))==NULL){
97 +                errf("Failed to open mounts (%m)");
98 +                return NULL;
99 +        }
100 +
101 +        while((mp=getmntent(f))){
102 +                if ((statfs(mp->mnt_dir, &df)) !=0){
103 +                        errf("Failed to gets fs stats (%m)");
104 +                        continue;
105 +                }
106 +
107 +                if((((strcmp(mp->mnt_type, MNTTYPE_NFS))==0) ||  (strcmp(mp->mnt_type,MNTTYPE_IGNORE)) ==0)) continue;
108 +                if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
109 +                        errf("malloc failed (%m)");
110 +                        return NULL;
111 +                }
112 +                if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
113 +                        errf("malloc failed (%m)");
114 +                        return NULL;
115 +                }
116 +                if((sd_ptr->disk->device_name=strdup(mp->mnt_fsname)) == NULL){
117 +                        errf("strdup failed (%m)");
118 +                        return NULL;
119 +                }
120 +                if((sd_ptr->disk->mnt_point=strdup(mp->mnt_dir)) == NULL){
121 +                        errf("strdup failed (%m)");
122 +                        return NULL;
123 +                }
124 +                sd_ptr->disk->size=((df.f_bsize/1024) * df.f_blocks);
125 +                sd_ptr->disk->used=((df.f_bsize/1024) * df.f_blocks) -((df.f_bsize/1024) * df.f_bfree);
126 +                sd_ptr->disk->avail=((df.f_bsize/1024) * df.f_bavail);
127 +                sd_ptr->disk->t_inodes=df.f_files;
128 +                sd_ptr->disk->f_inodes=df.f_ffree;
129 +                sd_ptr->next_disk=sd;
130 +                sd=sd_ptr;
131 +        }
132 + #endif
133 + #ifdef FREEBSD
134 +        nummnt=getmntinfo(&mp , MNT_LOCAL);
135 +        if (nummnt<=0){
136 +                errf("Failed to get disk stats (%m)");
137 +                return NULL;
138 +        }
139 +        
140 +        for(counter=0;counter<nummnt;counter++){
141 +                if((sd_ptr=malloc(sizeof(system_disks_t))) == NULL){
142 +                        errf("malloc failed (%m)");
143 +                        return NULL;
144 +                }
145 +                if((sd_ptr->disk=malloc(sizeof(disk_stat_t))) == NULL){
146 +                        errf("malloc failed (%m)");
147 +                        return NULL;
148 +                }
149 +                if((sd_ptr->disk->device_name=strdup(mp->f_mntfromname))==NULL){
150 +                        errf("strdup failed (%m)");
151 +                        return NULL;
152 +                }
153 +                if((sd_ptr->disk->mnt_point=strdup(mp->f_mntonname))==NULL){
154 +                        errf("strdup failed (%m)");
155 +                        return NULL;
156 +                }
157 +                sd_ptr->disk->size=((mp->f_bsize/1024) * mp->f_blocks);
158 +                sd_ptr->disk->used=((mp->f_bsize/1024) * mp->f_blocks) -((mp->f_bsize/1024) * mp->f_bfree);
159 +                sd_ptr->disk->avail=((mp->f_bsize/1024) * mp->f_bavail);
160 +                sd_ptr->disk->t_inodes=mp->f_files;
161 +                sd_ptr->disk->f_inodes=mp->f_ffree;
162 +                sd_ptr->next_disk=sd;
163 +                sd=sd_ptr;
164 +                mp++;
165 +        }
166 + #endif
167 +
168 +
169          sd_ptr=sd;
170 +        xml_disk_stats=strdup("<disk>");
171 +        
172          while(sd_ptr!=NULL){
173 <                printf("%s\n", sd_ptr->disk->device_name);
174 <                printf("%s\n", sd_ptr->disk->mnt_point);
175 <                printf("%ld\n", sd_ptr->disk->size);
176 <                printf("%ld\n", sd_ptr->disk->used);
177 <                printf("%ld\n", sd_ptr->disk->avail);
178 <
173 >                xml_disk_stats_ptr=xml_disk_stats;
174 >                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){
175 >                        errf("strf failed (%m)");
176 >                        return NULL;
177 >                }
178 >                free(xml_disk_stats_ptr);
179                  sd_ptr=sd_ptr->next_disk;
180 +                counter++;
181          }
182  
183 <        return "jibble";
84 < }
183 >        xml_disk_stats=strf("%s</disk>",xml_disk_stats);
184  
185 < int main(){
186 <        printf("%s",disk_stats());
187 <        exit(0);
188 < }      
189 <                        
185 >        /* Cleaning up */
186 >        sd_ptr=sd;
187 >        while(sd_ptr!=NULL){
188 >                sd=sd_ptr->next_disk;
189 >                free(sd_ptr->disk->device_name);
190 >                free(sd_ptr->disk->mnt_point);
191 >                free(sd_ptr->disk);
192 >                free(sd_ptr);
193 >                sd_ptr=sd;
194 >        }
195  
196 <        
196 >        return xml_disk_stats;
197 > }
198 >

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines