1: /*
2: * Copyright (c) 1980,1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1980,1986 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)halt.c 5.4 (Berkeley) 5/26/86";
15: #endif not lint
16:
17: /*
18: * Halt
19: */
20: #include <stdio.h>
21: #include <sys/reboot.h>
22: #include <sys/types.h>
23: #include <sys/time.h>
24: #include <sys/syslog.h>
25: #include <errno.h>
26: #include <signal.h>
27: #include <pwd.h>
28:
29: main(argc, argv)
30: int argc;
31: char **argv;
32: {
33: int howto;
34: char *ttyn = (char *)ttyname(2);
35: register i;
36: register qflag = 0;
37: int needlog = 1;
38: char *user, *getlogin();
39: struct passwd *pw, *getpwuid();
40:
41: openlog("halt", 0, LOG_AUTH);
42: howto = RB_HALT;
43: argc--, argv++;
44: while (argc > 0) {
45: if (!strcmp(*argv, "-n"))
46: howto |= RB_NOSYNC;
47: else if (!strcmp(*argv, "-y"))
48: ttyn = 0;
49: else if (!strcmp(*argv, "-q"))
50: qflag++;
51: else if (!strcmp(*argv, "-l"))
52: needlog = 0;
53: else {
54: fprintf(stderr, "usage: halt [ -n ]\n");
55: exit(1);
56: }
57: argc--, argv++;
58: }
59: if (ttyn && *(ttyn+strlen("/dev/tty")) == 'd') {
60: fprintf(stderr, "halt: dangerous on a dialup; use ``halt -y'' if you are really sure\n");
61: exit(1);
62: }
63:
64: if (needlog) {
65: user = getlogin();
66: if (user == (char *)0 && (pw = getpwuid(getuid())))
67: user = pw->pw_name;
68: if (user == (char *)0)
69: user = "root";
70: syslog(LOG_CRIT, "halted by %s", user);
71: }
72:
73: signal(SIGHUP, SIG_IGN); /* for network connections */
74: if (kill(1, SIGTSTP) == -1) {
75: fprintf(stderr, "reboot: can't idle init\n");
76: exit(1);
77: }
78: sleep(1);
79: (void) kill(-1, SIGTERM); /* one chance to catch it */
80: sleep(5);
81:
82: if (!qflag) for (i = 1; ; i++) {
83: if (kill(-1, SIGKILL) == -1) {
84: extern int errno;
85:
86: if (errno == ESRCH)
87: break;
88:
89: perror("reboot: kill");
90: kill(1, SIGHUP);
91: exit(1);
92: }
93: if (i > 5) {
94: fprintf(stderr,
95: "CAUTION: some process(es) wouldn't die\n");
96: break;
97: }
98: setalarm(2 * i);
99: pause();
100: }
101:
102: if (!qflag && (howto & RB_NOSYNC) == 0) {
103: markdown();
104: sync();
105: setalarm(5);
106: pause();
107: }
108: syscall(55, howto);
109: perror("reboot");
110: }
111:
112: dingdong()
113: {
114: /* RRRIIINNNGGG RRRIIINNNGGG */
115: }
116:
117: setalarm(n)
118: {
119: signal(SIGALRM, dingdong);
120: alarm(n);
121: }
122:
123: #include <utmp.h>
124: #define SCPYN(a, b) strncpy(a, b, sizeof(a))
125: char wtmpf[] = "/usr/adm/wtmp";
126: struct utmp wtmp;
127:
128: markdown()
129: {
130: register f = open(wtmpf, 1);
131: if (f >= 0) {
132: lseek(f, 0L, 2);
133: SCPYN(wtmp.ut_line, "~");
134: SCPYN(wtmp.ut_name, "shutdown");
135: SCPYN(wtmp.ut_host, "");
136: time(&wtmp.ut_time);
137: write(f, (char *)&wtmp, sizeof(wtmp));
138: close(f);
139: }
140: }
Defined functions
main
defined in line
29;
never used
Defined variables
wtmp
defined in line
126; used 6 times
Defined macros