[BACK]Return to readpass.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/readpass.c between version 1.10 and 1.10.2.3

version 1.10, 2000/04/14 10:30:32 version 1.10.2.3, 2001/03/12 15:44:13
Line 32 
Line 32 
  */   */
   
 #include "includes.h"  #include "includes.h"
 RCSID("$Id$");  RCSID("$OpenBSD$");
   
 #include "xmalloc.h"  #include "xmalloc.h"
 #include "ssh.h"  #include "cli.h"
   #include "readpass.h"
   
 volatile int intr;  
   
 void  
 intcatch()  
 {  
         intr = 1;  
 }  
   
 /*  /*
  * Reads a passphrase from /dev/tty with echo turned off.  Returns the   * Reads a passphrase from /dev/tty with echo turned off.  Returns the
  * passphrase (allocated with xmalloc), being very careful to ensure that   * passphrase (allocated with xmalloc), being very careful to ensure that
  * no other userland buffer is storing the password.   * no other userland buffer is storing the password.
  */   */
   /*
    * Note:  the funcationallity of this routing has been moved to
    * cli_read_passphrase().  This routing remains to maintain
    * compatibility with existing code.
    */
 char *  char *
 read_passphrase(const char *prompt, int from_stdin)  read_passphrase(char *prompt, int from_stdin)
 {  {
         char buf[1024], *p, ch;          return cli_read_passphrase(prompt, from_stdin, 0);
         struct termios tio, saved_tio;  
         sigset_t oset, nset;  
         struct sigaction sa, osa;  
         int input, output, echo = 0;  
   
         if (from_stdin) {  
                 input = STDIN_FILENO;  
                 output = STDERR_FILENO;  
         } else  
                 input = output = open("/dev/tty", O_RDWR);  
   
         if (input == -1)  
                 fatal("You have no controlling tty.  Cannot read passphrase.\n");  
   
         /* block signals, get terminal modes and turn off echo */  
         sigemptyset(&nset);  
         sigaddset(&nset, SIGTSTP);  
         (void) sigprocmask(SIG_BLOCK, &nset, &oset);  
         memset(&sa, 0, sizeof(sa));  
         sa.sa_handler = intcatch;  
         (void) sigaction(SIGINT, &sa, &osa);  
   
         intr = 0;  
   
         if (tcgetattr(input, &saved_tio) == 0 && (saved_tio.c_lflag & ECHO)) {  
                 echo = 1;  
                 tio = saved_tio;  
                 tio.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);  
                 (void) tcsetattr(input, TCSANOW, &tio);  
         }  
   
         fflush(stdout);  
   
         (void)write(output, prompt, strlen(prompt));  
         for (p = buf; read(input, &ch, 1) == 1 && ch != '\n';) {  
                 if (intr)  
                         break;  
                 if (p < buf + sizeof(buf) - 1)  
                         *p++ = ch;  
         }  
         *p = '\0';  
         if (!intr)  
                 (void)write(output, "\n", 1);  
   
         /* restore terminal modes and allow signals */  
         if (echo)  
                 tcsetattr(input, TCSANOW, &saved_tio);  
         (void) sigprocmask(SIG_SETMASK, &oset, NULL);  
         (void) sigaction(SIGINT, &osa, NULL);  
   
         if (intr) {  
                 kill(getpid(), SIGINT);  
                 sigemptyset(&nset);  
                 /* XXX tty has not neccessarily drained by now? */  
                 sigsuspend(&nset);  
         }  
   
         if (!from_stdin)  
                 (void)close(input);  
         p = xstrdup(buf);  
         memset(buf, 0, sizeof(buf));  
         return (p);  
 }  }

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.10.2.3