Initial Import from SVN
This commit is contained in:
47
src/cmd/reboot/Makefile
Normal file
47
src/cmd/reboot/Makefile
Normal file
@@ -0,0 +1,47 @@
|
||||
TOPSRC = $(shell cd ../../..; pwd)
|
||||
include $(TOPSRC)/target.mk
|
||||
|
||||
SRCS = reboot.c
|
||||
OBJS = reboot.o
|
||||
MAN = reboot.0
|
||||
MANSRC = reboot.8
|
||||
|
||||
all: reboot ${MAN}
|
||||
|
||||
reboot: ${OBJS}
|
||||
${CC} ${LDFLAGS} -o reboot.elf ${OBJS} -lc
|
||||
${OBJDUMP} -S reboot.elf > reboot.dis
|
||||
${SIZE} reboot.elf
|
||||
${ELF2AOUT} reboot.elf $@
|
||||
ln -f $@ halt
|
||||
ln -f $@ poweroff
|
||||
|
||||
${MAN}: ${MANSRC}
|
||||
${MANROFF} ${MANSRC} > ${MAN}
|
||||
|
||||
clean:
|
||||
rm -f *.o *~ *.elf *.dis ${MAN} reboot halt poweroff tags
|
||||
|
||||
depend: ${SRCS}
|
||||
mkdep ${CFLAGS} ${SRCS}
|
||||
|
||||
install: all
|
||||
cp ${MAN} ${DESTDIR}/share/man/cat8/
|
||||
@-rm -f ${DESTDIR}/share/man/cat8/fastboot.0 ${DESTDIR}/share/man/cat8/halt.0
|
||||
ln ${DESTDIR}/share/man/cat8/reboot.0 ${DESTDIR}/share/man/cat8/fastboot.0
|
||||
ln ${DESTDIR}/share/man/cat8/reboot.0 ${DESTDIR}/share/man/cat8/halt.0
|
||||
install reboot ${DESTDIR}/sbin/reboot
|
||||
@-rm -f ${DESTDIR}/sbin/fastboot ${DESTDIR}/sbin/halt ${DESTDIR}/sbin/poweroff
|
||||
ln -f ${DESTDIR}/sbin/reboot ${DESTDIR}/sbin/halt
|
||||
ln -f ${DESTDIR}/sbin/reboot ${DESTDIR}/sbin/fastboot
|
||||
ln -f ${DESTDIR}/sbin/reboot ${DESTDIR}/sbin/poweroff
|
||||
ln -f ${DESTDIR}/sbin/reboot ${DESTDIR}/sbin/bootloader
|
||||
|
||||
lint: ${SRCS}
|
||||
lint -hax ${SRCS}
|
||||
|
||||
tags: ${SRCS}
|
||||
ctags ${SRCS}
|
||||
|
||||
# DO NOT DELETE THIS LINE -- mkdep uses it.
|
||||
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
|
||||
133
src/cmd/reboot/reboot.8
Normal file
133
src/cmd/reboot/reboot.8
Normal file
@@ -0,0 +1,133 @@
|
||||
.\" Copyright (c) 1980 Regents of the University of California.
|
||||
.\" All rights reserved. The Berkeley software License Agreement
|
||||
.\" specifies the terms and conditions for redistribution.
|
||||
.\"
|
||||
.\" @(#)reboot.8 2.2 (2.11BSD) 1996/11/16
|
||||
.\"
|
||||
.TH REBOOT 8 "May 24, 1996"
|
||||
.UC 2
|
||||
.SH NAME
|
||||
reboot \- stopping and restarting the system
|
||||
.SH SYNOPSIS
|
||||
.B /sbin/reboot
|
||||
[
|
||||
.B \-lqnhdarsfRD
|
||||
]
|
||||
.br
|
||||
.B /sbin/halt
|
||||
[
|
||||
.B \-lqndars
|
||||
]
|
||||
.br
|
||||
.B /sbin/fastboot
|
||||
[
|
||||
.B \-lqndarsRD
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
2.11BSD is started by placing it in memory at location zero and transferring to
|
||||
its entry point. Since the system is not reentrant, it is necessary to read
|
||||
it in from disk or tape each time it is to be boot strapped.
|
||||
.PP
|
||||
.B "Rebooting a running system:"
|
||||
When the system is running and a reboot is desired,
|
||||
.IR shutdown (8)
|
||||
is normally used to stop time sharing and put the system into single user
|
||||
mode. If there are no users then
|
||||
.B /sbin/reboot
|
||||
can be used without shutting the system down first.
|
||||
.PP
|
||||
Reboot normally causes the disks to be synced and allows the system to
|
||||
perform other shutdown activities such as resynchronizing hardware
|
||||
time-of-day clocks. A multi-user reboot (as described below) is then
|
||||
initiated. This causes a system to be booted and an automatic disk check
|
||||
to be performed. If all this succeeds without incident, the system is then
|
||||
brought up for multi-user operation.
|
||||
.PP
|
||||
Options to reboot are:
|
||||
.TP
|
||||
.B \-l
|
||||
Don't try to tell
|
||||
.IR syslogd (8)
|
||||
what's about to happen.
|
||||
.TP
|
||||
.B \-q
|
||||
Reboot quickly and ungracefully, without shutting down running processes
|
||||
first.
|
||||
.TP
|
||||
.B \-n
|
||||
Don't sync before rebooting. This can be used if a disk or the processor
|
||||
is on fire.
|
||||
.TP
|
||||
.B \-h
|
||||
Don't reboot, simply halt the processor.
|
||||
.TP
|
||||
.B \-d
|
||||
Dump memory onto the dump device, usually part of swap, before rebooting.
|
||||
The dump is done in the same way as after a panic.
|
||||
.TP
|
||||
.B \-a
|
||||
Have the system booter ask for the name of the system to be booted, rather
|
||||
than immediately booting the default system (/unix).
|
||||
.TP
|
||||
.B \-r
|
||||
Mount the root file system as
|
||||
.I "read only"
|
||||
when the system reboots. This is not supported by the kernel in 2.11BSD.
|
||||
.TP
|
||||
.B \-s
|
||||
Don't enter multi-user mode after system has rebooted \- stay in single
|
||||
user mode.
|
||||
.TP
|
||||
.B \-f
|
||||
Fast reboot. Omit the automatic file system consistency check when the system
|
||||
reboots and goes multi-user. This is accomplished by passing a
|
||||
.I fast reboot
|
||||
flag on to the rebooting kernel. This currently prevents the use of
|
||||
.B \-f
|
||||
flag in conjunction with the
|
||||
.B \-h
|
||||
(halt) flag.
|
||||
.TP
|
||||
.B \-D
|
||||
Set the
|
||||
.IR autoconfig (8)
|
||||
debug flag. This is normally not used unless one is debugging the
|
||||
.I autoconfig
|
||||
program.
|
||||
.TP
|
||||
.B \-R
|
||||
Tells the kernel to use the compiled in root device. Normally the system
|
||||
uses the device from which it was booted as the root/swap/pipe/dump device.
|
||||
.PP
|
||||
.I Reboot
|
||||
normally places a shutdown record in the login accounting file
|
||||
/usr/adm/wtmp. This is inhibited if the
|
||||
.B \-q
|
||||
or
|
||||
.B \-n
|
||||
options are present.
|
||||
Note that the
|
||||
.B \-f
|
||||
(fast reboot) and
|
||||
.B \-n
|
||||
(don't sync)
|
||||
options are contradictory; the request for a fast reboot is ignored in this
|
||||
case.
|
||||
.PP
|
||||
.I Halt
|
||||
and
|
||||
.I fastboot
|
||||
are synonymous with ``\fBreboot \-h\fP'' and ``\fBreboot \-f\fP'', respectively.
|
||||
.PP
|
||||
.B "Power fail and crash recovery:"
|
||||
Normally, the system will reboot itself at power-up or after crashes
|
||||
\fBif\fP the contents of low memory are intact.
|
||||
An automatic consistency check of the file systems will be
|
||||
performed, and unless this fails, the system will resume multi-user
|
||||
operations.
|
||||
.SH "SEE ALSO"
|
||||
autoconfig(8),
|
||||
sync(2),
|
||||
utmp(8),
|
||||
shutdown(8),
|
||||
syslogd(8)
|
||||
181
src/cmd/reboot/reboot.c
Normal file
181
src/cmd/reboot/reboot.c
Normal file
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
* Reboot ...
|
||||
*
|
||||
* Copyright (c) 1980,1986 Regents of the University of California.
|
||||
* All rights reserved. The Berkeley software License Agreement
|
||||
* specifies the terms and conditions for redistribution.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/reboot.h>
|
||||
#include <sys/signal.h>
|
||||
|
||||
#define OPTS "lqnhdarsfRD"
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int howto; /* reboot options argument */
|
||||
int needlog = 1; /* tell syslog what's happening */
|
||||
int quickly = 0; /* go down quickly & ungracefully */
|
||||
char *myname; /* name we were invoked as */
|
||||
char args[20], *ap; /* collected arguments for syslog */
|
||||
int i;
|
||||
char *rindex();
|
||||
|
||||
if (myname = rindex(argv[0], '/'))
|
||||
myname++;
|
||||
else
|
||||
myname = argv[0];
|
||||
if (strcmp(myname, "halt") == 0)
|
||||
howto = RB_HALT;
|
||||
else if (strcmp(myname, "fasthalt") == 0)
|
||||
howto = RB_HALT|RB_NOFSCK;
|
||||
else if (strcmp(myname, "fastboot") == 0)
|
||||
howto = RB_NOFSCK;
|
||||
else if (strcmp(myname, "poweroff") == 0)
|
||||
howto = RB_HALT|RB_POWEROFF;
|
||||
else if (strcmp(myname, "bootloader") == 0)
|
||||
howto = RB_HALT|RB_BOOTLOADER;
|
||||
else
|
||||
howto = 0;
|
||||
|
||||
ap = args;
|
||||
*ap++ = '-';
|
||||
*ap = '\0';
|
||||
while ((i = getopt(argc, argv, OPTS)) != EOF) {
|
||||
switch((char)i) {
|
||||
case 'l': needlog = 0; break;
|
||||
case 'q': quickly++; break;
|
||||
case 'n': howto |= RB_NOSYNC; break;
|
||||
case 'h': howto |= RB_HALT; break;
|
||||
case 'd': howto |= RB_DUMP; break;
|
||||
case 'a': howto |= RB_ASKNAME; break;
|
||||
case 'r': howto |= RB_RDONLY; break;
|
||||
case 's': howto |= RB_SINGLE; break;
|
||||
case 'f': howto |= RB_NOFSCK; break;
|
||||
case 'R': howto |= RB_DFLTROOT; break;
|
||||
case 'D': howto |= RB_AUTODEBUG; break;
|
||||
case 'p': howto |= RB_HALT|RB_POWEROFF; break;
|
||||
case '?':
|
||||
fprintf(stderr,
|
||||
"usage: %s [-%s]\n", myname, OPTS);
|
||||
exit(EX_USAGE);
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
if (index(args+1, (char)i) == 0) {
|
||||
*ap++ = (char)i;
|
||||
*ap = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
if ((howto & (RB_NOSYNC|RB_NOFSCK)) == (RB_NOSYNC|RB_NOFSCK)
|
||||
&& !(howto & RB_HALT)) {
|
||||
fprintf(stderr,
|
||||
"%s: no sync and no fsck are a dangerous combination; no fsck ignored.\n",
|
||||
myname);
|
||||
howto &= ~RB_NOFSCK;
|
||||
}
|
||||
if (needlog) {
|
||||
char *user;
|
||||
struct passwd *pw;
|
||||
|
||||
user = getlogin();
|
||||
if (user == (char *)0 && (pw = getpwuid(getuid())))
|
||||
user = pw->pw_name;
|
||||
if (user == (char *)0)
|
||||
user = "root";
|
||||
openlog(myname, 0, LOG_AUTH);
|
||||
syslog(LOG_CRIT, "%s; %s by %s",
|
||||
args, (howto&RB_HALT)?"halted":"rebooted", user);
|
||||
}
|
||||
/*
|
||||
* Do a sync early on so disks start transfers while we're killing
|
||||
* processes.
|
||||
*/
|
||||
if (! (howto & RB_NOSYNC))
|
||||
sync();
|
||||
|
||||
printf("killing processes...");
|
||||
fflush(stdout);
|
||||
(void) signal(SIGHUP, SIG_IGN); /* for remote connections */
|
||||
if (kill(1, SIGTSTP) == -1) {
|
||||
fprintf(stderr, "%s: can\'t idle init\n", myname);
|
||||
exit(EX_NOPERM);
|
||||
}
|
||||
//sleep(1);
|
||||
(void) kill(-1, SIGTERM); /* one chance to catch it */
|
||||
//sleep(1);
|
||||
printf(" done\n");
|
||||
|
||||
/*
|
||||
* After the processes receive the TERM signal start the rest of the
|
||||
* buffers out to disk. Wait five seconds between SIGTERM and SIGKILL so
|
||||
* the processes have a chance to clean up and exit nicely.
|
||||
*/
|
||||
if (!(howto & RB_NOSYNC)) {
|
||||
sync();
|
||||
//sleep(1);
|
||||
}
|
||||
|
||||
if (! quickly) {
|
||||
for (i = 1; ; i++) {
|
||||
if (kill(-1, SIGKILL) == -1) {
|
||||
if (errno == ESRCH)
|
||||
break;
|
||||
perror(myname);
|
||||
kill(1, SIGHUP);
|
||||
exit(EX_OSERR);
|
||||
}
|
||||
if (i > 5) {
|
||||
fprintf(stderr,
|
||||
"CAUTION: some process(es) wouldn't die\n");
|
||||
break;
|
||||
}
|
||||
sleep(i);
|
||||
}
|
||||
if (! (howto & RB_NOSYNC)) {
|
||||
markdown();
|
||||
sync();
|
||||
//sleep(1);
|
||||
}
|
||||
}
|
||||
reboot(howto);
|
||||
perror(myname);
|
||||
kill(1, SIGHUP);
|
||||
exit(EX_OSERR);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Make shutdown entry in /usr/adm/utmp.
|
||||
*/
|
||||
#include <utmp.h>
|
||||
#include <paths.h>
|
||||
|
||||
#define SCPYN(a, b) strncpy(a, b, sizeof(a))
|
||||
|
||||
markdown()
|
||||
{
|
||||
struct utmp wtmp;
|
||||
register int f = open(_PATH_WTMP, O_WRONLY|O_APPEND);
|
||||
|
||||
if (f >= 0) {
|
||||
bzero((char *)&wtmp, sizeof(wtmp));
|
||||
SCPYN(wtmp.ut_line, "~");
|
||||
SCPYN(wtmp.ut_name, "shutdown");
|
||||
SCPYN(wtmp.ut_host, "");
|
||||
(void) time(&wtmp.ut_time);
|
||||
write(f, (char *)&wtmp, sizeof(wtmp));
|
||||
close(f);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user