|
|
1.1 ! root 1: static char *sccsid = "@(#)halt.c 4.5 (Berkeley) 4/17/81"; ! 2: /* ! 3: * Halt ! 4: */ ! 5: #include <stdio.h> ! 6: #include <sys/reboot.h> ! 7: #include <sys/types.h> ! 8: #include <time.h> ! 9: #include <errno.h> ! 10: #include <signal.h> ! 11: ! 12: #define SHUTDOWNLOG "/usr/adm/shutdownlog" ! 13: ! 14: main(argc, argv) ! 15: int argc; ! 16: char **argv; ! 17: { ! 18: int howto; ! 19: char *ttyn = (char *)ttyname(2); ! 20: register i; ! 21: register qflag; ! 22: ! 23: howto = RB_HALT; ! 24: argc--, argv++; ! 25: while (argc > 0) { ! 26: if (!strcmp(*argv, "-n")) ! 27: howto |= RB_NOSYNC; ! 28: else if (!strcmp(*argv, "-y")) ! 29: ttyn = 0; ! 30: else if (!strcmp(*argv, "-q")) ! 31: qflag++; ! 32: else { ! 33: fprintf(stderr, "usage: halt [ -n ]\n"); ! 34: exit(1); ! 35: } ! 36: argc--, argv++; ! 37: } ! 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: } ! 42: ! 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)==0) { ! 71: markdown(); ! 72: sync(); ! 73: sync(); ! 74: } ! 75: setalarm(5); ! 76: pause(); ! 77: } ! 78: syscall(55, howto); ! 79: perror("reboot"); ! 80: } ! 81: ! 82: dingdong() ! 83: { ! 84: /* RRRIIINNNGGG RRRIIINNNGGG */ ! 85: } ! 86: ! 87: setalarm(n) ! 88: { ! 89: signal(SIGALRM, dingdong); ! 90: alarm(n); ! 91: } ! 92: ! 93: #include <utmp.h> ! 94: #define SCPYN(a, b) strncpy(a, b, sizeof(a)) ! 95: char wtmpf[] = "/usr/adm/wtmp"; ! 96: struct utmp wtmp; ! 97: ! 98: markdown() ! 99: { ! 100: register f = open(wtmpf, 1); ! 101: if (f >= 0) { ! 102: lseek(f, 0L, 2); ! 103: SCPYN(wtmp.ut_line, "~"); ! 104: SCPYN(wtmp.ut_name, "shutdown"); ! 105: time(&wtmp.ut_time); ! 106: write(f, (char *)&wtmp, sizeof(wtmp)); ! 107: close(f); ! 108: } ! 109: } ! 110: ! 111: char *days[] = { ! 112: "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ! 113: }; ! 114: ! 115: char *months[] = { ! 116: "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", ! 117: "Oct", "Nov", "Dec" ! 118: }; ! 119: ! 120: log_entry() ! 121: { ! 122: FILE *fp; ! 123: struct tm *tm, *localtime(); ! 124: time_t now; ! 125: ! 126: time(&now); ! 127: tm = localtime(&now); ! 128: fp = fopen(SHUTDOWNLOG, "a"); ! 129: if (fp == NULL) ! 130: return; ! 131: fseek(fp, 0L, 2); ! 132: fprintf(fp, "%02d:%02d %s %s %2d, %4d. Halted.\n", tm->tm_hour, ! 133: tm->tm_min, days[tm->tm_wday], months[tm->tm_mon], ! 134: tm->tm_mday, tm->tm_year + 1900); ! 135: fclose(fp); ! 136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.