14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #pragma prototyped 234887Schin 244887Schin #include <ast.h> 254887Schin #include <ls.h> 264887Schin 274887Schin #if _lib_statvfs 284887Schin 294887Schin NoN(statvfs) 304887Schin 314887Schin #else 324887Schin 334887Schin #include <error.h> 344887Schin 354887Schin #define HUH (-1) 364887Schin 374887Schin #if _lib_statfs && _mem_f_files_statfs && ( _sys_statfs || _sys_vfs || _sys_mount ) 384887Schin 394887Schin #if _sys_statfs 404887Schin #include <sys/statfs.h> 414887Schin #else 424887Schin #if _sys_vfs 434887Schin #include <sys/vfs.h> 444887Schin #else 454887Schin #if _sys_mount 464887Schin #if _lib_getmntinfo 474887Schin #include <sys/param.h> /* expect some macro redefinitions here */ 484887Schin #endif 494887Schin #include <sys/mount.h> 504887Schin #endif 514887Schin #endif 524887Schin #endif 534887Schin 544887Schin #if _lib_statfs4 554887Schin #define FSTATFS(a,b) fstatfs(a,b,sizeof(struct statfs),0) 564887Schin #define STATFS(a,b) statfs(a,b,sizeof(struct statfs),0) 574887Schin #else 584887Schin #define FSTATFS(a,b) fstatfs(a,b) 594887Schin #define STATFS(a,b) statfs(a,b) 604887Schin #endif 614887Schin 624887Schin #if defined(__EXPORT__) 634887Schin #define extern __EXPORT__ 644887Schin #endif 654887Schin 664887Schin static void 674887Schin us2v(register struct statfs* ufs, register struct stat* st, register struct statvfs* vfs) 684887Schin { 694887Schin memset(vfs, 0, sizeof(*vfs)); 704887Schin vfs->f_bsize = vfs->f_frsize = ufs->f_bsize; 714887Schin vfs->f_blocks = ufs->f_blocks; 724887Schin vfs->f_bfree = ufs->f_bfree; 734887Schin vfs->f_bavail = 744887Schin #if _mem_f_bavail_statfs 754887Schin ufs->f_bavail; 764887Schin #else 774887Schin ufs->f_bfree; 784887Schin #endif 794887Schin vfs->f_files = ufs->f_files; 804887Schin vfs->f_ffree = ufs->f_ffree; 814887Schin vfs->f_favail = (ufs->f_ffree > 10) ? (ufs->f_ffree - 10) : 0; 824887Schin vfs->f_fsid = st->st_dev; 834887Schin strncpy(vfs->f_basetype, FS_default, sizeof(vfs->f_basetype) - 1); 844887Schin vfs->f_namemax = 14; 854887Schin strncpy(vfs->f_fstr, vfs->f_basetype, sizeof(vfs->f_fstr) - 1); 864887Schin } 874887Schin 884887Schin extern int 894887Schin fstatvfs(int fd, struct statvfs* vfs) 904887Schin { 914887Schin struct statfs ufs; 924887Schin struct stat st; 934887Schin 944887Schin if (FSTATFS(fd, &ufs) || fstat(fd, &st)) 954887Schin return(-1); 964887Schin us2v(&ufs, &st, vfs); 974887Schin return(0); 984887Schin } 994887Schin 1004887Schin extern int 1014887Schin statvfs(const char* path, struct statvfs* vfs) 1024887Schin { 1034887Schin struct statfs ufs; 1044887Schin struct stat st; 1054887Schin 1064887Schin if (STATFS(path, &ufs) || stat(path, &st)) 1074887Schin return(-1); 1084887Schin us2v(&ufs, &st, vfs); 1094887Schin return(0); 1104887Schin } 1114887Schin 1124887Schin #else 1134887Schin 1144887Schin #if defined(__EXPORT__) 1154887Schin #define extern __EXPORT__ 1164887Schin #endif 1174887Schin 1184887Schin static void 1194887Schin s2v(register struct stat* st, register struct statvfs* vfs) 1204887Schin { 1214887Schin memset(vfs, 0, sizeof(*vfs)); 1224887Schin vfs->f_bsize = vfs->f_frsize = 1234887Schin #if _mem_st_blksize_stat 1244887Schin st->st_blksize; 1254887Schin #else 1264887Schin 512; 1274887Schin #endif 1284887Schin vfs->f_blocks = HUH; 1294887Schin vfs->f_bfree = HUH; 1304887Schin vfs->f_files = HUH; 1314887Schin vfs->f_ffree = HUH; 1324887Schin vfs->f_favail = HUH; 1334887Schin vfs->f_fsid = st->st_dev; 1344887Schin strncpy(vfs->f_basetype, FS_default, sizeof(vfs->f_basetype) - 1); 1354887Schin vfs->f_namemax = 14; 1364887Schin strncpy(vfs->f_fstr, vfs->f_basetype, sizeof(vfs->f_fstr) - 1); 1374887Schin } 1384887Schin 1394887Schin extern int 1404887Schin fstatvfs(int fd, struct statvfs* vfs) 1414887Schin { 1424887Schin struct stat st; 1434887Schin 1444887Schin if (fstat(fd, &st)) 1454887Schin return(-1); 1464887Schin s2v(&st, vfs); 1474887Schin return(0); 1484887Schin } 1494887Schin 1504887Schin extern int 1514887Schin statvfs(const char* path, struct statvfs* vfs) 1524887Schin { 1534887Schin struct stat st; 1544887Schin 1554887Schin if (stat(path, &st)) 1564887Schin return(-1); 1574887Schin s2v(&st, vfs); 1584887Schin return(0); 1594887Schin } 1604887Schin 1614887Schin #endif 1624887Schin 1634887Schin #endif 164