Annotation of researchv10dc/cmd/descrypt/getpass.USG, revision 1.1.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.