Annotation of researchv10no/cmd/descrypt/getpass.USG, revision 1.1

1.1     ! root        1: /*     @(#)getpass.c   1.4     */
        !             2: /*     3.0 SID #       1.4     */
        !             3: /*LINTLIBRARY*/
        !             4: #include <stdio.h>
        !             5: #include <signal.h>
        !             6: #include <termio.h>
        !             7: 
        !             8: extern void setbuf();
        !             9: extern FILE *fopen();
        !            10: extern int fclose(), fprintf(), findiop();
        !            11: extern int kill(), ioctl(), getpid();
        !            12: static int intrupt;
        !            13: 
        !            14: char *
        !            15: getpass(prompt)
        !            16: char   *prompt;
        !            17: {
        !            18:        struct termio ttyb;
        !            19:        unsigned short flags;
        !            20:        register char *p;
        !            21:        register int c;
        !            22:        FILE    *fi;
        !            23:        static char pbuf[128];
        !            24:        int     (*sig)(), catch();
        !            25: 
        !            26:        if((fi = fopen("/dev/tty", "r")) == NULL)
        !            27:                return((char*)NULL);
        !            28:        else
        !            29:                setbuf(fi, (char*)NULL);
        !            30:        sig = signal(SIGINT, catch);
        !            31:        intrupt = 0;
        !            32:        (void) ioctl(fileno(fi), TCGETA, &ttyb);
        !            33:        flags = ttyb.c_lflag;
        !            34:        ttyb.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
        !            35:        (void) ioctl(fileno(fi), TCSETAF, &ttyb);
        !            36:        (void) fputs(prompt, stderr);
        !            37:        for(p=pbuf; !intrupt && (c = getc(fi)) != '\n' && c != EOF; ) {
        !            38:                if(p < &pbuf[127])
        !            39:                        *p++ = c;
        !            40:        }
        !            41:        *p = '\0';
        !            42:        (void) putc('\n', stderr);
        !            43:        ttyb.c_lflag = flags;
        !            44:        (void) ioctl(fileno(fi), TCSETA, &ttyb);
        !            45:        (void) signal(SIGINT, sig);
        !            46:        if(fi != stdin)
        !            47:                (void) fclose(fi);
        !            48:        if(intrupt)
        !            49:                (void) kill(getpid(), SIGINT);
        !            50:        return(pbuf);
        !            51: }
        !            52: 
        !            53: static int
        !            54: catch()
        !            55: {
        !            56:        ++intrupt;
        !            57: }

unix.superglobalmegacorp.com

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