1*e79a303fSAaron LI /*-
2*e79a303fSAaron LI * Copyright (c) 1991, 1993
3*e79a303fSAaron LI * The Regents of the University of California. All rights reserved.
4*e79a303fSAaron LI *
5*e79a303fSAaron LI * This code is derived from software contributed to Berkeley by
6*e79a303fSAaron LI * Donn Seeley at Berkeley Software Design, Inc.
7*e79a303fSAaron LI *
8*e79a303fSAaron LI * Redistribution and use in source and binary forms, with or without
9*e79a303fSAaron LI * modification, are permitted provided that the following conditions
10*e79a303fSAaron LI * are met:
11*e79a303fSAaron LI * 1. Redistributions of source code must retain the above copyright
12*e79a303fSAaron LI * notice, this list of conditions and the following disclaimer.
13*e79a303fSAaron LI * 2. Redistributions in binary form must reproduce the above copyright
14*e79a303fSAaron LI * notice, this list of conditions and the following disclaimer in the
15*e79a303fSAaron LI * documentation and/or other materials provided with the distribution.
16*e79a303fSAaron LI * 3. Neither the name of the University nor the names of its contributors
17*e79a303fSAaron LI * may be used to endorse or promote products derived from this software
18*e79a303fSAaron LI * without specific prior written permission.
19*e79a303fSAaron LI *
20*e79a303fSAaron LI * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21*e79a303fSAaron LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22*e79a303fSAaron LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23*e79a303fSAaron LI * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24*e79a303fSAaron LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25*e79a303fSAaron LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26*e79a303fSAaron LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*e79a303fSAaron LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28*e79a303fSAaron LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29*e79a303fSAaron LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30*e79a303fSAaron LI * SUCH DAMAGE.
31*e79a303fSAaron LI *
32*e79a303fSAaron LI * @(#) Copyright (c) 1991, 1993 The Regents of the University of California. All rights reserved.
33*e79a303fSAaron LI * @(#)init.c 8.1 (Berkeley) 7/15/93
34*e79a303fSAaron LI * $FreeBSD: src/sbin/init/init.c,v 1.38.2.8 2001/10/22 11:27:32 des Exp $
35*e79a303fSAaron LI */
36*e79a303fSAaron LI
37*e79a303fSAaron LI #include <sys/param.h>
38*e79a303fSAaron LI #include <sys/ioctl.h>
39*e79a303fSAaron LI #include <sys/mount.h>
40*e79a303fSAaron LI #include <sys/sysctl.h>
41*e79a303fSAaron LI #include <sys/wait.h>
42*e79a303fSAaron LI #include <sys/stat.h>
43*e79a303fSAaron LI
44*e79a303fSAaron LI #include <db.h>
45*e79a303fSAaron LI #include <errno.h>
46*e79a303fSAaron LI #include <fcntl.h>
47*e79a303fSAaron LI #include <libutil.h>
48*e79a303fSAaron LI #include <paths.h>
49*e79a303fSAaron LI #include <signal.h>
50*e79a303fSAaron LI #include <stdio.h>
51*e79a303fSAaron LI #include <stdlib.h>
52*e79a303fSAaron LI #include <string.h>
53*e79a303fSAaron LI #include <syslog.h>
54*e79a303fSAaron LI #include <time.h>
55*e79a303fSAaron LI #include <ttyent.h>
56*e79a303fSAaron LI #include <unistd.h>
57*e79a303fSAaron LI #include <sys/reboot.h>
58*e79a303fSAaron LI #include <err.h>
59*e79a303fSAaron LI
60*e79a303fSAaron LI #include <stdarg.h>
61*e79a303fSAaron LI
62*e79a303fSAaron LI #include "pathnames.h"
63*e79a303fSAaron LI
64*e79a303fSAaron LI static int setctty(const char *);
65*e79a303fSAaron LI static void runcom(char **);
66*e79a303fSAaron LI
67*e79a303fSAaron LI /*
68*e79a303fSAaron LI * The mother of all processes.
69*e79a303fSAaron LI */
70*e79a303fSAaron LI int
main(int argc __unused,char ** argv)71*e79a303fSAaron LI main(int argc __unused, char **argv)
72*e79a303fSAaron LI {
73*e79a303fSAaron LI /* Dispose of random users. */
74*e79a303fSAaron LI if (getuid() != 0)
75*e79a303fSAaron LI errx(1, "%s", strerror(EPERM));
76*e79a303fSAaron LI
77*e79a303fSAaron LI /* Init is not allowed to die, it would make the kernel panic */
78*e79a303fSAaron LI signal(SIGTERM, SIG_IGN);
79*e79a303fSAaron LI
80*e79a303fSAaron LI runcom(argv);
81*e79a303fSAaron LI return 1;
82*e79a303fSAaron LI }
83*e79a303fSAaron LI
84*e79a303fSAaron LI static int
setctty(const char * name)85*e79a303fSAaron LI setctty(const char *name)
86*e79a303fSAaron LI {
87*e79a303fSAaron LI int fd;
88*e79a303fSAaron LI
89*e79a303fSAaron LI revoke(name);
90*e79a303fSAaron LI if ((fd = open(name, O_RDWR)) == -1) {
91*e79a303fSAaron LI exit(1);
92*e79a303fSAaron LI }
93*e79a303fSAaron LI
94*e79a303fSAaron LI if (login_tty(fd) == -1) {
95*e79a303fSAaron LI exit(1);
96*e79a303fSAaron LI }
97*e79a303fSAaron LI
98*e79a303fSAaron LI return fd;
99*e79a303fSAaron LI }
100*e79a303fSAaron LI
101*e79a303fSAaron LI
102*e79a303fSAaron LI static void
runcom(char ** argv_orig)103*e79a303fSAaron LI runcom(char **argv_orig)
104*e79a303fSAaron LI {
105*e79a303fSAaron LI pid_t pid, wpid;
106*e79a303fSAaron LI int status, error;
107*e79a303fSAaron LI const char *argv[4];
108*e79a303fSAaron LI struct sigaction sa;
109*e79a303fSAaron LI
110*e79a303fSAaron LI if ((pid = fork()) == 0) {
111*e79a303fSAaron LI sigemptyset(&sa.sa_mask);
112*e79a303fSAaron LI sa.sa_flags = 0;
113*e79a303fSAaron LI sa.sa_handler = SIG_IGN;
114*e79a303fSAaron LI sigaction(SIGTSTP, &sa, NULL);
115*e79a303fSAaron LI sigaction(SIGHUP, &sa, NULL);
116*e79a303fSAaron LI
117*e79a303fSAaron LI setctty(_PATH_CONSOLE);
118*e79a303fSAaron LI
119*e79a303fSAaron LI argv[0] = "sh";
120*e79a303fSAaron LI argv[1] = _PATH_RUNCOM;
121*e79a303fSAaron LI argv[2] = "autoboot" ;
122*e79a303fSAaron LI argv[3] = NULL;
123*e79a303fSAaron LI
124*e79a303fSAaron LI sigprocmask(SIG_SETMASK, &sa.sa_mask, NULL);
125*e79a303fSAaron LI
126*e79a303fSAaron LI execv(_PATH_BSHELL, __DECONST(char **, argv));
127*e79a303fSAaron LI exit(1); /* force single user mode */
128*e79a303fSAaron LI }
129*e79a303fSAaron LI
130*e79a303fSAaron LI do {
131*e79a303fSAaron LI wpid = waitpid(-1, &status, WUNTRACED);
132*e79a303fSAaron LI } while (wpid != pid);
133*e79a303fSAaron LI
134*e79a303fSAaron LI error = chdir(_PATH_NEWROOT);
135*e79a303fSAaron LI if (error)
136*e79a303fSAaron LI goto chroot_failed;
137*e79a303fSAaron LI
138*e79a303fSAaron LI error = chroot_kernel(_PATH_NEWROOT);
139*e79a303fSAaron LI if (error)
140*e79a303fSAaron LI goto chroot_failed;
141*e79a303fSAaron LI
142*e79a303fSAaron LI error = chroot(_PATH_NEWROOT);
143*e79a303fSAaron LI if (error)
144*e79a303fSAaron LI goto chroot_failed;
145*e79a303fSAaron LI
146*e79a303fSAaron LI execv("/sbin/init", __DECONST(char **, argv_orig));
147*e79a303fSAaron LI
148*e79a303fSAaron LI /* We failed to exec /sbin/init in the chroot, sleep forever */
149*e79a303fSAaron LI chroot_failed:
150*e79a303fSAaron LI while(1) {
151*e79a303fSAaron LI sleep(3);
152*e79a303fSAaron LI };
153*e79a303fSAaron LI }
154*e79a303fSAaron LI
155