Blame ext/posix/sys/resource.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
 Control Maximum System Resource Consumption.
Packit 437b5e
Packit 437b5e
@module posix.sys.resource
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#include <sys/resource.h>
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
Packit 437b5e
/* OpenBSD 5.6 recommends using RLIMIT_DATA in place of missing RLIMIT_AS */
Packit 437b5e
#ifndef RLIMIT_AS
Packit 437b5e
#  define RLIMIT_AS RLIMIT_DATA
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Resource limit record.
Packit 437b5e
@table PosixRlimit
Packit 437b5e
@int rlim_cur current soft limit
Packit 437b5e
@int rlim_max hard limit
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
pushrlimit(lua_State *L, struct rlimit *lim)
Packit 437b5e
{
Packit 437b5e
	if (!lim)
Packit 437b5e
		return lua_pushnil(L), 1;
Packit 437b5e
Packit 437b5e
	lua_createtable(L, 0, 2);
Packit 437b5e
Packit 437b5e
	setnumberfield(lim, rlim_cur);
Packit 437b5e
	setnumberfield(lim, rlim_max);
Packit 437b5e
Packit 437b5e
	settypemetatable("PosixRlimit");
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Get resource limits for this process.
Packit 437b5e
@function getrlimit
Packit 437b5e
@int resource one of `RLIMIT_CORE`, `RLIMIT_CPU`, `RLIMIT_DATA`, `RLIMIT_FSIZE`,
Packit 437b5e
  `RLIMIT_NOFILE`, `RLIMIT_STACK` or `RLIMIT_AS`
Packit 437b5e
@treturn[1] int softlimit
Packit 437b5e
@treturn[1] int hardlimit, if successful
Packit 437b5e
@return[2] nil
Packit 437b5e
@treturn[2] string error message
Packit 437b5e
@treturn[2] int errnum
Packit 437b5e
@see getrlimit(2)
Packit 437b5e
@see setrlimit
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pgetrlimit(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	struct rlimit lim;
Packit 437b5e
	int r;
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
	r = getrlimit(checkint(L, 1), &lim);
Packit 437b5e
	if (r < 0)
Packit 437b5e
		return pusherror(L, "getrlimit");
Packit 437b5e
	return pushrlimit(L, &lim);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set a resource limit for subsequent child processes.
Packit 437b5e
@function setrlimit
Packit 437b5e
@string resource one of "core", "cpu", "data", "fsize",
Packit 437b5e
 "nofile", "stack" or "as"
Packit 437b5e
@param[opt] softlimit process may receive a signal when reached
Packit 437b5e
@param[opt] hardlimit process may be terminated when reached
Packit 437b5e
@treturn[1] int `0`, if successful
Packit 437b5e
@return[2] nil
Packit 437b5e
@treturn[2] string error message
Packit 437b5e
@treturn[2] int errnum
Packit 437b5e
@see getrlimit(2)
Packit 437b5e
@see limit.lua
Packit 437b5e
@usage P.setrlimit ("nofile", 1000, 2000)
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
static const char *Srlimit_fields[] = { "rlim_cur", "rlim_max" };
Packit 437b5e
Packit 437b5e
static int
Packit 437b5e
Psetrlimit(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	struct rlimit lim;
Packit 437b5e
	int rid = checkint(L, 1);
Packit 437b5e
Packit 437b5e
	luaL_checktype(L, 2, LUA_TTABLE);
Packit 437b5e
	checknargs(L, 2);
Packit 437b5e
Packit 437b5e
	lim.rlim_cur = checknumberfield(L, 2, "rlim_cur");
Packit 437b5e
	lim.rlim_max = checknumberfield(L, 2, "rlim_max");
Packit 437b5e
	checkfieldnames(L, 2, Srlimit_fields);
Packit 437b5e
Packit 437b5e
	return pushresult(L, setrlimit(rid, &lim), "setrlimit");
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg posix_sys_resource_fns[] =
Packit 437b5e
{
Packit 437b5e
	LPOSIX_FUNC( Pgetrlimit		),
Packit 437b5e
	LPOSIX_FUNC( Psetrlimit		),
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
Rlimit constants.
Packit 437b5e
@table posix.sys.resource
Packit 437b5e
@int RLIM_INFINITY unlimited resource usage
Packit 437b5e
@int RLIM_SAVED_CUR saved current resource soft limit
Packit 437b5e
@int RLIM_SAVED_MAX saved resource hard limit
Packit 437b5e
@int RLIMIT_CORE maximum bytes allowed for a core file
Packit 437b5e
@int RLIMIT_CPU maximum cputime secconds allowed per process
Packit 437b5e
@int RLIMIT_DATA maximum data segment bytes per process
Packit 437b5e
@int RLIMIT_FSIZE maximum bytes in any file
Packit 437b5e
@int RLIMIT_NOFILE maximum number of open files per process
Packit 437b5e
@int RLIMIT_STACK maximum stack segment bytes per process
Packit 437b5e
@int RLIMIT_AS maximum bytes total address space per process
Packit 437b5e
@usage
Packit 437b5e
  -- Print resource constants supported on this host.
Packit 437b5e
  for name, value in pairs (require "posix.sys.resource") 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
LUALIB_API int
Packit 437b5e
luaopen_posix_sys_resource(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	luaL_register(L, "posix.sys.resource", posix_sys_resource_fns);
Packit 437b5e
	lua_pushliteral(L, "posix.sys.resource for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, -2, "version");
Packit 437b5e
Packit 437b5e
	LPOSIX_CONST( RLIM_INFINITY	);
Packit 437b5e
#if defined RLIM_SAVED_CUR
Packit 437b5e
	LPOSIX_CONST( RLIM_SAVED_CUR	);
Packit 437b5e
#endif
Packit 437b5e
#if defined RLIM_SAVED_MAX
Packit 437b5e
	LPOSIX_CONST( RLIM_SAVED_MAX	);
Packit 437b5e
#endif
Packit 437b5e
	LPOSIX_CONST( RLIMIT_CORE	);
Packit 437b5e
	LPOSIX_CONST( RLIMIT_CPU	);
Packit 437b5e
	LPOSIX_CONST( RLIMIT_DATA	);
Packit 437b5e
	LPOSIX_CONST( RLIMIT_FSIZE	);
Packit 437b5e
	LPOSIX_CONST( RLIMIT_NOFILE	);
Packit 437b5e
	LPOSIX_CONST( RLIMIT_STACK	);
Packit 437b5e
	LPOSIX_CONST( RLIMIT_AS		);
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}