From a297b49d55a63f1f1aebf517d5cf17300e080969 Mon Sep 17 00:00:00 2001 From: Enrico Scholz Date: Fri, 7 Nov 2003 23:04:29 +0000 Subject: [PATCH] added rlimit syscalls git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/branches/SYSCALL_SWITCH@388 94cd875c-1c1d-0410-91d2-eb244daf1a30 --- util-vserver/lib/Makefile-files | 2 + util-vserver/lib/syscall_rlimit-v11.hc | 69 ++++++++++++++++++++++++++++++++++ util-vserver/lib/syscall_rlimit.c | 53 ++++++++++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 util-vserver/lib/syscall_rlimit-v11.hc create mode 100644 util-vserver/lib/syscall_rlimit.c diff --git a/util-vserver/lib/Makefile-files b/util-vserver/lib/Makefile-files index 06333eb..901fea7 100644 --- a/util-vserver/lib/Makefile-files +++ b/util-vserver/lib/Makefile-files @@ -18,6 +18,7 @@ ## lib_SRCS = lib/syscall.c \ + lib/syscall_rlimit.c \ lib/checkversion.c \ lib/getctx.c \ lib/getversion.c \ @@ -27,6 +28,7 @@ lib_HDRS = lib/vserver.h lib_XHDRS = lib/syscall-compat.hc \ lib/syscall-legacy.hc \ + lib/syscall_rlimit-v11.hc \ lib/getctx-compat.hc \ lib/getctx-legacy.hc \ lib/getversion-internal.hc \ diff --git a/util-vserver/lib/syscall_rlimit-v11.hc b/util-vserver/lib/syscall_rlimit-v11.hc new file mode 100644 index 0000000..7e864fb --- /dev/null +++ b/util-vserver/lib/syscall_rlimit-v11.hc @@ -0,0 +1,69 @@ +// $Id$ --*- c++ -*-- + +// Copyright (C) 2003 Enrico Scholz +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define KERN2USR(LIMIT) \ + (((LIMIT)==CRLIM_INFINITY) ? VC_LIM_INFINITY : \ + ((LIMIT)==CRLIM_KEEP) ? VC_LIM_KEEP : (LIMIT)) + +#define USR2KERN(LIMIT) \ + (((LIMIT)==VC_LIM_INFINITY) ? CRLIM_INFINITY : \ + ((LIMIT)==VC_LIM_KEEP) ? CRLIM_KEEP : (LIMIT)) + +static inline ALWAYSINLINE int +vc_get_rlimit_v11(ctx_t ctx, int resource, struct vc_rlimit *lim) +{ + struct vcmd_ctx_rlimit_v0 vc_lim; + int rc; + + vc_lim.id = resource; + rc = sys_virtual_context(VC_CMD(RLIMIT, 1, 0), ctx, &vc_lim); + lim->min = KERN2USR(vc_lim.minimum); + lim->soft = KERN2USR(vc_lim.softlimit); + lim->hard = KERN2USR(vc_lim.maximum); + + return rc; +} + +static inline ALWAYSINLINE int +vc_set_rlimit_v11(ctx_t ctx, int resource, struct vc_rlimit const *lim) +{ + struct vcmd_ctx_rlimit_v0 vc_lim; + + vc_lim.id = resource; + vc_lim.minimum = USR2KERN(lim->min); + vc_lim.softlimit = USR2KERN(lim->soft); + vc_lim.maximum = USR2KERN(lim->hard); + + return sys_virtual_context(VC_CMD(RLIMIT, 2, 0), ctx, &vc_lim); +} + +static inline ALWAYSINLINE int +vc_get_rlimit_mask_v11(ctx_t ctx, int tmp, struct vc_rlimit_mask *lim) +{ + struct vcmd_ctx_rlimit_v0 vc_lim; + + (void)tmp; + return sys_virtual_context(VC_CMD(RLIMIT, 3, 0), ctx, &vc_lim); +} + +#undef KERN2USR +#undef USR2KERN diff --git a/util-vserver/lib/syscall_rlimit.c b/util-vserver/lib/syscall_rlimit.c new file mode 100644 index 0000000..d416e82 --- /dev/null +++ b/util-vserver/lib/syscall_rlimit.c @@ -0,0 +1,53 @@ +// $Id$ --*- c++ -*-- + +// Copyright (C) 2003 Enrico Scholz +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "compat.h" + +#include "vserver.h" +#include "vserver-internal.h" +#include "linuxvirtual.h" + +#ifdef VC_ENABLE_API_V11 +# include "syscall_rlimit-v11.hc" +#endif + +#if defined (VC_ENABLE_API_V11) + +int +vc_get_rlimit(ctx_t ctx, int resource, struct vc_rlimit *lim) +{ + CALL_VC(CALL_VC_V11(vc_get_rlimit, ctx, resource, lim)); +} + +int +vc_set_rlimit(ctx_t ctx, int resource, struct vc_rlimit const *lim) +{ + CALL_VC(CALL_VC_V11(vc_set_rlimit, ctx, resource, lim)); +} + +int +vc_get_rlimit_mask(ctx_t ctx, struct vc_rlimit_mask *lim) +{ + CALL_VC(CALL_VC_V11(vc_get_rlimit_mask, ctx, 0, lim)); +} + + +#endif -- 1.8.1.5