diff --git a/CMakeLists.txt b/CMakeLists.txt index 3be9948f..20c92b40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,11 +179,11 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/include/my_config.h.in INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include) ADD_SUBDIRECTORY(include) -ADD_SUBDIRECTORY(plugins) ADD_SUBDIRECTORY(libmariadb) IF(NOT WIN32) ADD_SUBDIRECTORY(mariadb_config) ENDIF() +ADD_SUBDIRECTORY(plugins) IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/unittest) ADD_SUBDIRECTORY(unittest/mytap) diff --git a/libmariadb/CMakeLists.txt b/libmariadb/CMakeLists.txt index fd7a545a..6a9fc030 100644 --- a/libmariadb/CMakeLists.txt +++ b/libmariadb/CMakeLists.txt @@ -35,7 +35,6 @@ my_vsnprintf.c errors.c getopt1.c getopt.c -get_password.c int2str.c is_prefix.c libmariadb.c diff --git a/libmariadb/get_password.c b/libmariadb/get_password.c index 783a730c..a00387a3 100644 --- a/libmariadb/get_password.c +++ b/libmariadb/get_password.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +/************************************************************************************ + Copyright (C) 2014 MariaDB Corporation AB This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -11,64 +12,94 @@ Library General Public License for more details. You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA */ - -/* -** Ask for a password from tty -** This is an own file to avoid conflicts with curses -*/ + License along with this library; if not see + or write to the Free Software Foundation, Inc., + 51 Franklin St., Fifth Floor, Boston, MA 02110, USA +*************************************************************************************/ #include #include #include "mysql.h" #include #include -#include +#include +#include -#if defined(HAVE_BROKEN_GETPASS) && !defined(HAVE_GETPASSPHRASE) -#undef HAVE_GETPASS -#endif - -#ifdef HAVE_GETPASS -#ifdef HAVE_PWD_H -#include -#endif /* HAVE_PWD_H */ -#else /* ! HAVE_GETPASS */ -#if !defined( _WIN32) && !defined(OS2) -#include -#ifdef HAVE_TERMIOS_H /* For tty-password */ -#include -#define TERMIO struct termios -#else -#ifdef HAVE_TERMIO_H /* For tty-password */ -#include -#define TERMIO struct termio -#else -#include -#define TERMIO struct sgttyb -#endif -#endif -#ifdef alpha_linux_port -#include /* QQ; Fix this in configure */ -#include -#endif +#ifndef _WIN32 +#include #else #include #endif /* _WIN32 */ -#endif /* HAVE_GETPASS */ -#ifdef HAVE_GETPASSPHRASE /* For Solaris */ - #define getpass(A) getpassphrase(A) +/* {{{ static char *get_password() */ +/* + read password from device + + SYNOPSIS + get_password + Hdl/file file handle + buffer input buffer + length buffer length + + RETURN + buffer zero terminated input buffer +*/ +#ifdef _WIN32 +static char *get_password(HANDLE Hdl, char *buffer, DWORD length) +#else +static char *get_password(FILE *file, char *buffer, int length) +#endif +{ + char inChar; + int CharsProcessed= 1; + int Offset= 0; + + memset(buffer, 0, length); + + do + { +#ifdef _WIN32 + if (!ReadConsole(Hdl, &inChar, 1, &CharsProcessed, NULL) || + !CharsProcessed) + break; +#else + inChar= fgetc(file); #endif -#if defined( _WIN32) || defined(OS2) -/* {{{ statuc char* get_password */ + switch(inChar) { + case '\b': /* backslash */ + if (Offset) + { + /* cursor is always at the end */ + Offset--; + buffer[Offset]= 0; +#ifdef _WIN32 + _cputs("\b \b"); +#endif + } + break; + case '\n': + case '\r': + break; + default: + buffer[Offset]= inChar; + if (Offset < length - 2) + Offset++; +#ifdef _WIN32 + _cputs("*"); +#endif + break; + } + } while (CharsProcessed && inChar != '\n' && inChar != '\r'); + return buffer; +} +/* }}} */ + +/* {{{ static char* get_tty_password */ /* reads password from tty/console SYNOPSIS - get_password() + get_tty_password() buffer input buffer length length of input buffer @@ -88,7 +119,8 @@ char* get_tty_password(char *prompt, char *buffer, int length) DWORD CharsProcessed= 0; char inChar; - ZeroMemory(buffer, length); + if (prompt) + fprintf(stderr, "%s", prompt); if (!(Hdl= CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE, @@ -104,147 +136,37 @@ char* get_tty_password(char *prompt, char *buffer, int length) GetConsoleMode(Hdl, &SaveState); SetConsoleMode(Hdl, ENABLE_PROCESSED_INPUT); - do - { - if (!ReadConsole(Hdl, &inChar, 1, &CharsProcessed, NULL) || - !CharsProcessed) - break; - - switch(inChar) { - case '\b': /* backslash */ - if (Offset) - { - /* cursor is always at the end */ - Offset--; - buffer[Offset]= 0; - _cputs("\b \b"); - } - break; - case '\n': - case '\r': - break; - default: - buffer[Offset]= inChar; - if (Offset < length - 2) - Offset++; - _cputs("*"); - break; - } - } while (CharsProcessed && inChar != '\n' && inChar != '\r'); + buffer= get_password(Hdl, buffer, length); SetConsoleMode(Hdl, SaveState); CloseHandle(Hdl); return buffer; - #else + struct termios term_old, + term_new; + FILE *readfrom; + + if (prompt && isatty(fileno(stderr))) + fputs(prompt, stderr); + + if (!(readfrom= fopen("/dev/tty", "r"))) + readfrom= stdin; + + /* try to disable echo */ + tcgetattr(fileno(readfrom), &term_old); + term_new= term_old; + term_new.c_cc[VMIN] = 1; + term_new.c_cc[VTIME]= 0; + term_new.c_lflag&= ~(ECHO | ISIG | ICANON | ECHONL); + tcsetattr(fileno(readfrom), TCSADRAIN, &term_new); + + buffer= get_password(readfrom, buffer, length); + + if (isatty(fileno(readfrom))) + tcsetattr(fileno(readfrom), TCSADRAIN, &term_old); + + fclose(readfrom); + + return buffer; #endif } /* }}} */ -#else - - -#ifndef HAVE_GETPASS -/* -** Can't use fgets, because readline will get confused -** length is max number of chars in to, not counting \0 -* to will not include the eol characters. -*/ - -static void get_password(char *to,uint length,int fd,bool echo) -{ - char *pos=to,*end=to+length; - - for (;;) - { - char tmp; - if (my_read(fd,&tmp,1,MYF(0)) != 1) - break; - if (tmp == '\b' || (int) tmp == 127) - { - if (pos != to) - { - if (echo) - { - fputs("\b \b",stdout); - fflush(stdout); - } - pos--; - continue; - } - } - if (tmp == '\n' || tmp == '\r' || tmp == 3) - break; - if (iscntrl(tmp) || pos == end) - continue; - if (echo) - { - fputc('*',stdout); - fflush(stdout); - } - *(pos++) = tmp; - } - while (pos != to && isspace(pos[-1]) == ' ') - pos--; /* Allow dummy space at end */ - *pos=0; - return; -} -#endif /* ! HAVE_GETPASS */ - - -char *get_tty_password(char *opt_message, char *buff, int bufflen) -{ -#ifdef HAVE_GETPASS - char *passbuff; -#else /* ! HAVE_GETPASS */ - TERMIO org,tmp; -#endif /* HAVE_GETPASS */ - - DBUG_ENTER("get_tty_password"); - -#ifdef HAVE_GETPASS - passbuff = getpass(opt_message ? opt_message : "Enter password: "); - - /* copy the password to buff and clear original (static) buffer */ - strnmov(buff, passbuff, bufflen - 1); -#ifdef _PASSWORD_LEN - memset(passbuff, 0, _PASSWORD_LEN); -#endif -#else - if (isatty(fileno(stdout))) - { - fputs(opt_message ? opt_message : "Enter password: ",stdout); - fflush(stdout); - } -#if defined(HAVE_TERMIOS_H) - tcgetattr(fileno(stdin), &org); - tmp = org; - tmp.c_lflag &= ~(ECHO | ISIG | ICANON); - tmp.c_cc[VMIN] = 1; - tmp.c_cc[VTIME] = 0; - tcsetattr(fileno(stdin), TCSADRAIN, &tmp); - get_password(buff, bufflen-1, fileno(stdin), isatty(fileno(stdout))); - tcsetattr(fileno(stdin), TCSADRAIN, &org); -#elif defined(HAVE_TERMIO_H) - ioctl(fileno(stdin), (int) TCGETA, &org); - tmp=org; - tmp.c_lflag &= ~(ECHO | ISIG | ICANON); - tmp.c_cc[VMIN] = 1; - tmp.c_cc[VTIME]= 0; - ioctl(fileno(stdin),(int) TCSETA, &tmp); - get_password(buff,bufflen-1,fileno(stdin),isatty(fileno(stdout))); - ioctl(fileno(stdin),(int) TCSETA, &org); -#else - gtty(fileno(stdin), &org); - tmp=org; - tmp.sg_flags &= ~ECHO; - tmp.sg_flags |= RAW; - stty(fileno(stdin), &tmp); - get_password(buff,bufflen-1,fileno(stdin),isatty(fileno(stdout))); - stty(fileno(stdin), &org); -#endif - if (isatty(fileno(stdout))) - fputc('\n',stdout); -#endif /* HAVE_GETPASS */ - - DBUG_RETURN(buff); -} -#endif /*_WIN32*/