xref: /dflybsd-src/initrd/oinit/oinit.c (revision e79a303f7db7331d570bb6c6abdd555eeefdcdc2)
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