Commit b9610106 authored by unknown's avatar unknown

Fix for Bug #1595 "mysqlbinlog can't read a password from the console".

** I already fixed it in 3.23; I fix it in 4.0 separately because the
code is a bit different (so the changeset 1.1422 of 3.23 should not be
merged here) **
Make mysqlbinlog prompt for the password if
mysqlbinlog -p
instead of printing the usage().
This makes mysqlbinlog behave like other clients.
This new code was almost copied from mysqldump.
Note that before, one could use
  mysqlbinlog -p pass
and now one must use
  mysqlbinlog -ppass
(putting a space will ask for the password).


client/mysqlbinlog.cc:
  Make mysqlbinlog prompt for the password if
  mysqlbinlog -p
  instead of printing the usage().
  This makes mysqlbinlog behave like other clients.
  This new code was almost copied from mysqldump.
  Note that before, one could use
    mysqlbinlog -p pass
  and now one must use
    mysqlbinlog -ppass
  (putting a space will ask for the password).
parent d779c048
...@@ -52,7 +52,7 @@ static const char* host = 0; ...@@ -52,7 +52,7 @@ static const char* host = 0;
static int port = MYSQL_PORT; static int port = MYSQL_PORT;
static const char* sock= 0; static const char* sock= 0;
static const char* user = 0; static const char* user = 0;
static const char* pass = ""; static char* pass = 0;
static ulonglong position = 0; static ulonglong position = 0;
static short binlog_flags = 0; static short binlog_flags = 0;
static MYSQL* mysql = NULL; static MYSQL* mysql = NULL;
...@@ -227,7 +227,7 @@ static struct my_option my_long_options[] = ...@@ -227,7 +227,7 @@ static struct my_option my_long_options[] =
{"offset", 'o', "Skip the first N entries.", (gptr*) &offset, (gptr*) &offset, {"offset", 'o', "Skip the first N entries.", (gptr*) &offset, (gptr*) &offset,
0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"password", 'p', "Password to connect to remote server.", {"password", 'p', "Password to connect to remote server.",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
{"port", 'P', "Use port to connect to the remote server.", {"port", 'P', "Use port to connect to the remote server.",
(gptr*) &port, (gptr*) &port, 0, GET_INT, REQUIRED_ARG, MYSQL_PORT, 0, 0, (gptr*) &port, (gptr*) &port, 0, GET_INT, REQUIRED_ARG, MYSQL_PORT, 0, 0,
0, 0, 0}, 0, 0, 0},
...@@ -267,6 +267,11 @@ void sql_print_error(const char *format,...) ...@@ -267,6 +267,11 @@ void sql_print_error(const char *format,...)
va_end(args); va_end(args);
} }
static void cleanup()
{
my_free(pass,MYF(MY_ALLOW_ZERO_PTR));
}
static void die(const char* fmt, ...) static void die(const char* fmt, ...)
{ {
va_list args; va_list args;
...@@ -275,6 +280,7 @@ static void die(const char* fmt, ...) ...@@ -275,6 +280,7 @@ static void die(const char* fmt, ...)
vfprintf(stderr, fmt, args); vfprintf(stderr, fmt, args);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
va_end(args); va_end(args);
cleanup();
exit(1); exit(1);
} }
...@@ -334,6 +340,7 @@ extern "C" my_bool ...@@ -334,6 +340,7 @@ extern "C" my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)), get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
char *argument) char *argument)
{ {
bool tty_password=0;
switch (optid) { switch (optid) {
#ifndef DBUG_OFF #ifndef DBUG_OFF
case '#': case '#':
...@@ -344,7 +351,17 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -344,7 +351,17 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
one_database = 1; one_database = 1;
break; break;
case 'p': case 'p':
pass = my_strdup(argument, MYF(0)); if (argument)
{
my_free(pass,MYF(MY_ALLOW_ZERO_PTR));
char *start=argument;
pass= my_strdup(argument,MYF(MY_FAE));
while (*argument) *argument++= 'x'; /* Destroy argument */
if (*start)
start[1]=0; /* Cut length of argument */
}
else
tty_password=1;
break; break;
case 'r': case 'r':
if (!(result_file = my_fopen(argument, O_WRONLY | O_BINARY, MYF(MY_WME)))) if (!(result_file = my_fopen(argument, O_WRONLY | O_BINARY, MYF(MY_WME))))
...@@ -360,6 +377,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -360,6 +377,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
usage(); usage();
exit(0); exit(0);
} }
if (tty_password)
pass= get_tty_password(NullS);
return 0; return 0;
} }
...@@ -778,6 +798,7 @@ int main(int argc, char** argv) ...@@ -778,6 +798,7 @@ int main(int argc, char** argv)
my_fclose(result_file, MYF(0)); my_fclose(result_file, MYF(0));
if (remote_opt) if (remote_opt)
mysql_close(mysql); mysql_close(mysql);
cleanup();
free_defaults(defaults_argv); free_defaults(defaults_argv);
my_end(0); my_end(0);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment