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