Annotation of 43BSD/ucb/lock.c, revision 1.1

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", &sectimeout) != 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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.