~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to libdrizzle/get_password.c

  • Committer: Jay Pipes
  • Date: 2008-07-17 18:48:58 UTC
  • mto: This revision was merged to the branch mainline in revision 182.
  • Revision ID: jay@mysql.com-20080717184858-2mbouxl8xi41gcge
Removed DBUG from CSV and Blackhole storage engines

Show diffs side-by-side

added added

removed removed

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