~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to client/get_password.c

  • Committer: brian
  • Date: 2008-07-03 12:39:14 UTC
  • Revision ID: brian@localhost.localdomain-20080703123914-lry82qf74f6cbyzs
Disabling myisam tools until incomming link patch from Monty

Show diffs side-by-side

added added

removed removed

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