init.c revision 293744
1/*-
2 * Copyright (c) 1991, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Donn Seeley at Berkeley Software Design, Inc.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 4. Neither the name of the University nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#ifndef lint
34static const char copyright[] =
35"@(#) Copyright (c) 1991, 1993\n\
36	The Regents of the University of California.  All rights reserved.\n";
37#endif /* not lint */
38
39#ifndef lint
40#if 0
41static char sccsid[] = "@(#)init.c	8.1 (Berkeley) 7/15/93";
42#endif
43static const char rcsid[] =
44  "$FreeBSD: stable/10/sbin/init/init.c 293744 2016-01-12 10:14:57Z trasz $";
45#endif /* not lint */
46
47#include <sys/param.h>
48#include <sys/ioctl.h>
49#include <sys/mman.h>
50#include <sys/mount.h>
51#include <sys/sysctl.h>
52#include <sys/wait.h>
53#include <sys/stat.h>
54#include <sys/uio.h>
55
56#include <db.h>
57#include <errno.h>
58#include <fcntl.h>
59#include <kenv.h>
60#include <libutil.h>
61#include <paths.h>
62#include <signal.h>
63#include <stdio.h>
64#include <stdlib.h>
65#include <string.h>
66#include <syslog.h>
67#include <time.h>
68#include <ttyent.h>
69#include <unistd.h>
70#include <sys/reboot.h>
71#include <err.h>
72
73#include <stdarg.h>
74
75#ifdef SECURE
76#include <pwd.h>
77#endif
78
79#ifdef LOGIN_CAP
80#include <login_cap.h>
81#endif
82
83#include "mntopts.h"
84#include "pathnames.h"
85
86/*
87 * Sleep times; used to prevent thrashing.
88 */
89#define	GETTY_SPACING		 5	/* N secs minimum getty spacing */
90#define	GETTY_SLEEP		30	/* sleep N secs after spacing problem */
91#define	GETTY_NSPACE		 3	/* max. spacing count to bring reaction */
92#define	WINDOW_WAIT		 3	/* wait N secs after starting window */
93#define	STALL_TIMEOUT		30	/* wait N secs after warning */
94#define	DEATH_WATCH		10	/* wait N secs for procs to die */
95#define	DEATH_SCRIPT		120	/* wait for 2min for /etc/rc.shutdown */
96#define	RESOURCE_RC		"daemon"
97#define	RESOURCE_WINDOW		"default"
98#define	RESOURCE_GETTY		"default"
99
100static void handle(sig_t, ...);
101static void delset(sigset_t *, ...);
102
103static void stall(const char *, ...) __printflike(1, 2);
104static void warning(const char *, ...) __printflike(1, 2);
105static void emergency(const char *, ...) __printflike(1, 2);
106static void disaster(int);
107static void badsys(int);
108static void revoke_ttys(void);
109static int  runshutdown(void);
110static char *strk(char *);
111
112/*
113 * We really need a recursive typedef...
114 * The following at least guarantees that the return type of (*state_t)()
115 * is sufficiently wide to hold a function pointer.
116 */
117typedef long (*state_func_t)(void);
118typedef state_func_t (*state_t)(void);
119
120static state_func_t single_user(void);
121static state_func_t runcom(void);
122static state_func_t read_ttys(void);
123static state_func_t multi_user(void);
124static state_func_t clean_ttys(void);
125static state_func_t catatonia(void);
126static state_func_t death(void);
127static state_func_t death_single(void);
128static state_func_t reroot(void);
129static state_func_t reroot_phase_two(void);
130
131static state_func_t run_script(const char *);
132
133static enum { AUTOBOOT, FASTBOOT } runcom_mode = AUTOBOOT;
134#define FALSE	0
135#define TRUE	1
136
137static int Reboot = FALSE;
138static int howto = RB_AUTOBOOT;
139
140static int devfs;
141
142static void transition(state_t);
143static state_t requested_transition;
144static state_t current_state = death_single;
145
146static void open_console(void);
147static const char *get_shell(void);
148static void write_stderr(const char *message);
149
150typedef struct init_session {
151	int	se_index;		/* index of entry in ttys file */
152	pid_t	se_process;		/* controlling process */
153	time_t	se_started;		/* used to avoid thrashing */
154	int	se_flags;		/* status of session */
155#define	SE_SHUTDOWN	0x1		/* session won't be restarted */
156#define	SE_PRESENT	0x2		/* session is in /etc/ttys */
157	int	se_nspace;		/* spacing count */
158	char	*se_device;		/* filename of port */
159	char	*se_getty;		/* what to run on that port */
160	char	*se_getty_argv_space;   /* pre-parsed argument array space */
161	char	**se_getty_argv;	/* pre-parsed argument array */
162	char	*se_window;		/* window system (started only once) */
163	char	*se_window_argv_space;  /* pre-parsed argument array space */
164	char	**se_window_argv;	/* pre-parsed argument array */
165	char	*se_type;		/* default terminal type */
166	struct	init_session *se_prev;
167	struct	init_session *se_next;
168} session_t;
169
170static void free_session(session_t *);
171static session_t *new_session(session_t *, int, struct ttyent *);
172static session_t *sessions;
173
174static char **construct_argv(char *);
175static void start_window_system(session_t *);
176static void collect_child(pid_t);
177static pid_t start_getty(session_t *);
178static void transition_handler(int);
179static void alrm_handler(int);
180static void setsecuritylevel(int);
181static int getsecuritylevel(void);
182static int setupargv(session_t *, struct ttyent *);
183#ifdef LOGIN_CAP
184static void setprocresources(const char *);
185#endif
186static int clang;
187
188static int start_session_db(void);
189static void add_session(session_t *);
190static void del_session(session_t *);
191static session_t *find_session(pid_t);
192static DB *session_db;
193
194/*
195 * The mother of all processes.
196 */
197int
198main(int argc, char *argv[])
199{
200	state_t initial_transition = runcom;
201	char kenv_value[PATH_MAX];
202	int c, error;
203	struct sigaction sa;
204	sigset_t mask;
205
206	/* Dispose of random users. */
207	if (getuid() != 0)
208		errx(1, "%s", strerror(EPERM));
209
210	/* System V users like to reexec init. */
211	if (getpid() != 1) {
212#ifdef COMPAT_SYSV_INIT
213		/* So give them what they want */
214		if (argc > 1) {
215			if (strlen(argv[1]) == 1) {
216				char runlevel = *argv[1];
217				int sig;
218
219				switch (runlevel) {
220				case '0': /* halt + poweroff */
221					sig = SIGUSR2;
222					break;
223				case '1': /* single-user */
224					sig = SIGTERM;
225					break;
226				case '6': /* reboot */
227					sig = SIGINT;
228					break;
229				case 'c': /* block further logins */
230					sig = SIGTSTP;
231					break;
232				case 'q': /* rescan /etc/ttys */
233					sig = SIGHUP;
234					break;
235				case 'r': /* remount root */
236					sig = SIGEMT;
237					break;
238				default:
239					goto invalid;
240				}
241				kill(1, sig);
242				_exit(0);
243			} else
244invalid:
245				errx(1, "invalid run-level ``%s''", argv[1]);
246		} else
247#endif
248			errx(1, "already running");
249	}
250	/*
251	 * Note that this does NOT open a file...
252	 * Does 'init' deserve its own facility number?
253	 */
254	openlog("init", LOG_CONS|LOG_ODELAY, LOG_AUTH);
255
256	/*
257	 * Create an initial session.
258	 */
259	if (setsid() < 0 && (errno != EPERM || getsid(0) != 1))
260		warning("initial setsid() failed: %m");
261
262	/*
263	 * Establish an initial user so that programs running
264	 * single user do not freak out and die (like passwd).
265	 */
266	if (setlogin("root") < 0)
267		warning("setlogin() failed: %m");
268
269	/*
270	 * This code assumes that we always get arguments through flags,
271	 * never through bits set in some random machine register.
272	 */
273	while ((c = getopt(argc, argv, "dsfr")) != -1)
274		switch (c) {
275		case 'd':
276			devfs = 1;
277			break;
278		case 's':
279			initial_transition = single_user;
280			break;
281		case 'f':
282			runcom_mode = FASTBOOT;
283			break;
284		case 'r':
285			initial_transition = reroot_phase_two;
286			break;
287		default:
288			warning("unrecognized flag '-%c'", c);
289			break;
290		}
291
292	if (optind != argc)
293		warning("ignoring excess arguments");
294
295	/*
296	 * We catch or block signals rather than ignore them,
297	 * so that they get reset on exec.
298	 */
299	handle(badsys, SIGSYS, 0);
300	handle(disaster, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGXCPU,
301	    SIGXFSZ, 0);
302	handle(transition_handler, SIGHUP, SIGINT, SIGEMT, SIGTERM, SIGTSTP,
303	    SIGUSR1, SIGUSR2, 0);
304	handle(alrm_handler, SIGALRM, 0);
305	sigfillset(&mask);
306	delset(&mask, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGSYS,
307	    SIGXCPU, SIGXFSZ, SIGHUP, SIGINT, SIGEMT, SIGTERM, SIGTSTP,
308	    SIGALRM, SIGUSR1, SIGUSR2, 0);
309	sigprocmask(SIG_SETMASK, &mask, (sigset_t *) 0);
310	sigemptyset(&sa.sa_mask);
311	sa.sa_flags = 0;
312	sa.sa_handler = SIG_IGN;
313	sigaction(SIGTTIN, &sa, (struct sigaction *)0);
314	sigaction(SIGTTOU, &sa, (struct sigaction *)0);
315
316	/*
317	 * Paranoia.
318	 */
319	close(0);
320	close(1);
321	close(2);
322
323	if (kenv(KENV_GET, "init_script", kenv_value, sizeof(kenv_value)) > 0) {
324		state_func_t next_transition;
325
326		if ((next_transition = run_script(kenv_value)) != 0)
327			initial_transition = (state_t) next_transition;
328	}
329
330	if (kenv(KENV_GET, "init_chroot", kenv_value, sizeof(kenv_value)) > 0) {
331		if (chdir(kenv_value) != 0 || chroot(".") != 0)
332			warning("Can't chroot to %s: %m", kenv_value);
333	}
334
335	/*
336	 * Additional check if devfs needs to be mounted:
337	 * If "/" and "/dev" have the same device number,
338	 * then it hasn't been mounted yet.
339	 */
340	if (!devfs) {
341		struct stat stst;
342		dev_t root_devno;
343
344		stat("/", &stst);
345		root_devno = stst.st_dev;
346		if (stat("/dev", &stst) != 0)
347			warning("Can't stat /dev: %m");
348		else if (stst.st_dev == root_devno)
349			devfs++;
350	}
351
352	if (devfs) {
353		struct iovec iov[4];
354		char *s;
355		int i;
356
357		char _fstype[]	= "fstype";
358		char _devfs[]	= "devfs";
359		char _fspath[]	= "fspath";
360		char _path_dev[]= _PATH_DEV;
361
362		iov[0].iov_base = _fstype;
363		iov[0].iov_len = sizeof(_fstype);
364		iov[1].iov_base = _devfs;
365		iov[1].iov_len = sizeof(_devfs);
366		iov[2].iov_base = _fspath;
367		iov[2].iov_len = sizeof(_fspath);
368		/*
369		 * Try to avoid the trailing slash in _PATH_DEV.
370		 * Be *very* defensive.
371		 */
372		s = strdup(_PATH_DEV);
373		if (s != NULL) {
374			i = strlen(s);
375			if (i > 0 && s[i - 1] == '/')
376				s[i - 1] = '\0';
377			iov[3].iov_base = s;
378			iov[3].iov_len = strlen(s) + 1;
379		} else {
380			iov[3].iov_base = _path_dev;
381			iov[3].iov_len = sizeof(_path_dev);
382		}
383		nmount(iov, 4, 0);
384		if (s != NULL)
385			free(s);
386	}
387
388	if (initial_transition != reroot_phase_two) {
389		/*
390		 * Unmount reroot leftovers.  This runs after init(8)
391		 * gets reexecuted after reroot_phase_two() is done.
392		 */
393		error = unmount(_PATH_REROOT, MNT_FORCE);
394		if (error != 0 && errno != EINVAL)
395			warning("Cannot unmount %s: %m", _PATH_REROOT);
396	}
397
398	/*
399	 * Start the state machine.
400	 */
401	transition(initial_transition);
402
403	/*
404	 * Should never reach here.
405	 */
406	return 1;
407}
408
409/*
410 * Associate a function with a signal handler.
411 */
412static void
413handle(sig_t handler, ...)
414{
415	int sig;
416	struct sigaction sa;
417	sigset_t mask_everything;
418	va_list ap;
419	va_start(ap, handler);
420
421	sa.sa_handler = handler;
422	sigfillset(&mask_everything);
423
424	while ((sig = va_arg(ap, int)) != 0) {
425		sa.sa_mask = mask_everything;
426		/* XXX SA_RESTART? */
427		sa.sa_flags = sig == SIGCHLD ? SA_NOCLDSTOP : 0;
428		sigaction(sig, &sa, (struct sigaction *) 0);
429	}
430	va_end(ap);
431}
432
433/*
434 * Delete a set of signals from a mask.
435 */
436static void
437delset(sigset_t *maskp, ...)
438{
439	int sig;
440	va_list ap;
441	va_start(ap, maskp);
442
443	while ((sig = va_arg(ap, int)) != 0)
444		sigdelset(maskp, sig);
445	va_end(ap);
446}
447
448/*
449 * Log a message and sleep for a while (to give someone an opportunity
450 * to read it and to save log or hardcopy output if the problem is chronic).
451 * NB: should send a message to the session logger to avoid blocking.
452 */
453static void
454stall(const char *message, ...)
455{
456	va_list ap;
457	va_start(ap, message);
458
459	vsyslog(LOG_ALERT, message, ap);
460	va_end(ap);
461	sleep(STALL_TIMEOUT);
462}
463
464/*
465 * Like stall(), but doesn't sleep.
466 * If cpp had variadic macros, the two functions could be #defines for another.
467 * NB: should send a message to the session logger to avoid blocking.
468 */
469static void
470warning(const char *message, ...)
471{
472	va_list ap;
473	va_start(ap, message);
474
475	vsyslog(LOG_ALERT, message, ap);
476	va_end(ap);
477}
478
479/*
480 * Log an emergency message.
481 * NB: should send a message to the session logger to avoid blocking.
482 */
483static void
484emergency(const char *message, ...)
485{
486	va_list ap;
487	va_start(ap, message);
488
489	vsyslog(LOG_EMERG, message, ap);
490	va_end(ap);
491}
492
493/*
494 * Catch a SIGSYS signal.
495 *
496 * These may arise if a system does not support sysctl.
497 * We tolerate up to 25 of these, then throw in the towel.
498 */
499static void
500badsys(int sig)
501{
502	static int badcount = 0;
503
504	if (badcount++ < 25)
505		return;
506	disaster(sig);
507}
508
509/*
510 * Catch an unexpected signal.
511 */
512static void
513disaster(int sig)
514{
515
516	emergency("fatal signal: %s",
517	    (unsigned)sig < NSIG ? sys_siglist[sig] : "unknown signal");
518
519	sleep(STALL_TIMEOUT);
520	_exit(sig);		/* reboot */
521}
522
523/*
524 * Get the security level of the kernel.
525 */
526static int
527getsecuritylevel(void)
528{
529#ifdef KERN_SECURELVL
530	int name[2], curlevel;
531	size_t len;
532
533	name[0] = CTL_KERN;
534	name[1] = KERN_SECURELVL;
535	len = sizeof curlevel;
536	if (sysctl(name, 2, &curlevel, &len, NULL, 0) == -1) {
537		emergency("cannot get kernel security level: %s",
538		    strerror(errno));
539		return (-1);
540	}
541	return (curlevel);
542#else
543	return (-1);
544#endif
545}
546
547/*
548 * Set the security level of the kernel.
549 */
550static void
551setsecuritylevel(int newlevel)
552{
553#ifdef KERN_SECURELVL
554	int name[2], curlevel;
555
556	curlevel = getsecuritylevel();
557	if (newlevel == curlevel)
558		return;
559	name[0] = CTL_KERN;
560	name[1] = KERN_SECURELVL;
561	if (sysctl(name, 2, NULL, NULL, &newlevel, sizeof newlevel) == -1) {
562		emergency(
563		    "cannot change kernel security level from %d to %d: %s",
564		    curlevel, newlevel, strerror(errno));
565		return;
566	}
567#ifdef SECURE
568	warning("kernel security level changed from %d to %d",
569	    curlevel, newlevel);
570#endif
571#endif
572}
573
574/*
575 * Change states in the finite state machine.
576 * The initial state is passed as an argument.
577 */
578static void
579transition(state_t s)
580{
581
582	current_state = s;
583	for (;;)
584		current_state = (state_t) (*current_state)();
585}
586
587/*
588 * Start a session and allocate a controlling terminal.
589 * Only called by children of init after forking.
590 */
591static void
592open_console(void)
593{
594	int fd;
595
596	/*
597	 * Try to open /dev/console.  Open the device with O_NONBLOCK to
598	 * prevent potential blocking on a carrier.
599	 */
600	revoke(_PATH_CONSOLE);
601	if ((fd = open(_PATH_CONSOLE, O_RDWR | O_NONBLOCK)) != -1) {
602		(void)fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK);
603		if (login_tty(fd) == 0)
604			return;
605		close(fd);
606	}
607
608	/* No luck.  Log output to file if possible. */
609	if ((fd = open(_PATH_DEVNULL, O_RDWR)) == -1) {
610		stall("cannot open null device.");
611		_exit(1);
612	}
613	if (fd != STDIN_FILENO) {
614		dup2(fd, STDIN_FILENO);
615		close(fd);
616	}
617	fd = open(_PATH_INITLOG, O_WRONLY | O_APPEND | O_CREAT, 0644);
618	if (fd == -1)
619		dup2(STDIN_FILENO, STDOUT_FILENO);
620	else if (fd != STDOUT_FILENO) {
621		dup2(fd, STDOUT_FILENO);
622		close(fd);
623	}
624	dup2(STDOUT_FILENO, STDERR_FILENO);
625}
626
627static const char *
628get_shell(void)
629{
630	static char kenv_value[PATH_MAX];
631
632	if (kenv(KENV_GET, "init_shell", kenv_value, sizeof(kenv_value)) > 0)
633		return kenv_value;
634	else
635		return _PATH_BSHELL;
636}
637
638static void
639write_stderr(const char *message)
640{
641
642	write(STDERR_FILENO, message, strlen(message));
643}
644
645static int
646read_file(const char *path, void **bufp, size_t *bufsizep)
647{
648	struct stat sb;
649	size_t bufsize;
650	void *buf;
651	ssize_t nbytes;
652	int error, fd;
653
654	fd = open(path, O_RDONLY);
655	if (fd < 0) {
656		emergency("%s: %s", path, strerror(errno));
657		return (-1);
658	}
659
660	error = fstat(fd, &sb);
661	if (error != 0) {
662		emergency("fstat: %s", strerror(errno));
663		return (error);
664	}
665
666	bufsize = sb.st_size;
667	buf = malloc(bufsize);
668	if (buf == NULL) {
669		emergency("malloc: %s", strerror(errno));
670		return (error);
671	}
672
673	nbytes = read(fd, buf, bufsize);
674	if (nbytes != (ssize_t)bufsize) {
675		emergency("read: %s", strerror(errno));
676		free(buf);
677		return (error);
678	}
679
680	error = close(fd);
681	if (error != 0) {
682		emergency("close: %s", strerror(errno));
683		free(buf);
684		return (error);
685	}
686
687	*bufp = buf;
688	*bufsizep = bufsize;
689
690	return (0);
691}
692
693static int
694create_file(const char *path, void *buf, size_t bufsize)
695{
696	ssize_t nbytes;
697	int error, fd;
698
699	fd = open(path, O_WRONLY | O_CREAT | O_EXCL, 0700);
700	if (fd < 0) {
701		emergency("%s: %s", path, strerror(errno));
702		return (-1);
703	}
704
705	nbytes = write(fd, buf, bufsize);
706	if (nbytes != (ssize_t)bufsize) {
707		emergency("write: %s", strerror(errno));
708		return (-1);
709	}
710
711	error = close(fd);
712	if (error != 0) {
713		emergency("close: %s", strerror(errno));
714		free(buf);
715		return (-1);
716	}
717
718	return (0);
719}
720
721static int
722mount_tmpfs(const char *fspath)
723{
724	struct iovec *iov;
725	char errmsg[255];
726	int error, iovlen;
727
728	iov = NULL;
729	iovlen = 0;
730	memset(errmsg, 0, sizeof(errmsg));
731	build_iovec(&iov, &iovlen, "fstype",
732	    __DECONST(void *, "tmpfs"), (size_t)-1);
733	build_iovec(&iov, &iovlen, "fspath",
734	    __DECONST(void *, fspath), (size_t)-1);
735	build_iovec(&iov, &iovlen, "errmsg",
736	    errmsg, sizeof(errmsg));
737
738	error = nmount(iov, iovlen, 0);
739	if (error != 0) {
740		if (*errmsg != '\0') {
741			emergency("cannot mount tmpfs on %s: %s: %s",
742			    fspath, errmsg, strerror(errno));
743		} else {
744			emergency("cannot mount tmpfs on %s: %s",
745			    fspath, strerror(errno));
746		}
747		return (error);
748	}
749	return (0);
750}
751
752static state_func_t
753reroot(void)
754{
755	void *buf;
756	char init_path[PATH_MAX];
757	size_t bufsize, init_path_len;
758	int error, name[4];
759
760	name[0] = CTL_KERN;
761	name[1] = KERN_PROC;
762	name[2] = KERN_PROC_PATHNAME;
763	name[3] = -1;
764	init_path_len = sizeof(init_path);
765	error = sysctl(name, 4, init_path, &init_path_len, NULL, 0);
766	if (error != 0) {
767		emergency("failed to get kern.proc.pathname: %s",
768		    strerror(errno));
769		goto out;
770	}
771
772	revoke_ttys();
773	runshutdown();
774
775	/*
776	 * Make sure nobody can interfere with our scheme.
777	 */
778	error = kill(-1, SIGKILL);
779	if (error != 0) {
780		emergency("kill(2) failed: %s", strerror(errno));
781		goto out;
782	}
783
784	/*
785	 * Pacify GCC.
786	 */
787	buf = NULL;
788	bufsize = 0;
789
790	/*
791	 * Copy the init binary into tmpfs, so that we can unmount
792	 * the old rootfs without committing suicide.
793	 */
794	error = read_file(init_path, &buf, &bufsize);
795	if (error != 0)
796		goto out;
797	error = mount_tmpfs(_PATH_REROOT);
798	if (error != 0)
799		goto out;
800	error = create_file(_PATH_REROOT_INIT, buf, bufsize);
801	if (error != 0)
802		goto out;
803
804	/*
805	 * Execute the temporary init.
806	 */
807	execl(_PATH_REROOT_INIT, _PATH_REROOT_INIT, "-r", NULL);
808	emergency("cannot exec %s: %s", _PATH_REROOT_INIT, strerror(errno));
809
810out:
811	emergency("reroot failed; going to single user mode");
812	return (state_func_t) single_user;
813}
814
815static state_func_t
816reroot_phase_two(void)
817{
818	char init_path[PATH_MAX], *path, *path_component;
819	size_t init_path_len;
820	int nbytes, error;
821
822	/*
823	 * Ask the kernel to mount the new rootfs.
824	 */
825	error = reboot(RB_REROOT);
826	if (error != 0) {
827		emergency("RB_REBOOT failed: %s", strerror(errno));
828		goto out;
829	}
830
831	/*
832	 * Figure out where the destination init(8) binary is.  Note that
833	 * the path could be different than what we've started with.  Use
834	 * the value from kenv, if set, or the one from sysctl otherwise.
835	 * The latter defaults to a hardcoded value, but can be overridden
836	 * by a build time option.
837	 */
838	nbytes = kenv(KENV_GET, "init_path", init_path, sizeof(init_path));
839	if (nbytes <= 0) {
840		init_path_len = sizeof(init_path);
841		error = sysctlbyname("kern.init_path",
842		    init_path, &init_path_len, NULL, 0);
843		if (error != 0) {
844			emergency("failed to retrieve kern.init_path: %s",
845			    strerror(errno));
846			goto out;
847		}
848	}
849
850	/*
851	 * Repeat the init search logic from sys/kern/init_path.c
852	 */
853	path_component = init_path;
854	while ((path = strsep(&path_component, ":")) != NULL) {
855		/*
856		 * Execute init(8) from the new rootfs.
857		 */
858		execl(path, path, NULL);
859	}
860	emergency("cannot exec init from %s: %s", init_path, strerror(errno));
861
862out:
863	emergency("reroot failed; going to single user mode");
864	return (state_func_t) single_user;
865}
866
867/*
868 * Bring the system up single user.
869 */
870static state_func_t
871single_user(void)
872{
873	pid_t pid, wpid;
874	int status;
875	sigset_t mask;
876	const char *shell;
877	char *argv[2];
878#ifdef SECURE
879	struct ttyent *typ;
880	struct passwd *pp;
881	static const char banner[] =
882		"Enter root password, or ^D to go multi-user\n";
883	char *clear, *password;
884#endif
885#ifdef DEBUGSHELL
886	char altshell[128];
887#endif
888
889	if (Reboot) {
890		/* Instead of going single user, let's reboot the machine */
891		sync();
892		reboot(howto);
893		_exit(0);
894	}
895
896	shell = get_shell();
897
898	if ((pid = fork()) == 0) {
899		/*
900		 * Start the single user session.
901		 */
902		open_console();
903
904#ifdef SECURE
905		/*
906		 * Check the root password.
907		 * We don't care if the console is 'on' by default;
908		 * it's the only tty that can be 'off' and 'secure'.
909		 */
910		typ = getttynam("console");
911		pp = getpwnam("root");
912		if (typ && (typ->ty_status & TTY_SECURE) == 0 &&
913		    pp && *pp->pw_passwd) {
914			write_stderr(banner);
915			for (;;) {
916				clear = getpass("Password:");
917				if (clear == 0 || *clear == '\0')
918					_exit(0);
919				password = crypt(clear, pp->pw_passwd);
920				bzero(clear, _PASSWORD_LEN);
921				if (password == NULL ||
922				    strcmp(password, pp->pw_passwd) == 0)
923					break;
924				warning("single-user login failed\n");
925			}
926		}
927		endttyent();
928		endpwent();
929#endif /* SECURE */
930
931#ifdef DEBUGSHELL
932		{
933			char *cp = altshell;
934			int num;
935
936#define	SHREQUEST "Enter full pathname of shell or RETURN for "
937			write_stderr(SHREQUEST);
938			write_stderr(shell);
939			write_stderr(": ");
940			while ((num = read(STDIN_FILENO, cp, 1)) != -1 &&
941			    num != 0 && *cp != '\n' && cp < &altshell[127])
942				cp++;
943			*cp = '\0';
944			if (altshell[0] != '\0')
945				shell = altshell;
946		}
947#endif /* DEBUGSHELL */
948
949		/*
950		 * Unblock signals.
951		 * We catch all the interesting ones,
952		 * and those are reset to SIG_DFL on exec.
953		 */
954		sigemptyset(&mask);
955		sigprocmask(SIG_SETMASK, &mask, (sigset_t *) 0);
956
957		/*
958		 * Fire off a shell.
959		 * If the default one doesn't work, try the Bourne shell.
960		 */
961
962		char name[] = "-sh";
963
964		argv[0] = name;
965		argv[1] = 0;
966		execv(shell, argv);
967		emergency("can't exec %s for single user: %m", shell);
968		execv(_PATH_BSHELL, argv);
969		emergency("can't exec %s for single user: %m", _PATH_BSHELL);
970		sleep(STALL_TIMEOUT);
971		_exit(1);
972	}
973
974	if (pid == -1) {
975		/*
976		 * We are seriously hosed.  Do our best.
977		 */
978		emergency("can't fork single-user shell, trying again");
979		while (waitpid(-1, (int *) 0, WNOHANG) > 0)
980			continue;
981		return (state_func_t) single_user;
982	}
983
984	requested_transition = 0;
985	do {
986		if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1)
987			collect_child(wpid);
988		if (wpid == -1) {
989			if (errno == EINTR)
990				continue;
991			warning("wait for single-user shell failed: %m; restarting");
992			return (state_func_t) single_user;
993		}
994		if (wpid == pid && WIFSTOPPED(status)) {
995			warning("init: shell stopped, restarting\n");
996			kill(pid, SIGCONT);
997			wpid = -1;
998		}
999	} while (wpid != pid && !requested_transition);
1000
1001	if (requested_transition)
1002		return (state_func_t) requested_transition;
1003
1004	if (!WIFEXITED(status)) {
1005		if (WTERMSIG(status) == SIGKILL) {
1006			/*
1007			 *  reboot(8) killed shell?
1008			 */
1009			warning("single user shell terminated.");
1010			sleep(STALL_TIMEOUT);
1011			_exit(0);
1012		} else {
1013			warning("single user shell terminated, restarting");
1014			return (state_func_t) single_user;
1015		}
1016	}
1017
1018	runcom_mode = FASTBOOT;
1019	return (state_func_t) runcom;
1020}
1021
1022/*
1023 * Run the system startup script.
1024 */
1025static state_func_t
1026runcom(void)
1027{
1028	state_func_t next_transition;
1029
1030	if ((next_transition = run_script(_PATH_RUNCOM)) != 0)
1031		return next_transition;
1032
1033	runcom_mode = AUTOBOOT;		/* the default */
1034	return (state_func_t) read_ttys;
1035}
1036
1037/*
1038 * Run a shell script.
1039 * Returns 0 on success, otherwise the next transition to enter:
1040 *  - single_user if fork/execv/waitpid failed, or if the script
1041 *    terminated with a signal or exit code != 0.
1042 *  - death_single if a SIGTERM was delivered to init(8).
1043 */
1044static state_func_t
1045run_script(const char *script)
1046{
1047	pid_t pid, wpid;
1048	int status;
1049	char *argv[4];
1050	const char *shell;
1051	struct sigaction sa;
1052
1053	shell = get_shell();
1054
1055	if ((pid = fork()) == 0) {
1056		sigemptyset(&sa.sa_mask);
1057		sa.sa_flags = 0;
1058		sa.sa_handler = SIG_IGN;
1059		sigaction(SIGTSTP, &sa, (struct sigaction *)0);
1060		sigaction(SIGHUP, &sa, (struct sigaction *)0);
1061
1062		open_console();
1063
1064		char _sh[]		= "sh";
1065		char _autoboot[]	= "autoboot";
1066
1067		argv[0] = _sh;
1068		argv[1] = __DECONST(char *, script);
1069		argv[2] = runcom_mode == AUTOBOOT ? _autoboot : 0;
1070		argv[3] = 0;
1071
1072		sigprocmask(SIG_SETMASK, &sa.sa_mask, (sigset_t *) 0);
1073
1074#ifdef LOGIN_CAP
1075		setprocresources(RESOURCE_RC);
1076#endif
1077		execv(shell, argv);
1078		stall("can't exec %s for %s: %m", shell, script);
1079		_exit(1);	/* force single user mode */
1080	}
1081
1082	if (pid == -1) {
1083		emergency("can't fork for %s on %s: %m", shell, script);
1084		while (waitpid(-1, (int *) 0, WNOHANG) > 0)
1085			continue;
1086		sleep(STALL_TIMEOUT);
1087		return (state_func_t) single_user;
1088	}
1089
1090	/*
1091	 * Copied from single_user().  This is a bit paranoid.
1092	 */
1093	requested_transition = 0;
1094	do {
1095		if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1)
1096			collect_child(wpid);
1097		if (wpid == -1) {
1098			if (requested_transition == death_single ||
1099			    requested_transition == reroot)
1100				return (state_func_t) requested_transition;
1101			if (errno == EINTR)
1102				continue;
1103			warning("wait for %s on %s failed: %m; going to "
1104			    "single user mode", shell, script);
1105			return (state_func_t) single_user;
1106		}
1107		if (wpid == pid && WIFSTOPPED(status)) {
1108			warning("init: %s on %s stopped, restarting\n",
1109			    shell, script);
1110			kill(pid, SIGCONT);
1111			wpid = -1;
1112		}
1113	} while (wpid != pid);
1114
1115	if (WIFSIGNALED(status) && WTERMSIG(status) == SIGTERM &&
1116	    requested_transition == catatonia) {
1117		/* /etc/rc executed /sbin/reboot; wait for the end quietly */
1118		sigset_t s;
1119
1120		sigfillset(&s);
1121		for (;;)
1122			sigsuspend(&s);
1123	}
1124
1125	if (!WIFEXITED(status)) {
1126		warning("%s on %s terminated abnormally, going to single "
1127		    "user mode", shell, script);
1128		return (state_func_t) single_user;
1129	}
1130
1131	if (WEXITSTATUS(status))
1132		return (state_func_t) single_user;
1133
1134	return (state_func_t) 0;
1135}
1136
1137/*
1138 * Open the session database.
1139 *
1140 * NB: We could pass in the size here; is it necessary?
1141 */
1142static int
1143start_session_db(void)
1144{
1145	if (session_db && (*session_db->close)(session_db))
1146		emergency("session database close: %s", strerror(errno));
1147	if ((session_db = dbopen(NULL, O_RDWR, 0, DB_HASH, NULL)) == 0) {
1148		emergency("session database open: %s", strerror(errno));
1149		return (1);
1150	}
1151	return (0);
1152
1153}
1154
1155/*
1156 * Add a new login session.
1157 */
1158static void
1159add_session(session_t *sp)
1160{
1161	DBT key;
1162	DBT data;
1163
1164	key.data = &sp->se_process;
1165	key.size = sizeof sp->se_process;
1166	data.data = &sp;
1167	data.size = sizeof sp;
1168
1169	if ((*session_db->put)(session_db, &key, &data, 0))
1170		emergency("insert %d: %s", sp->se_process, strerror(errno));
1171}
1172
1173/*
1174 * Delete an old login session.
1175 */
1176static void
1177del_session(session_t *sp)
1178{
1179	DBT key;
1180
1181	key.data = &sp->se_process;
1182	key.size = sizeof sp->se_process;
1183
1184	if ((*session_db->del)(session_db, &key, 0))
1185		emergency("delete %d: %s", sp->se_process, strerror(errno));
1186}
1187
1188/*
1189 * Look up a login session by pid.
1190 */
1191static session_t *
1192find_session(pid_t pid)
1193{
1194	DBT key;
1195	DBT data;
1196	session_t *ret;
1197
1198	key.data = &pid;
1199	key.size = sizeof pid;
1200	if ((*session_db->get)(session_db, &key, &data, 0) != 0)
1201		return 0;
1202	bcopy(data.data, (char *)&ret, sizeof(ret));
1203	return ret;
1204}
1205
1206/*
1207 * Construct an argument vector from a command line.
1208 */
1209static char **
1210construct_argv(char *command)
1211{
1212	int argc = 0;
1213	char **argv = (char **) malloc(((strlen(command) + 1) / 2 + 1)
1214						* sizeof (char *));
1215
1216	if ((argv[argc++] = strk(command)) == 0) {
1217		free(argv);
1218		return (NULL);
1219	}
1220	while ((argv[argc++] = strk((char *) 0)) != NULL)
1221		continue;
1222	return argv;
1223}
1224
1225/*
1226 * Deallocate a session descriptor.
1227 */
1228static void
1229free_session(session_t *sp)
1230{
1231	free(sp->se_device);
1232	if (sp->se_getty) {
1233		free(sp->se_getty);
1234		free(sp->se_getty_argv_space);
1235		free(sp->se_getty_argv);
1236	}
1237	if (sp->se_window) {
1238		free(sp->se_window);
1239		free(sp->se_window_argv_space);
1240		free(sp->se_window_argv);
1241	}
1242	if (sp->se_type)
1243		free(sp->se_type);
1244	free(sp);
1245}
1246
1247/*
1248 * Allocate a new session descriptor.
1249 * Mark it SE_PRESENT.
1250 */
1251static session_t *
1252new_session(session_t *sprev, int session_index, struct ttyent *typ)
1253{
1254	session_t *sp;
1255	int fd;
1256
1257	if ((typ->ty_status & TTY_ON) == 0 ||
1258	    typ->ty_name == 0 ||
1259	    typ->ty_getty == 0)
1260		return 0;
1261
1262	sp = (session_t *) calloc(1, sizeof (session_t));
1263
1264	sp->se_index = session_index;
1265	sp->se_flags |= SE_PRESENT;
1266
1267	sp->se_device = malloc(sizeof(_PATH_DEV) + strlen(typ->ty_name));
1268	sprintf(sp->se_device, "%s%s", _PATH_DEV, typ->ty_name);
1269
1270	/*
1271	 * Attempt to open the device, if we get "device not configured"
1272	 * then don't add the device to the session list.
1273	 */
1274	if ((fd = open(sp->se_device, O_RDONLY | O_NONBLOCK, 0)) < 0) {
1275		if (errno == ENXIO) {
1276			free_session(sp);
1277			return (0);
1278		}
1279	} else
1280		close(fd);
1281
1282	if (setupargv(sp, typ) == 0) {
1283		free_session(sp);
1284		return (0);
1285	}
1286
1287	sp->se_next = 0;
1288	if (sprev == 0) {
1289		sessions = sp;
1290		sp->se_prev = 0;
1291	} else {
1292		sprev->se_next = sp;
1293		sp->se_prev = sprev;
1294	}
1295
1296	return sp;
1297}
1298
1299/*
1300 * Calculate getty and if useful window argv vectors.
1301 */
1302static int
1303setupargv(session_t *sp, struct ttyent *typ)
1304{
1305
1306	if (sp->se_getty) {
1307		free(sp->se_getty);
1308		free(sp->se_getty_argv_space);
1309		free(sp->se_getty_argv);
1310	}
1311	sp->se_getty = malloc(strlen(typ->ty_getty) + strlen(typ->ty_name) + 2);
1312	sprintf(sp->se_getty, "%s %s", typ->ty_getty, typ->ty_name);
1313	sp->se_getty_argv_space = strdup(sp->se_getty);
1314	sp->se_getty_argv = construct_argv(sp->se_getty_argv_space);
1315	if (sp->se_getty_argv == 0) {
1316		warning("can't parse getty for port %s", sp->se_device);
1317		free(sp->se_getty);
1318		free(sp->se_getty_argv_space);
1319		sp->se_getty = sp->se_getty_argv_space = 0;
1320		return (0);
1321	}
1322	if (sp->se_window) {
1323		free(sp->se_window);
1324		free(sp->se_window_argv_space);
1325		free(sp->se_window_argv);
1326	}
1327	sp->se_window = sp->se_window_argv_space = 0;
1328	sp->se_window_argv = 0;
1329	if (typ->ty_window) {
1330		sp->se_window = strdup(typ->ty_window);
1331		sp->se_window_argv_space = strdup(sp->se_window);
1332		sp->se_window_argv = construct_argv(sp->se_window_argv_space);
1333		if (sp->se_window_argv == 0) {
1334			warning("can't parse window for port %s",
1335			    sp->se_device);
1336			free(sp->se_window_argv_space);
1337			free(sp->se_window);
1338			sp->se_window = sp->se_window_argv_space = 0;
1339			return (0);
1340		}
1341	}
1342	if (sp->se_type)
1343		free(sp->se_type);
1344	sp->se_type = typ->ty_type ? strdup(typ->ty_type) : 0;
1345	return (1);
1346}
1347
1348/*
1349 * Walk the list of ttys and create sessions for each active line.
1350 */
1351static state_func_t
1352read_ttys(void)
1353{
1354	int session_index = 0;
1355	session_t *sp, *snext;
1356	struct ttyent *typ;
1357
1358	/*
1359	 * Destroy any previous session state.
1360	 * There shouldn't be any, but just in case...
1361	 */
1362	for (sp = sessions; sp; sp = snext) {
1363		snext = sp->se_next;
1364		free_session(sp);
1365	}
1366	sessions = 0;
1367	if (start_session_db())
1368		return (state_func_t) single_user;
1369
1370	/*
1371	 * Allocate a session entry for each active port.
1372	 * Note that sp starts at 0.
1373	 */
1374	while ((typ = getttyent()) != NULL)
1375		if ((snext = new_session(sp, ++session_index, typ)) != NULL)
1376			sp = snext;
1377
1378	endttyent();
1379
1380	return (state_func_t) multi_user;
1381}
1382
1383/*
1384 * Start a window system running.
1385 */
1386static void
1387start_window_system(session_t *sp)
1388{
1389	pid_t pid;
1390	sigset_t mask;
1391	char term[64], *env[2];
1392	int status;
1393
1394	if ((pid = fork()) == -1) {
1395		emergency("can't fork for window system on port %s: %m",
1396		    sp->se_device);
1397		/* hope that getty fails and we can try again */
1398		return;
1399	}
1400	if (pid) {
1401		waitpid(-1, &status, 0);
1402		return;
1403	}
1404
1405	/* reparent window process to the init to not make a zombie on exit */
1406	if ((pid = fork()) == -1) {
1407		emergency("can't fork for window system on port %s: %m",
1408		    sp->se_device);
1409		_exit(1);
1410	}
1411	if (pid)
1412		_exit(0);
1413
1414	sigemptyset(&mask);
1415	sigprocmask(SIG_SETMASK, &mask, (sigset_t *) 0);
1416
1417	if (setsid() < 0)
1418		emergency("setsid failed (window) %m");
1419
1420#ifdef LOGIN_CAP
1421	setprocresources(RESOURCE_WINDOW);
1422#endif
1423	if (sp->se_type) {
1424		/* Don't use malloc after fork */
1425		strcpy(term, "TERM=");
1426		strncat(term, sp->se_type, sizeof(term) - 6);
1427		env[0] = term;
1428		env[1] = 0;
1429	}
1430	else
1431		env[0] = 0;
1432	execve(sp->se_window_argv[0], sp->se_window_argv, env);
1433	stall("can't exec window system '%s' for port %s: %m",
1434		sp->se_window_argv[0], sp->se_device);
1435	_exit(1);
1436}
1437
1438/*
1439 * Start a login session running.
1440 */
1441static pid_t
1442start_getty(session_t *sp)
1443{
1444	pid_t pid;
1445	sigset_t mask;
1446	time_t current_time = time((time_t *) 0);
1447	int too_quick = 0;
1448	char term[64], *env[2];
1449
1450	if (current_time >= sp->se_started &&
1451	    current_time - sp->se_started < GETTY_SPACING) {
1452		if (++sp->se_nspace > GETTY_NSPACE) {
1453			sp->se_nspace = 0;
1454			too_quick = 1;
1455		}
1456	} else
1457		sp->se_nspace = 0;
1458
1459	/*
1460	 * fork(), not vfork() -- we can't afford to block.
1461	 */
1462	if ((pid = fork()) == -1) {
1463		emergency("can't fork for getty on port %s: %m", sp->se_device);
1464		return -1;
1465	}
1466
1467	if (pid)
1468		return pid;
1469
1470	if (too_quick) {
1471		warning("getty repeating too quickly on port %s, sleeping %d secs",
1472		    sp->se_device, GETTY_SLEEP);
1473		sleep((unsigned) GETTY_SLEEP);
1474	}
1475
1476	if (sp->se_window) {
1477		start_window_system(sp);
1478		sleep(WINDOW_WAIT);
1479	}
1480
1481	sigemptyset(&mask);
1482	sigprocmask(SIG_SETMASK, &mask, (sigset_t *) 0);
1483
1484#ifdef LOGIN_CAP
1485	setprocresources(RESOURCE_GETTY);
1486#endif
1487	if (sp->se_type) {
1488		/* Don't use malloc after fork */
1489		strcpy(term, "TERM=");
1490		strncat(term, sp->se_type, sizeof(term) - 6);
1491		env[0] = term;
1492		env[1] = 0;
1493	} else
1494		env[0] = 0;
1495	execve(sp->se_getty_argv[0], sp->se_getty_argv, env);
1496	stall("can't exec getty '%s' for port %s: %m",
1497		sp->se_getty_argv[0], sp->se_device);
1498	_exit(1);
1499}
1500
1501/*
1502 * Collect exit status for a child.
1503 * If an exiting login, start a new login running.
1504 */
1505static void
1506collect_child(pid_t pid)
1507{
1508	session_t *sp, *sprev, *snext;
1509
1510	if (! sessions)
1511		return;
1512
1513	if (! (sp = find_session(pid)))
1514		return;
1515
1516	del_session(sp);
1517	sp->se_process = 0;
1518
1519	if (sp->se_flags & SE_SHUTDOWN) {
1520		if ((sprev = sp->se_prev) != NULL)
1521			sprev->se_next = sp->se_next;
1522		else
1523			sessions = sp->se_next;
1524		if ((snext = sp->se_next) != NULL)
1525			snext->se_prev = sp->se_prev;
1526		free_session(sp);
1527		return;
1528	}
1529
1530	if ((pid = start_getty(sp)) == -1) {
1531		/* serious trouble */
1532		requested_transition = clean_ttys;
1533		return;
1534	}
1535
1536	sp->se_process = pid;
1537	sp->se_started = time((time_t *) 0);
1538	add_session(sp);
1539}
1540
1541/*
1542 * Catch a signal and request a state transition.
1543 */
1544static void
1545transition_handler(int sig)
1546{
1547
1548	switch (sig) {
1549	case SIGHUP:
1550		if (current_state == read_ttys || current_state == multi_user ||
1551		    current_state == clean_ttys || current_state == catatonia)
1552			requested_transition = clean_ttys;
1553		break;
1554	case SIGUSR2:
1555		howto = RB_POWEROFF;
1556	case SIGUSR1:
1557		howto |= RB_HALT;
1558	case SIGINT:
1559		Reboot = TRUE;
1560	case SIGTERM:
1561		if (current_state == read_ttys || current_state == multi_user ||
1562		    current_state == clean_ttys || current_state == catatonia)
1563			requested_transition = death;
1564		else
1565			requested_transition = death_single;
1566		break;
1567	case SIGTSTP:
1568		if (current_state == runcom || current_state == read_ttys ||
1569		    current_state == clean_ttys ||
1570		    current_state == multi_user || current_state == catatonia)
1571			requested_transition = catatonia;
1572		break;
1573	case SIGEMT:
1574		requested_transition = reroot;
1575		break;
1576	default:
1577		requested_transition = 0;
1578		break;
1579	}
1580}
1581
1582/*
1583 * Take the system multiuser.
1584 */
1585static state_func_t
1586multi_user(void)
1587{
1588	pid_t pid;
1589	session_t *sp;
1590
1591	requested_transition = 0;
1592
1593	/*
1594	 * If the administrator has not set the security level to -1
1595	 * to indicate that the kernel should not run multiuser in secure
1596	 * mode, and the run script has not set a higher level of security
1597	 * than level 1, then put the kernel into secure mode.
1598	 */
1599	if (getsecuritylevel() == 0)
1600		setsecuritylevel(1);
1601
1602	for (sp = sessions; sp; sp = sp->se_next) {
1603		if (sp->se_process)
1604			continue;
1605		if ((pid = start_getty(sp)) == -1) {
1606			/* serious trouble */
1607			requested_transition = clean_ttys;
1608			break;
1609		}
1610		sp->se_process = pid;
1611		sp->se_started = time((time_t *) 0);
1612		add_session(sp);
1613	}
1614
1615	while (!requested_transition)
1616		if ((pid = waitpid(-1, (int *) 0, 0)) != -1)
1617			collect_child(pid);
1618
1619	return (state_func_t) requested_transition;
1620}
1621
1622/*
1623 * This is an (n*2)+(n^2) algorithm.  We hope it isn't run often...
1624 */
1625static state_func_t
1626clean_ttys(void)
1627{
1628	session_t *sp, *sprev;
1629	struct ttyent *typ;
1630	int session_index = 0;
1631	int devlen;
1632	char *old_getty, *old_window, *old_type;
1633
1634	/*
1635	 * mark all sessions for death, (!SE_PRESENT)
1636	 * as we find or create new ones they'll be marked as keepers,
1637	 * we'll later nuke all the ones not found in /etc/ttys
1638	 */
1639	for (sp = sessions; sp != NULL; sp = sp->se_next)
1640		sp->se_flags &= ~SE_PRESENT;
1641
1642	devlen = sizeof(_PATH_DEV) - 1;
1643	while ((typ = getttyent()) != NULL) {
1644		++session_index;
1645
1646		for (sprev = 0, sp = sessions; sp; sprev = sp, sp = sp->se_next)
1647			if (strcmp(typ->ty_name, sp->se_device + devlen) == 0)
1648				break;
1649
1650		if (sp) {
1651			/* we want this one to live */
1652			sp->se_flags |= SE_PRESENT;
1653			if (sp->se_index != session_index) {
1654				warning("port %s changed utmp index from %d to %d",
1655				       sp->se_device, sp->se_index,
1656				       session_index);
1657				sp->se_index = session_index;
1658			}
1659			if ((typ->ty_status & TTY_ON) == 0 ||
1660			    typ->ty_getty == 0) {
1661				sp->se_flags |= SE_SHUTDOWN;
1662				kill(sp->se_process, SIGHUP);
1663				continue;
1664			}
1665			sp->se_flags &= ~SE_SHUTDOWN;
1666			old_getty = sp->se_getty ? strdup(sp->se_getty) : 0;
1667			old_window = sp->se_window ? strdup(sp->se_window) : 0;
1668			old_type = sp->se_type ? strdup(sp->se_type) : 0;
1669			if (setupargv(sp, typ) == 0) {
1670				warning("can't parse getty for port %s",
1671					sp->se_device);
1672				sp->se_flags |= SE_SHUTDOWN;
1673				kill(sp->se_process, SIGHUP);
1674			}
1675			else if (   !old_getty
1676				 || (!old_type && sp->se_type)
1677				 || (old_type && !sp->se_type)
1678				 || (!old_window && sp->se_window)
1679				 || (old_window && !sp->se_window)
1680				 || (strcmp(old_getty, sp->se_getty) != 0)
1681				 || (old_window && strcmp(old_window, sp->se_window) != 0)
1682				 || (old_type && strcmp(old_type, sp->se_type) != 0)
1683				) {
1684				/* Don't set SE_SHUTDOWN here */
1685				sp->se_nspace = 0;
1686				sp->se_started = 0;
1687				kill(sp->se_process, SIGHUP);
1688			}
1689			if (old_getty)
1690				free(old_getty);
1691			if (old_window)
1692				free(old_window);
1693			if (old_type)
1694				free(old_type);
1695			continue;
1696		}
1697
1698		new_session(sprev, session_index, typ);
1699	}
1700
1701	endttyent();
1702
1703	/*
1704	 * sweep through and kill all deleted sessions
1705	 * ones who's /etc/ttys line was deleted (SE_PRESENT unset)
1706	 */
1707	for (sp = sessions; sp != NULL; sp = sp->se_next) {
1708		if ((sp->se_flags & SE_PRESENT) == 0) {
1709			sp->se_flags |= SE_SHUTDOWN;
1710			kill(sp->se_process, SIGHUP);
1711		}
1712	}
1713
1714	return (state_func_t) multi_user;
1715}
1716
1717/*
1718 * Block further logins.
1719 */
1720static state_func_t
1721catatonia(void)
1722{
1723	session_t *sp;
1724
1725	for (sp = sessions; sp; sp = sp->se_next)
1726		sp->se_flags |= SE_SHUTDOWN;
1727
1728	return (state_func_t) multi_user;
1729}
1730
1731/*
1732 * Note SIGALRM.
1733 */
1734static void
1735alrm_handler(int sig)
1736{
1737
1738	(void)sig;
1739	clang = 1;
1740}
1741
1742/*
1743 * Bring the system down to single user.
1744 */
1745static state_func_t
1746death(void)
1747{
1748	int block, blocked;
1749	size_t len;
1750
1751	/* Temporarily block suspend. */
1752	len = sizeof(blocked);
1753	block = 1;
1754	if (sysctlbyname("kern.suspend_blocked", &blocked, &len,
1755	    &block, sizeof(block)) == -1)
1756		blocked = 0;
1757
1758	/*
1759	 * Also revoke the TTY here.  Because runshutdown() may reopen
1760	 * the TTY whose getty we're killing here, there is no guarantee
1761	 * runshutdown() will perform the initial open() call, causing
1762	 * the terminal attributes to be misconfigured.
1763	 */
1764	revoke_ttys();
1765
1766	/* Try to run the rc.shutdown script within a period of time */
1767	runshutdown();
1768
1769	/* Unblock suspend if we blocked it. */
1770	if (!blocked)
1771		sysctlbyname("kern.suspend_blocked", NULL, NULL,
1772		    &blocked, sizeof(blocked));
1773
1774	return (state_func_t) death_single;
1775}
1776
1777/*
1778 * Do what is necessary to reinitialize single user mode or reboot
1779 * from an incomplete state.
1780 */
1781static state_func_t
1782death_single(void)
1783{
1784	int i;
1785	pid_t pid;
1786	static const int death_sigs[2] = { SIGTERM, SIGKILL };
1787
1788	revoke(_PATH_CONSOLE);
1789
1790	for (i = 0; i < 2; ++i) {
1791		if (kill(-1, death_sigs[i]) == -1 && errno == ESRCH)
1792			return (state_func_t) single_user;
1793
1794		clang = 0;
1795		alarm(DEATH_WATCH);
1796		do
1797			if ((pid = waitpid(-1, (int *)0, 0)) != -1)
1798				collect_child(pid);
1799		while (clang == 0 && errno != ECHILD);
1800
1801		if (errno == ECHILD)
1802			return (state_func_t) single_user;
1803	}
1804
1805	warning("some processes would not die; ps axl advised");
1806
1807	return (state_func_t) single_user;
1808}
1809
1810static void
1811revoke_ttys(void)
1812{
1813	session_t *sp;
1814
1815	for (sp = sessions; sp; sp = sp->se_next) {
1816		sp->se_flags |= SE_SHUTDOWN;
1817		kill(sp->se_process, SIGHUP);
1818		revoke(sp->se_device);
1819	}
1820}
1821
1822/*
1823 * Run the system shutdown script.
1824 *
1825 * Exit codes:      XXX I should document more
1826 * -2       shutdown script terminated abnormally
1827 * -1       fatal error - can't run script
1828 * 0        good.
1829 * >0       some error (exit code)
1830 */
1831static int
1832runshutdown(void)
1833{
1834	pid_t pid, wpid;
1835	int status;
1836	int shutdowntimeout;
1837	size_t len;
1838	char *argv[4];
1839	const char *shell;
1840	struct sigaction sa;
1841	struct stat sb;
1842
1843	/*
1844	 * rc.shutdown is optional, so to prevent any unnecessary
1845	 * complaints from the shell we simply don't run it if the
1846	 * file does not exist. If the stat() here fails for other
1847	 * reasons, we'll let the shell complain.
1848	 */
1849	if (stat(_PATH_RUNDOWN, &sb) == -1 && errno == ENOENT)
1850		return 0;
1851
1852	shell = get_shell();
1853
1854	if ((pid = fork()) == 0) {
1855		sigemptyset(&sa.sa_mask);
1856		sa.sa_flags = 0;
1857		sa.sa_handler = SIG_IGN;
1858		sigaction(SIGTSTP, &sa, (struct sigaction *)0);
1859		sigaction(SIGHUP, &sa, (struct sigaction *)0);
1860
1861		open_console();
1862
1863		char _sh[]	= "sh";
1864		char _reboot[]	= "reboot";
1865		char _single[]	= "single";
1866		char _path_rundown[] = _PATH_RUNDOWN;
1867
1868		argv[0] = _sh;
1869		argv[1] = _path_rundown;
1870		argv[2] = Reboot ? _reboot : _single;
1871		argv[3] = 0;
1872
1873		sigprocmask(SIG_SETMASK, &sa.sa_mask, (sigset_t *) 0);
1874
1875#ifdef LOGIN_CAP
1876		setprocresources(RESOURCE_RC);
1877#endif
1878		execv(shell, argv);
1879		warning("can't exec %s for %s: %m", shell, _PATH_RUNDOWN);
1880		_exit(1);	/* force single user mode */
1881	}
1882
1883	if (pid == -1) {
1884		emergency("can't fork for %s on %s: %m", shell, _PATH_RUNDOWN);
1885		while (waitpid(-1, (int *) 0, WNOHANG) > 0)
1886			continue;
1887		sleep(STALL_TIMEOUT);
1888		return -1;
1889	}
1890
1891	len = sizeof(shutdowntimeout);
1892	if (sysctlbyname("kern.init_shutdown_timeout", &shutdowntimeout, &len,
1893	    NULL, 0) == -1 || shutdowntimeout < 2)
1894		shutdowntimeout = DEATH_SCRIPT;
1895	alarm(shutdowntimeout);
1896	clang = 0;
1897	/*
1898	 * Copied from single_user().  This is a bit paranoid.
1899	 * Use the same ALRM handler.
1900	 */
1901	do {
1902		if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1)
1903			collect_child(wpid);
1904		if (clang == 1) {
1905			/* we were waiting for the sub-shell */
1906			kill(wpid, SIGTERM);
1907			warning("timeout expired for %s on %s: %m; going to "
1908			    "single user mode", shell, _PATH_RUNDOWN);
1909			return -1;
1910		}
1911		if (wpid == -1) {
1912			if (errno == EINTR)
1913				continue;
1914			warning("wait for %s on %s failed: %m; going to "
1915			    "single user mode", shell, _PATH_RUNDOWN);
1916			return -1;
1917		}
1918		if (wpid == pid && WIFSTOPPED(status)) {
1919			warning("init: %s on %s stopped, restarting\n",
1920				shell, _PATH_RUNDOWN);
1921			kill(pid, SIGCONT);
1922			wpid = -1;
1923		}
1924	} while (wpid != pid && !clang);
1925
1926	/* Turn off the alarm */
1927	alarm(0);
1928
1929	if (WIFSIGNALED(status) && WTERMSIG(status) == SIGTERM &&
1930	    requested_transition == catatonia) {
1931		/*
1932		 * /etc/rc.shutdown executed /sbin/reboot;
1933		 * wait for the end quietly
1934		 */
1935		sigset_t s;
1936
1937		sigfillset(&s);
1938		for (;;)
1939			sigsuspend(&s);
1940	}
1941
1942	if (!WIFEXITED(status)) {
1943		warning("%s on %s terminated abnormally, going to "
1944		    "single user mode", shell, _PATH_RUNDOWN);
1945		return -2;
1946	}
1947
1948	if ((status = WEXITSTATUS(status)) != 0)
1949		warning("%s returned status %d", _PATH_RUNDOWN, status);
1950
1951	return status;
1952}
1953
1954static char *
1955strk(char *p)
1956{
1957	static char *t;
1958	char *q;
1959	int c;
1960
1961	if (p)
1962		t = p;
1963	if (!t)
1964		return 0;
1965
1966	c = *t;
1967	while (c == ' ' || c == '\t' )
1968		c = *++t;
1969	if (!c) {
1970		t = 0;
1971		return 0;
1972	}
1973	q = t;
1974	if (c == '\'') {
1975		c = *++t;
1976		q = t;
1977		while (c && c != '\'')
1978			c = *++t;
1979		if (!c)  /* unterminated string */
1980			q = t = 0;
1981		else
1982			*t++ = 0;
1983	} else {
1984		while (c && c != ' ' && c != '\t' )
1985			c = *++t;
1986		*t++ = 0;
1987		if (!c)
1988			t = 0;
1989	}
1990	return q;
1991}
1992
1993#ifdef LOGIN_CAP
1994static void
1995setprocresources(const char *cname)
1996{
1997	login_cap_t *lc;
1998	if ((lc = login_getclassbyname(cname, NULL)) != NULL) {
1999		setusercontext(lc, (struct passwd*)NULL, 0,
2000		    LOGIN_SETPRIORITY | LOGIN_SETRESOURCES |
2001		    LOGIN_SETLOGINCLASS | LOGIN_SETCPUMASK);
2002		login_close(lc);
2003	}
2004}
2005#endif
2006