xref: /onnv-gate/usr/src/lib/libast/common/comp/statvfs.c (revision 12068:08a39a083754)
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