get_password.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

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