c40fc0fc8a2da1315099cfbbeb0248b2a63aaa9e
* Copyright (c) 1980, 1987 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
"@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\
static char sccsid
[] = "@(#)lock.c 5.9 (Berkeley) %G%";
* Lock a terminal up until the given key is entered, until the root
* password is entered, or the given interval times out.
* Timeout interval is by default TIMEOUT, it can be changed with
* an argument of the form -time where time is in minutes
long nexttime
; /* keep the timeout time */
extern int errno
, optind
;
struct itimerval ntimer
, otimer
;
int ch
, sectimeout
, usemine
;
char *ap
, *mypw
, *ttynam
, *tzn
;
char hostname
[MAXHOSTNAMELEN
], s
[BUFSIZ
], s1
[BUFSIZ
];
char *crypt(), *ttyname();
while ((ch
= getopt(argc
, argv
, "pt:")) != EOF
)
if ((sectimeout
= atoi(optarg
)) <= 0)
if (!(pw
= getpwuid(getuid()))) {
fprintf(stderr
, "lock: unknown uid %d.\n",
mypw
= strdup(pw
->pw_passwd
);
fprintf(stderr
, "usage: lock [-p] [-t timeout]\n");
timeout
.tv_sec
= sectimeout
* 60;
setuid(getuid()); /* discard privs */
if (ioctl(0, TIOCGETP
, &tty
)) /* get information for header */
gethostname(hostname
, sizeof(hostname
));
if (!(ttynam
= ttyname(0))) {
printf("lock: not a terminal?\n");
if (gettimeofday(&timval
, (struct timezone
*)NULL
)) {
fprintf(stderr
, "lock: gettimeofday: %s\n", strerror(errno
));
nexttime
= timval
.tv_sec
+ (sectimeout
* 60);
timp
= localtime(&timval
.tv_sec
);
(void)signal(SIGINT
, quit
);
(void)signal(SIGQUIT
, quit
);
ntty
= tty
; ntty
.sg_flags
&= ~ECHO
;
(void)ioctl(0, TIOCSETP
, &ntty
);
/* get key and check again */
if (!fgets(s
, sizeof(s
), stdin
) || *s
== '\n')
* Don't need EOF test here, if we get EOF, then s1 != s
* and the right things will happen.
(void)fgets(s1
, sizeof(s1
), stdin
);
printf("\07lock: passwords didn't match.\n");
ioctl(0, TIOCSETP
, &tty
);
/* set signal handlers */
(void)signal(SIGINT
, hi
);
(void)signal(SIGQUIT
, hi
);
(void)signal(SIGTSTP
, hi
);
(void)signal(SIGALRM
, bye
);
ntimer
.it_interval
= zerotime
;
ntimer
.it_value
= timeout
;
setitimer(ITIMER_REAL
, &ntimer
, &otimer
);
printf ("lock: %s on %s. timeout in %d minutes\ntime now is %.20s%s%s",
ttynam
, hostname
, sectimeout
, ap
, tzn
, ap
+ 19);
if (!fgets(s
, sizeof(s
), stdin
)) {
if (!strcmp(mypw
, crypt(s
, mypw
)))
if (ioctl(0, TIOCGETP
, &ntty
))
if (!gettimeofday(&timval
, (struct timezone
*)NULL
))
printf("lock: type in the unlock key. timeout in %ld:%ld minutes\n",
(nexttime
- timval
.tv_sec
) / 60, (nexttime
- timval
.tv_sec
) % 60);
(void)ioctl(0, TIOCSETP
, &tty
);
(void)ioctl(0, TIOCSETP
, &tty
);
printf("lock: timeout\n");