1 /* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
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.
7 There are special exceptions to the terms and conditions of the GPL as it
8 is applied to this software.
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.
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 Street, Fifth Floor, Boston, MA 02110-1301, USA */
20 ** Ask for a password from tty
21 ** This is an own file to avoid conflicts with curses
23 #include <my_global.h>
29 #if defined(HAVE_BROKEN_GETPASS) && !defined(HAVE_GETPASSPHRASE)
36 #endif /* HAVE_PWD_H */
37 #else /* ! HAVE_GETPASS */
38 #if !defined(__WIN__) && !defined(__NETWARE__)
39 #include <sys/ioctl.h>
40 #ifdef HAVE_TERMIOS_H /* For tty-password */
42 #define TERMIO struct termios
44 #ifdef HAVE_TERMIO_H /* For tty-password */
46 #define TERMIO struct termio
49 #define TERMIO struct sgttyb
52 #ifdef alpha_linux_port
53 #include <asm/ioctls.h> /* QQ; Fix this in configure */
54 #include <asm/termiobits.h>
59 #endif /* __NETWARE__ */
61 #endif /* HAVE_GETPASS */
63 #ifdef HAVE_GETPASSPHRASE /* For Solaris */
64 #define getpass(A) getpassphrase(A)
67 #if defined( __WIN__) || defined(__NETWARE__)
68 /* were just going to fake it here and get input from the keyboard */
73 #define _getch getcharacter
74 #define _cputs(A) putstring(A)
77 char *get_tty_password(const char *opt_message
)
80 char *pos
=to
,*end
=to
+sizeof(to
)-1;
82 DBUG_ENTER("get_tty_password");
83 _cputs(opt_message
? opt_message
: "Enter password: ");
88 if (tmp
== '\b' || (int) tmp
== 127)
97 if (tmp
== '\n' || tmp
== '\r' || tmp
== 3)
99 if (iscntrl(tmp
) || pos
== end
)
104 while (pos
!= to
&& isspace(pos
[-1]) == ' ')
105 pos
--; /* Allow dummy space at end */
108 DBUG_RETURN(my_strdup(to
,MYF(MY_FAE
)));
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.
120 static void get_password(char *to
,uint length
,int fd
, my_bool echo
)
122 char *pos
=to
,*end
=to
+length
;
127 if (my_read(fd
,&tmp
,1,MYF(0)) != 1)
129 if (tmp
== '\b' || (int) tmp
== 127)
135 fputs("\b \b",stdout
);
142 if (tmp
== '\n' || tmp
== '\r' || tmp
== 3)
144 if (iscntrl(tmp
) || pos
== end
)
153 while (pos
!= to
&& isspace(pos
[-1]) == ' ')
154 pos
--; /* Allow dummy space at end */
158 #endif /* ! HAVE_GETPASS */
161 char *get_tty_password(const char *opt_message
)
165 #else /* ! HAVE_GETPASS */
167 #endif /* HAVE_GETPASS */
170 DBUG_ENTER("get_tty_password");
173 passbuff
= getpass(opt_message
? opt_message
: "Enter password: ");
175 /* copy the password to buff and clear original (static) buffer */
176 strnmov(buff
, passbuff
, sizeof(buff
) - 1);
178 memset(passbuff
, 0, _PASSWORD_LEN
);
181 if (isatty(fileno(stdout
)))
183 fputs(opt_message
? opt_message
: "Enter password: ",stdout
);
186 #if defined(HAVE_TERMIOS_H)
187 tcgetattr(fileno(stdin
), &org
);
189 tmp
.c_lflag
&= ~(ECHO
| ISIG
| ICANON
);
192 tcsetattr(fileno(stdin
), TCSADRAIN
, &tmp
);
193 get_password(buff
, sizeof(buff
)-1, fileno(stdin
), isatty(fileno(stdout
)));
194 tcsetattr(fileno(stdin
), TCSADRAIN
, &org
);
195 #elif defined(HAVE_TERMIO_H)
196 ioctl(fileno(stdin
), (int) TCGETA
, &org
);
198 tmp
.c_lflag
&= ~(ECHO
| ISIG
| ICANON
);
201 ioctl(fileno(stdin
),(int) TCSETA
, &tmp
);
202 get_password(buff
,sizeof(buff
)-1,fileno(stdin
),isatty(fileno(stdout
)));
203 ioctl(fileno(stdin
),(int) TCSETA
, &org
);
205 gtty(fileno(stdin
), &org
);
207 tmp
.sg_flags
&= ~ECHO
;
209 stty(fileno(stdin
), &tmp
);
210 get_password(buff
,sizeof(buff
)-1,fileno(stdin
),isatty(fileno(stdout
)));
211 stty(fileno(stdin
), &org
);
213 if (isatty(fileno(stdout
)))
215 #endif /* HAVE_GETPASS */
217 DBUG_RETURN(my_strdup(buff
,MYF(MY_FAE
)));