summaryrefslogtreecommitdiff
path: root/src/injail.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/injail.c')
-rwxr-xr-xsrc/injail.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/injail.c b/src/injail.c
new file mode 100755
index 0000000..7d653a6
--- /dev/null
+++ b/src/injail.c
@@ -0,0 +1,67 @@
+/*
+// AUTHOR
+// James Quick <jq@quick.com>
+// N. Nielsen
+//
+// LICENSE
+// This software is in the public domain.
+//
+// The software is provided "as is", without warranty of any kind,
+// express or implied, including but not limited to the warranties
+// of merchantability, fitness for a particular purpose, and
+// noninfringement. In no event shall the author(s) be liable for any
+// claim, damages, or other liability, whether in an action of
+// contract, tort, or otherwise, arising from, out of, or in connection
+// with the software or the use or other dealings in the software.
+//
+// SUPPORT
+// Send bug reports to: <nielsen@memberwebs.com>
+//
+// injail
+// A utility function to determine if a process is running in a FreeBSD jail.
+//
+// This code was written by James E. Quick mailto:jq@quick.com
+// The code may be freely re-used under the terms of the BSD copyright,
+// as long as this comment remains intact.
+*/
+
+#include <kvm.h>
+#include <sys/param.h>
+#include <paths.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/user.h>
+#include <sys/sysctl.h>
+#include <sys/file.h>
+#include <stdio.h>
+
+#if __FreeBSD_version > 500000
+#define P_FLAG ki_flag
+#else
+#define P_FLAG kp_proc.p_flag
+#endif
+
+/* int injail()
+* Return 1 if running in a jail, 0 if not, -1 on error
+* jq 05/28/2002
+*/
+int injail ()
+{
+ int count = 0;
+ kvm_t* kd = 0;
+ struct kinfo_proc* kp;
+ char *memf, *nlistf, *swapf, errbuf[_POSIX2_LINE_MAX];
+ int result = -1;
+
+ memf = nlistf = swapf = _PATH_DEVNULL;
+ kd = kvm_openfiles(nlistf, memf, swapf, O_RDONLY, errbuf);
+ if(kd)
+ {
+ kp = kvm_getprocs(kd, KERN_PROC_PID, getpid(), &count);
+ if(kp)
+ result = (kp->P_FLAG & P_JAILED) ? 1 : 0;
+ kvm_close(kd);
+ }
+
+ return result;
+}