date and time created 83/02/18 00:41:40 by mckusick
[unix-history] / usr / src / sbin / reboot / halt.c
CommitLineData
4f509481 1static char *sccsid = "@(#)halt.c 4.7 (Berkeley) %G%";
a2588a32
BJ
2/*
3 * Halt
4 */
5#include <stdio.h>
6#include <sys/reboot.h>
ccb2b0b8
BJ
7#include <sys/types.h>
8#include <time.h>
fe6cb666
BJ
9#include <errno.h>
10#include <signal.h>
a2588a32 11
ccb2b0b8
BJ
12#define SHUTDOWNLOG "/usr/adm/shutdownlog"
13
a2588a32
BJ
14main(argc, argv)
15 int argc;
16 char **argv;
17{
18 int howto;
037df60e 19 char *ttyn = (char *)ttyname(2);
fe6cb666 20 register i;
821f38b7 21 register qflag = 0;
a2588a32
BJ
22
23 howto = RB_HALT;
24 argc--, argv++;
25 while (argc > 0) {
26 if (!strcmp(*argv, "-n"))
27 howto |= RB_NOSYNC;
037df60e
BJ
28 else if (!strcmp(*argv, "-y"))
29 ttyn = 0;
fe6cb666
BJ
30 else if (!strcmp(*argv, "-q"))
31 qflag++;
a2588a32
BJ
32 else {
33 fprintf(stderr, "usage: halt [ -n ]\n");
34 exit(1);
35 }
36 argc--, argv++;
37 }
037df60e
BJ
38 if (ttyn && *(ttyn+strlen("/dev/tty")) == 'd') {
39 fprintf(stderr, "halt: dangerous on a dialup; use ``halt -y'' if you are really sure\n");
40 exit(1);
41 }
fe6cb666 42
4f509481 43 signal(SIGHUP, SIG_IGN); /* for network connections */
fe6cb666
BJ
44 if (kill(1, SIGTSTP) == -1) {
45 fprintf(stderr, "reboot: can't idle init\n");
46 exit(1);
47 }
48
49 if (!qflag) for (i = 1; ; i++) {
50 if (kill(-1, SIGKILL) == -1) {
51 extern int errno;
52
53 if (errno == ESRCH)
54 break;
55
56 perror("reboot: kill");
57 kill(1, SIGHUP);
58 exit(1);
59 }
60 if (i > 5) {
61 fprintf(stderr, "CAUTION: some process(es) wouldn't die\n");
62 break;
63 }
64 setalarm(2 * i);
65 pause();
66 }
67
ccb2b0b8
BJ
68 if ((howto & RB_NOSYNC) == 0)
69 log_entry();
fe6cb666
BJ
70 if (!qflag) {
71 if ((howto & RB_NOSYNC)==0) {
72 markdown();
73 sync();
74 sync();
75 }
76 setalarm(5);
77 pause();
78 }
a2588a32
BJ
79 syscall(55, howto);
80 perror("reboot");
81}
fe6cb666
BJ
82
83dingdong()
84{
85 /* RRRIIINNNGGG RRRIIINNNGGG */
86}
87
88setalarm(n)
89{
90 signal(SIGALRM, dingdong);
91 alarm(n);
92}
93
94#include <utmp.h>
95#define SCPYN(a, b) strncpy(a, b, sizeof(a))
96char wtmpf[] = "/usr/adm/wtmp";
97struct utmp wtmp;
98
99markdown()
100{
101 register f = open(wtmpf, 1);
102 if (f >= 0) {
103 lseek(f, 0L, 2);
104 SCPYN(wtmp.ut_line, "~");
105 SCPYN(wtmp.ut_name, "shutdown");
106 time(&wtmp.ut_time);
107 write(f, (char *)&wtmp, sizeof(wtmp));
108 close(f);
109 }
110}
ccb2b0b8
BJ
111
112char *days[] = {
113 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
114};
115
116char *months[] = {
117 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
118 "Oct", "Nov", "Dec"
119};
120
121log_entry()
122{
123 FILE *fp;
124 struct tm *tm, *localtime();
125 time_t now;
126
127 time(&now);
128 tm = localtime(&now);
129 fp = fopen(SHUTDOWNLOG, "a");
31b4d3e1
BJ
130 if (fp == NULL)
131 return;
ccb2b0b8
BJ
132 fseek(fp, 0L, 2);
133 fprintf(fp, "%02d:%02d %s %s %2d, %4d. Halted.\n", tm->tm_hour,
134 tm->tm_min, days[tm->tm_wday], months[tm->tm_mon],
135 tm->tm_mday, tm->tm_year + 1900);
136 fclose(fp);
137}