1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

add getrlimit and setrlimit wrappers

* README: Some rewording.

* configure.in: Check for getrlimit and setrlimit.

* libguile/posix.h:
* libguile/posix.c: Add some getrlimit and setrlimit wrappers. They're
  documented, but I suspect something else has to be done to get them
  into the manual.
This commit is contained in:
Andy Wingo 2009-03-27 15:06:41 -07:00
parent 0b6d8fdc28
commit 4ea9429edc
4 changed files with 182 additions and 4 deletions

8
README
View file

@ -229,10 +229,10 @@ that this is not the same "guile" as the one that is installed; this
"guile" is a wrapper script that sets up the environment appropriately, "guile" is a wrapper script that sets up the environment appropriately,
then invokes the Guile binary. then invokes the Guile binary.
You may also build against an uninstalled Guile build tree. The You may also build external packages against an uninstalled Guile build
"uninstalled-env" script in the "meta/" subdirectory will set up an tree. The "uninstalled-env" script in the "meta/" subdirectory will set
environment with a path including "meta/", a modified dynamic linker up an environment with a path including "meta/", a modified dynamic
path, a modified PKG_CONFIG_PATH, etc. linker path, a modified PKG_CONFIG_PATH, etc.
For example, you can enter this environment via invoking For example, you can enter this environment via invoking

View file

@ -883,6 +883,8 @@ if test -n "$have_sys_un_h" ; then
[Define if the system supports Unix-domain (file-domain) sockets.]) [Define if the system supports Unix-domain (file-domain) sockets.])
fi fi
AC_CHECK_FUNCS(getrlimit setrlimit)
AC_CHECK_FUNCS(socketpair getgroups setgroups setpwent pause tzset) AC_CHECK_FUNCS(socketpair getgroups setgroups setpwent pause tzset)
AC_CHECK_FUNCS(sethostent gethostent endhostent dnl AC_CHECK_FUNCS(sethostent gethostent endhostent dnl

View file

@ -33,6 +33,7 @@
#include "libguile/srfi-13.h" #include "libguile/srfi-13.h"
#include "libguile/srfi-14.h" #include "libguile/srfi-14.h"
#include "libguile/vectors.h" #include "libguile/vectors.h"
#include "libguile/values.h"
#include "libguile/lang.h" #include "libguile/lang.h"
#include "libguile/validate.h" #include "libguile/validate.h"
@ -463,6 +464,179 @@ SCM_DEFINE (scm_setgrent, "setgr", 0, 1, 0,
#endif /* HAVE_GETGRENT */ #endif /* HAVE_GETGRENT */
#ifdef HAVE_GETRLIMIT
#ifdef RLIMIT_AS
SCM_SYMBOL (sym_as, "as");
#endif
#ifdef RLIMIT_CORE
SCM_SYMBOL (sym_core, "core");
#endif
#ifdef RLIMIT_CPU
SCM_SYMBOL (sym_cpu, "cpu");
#endif
#ifdef RLIMIT_DATA
SCM_SYMBOL (sym_data, "data");
#endif
#ifdef RLIMIT_FSIZE
SCM_SYMBOL (sym_fsize, "fsize");
#endif
#ifdef RLIMIT_MEMLOCK
SCM_SYMBOL (sym_memlock, "memlock");
#endif
#ifdef RLIMIT_MSGQUEUE
SCM_SYMBOL (sym_msgqueue, "msgqueue");
#endif
#ifdef RLIMIT_NICE
SCM_SYMBOL (sym_nice, "nice");
#endif
#ifdef RLIMIT_NOFILE
SCM_SYMBOL (sym_nofile, "nofile");
#endif
#ifdef RLIMIT_NPROC
SCM_SYMBOL (sym_nproc, "nproc");
#endif
#ifdef RLIMIT_RSS
SCM_SYMBOL (sym_rss, "rss");
#endif
#ifdef RLIMIT_RTPRIO
SCM_SYMBOL (sym_rtprio, "rtprio");
#endif
#ifdef RLIMIT_RTPRIO
SCM_SYMBOL (sym_rttime, "rttime");
#endif
#ifdef RLIMIT_SIGPENDING
SCM_SYMBOL (sym_sigpending, "sigpending");
#endif
#ifdef RLIMIT_STACK
SCM_SYMBOL (sym_stack, "stack");
#endif
static int
scm_to_resource (SCM s, const char *func, int pos)
{
if (scm_is_number (s))
return scm_to_int (s);
SCM_ASSERT_TYPE (scm_is_symbol (s), s, pos, func, "symbol");
#ifdef RLIMIT_AS
if (s == sym_as)
return RLIMIT_AS;
#endif
#ifdef RLIMIT_CORE
if (s == sym_core)
return RLIMIT_CORE;
#endif
#ifdef RLIMIT_CPU
if (s == sym_cpu)
return RLIMIT_CPU;
#endif
#ifdef RLIMIT_DATA
if (s == sym_data)
return RLIMIT_DATA;
#endif
#ifdef RLIMIT_FSIZE
if (s == sym_fsize)
return RLIMIT_FSIZE;
#endif
#ifdef RLIMIT_MEMLOCK
if (s == sym_memlock)
return RLIMIT_MEMLOCK;
#endif
#ifdef RLIMIT_MSGQUEUE
if (s == sym_msgqueue)
return RLIMIT_MSGQUEUE;
#endif
#ifdef RLIMIT_NICE
if (s == sym_nice)
return RLIMIT_NICE;
#endif
#ifdef RLIMIT_NOFILE
if (s == sym_nofile)
return RLIMIT_NOFILE;
#endif
#ifdef RLIMIT_NPROC
if (s == sym_nproc)
return RLIMIT_NPROC;
#endif
#ifdef RLIMIT_RSS
if (s == sym_rss)
return RLIMIT_RSS;
#endif
#ifdef RLIMIT_RTPRIO
if (s == sym_rtprio)
return RLIMIT_RTPRIO;
#endif
#ifdef RLIMIT_RTPRIO
if (s == sym_rttime)
return RLIMIT_RTPRIO;
#endif
#ifdef RLIMIT_SIGPENDING
if (s == sym_sigpending)
return RLIMIT_SIGPENDING;
#endif
#ifdef RLIMIT_STACK
if (s == sym_stack)
return RLIMIT_STACK;
#endif
scm_misc_error (func, "invalid rlimit resource ~A", scm_list_1 (s));
return 0;
}
SCM_DEFINE (scm_getrlimit, "getrlimit", 1, 0, 0,
(SCM resource),
"Get a resource limit for this process. @var{resource} identifies the resource,\n"
"either as an integer or as a symbol. For example, @code{(getrlimit 'stack)}\n"
"gets the limits associated with @code{RLIMIT_STACK}.\n\n"
"@code{getrlimit} returns two values, the soft and the hard limit. If no\n"
"limit is set for the resource in question, the returned limit will be @code{#f}.")
#define FUNC_NAME s_scm_getrlimit
{
int iresource;
struct rlimit lim = { 0, 0 };
iresource = scm_to_resource (resource, FUNC_NAME, 1);
if (getrlimit (iresource, &lim) != 0)
scm_syserror (FUNC_NAME);
return scm_values (scm_list_2 ((lim.rlim_cur == RLIM_INFINITY) ? SCM_BOOL_F
: scm_from_long (lim.rlim_cur),
(lim.rlim_max == RLIM_INFINITY) ? SCM_BOOL_F
: scm_from_long (lim.rlim_max)));
}
#undef FUNC_NAME
#ifdef HAVE_SETRLIMIT
SCM_DEFINE (scm_setrlimit, "setrlimit", 3, 0, 0,
(SCM resource, SCM soft, SCM hard),
"Set a resource limit for this process. @var{resource} identifies the resource,\n"
"either as an integer or as a symbol. @var{soft} and @var{hard} should be integers,\n"
"or @code{#f} to indicate no limit (i.e., @code{RLIM_INFINITY}).\n\n"
"For example, @code{(setrlimit 'stack 150000 300000)} sets the @code{RLIMIT_STACK}\n"
"limit to 150 kilobytes, with a hard limit of 300 kB.")
#define FUNC_NAME s_scm_setrlimit
{
int iresource;
struct rlimit lim = { 0, 0 };
iresource = scm_to_resource (resource, FUNC_NAME, 1);
lim.rlim_cur = (soft == SCM_BOOL_F) ? RLIM_INFINITY : scm_to_long (soft);
lim.rlim_max = (hard == SCM_BOOL_F) ? RLIM_INFINITY : scm_to_long (hard);
if (setrlimit (iresource, &lim) != 0)
scm_syserror (FUNC_NAME);
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
#endif /* HAVE_SETRLIMIT */
#endif /* HAVE_GETRLIMIT */
SCM_DEFINE (scm_kill, "kill", 2, 0, 0, SCM_DEFINE (scm_kill, "kill", 2, 0, 0,
(SCM pid, SCM sig), (SCM pid, SCM sig),
"Sends a signal to the specified process or group of processes.\n\n" "Sends a signal to the specified process or group of processes.\n\n"

View file

@ -41,6 +41,8 @@ SCM_API SCM scm_getpwuid (SCM user);
SCM_API SCM scm_setpwent (SCM arg); SCM_API SCM scm_setpwent (SCM arg);
SCM_API SCM scm_getgrgid (SCM name); SCM_API SCM scm_getgrgid (SCM name);
SCM_API SCM scm_setgrent (SCM arg); SCM_API SCM scm_setgrent (SCM arg);
SCM_API SCM scm_getrlimit (SCM resource);
SCM_API SCM scm_setrlimit (SCM resource, SCM soft, SCM hard);
SCM_API SCM scm_kill (SCM pid, SCM sig); SCM_API SCM scm_kill (SCM pid, SCM sig);
SCM_API SCM scm_waitpid (SCM pid, SCM options); SCM_API SCM scm_waitpid (SCM pid, SCM options);
SCM_API SCM scm_status_exit_val (SCM status); SCM_API SCM scm_status_exit_val (SCM status);