From: Max Kanat-Alexander Date: Mon, 1 Feb 2010 17:54:47 +0000 (-0800) Subject: Bug 480968: Make checksetup.pl never show popup windows for errors, on Windows, to... X-Git-Tag: bugzilla-3.4.5~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=18dbcab1f576e018f08c8915a6a4ec098118c7a5;p=thirdparty%2Fbugzilla.git Bug 480968: Make checksetup.pl never show popup windows for errors, on Windows, to work around the error that pops up every time it tries to load DBD::Oracle. Patch by Max Kanat-Alexander r=Wurblzap, a=mkanat --- diff --git a/Bugzilla/Install/Util.pm b/Bugzilla/Install/Util.pm index 35a855e8d7..d9a564f105 100644 --- a/Bugzilla/Install/Util.pm +++ b/Bugzilla/Install/Util.pm @@ -43,6 +43,7 @@ our @EXPORT_OK = qw( template_include_path vers_cmp get_console_locale + prevent_windows_dialog_boxes ); sub bin_loc { @@ -332,6 +333,26 @@ sub get_console_locale { return $locale; } +sub prevent_windows_dialog_boxes { + # This code comes from http://bugs.activestate.com/show_bug.cgi?id=82183 + # and prevents Perl modules from popping up dialog boxes, particularly + # during checksetup (since loading DBD::Oracle during checksetup when + # Oracle isn't installed causes a scary popup and pauses checksetup). + # + # Win32::API ships with ActiveState by default, though there could + # theoretically be a Windows installation without it, I suppose. + if (ON_WINDOWS and eval { require Win32::API }) { + # Call kernel32.SetErrorMode with arguments that mean: + # "The system does not display the critical-error-handler message box. + # Instead, the system sends the error to the calling process." and + # "A child process inherits the error mode of its parent process." + my $SetErrorMode = Win32::API->new('kernel32', 'SetErrorMode', + 'I', 'I'); + my $SEM_FAILCRITICALERRORS = 0x0001; + my $SEM_NOGPFAULTERRORBOX = 0x0002; + $SetErrorMode->Call($SEM_FAILCRITICALERRORS | $SEM_NOGPFAULTERRORBOX); + } +} # This is like request_cache, but it's used only by installation code # for setup.cgi and things like that. diff --git a/checksetup.pl b/checksetup.pl index da368a822c..2c29d4e389 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -53,12 +53,15 @@ BEGIN { chdir dirname($0); } use lib qw(. lib); use Bugzilla::Constants; use Bugzilla::Install::Requirements; -use Bugzilla::Install::Util qw(install_string get_version_and_os get_console_locale); +use Bugzilla::Install::Util qw(install_string get_version_and_os + get_console_locale + prevent_windows_dialog_boxes); ###################################################################### # Live Code ###################################################################### +prevent_windows_dialog_boxes(); # When we're running at the command line, we need to pick the right # language before ever displaying any string. $ENV{'HTTP_ACCEPT_LANGUAGE'} ||= get_console_locale();