summaryrefslogtreecommitdiffstats
path: root/sys/compat/linux/linux_resource.c
diff options
context:
space:
mode:
authorniklas <niklas@openbsd.org>2000-06-07 13:35:01 +0000
committerniklas <niklas@openbsd.org>2000-06-07 13:35:01 +0000
commit221e2eb25e344d2a908189cef17dae5f8e5a7cf2 (patch)
tree4720ebe8b5a3b24b96d7f93cf6e8bc894f715238 /sys/compat/linux/linux_resource.c
parentDocument the optional address argument to 'show malloc'. (diff)
downloadwireguard-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.c134
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));
+}