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