1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*3e14f97fSRoger A. Faulkner * Copyright (c) 1985-2010 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6da2e3ebdSchin * Common Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt * 11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> * 18da2e3ebdSchin * David Korn <dgk@research.att.com> * 19da2e3ebdSchin * Phong Vo <kpv@research.att.com> * 20da2e3ebdSchin * * 21da2e3ebdSchin ***********************************************************************/ 22da2e3ebdSchin #pragma prototyped 23da2e3ebdSchin 24da2e3ebdSchin #include <ast.h> 25da2e3ebdSchin #include <ls.h> 26da2e3ebdSchin 27da2e3ebdSchin #if _lib_statvfs 28da2e3ebdSchin 29da2e3ebdSchin NoN(statvfs) 30da2e3ebdSchin 31da2e3ebdSchin #else 32da2e3ebdSchin 33da2e3ebdSchin #include <error.h> 34da2e3ebdSchin 35da2e3ebdSchin #define HUH (-1) 36da2e3ebdSchin 37da2e3ebdSchin #if _lib_statfs && _mem_f_files_statfs && ( _sys_statfs || _sys_vfs || _sys_mount ) 38da2e3ebdSchin 39da2e3ebdSchin #if _sys_statfs 40da2e3ebdSchin #include <sys/statfs.h> 41da2e3ebdSchin #else 42da2e3ebdSchin #if _sys_vfs 43da2e3ebdSchin #include <sys/vfs.h> 44da2e3ebdSchin #else 45da2e3ebdSchin #if _sys_mount 46da2e3ebdSchin #if _lib_getmntinfo 47da2e3ebdSchin #include <sys/param.h> /* expect some macro redefinitions here */ 48da2e3ebdSchin #endif 49da2e3ebdSchin #include <sys/mount.h> 50da2e3ebdSchin #endif 51da2e3ebdSchin #endif 52da2e3ebdSchin #endif 53da2e3ebdSchin 54da2e3ebdSchin #if _lib_statfs4 55da2e3ebdSchin #define FSTATFS(a,b) fstatfs(a,b,sizeof(struct statfs),0) 56da2e3ebdSchin #define STATFS(a,b) statfs(a,b,sizeof(struct statfs),0) 57da2e3ebdSchin #else 58da2e3ebdSchin #define FSTATFS(a,b) fstatfs(a,b) 59da2e3ebdSchin #define STATFS(a,b) statfs(a,b) 60da2e3ebdSchin #endif 61da2e3ebdSchin 62da2e3ebdSchin #if defined(__EXPORT__) 63da2e3ebdSchin #define extern __EXPORT__ 64da2e3ebdSchin #endif 65da2e3ebdSchin 66da2e3ebdSchin static void 67da2e3ebdSchin us2v(register struct statfs* ufs, register struct stat* st, register struct statvfs* vfs) 68da2e3ebdSchin { 69da2e3ebdSchin memset(vfs, 0, sizeof(*vfs)); 70da2e3ebdSchin vfs->f_bsize = vfs->f_frsize = ufs->f_bsize; 71da2e3ebdSchin vfs->f_blocks = ufs->f_blocks; 72da2e3ebdSchin vfs->f_bfree = ufs->f_bfree; 73da2e3ebdSchin vfs->f_bavail = 74da2e3ebdSchin #if _mem_f_bavail_statfs 75da2e3ebdSchin ufs->f_bavail; 76da2e3ebdSchin #else 77da2e3ebdSchin ufs->f_bfree; 78da2e3ebdSchin #endif 79da2e3ebdSchin vfs->f_files = ufs->f_files; 80da2e3ebdSchin vfs->f_ffree = ufs->f_ffree; 81da2e3ebdSchin vfs->f_favail = (ufs->f_ffree > 10) ? (ufs->f_ffree - 10) : 0; 82da2e3ebdSchin vfs->f_fsid = st->st_dev; 83da2e3ebdSchin strncpy(vfs->f_basetype, FS_default, sizeof(vfs->f_basetype) - 1); 84da2e3ebdSchin vfs->f_namemax = 14; 85da2e3ebdSchin strncpy(vfs->f_fstr, vfs->f_basetype, sizeof(vfs->f_fstr) - 1); 86da2e3ebdSchin } 87da2e3ebdSchin 88da2e3ebdSchin extern int 89da2e3ebdSchin fstatvfs(int fd, struct statvfs* vfs) 90da2e3ebdSchin { 91da2e3ebdSchin struct statfs ufs; 92da2e3ebdSchin struct stat st; 93da2e3ebdSchin 94da2e3ebdSchin if (FSTATFS(fd, &ufs) || fstat(fd, &st)) 95da2e3ebdSchin return(-1); 96da2e3ebdSchin us2v(&ufs, &st, vfs); 97da2e3ebdSchin return(0); 98da2e3ebdSchin } 99da2e3ebdSchin 100da2e3ebdSchin extern int 101da2e3ebdSchin statvfs(const char* path, struct statvfs* vfs) 102da2e3ebdSchin { 103da2e3ebdSchin struct statfs ufs; 104da2e3ebdSchin struct stat st; 105da2e3ebdSchin 106da2e3ebdSchin if (STATFS(path, &ufs) || stat(path, &st)) 107da2e3ebdSchin return(-1); 108da2e3ebdSchin us2v(&ufs, &st, vfs); 109da2e3ebdSchin return(0); 110da2e3ebdSchin } 111da2e3ebdSchin 112da2e3ebdSchin #else 113da2e3ebdSchin 114da2e3ebdSchin #if defined(__EXPORT__) 115da2e3ebdSchin #define extern __EXPORT__ 116da2e3ebdSchin #endif 117da2e3ebdSchin 118da2e3ebdSchin static void 119da2e3ebdSchin s2v(register struct stat* st, register struct statvfs* vfs) 120da2e3ebdSchin { 121da2e3ebdSchin memset(vfs, 0, sizeof(*vfs)); 122da2e3ebdSchin vfs->f_bsize = vfs->f_frsize = 123da2e3ebdSchin #if _mem_st_blksize_stat 124da2e3ebdSchin st->st_blksize; 125da2e3ebdSchin #else 126da2e3ebdSchin 512; 127da2e3ebdSchin #endif 128da2e3ebdSchin vfs->f_blocks = HUH; 129da2e3ebdSchin vfs->f_bfree = HUH; 130da2e3ebdSchin vfs->f_files = HUH; 131da2e3ebdSchin vfs->f_ffree = HUH; 132da2e3ebdSchin vfs->f_favail = HUH; 133da2e3ebdSchin vfs->f_fsid = st->st_dev; 134da2e3ebdSchin strncpy(vfs->f_basetype, FS_default, sizeof(vfs->f_basetype) - 1); 135da2e3ebdSchin vfs->f_namemax = 14; 136da2e3ebdSchin strncpy(vfs->f_fstr, vfs->f_basetype, sizeof(vfs->f_fstr) - 1); 137da2e3ebdSchin } 138da2e3ebdSchin 139da2e3ebdSchin extern int 140da2e3ebdSchin fstatvfs(int fd, struct statvfs* vfs) 141da2e3ebdSchin { 142da2e3ebdSchin struct stat st; 143da2e3ebdSchin 144da2e3ebdSchin if (fstat(fd, &st)) 145da2e3ebdSchin return(-1); 146da2e3ebdSchin s2v(&st, vfs); 147da2e3ebdSchin return(0); 148da2e3ebdSchin } 149da2e3ebdSchin 150da2e3ebdSchin extern int 151da2e3ebdSchin statvfs(const char* path, struct statvfs* vfs) 152da2e3ebdSchin { 153da2e3ebdSchin struct stat st; 154da2e3ebdSchin 155da2e3ebdSchin if (stat(path, &st)) 156da2e3ebdSchin return(-1); 157da2e3ebdSchin s2v(&st, vfs); 158da2e3ebdSchin return(0); 159da2e3ebdSchin } 160da2e3ebdSchin 161da2e3ebdSchin #endif 162da2e3ebdSchin 163da2e3ebdSchin #endif 164