home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / ncftp / older_versions / ncftp-3.2.2-src.tar.bz2 / ncftp-3.2.2-src.tar / ncftp-3.2.2 / libncftp / u_getpass.c < prev    next >
C/C++ Source or Header  |  2006-08-05  |  2KB  |  94 lines

  1. /* u_getpass.c
  2.  *
  3.  * Copyright (c) 1996-2006 Mike Gleason, NcFTP Software.
  4.  * All rights reserved.
  5.  *
  6.  */
  7.  
  8. #include "syshdrs.h"
  9. #if ((defined(HAVE_TCGETATTR)) && (defined(HAVE_TERMIOS_H)))
  10. #    include <termios.h>
  11. #endif
  12. #ifdef PRAGMA_HDRSTOP
  13. #    pragma hdrstop
  14. #endif
  15.  
  16. char *
  17. GetPass(const char *const prompt, char *const pwbuf, const size_t pwbufsize)
  18. {
  19. #if defined(HAVE_GETPASS) && !defined(_REENTRANT)
  20.     char *cp;
  21.  
  22.     cp = getpass(prompt);
  23.     if (cp != NULL) {
  24.         strncpy(pwbuf, cp, pwbufsize);
  25.         pwbuf[pwbufsize - 1] = '\0';
  26.         cp = pwbuf;
  27.     } else {
  28.         (void) memset(pwbuf, 0, pwbufsize);
  29.     }
  30.     return (cp);
  31. #elif defined(_CONSOLE) && ( (defined(WIN32) || defined(_WINDOWS)) && !defined(__CYGWIN__) )
  32.  
  33.     char *dst, *dlim;
  34.     int c;
  35.  
  36.     (void) memset(pwbuf, 0, pwbufsize);
  37.     if (! _isatty(_fileno(stdout)))
  38.         return (pwbuf);
  39.     (void) fputs(prompt, stdout);
  40.     (void) fflush(stdout);
  41.  
  42.     for (dst = pwbuf, dlim = dst + pwbufsize - 1;;) {
  43.         c = _getch();
  44.         if ((c == 0) || (c == 0xe0)) {
  45.             /* The key is a function or arrow key; read and discard. */
  46.             (void) _getch();
  47.         }
  48.         if ((c == '\r') || (c == '\n'))
  49.             break;
  50.         if (dst < dlim)
  51.             *dst++ = c;
  52.     }
  53.     *dst = '\0';
  54.  
  55.     (void) fflush(stdout);
  56.     (void) fflush(stdin);
  57.     return (pwbuf);
  58. #elif ((defined(HAVE_TCGETATTR)) && (defined(HAVE_TERMIOS_H)))
  59.     /* Should also work for Cygwin. */
  60.     struct termios old_ti, new_ti;
  61.  
  62.     (void) memset(pwbuf, 0, pwbufsize);
  63.     if (! isatty(fileno(stdout)))
  64.         return (pwbuf);
  65.     (void) fputs(prompt, stdout);
  66.     (void) fflush(stdout);
  67.     if (tcgetattr(fileno(stdout), &old_ti) != 0)
  68.         return (pwbuf);
  69.     new_ti = old_ti;
  70.     new_ti.c_lflag &= ~ECHO;
  71.     if (tcsetattr(fileno(stdout), TCSAFLUSH, &new_ti) != 0)
  72.         return (pwbuf);
  73.     (void) FGets(pwbuf, pwbufsize, stdin);
  74.     (void) fflush(stdout);
  75.     (void) fflush(stdin);
  76.     (void) tcsetattr(fileno(stdout), TCSAFLUSH, &old_ti);
  77.     return (pwbuf);
  78. #else
  79.     (void) memset(pwbuf, 0, pwbufsize);
  80. #if (defined(WIN32) || defined(_WINDOWS)) && !defined(__CYGWIN__)
  81.     if (! _isatty(_fileno(stdout)))
  82. #else
  83.     if (! isatty(1))
  84. #endif
  85.         return (pwbuf);
  86.     (void) fputs(prompt, stdout);
  87.     (void) fflush(stdout);
  88.     (void) FGets(pwbuf, pwbufsize, stdin);
  89.     (void) fflush(stdout);
  90.     (void) fflush(stdin);
  91.     return (pwbuf);
  92. #endif
  93. }    /* GetPass */
  94.