diff --git a/Base/usr/share/man/man2/chroot.md b/Base/usr/share/man/man2/chroot.md new file mode 100644 index 00000000000..472b3ce6017 --- /dev/null +++ b/Base/usr/share/man/man2/chroot.md @@ -0,0 +1,26 @@ +## Name + +chroot - change filesystem root + +## Synopsis + +```**c++ +#include + +int chroot(const char* path); +``` + +## Description + +`chroot()` changes the filesystem root of the current process to a new directory specified by `path`. + +## Errors + +* `EPERM`: The current process does not have superuser privileges. +* `EFAULT`: `path` is not in readable memory. + +All of the usual path resolution errors may also occur. + +## See also + +* [`chroot`(8)](../man8/chroot.md) diff --git a/Base/usr/share/man/man8/chroot.md b/Base/usr/share/man/man8/chroot.md new file mode 100644 index 00000000000..62f70ccdcf3 --- /dev/null +++ b/Base/usr/share/man/man8/chroot.md @@ -0,0 +1,28 @@ +## Name + +chroot - run a shell with a different filesystem root + +## Synopsis + +```**sh +# chroot +``` + +## Description + +This program uses the [`chroot`(2)](../man2/chroot.md) syscall to switch into a +different filesystem root and spawn a shell inside it. + +It will not work unless there is a `/bin/Shell` available inside the new root. + +## Examples + +```sh +# chroot /var/chroot +# pwd +/ +``` + +## See also + +* [`chroot`(2)](../man2/chroot.md) diff --git a/Userland/chroot.cpp b/Userland/chroot.cpp new file mode 100644 index 00000000000..890d18ac02f --- /dev/null +++ b/Userland/chroot.cpp @@ -0,0 +1,27 @@ +#include +#include + +int main(int argc, char** argv) +{ + if (argc != 2) { + printf("usage: chroot \n"); + return 0; + } + + if (chroot(argv[1]) < 0) { + perror("chroot"); + return 1; + } + + if (chdir("/") < 0) { + perror("chdir(/)"); + return 1; + } + + if (execl("/bin/Shell", "Shell", nullptr) < 0) { + perror("execl"); + return 1; + } + + return 0; +}