|
|
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.