summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2005-09-04 23:43:38 +0000
committerDimitri Sokolyuk <demon@dim13.org>2005-09-04 23:43:38 +0000
commit328f784cf0e48c353e34712e180a0adfa0c0bdf7 (patch)
treeb3469c481869aa3517d0fb5c00b1c6a584b0092d
parentaac40f919e5f2c91ab6aab59e50c6dac61eb3bd3 (diff)
verbose rlimit LKM
-rw-r--r--gsrlimit/Makefile6
-rw-r--r--gsrlimit/gsrlimit.c102
2 files changed, 108 insertions, 0 deletions
diff --git a/gsrlimit/Makefile b/gsrlimit/Makefile
new file mode 100644
index 0000000..076bae9
--- /dev/null
+++ b/gsrlimit/Makefile
@@ -0,0 +1,6 @@
+# $Id$
+
+LKM= gsrlimit
+NOMAN= noman
+
+.include <bsd.lkm.mk>
diff --git a/gsrlimit/gsrlimit.c b/gsrlimit/gsrlimit.c
new file mode 100644
index 0000000..1f1bf56
--- /dev/null
+++ b/gsrlimit/gsrlimit.c
@@ -0,0 +1,102 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2005 Dimitri Sokolyuk <demon@vhost.dyndns.org>
+ *
+ * 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 <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/exec.h>
+#include <sys/lkm.h>
+#include <sys/proc.h>
+#include <sys/syscall.h>
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+
+MOD_MISC("gsrlimit");
+
+char *gsrlimit_name[] = {
+ "cpu time in milliseconds",
+ "maximum file size",
+ "data size",
+ "stack size",
+ "core file size",
+ "resident set size",
+ "locked-in-memory address space",
+ "number of processes",
+ "number of open files",
+ NULL
+};
+
+int
+my_getrlimit(struct proc *p, void *v, register_t *retval)
+{
+ register struct sys_getrlimit_args *uap = v;
+ int ret;
+
+ ret = sys_getrlimit(p, v, retval);
+
+ printf("getrlimit: %s (%lu/%lu)\n",
+ SCARG(uap, which) >= RLIM_NLIMITS ? "unknown" : gsrlimit_name[SCARG(uap, which)],
+ SCARG(uap, rlp)->rlim_cur, SCARG(uap, rlp)->rlim_max);
+
+ return (ret);
+}
+
+int
+my_setrlimit(struct proc *p, void *v, register_t *retval)
+{
+ register struct sys_getrlimit_args *uap = v;
+ int ret;
+
+ ret = sys_setrlimit(p, v, retval);
+
+ printf("setrlimit: %s (%lu/%lu)\n",
+ SCARG(uap, which) >= RLIM_NLIMITS ? "unknown" : gsrlimit_name[SCARG(uap, which)],
+ SCARG(uap, rlp)->rlim_cur, SCARG(uap, rlp)->rlim_max);
+
+ return (ret);
+}
+
+int
+gsrlimit_handler(struct lkm_table *lkmtp, int cmd)
+{
+ switch (cmd) {
+ case LKM_E_LOAD:
+ printf("fake getrlimit/setrlimit\n");
+ sysent[SYS_getrlimit].sy_call = my_getrlimit;
+ sysent[SYS_setrlimit].sy_call = my_setrlimit;
+ break;
+
+ case LKM_E_UNLOAD:
+ printf("restore getrlimit/setrlimit\n");
+ sysent[SYS_getrlimit].sy_call = sys_getrlimit;
+ sysent[SYS_setrlimit].sy_call = sys_setrlimit;
+ break;
+ }
+
+ return (0);
+}
+
+int
+gsrlimit(struct lkm_table *lkmtp, int cmd, int ver)
+{
+ DISPATCH(lkmtp, cmd, ver, gsrlimit_handler, gsrlimit_handler, lkm_nofunc);
+}