From 07aab86f5f1e25d25b1df2f43264048da86b509e Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Dec 2007 19:51:06 +0100 Subject: [PATCH 1/9] scripts/make_binary_distribution.sh: Fix the code to get the "libgcc" file name so that the failure of Intel's ICC to provide this information does not cause any problems. This fixes bug#33536 Option "--print-libgcc-file" does not work with ICC compiler scripts/make_binary_distribution.sh: The (old) code to get the "libgcc" file name does not really work when using Intel's ICC. ICC accepts the "--print-libgcc-file" option but ignores it, does not produce any output. However, ICC tricks automake into taking it for a GCC ("GXX" variable is set, see http://www.gnu.org/software/autoconf/manual/html_node/C_002b_002b-Compiler.html#C_002b_002b-Compiler and its discussion of the "AC_PROG_CXX" macro). There are two possible approaches: a) Check "$CC" or "$CXX" to tell ICC from GCC, and do not ask ICC for the "libgcc" file name. b) Just ask it, but protect that code so that its failure does not cause any damage. This patch takes the second route: 1) Put the call "@CC@ ... --print-libgcc-file" into a pipeline, followed by "|| true", so that (for the shell semantics) the command cannot fail. (ICC will exit non-zero because it is not given a source file.) 2) Explicitly redirect any error messages. 3) Do not use the compiler's return code but rather the (non)empty variable to check success. 4) Ensure that the contents really is a file before taking it as a file name. Item 1) is especially important when the tool gets a "set -e" (this happens in 5.1, currently) which would make the failing compiler call a fatal thing. This fixes bug#33536 Option "--print-libgcc-file" does not work with ICC compiler --- scripts/make_binary_distribution.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index 917ac0a19c1..24a99df2248 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -322,11 +322,13 @@ BASE=$BASE2 # if [ x"@GXX@" = x"yes" ] ; then - gcclib=`@CC@ @CFLAGS@ --print-libgcc-file` - if [ $? -ne 0 ] ; then - echo "Warning: Couldn't find libgcc.a!" - else + gcclib=`@CC@ @CFLAGS@ --print-libgcc-file 2>/dev/null` || true + if [ -z "$gcclib" ] ; then + echo "Warning: Compiler doesn't tell libgcc.a!" + elif [ -f "$gcclib" ] ; then $CP $gcclib $BASE/lib/libmygcc.a + else + echo "Warning: Compiler result '$gcclib' not found / no file!" fi fi From 471437fd47bc10ce89b290c46ffcbb260aaa12f4 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 28 Dec 2007 01:02:28 +0100 Subject: [PATCH 2/9] make_win_bin_dist CMakeLists.txt resolveip.c Makefile.am: Better Windows support in the scripts directory mysql_config.pl.in, mysql_install_db.pl.in: New Perl version of Unix shell script, mainly for Windows Many files in scripts directory: Use default Perl location "#!/usr/bin/perl" instead of the build host path extra/CMakeLists.txt: Added target for executable "resolveip" extra/resolveip.c: Exclude Unix specific headers when compiling on Windows scripts/CMakeLists.txt: On Windows, filter Perl scripts and change name from ".sh" to ".pl" mysql_convert_table_format.sh mysql_explain_log.sh mysql_secure_installation.sh mysql_tableinfo.sh mysqld_multi.sh mysqldumpslow.sh mysqlhotcopy.sh Do the same for the new Windows specific Perl versions of shell scripts mysql_config.pl.in mysql_install_db.pl.in In CMake, set reasonable values for 'CFLAGS', 'prefix', 'datadir' and so on. scripts/Makefile.am: Include "mysql_config.pl.in" and "mysql_install_db.pl.in" in the source TAR scripts/make_win_bin_dist: Only include explicitly listed scripts from the "scripts" directory scripts/mysql_convert_table_format.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysql_explain_log.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysql_tableinfo.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysqld_multi.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysqldumpslow.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysqlhotcopy.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysql_config.pl.in: New Perl version of Unix shell script, mainly for Windows scripts/mysql_install_db.pl.in: New Perl version of Unix shell script, mainly for Windows --- extra/CMakeLists.txt | 3 + extra/resolveip.c | 14 +- scripts/CMakeLists.txt | 41 ++ scripts/Makefile.am | 2 + scripts/make_win_bin_dist | 35 +- scripts/mysql_config.pl.in | 285 ++++++++++++ scripts/mysql_convert_table_format.sh | 2 +- scripts/mysql_explain_log.sh | 2 +- scripts/mysql_install_db.pl.in | 612 ++++++++++++++++++++++++++ scripts/mysql_tableinfo.sh | 2 +- scripts/mysqld_multi.sh | 2 +- scripts/mysqldumpslow.sh | 2 +- scripts/mysqlhotcopy.sh | 2 +- 13 files changed, 974 insertions(+), 30 deletions(-) create mode 100644 scripts/mysql_config.pl.in create mode 100644 scripts/mysql_install_db.pl.in diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt index a909bc93820..c1477e41a81 100755 --- a/extra/CMakeLists.txt +++ b/extra/CMakeLists.txt @@ -44,6 +44,9 @@ TARGET_LINK_LIBRARIES(my_print_defaults strings mysys debug dbug taocrypt wsock3 ADD_EXECUTABLE(perror perror.c) TARGET_LINK_LIBRARIES(perror strings mysys debug dbug wsock32) +ADD_EXECUTABLE(resolveip resolveip.c) +TARGET_LINK_LIBRARIES(resolveip strings mysys debug dbug wsock32) + ADD_EXECUTABLE(replace replace.c) TARGET_LINK_LIBRARIES(replace strings mysys debug dbug wsock32) diff --git a/extra/resolveip.c b/extra/resolveip.c index 1061cafe380..b48a782c9c9 100644 --- a/extra/resolveip.c +++ b/extra/resolveip.c @@ -21,13 +21,15 @@ #include #include #include -#include -#include -#ifndef HAVE_BROKEN_NETINET_INCLUDES -#include +#ifndef WIN32 +# include +# include +# ifndef HAVE_BROKEN_NETINET_INCLUDES +# include +# endif +# include +# include #endif -#include -#include #include #include diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 6fbfcab72d4..8d369a6ab22 100755 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -40,3 +40,44 @@ ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/scripts/mysql_fix_privilege_tabl ADD_CUSTOM_TARGET(GenFixPrivs ALL DEPENDS ${PROJECT_SOURCE_DIR}/scripts/mysql_fix_privilege_tables_sql.c) + +# ---------------------------------------------------------------------- +# Replace some variables @foo@ in the .in/.sh file, and write the new script +# ---------------------------------------------------------------------- + +SET(CFLAGS "-D_WINDOWS ${CMAKE_C_FLAGS_RELWITHDEBINFO}") +SET(prefix "${CMAKE_INSTALL_PREFIX}/MySQL Server ${MYSQL_BASE_VERSION}") +SET(sysconfdir ${prefix}) +SET(bindir ${prefix}/bin) +SET(libexecdir ${prefix}/bin) +SET(scriptdir ${prefix}/bin) +SET(datadir ${prefix}/share) +SET(pkgdatadir ${prefix}/share) +SET(localstatedir ${prefix}/data) + +CONFIGURE_FILE(mysql_config.pl.in + scripts/mysql_config.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysql_convert_table_format.sh + scripts/mysql_convert_table_format.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysql_explain_log.sh + scripts/mysql_explain_log.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysql_install_db.pl.in + scripts/mysql_install_db.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysql_secure_installation.sh + scripts/mysql_secure_installation.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysql_tableinfo.sh + scripts/mysql_tableinfo.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysqld_multi.sh + scripts/mysqld_multi.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysqldumpslow.sh + scripts/mysqldumpslow.pl ESCAPE_QUOTES @ONLY) + +CONFIGURE_FILE(mysqlhotcopy.sh + scripts/mysqlhotcopy.pl ESCAPE_QUOTES @ONLY) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 5db5fdd550f..769c0f5fdba 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -48,9 +48,11 @@ EXTRA_SCRIPTS = make_binary_distribution.sh \ make_win_src_distribution_old.sh \ msql2mysql.sh \ mysql_config.sh \ + mysql_config.pl.in \ mysql_fix_privilege_tables.sh \ mysql_fix_extensions.sh \ mysql_install_db.sh \ + mysql_install_db.pl.in \ mysql_setpermission.sh \ mysql_secure_installation.sh \ mysql_zap.sh \ diff --git a/scripts/make_win_bin_dist b/scripts/make_win_bin_dist index d065e171bb0..b9a0842473b 100755 --- a/scripts/make_win_bin_dist +++ b/scripts/make_win_bin_dist @@ -327,27 +327,26 @@ if [ -d mysql-test/extra ] ; then fi # ---------------------------------------------------------------------- -# Copy what could be usable in the "scripts" directory. Currently -# only SQL files, others are Bourne shell scripts or Perl scripts -# not really usable on Windows. -# -# But to be nice to the few Cygwin users we might have in 5.0 we -# continue to copy the stuff, but don't include it in the WiX install. +# Copy what could be usable in the "scripts" directory # ---------------------------------------------------------------------- +mysql_scripts="\ +mysql_config.pl \ +mysql_convert_table_format.pl \ +mysql_explain_log.pl \ +mysql_install_db.pl \ +mysql_secure_installation.pl \ +mysql_tableinfo.pl \ +mysqld_multi.pl \ +mysqldumpslow.pl \ +mysqlhotcopy.pl \ +" + mkdir -p $DESTDIR/scripts -# Uncomment and remove the for loop in 5.1 -#cp scripts/*.sql $DESTDIR/scripts/ - -for i in `cd scripts && ls`; do \ - if echo $i | grep -q '\.sh'; then \ - cp scripts/$i $DESTDIR/scripts/`echo $i | sed -e 's/\.sh$//'`; \ - elif [ -d scripts/$i -o $i = Makefile.am -o $i = Makefile.in -o -e scripts/$i.sh ] ; then \ - : ; \ - else \ - cp scripts/$i $DESTDIR/scripts/$i; \ - fi; \ +for i in $mysql_scripts +do + cp scripts/$i $DESTDIR/scripts/$i done cp -pR sql/share $DESTDIR/ @@ -355,7 +354,7 @@ cp -pR sql-bench $DESTDIR/ rm -f $DESTDIR/sql-bench/*.sh $DESTDIR/sql-bench/Makefile* # The SQL initialisation code is really expected to be in "share" -mv $DESTDIR/scripts/*.sql $DESTDIR/share/ || true +mv $DESTDIR/scripts/*.sql $DESTDIR/share/ # ---------------------------------------------------------------------- # Clean up from possibly copied SCCS directories diff --git a/scripts/mysql_config.pl.in b/scripts/mysql_config.pl.in new file mode 100644 index 00000000000..3ae8baf7db0 --- /dev/null +++ b/scripts/mysql_config.pl.in @@ -0,0 +1,285 @@ +#!/usr/bin/perl +# -*- cperl -*- +# +# Copyright (C) 2007 MySQL AB +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +############################################################################## +# +# This script reports various configuration settings that may be needed +# when using the MySQL client library. +# +# This script try to match the shell script version as close as possible, +# but in addition being compatible with ActiveState Perl on Windows. +# +# All unrecognized arguments to this script are passed to mysqld. +# +# NOTE: This script will only be used on Windows until solved how to +# handle @LIBS@ and other strings inserted that might contain +# several arguments, possibly with spaces in them. +# +# NOTE: This script was deliberately written to be as close to the shell +# script as possible, to make the maintenance of both in parallel +# easier. +# +############################################################################## + +use File::Basename; +use Getopt::Long; +use Cwd; +use strict; + +my @exclude_cflags = + qw/DDBUG_OFF DSAFEMALLOC USAFEMALLOC DSAFE_MUTEX + DPEDANTIC_SAFEMALLOC DUNIV_MUST_NOT_INLINE DFORCE_INIT_OF_VARS + DEXTRA_DEBUG DHAVE_purify O O[0-9] xO[0-9] W[-A-Za-z]* + Xa xstrconst xc99=none + unroll2 ip mp restrict/; + +my @exclude_libs = qw/lmtmalloc static-libcxa i-static static-intel/; + +my $cwd = cwd(); +my $basedir; + +my $socket = '@MYSQL_UNIX_ADDR@'; +my $version = '@VERSION@'; + +sub which +{ + my $file = shift; + + my $IFS = $^O eq "MSWin32" ? ";" : ":"; + + foreach my $dir ( split($IFS, $ENV{PATH}) ) + { + if ( -f "$dir/$file" or -f "$dir/$file.exe" ) + { + return "$dir/$file"; + } + } + print STDERR "which: no $file in ($ENV{PATH})\n"; + exit 1; +} + +# ---------------------------------------------------------------------- +# If we can find the given directory relatively to where mysql_config is +# we should use this instead of the incompiled one. +# This is to ensure that this script also works with the binary MySQL +# version +# ---------------------------------------------------------------------- + +sub fix_path +{ + my $default = shift; + my @dirs = @_; + + foreach my $dirname ( @dirs ) + { + my $path = "$basedir/$dirname"; + if ( -d $path ) + { + return $path; + } + } + return $default; +} + +sub get_full_path +{ + my $file = shift; + + # if the file is a symlink, try to resolve it + if ( $^O ne "MSWin32" and -l $file ) + { + $file = readlink($file); + } + + if ( $file =~ m,^/, ) + { + # Do nothing, absolute path + } + elsif ( $file =~ m,/, ) + { + # Make absolute, and remove "/./" in path + $file = "$cwd/$file"; + $file =~ s,/\./,/,g; + } + else + { + # Find in PATH + $file = which($file); + } + + return $file; +} + +############################################################################## +# +# Form a command line that can handle spaces in paths and arguments +# +############################################################################## + +sub quote_options { + my @cmd; + foreach my $opt ( @_ ) + { + next unless $opt; # If undefined or empty, just skip + push(@cmd, "\"$opt\""); # Quote argument + } + return join(" ", @cmd); +} + +############################################################################## +# +# Main program +# +############################################################################## + +my $me = get_full_path($0); +$basedir = dirname(dirname($me)); # Remove "/bin/mysql_config" part + +my $ldata = '@localstatedir@'; +my $execdir = '@libexecdir@'; +my $bindir = '@bindir@'; + +# ---------------------------------------------------------------------- +# If installed, search for the compiled in directory first (might be "lib64") +# ---------------------------------------------------------------------- + +my $pkglibdir = fix_path('@pkglibdir@',"libmysql/relwithdebinfo", + "libmysql/release","libmysql/debug","lib/mysql","lib"); + +my $pkgincludedir = fix_path('@pkgincludedir@', "include/mysql", "include"); + +# Assume no argument with space in it +my @ldflags = split(" ",'@LDFLAGS@'); + +my $port; +if ( '@MYSQL_TCP_PORT_DEFAULT@' == 0 ) { + $port = 0; +} else { + $port = '@MYSQL_TCP_PORT@'; +} + +# ---------------------------------------------------------------------- +# Create options +# We intentionally add a space to the beginning and end of lib strings, simplifies replace later +# ---------------------------------------------------------------------- + +my (@lib_opts,@lib_r_opts,@lib_e_opts); +if ( $^O eq "MSWin32" ) +{ + my $linkpath = "$pkglibdir"; + # user32 is only needed for debug or embedded + my @winlibs = ("wsock32.lib","advapi32.lib","user32.lib"); + @lib_opts = ("$linkpath/mysqlclient.lib",@winlibs); + @lib_r_opts = @lib_opts; + @lib_e_opts = ("$linkpath/mysqlserver.lib",@winlibs); +} +else +{ + my $linkpath = "-L$pkglibdir"; + @lib_opts = ($linkpath,"-lmysqlclient"); + @lib_r_opts = ($linkpath,"-lmysqlclient_r"); + @lib_e_opts = ($linkpath,"-lmysqld"); +} + +my $flags; +$flags->{libs} = + [@ldflags,@lib_opts,'@ZLIB_DEPS@','@NON_THREADED_LIBS@','@openssl_libs@','@STATIC_NSS_FLAGS@']; +$flags->{libs_r} = + [@ldflags,@lib_r_opts,'@ZLIB_DEPS@','@LIBS@','@openssl_libs@']; +$flags->{embedded_libs} = + [@ldflags,@lib_e_opts,'@ZLIB_DEPS@','@LIBS@','@WRAPLIBS@','@innodb_system_libs@','@openssl_libs@']; + +$flags->{include} = ["-I$pkgincludedir"]; +$flags->{cflags} = [@{$flags->{include}},split(" ",'@CFLAGS@')]; + +# ---------------------------------------------------------------------- +# Remove some options that a client doesn't have to care about +# FIXME until we have a --cxxflags, we need to remove -Xa +# and -xstrconst to make --cflags usable for Sun Forte C++ +# ---------------------------------------------------------------------- + +my $filter = join("|", @exclude_cflags); +my @tmp = @{$flags->{cflags}}; # Copy the flag list +$flags->{cflags} = []; # Clear it +foreach my $cflag ( @tmp ) +{ + push(@{$flags->{cflags}}, $cflag) unless $cflag =~ m/^($filter)$/o; +} + +# Same for --libs(_r) +$filter = join("|", @exclude_libs); +foreach my $lib_type ( "libs","libs_r","embedded_libs" ) +{ + my @tmp = @{$flags->{$lib_type}}; # Copy the flag list + $flags->{$lib_type} = []; # Clear it + foreach my $lib ( @tmp ) + { + push(@{$flags->{$lib_type}}, $lib) unless $lib =~ m/^($filter)$/o; + } +} + +my $include = quote_options(@{$flags->{include}}); +my $cflags = quote_options(@{$flags->{cflags}}); +my $libs = quote_options(@{$flags->{libs}}); +my $libs_r = quote_options(@{$flags->{libs_r}}); +my $embedded_libs = quote_options(@{$flags->{embedded_libs}}); + +############################################################################## +# +# Usage information, output if no option is given +# +############################################################################## + +sub usage +{ + print < sub { print "$cflags\n" }, + "include" => sub { print "$include\n" }, + "libs" => sub { print "$libs\n" }, + "libs_r" => sub { print "$libs_r\n" }, + "socket" => sub { print "$socket\n" }, + "port" => sub { print "$port\n" }, + "version" => sub { print "$version\n" }, + "embedded-libs|embedded|libmysqld-libs" => + sub { print "$embedded_libs\n" }, + ) or usage(); + +exit 0 diff --git a/scripts/mysql_convert_table_format.sh b/scripts/mysql_convert_table_format.sh index 0c9ce3a67e0..833b5bf5f11 100644 --- a/scripts/mysql_convert_table_format.sh +++ b/scripts/mysql_convert_table_format.sh @@ -1,4 +1,4 @@ -#!@PERL@ +#!/usr/bin/perl # Copyright (C) 2000-2002 MySQL AB # # This program is free software; you can redistribute it and/or modify diff --git a/scripts/mysql_explain_log.sh b/scripts/mysql_explain_log.sh index a549817db5a..f3c7a4b04fa 100644 --- a/scripts/mysql_explain_log.sh +++ b/scripts/mysql_explain_log.sh @@ -1,4 +1,4 @@ -#!@PERL@ +#!/usr/bin/perl # Copyright (C) 2001-2003, 2006 MySQL AB # # This program is free software; you can redistribute it and/or modify diff --git a/scripts/mysql_install_db.pl.in b/scripts/mysql_install_db.pl.in new file mode 100644 index 00000000000..18bd713c041 --- /dev/null +++ b/scripts/mysql_install_db.pl.in @@ -0,0 +1,612 @@ +#!/usr/bin/perl +# -*- cperl -*- +# +# Copyright (C) 2007 MySQL AB +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +############################################################################## +# +# This scripts creates the MySQL Server system tables. +# +# This script try to match the shell script version as close as possible, +# but in addition being compatible with ActiveState Perl on Windows. +# +# All unrecognized arguments to this script are passed to mysqld. +# +# NOTE: This script in 5.0 doesn't really match the shell script +# version 100%, it is more close to the 5.1 version. +# +# NOTE: This script was deliberately written to be as close to the shell +# script as possible, to make the maintenance of both in parallel +# easier. +# +############################################################################## + +use File::Basename; +use Getopt::Long; +use Sys::Hostname; +use Data::Dumper; +use strict; + +Getopt::Long::Configure("pass_through"); + +my @args; # Argument list filled in + +############################################################################## +# +# Usage information +# +############################################################################## + +sub usage +{ + print <{help}; + + @args = @ARGV if $pick_args; + + @ARGV = @saved_ARGV; # Set back ARGV +} + +############################################################################## +# +# Try to find a specific file within --basedir which can either be a binary +# release or installed source directory and return the path. +# +############################################################################## + +sub find_in_basedir +{ + my $opt = shift; + my $mode = shift; # "dir" or "file" + my $files = shift; + + foreach my $file ( @{ref($files) ? $files : [$files]} ) + { + foreach my $dir ( @_ ) + { + foreach my $part ( "$file","$file.exe","release/$file.exe", + "debug/$file.exe","relwithdebinfo/$file.exe" ) + { + my $path = "$opt->{basedir}/$dir/$part"; + if ( -f $path ) + { + return $mode eq "dir" ? dirname($path) : $path; + } + } + } + } +} + +############################################################################## +# +# Just a function to write out an error report +# +############################################################################## + +sub cannot_find_file +{ + my $file = shift; + + print "FATAL ERROR: Could not find $file\n"; + print "\n"; + print "If you compiled from source, you need to run 'make install' to\n"; + print "copy the software into the correct location ready for operation.\n"; + print "\n"; + print "If you are using a binary release, you must either be at the top\n"; + print "level of the extracted archive, or pass the --basedir option\n"; + print "pointing to that location.\n"; + print "\n"; + + exit 1; +} + +############################################################################## +# +# Form a command line that can handle spaces in paths and arguments +# +############################################################################## + +# FIXME this backslash escaping needed if using '"..."' ? +# This regexp makes sure that any special chars are quoted, +# so the arg gets passed exactly to the server. +# XXX: This is broken; true fix requires using eval and proper +# quoting of every single arg ($opt->{basedir}, $opt->{ldata}, etc.) +# join(" ", map {s/([^\w\_\.\-])/\\$1/g} + +sub quote_options { + my @cmd; + foreach my $opt ( @_ ) + { + next unless $opt; # If undefined or empty, just skip + push(@cmd, "\"$opt\""); # Quote argument + } + return join(" ", @cmd); +} + +############################################################################## +# +# Ok, let's go. We first need to parse arguments which are required by +# my_print_defaults so that we can execute it first, then later re-parse +# the command line to add any extra bits that we need. +# +############################################################################## + +my $opt = {}; +parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV); + +# ---------------------------------------------------------------------- +# We can now find my_print_defaults. This script supports: +# +# --srcdir=path pointing to compiled source tree +# --basedir=path pointing to installed binary location +# +# or default to compiled-in locations. +# ---------------------------------------------------------------------- + +my $print_defaults; + +if ( $opt->{srcdir} and $opt->{basedir} ) +{ + error("Specify either --basedir or --srcdir, not both"); +} +if ( $opt->{srcdir} ) +{ + $opt->{builddir} = $opt->{srcdir} unless $opt->{builddir}; + $print_defaults = "$opt->{builddir}/extra/my_print_defaults"; +} +elsif ( $opt->{basedir} ) +{ + $print_defaults = find_in_basedir($opt,"file","my_print_defaults","bin","extra"); +} +else +{ + $print_defaults='@bindir@/my_print_defaults'; +} + +-x $print_defaults or -f "$print_defaults.exe" + or cannot_find_file($print_defaults); + +# ---------------------------------------------------------------------- +# Now we can get arguments from the groups [mysqld] and [mysql_install_db] +# in the my.cfg file, then re-run to merge with command line arguments. +# ---------------------------------------------------------------------- + +my @default_options; +my $cmd = quote_options($print_defaults,$opt->{'defaults-file'}, + "mysqld","mysql_install_db"); +open(PIPE, "$cmd |") or error($opt,"can't run $cmd: $!"); +while ( ) +{ + chomp; + next unless /\S/; + push(@default_options, $_); +} +close PIPE; +$opt = {}; # Reset the arguments FIXME ? +parse_arguments($opt, @default_options); +parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV); + +# ---------------------------------------------------------------------- +# Configure paths to support files +# ---------------------------------------------------------------------- + +# FIXME $extra_bindir is not used +my ($bindir,$extra_bindir,$mysqld,$pkgdatadir,$mysqld_opt,$scriptdir); + +if ( $opt->{srcdir} ) +{ + $opt->{basedir} = $opt->{builddir}; + $bindir = "$opt->{basedir}/client"; + $extra_bindir = "$opt->{basedir}/extra"; + $mysqld = "$opt->{basedir}/sql/mysqld"; + $mysqld_opt = "--language=$opt->{srcdir}/sql/share/english"; + $pkgdatadir = "$opt->{srcdir}/scripts"; + $scriptdir = "$opt->{srcdir}/scripts"; +} +elsif ( $opt->{basedir} ) +{ + $bindir = "$opt->{basedir}/bin"; + $extra_bindir = $bindir; + $mysqld = find_in_basedir($opt,"file",["mysqld-nt","mysqld"], + "libexec","sbin","bin") || # ,"sql" + find_in_basedir($opt,"file","mysqld-nt", + "bin"); # ,"sql" + $pkgdatadir = find_in_basedir($opt,"dir","fill_help_tables.sql", + "share","share/mysql"); # ,"scripts" + $scriptdir = "$opt->{basedir}/scripts"; +} +else +{ + $opt->{basedir} = '@prefix@'; + $bindir = '@bindir@'; + $extra_bindir = $bindir; + $mysqld = '@libexecdir@/mysqld'; + $pkgdatadir = '@pkgdatadir@'; + $scriptdir = '@scriptdir@'; +} + +unless ( $opt->{ldata} ) +{ + $opt->{ldata} = '@localstatedir@'; +} + +if ( $opt->{srcdir} ) +{ + $pkgdatadir = "$opt->{srcdir}/scripts"; +} + +# ---------------------------------------------------------------------- +# Set up paths to SQL scripts required for bootstrap +# ---------------------------------------------------------------------- + +my $fill_help_tables = "$pkgdatadir/fill_help_tables.sql"; +my $create_system_tables = "$pkgdatadir/mysql_system_tables.sql"; +my $fill_system_tables = "$pkgdatadir/mysql_system_tables_data.sql"; + +foreach my $f ( $fill_help_tables,$create_system_tables,$fill_system_tables ) +{ + -f $f or cannot_find_file($f); +} + +-x $mysqld or -f "$mysqld.exe" or cannot_find_file($mysqld); +# Try to determine the hostname +my $hostname = hostname(); + +# ---------------------------------------------------------------------- +# Check if hostname is valid +# ---------------------------------------------------------------------- + +my $resolved; +if ( !$opt->{'cross-bootstrap'} and !$opt->{rpm} and !$opt->{force} ) +{ + my $resolveip; + + $resolved = `$resolveip $hostname 2>&1`; + if ( $? != 0 ) + { + $resolved=`$resolveip localhost 2>&1`; + if ( $? != 0 ) + { + error($opt, + "Neither host '$hostname' nor 'localhost' could be looked up with", + "$bindir/resolveip", + "Please configure the 'hostname' command to return a correct", + "hostname.", + "If you want to solve this at a later stage, restart this script", + "with the --force option"); + } + warning($opt, + "The host '$hostname' could not be looked up with resolveip.", + "This probably means that your libc libraries are not 100 % compatible", + "with this binary MySQL version. The MySQL daemon, mysqld, should work", + "normally with the exception that host name resolving will not work.", + "This means that you should use IP addresses instead of hostnames", + "when specifying MySQL privileges !"); + } +} + +# FIXME what does this really mean.... +if ( $opt->{'skip-name-resolve'} and $resolved and $resolved =~ /\s/ ) +{ + $hostname = (split(' ', $resolved))[5]; +} + +# ---------------------------------------------------------------------- +# Create database directories mysql & test +# ---------------------------------------------------------------------- + +foreach my $dir ( $opt->{ldata}, "$opt->{ldata}/mysql", "$opt->{ldata}/test" ) +{ + # FIXME not really the same as original "mkdir -p", but ok? + mkdir($dir, 0700) unless -d $dir; + chown($opt->{user}, $dir) if -w "/" and !$opt->{user}; +} + +push(@args, "--user=$opt->{user}") if $opt->{user}; + +# ---------------------------------------------------------------------- +# Configure mysqld command line +# ---------------------------------------------------------------------- + +# FIXME use --init-file instead of --bootstrap ?! + +my $mysqld_bootstrap = $ENV{MYSQLD_BOOTSTRAP} || $mysqld; +my $mysqld_install_cmd_line = quote_options($mysqld_bootstrap, + $opt->{'defaults-file'}, + $mysqld_opt, + "--bootstrap", + "--basedir=$opt->{basedir}", + "--datadir=$opt->{ldata}", + "--skip-innodb", + "--skip-bdb", + "--skip-ndbcluster", + "--max_allowed_packet=8M", + "--net_buffer_length=16K", + @args, + ); + +# ---------------------------------------------------------------------- +# Create the system and help tables by passing them to "mysqld --bootstrap" +# ---------------------------------------------------------------------- + +report_verbose_wait($opt,"Installing MySQL system tables..."); + +open(SQL, $create_system_tables) + or error($opt,"can't open $create_system_tables for reading: $!"); +# FIXME > /dev/null ? +if ( open(PIPE, "| $mysqld_install_cmd_line") ) +{ + print PIPE "use mysql;\n"; + while ( ) + { + # When doing a "cross bootstrap" install, no reference to the current + # host should be added to the system tables. So we filter out any + # lines which contain the current host name. + next if $opt->{'cross-bootstrap'} and /\@current_hostname/; + + print PIPE $_; + } + close PIPE; + close SQL; + + report_verbose($opt,"OK"); + + # ---------------------------------------------------------------------- + # Pipe fill_help_tables.sql to "mysqld --bootstrap" + # ---------------------------------------------------------------------- + + report_verbose_wait($opt,"Filling help tables..."); + open(SQL, $fill_help_tables) + or error($opt,"can't open $fill_help_tables for reading: $!"); + # FIXME > /dev/null ? + if ( open(PIPE, "| $mysqld_install_cmd_line") ) + { + print PIPE "use mysql;\n"; + while ( ) + { + print PIPE $_; + } + close PIPE; + close SQL; + + report_verbose($opt,"OK"); + } + else + { + warning($opt,"HELP FILES ARE NOT COMPLETELY INSTALLED!", + "The \"HELP\" command might not work properly"); + } + + report_verbose($opt,"To start mysqld at boot time you have to copy", + "support-files/mysql.server to the right place " . + "for your system"); + + if ( !$opt->{'cross-bootstrap'} ) + { + # This is not a true installation on a running system. The end user must + # set a password after installing the data files on the real host system. + # At this point, there is no end user, so it does not make sense to print + # this reminder. + report($opt, + "PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !", + "To do so, start the server, then issue the following commands:", + "", + " $bindir/mysqladmin -u root password 'new-password'", + " $bindir/mysqladmin -u root -h $hostname password 'new-password'", + "", + "Alternatively you can run:", + "", + " $bindir/mysql_secure_installation", + "", + "which will also give you the option of removing the test", + "databases and anonymous user created by default. This is", + "strongly recommended for production servers.", + "", + "See the manual for more instructions."); + + if ( !$opt->{rpm} ) + { + report($opt, + "You can start the MySQL daemon with:", + "", + " cd " . '@prefix@' . " ; $bindir/mysqld_safe &", + "", + "You can test the MySQL daemon with mysql-test-run.pl", + "", + " cd mysql-test ; perl mysql-test-run.pl"); + } + report($opt, + "Please report any problems with the " . '@scriptdir@' . "/mysqlbug script!", + "", + "The latest information about MySQL is available on the web at", + "", + " http://www.mysql.com", + "", + "Support MySQL by buying support/licenses at http://shop.mysql.com"); + } + exit 0 +} +else +{ + error($opt, + "Installation of system tables failed!", + "", + "Examine the logs in $opt->{ldata} for more information.", + "You can try to start the mysqld daemon with:", + "$mysqld --skip-grant &", + "and use the command line tool", + "$bindir/mysql to connect to the mysql", + "database and look at the grant tables:", + "", + "shell> $bindir/mysql -u root mysql", + "mysql> show tables", + "", + "Try 'mysqld --help' if you have problems with paths. Using --log", + "gives you a log in $opt->{ldata} that may be helpful.", + "", + "The latest information about MySQL is available on the web at", + "http://www.mysql.com", + "Please consult the MySQL manual section: 'Problems running mysql_install_db',", + "and the manual section that describes problems on your OS.", + "Another information source is the MySQL email archive.", + "Please check all of the above before mailing us!", + "And if you do mail us, you MUST use the " . '@scriptdir@' . "/mysqlbug script!") +} + +############################################################################## +# +# Misc +# +############################################################################## + +sub report_verbose +{ + my $opt = shift; + my $text = shift; + + report_verbose_wait($opt, $text, @_); + print "\n\n"; +} + +sub report_verbose_wait +{ + my $opt = shift; + my $text = shift; + + if ( $opt->{verbose} or (!$opt->{rpm} and !$opt->{'cross-bootstrap'}) ) + { + print "$text"; + map {print "\n$_"} @_; + } +} + +sub report +{ + my $opt = shift; + my $text = shift; + + print "$text\n"; + map {print "$_\n"} @_; + print "\n"; +} + +sub error +{ + my $opt = shift; + my $text = shift; + + print "FATAL ERROR: $text\n"; + map {print "$_\n"} @_; + exit 1; +} + +sub warning +{ + my $opt = shift; + my $text = shift; + + print "WARNING: $text\n"; + map {print "$_\n"} @_; + print "\n"; +} diff --git a/scripts/mysql_tableinfo.sh b/scripts/mysql_tableinfo.sh index 2ed7e381fa3..c90c410ca78 100644 --- a/scripts/mysql_tableinfo.sh +++ b/scripts/mysql_tableinfo.sh @@ -1,4 +1,4 @@ -#!@PERL@ -w +#!/usr/bin/perl use strict; use Getopt::Long; diff --git a/scripts/mysqld_multi.sh b/scripts/mysqld_multi.sh index 92cfbe3ef22..3cb4665eb1c 100644 --- a/scripts/mysqld_multi.sh +++ b/scripts/mysqld_multi.sh @@ -1,4 +1,4 @@ -#!@PERL@ +#!/usr/bin/perl use Getopt::Long; use POSIX qw(strftime); diff --git a/scripts/mysqldumpslow.sh b/scripts/mysqldumpslow.sh index ff82a35ec3f..f05761bb837 100644 --- a/scripts/mysqldumpslow.sh +++ b/scripts/mysqldumpslow.sh @@ -1,4 +1,4 @@ -#!@PERL@ +#!/usr/bin/perl # mysqldumpslow - parse and summarize the MySQL slow query log # Original version by Tim Bunce, sometime in 2000. diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh index 6ad5c77b954..bad0761cd80 100644 --- a/scripts/mysqlhotcopy.sh +++ b/scripts/mysqlhotcopy.sh @@ -1,4 +1,4 @@ -#!@PERL@ -w +#!/usr/bin/perl use strict; use Getopt::Long; From 7e656539834bcb41107f05d84929f875939f64f5 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 28 Dec 2007 22:58:54 +0100 Subject: [PATCH 3/9] Makefile.am, CMakeLists.txt, mysql_secure_installation.pl.in: Added Perl version of script "mysql_secure_installation" make_win_bin_dist: Corrected copy of SQL files to "share" directory scripts/mysql_secure_installation.pl.in: Added Perl version of script "mysql_secure_installation" scripts/CMakeLists.txt: Added Perl version of script "mysql_secure_installation" scripts/Makefile.am: Added Perl version of script "mysql_secure_installation" scripts/make_win_bin_dist: Corrected copy of SQL files to "share" directory --- scripts/CMakeLists.txt | 2 +- scripts/Makefile.am | 1 + scripts/make_win_bin_dist | 4 +- scripts/mysql_secure_installation.pl.in | 352 ++++++++++++++++++++++++ 4 files changed, 356 insertions(+), 3 deletions(-) create mode 100755 scripts/mysql_secure_installation.pl.in diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 8d369a6ab22..d7bcb8fd4e7 100755 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -67,7 +67,7 @@ CONFIGURE_FILE(mysql_explain_log.sh CONFIGURE_FILE(mysql_install_db.pl.in scripts/mysql_install_db.pl ESCAPE_QUOTES @ONLY) -CONFIGURE_FILE(mysql_secure_installation.sh +CONFIGURE_FILE(mysql_secure_installation.pl.in scripts/mysql_secure_installation.pl ESCAPE_QUOTES @ONLY) CONFIGURE_FILE(mysql_tableinfo.sh diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 769c0f5fdba..87170b46675 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -55,6 +55,7 @@ EXTRA_SCRIPTS = make_binary_distribution.sh \ mysql_install_db.pl.in \ mysql_setpermission.sh \ mysql_secure_installation.sh \ + mysql_secure_installation.pl.in \ mysql_zap.sh \ mysqlaccess.sh \ mysqlbug.sh \ diff --git a/scripts/make_win_bin_dist b/scripts/make_win_bin_dist index b9a0842473b..56510dc857b 100755 --- a/scripts/make_win_bin_dist +++ b/scripts/make_win_bin_dist @@ -353,8 +353,8 @@ cp -pR sql/share $DESTDIR/ cp -pR sql-bench $DESTDIR/ rm -f $DESTDIR/sql-bench/*.sh $DESTDIR/sql-bench/Makefile* -# The SQL initialisation code is really expected to be in "share" -mv $DESTDIR/scripts/*.sql $DESTDIR/share/ +# The SQL initialisation code is to be in "share" +cp scripts/*.sql $DESTDIR/share/ # ---------------------------------------------------------------------- # Clean up from possibly copied SCCS directories diff --git a/scripts/mysql_secure_installation.pl.in b/scripts/mysql_secure_installation.pl.in new file mode 100755 index 00000000000..4eeb50e6d2f --- /dev/null +++ b/scripts/mysql_secure_installation.pl.in @@ -0,0 +1,352 @@ +#!/usr/bin/perl +# -*- cperl -*- +# +# Copyright (C) 2002 MySQL AB and Jeremy Cole +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +use Fcntl; +use strict; + +my $config = ".my.cnf.$$"; +my $command = ".mysql.$$"; +my $hadpass = 0; + +# FIXME +# trap "interrupt" 2 + +my $rootpass = ""; + +sub echo_on { + if ($^O eq 'MSWin32') { + ReadMode('normal'); + } else { + system("stty echo"); + } +} + +sub echo_off { + if ($^O eq 'MSWin32') { + ReadMode('noecho'); + } else { + system("stty -echo"); + } +} + +sub write_file { + my $file = shift; + -f $file or die "ERROR: file is missing \"$file\": $!"; + open(FILE, ">$file") or die "ERROR: can't write to file \"$file\": $!"; + foreach my $line ( @_ ) { + print FILE $line, "\n"; # Add EOL char + } + close FILE; +} + +sub prepare { + foreach my $file ( $config, $command ) { + next if -f $file; # Already exists + local *FILE; + sysopen(FILE, $file, O_CREAT, 0600) + or die "ERROR: can't create $file: $!"; + close FILE; + } +} + +sub do_query { + my $query = shift; + write_file($command, $query); + system("mysql --defaults-file=$config < $command"); + return $?; +} + +sub make_config { + my $password = shift; + + write_file($config, + "# mysql_secure_installation config file", + "[mysql]", + "user=root", + "password=$rootpass"); +} + +sub get_root_password { + my $status = 1; + while ( $status == 1 ) { + echo_off(); + print "Enter current password for root (enter for none): "; + my $password = ; + echo_on(); + if ( $password ) { + $hadpass = 1; + } else { + $hadpass = 0; + } + $rootpass = $password; + make_config($rootpass); + do_query(""); + $status = $?; + } + print "OK, successfully used password, moving on...\n\n"; +} + +sub set_root_password { + echo_off(); + print "New password: "; + my $password1 = ; + print "\nRe-enter new password: "; + my $password2 = ; + print "\n"; + echo_on(); + + if ( $password1 eq $password2 ) { + print "Sorry, passwords do not match.\n\n"; + return 1; + } + + if ( !$password1 ) { + print "Sorry, you can't use an empty password here.\n\n"; + return 1; + } + + do_query("UPDATE mysql.user SET Password=PASSWORD('$password1') WHERE User='root';"); + if ( $? == 0 ) { + print "Password updated successfully!\n"; + print "Reloading privilege tables..\n"; + if ( !reload_privilege_tables() ) { + exit 1; + } + print "\n"; + $rootpass = $password1; + make_config($rootpass); + } else { + print "Password update failed!\n"; + exit 1; + } + + return 0; +} + +sub remove_anonymous_users { + do_query("DELETE FROM mysql.user WHERE User='';"); + if ( $? == 0 ) { + print " ... Success!\n"; + } else { + print " ... Failed!\n"; + exit 1; + } + + return 0; +} + +sub remove_remote_root { + do_query("DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';"); + if ( $? == 0 ) { + print " ... Success!\n"; + } else { + print " ... Failed!\n"; + } +} + +sub remove_test_database { + print " - Dropping test database...\n"; + do_query("DROP DATABASE test;"); + if ( $? == 0 ) { + print " ... Success!\n"; + } else { + print " ... Failed! Not critical, keep moving...\n"; + } + + print " - Removing privileges on test database...\n"; + do_query("DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"); + if ( $? == 0 ) { + print " ... Success!\n"; + } else { + print " ... Failed! Not critical, keep moving...\n"; + } + + return 0; +} + +sub reload_privilege_tables { + do_query("FLUSH PRIVILEGES;"); + if ( $? == 0 ) { + print " ... Success!\n"; + return 0; + } else { + print " ... Failed!\n"; + return 1; + } +} + +sub interrupt { + print "\nAborting!\n\n"; + cleanup(); + echo_on(); + exit 1; +} + +sub cleanup { + print "Cleaning up...\n"; + unlink($config,$command); +} + + +# The actual script starts here + +prepare(); + +print <; +if ( $reply =~ /n/i ) { + print " ... skipping.\n"; +} else { + my $status = 1; + while ( $status == 1 ) { + set_root_password(); + $status = $?; + } +} +print "\n"; + + +# +# Remove anonymous users +# + +print <; +if ( $reply =~ /n/i ) { + print " ... skipping.\n"; +} else { + remove_anonymous_users(); +} +print "\n"; + + +# +# Disallow remote root login +# + +print <; +if ( $reply =~ /n/i ) { + print " ... skipping.\n"; +} else { + remove_remote_root(); +} +print "\n"; + + +# +# Remove test database +# + +print <; +if ( $reply =~ /n/i ) { + print " ... skipping.\n"; +} else { + remove_test_database(); +} +print "\n"; + + +# +# Reload privilege tables +# + +print <; +if ( $reply =~ /n/i ) { + print " ... skipping.\n"; +} else { + reload_privilege_tables(); +} +print "\n"; + +cleanup(); + +print < Date: Thu, 3 Jan 2008 14:26:41 +0100 Subject: [PATCH 4/9] use correct config_readline.h file --- cmd-line-utils/readline/bind.c | 2 +- cmd-line-utils/readline/callback.c | 2 +- cmd-line-utils/readline/compat.c | 2 +- cmd-line-utils/readline/complete.c | 2 +- cmd-line-utils/readline/display.c | 2 +- cmd-line-utils/readline/funmap.c | 2 +- cmd-line-utils/readline/histexpand.c | 2 +- cmd-line-utils/readline/histfile.c | 2 +- cmd-line-utils/readline/history.c | 2 +- cmd-line-utils/readline/histsearch.c | 2 +- cmd-line-utils/readline/input.c | 2 +- cmd-line-utils/readline/isearch.c | 2 +- cmd-line-utils/readline/keymaps.c | 2 +- cmd-line-utils/readline/kill.c | 2 +- cmd-line-utils/readline/macro.c | 2 +- cmd-line-utils/readline/mbutil.c | 2 +- cmd-line-utils/readline/misc.c | 2 +- cmd-line-utils/readline/nls.c | 2 +- cmd-line-utils/readline/parens.c | 2 +- cmd-line-utils/readline/readline.c | 2 +- cmd-line-utils/readline/rldefs.h | 2 +- cmd-line-utils/readline/rltty.c | 2 +- cmd-line-utils/readline/rlwinsize.h | 2 +- cmd-line-utils/readline/savestring.c | 2 +- cmd-line-utils/readline/search.c | 2 +- cmd-line-utils/readline/shell.c | 2 +- cmd-line-utils/readline/signals.c | 2 +- cmd-line-utils/readline/tcap.h | 2 +- cmd-line-utils/readline/terminal.c | 2 +- cmd-line-utils/readline/text.c | 2 +- cmd-line-utils/readline/tilde.c | 2 +- cmd-line-utils/readline/undo.c | 2 +- cmd-line-utils/readline/util.c | 2 +- cmd-line-utils/readline/vi_mode.c | 2 +- cmd-line-utils/readline/xmalloc.c | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/cmd-line-utils/readline/bind.c b/cmd-line-utils/readline/bind.c index 08c906bfcc3..baed1dfad49 100644 --- a/cmd-line-utils/readline/bind.c +++ b/cmd-line-utils/readline/bind.c @@ -27,7 +27,7 @@ #endif #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/callback.c b/cmd-line-utils/readline/callback.c index ada04d8593b..2f7e4b78057 100644 --- a/cmd-line-utils/readline/callback.c +++ b/cmd-line-utils/readline/callback.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include "rlconf.h" diff --git a/cmd-line-utils/readline/compat.c b/cmd-line-utils/readline/compat.c index a66d210fd2e..3949bf6a16b 100644 --- a/cmd-line-utils/readline/compat.c +++ b/cmd-line-utils/readline/compat.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/complete.c b/cmd-line-utils/readline/complete.c index 73f834a68a7..d0c9e772f0f 100644 --- a/cmd-line-utils/readline/complete.c +++ b/cmd-line-utils/readline/complete.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/display.c b/cmd-line-utils/readline/display.c index 47ff0615974..6f63faa9738 100644 --- a/cmd-line-utils/readline/display.c +++ b/cmd-line-utils/readline/display.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/funmap.c b/cmd-line-utils/readline/funmap.c index 9c760cc3475..2d2a35ed0c8 100644 --- a/cmd-line-utils/readline/funmap.c +++ b/cmd-line-utils/readline/funmap.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #if !defined (BUFSIZ) diff --git a/cmd-line-utils/readline/histexpand.c b/cmd-line-utils/readline/histexpand.c index f46c0b2a45d..45377fc3b5e 100644 --- a/cmd-line-utils/readline/histexpand.c +++ b/cmd-line-utils/readline/histexpand.c @@ -23,7 +23,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/histfile.c b/cmd-line-utils/readline/histfile.c index 2f051a32563..d98293d933c 100644 --- a/cmd-line-utils/readline/histfile.c +++ b/cmd-line-utils/readline/histfile.c @@ -31,7 +31,7 @@ #endif #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/history.c b/cmd-line-utils/readline/history.c index 1ccf4db786c..5cd5788d1da 100644 --- a/cmd-line-utils/readline/history.c +++ b/cmd-line-utils/readline/history.c @@ -26,7 +26,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/histsearch.c b/cmd-line-utils/readline/histsearch.c index 1cc5875a4b4..b71965135cc 100644 --- a/cmd-line-utils/readline/histsearch.c +++ b/cmd-line-utils/readline/histsearch.c @@ -23,7 +23,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/input.c b/cmd-line-utils/readline/input.c index da5d771c481..62c0443d890 100644 --- a/cmd-line-utils/readline/input.c +++ b/cmd-line-utils/readline/input.c @@ -26,7 +26,7 @@ #endif #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/isearch.c b/cmd-line-utils/readline/isearch.c index 9f67bfc0801..8060adb97cd 100644 --- a/cmd-line-utils/readline/isearch.c +++ b/cmd-line-utils/readline/isearch.c @@ -27,7 +27,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/keymaps.c b/cmd-line-utils/readline/keymaps.c index 70d0cc08d3f..562c22d7558 100644 --- a/cmd-line-utils/readline/keymaps.c +++ b/cmd-line-utils/readline/keymaps.c @@ -21,7 +21,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #if defined (HAVE_STDLIB_H) diff --git a/cmd-line-utils/readline/kill.c b/cmd-line-utils/readline/kill.c index 031ddf47c5b..42c53948689 100644 --- a/cmd-line-utils/readline/kill.c +++ b/cmd-line-utils/readline/kill.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/macro.c b/cmd-line-utils/readline/macro.c index 00cd58d628c..3473f705335 100644 --- a/cmd-line-utils/readline/macro.c +++ b/cmd-line-utils/readline/macro.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/mbutil.c b/cmd-line-utils/readline/mbutil.c index 17dde53ed7b..e21708fb748 100644 --- a/cmd-line-utils/readline/mbutil.c +++ b/cmd-line-utils/readline/mbutil.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/misc.c b/cmd-line-utils/readline/misc.c index 94ecb25900a..e0e6893c60e 100644 --- a/cmd-line-utils/readline/misc.c +++ b/cmd-line-utils/readline/misc.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #if defined (HAVE_UNISTD_H) diff --git a/cmd-line-utils/readline/nls.c b/cmd-line-utils/readline/nls.c index bcee87561aa..6ec685ed9ea 100644 --- a/cmd-line-utils/readline/nls.c +++ b/cmd-line-utils/readline/nls.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/parens.c b/cmd-line-utils/readline/parens.c index 737f7675e93..fe1578ed3e2 100644 --- a/cmd-line-utils/readline/parens.c +++ b/cmd-line-utils/readline/parens.c @@ -28,7 +28,7 @@ #include "rlconf.h" #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/readline.c b/cmd-line-utils/readline/readline.c index c2b74006b05..8c3cad52d36 100644 --- a/cmd-line-utils/readline/readline.c +++ b/cmd-line-utils/readline/readline.c @@ -23,7 +23,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/rldefs.h b/cmd-line-utils/readline/rldefs.h index 0f6c87446dd..dcdfc49fbbc 100644 --- a/cmd-line-utils/readline/rldefs.h +++ b/cmd-line-utils/readline/rldefs.h @@ -27,7 +27,7 @@ #define _RLDEFS_H_ #if defined (HAVE_CONFIG_H) -# include "config.h" +# include "config_readline.h" #endif #include "rlstdc.h" diff --git a/cmd-line-utils/readline/rltty.c b/cmd-line-utils/readline/rltty.c index 0a570f85840..b5bc5d367a5 100644 --- a/cmd-line-utils/readline/rltty.c +++ b/cmd-line-utils/readline/rltty.c @@ -23,7 +23,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/rlwinsize.h b/cmd-line-utils/readline/rlwinsize.h index 7838154d023..60729b0f549 100644 --- a/cmd-line-utils/readline/rlwinsize.h +++ b/cmd-line-utils/readline/rlwinsize.h @@ -26,7 +26,7 @@ #define _RLWINSIZE_H_ #if defined (HAVE_CONFIG_H) -# include "config.h" +# include "config_readline.h" #endif /* Try to find the definitions of `struct winsize' and TIOGCWINSZ */ diff --git a/cmd-line-utils/readline/savestring.c b/cmd-line-utils/readline/savestring.c index 820428d8881..d42bcadf5d7 100644 --- a/cmd-line-utils/readline/savestring.c +++ b/cmd-line-utils/readline/savestring.c @@ -21,7 +21,7 @@ 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #define READLINE_LIBRARY -#include +#include "config_readline.h" #ifdef HAVE_STRING_H # include #endif diff --git a/cmd-line-utils/readline/search.c b/cmd-line-utils/readline/search.c index 33cc4fc1e73..cfa5db1dc17 100644 --- a/cmd-line-utils/readline/search.c +++ b/cmd-line-utils/readline/search.c @@ -23,7 +23,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/shell.c b/cmd-line-utils/readline/shell.c index 346f8113d43..5d084476bed 100644 --- a/cmd-line-utils/readline/shell.c +++ b/cmd-line-utils/readline/shell.c @@ -23,7 +23,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/signals.c b/cmd-line-utils/readline/signals.c index 54f2a642846..65c2ff308f6 100644 --- a/cmd-line-utils/readline/signals.c +++ b/cmd-line-utils/readline/signals.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include /* Just for NULL. Yuck. */ diff --git a/cmd-line-utils/readline/tcap.h b/cmd-line-utils/readline/tcap.h index 58ab894d93e..04252e72f2d 100644 --- a/cmd-line-utils/readline/tcap.h +++ b/cmd-line-utils/readline/tcap.h @@ -25,7 +25,7 @@ #define _RLTCAP_H_ #if defined (HAVE_CONFIG_H) -# include "config.h" +# include "config_readline.h" #endif #if defined (HAVE_TERMCAP_H) diff --git a/cmd-line-utils/readline/terminal.c b/cmd-line-utils/readline/terminal.c index 547f6f5dfe5..a630bc02e05 100644 --- a/cmd-line-utils/readline/terminal.c +++ b/cmd-line-utils/readline/terminal.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/text.c b/cmd-line-utils/readline/text.c index 399a48c5f1e..b26afeda525 100644 --- a/cmd-line-utils/readline/text.c +++ b/cmd-line-utils/readline/text.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #if defined (HAVE_UNISTD_H) diff --git a/cmd-line-utils/readline/tilde.c b/cmd-line-utils/readline/tilde.c index 1b76c9f2404..d50f7a0ffa4 100644 --- a/cmd-line-utils/readline/tilde.c +++ b/cmd-line-utils/readline/tilde.c @@ -20,7 +20,7 @@ Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #if defined (HAVE_UNISTD_H) diff --git a/cmd-line-utils/readline/undo.c b/cmd-line-utils/readline/undo.c index 9d9bd25ba8f..5699193b14c 100644 --- a/cmd-line-utils/readline/undo.c +++ b/cmd-line-utils/readline/undo.c @@ -23,7 +23,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/util.c b/cmd-line-utils/readline/util.c index e44ef64349d..935c9c927c2 100644 --- a/cmd-line-utils/readline/util.c +++ b/cmd-line-utils/readline/util.c @@ -22,7 +22,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/vi_mode.c b/cmd-line-utils/readline/vi_mode.c index d0b7e330adc..25213cb762f 100644 --- a/cmd-line-utils/readline/vi_mode.c +++ b/cmd-line-utils/readline/vi_mode.c @@ -32,7 +32,7 @@ #if defined (VI_MODE) #if defined (HAVE_CONFIG_H) -# include +# include "config_readline.h" #endif #include diff --git a/cmd-line-utils/readline/xmalloc.c b/cmd-line-utils/readline/xmalloc.c index 8985d340d39..cf52da351a8 100644 --- a/cmd-line-utils/readline/xmalloc.c +++ b/cmd-line-utils/readline/xmalloc.c @@ -21,7 +21,7 @@ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) -#include +#include "config_readline.h" #endif #include From d8ca1f6c8de8c54131b5d9e8e15167cd48740bf3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 11 Jan 2008 13:20:03 +0100 Subject: [PATCH 5/9] Bug#33814 - yassl problems extra/yassl/src/template_instnt.cpp: new template instantiation --- extra/yassl/src/handshake.cpp | 5 ++++ extra/yassl/src/template_instnt.cpp | 1 + extra/yassl/src/yassl_imp.cpp | 11 ++++++++- mysql-test/r/bdb_notembedded.result | 35 -------------------------- mysql-test/t/bdb_notembedded.test | 38 ----------------------------- 5 files changed, 16 insertions(+), 74 deletions(-) delete mode 100644 mysql-test/r/bdb_notembedded.result delete mode 100644 mysql-test/t/bdb_notembedded.test diff --git a/extra/yassl/src/handshake.cpp b/extra/yassl/src/handshake.cpp index 0cd0dfe9c7c..15be8eeb65d 100644 --- a/extra/yassl/src/handshake.cpp +++ b/extra/yassl/src/handshake.cpp @@ -527,6 +527,11 @@ void ProcessOldClientHello(input_buffer& input, SSL& ssl) input.read(len, sizeof(len)); uint16 randomLen; ato16(len, randomLen); + if (ch.suite_len_ > MAX_SUITE_SZ || sessionLen > ID_LEN || + randomLen > RAN_LEN) { + ssl.SetError(bad_input); + return; + } int j = 0; for (uint16 i = 0; i < ch.suite_len_; i += 3) { diff --git a/extra/yassl/src/template_instnt.cpp b/extra/yassl/src/template_instnt.cpp index f82f7924359..fe3a251b865 100644 --- a/extra/yassl/src/template_instnt.cpp +++ b/extra/yassl/src/template_instnt.cpp @@ -101,6 +101,7 @@ template void ysArrayDelete(unsigned char*); template void ysArrayDelete(char*); template int min(int, int); +template uint16 min(uint16, uint16); template unsigned int min(unsigned int, unsigned int); template unsigned long min(unsigned long, unsigned long); } diff --git a/extra/yassl/src/yassl_imp.cpp b/extra/yassl/src/yassl_imp.cpp index 0bc95f64abc..b43d9c27355 100644 --- a/extra/yassl/src/yassl_imp.cpp +++ b/extra/yassl/src/yassl_imp.cpp @@ -621,6 +621,10 @@ void HandShakeHeader::Process(input_buffer& input, SSL& ssl) } uint len = c24to32(length_); + if (len > input.get_remaining()) { + ssl.SetError(bad_input); + return; + } hashHandShake(ssl, input, len); hs->set_length(len); @@ -1391,10 +1395,15 @@ input_buffer& operator>>(input_buffer& input, ClientHello& hello) // Suites byte tmp[2]; + uint16 len; tmp[0] = input[AUTO]; tmp[1] = input[AUTO]; - ato16(tmp, hello.suite_len_); + ato16(tmp, len); + + hello.suite_len_ = min(len, static_cast(MAX_SUITE_SZ)); input.read(hello.cipher_suites_, hello.suite_len_); + if (len > hello.suite_len_) // ignore extra suites + input.set_current(input.get_current() + len - hello.suite_len_); // Compression hello.comp_len_ = input[AUTO]; diff --git a/mysql-test/r/bdb_notembedded.result b/mysql-test/r/bdb_notembedded.result deleted file mode 100644 index 14cb5fad915..00000000000 --- a/mysql-test/r/bdb_notembedded.result +++ /dev/null @@ -1,35 +0,0 @@ -set autocommit=1; -reset master; -create table bug16206 (a int); -insert into bug16206 values(1); -start transaction; -insert into bug16206 values(2); -commit; -show binlog events; -Log_name Pos Event_type Server_id End_log_pos Info -f n Format_desc 1 n Server ver: VERSION, Binlog ver: 4 -f n Query 1 n use `test`; create table bug16206 (a int) -f n Query 1 n use `test`; insert into bug16206 values(1) -f n Query 1 n use `test`; insert into bug16206 values(2) -drop table bug16206; -reset master; -create table bug16206 (a int) engine= bdb; -insert into bug16206 values(0); -insert into bug16206 values(1); -start transaction; -insert into bug16206 values(2); -commit; -insert into bug16206 values(3); -show binlog events; -Log_name Pos Event_type Server_id End_log_pos Info -f n Format_desc 1 n Server ver: VERSION, Binlog ver: 4 -f n Query 1 n use `test`; create table bug16206 (a int) engine= bdb -f n Query 1 n use `test`; insert into bug16206 values(0) -f n Query 1 n use `test`; insert into bug16206 values(1) -f n Query 1 n use `test`; BEGIN -f n Query 1 n use `test`; insert into bug16206 values(2) -f n Query 1 n use `test`; COMMIT -f n Query 1 n use `test`; insert into bug16206 values(3) -drop table bug16206; -set autocommit=0; -End of 5.0 tests diff --git a/mysql-test/t/bdb_notembedded.test b/mysql-test/t/bdb_notembedded.test deleted file mode 100644 index 24e64ebbfb2..00000000000 --- a/mysql-test/t/bdb_notembedded.test +++ /dev/null @@ -1,38 +0,0 @@ --- source include/not_embedded.inc --- source include/have_bdb.inc - -# -# Bug #16206: Superfluous COMMIT event in binlog when updating BDB in autocommit mode -# -set autocommit=1; - -let $VERSION=`select version()`; - -reset master; -create table bug16206 (a int); -insert into bug16206 values(1); -start transaction; -insert into bug16206 values(2); -commit; ---replace_result $VERSION VERSION ---replace_column 1 f 2 n 5 n -show binlog events; -drop table bug16206; - -reset master; -create table bug16206 (a int) engine= bdb; -insert into bug16206 values(0); -insert into bug16206 values(1); -start transaction; -insert into bug16206 values(2); -commit; -insert into bug16206 values(3); ---replace_result $VERSION VERSION ---replace_column 1 f 2 n 5 n -show binlog events; -drop table bug16206; - -set autocommit=0; - - ---echo End of 5.0 tests From c5f0bbd7fee8d5b612207bcedb91233ecbe73597 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 11 Jan 2008 14:47:31 +0100 Subject: [PATCH 6/9] configure.in: adjust version string configure.in: adjust version string --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index ead2f85afb7..27329c98592 100644 --- a/configure.in +++ b/configure.in @@ -7,7 +7,7 @@ AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! # remember to also change ndb version below and update version.c in ndb -AM_INIT_AUTOMAKE(mysql, 5.0.54) +AM_INIT_AUTOMAKE(mysql, 5.0.54a) AM_CONFIG_HEADER([include/config.h:config.h.in]) PROTOCOL_VERSION=10 From 14b1de4293c856eff1f05e2ec1bc857b95861e6d Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 23 Jan 2008 16:18:23 -0700 Subject: [PATCH 7/9] Add triggers to notify InnoDB developers when MySQL developers change files that they control. BitKeeper/triggers/post-commit.innodb.pl: Trigger to notify InnoDB developers about changes in InnoDB files. BitKeeper/triggers/post-incoming.innodb.pl: Trigger to notify InnoDB developers about changes in InnoDB files. BitKeeper/triggers/pre-commit.innodb.pl: Trigger to warn MySQL developers that they have changed InnoDB files, and that their changes will be sent to the InnoDB developers if they choose to commit. BitKeeper/triggers/triggers-lib.pl: Utility functions for BK triggers written in Perl. --- BitKeeper/triggers/post-commit.innodb.pl | 22 ++ BitKeeper/triggers/post-incoming.innodb.pl | 30 ++ BitKeeper/triggers/pre-commit.innodb.pl | 21 ++ BitKeeper/triggers/triggers-lib.pl | 360 +++++++++++++++++++++ 4 files changed, 433 insertions(+) create mode 100755 BitKeeper/triggers/post-commit.innodb.pl create mode 100755 BitKeeper/triggers/post-incoming.innodb.pl create mode 100755 BitKeeper/triggers/pre-commit.innodb.pl create mode 100644 BitKeeper/triggers/triggers-lib.pl diff --git a/BitKeeper/triggers/post-commit.innodb.pl b/BitKeeper/triggers/post-commit.innodb.pl new file mode 100755 index 00000000000..44d98b04838 --- /dev/null +++ b/BitKeeper/triggers/post-commit.innodb.pl @@ -0,0 +1,22 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use FindBin; +require "$FindBin::Bin/triggers-lib.pl"; + +# Don't run unless commit was successful +check_status() || exit 0; + +my $cset = latest_cset(); + +# Read most recent ChangeSet's changed files. Send merge changes along, since +# they'll need to be incorporated in InnoDB's source tree eventually. +my $changes = innodb_get_changes('cset', $cset, 'yes') + or exit 0; + +innodb_send_changes_email($cset, $changes) + or exit 1; + +exit 0; diff --git a/BitKeeper/triggers/post-incoming.innodb.pl b/BitKeeper/triggers/post-incoming.innodb.pl new file mode 100755 index 00000000000..4b100d88037 --- /dev/null +++ b/BitKeeper/triggers/post-incoming.innodb.pl @@ -0,0 +1,30 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use FindBin; +require "$FindBin::Bin/triggers-lib.pl"; + +# Don't run unless push/pull was successful +check_status() or exit 0; + +# Don't run if push/pull is in local clones +exit 0 if repository_type() eq 'local'; + +# For each pushed ChangeSet, check it for InnoDB files and send +# diff of entire ChangeSet to InnoDB developers if such changes +# exist. + +my $error = 0; + +foreach my $cset (read_bk_csetlist()) +{ + my $changes = innodb_get_changes('cset', $cset, 'yes') + or next; + + innodb_send_changes_email($cset, $changes) + or $error = 1; +} + +exit ($error == 0 ? 0 : 1); diff --git a/BitKeeper/triggers/pre-commit.innodb.pl b/BitKeeper/triggers/pre-commit.innodb.pl new file mode 100755 index 00000000000..6e2b65113b0 --- /dev/null +++ b/BitKeeper/triggers/pre-commit.innodb.pl @@ -0,0 +1,21 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use FindBin; +require "$FindBin::Bin/triggers-lib.pl"; + +die "$0: Script error: \$BK_PENDING is not set in pre-commit trigger\n" + unless defined $ENV{BK_PENDING}; + +# Read changed files from $BK_PENDING directly. Do not bother user about +# merge changes; they don't have any choice, the merge must be done. +my $changes = innodb_get_changes('file', $ENV{BK_PENDING}, undef) + or exit 0; + +innodb_inform_and_query_user($changes) + or exit 1; # Abort commit + +# OK, continue with commit +exit 0; diff --git a/BitKeeper/triggers/triggers-lib.pl b/BitKeeper/triggers/triggers-lib.pl new file mode 100644 index 00000000000..834cd9093d0 --- /dev/null +++ b/BitKeeper/triggers/triggers-lib.pl @@ -0,0 +1,360 @@ +# To use this convenience library in a trigger, simply require it at +# at the top of the script. For example: +# +# #! /usr/bin/perl +# +# use FindBin; +# require "$FindBin::Bin/triggers-lib.pl"; +# +# FindBin is needed, because sometimes a trigger is called from the +# RESYNC directory, and the trigger dir is ../BitKeeper/triggers + +use strict; +use warnings; + +use Carp; +use FindBin; + + +my $mysql_version = "5.0"; + +# These addresses must be kept current in all MySQL versions. +# See the wiki page InnoDBandOracle. +#my @innodb_to_email = ('dev_innodb_ww@oracle.com'); +#my @innodb_cc_email = ('dev-innodb@mysql.com'); +# FIXME: Keep this for testing; remove it once it's been used for a +# week or two. +my @innodb_to_email = ('tim@mysql.com'); +my @innodb_cc_email = (); + +# This is for MySQL <= 5.0. Regex which defines the InnoDB files +# which should generally not be touched by MySQL developers. +my $innodb_files_description = <> 8)), "\n"; + } + + return $status; +} + + +# check_status +# $warn If true, warn about bad status +# RETURN TRUE, if $BK_STATUS is "OK"; FALSE otherwise +# +# Also checks the undocumented $BK_COMMIT env variable + +sub check_status +{ + my ($warn) = @_; + + my $status = (grep { defined $_ } + $ENV{BK_STATUS}, $ENV{BK_COMMIT}, '')[0]; + + unless ($status eq 'OK') + { + warn "Bad BK_STATUS '$status'\n" if $warn; + return undef; + } + + return 1; +} + + +# repository_location +# +# RETURN ('HOST', 'ROOT') for the repository being modified + +sub repository_location +{ + if ($ENV{BK_SIDE} eq 'client') { + return ($ENV{BK_HOST}, $ENV{BK_ROOT}); + } else { + return ($ENV{BKD_HOST}, $ENV{BKD_ROOT}); + } +} + + +# repository_type +# RETURN: +# 'main' for repo on bk-internal with post-incoming.bugdb trigger +# 'team' for repo on bk-internal with post-incoming.queuepush.pl trigger +# 'local' otherwise +# +# This definition may need to be modified if the host name or triggers change. + +sub repository_type +{ + my ($host, $root) = repository_location(); + + return 'local' + unless uc($host) eq 'BK-INTERNAL.MYSQL.COM' + and -e "$root/BitKeeper/triggers/post-incoming.queuepush.pl"; + + return 'main' if -e "$root/BitKeeper/triggers/post-incoming.bugdb"; + + return 'team'; +} + + +# latest_cset +# RETURN Key for most recent ChangeSet + +sub latest_cset { + chomp(my $retval = `bk changes -r+ -k`); + return $retval; +} + + +# read_bk_csetlist +# RETURN list of cset keys from $BK_CSETLIST file +sub read_bk_csetlist +{ + die "$0: script error: \$BK_CSETLIST not set\n" + unless defined $ENV{BK_CSETLIST}; + + open CSETS, '<', $ENV{BK_CSETLIST} + or die "$0: can't read \$BK_CSETLIST='$ENV{BK_CSETLIST}': $!\n"; + chomp(my @csets = ); + close_or_warn(CSETS, "\$BK_CSETLIST='$ENV{BK_CSETLIST}'"); + + return @csets; +} + + +# innodb_get_changes +# $type 'file' or 'cset' +# $value file name (e.g., $BK_PENDING) or ChangeSet key +# $want_merge_changes flag; if false, merge changes will be ignored +# RETURN A string describing the InnoDB changes, or undef if no changes +# +# The return value does *not* include ChangeSet comments, only per-file +# comments. + +sub innodb_get_changes +{ + my ($type, $value, $want_merge_changes) = @_; + + if ($type eq 'file') + { + open CHANGES, '<', $value + or die "$0: can't read '$value': $!\n"; + } + elsif ($type eq 'cset') + { + open CHANGES, '-|', "bk changes -r'$value' -v -d'$file_rev_dspec'" + or die "$0: can't exec 'bk changes': $!\n"; + } + else + { + croak "$0: script error: invalid type '$type'"; + } + + my @changes = grep { /$innodb_files_regex/ } ; + + close_or_warn(CHANGES, "($type, '$value')"); + + return undef unless @changes; + + + # Set up a pipeline of 'bk log' commands to weed out unwanted deltas. We + # never want deltas which contain no actual changes. We may not want deltas + # which are merges. + + my @filters; + + # This tests if :LI: (lines inserted) or :LD: (lines deleted) is + # non-zero. That is, did this delta change the file contents? + push @filters, + "bk log -d'" + . "\$if(:LI: -gt 0){$file_rev_dspec}" + . "\$if(:LI: -eq 0){\$if(:LD: -gt 0){$file_rev_dspec}}" + . "' -"; + + push @filters, "bk log -d'\$unless(:MERGE:){$file_rev_dspec}' -" + unless $want_merge_changes; + + my $tmpname = "$bktmp/ibchanges.txt"; + my $pipeline = join(' | ', @filters) . " > $tmpname"; + open TMP, '|-', $pipeline + or die "$0: can't exec [[$pipeline]]: $!\n"; + + print TMP @changes; + close_or_warn(TMP, "| $pipeline"); + + # Use bk log to describe the changes + open LOG, "bk log - < $tmpname |" + or die "$0: can't exec 'bk log - < $tmpname': $!\n"; + my @log = ; + close_or_warn(LOG, "bk log - < $tmpname |"); + + unlink $tmpname; + + return undef unless @log; + + return join('', @log); +} + + +# Ask user if they really want to commit. +# RETURN TRUE = YES, commit; FALSE = NO, do not commit + +sub innodb_inform_and_query_user +{ + my ($description) = @_; + + my $tmpname = "$bktmp/ibquery.txt"; + + open MESSAGE, "> $tmpname" + or die "$0: can't write message to '$tmpname': $!"; + + print MESSAGE <"; + push @headers, "From: $from"; + push @headers, "To: " . (join ', ', @innodb_to_email); + push @headers, "Cc: " . (join ', ', @innodb_cc_email) if @innodb_cc_email; + push @headers, + "Subject: InnoDB changes in $type $mysql_version tree ($cset_short)"; + push @headers, "X-CSetKey: <$cset_key>"; + + print SENDMAIL map { "$_\n" } @headers, ''; + + if ($type eq 'main') + { + print SENDMAIL < Date: Wed, 23 Jan 2008 18:20:04 -0700 Subject: [PATCH 8/9] Applied innodb-5.0-ss2223 snapshot Fixes: Bug #32083: server crashes on show status when InnoDB is not initialized innodb_export_status(): Check that InnoDB has been initialized before invoking srv_export_innodb_status(). (Bug #32083) This bug does not exist in MySQL/InnoDB 5.1. sql/ha_innodb.cc: Applied innodb-5.0-ss2223 snapshot Revision r2223: branches/5.0: innodb_export_status(): Check that InnoDB has been initialized before invoking srv_export_innodb_status(). (Bug #32083) This bug does not exist in MySQL/InnoDB 5.1. --- sql/ha_innodb.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index fa68da87661..2d2007c8fdd 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -6339,7 +6339,9 @@ void innodb_export_status(void) /*======================*/ { - srv_export_innodb_status(); + if (innodb_inited) { + srv_export_innodb_status(); + } } /**************************************************************************** From e09b41cf579d6bff2ac1652871fbbbdf47ebfd98 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 24 Jan 2008 00:31:47 -0700 Subject: [PATCH 9/9] Fix bug in BK trigger for sending changes to InnoDB devs. BitKeeper/triggers/triggers-lib.pl: Fix bug in innodb_send_changes_mail() that always displayed details for the most recent changeset (-r+) instead of the $cset function argument. --- BitKeeper/triggers/triggers-lib.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BitKeeper/triggers/triggers-lib.pl b/BitKeeper/triggers/triggers-lib.pl index 834cd9093d0..1c5f7a85726 100644 --- a/BitKeeper/triggers/triggers-lib.pl +++ b/BitKeeper/triggers/triggers-lib.pl @@ -345,10 +345,10 @@ changes are in a clone of a $mysql_version tree. EOF } print SENDMAIL "\n"; - print SENDMAIL qx(bk changes -r+); + print SENDMAIL qx(bk changes -r'$cset'); print SENDMAIL "$description"; print SENDMAIL "The complete ChangeSet diffs follow.\n\n"; - print SENDMAIL qx(bk rset -r+ -ah | bk gnupatch -h -dup -T); + print SENDMAIL qx(bk rset -r'$cset' -ah | bk gnupatch -h -dup -T); close_or_warn(SENDMAIL, "$sendmail -t") or return undef;