home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ncftp-2.3.0-base.tgz / ncftp-2.3.0-base.tar / contrib / ncftp / GetPass.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  4KB  |  176 lines

  1. /* GetPass.c */
  2.  
  3. #include "Sys.h"
  4.  
  5. #include <signal.h>
  6.  
  7. #include "Util.h"
  8. #include "GetPass.h"
  9.  
  10. /* This is responsible for turning off character echoing so a user
  11.  * can type a password without it showing up on the screen.  Why
  12.  * not just the getpass() library function?  Some systems' getpass
  13.  * only returns 8 characters.  We require longer "passwords" so
  14.  * users can use their email addresses when prompted for a password.
  15.  *
  16.  * We have one function, Echo, which turns character echoing on/off.
  17.  * GetPass then uses Echo to turn it off, reads the password,
  18.  * and turns it back on again.
  19.  *
  20.  * Unfortunately this whole thing isn't very portable.  Some systems
  21.  * have termio, others, sgtty.  Some have both.  Newer systems support
  22.  * termios, too.
  23.  */
  24.  
  25. #ifdef CANNOT_HIDE_TEXT
  26.  
  27. /* If you can't get it to compile, you an always do this. */ 
  28. void Echo(FILE *fp, int on)
  29. {
  30.     return;
  31. }
  32.  
  33. #else
  34.  
  35. #ifdef HAVE_TERMIOS_H
  36. #        include <termios.h>
  37. #else
  38. #    ifdef HAVE_TERMIO_H
  39. #        include <termio.h>
  40. #    else
  41. #        ifdef HAVE_SYS_IOCTL_H
  42. #            include <sys/ioctl.h>    /* For TIOxxxx constants. */
  43. #        endif
  44. #        include <sgtty.h>
  45. #    endif
  46. #endif /* !HAVE_TERMIOS_H */
  47.  
  48. #ifdef STRICT_PROTOS
  49. int ioctl(int, int, ...);
  50. #endif
  51.  
  52.  
  53. extern int gWinInit;
  54.  
  55. void Echo(FILE *fp, int on)
  56. {
  57. #ifdef HAVE_TERMIOS_H
  58.     static struct termios orig, noecho, *tp;
  59. #else
  60. #    ifdef HAVE_TERMIO_H
  61.     static struct termio orig, noecho, *tp;
  62. #    else
  63.     static struct sgttyb orig, noecho, *tp;
  64. #    endif
  65. #endif
  66.     static int state = 0;
  67.     int fd = fileno(fp);
  68.  
  69.     /* Don't do this if we've setup curses, which makes this crap
  70.      * irrelevant anyway.
  71.      */
  72.     if (gWinInit)
  73.         return;
  74.  
  75.     if (!isatty(fd))
  76.         return;
  77.  
  78.     if (state == 0) {
  79. #ifdef HAVE_TERMIOS_H
  80.         if (tcgetattr(fd, &orig) < 0)
  81.             perror("tcgetattr");
  82.         noecho = orig;
  83.         noecho.c_lflag &= ~ECHO;
  84. #else
  85. #    ifdef HAVE_TERMIO_H
  86.         if (ioctl(fd, TCGETA, &orig) < 0)
  87.             perror("ioctl");
  88.         noecho = orig;
  89.         noecho.c_lflag &= ~ECHO;
  90. #    else
  91.         if (ioctl(fd, TIOCGETP, &orig) < 0)
  92.             perror("ioctl");
  93.         noecho = orig;
  94.         noecho.sg_flags &= ~ECHO;
  95. #    endif
  96. #endif
  97.         state = 1;
  98.     }
  99.     tp = NULL;
  100.     if (on && state == 2) {
  101.         /* Turn echo back on. */
  102.         tp = &orig;
  103.         state = 1;
  104.     } else if (!on && state == 1) {
  105.         /* Turn echo off. */
  106.         tp = &noecho;
  107.         state = 2;
  108.     }
  109.     if (tp != NULL) {
  110. #ifdef HAVE_TERMIOS_H
  111.         if (tcsetattr(fd, TCSANOW, tp) < 0)
  112.             perror("tcsetattr");
  113. #else
  114. #    ifdef HAVE_TERMIO_H
  115.         if (ioctl(fd, TCSETA, tp) < 0)
  116.             perror("ioctl");
  117. #    else
  118.         if (ioctl(fd, TIOCSETP, tp) < 0)
  119.             perror("ioctl");
  120. #    endif
  121. #endif    /* !HAVE_TERMIOS_H */
  122.     }
  123. }    /* Echo */
  124.  
  125. #endif    /* CANNOT_HIDE_TEXT */
  126.  
  127.  
  128.  
  129. void GetPass(char *promptstr, char *answer, size_t siz)
  130. {
  131.     FILE *fp, *outfp;
  132.     Sig_t oldintr;
  133. #ifdef SIGTSTP
  134.     Sig_t oldtstp;
  135. #endif
  136.  
  137.     /*
  138.      * read and write to /dev/tty if possible; else read from
  139.      * stdin and write to stderr.
  140.      */
  141.       if ((outfp = fp = fopen("/dev/tty", "r+")) == NULL) {
  142.           outfp = stderr;
  143.           fp = stdin;
  144.       }
  145.  
  146.     /* Ignore some signals that could cause problems.  We don't want
  147.      * to return with echoing off.
  148.      */
  149.     oldintr = SIGNAL(SIGINT, SIG_IGN);
  150. #ifdef SIGTSTP
  151.     oldtstp = SIGNAL(SIGTSTP, SIG_IGN);
  152. #endif
  153.  
  154.     Echo(fp, 0);        /* Turn echoing off. */
  155.     (void) fputs(promptstr, outfp);
  156.     (void) fflush(outfp);
  157.     (void) rewind(outfp);
  158.     answer[0] = '\0';
  159.     if (fgets(answer, (int) siz, fp) != NULL)
  160.         answer[strlen(answer) - 1] = '\0';
  161.     (void) fflush(fp);
  162.     Echo(fp, 1);
  163.     (void) rewind(outfp);
  164.     (void) fputc('\n', outfp);
  165.  
  166.     (void) SIGNAL(SIGINT, oldintr);
  167. #ifdef SIGTSTP
  168.     (void) SIGNAL(SIGTSTP, oldtstp);
  169. #endif
  170.  
  171.     if (fp != stdin)
  172.         (void)fclose(fp);
  173. }    /* Getpass */
  174.  
  175. /* eof Getpass.c */
  176.