home *** CD-ROM | disk | FTP | other *** search
/ Boldly Go Collection / version40.iso / TS / 17A / DES_1991.ZIP / GETPASS.C < prev    next >
C/C++ Source or Header  |  1991-06-21  |  1KB  |  56 lines

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <sgtty.h>
  4.  
  5. #define    TTY    "/dev/tty"    /* Change to "con" for MS-DOS */
  6.  
  7. static struct sgttyb Ttysav;
  8. FILE *Tty;
  9. int (*Sig)();
  10.  
  11. /* Issue prompt and read reply with echo turned off */
  12. char *
  13. getpass(prompt)
  14. char *prompt;
  15. {
  16.     struct sgttyb ttyb;
  17.     register char *cp;
  18.     int c;
  19.     int getint();
  20.     static char pbuf[128];
  21.  
  22.     if((Tty = fopen(TTY,"r+")) == NULL){
  23.         fprintf(stderr,"getpass: cannot read key from %s\n",TTY);
  24.         exit(1);
  25.     }
  26.     setbuf(Tty,(char *)NULL);
  27.     fputs(prompt,Tty);
  28.  
  29.     Sig = signal(SIGINT, getint);
  30.     ioctl(fileno(Tty), TIOCGETP, &ttyb);
  31.     ioctl(fileno(Tty), TIOCGETP, &Ttysav);
  32.     ttyb.sg_flags &= ~ECHO;
  33.     ioctl(fileno(Tty), TIOCSETP, &ttyb);
  34.     cp = pbuf;
  35.     for (;;) {
  36.         c = getc(Tty);
  37.         if(c == '\r' || c == '\n' || c == EOF)
  38.             break;
  39.         if (cp < &pbuf[127])
  40.             *cp++ = c;
  41.     }
  42.     *cp = '\0';
  43.     ioctl(fileno(Tty), TIOCSETP, &Ttysav);
  44.     signal(SIGINT, Sig);
  45.     fputc('\n',Tty);
  46.     fclose(Tty);
  47.     return(pbuf);
  48. }
  49. int
  50. getint()
  51. {
  52.     ioctl(fileno(Tty), TIOCSETP, &Ttysav);
  53.     signal(SIGINT, Sig);
  54.     exit(1);
  55. }
  56.