From fc4c51ce304a444f74161e6dc69456101e06996a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 12 Sep 2005 22:56:31 +0000 Subject: fake RLIMIT_AS syscall --- rlimit/Makefile | 7 ++++++ rlimit/rlimit.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 rlimit/Makefile create mode 100644 rlimit/rlimit.c diff --git a/rlimit/Makefile b/rlimit/Makefile new file mode 100644 index 0000000..812af5f --- /dev/null +++ b/rlimit/Makefile @@ -0,0 +1,7 @@ +# $Id$ + +LKM= rlimit +NOMAN= noman +CFLAGS+= -Wall -I/usr/src/sys/compat/linux + +.include diff --git a/rlimit/rlimit.c b/rlimit/rlimit.c new file mode 100644 index 0000000..48d47db --- /dev/null +++ b/rlimit/rlimit.c @@ -0,0 +1,78 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Dimitri Sokolyuk + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +MOD_MISC("rlimit"); + +extern struct sysent linux_sysent[]; + +/* OpenBSD dosn't support RLIMIT_AS, so if a linux app tries to get + * its value, return a value of RLIMIT_DATA instead + */ + +int +my_getrlimit(struct proc *p, void *v, register_t *retval) +{ + register struct linux_sys_getrlimit_args *uap = v; + + if (SCARG(uap, which) == LINUX_RLIMIT_AS) + SCARG(uap, which) = LINUX_RLIMIT_DATA; + + return (linux_sys_getrlimit(p, v, retval)); +} + +int +rlimit_handler(struct lkm_table *lkmtp, int cmd) +{ + switch (cmd) { + case LKM_E_LOAD: + linux_sysent[LINUX_SYS_getrlimit].sy_call = my_getrlimit; + break; + + case LKM_E_UNLOAD: + linux_sysent[LINUX_SYS_getrlimit].sy_call = linux_sys_getrlimit; + break; + } + + return (0); +} + +int +rlimit(struct lkm_table *lkmtp, int cmd, int ver) +{ + DISPATCH(lkmtp, cmd, ver, rlimit_handler, rlimit_handler, lkm_nofunc); +} -- cgit v1.2.3