diff options
author | 2000-06-07 13:35:01 +0000 | |
---|---|---|
committer | 2000-06-07 13:35:01 +0000 | |
commit | 221e2eb25e344d2a908189cef17dae5f8e5a7cf2 (patch) | |
tree | 4720ebe8b5a3b24b96d7f93cf6e8bc894f715238 /sys/compat/linux/linux_resource.c | |
parent | Document the optional address argument to 'show malloc'. (diff) | |
download | wireguard-openbsd-221e2eb25e344d2a908189cef17dae5f8e5a7cf2.tar.xz wireguard-openbsd-221e2eb25e344d2a908189cef17dae5f8e5a7cf2.zip |
Fix linux [gs]etrlimit emulation + add their latest ugetrlimit
Diffstat (limited to 'sys/compat/linux/linux_resource.c')
-rw-r--r-- | sys/compat/linux/linux_resource.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_resource.c b/sys/compat/linux/linux_resource.c new file mode 100644 index 00000000000..3a6a9860a08 --- /dev/null +++ b/sys/compat/linux/linux_resource.c @@ -0,0 +1,134 @@ +/* $OpenBSD: linux_resource.c,v 1.1 2000/06/07 13:35:02 niklas Exp $ */ + +/* + * Copyright (c) 2000 Niklas Hallqvist + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niklas Hallqvist + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Linux "resource" syscall emulation + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mount.h> +#include <sys/proc.h> +#include <sys/resource.h> +#include <sys/resourcevar.h> +#include <sys/syscallargs.h> + +#include <compat/linux/linux_types.h> +#include <compat/linux/linux_resource.h> +#include <compat/linux/linux_signal.h> +#include <compat/linux/linux_syscallargs.h> + +#define MIN(a,b) (((a)<(b))?(a):(b)) + +/* linux_resource.c */ +int linux_to_bsd_rlimit __P((u_int)); +int linux_dogetrlimit __P((struct proc *, void *, register_t *, rlim_t)); + +static u_int linux_to_bsd_rlimit_map[] = { + RLIMIT_CPU, + RLIMIT_FSIZE, + RLIMIT_DATA, + RLIMIT_STACK, + RLIMIT_CORE, + RLIMIT_RSS, + RLIMIT_NPROC, + RLIMIT_NOFILE, + RLIMIT_MEMLOCK, + RLIM_NLIMITS /* LINUX_RLIMIT_AS not supported */ +}; + +int +linux_to_bsd_rlimit(which) + u_int which; +{ + if (which >= LINUX_RLIM_NLIMITS) + return (RLIM_NLIMITS); + return (linux_to_bsd_rlimit_map[which]); +} + +int +linux_sys_setrlimit(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + struct linux_sys_setrlimit_args /* { + syscallarg(u_int) which; + syscallarg(struct linux_rlimit *) rlp; + } */ *uap = v; + + SCARG(uap, which) = linux_to_bsd_rlimit(SCARG(uap, which)); + if (SCARG(uap, which) == RLIM_NLIMITS) + return (EINVAL); + return (compat_43_sys_setrlimit(p, v, retval)); +} + +int +linux_dogetrlimit(p, v, retval, max) + struct proc *p; + void *v; + register_t *retval; + rlim_t max; +{ + struct linux_sys_getrlimit_args /* { + syscallarg(u_int) which; + syscallarg(struct linux_rlimit *) rlp; + } */ *uap = v; + u_int which; + struct linux_rlimit rlim; + + which = linux_to_bsd_rlimit(SCARG(uap, which)); + if (which == RLIM_NLIMITS) + return (EINVAL); + + rlim.rlim_cur = MIN(p->p_rlimit[which].rlim_cur, max); + rlim.rlim_max = MIN(p->p_rlimit[which].rlim_max, max); + return (copyout(&rlim, SCARG(uap, rlp), sizeof rlim)); +} + +int +linux_sys_getrlimit(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + return (linux_dogetrlimit(p, v, retval, LINUX_OLD_RLIM_INFINITY)); +} + +int +linux_sys_ugetrlimit(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + return (linux_dogetrlimit(p, v, retval, LINUX_RLIM_INFINITY)); +} |