Blame ext/posix/sys/statvfs.c

Packit 437b5e
/*
Packit 437b5e
 * POSIX library for Lua 5.1, 5.2 & 5.3.
Packit 437b5e
 * (c) Gary V. Vaughan <gary@vaughan.pe>, 2013-2015
Packit 437b5e
 * (c) Reuben Thomas <rrt@sc3d.org> 2010-2013
Packit 437b5e
 * (c) Natanael Copa <natanael.copa@gmail.com> 2008-2010
Packit 437b5e
 * Clean up and bug fixes by Leo Razoumov <slonik.az@gmail.com> 2006-10-11
Packit 437b5e
 * Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br> 07 Apr 2006 23:17:49
Packit 437b5e
 * Based on original by Claudio Terra for Lua 3.x.
Packit 437b5e
 * With contributions by Roberto Ierusalimschy.
Packit 437b5e
 * With documentation from Steve Donovan 2012
Packit 437b5e
 */
Packit 437b5e
/***
Packit 437b5e
 Retrieve File System Information.
Packit 437b5e
Packit 437b5e
 Where supported by the underlying system, query the file system.  If the
Packit 437b5e
 module loads, but there is no kernel support, then `posix.sys.statvfs.version`
Packit 437b5e
 will be set, but the unsupported APIs will be `nil`.
Packit 437b5e
Packit 437b5e
@module posix.sys.statvfs
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#if defined HAVE_STATVFS
Packit 437b5e
Packit 437b5e
#include <sys/statvfs.h>
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Files system information record.
Packit 437b5e
@table PosixStatvfs
Packit 437b5e
@int f_bsize file system block size
Packit 437b5e
@int f_frsize fundamental file system block size
Packit 437b5e
@int f_blocks number of *f_frsize* sized blocks in file system
Packit 437b5e
@int f_bfree number of free blocks
Packit 437b5e
@int f_bavail number of free blocks available to non-privileged process
Packit 437b5e
@int f_files number of file serial numbers
Packit 437b5e
@int f_ffree number of free file serial numbers
Packit 437b5e
@int f_favail number of free file serial numbers available
Packit 437b5e
@int f_fsid file system id
Packit 437b5e
@int f_flag flag bits
Packit 437b5e
@int f_namemax maximum filename length
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
pushstatvfs(lua_State *L, struct statvfs *sv)
Packit 437b5e
{
Packit 437b5e
	if (!sv)
Packit 437b5e
		return lua_pushnil(L), 1;
Packit 437b5e
Packit 437b5e
	lua_createtable(L, 0, 11);
Packit 437b5e
Packit 437b5e
	setintegerfield(sv, f_bsize);
Packit 437b5e
	setintegerfield(sv, f_frsize);
Packit 437b5e
	setintegerfield(sv, f_blocks);
Packit 437b5e
	setintegerfield(sv, f_bfree);
Packit 437b5e
	setintegerfield(sv, f_bavail);
Packit 437b5e
	setintegerfield(sv, f_files);
Packit 437b5e
	setintegerfield(sv, f_ffree);
Packit 437b5e
	setintegerfield(sv, f_favail);
Packit 437b5e
	setintegerfield(sv, f_fsid);
Packit 437b5e
	setintegerfield(sv, f_flag);
Packit 437b5e
	setintegerfield(sv, f_namemax);
Packit 437b5e
Packit 437b5e
	settypemetatable("PosixStatvfs");
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Get file system statistics.
Packit 437b5e
@function statvfs
Packit 437b5e
@string path any path within the mounted file system
Packit 437b5e
@treturn PosixStatvfs information about file system containing *path*
Packit 437b5e
@see statvfs(3)
Packit 437b5e
@usage for a, b in pairs (P.statvfs "/") do print (a, b) end
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pstatvfs(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	struct statvfs s;
Packit 437b5e
	const char *path = luaL_checkstring(L, 1);
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
	if (statvfs(path, &s) == -1)
Packit 437b5e
		return pusherror(L, path);
Packit 437b5e
	return pushstatvfs(L, &s);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg posix_sys_statvfs_fns[] =
Packit 437b5e
{
Packit 437b5e
	LPOSIX_FUNC( Pstatvfs		),
Packit 437b5e
	{NULL, NULL}
Packit 437b5e
};
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Constants.
Packit 437b5e
@section constants
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Statvfs constants.
Packit 437b5e
Any constants not available in the underlying system will be `nil` valued.
Packit 437b5e
@table posix.sys.statvfs
Packit 437b5e
@int ST_RDONLY read-only file system
Packit 437b5e
@int ST_NOSUID does not support `S_ISUID` nor `S_ISGID` file mode bits
Packit 437b5e
@usage
Packit 437b5e
  -- Print statvfs constants supported on this host.
Packit 437b5e
  for name, value in pairs (require "posix.sys.statvfs") do
Packit 437b5e
    if type (value) == "number" then
Packit 437b5e
      print (name, value)
Packit 437b5e
     end
Packit 437b5e
  end
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
Packit 437b5e
LUALIB_API int
Packit 437b5e
luaopen_posix_sys_statvfs(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	luaL_register(L, "posix.sys.statvfs", posix_sys_statvfs_fns);
Packit 437b5e
	lua_pushliteral(L, "posix.sys.statvfs for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, -2, "version");
Packit 437b5e
Packit 437b5e
	LPOSIX_CONST( ST_RDONLY		);
Packit 437b5e
	LPOSIX_CONST( ST_NOSUID		);
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
#endif