~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to libdrizzle/get_password.c

  • Committer: Brian Aker
  • Date: 2008-07-14 22:40:46 UTC
  • Revision ID: brian@tangent.org-20080714224046-x183907w9wp1txwv
Removed sql_manager. Ever heard of just setting up the OS to sync when you
want it to?

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 
 *
4
 
 *  Copyright (C) 2008 Sun Microsystems, Inc.
5
 
 *
6
 
 *  This program is free software; you can redistribute it and/or modify
7
 
 *  it under the terms of the GNU General Public License as published by
8
 
 *  the Free Software Foundation; version 2 of the License.
9
 
 *
10
 
 *  This program is distributed in the hope that it will be useful,
11
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 
 *  GNU General Public License for more details.
14
 
 *
15
 
 *  You should have received a copy of the GNU General Public License
16
 
 *  along with this program; if not, write to the Free Software
17
 
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 
 */
 
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
19
 
20
20
/*
21
21
** Ask for a password from tty
22
22
** This is an own file to avoid conflicts with curses
23
23
*/
24
 
#include "libdrizzle.h"
25
 
 
26
 
#include <string.h>
27
 
#include <stdio.h>
28
 
#include <stdlib.h>
29
 
#include <ctype.h>
30
 
 
 
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__)
31
40
#include <sys/ioctl.h>
32
41
#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
 
 
 
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
  DBUG_ENTER("get_tty_password");
 
84
  _cputs(opt_message ? opt_message : "Enter password: ");
 
85
  for (;;)
 
86
  {
 
87
    char tmp;
 
88
    tmp=_getch();
 
89
    if (tmp == '\b' || (int) tmp == 127)
 
90
    {
 
91
      if (pos != to)
 
92
      {
 
93
        _cputs("\b \b");
 
94
        pos--;
 
95
        continue;
 
96
      }
 
97
    }
 
98
    if (tmp == '\n' || tmp == '\r' || tmp == 3)
 
99
      break;
 
100
    if (iscntrl(tmp) || pos == end)
 
101
      continue;
 
102
    _cputs("*");
 
103
    *(pos++) = tmp;
 
104
  }
 
105
  while (pos != to && isspace(pos[-1]) == ' ')
 
106
    pos--;                                      /* Allow dummy space at end */
 
107
  *pos=0;
 
108
  _cputs("\n");
 
109
  DBUG_RETURN(my_strdup(to,MYF(MY_FAE)));
 
110
}
 
111
 
 
112
#else
 
113
 
 
114
#ifndef HAVE_GETPASS
45
115
/*
46
116
  Can't use fgets, because readline will get confused
47
117
  length is max number of chars in to, not counting \0
48
118
  to will not include the eol characters.
49
119
*/
50
120
 
51
 
static void get_password(char *to, uint32_t length,int fd, bool echo)
 
121
static void get_password(char *to,uint length,int fd, my_bool echo)
52
122
{
53
123
  char *pos=to,*end=to+length;
54
124
 
55
125
  for (;;)
56
126
  {
57
127
    char tmp;
58
 
    if (read(fd,&tmp,1) != 1)
 
128
    if (my_read(fd,&tmp,1,MYF(0)) != 1)
59
129
      break;
60
130
    if (tmp == '\b' || (int) tmp == 127)
61
131
    {
86
156
  *pos=0;
87
157
  return;
88
158
}
 
159
#endif /* ! HAVE_GETPASS */
89
160
 
90
161
 
91
162
char *get_tty_password(const char *opt_message)
92
163
{
 
164
#ifdef HAVE_GETPASS
 
165
  char *passbuff;
 
166
#else /* ! HAVE_GETPASS */
93
167
  TERMIO org,tmp;
 
168
#endif /* HAVE_GETPASS */
94
169
  char buff[80];
95
170
 
 
171
  DBUG_ENTER("get_tty_password");
 
172
 
 
173
#ifdef HAVE_GETPASS
 
174
  passbuff = getpass(opt_message ? opt_message : "Enter password: ");
 
175
 
 
176
  /* copy the password to buff and clear original (static) buffer */
 
177
  strnmov(buff, passbuff, sizeof(buff) - 1);
 
178
#ifdef _PASSWORD_LEN
 
179
  memset(passbuff, 0, _PASSWORD_LEN);
 
180
#endif
 
181
#else 
96
182
  if (isatty(fileno(stdout)))
97
183
  {
98
184
    fputs(opt_message ? opt_message : "Enter password: ",stdout);
99
185
    fflush(stdout);
100
186
  }
101
 
#  if defined(HAVE_TERMIOS_H)
 
187
#if defined(HAVE_TERMIOS_H)
102
188
  tcgetattr(fileno(stdin), &org);
103
189
  tmp = org;
104
190
  tmp.c_lflag &= ~(ECHO | ISIG | ICANON);
107
193
  tcsetattr(fileno(stdin), TCSADRAIN, &tmp);
108
194
  get_password(buff, sizeof(buff)-1, fileno(stdin), isatty(fileno(stdout)));
109
195
  tcsetattr(fileno(stdin), TCSADRAIN, &org);
110
 
#  elif defined(HAVE_TERMIO_H)
 
196
#elif defined(HAVE_TERMIO_H)
111
197
  ioctl(fileno(stdin), (int) TCGETA, &org);
112
198
  tmp=org;
113
199
  tmp.c_lflag &= ~(ECHO | ISIG | ICANON);
116
202
  ioctl(fileno(stdin),(int) TCSETA, &tmp);
117
203
  get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout)));
118
204
  ioctl(fileno(stdin),(int) TCSETA, &org);
119
 
#  else
 
205
#else
120
206
  gtty(fileno(stdin), &org);
121
207
  tmp=org;
122
208
  tmp.sg_flags &= ~ECHO;
124
210
  stty(fileno(stdin), &tmp);
125
211
  get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout)));
126
212
  stty(fileno(stdin), &org);
127
 
#  endif
 
213
#endif
128
214
  if (isatty(fileno(stdout)))
129
215
    fputc('\n',stdout);
 
216
#endif /* HAVE_GETPASS */
130
217
 
131
 
  return strdup(buff);
 
218
  DBUG_RETURN(my_strdup(buff,MYF(MY_FAE)));
132
219
}
 
220
#endif /*__WIN__*/