Init.c, making it chroot
Erik Udo
erik.udo at gmail.com
Fri Dec 29 13:23:46 PST 2006
That's nice. But NetBSDs init.c executes /etc/rc before calling
chroot(), and that's what i'm looking for, and for a moment tried to
implement, but i'm not very familiar with FreeBSD code :)
For example that kenv() came to me as a suprise. I'll have to try to
implement the NetBSD way where /etc/rc is executed before chroot().
Ofcourse now that i dont have to use sysctls, it's alot easier.
M. Warner Losh wrote:
> BTW, here's a patch to test. Since FreeBSD has kenv(2), the patch is
> actually very small.
>
> Warner
>
>
>
> ------------------------------------------------------------------------
>
> Index: init.c
> ===================================================================
> RCS file: /cache/ncvs/src/sbin/init/init.c,v
> retrieving revision 1.62
> diff -u -r1.62 init.c
> --- init.c 8 Jun 2006 14:04:36 -0000 1.62
> +++ init.c 28 Dec 2006 20:39:33 -0000
> @@ -55,6 +55,7 @@
> #include <db.h>
> #include <errno.h>
> #include <fcntl.h>
> +#include <kenv.h>
> #include <libutil.h>
> #include <paths.h>
> #include <signal.h>
> @@ -187,6 +188,7 @@
> int
> main(int argc, char *argv[])
> {
> + char init_chroot[PATH_MAX];
> int c;
> struct sigaction sa;
> sigset_t mask;
> @@ -239,6 +241,12 @@
> */
> openlog("init", LOG_CONS|LOG_ODELAY, LOG_AUTH);
>
> + *init_chroot = '\0';
> + kenv(KENV_GET, "init_chroot", init_chroot, sizeof(init_chroot));
> + if (*init_chroot)
> + if (chdir(init_chroot) != 0 || chroot(".") != 0)
> + warning("Can't chroot to %s: %m", init_chroot);
> +
> /*
> * Create an initial session.
> */
More information about the freebsd-hackers
mailing list