home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / libmysql / get_password.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  5KB  |  213 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /*
  19. ** Ask for a password from tty
  20. ** This is an own file to avoid conflicts with curses
  21. */
  22. #include <global.h>
  23. #include <my_sys.h>
  24. #include "mysql.h"
  25. #include <m_string.h>
  26. #include <m_ctype.h>
  27. #include <dbug.h>
  28.  
  29. #if defined(HAVE_BROKEN_GETPASS) && !defined(HAVE_GETPASSPHRASE)
  30. #undef HAVE_GETPASS
  31. #endif
  32.  
  33. #ifdef HAVE_GETPASS
  34. #ifdef HAVE_PWD_H
  35. #include <pwd.h>
  36. #endif /* HAVE_PWD_H */
  37. #else /* ! HAVE_GETPASS */
  38. #ifndef __WIN__
  39. #include <sys/ioctl.h>
  40. #ifdef HAVE_TERMIOS_H                /* For tty-password */
  41. #include    <termios.h>
  42. #define TERMIO    struct termios
  43. #else
  44. #ifdef HAVE_TERMIO_H                /* For tty-password */
  45. #include    <termio.h>
  46. #define TERMIO    struct termio
  47. #else
  48. #include    <sgtty.h>
  49. #define TERMIO    struct sgttyb
  50. #endif
  51. #endif
  52. #ifdef alpha_linux_port
  53. #include <asm/ioctls.h>                /* QQ; Fix this in configure */
  54. #include <asm/termiobits.h>
  55. #endif
  56. #else
  57. #include <conio.h>
  58. #endif /* __WIN__ */
  59. #endif /* HAVE_GETPASS */
  60.  
  61. #ifdef HAVE_GETPASSPHRASE            /* For Solaris */
  62. #define getpass(A) getpassphrase(A)
  63. #endif
  64.  
  65. #ifdef __WIN__
  66. /* were just going to fake it here and get input from
  67.    the keyboard */
  68.  
  69. char *get_tty_password(char *opt_message)
  70. {
  71.   char to[80];
  72.   char *pos=to,*end=to+sizeof(to)-1;
  73.   int i=0;
  74.   DBUG_ENTER("get_tty_password");
  75.   fprintf(stdout,opt_message ? opt_message : "Enter password: ");
  76.   for (;;)
  77.   {
  78.     char tmp;
  79.     tmp=_getch();
  80.     if (tmp == '\b' || (int) tmp == 127)
  81.     {
  82.       if (pos != to)
  83.       {
  84.     _cputs("\b \b");
  85.     pos--;
  86.     continue;
  87.       }
  88.     }
  89.     if (tmp == '\n' || tmp == '\r' || tmp == 3)
  90.       break;
  91.     if (iscntrl(tmp) || pos == end)
  92.       continue;
  93.     _cputs("*");
  94.     *(pos++) = tmp;
  95.   }
  96.   while (pos != to && isspace(pos[-1]) == ' ')
  97.     pos--;                    /* Allow dummy space at end */
  98.   *pos=0;
  99.   _cputs("\n");
  100.   DBUG_RETURN(my_strdup(to,MYF(MY_FAE)));
  101. }
  102.  
  103. #else
  104.  
  105.  
  106. #ifndef HAVE_GETPASS
  107. /*
  108. ** Can't use fgets, because readline will get confused
  109. ** length is max number of chars in to, not counting \0
  110. *  to will not include the eol characters.
  111. */
  112.  
  113. static void get_password(char *to,uint length,int fd,bool echo)
  114. {
  115.   char *pos=to,*end=to+length;
  116.  
  117.   for (;;)
  118.   {
  119.     char tmp;
  120.     if (my_read(fd,&tmp,1,MYF(0)) != 1)
  121.       break;
  122.     if (tmp == '\b' || (int) tmp == 127)
  123.     {
  124.       if (pos != to)
  125.       {
  126.     if (echo)
  127.     {
  128.       fputs("\b \b",stdout);
  129.       fflush(stdout);
  130.     }
  131.     pos--;
  132.     continue;
  133.       }
  134.     }
  135.     if (tmp == '\n' || tmp == '\r' || tmp == 3)
  136.       break;
  137.     if (iscntrl(tmp) || pos == end)
  138.       continue;
  139.     if (echo)
  140.     {
  141.       fputc('*',stdout);
  142.       fflush(stdout);
  143.     }
  144.     *(pos++) = tmp;
  145.   }
  146.   while (pos != to && isspace(pos[-1]) == ' ')
  147.     pos--;                    /* Allow dummy space at end */
  148.   *pos=0;
  149.   return;
  150. }
  151. #endif /* ! HAVE_GETPASS */
  152.  
  153.  
  154. char *get_tty_password(char *opt_message)
  155. {
  156. #ifdef HAVE_GETPASS
  157.   char *passbuff;
  158. #else /* ! HAVE_GETPASS */
  159.   TERMIO org,tmp;
  160. #endif /* HAVE_GETPASS */
  161.   char buff[80];
  162.  
  163.   DBUG_ENTER("get_tty_password");
  164.  
  165. #ifdef HAVE_GETPASS
  166.   passbuff = getpass(opt_message ? opt_message : "Enter password: ");
  167.  
  168.   /* copy the password to buff and clear original (static) buffer */
  169.   strnmov(buff, passbuff, sizeof(buff) - 1);
  170. #ifdef _PASSWORD_LEN
  171.   memset(passbuff, 0, _PASSWORD_LEN);
  172. #endif
  173. #else 
  174.   if (isatty(fileno(stdout)))
  175.   {
  176.     fputs(opt_message ? opt_message : "Enter password: ",stdout);
  177.     fflush(stdout);
  178.   }
  179. #if defined(HAVE_TERMIOS_H)
  180.   tcgetattr(fileno(stdin), &org);
  181.   tmp = org;
  182.   tmp.c_lflag &= ~(ECHO | ISIG | ICANON);
  183.   tmp.c_cc[VMIN] = 1;
  184.   tmp.c_cc[VTIME] = 0;
  185.   tcsetattr(fileno(stdin), TCSADRAIN, &tmp);
  186.   get_password(buff, sizeof(buff)-1, fileno(stdin), isatty(fileno(stdout)));
  187.   tcsetattr(fileno(stdin), TCSADRAIN, &org);
  188. #elif defined(HAVE_TERMIO_H)
  189.   ioctl(fileno(stdin), (int) TCGETA, &org);
  190.   tmp=org;
  191.   tmp.c_lflag &= ~(ECHO | ISIG | ICANON);
  192.   tmp.c_cc[VMIN] = 1;
  193.   tmp.c_cc[VTIME]= 0;
  194.   ioctl(fileno(stdin),(int) TCSETA, &tmp);
  195.   get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout)));
  196.   ioctl(fileno(stdin),(int) TCSETA, &org);
  197. #else
  198.   gtty(fileno(stdin), &org);
  199.   tmp=org;
  200.   tmp.sg_flags &= ~ECHO;
  201.   tmp.sg_flags |= RAW;
  202.   stty(fileno(stdin), &tmp);
  203.   get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout)));
  204.   stty(fileno(stdin), &org);
  205. #endif
  206.   if (isatty(fileno(stdout)))
  207.     fputc('\n',stdout);
  208. #endif /* HAVE_GETPASS */
  209.  
  210.   DBUG_RETURN(my_strdup(buff,MYF(MY_FAE)));
  211. }
  212. #endif /*__WIN__*/
  213.