|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980, 1987 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 the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: char copyright[] = ! 20: "@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\ ! 21: All rights reserved.\n"; ! 22: #endif /* not lint */ ! 23: ! 24: #ifndef lint ! 25: static char sccsid[] = "@(#)lock.c 5.6 (Berkeley) 6/29/88"; ! 26: #endif /* not lint */ ! 27: ! 28: /* ! 29: * Lock a terminal up until the given key is entered, until the root ! 30: * password is entered, or the given interval times out. ! 31: * ! 32: * Timeout interval is by default TIMEOUT, it can be changed with ! 33: * an argument of the form -time where time is in minutes ! 34: */ ! 35: ! 36: #include <sys/param.h> ! 37: #include <sys/stat.h> ! 38: #include <sys/time.h> ! 39: #include <sys/signal.h> ! 40: #include <pwd.h> ! 41: #include <sgtty.h> ! 42: #include <stdio.h> ! 43: #include <ctype.h> ! 44: ! 45: #define TIMEOUT 15 ! 46: #define YES 1 ! 47: #define NO 0 ! 48: ! 49: int quit(), bye(), hi(); ! 50: ! 51: struct timeval timeout; ! 52: struct timeval zerotime; ! 53: struct sgttyb tty, ntty; ! 54: long nexttime; /* keep the timeout time */ ! 55: ! 56: /*ARGSUSED*/ ! 57: main(argc, argv) ! 58: int argc; ! 59: char **argv; ! 60: { ! 61: struct passwd *root_pwd, *my_pwd; ! 62: struct timeval timval; ! 63: struct itimerval ntimer, otimer; ! 64: struct tm *timp; ! 65: int sectimeout = TIMEOUT, ! 66: use_mine; ! 67: char *ttynam, *ap, *tzn, ! 68: hostname[MAXHOSTNAMELEN], s[BUFSIZ], s1[BUFSIZ], ! 69: *crypt(), *index(), *ttyname(); ! 70: ! 71: use_mine = NO; ! 72: for (++argv; *argv; ++argv) { ! 73: if (argv[0][0] != '-') ! 74: usage(); ! 75: if (argv[0][1] == 'p') ! 76: use_mine = YES; ! 77: else if (!isdigit(argv[0][1])) { ! 78: fprintf(stderr, "lock: illegal option -- %c\n", argv[0][1]); ! 79: usage(); ! 80: } ! 81: else if ((sectimeout = atoi(*argv + 1)) <= 0) ! 82: usage(); ! 83: } ! 84: timeout.tv_sec = sectimeout * 60; ! 85: ! 86: /* get information for header */ ! 87: if (ioctl(0, TIOCGETP, &tty)) ! 88: exit(1); ! 89: gethostname(hostname, sizeof(hostname)); ! 90: if (!(ttynam = ttyname(0))) { ! 91: puts("lock: not a terminal?"); ! 92: exit(1); ! 93: } ! 94: if (gettimeofday(&timval, (struct timezone *)NULL)) { ! 95: perror("gettimeofday"); ! 96: exit(1); ! 97: } ! 98: nexttime = timval.tv_sec + (sectimeout * 60); ! 99: timp = localtime(&timval.tv_sec); ! 100: ap = asctime(timp); ! 101: tzn = timp->tm_zone; ! 102: ! 103: (void)signal(SIGINT, quit); ! 104: (void)signal(SIGQUIT, quit); ! 105: ntty = tty; ntty.sg_flags &= ~ECHO; ! 106: (void)ioctl(0, TIOCSETP, &ntty); ! 107: ! 108: if (!use_mine) { ! 109: /* get key and check again */ ! 110: fputs("Key: ", stdout); ! 111: if (!gets(s, sizeof(s))) ! 112: quit(); ! 113: fputs("\nAgain: ", stdout); ! 114: /* ! 115: * Don't need EOF test here, if we get EOF, then s1 != s ! 116: * and the right things will happen. ! 117: */ ! 118: (void)gets(s1, sizeof(s1)); ! 119: putchar('\n'); ! 120: if (strcmp(s1, s)) { ! 121: puts("\07lock: passwords didn't match."); ! 122: ioctl(0, TIOCSETP, &tty); ! 123: exit(1); ! 124: } ! 125: s[0] = NULL; ! 126: } ! 127: ! 128: /* set signal handlers */ ! 129: (void)signal(SIGINT, hi); ! 130: (void)signal(SIGQUIT, hi); ! 131: (void)signal(SIGTSTP, hi); ! 132: (void)signal(SIGALRM, bye); ! 133: ! 134: ntimer.it_interval = zerotime; ! 135: ntimer.it_value = timeout; ! 136: setitimer(ITIMER_REAL, &ntimer, &otimer); ! 137: ! 138: /* header info */ ! 139: printf ("lock: %s on %s. timeout in %d minutes\ntime now is %.20s%s%s", ! 140: ttynam, hostname, sectimeout, ap, tzn, ap + 19); ! 141: ! 142: /* wait */ ! 143: root_pwd = getpwuid(0); ! 144: if (use_mine) ! 145: my_pwd = getpwuid(getuid()); ! 146: for (;;) { ! 147: fputs("Key: ", stdout); ! 148: if (!gets(s, sizeof(s))) { ! 149: clearerr(stdin); ! 150: hi(); ! 151: continue; ! 152: } ! 153: if (use_mine) { ! 154: if (!my_pwd || !*my_pwd->pw_passwd || !strcmp(my_pwd->pw_passwd, crypt(s, my_pwd->pw_passwd))) ! 155: break; ! 156: } ! 157: else if (!strcmp(s1, s)) ! 158: break; ! 159: if (!root_pwd || !*root_pwd->pw_passwd || !strcmp(root_pwd->pw_passwd, crypt(s, root_pwd->pw_passwd))) ! 160: break; ! 161: puts("\07"); ! 162: if (ioctl(0, TIOCGETP, &ntty)) ! 163: exit(1); ! 164: } ! 165: putchar('\n'); ! 166: quit(); ! 167: } ! 168: ! 169: static ! 170: hi() ! 171: { ! 172: struct timeval timval; ! 173: ! 174: if (!gettimeofday(&timval, (struct timezone *)NULL)) ! 175: printf("lock: type in the unlock key. timeout in %ld:%ld minutes\n", ! 176: (nexttime - timval.tv_sec) / 60, (nexttime - timval.tv_sec) % 60); ! 177: } ! 178: ! 179: static ! 180: quit() ! 181: { ! 182: (void)ioctl(0, TIOCSETP, &tty); ! 183: exit(0); ! 184: } ! 185: ! 186: static ! 187: bye() ! 188: { ! 189: (void)ioctl(0, TIOCSETP, &tty); ! 190: puts("lock: timeout"); ! 191: exit(1); ! 192: } ! 193: ! 194: static ! 195: usage() ! 196: { ! 197: fputs("usage: lock [-p] [-timeout]\n", stderr); ! 198: exit(1); ! 199: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.