|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980, 1986 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: char copyright[] = ! 22: "@(#) Copyright (c) 1980, 1986 The Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)reboot.c 5.9 (Berkeley) 6/1/90"; ! 28: #endif /* not lint */ ! 29: ! 30: /* ! 31: * Reboot ! 32: */ ! 33: #include <sys/types.h> ! 34: #include <sys/time.h> ! 35: #include <sys/syslog.h> ! 36: #include <sys/syscall.h> ! 37: #include <sys/reboot.h> ! 38: #include <sys/signal.h> ! 39: #include <pwd.h> ! 40: #include <stdio.h> ! 41: #include <errno.h> ! 42: ! 43: main(argc, argv) ! 44: int argc; ! 45: char **argv; ! 46: { ! 47: int howto; ! 48: register char *argp; ! 49: register i; ! 50: register ok = 0; ! 51: register qflag = 0; ! 52: int needlog = 1; ! 53: char *user, *getlogin(); ! 54: struct passwd *pw, *getpwuid(); ! 55: ! 56: openlog("reboot", 0, LOG_AUTH); ! 57: argc--, argv++; ! 58: howto = 0; ! 59: while (argc > 0) { ! 60: if (!strcmp(*argv, "-q")) ! 61: qflag++; ! 62: else if (!strcmp(*argv, "-n")) ! 63: howto |= RB_NOSYNC; ! 64: else if (!strcmp(*argv, "-l")) ! 65: needlog = 0; ! 66: else { ! 67: fprintf(stderr, ! 68: "usage: reboot [ -n ][ -q ]\n"); ! 69: exit(1); ! 70: } ! 71: argc--, argv++; ! 72: } ! 73: ! 74: if (needlog) { ! 75: user = getlogin(); ! 76: if (user == (char *)0 && (pw = getpwuid(getuid()))) ! 77: user = pw->pw_name; ! 78: if (user == (char *)0) ! 79: user = "root"; ! 80: syslog(LOG_CRIT, "rebooted by %s", user); ! 81: } ! 82: ! 83: signal(SIGHUP, SIG_IGN); /* for remote connections */ ! 84: if (kill(1, SIGTSTP) == -1) { ! 85: fprintf(stderr, "reboot: can't idle init\n"); ! 86: exit(1); ! 87: } ! 88: sleep(1); ! 89: (void) kill(-1, SIGTERM); /* one chance to catch it */ ! 90: sleep(5); ! 91: ! 92: if (!qflag) for (i = 1; ; i++) { ! 93: if (kill(-1, SIGKILL) == -1) { ! 94: extern int errno; ! 95: ! 96: if (errno == ESRCH) ! 97: break; ! 98: ! 99: perror("reboot: kill"); ! 100: kill(1, SIGHUP); ! 101: exit(1); ! 102: } ! 103: if (i > 5) { ! 104: fprintf(stderr, ! 105: "CAUTION: some process(es) wouldn't die\n"); ! 106: break; ! 107: } ! 108: setalarm(2 * i); ! 109: pause(); ! 110: } ! 111: ! 112: if (!qflag && (howto & RB_NOSYNC) == 0) { ! 113: logwtmp("~", "shutdown", ""); ! 114: sync(); ! 115: setalarm(5); ! 116: pause(); ! 117: } ! 118: syscall(SYS_reboot, howto); ! 119: perror("reboot"); ! 120: kill(1, SIGHUP); ! 121: exit(1); ! 122: } ! 123: ! 124: dingdong() ! 125: { ! 126: /* RRRIIINNNGGG RRRIIINNNGGG */ ! 127: } ! 128: ! 129: setalarm(n) ! 130: { ! 131: signal(SIGALRM, dingdong); ! 132: alarm(n); ! 133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.