get_password.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  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. ** Ask for a password from tty
  19. ** This is an own file to avoid conflicts with curses
  20. */
  21. #include <global.h>
  22. #include <my_sys.h>
  23. #include "mysql.h"
  24. #include <m_string.h>
  25. #include <m_ctype.h>
  26. #include <dbug.h>
  27. #if defined(HAVE_BROKEN_GETPASS) && !defined(HAVE_GETPASSPHRASE)
  28. #undef HAVE_GETPASS
  29. #endif
  30. #ifdef HAVE_GETPASS
  31. #ifdef HAVE_PWD_H
  32. #include <pwd.h>
  33. #endif /* HAVE_PWD_H */
  34. #else /* ! HAVE_GETPASS */
  35. #ifndef __WIN__
  36. #include <sys/ioctl.h>
  37. #ifdef HAVE_TERMIOS_H /* For tty-password */
  38. #include <termios.h>
  39. #define TERMIO struct termios
  40. #else
  41. #ifdef HAVE_TERMIO_H /* For tty-password */
  42. #include <termio.h>
  43. #define TERMIO struct termio
  44. #else
  45. #include <sgtty.h>
  46. #define TERMIO struct sgttyb
  47. #endif
  48. #endif
  49. #ifdef alpha_linux_port
  50. #include <asm/ioctls.h> /* QQ; Fix this in configure */
  51. #include <asm/termiobits.h>
  52. #endif
  53. #else
  54. #include <conio.h>
  55. #endif /* __WIN__ */
  56. #endif /* HAVE_GETPASS */
  57. #ifdef HAVE_GETPASSPHRASE /* For Solaris */
  58. #define getpass(A) getpassphrase(A)
  59. #endif
  60. #ifdef __WIN__
  61. /* were just going to fake it here and get input from
  62.    the keyboard */
  63. char *get_tty_password(char *opt_message)
  64. {
  65.   char to[80];
  66.   char *pos=to,*end=to+sizeof(to)-1;
  67.   int i=0;
  68.   DBUG_ENTER("get_tty_password");
  69.   fprintf(stdout,opt_message ? opt_message : "Enter password: ");
  70.   for (;;)
  71.   {
  72.     char tmp;
  73.     tmp=_getch();
  74.     if (tmp == 'b' || (int) tmp == 127)
  75.     {
  76.       if (pos != to)
  77.       {
  78. _cputs("b b");
  79. pos--;
  80. continue;
  81.       }
  82.     }
  83.     if (tmp == 'n' || tmp == 'r' || tmp == 3)
  84.       break;
  85.     if (iscntrl(tmp) || pos == end)
  86.       continue;
  87.     _cputs("*");
  88.     *(pos++) = tmp;
  89.   }
  90.   while (pos != to && isspace(pos[-1]) == ' ')
  91.     pos--; /* Allow dummy space at end */
  92.   *pos=0;
  93.   _cputs("n");
  94.   DBUG_RETURN(my_strdup(to,MYF(MY_FAE)));
  95. }
  96. #else
  97. #ifndef HAVE_GETPASS
  98. /*
  99. ** Can't use fgets, because readline will get confused
  100. ** length is max number of chars in to, not counting 
  101. *  to will not include the eol characters.
  102. */
  103. static void get_password(char *to,uint length,int fd,bool echo)
  104. {
  105.   char *pos=to,*end=to+length;
  106.   for (;;)
  107.   {
  108.     char tmp;
  109.     if (my_read(fd,&tmp,1,MYF(0)) != 1)
  110.       break;
  111.     if (tmp == 'b' || (int) tmp == 127)
  112.     {
  113.       if (pos != to)
  114.       {
  115. if (echo)
  116. {
  117.   fputs("b b",stdout);
  118.   fflush(stdout);
  119. }
  120. pos--;
  121. continue;
  122.       }
  123.     }
  124.     if (tmp == 'n' || tmp == 'r' || tmp == 3)
  125.       break;
  126.     if (iscntrl(tmp) || pos == end)
  127.       continue;
  128.     if (echo)
  129.     {
  130.       fputc('*',stdout);
  131.       fflush(stdout);
  132.     }
  133.     *(pos++) = tmp;
  134.   }
  135.   while (pos != to && isspace(pos[-1]) == ' ')
  136.     pos--; /* Allow dummy space at end */
  137.   *pos=0;
  138.   return;
  139. }
  140. #endif /* ! HAVE_GETPASS */
  141. char *get_tty_password(char *opt_message)
  142. {
  143. #ifdef HAVE_GETPASS
  144.   char *passbuff;
  145. #else /* ! HAVE_GETPASS */
  146.   TERMIO org,tmp;
  147. #endif /* HAVE_GETPASS */
  148.   char buff[80];
  149.   DBUG_ENTER("get_tty_password");
  150. #ifdef HAVE_GETPASS
  151.   passbuff = getpass(opt_message ? opt_message : "Enter password: ");
  152.   /* copy the password to buff and clear original (static) buffer */
  153.   strnmov(buff, passbuff, sizeof(buff) - 1);
  154. #ifdef _PASSWORD_LEN
  155.   memset(passbuff, 0, _PASSWORD_LEN);
  156. #endif
  157. #else 
  158.   if (isatty(fileno(stdout)))
  159.   {
  160.     fputs(opt_message ? opt_message : "Enter password: ",stdout);
  161.     fflush(stdout);
  162.   }
  163. #if defined(HAVE_TERMIOS_H)
  164.   tcgetattr(fileno(stdin), &org);
  165.   tmp = org;
  166.   tmp.c_lflag &= ~(ECHO | ISIG | ICANON);
  167.   tmp.c_cc[VMIN] = 1;
  168.   tmp.c_cc[VTIME] = 0;
  169.   tcsetattr(fileno(stdin), TCSADRAIN, &tmp);
  170.   get_password(buff, sizeof(buff)-1, fileno(stdin), isatty(fileno(stdout)));
  171.   tcsetattr(fileno(stdin), TCSADRAIN, &org);
  172. #elif defined(HAVE_TERMIO_H)
  173.   ioctl(fileno(stdin), (int) TCGETA, &org);
  174.   tmp=org;
  175.   tmp.c_lflag &= ~(ECHO | ISIG | ICANON);
  176.   tmp.c_cc[VMIN] = 1;
  177.   tmp.c_cc[VTIME]= 0;
  178.   ioctl(fileno(stdin),(int) TCSETA, &tmp);
  179.   get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout)));
  180.   ioctl(fileno(stdin),(int) TCSETA, &org);
  181. #else
  182.   gtty(fileno(stdin), &org);
  183.   tmp=org;
  184.   tmp.sg_flags &= ~ECHO;
  185.   tmp.sg_flags |= RAW;
  186.   stty(fileno(stdin), &tmp);
  187.   get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout)));
  188.   stty(fileno(stdin), &org);
  189. #endif
  190.   if (isatty(fileno(stdout)))
  191.     fputc('n',stdout);
  192. #endif /* HAVE_GETPASS */
  193.   DBUG_RETURN(my_strdup(buff,MYF(MY_FAE)));
  194. }
  195. #endif /*__WIN__*/