|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)lock.c 5.1 (Berkeley) 5/31/85"; ! 15: #endif not lint ! 16: ! 17: /* ! 18: * Lock a terminal up until the given key is entered, ! 19: * or until the root password is entered, ! 20: * or the given interval times out. ! 21: * ! 22: * Timeout interval is by default TIMEOUT, it can be changed with ! 23: * an argument of the form -time where time is in minutes ! 24: */ ! 25: ! 26: #include <pwd.h> ! 27: #include <stdio.h> ! 28: #include <sys/types.h> ! 29: #include <sys/stat.h> ! 30: #include <sys/time.h> ! 31: #include <signal.h> ! 32: #include <sgtty.h> ! 33: ! 34: #define TIMEOUT 15 ! 35: ! 36: struct passwd *pwd; ! 37: char *crypt(); ! 38: char *getpass(); ! 39: char *index(); ! 40: char *ttyname(); ! 41: char *timezone(); ! 42: char *asctime(); ! 43: struct tm *localtime(); ! 44: ! 45: int quit(); ! 46: int bye(); ! 47: int hi(); ! 48: ! 49: struct timeval timeout = {0, 0}; ! 50: struct timeval zerotime = {0, 0}; ! 51: struct sgttyb tty, ntty; ! 52: long nexttime; /* keep the timeout time */ ! 53: ! 54: main(argc, argv) ! 55: int argc; ! 56: char **argv; ! 57: { ! 58: register int t; ! 59: char *ttynam; ! 60: char *ap; ! 61: int sectimeout = TIMEOUT; ! 62: char s[BUFSIZ], s1[BUFSIZ]; ! 63: char hostname[32]; ! 64: char *tzn; ! 65: struct timeval timval; ! 66: struct itimerval ntimer, otimer; ! 67: struct timezone timzone; ! 68: struct tm *timp; ! 69: struct stat statb; ! 70: ! 71: /* process arguments */ ! 72: ! 73: if (argc > 1){ ! 74: if (argv[1][0] != '-') ! 75: goto usage; ! 76: if (sscanf(&(argv[1][1]), "%d", §imeout) != 1) ! 77: goto usage; ! 78: } ! 79: timeout.tv_sec = sectimeout * 60; ! 80: ! 81: /* get information for header */ ! 82: ! 83: if (ioctl(0, TIOCGETP, &tty)) ! 84: exit(1); ! 85: pwd = getpwuid(0); ! 86: gethostname(hostname, sizeof(hostname)); ! 87: if (!(ttynam = ttyname(0))){ ! 88: printf("lock: not a terminal?"); ! 89: exit (1); ! 90: } ! 91: gettimeofday(&timval, &timzone); ! 92: nexttime = timval.tv_sec + (sectimeout * 60); ! 93: timp = localtime(&timval.tv_sec); ! 94: ap = asctime(timp); ! 95: tzn = timezone(timzone.tz_minuteswest, timp->tm_isdst); ! 96: ! 97: /* get key and check again */ ! 98: ! 99: signal(SIGINT, quit); ! 100: signal(SIGQUIT, quit); ! 101: ntty = tty; ntty.sg_flags &= ~ECHO; ! 102: ioctl(0, TIOCSETN, &ntty); ! 103: printf("Key: "); ! 104: if (fgets(s, sizeof s, stdin) == NULL) { ! 105: putchar('\n'); ! 106: quit(); ! 107: } ! 108: printf("\nAgain: "); ! 109: /* ! 110: * Don't need EOF test here, if we get EOF, then s1 != s ! 111: * and the right things will happen. ! 112: */ ! 113: (void) fgets(s1, sizeof s1, stdin); ! 114: putchar('\n'); ! 115: if (strcmp(s1, s)) { ! 116: putchar(07); ! 117: stty(0, &tty); ! 118: exit(1); ! 119: } ! 120: s[0] = 0; ! 121: ! 122: /* Set signal handlers */ ! 123: ! 124: signal(SIGINT, hi); ! 125: signal(SIGQUIT, hi); ! 126: signal(SIGTSTP, hi); ! 127: signal(SIGALRM, bye); ! 128: ntimer.it_interval = zerotime; ! 129: ntimer.it_value = timeout; ! 130: setitimer(ITIMER_REAL, &ntimer, &otimer); ! 131: ! 132: /* Header info */ ! 133: ! 134: printf ("lock: %s on %s. timeout in %d minutes\n", ! 135: ttynam, hostname, sectimeout); ! 136: printf("time now is %.20s", ap); ! 137: if (tzn) ! 138: printf("%s", tzn); ! 139: printf("%s", ap+19); ! 140: ! 141: /* wait */ ! 142: ! 143: for (;;) { ! 144: printf("Key: "); ! 145: if (fgets(s, sizeof s, stdin) == NULL) { ! 146: clearerr(stdin); ! 147: hi(); ! 148: continue; ! 149: } ! 150: if (strcmp(s1, s) == 0) ! 151: break; ! 152: if (pwd == (struct passwd *) 0 || pwd->pw_passwd[0] == '\0') ! 153: break; ! 154: ap = index(s, '\n'); ! 155: if (ap != NULL) ! 156: *ap = '\0'; ! 157: if (strcmp(pwd->pw_passwd, crypt(s, pwd->pw_passwd)) == 0) ! 158: break; ! 159: printf("\07\n"); ! 160: if (ioctl(0, TIOCGETP, &ntty)) ! 161: exit(1); ! 162: } ! 163: ioctl(0, TIOCSETN, &tty); ! 164: putchar('\n'); ! 165: exit (0); ! 166: usage: ! 167: printf("Usage: lock [-timeout]\n"); ! 168: exit (1); ! 169: } ! 170: ! 171: /* ! 172: * get out of here ! 173: */ ! 174: ! 175: quit() ! 176: { ! 177: ioctl(0, TIOCSETN, &tty); ! 178: exit (0); ! 179: } ! 180: ! 181: bye() ! 182: { ! 183: ioctl(0, TIOCSETN, &tty); ! 184: printf("lock: timeout\n"); ! 185: exit (1); ! 186: } ! 187: ! 188: /* ! 189: * tell the user we are waiting ! 190: */ ! 191: ! 192: hi() ! 193: { ! 194: long curtime; ! 195: struct timeval timval; ! 196: struct timezone timzone; ! 197: ! 198: gettimeofday(&timval, &timzone); ! 199: curtime = timval.tv_sec; ! 200: printf("lock: type in the unlock key. timeout in %d minutes\n", ! 201: (nexttime-curtime)/60); ! 202: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.