diff --git a/client/mysql_plugin.c b/client/mysql_plugin.c index dd41693161d..6679fa9ca6f 100644 --- a/client/mysql_plugin.c +++ b/client/mysql_plugin.c @@ -35,7 +35,8 @@ static uint opt_verbose=0; static uint opt_no_defaults= 0; static uint opt_print_defaults= 0; static char *opt_datadir=0, *opt_basedir=0, - *opt_plugin_dir=0, *opt_plugin_ini=0; + *opt_plugin_dir=0, *opt_plugin_ini=0, + *opt_mysqld=0, *opt_my_print_defaults=0; static char bootstrap[FN_REFLEN]; @@ -66,6 +67,11 @@ static struct my_option my_long_options[] = 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"print-defaults", 'P', "Show default values from configuration file.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"mysqld", 'm', "Path to mysqld executable. Example: /sbin/temp1/mysql/bin", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"my-print-defaults", 'f', "Path to my_print_defaults executable. " + "Example: /source/temp11/extra", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"verbose", 'v', "More verbose output; you can use this multiple times to get even more " "verbose output.", @@ -317,6 +323,7 @@ static int get_default_values() int ret= 0; FILE *file= 0; + bzero(tool_path, FN_REFLEN); if ((error= find_tool("my_print_defaults" FN_EXEEXT, tool_path))) goto exit; else @@ -335,6 +342,10 @@ static int get_default_values() snprintf(defaults_cmd, sizeof(defaults_cmd), format_str, add_quotes(tool_path), add_quotes(defaults_file)); + if (opt_verbose) + { + printf("# my_print_defaults found: %s\n", tool_path); + } } #else snprintf(defaults_cmd, sizeof(defaults_cmd), @@ -438,6 +449,14 @@ static void print_default_values(void) { printf("--plugin_ini=%s ", opt_plugin_ini); } + if (opt_mysqld) + { + printf("--mysqld=%s ", opt_mysqld); + } + if (opt_my_print_defaults) + { + printf("--my_print_defaults=%s ", opt_my_print_defaults); + } printf("\n"); } @@ -486,6 +505,12 @@ get_one_option(int optid, case 'i': opt_plugin_ini= my_strdup(argument, MYF(MY_FAE)); break; + case 'm': + opt_mysqld= my_strdup(argument, MYF(MY_FAE)); + break; + case 'f': + opt_my_print_defaults= my_strdup(argument, MYF(MY_FAE)); + break; } return 0; } @@ -526,10 +551,11 @@ static int search_dir(const char * base_path, const char *tool_name, const char *subdir, char *tool_path) { char new_path[FN_REFLEN]; + char source_path[FN_REFLEN]; - strcpy(new_path, base_path); - strcat(new_path, subdir); - fn_format(new_path, new_path, "", tool_name, MY_UNPACK_FILENAME); + strcpy(source_path, base_path); + strcat(source_path, subdir); + fn_format(new_path, tool_name, source_path, "", MY_UNPACK_FILENAME); if (file_exists(new_path)) { strcpy(tool_path, new_path); @@ -634,10 +660,10 @@ static int load_plugin_data(char *plugin_name, char *config_file) } if (i == -1) // if first pass, read this line as so_name { - /* save so_name */ - plugin_data.so_name= my_strdup(line, MYF(MY_WME)); /* Add proper file extension for soname */ - strcat((char *)plugin_data.so_name, FN_SOEXT); + strcat(line, FN_SOEXT); + /* save so_name */ + plugin_data.so_name= my_strdup(line, MYF(MY_WME|MY_ZEROFILL)); i++; } else @@ -902,6 +928,18 @@ static int check_access() opt_plugin_ini); goto exit; } + if ((error= my_access(opt_mysqld, F_OK))) + { + fprintf(stderr, "ERROR: Cannot access mysqld path '%s'.\n", + opt_mysqld); + goto exit; + } + if ((error= my_access(opt_my_print_defaults, F_OK))) + { + fprintf(stderr, "ERROR: Cannot access my-print-defaults path '%s'.\n", + opt_my_print_defaults); + goto exit; + } exit: return error; @@ -922,9 +960,9 @@ static int find_tool(const char *tool_name, char *tool_path) int i= 0; const char *paths[]= { - opt_basedir, "/usr", "/usr/local/mysql", "/usr/sbin", "/usr/share", - "/extra", "/extra/debug", "/extra/release", "/bin", "/usr/bin", - "/mysql/bin" + opt_basedir, opt_mysqld, opt_my_print_defaults, "/usr", + "/usr/local/mysql", "/usr/sbin", "/usr/share", "/extra", "/extra/debug", + "/extra/release", "/bin", "/usr/bin", "/mysql/bin" }; for (i= 0; i < (int)array_elements(paths); i++) { diff --git a/mysql-test/r/mysql_plugin.result b/mysql-test/r/mysql_plugin.result index 1a39c86ab9a..949f3748236 100644 --- a/mysql-test/r/mysql_plugin.result +++ b/mysql-test/r/mysql_plugin.result @@ -49,6 +49,14 @@ ERROR: Cannot access basedir at '/basedir_not_there/'. # ERROR: Cannot read plugin config file daemon_example. File does not exist. # +# Attempt to use bad paths - mysqld +# +ERROR: Cannot access mysqld path '/mysqld_not_there/'. +# +# Attempt to use bad paths - my_print_defaults +# +ERROR: Cannot access my-print-defaults path '/my_print_defaults_not_there/'. +# # Missing library # ERROR: The plugin library is missing or in a different location. @@ -90,6 +98,10 @@ Options: -n, --no-defaults Do not read values from configuration file. -P, --print-defaults Show default values from configuration file. + -m, --mysqld=name Path to mysqld executable. Example: /sbin/temp1/mysql/bin + -f, --my-print-defaults=name + Path to my_print_defaults executable. Example: + /source/temp11/extra -v, --verbose More verbose output; you can use this multiple times to get even more verbose output. -V, --version Output version information and exit. diff --git a/mysql-test/t/mysql_plugin.test b/mysql-test/t/mysql_plugin.test index b90619774df..cad89d9de7a 100644 --- a/mysql-test/t/mysql_plugin.test +++ b/mysql-test/t/mysql_plugin.test @@ -1,35 +1,107 @@ # # Test mysql_plugin tool # +# This test contains test cases for testing the mysql_plugin client with +# the daemon_example plugin. Test cases include tests for: +# +# - successful enable/disable +# - incorrect paths +# - missing paths/options +# +# Implementation Notes +# +# The mysql_plugin tool now accepts --mysqld the path to mysqld server. The +# mysqld path is extracted from MYSQLD_BOOTSTRAP_CMD line. We also extract +# the path of MYSQLD_BASEDIR (where mysql exists) and use it for the errmsg +# file. The directories differ between Windows and Unix but the Perl script +# included below will pick as per platform. +# +# The test is also designed to issue the --skip directive if the location of +# the mysqld, my_print_defaults, or daemon_example.ini files cannot be found. +# --source include/not_embedded.inc # Add the datadir, basedir, plugin_dir to the bootstrap command let $MYSQLD_DATADIR= `select @@datadir`; let $MYSQL_BASEDIR= `select @@basedir`; +let $MYSQL_ERRMSG_BASEDIR=`select @@lc_messages_dir`; +let $PLUGIN_DIR=`select @@plugin_dir`; -# The mysql_plugin tool expects all executables in "basedir", so they will be copied to it. -# It also expects a directory structure like in the installed mysql version, so errmsg.sys -# will be copied to "basedir/share". The directories differ between Windows and Unix. --disable_abort_on_error -if(`SELECT CONVERT(@@version_compile_os USING latin1) - IN ('Win32','Win64','Windows')`) + +# Perl script to extract the location of the basedir from environment +# variables. This is needed to ensure the test will run on the PB machines +# designed to test release as well as debug builds. It also checks for the +# location of the my_print_defaults and daemon_example.ini files. + +perl; +use File::Basename; + my ($mysqld)= split " ", $ENV{MYSQLD_BOOTSTRAP_CMD}; + my $mysqld_basedir=dirname($mysqld); + my $my_print_defaults= $ENV{MYSQL_MY_PRINT_DEFAULTS}; + my $my_print_defaults_basedir=dirname($my_print_defaults); + my $daemonexample_ini= "$ENV{DAEMONEXAMPLE_DIR}/daemon_example.ini"; + my $plugindir_ini= "$ENV{PLUGIN_DIR}/daemon_example.ini"; + my $notfound= ""; + open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/mysqld.inc") or die; + print FILE "let \$MYSQLD= $mysqld;\n"; + print FILE "let \$MYSQLD_BASEDIR= $mysqld_basedir;\n"; + print FILE "let \$MYSQL_MY_PRINT_DEFAULTS_BASEDIR= $my_print_defaults_basedir;\n"; + if ((!-e $daemonexample_ini) || (!-r $daemonexample_ini)) + { + print FILE "let \$DAEMONEXAMPLE_DIR= $not_found;\n"; + } + if ((!-e $plugindir_ini) || (!-r $plugindir_ini)) + { + print FILE "let \$PLUGIN_DIR= $not_found;\n"; + } + close FILE; +EOF + + +source $MYSQL_TMP_DIR/mysqld.inc; +remove_file $MYSQL_TMP_DIR/mysqld.inc; + +# The mysql_plugin tool expects a directory structure like in the installed +# mysql version, so errmsg.sys will be copied to "basedir/share", we create +# and remove this structure. + +--mkdir $MYSQLD_BASEDIR/share +--mkdir $MYSQLD_BASEDIR/share/mysql +--copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/errmsg.sys +--copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/mysql/errmsg.sys + +# The mysql_plugin tool now accepts --my-print-defaults which points to the +# executable my_print_defaults.exe we can get this path from the variable +# $MYSQL_MY_PRINT_DEFAULTS. + +# Check for my_print_defaults location. Skip if not found. +if ($MYSQL_MY_PRINT_DEFAULTS_BASEDIR == '') { - let $MYSQLD_BASEDIR= $MYSQL_BASEDIR/sql/Debug; - --copy_file $MYSQL_BASEDIR/extra/Debug/my_print_defaults.exe $MYSQLD_BASEDIR/my_print_defaults.exe - --mkdir $MYSQLD_BASEDIR/share - --copy_file $MYSQL_BASEDIR/sql/share/english/errmsg.sys $MYSQLD_BASEDIR/share/errmsg.sys - --copy_file $MYSQL_BASEDIR/plugin/daemon_example/daemon_example.ini $DAEMONEXAMPLE_DIR/daemon_example.ini -} -if (`SELECT CONVERT(@@version_compile_os USING latin1) - NOT IN ('Win32','Win64','Windows')`) -{ - let $MYSQLD_BASEDIR= $MYSQL_BASEDIR/sql; - --copy_file $MYSQL_BASEDIR/extra/my_print_defaults $MYSQLD_BASEDIR/my_print_defaults - --copy_file $MYSQL_BASEDIR/sql/share/english/errmsg.sys $MYSQLD_BASEDIR/share/errmsg.sys + --skip Test requires known location of my_print_defaults executable. } -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=$DAEMONEXAMPLE_DIR; +# Check for mysqld location. Skip if not found. +if ($MYSQLD == '') +{ + --skip Test requires known location of mysqld executable. +} + +# Check for daemon_example.ini location. Skip if not found in either +# the plugin_dir path or the daemon_example_dir path. +if ($PLUGIN_DIR == '') +{ + if ($DAEMONEXAMPLE_DIR == '') + { + --skip Test requires known location of daemon_example.ini file. + } + let $PLUGIN_DIR = $DAEMONEXAMPLE_DIR; +} + +# Build client command for reuse. + +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --echo # --echo # Ensure the plugin isn't loaded. @@ -52,11 +124,11 @@ EOF # # Enable the plugin # ---exec $MYSQLD_BOOTSTRAP_CMD ENABLE daemon_example +--exec $MYSQL_PLUGIN_CMD ENABLE daemon_example # # Ensure enabling an enabled plugin doesn't fail ---exec $MYSQLD_BOOTSTRAP_CMD ENABLE daemon_example +--exec $MYSQL_PLUGIN_CMD ENABLE daemon_example # # Restart the server @@ -88,7 +160,7 @@ EOF # # Disable the plugin # ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example # # Restart the server @@ -121,81 +193,96 @@ EOF --echo # Attempt to load non-existant plugin --echo # --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE NOT_THERE_AT_ALL 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE NOT_THERE_AT_ALL 2>&1 --echo # --echo # Attempt to use non-existant plugin.ini file --echo # --error 1,2,7,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example --plugin-ini=/NOT/THERE/pi.ini 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example --plugin-ini=/NOT/THERE/pi.ini 2>&1 --echo # --echo # Attempt to omit the plugin --echo # --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE 2>&1 --echo # --echo # Attempt to omit DISABLE|ENABLE --echo # --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - datadir --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=/data_not_there/ --basedir=$MYSQLD_BASEDIR --plugin-dir=$DAEMONEXAMPLE_DIR; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=/data_not_there/ --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - basedir --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=/basedir_not_there/ --plugin-dir=$DAEMONEXAMPLE_DIR; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=/basedir_not_there/ --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - plugin_dir --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=/plugin_not_there/; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=/plugin_not_there/ --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 + +--echo # +--echo # Attempt to use bad paths - mysqld +--echo # +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=/mysqld_not_there/ --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; +--error 1,2,256 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 + +--echo # +--echo # Attempt to use bad paths - my_print_defaults +--echo # +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD --my-print-defaults=/my_print_defaults_not_there/; +--error 1,2,256 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 + --echo # --echo # Missing library --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=$DAEMONEXAMPLE_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_soname.ini; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_soname.ini --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Bad format for config file --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=$DAEMONEXAMPLE_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_format.ini; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_format.ini --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Missing base_dir option --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --plugin-dir=$DAEMONEXAMPLE_DIR; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,139,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Missing data_dir option --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --basedir=$MYSQLD_BASEDIR --plugin-dir=$DAEMONEXAMPLE_DIR; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,139,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Missing plugin_dir option --echo # -let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR; +let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQL_DATADIR --basedir=$MYSQL_BASEDIR --mysqld=$MYSQLD --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,139,256 ---exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1 +--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Show the help. @@ -223,18 +310,9 @@ EOF --error 0,1 --remove_file $expect_file -if(`SELECT CONVERT(@@version_compile_os USING latin1) - IN ('Win32','Win64','Windows')`) -{ - --remove_file $DAEMONEXAMPLE_DIR/daemon_example.ini - --remove_file $MYSQLD_BASEDIR/my_print_defaults.exe - --remove_file $MYSQLD_BASEDIR/share/errmsg.sys - --rmdir $MYSQLD_BASEDIR/share -} -if(`SELECT CONVERT(@@version_compile_os USING latin1) - NOT IN ('Win32','Win64','Windows')`) -{ - --remove_file $MYSQLD_BASEDIR/my_print_defaults - --remove_file $MYSQLD_BASEDIR/share/errmsg.sys -} +# Cleanup the share folder in the binary path. +--remove_file $MYSQLD_BASEDIR/share/errmsg.sys +--rmdir $MYSQLD_BASEDIR/share/mysql +--rmdir $MYSQLD_BASEDIR/share + --enable_abort_on_error