|
|
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: (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, 1987 Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)lock.c 5.13 (Berkeley) 6/1/90"; ! 28: #endif /* not lint */ ! 29: ! 30: /* ! 31: * Lock a terminal up until the given key is entered, until the root ! 32: * password is entered, or the given interval times out. ! 33: * ! 34: * Timeout interval is by default TIMEOUT, it can be changed with ! 35: * an argument of the form -time where time is in minutes ! 36: */ ! 37: ! 38: #include <sys/param.h> ! 39: #include <sys/stat.h> ! 40: #include <sys/time.h> ! 41: #include <sys/signal.h> ! 42: #include <sgtty.h> ! 43: #include <pwd.h> ! 44: #include <stdio.h> ! 45: #include <ctype.h> ! 46: #include <string.h> ! 47: ! 48: #define TIMEOUT 15 ! 49: ! 50: void quit(), bye(), hi(); ! 51: ! 52: struct timeval timeout; ! 53: struct timeval zerotime; ! 54: struct sgttyb tty, ntty; ! 55: long nexttime; /* keep the timeout time */ ! 56: ! 57: /*ARGSUSED*/ ! 58: main(argc, argv) ! 59: int argc; ! 60: char **argv; ! 61: { ! 62: extern char *optarg; ! 63: extern int errno, optind; ! 64: struct passwd *pw; ! 65: struct timeval timval; ! 66: struct itimerval ntimer, otimer; ! 67: struct tm *timp; ! 68: int ch, sectimeout, usemine; ! 69: char *ap, *mypw, *ttynam, *tzn; ! 70: char hostname[MAXHOSTNAMELEN], s[BUFSIZ], s1[BUFSIZ]; ! 71: char *crypt(), *ttyname(); ! 72: ! 73: sectimeout = TIMEOUT; ! 74: mypw = NULL; ! 75: usemine = 0; ! 76: while ((ch = getopt(argc, argv, "pt:")) != EOF) ! 77: switch((char)ch) { ! 78: case 't': ! 79: if ((sectimeout = atoi(optarg)) <= 0) { ! 80: (void)fprintf(stderr, ! 81: "lock: illegal timeout value.\n"); ! 82: exit(1); ! 83: } ! 84: break; ! 85: case 'p': ! 86: usemine = 1; ! 87: if (!(pw = getpwuid(getuid()))) { ! 88: (void)fprintf(stderr, ! 89: "lock: unknown uid %d.\n", getuid()); ! 90: exit(1); ! 91: } ! 92: mypw = strdup(pw->pw_passwd); ! 93: break; ! 94: case '?': ! 95: default: ! 96: (void)fprintf(stderr, ! 97: "usage: lock [-p] [-t timeout]\n"); ! 98: exit(1); ! 99: } ! 100: timeout.tv_sec = sectimeout * 60; ! 101: ! 102: setuid(getuid()); /* discard privs */ ! 103: ! 104: if (ioctl(0, TIOCGETP, &tty)) /* get information for header */ ! 105: exit(1); ! 106: gethostname(hostname, sizeof(hostname)); ! 107: if (!(ttynam = ttyname(0))) { ! 108: (void)printf("lock: not a terminal?\n"); ! 109: exit(1); ! 110: } ! 111: if (gettimeofday(&timval, (struct timezone *)NULL)) { ! 112: (void)fprintf(stderr, ! 113: "lock: gettimeofday: %s\n", strerror(errno)); ! 114: exit(1); ! 115: } ! 116: nexttime = timval.tv_sec + (sectimeout * 60); ! 117: timp = localtime(&timval.tv_sec); ! 118: ap = asctime(timp); ! 119: tzn = timp->tm_zone; ! 120: ! 121: (void)signal(SIGINT, quit); ! 122: (void)signal(SIGQUIT, quit); ! 123: ntty = tty; ntty.sg_flags &= ~ECHO; ! 124: (void)ioctl(0, TIOCSETP, &ntty); ! 125: ! 126: if (!mypw) { ! 127: /* get key and check again */ ! 128: (void)printf("Key: "); ! 129: if (!fgets(s, sizeof(s), stdin) || *s == '\n') ! 130: quit(); ! 131: (void)printf("\nAgain: "); ! 132: /* ! 133: * Don't need EOF test here, if we get EOF, then s1 != s ! 134: * and the right things will happen. ! 135: */ ! 136: (void)fgets(s1, sizeof(s1), stdin); ! 137: (void)putchar('\n'); ! 138: if (strcmp(s1, s)) { ! 139: (void)printf("\07lock: passwords didn't match.\n"); ! 140: ioctl(0, TIOCSETP, &tty); ! 141: exit(1); ! 142: } ! 143: s[0] = NULL; ! 144: mypw = s1; ! 145: } ! 146: ! 147: /* set signal handlers */ ! 148: (void)signal(SIGINT, hi); ! 149: (void)signal(SIGQUIT, hi); ! 150: (void)signal(SIGTSTP, hi); ! 151: (void)signal(SIGALRM, bye); ! 152: ! 153: ntimer.it_interval = zerotime; ! 154: ntimer.it_value = timeout; ! 155: setitimer(ITIMER_REAL, &ntimer, &otimer); ! 156: ! 157: /* header info */ ! 158: (void)printf("lock: %s on %s. timeout in %d minutes\ntime now is %.20s%s%s", ! 159: ttynam, hostname, sectimeout, ap, tzn, ap + 19); ! 160: ! 161: for (;;) { ! 162: (void)printf("Key: "); ! 163: if (!fgets(s, sizeof(s), stdin)) { ! 164: clearerr(stdin); ! 165: hi(); ! 166: continue; ! 167: } ! 168: if (usemine) { ! 169: s[strlen(s) - 1] = '\0'; ! 170: if (!strcmp(mypw, crypt(s, mypw))) ! 171: break; ! 172: } ! 173: else if (!strcmp(s, s1)) ! 174: break; ! 175: (void)printf("\07\n"); ! 176: if (ioctl(0, TIOCGETP, &ntty)) ! 177: exit(1); ! 178: } ! 179: quit(); ! 180: } ! 181: ! 182: void ! 183: hi() ! 184: { ! 185: struct timeval timval; ! 186: ! 187: if (!gettimeofday(&timval, (struct timezone *)NULL)) ! 188: (void)printf("lock: type in the unlock key. timeout in %ld:%ld minutes\n", ! 189: (nexttime - timval.tv_sec) / 60, (nexttime - timval.tv_sec) % 60); ! 190: } ! 191: ! 192: void ! 193: quit() ! 194: { ! 195: (void)putchar('\n'); ! 196: (void)ioctl(0, TIOCSETP, &tty); ! 197: exit(0); ! 198: } ! 199: ! 200: void ! 201: bye() ! 202: { ! 203: (void)ioctl(0, TIOCSETP, &tty); ! 204: (void)printf("lock: timeout\n"); ! 205: exit(1); ! 206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.