|
|
1.1 root 1: /*
2: * Copyright (c) 1980, 1986 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1980, 1986 The Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)halt.c 5.7 (Berkeley) 6/1/90";
28: #endif /* not lint */
29:
30: /*
31: * Halt
32: */
33: #include <sys/types.h>
34: #include <sys/reboot.h>
35: #include <sys/time.h>
36: #include <sys/syslog.h>
37: #include <sys/signal.h>
38: #include <errno.h>
39: #include <pwd.h>
40: #include <stdio.h>
41: #include <paths.h>
42:
43: main(argc, argv)
44: int argc;
45: char **argv;
46: {
47: register int i;
48: register int qflag = 0;
49: struct passwd *pw, *getpwuid();
50: int ch, howto, needlog = 1;
51: char *user, *ttyn, *getlogin(), *ttyname();
52:
53: howto = RB_HALT;
54: ttyn = ttyname(2);
55: while ((ch = getopt(argc, argv, "lnqy")) != EOF)
56: switch((char)ch) {
57: case 'l': /* undocumented; for shutdown(8) */
58: needlog = 0;
59: break;
60: case 'n':
61: howto |= RB_NOSYNC;
62: break;
63: case 'q':
64: qflag++;
65: break;
66: case 'y':
67: ttyn = 0;
68: break;
69: case '?':
70: default:
71: fprintf(stderr, "usage: halt [-nqy]\n");
72: exit(1);
73: }
74:
75: if (ttyn && ttyn[sizeof(_PATH_TTY) - 1] == 'd') {
76: fprintf(stderr, "halt: dangerous on a dialup; use ``halt -y'' if you are really sure\n");
77: exit(1);
78: }
79:
80: if (needlog) {
81: openlog("halt", 0, LOG_AUTH);
82: if ((user = getlogin()) == NULL)
83: if ((pw = getpwuid(getuid())))
84: user = pw->pw_name;
85: else
86: user = "???";
87: syslog(LOG_CRIT, "halted by %s", user);
88: }
89:
90: signal(SIGHUP, SIG_IGN); /* for network connections */
91: if (kill(1, SIGTSTP) == -1) {
92: fprintf(stderr, "halt: can't idle init\n");
93: exit(1);
94: }
95: sleep(1);
96: (void) kill(-1, SIGTERM); /* one chance to catch it */
97: sleep(5);
98:
99: if (!qflag) for (i = 1; ; i++) {
100: if (kill(-1, SIGKILL) == -1) {
101: extern int errno;
102:
103: if (errno == ESRCH)
104: break;
105:
106: perror("halt: kill");
107: kill(1, SIGHUP);
108: exit(1);
109: }
110: if (i > 5) {
111: fprintf(stderr,
112: "CAUTION: some process(es) wouldn't die\n");
113: break;
114: }
115: setalarm(2 * i);
116: pause();
117: }
118:
119: if (!qflag && (howto & RB_NOSYNC) == 0) {
120: logwtmp("~", "shutdown", "");
121: sync();
122: setalarm(5);
123: pause();
124: }
125: syscall(55, howto);
126: perror("halt");
127: }
128:
129: dingdong()
130: {
131: /* RRRIIINNNGGG RRRIIINNNGGG */
132: }
133:
134: setalarm(n)
135: {
136: signal(SIGALRM, dingdong);
137: alarm(n);
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.