|
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 |
}
|