home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume35 / ncftp / part04 / getpass.c < prev    next >
C/C++ Source or Header  |  1993-01-25  |  2KB  |  144 lines

  1. /* Getpass.c */
  2.  
  3. #define    PASSWD_LEN    127
  4.  
  5. #include "sys.h"
  6. #include <stdio.h>
  7. #include <signal.h>
  8.  
  9. #include "cmds.h"
  10. #include "getpass.h"
  11. #include "copyright.h"
  12.  
  13. #ifndef GETPASS
  14.  
  15. #ifndef NO_UNISTDH
  16. #    include <unistd.h>
  17. #endif
  18.  
  19. #ifdef BSD
  20. #    include <sys/ioctl.h>
  21. #endif
  22.  
  23. #ifdef TERMIOS
  24. #        include <termios.h>
  25. #else
  26. #    ifdef SGTTYB
  27. #        include <sgtty.h>
  28. #    else
  29. #        include <termio.h>
  30. #    endif
  31. #endif /* !TERMIOS */
  32.  
  33. int ioctl(int, int, ...);
  34.  
  35. #endif    /* GETPASS */
  36.  
  37.  
  38.  
  39.  
  40. void echo(FILE *fp, int on)
  41. {
  42. #ifndef GETPASS        /* Otherwise just do nothing which is ok. */
  43.  
  44. #ifdef TERMIOS
  45.     static struct termios orig, noecho, *tp;
  46. #else
  47. #    ifdef SGTTYB
  48.     static struct sgttyb orig, noecho, *tp;
  49. #    else
  50.     static struct termio orig, noecho, *tp;
  51. #    endif
  52. #endif
  53.     static int state = 0;
  54.     int fd = fileno(fp);
  55.  
  56.     if (state == 0) {
  57. #ifdef TERMIOS
  58.         if (tcgetattr(fd, &orig) < 0)
  59.             Perror("tcgetattr");
  60.         noecho = orig;
  61.         noecho.c_lflag &= ~ECHO;
  62. #else
  63. #    ifdef SGTTYB
  64.         if (ioctl(fd, TIOCGETP, &orig) < 0)
  65.             Perror("ioctl");
  66.         noecho = orig;
  67.         noecho.sg_flags &= ~ECHO;
  68. #    else
  69.         if (ioctl(fd, TCGETA, &orig) < 0)
  70.             Perror("ioctl");
  71.         noecho = orig;
  72.         noecho.c_lflag &= ~ECHO;
  73. #    endif
  74. #endif
  75.         state = 1;
  76.     }
  77.     tp = NULL;
  78.     if (on && state == 2) {
  79.         /* Turn echo back on. */
  80.         tp = &orig;
  81.         state = 1;
  82.     } else if (!on && state == 1) {
  83.         /* Turn echo off. */
  84.         tp = &noecho;
  85.         state = 2;
  86.     }
  87.     if (tp != NULL) {
  88. #ifdef TERMIOS
  89.         if (tcsetattr(fd, TCSAFLUSH, tp) < 0)
  90.             Perror("tcsetattr");
  91. #else
  92. #    ifdef SGTTYB
  93.         if (ioctl(fd, TIOCSETP, tp) < 0)
  94.             Perror("ioctl");
  95. #    else
  96.         if (ioctl(fd, TCSETA, tp) < 0)
  97.             Perror("ioctl");
  98. #    endif
  99. #endif    /* !TERMIOS */
  100.     }
  101.  
  102. #endif    /* GETPASS */
  103. }    /* echo */
  104.  
  105.  
  106.  
  107. #ifndef GETPASS
  108.  
  109. char *Getpass(char *promptstr)
  110. {
  111.     register int ch;
  112.     register char *p;
  113.     FILE *fp, *outfp;
  114.     void (*oldintr)(int);
  115.     static char buf[PASSWD_LEN + 1];
  116.  
  117.     /*
  118.      * read and write to /dev/tty if possible; else read from
  119.      * stdin and write to stderr.
  120.      */
  121.     if ((outfp = fp = fopen("/dev/tty", "w+")) == NULL) {
  122.         outfp = stderr;
  123.         fp = stdin;
  124.     }
  125.     oldintr = signal(SIGINT, SIG_IGN);
  126.     echo(fp, 0);        /* Turn echoing off. */
  127.     (void) fputs(promptstr, outfp);
  128.     (void) rewind(outfp);            /* implied flush */
  129.     for (p = buf; (ch = getc(fp)) != EOF && ch != '\n';)
  130.         if (p < buf + PASSWD_LEN)
  131.             *p++ = ch;
  132.     *p = '\0';
  133.     (void)write(fileno(outfp), "\n", 1);
  134.     echo(fp, 1);
  135.     (void) signal(SIGINT, oldintr);
  136.     if (fp != stdin)
  137.         (void)fclose(fp);
  138.     return(buf);
  139. }    /* Getpass */
  140.  
  141. #endif /* GETPASS */
  142.  
  143. /* eof Getpass.c */
  144.