From: Alexander P. <ale...@us...> - 2008-11-30 17:12:23
|
Build Version : T2.5.0.21496 Firebird 2.5 Alpha 1 (writeBuildNum.sh,v 1.21657 2008/11/30 17:11:47 alexpeshkof ) Update of /cvsroot/firebird/firebird2/src/common In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv30198/src/common Modified Files: StatusArg.cpp StatusArg.h utils.cpp utils_proto.h Log Message: Implemented CORE-1667: Reading password from file/stdin Index: StatusArg.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/common/StatusArg.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -b -U3 -r1.15 -r1.16 --- StatusArg.cpp 23 Nov 2008 21:54:55 -0000 1.15 +++ StatusArg.cpp 30 Nov 2008 17:11:45 -0000 1.16 @@ -35,6 +35,12 @@ #include "fb_exception.h" #include "gen/iberror.h" +#ifdef WIN_NT +#include <windows.h> +#else +#include <errno.h> +#endif + namespace Firebird { namespace Arg { @@ -223,7 +229,12 @@ SqlState::SqlState(const AbstractString& text) throw() : Base(isc_arg_sql_state, (ISC_STATUS)(IPTR) text.c_str()) { } - +OsError::OsError() throw() : +#ifdef WIN_NT + Base(isc_arg_win32, GetLastError()) { } +#else + Base(isc_arg_unix, errno) { } +#endif } // namespace Arg } // namespace Firebird Index: StatusArg.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/common/StatusArg.h,v retrieving revision 1.11 retrieving revision 1.12 diff -b -U3 -r1.11 -r1.12 --- StatusArg.h 23 Nov 2008 14:34:39 -0000 1.11 +++ StatusArg.h 30 Nov 2008 17:11:45 -0000 1.12 @@ -197,6 +197,12 @@ explicit SqlState(const AbstractString& text) throw(); }; +class OsError : public Base +{ +public: + OsError() throw(); +}; + } // namespace Arg } // namespace Firebird Index: utils.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/common/utils.cpp,v retrieving revision 1.48 retrieving revision 1.49 diff -b -U3 -r1.48 -r1.49 --- utils.cpp 21 Oct 2008 06:17:02 -0000 1.48 +++ utils.cpp 30 Nov 2008 17:11:45 -0000 1.49 @@ -36,6 +36,7 @@ #undef __need_size_t #endif #include <stdarg.h> +#include <stdio.h> #include "../jrd/gdsassert.h" #include "../common/utils_proto.h" @@ -683,4 +684,45 @@ pn.recalculate_length(); } +namespace { + class FileClose + { + public: + static void clear(FILE *f) + { + if (f && f != stdin) { + fclose(f); + } + } + }; +} // namespace + +// fetch password from file +FetchPassResult fetchPassword(const Firebird::PathName& name, const char*& password) +{ + Firebird::AutoPtr<FILE, FileClose> file((name == "stdin") ? stdin : fopen(name.c_str(), "rt")); + if (!file) + { + return FETCH_PASS_FILE_OPEN_ERROR; + } + + if (isatty(fileno(file))) + { + fprintf(stderr, "Enter password: "); + fflush(stderr); + } + + Firebird::string pwd; + if (! pwd.LoadFromFile(file)) + { + return ferror(file) ? FETCH_PASS_FILE_READ_ERROR : FETCH_PASS_FILE_EMPTY; + } + + // this is planned leak of a few bytes of memory in utilities + char* pass = FB_NEW(*getDefaultMemoryPool()) char[pwd.length() + 1]; + pwd.copyTo(pass, pwd.length() + 1); + password = pass; + return FETCH_PASS_OK; +} + } // namespace fb_utils Index: utils_proto.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/common/utils_proto.h,v retrieving revision 1.26 retrieving revision 1.27 diff -b -U3 -r1.26 -r1.27 --- utils_proto.h 21 Oct 2008 06:17:02 -0000 1.26 +++ utils_proto.h 30 Nov 2008 17:11:45 -0000 1.27 @@ -106,6 +106,14 @@ status[2] = isc_arg_end; } + enum FetchPassResult { + FETCH_PASS_OK, + FETCH_PASS_FILE_OPEN_ERROR, + FETCH_PASS_FILE_READ_ERROR, + FETCH_PASS_FILE_EMPTY + }; + FetchPassResult fetchPassword(const Firebird::PathName& name, const char*& password); + } // namespace fb_utils #endif // INCLUDE_UTILS_PROTO_H |