--- projects/cms/source/ihost/libstatgrab/disk_stat.c 2002/05/12 22:14:15 1.1 +++ projects/cms/source/ihost/libstatgrab/disk_stat.c 2002/05/13 11:33:07 1.2 @@ -1,14 +1,22 @@ #include #include #include -#include +#include #ifdef SOLARIS #include #include #include #endif - +#ifdef LINUX +#include +#include +#endif +#ifdef FREEBSD +#include +#include +#include +#endif typedef struct { char *device_name; char *mnt_point; @@ -24,7 +32,7 @@ typedef struct system_disks_t{ struct system_disks_t *next_disk; }system_disks_t; -char *disk_stats(){ +char *get_disk_stats(){ system_disks_t *sd=NULL; system_disks_t *sd_ptr=sd; FILE *f; @@ -69,6 +77,55 @@ char *disk_stats(){ } #endif +#ifdef linux + if ((f=fopen("/etc/mtab", "r" ))==NULL){ + errf("Failed to open mounts (%m)"); + return NULL; + } + + while((mp=getmntent(f))){ + if ((statfs(mp->mnt_dir, &df)) !=0){ + errf("Failed to gets fs stats (%m)"); + continue; + } + + if((((strcmp(mp->mnt_type, MNTTYPE_NFS))==0) || (strcmp(mp->mnt_type,MNTTYPE_IGNORE)) ==0)) continue; + sd_ptr=malloc(sizeof(system_disks_t)); + sd_ptr->disk=malloc(sizeof(disk_stat_t)); + sd_ptr->disk->device_name=strdup(mp->mnt_fsname); + sd_ptr->disk->mnt_point=strdup(mp->mnt_dir); + sd_ptr->disk->size=((df.f_bsize/1024) * df.f_blocks); + sd_ptr->disk->used=((df.f_bsize/1024) * df.f_blocks) -((df.f_bsize/1024) * df.f_bfree); + sd_ptr->disk->avail=((df.f_bsize/1024) * df.f_bavail); + sd_ptr->disk->t_inodes=df.f_files; + sd_ptr->disk->f_inodes=df.f_ffree; + sd_ptr->next_disk=sd; + sd=sd_ptr; + } +#endif +#ifdef FREEBSD + nummnt=getmntinfo(&mp , MNT_LOCAL); + if (nummnt<=0){ + errf("Failed to get disk stats (%m)"); + return NULL; + } + + for(;counterdisk=malloc(sizeof(disk_stat_t)); + sd_ptr->disk->device_name=strdup(mp->f_mntfromname); + sd_ptr->disk->mnt_point=strdup(mp->f_mntonname); + sd_ptr->disk->size=((mp->f_bsize/1024) * mp->f_blocks); + sd_ptr->disk->used=((mp->f_bsize/1024) * mp->f_blocks) -((mp->f_bsize/1024) * mp->f_bfree); + sd_ptr->disk->avail=((mp->f_bsize/1024) * mp->f_bavail); + sd_ptr->disk->t_inodes=mp->f_files; + sd_ptr->disk->f_inodes=mp->f_ffree; + sd_ptr->next_disk=sd; + sd=sd_ptr; + } +#endif + + sd_ptr=sd; while(sd_ptr!=NULL){ printf("%s\n", sd_ptr->disk->device_name); @@ -78,13 +135,14 @@ char *disk_stats(){ printf("%ld\n", sd_ptr->disk->avail); sd_ptr=sd_ptr->next_disk; + counter++; } return "jibble"; } int main(){ - printf("%s",disk_stats()); + printf("%s",get_disk_stats()); exit(0); }