~mathiaz/ubuntu/lucid/mysql-dfsg-5.1/zap-bug-552053

« back to all changes in this revision

Viewing changes to mysql-test/lib/My/SafeProcess/Base.pm

  • Committer: Bazaar Package Importer
  • Author(s): Mathias Gug
  • Date: 2009-06-25 12:55:45 UTC
  • mfrom: (1.1.2 upstream) (0.1.3 experimental)
  • Revision ID: james.westby@ubuntu.com-20090625125545-m8ogs96zzsri74xe
Tags: 5.1.34-1ubuntu1
* Merge from debian experimental (and 5.0 from main), remaining changes:
  - debian/mysql-server-5.1.config:
    + ask for MySQL root password at priority high instead of medium so
      that the password prompt is seen on a default install. (LP: #319843)
    + don't ask for root password when upgrading from a 5.0 install.
  - debian/control:
    + Make libmysqlclient16-dev a transitional package depending on
      libmysqlclient-dev.
    + Make libmysqlclient-dev conflict with libmysqlclient15-dev.
    + Don't build mysql-server, mysql-client, mysql-common and
      libmysqlclient15-dev binary packages since they're still provided
      by mysql-dfsg-5.0.
    + Make mysql-{client,server}-5.1 packages conflict and
      replace mysql-{client,server}-5.0, but not provide
      mysql-{client,server}.
    + Depend on a specific version of mysql-common rather than the src
      version of mysql-dfsg-5.1 since mysql-common is currently part of
      mysql-dfsg-5.0.
    + Lower mailx from a Recommends to a Suggests to avoid pulling in
      a full MTA on all installs of mysql-server. (LP: #259477)
  - debian/rules:
    + added -fno-strict-aliasing to CFLAGS to get around mysql testsuite
      build failures.
    + install mysql-test and sql-bench to /usr/share/mysql/ rather than
      /usr/.
  - debian/additions/debian-start.inc.sh: support ANSI mode (LP: #310211)
  - Add AppArmor profile:
    - debian/apparmor-profile: apparmor profile.
    - debian/rules, debian/mysql-server-5.0.files: install apparmor profile.
    - debian/mysql-server-5.0.dirs: add etc/apparmor.d/force-complain
    - debian/mysql-server-5.0.postrm: remove symlink in force-complain/ on
      purge.
    - debian/mysql-server-5.1.README.Debian: add apparmor documentation.
    - debian/additions/my.cnf: Add warning about apparmor. (LP: #201799)
    - debian/mysql-server-5.1.postinst: reload apparmor profiles.
  - debian/additions/my.cnf: remove language option. Error message files are
    located in a different directory in MySQL 5.0. Setting the language
    option to use /usr/share/mysql/english breaks 5.0. Both 5.0 and 5.1
    use a default value that works. (LP: #316974)
  - debian/mysql-server-5.1.mysql.init:
    + Clearly indicate that we do not support running multiple instances
      of mysqld by duplicating the init script.
      (closes: #314785, #324834, #435165, #444216)
    + Properly parameterize all existing references to the mysql config
      file (/etc/mysql/my.cnf).
  - debian/mysql-server-5.0.postinst: Clear out the second password
    when setting up mysql. (LP: #344816)
  - mysql-server-core-5.1 package for files needed by Akonadi:
    + debian/control: create mysql-server-core-5.1 package.
    + debian/mysql-server-core-5.1.files, debian/mysql-server-5.1.files:
      move core mysqld files to mysql-server-core-5.1 package.
  - Don't package sql-bench and mysql-test file.
* Dropped changes:
  - debian/patches/92_ssl_test_cert.dpatch: certificate expiration in
    test suite (LP: #323755). Included upstream.
* Dropped from 5.0:
  - apparmor profile:
    - debian/control: Recommends apparmor >= 2.1+1075-0ubuntu6. All version
      of apparmor-profile (>hardy) are higher than this version.
    - debian/mysql-server-5.0.preinst: create symlink for force-complain/
      on pre-feisty upgrades, upgrades where apparmor-profiles profile is
      unchanged (ie non-enforcing) and upgrades where the profile
      doesn't exist. Support for pre-hardy upgrades is no longer needed.
* debian/mysql-server-5.1.postinst: fix debian-sys-maint user creation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- cperl -*-
 
2
# Copyright (C) 2004-2006 MySQL AB
 
3
#
 
4
# This program is free software; you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation; version 2 of the License.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
16
 
 
17
# This is a library file used by the Perl version of mysql-test-run,
 
18
# and is part of the translation of the Bourne shell script with the
 
19
# same name.
 
20
 
 
21
use strict;
 
22
 
 
23
package My::SafeProcess::Base;
 
24
 
 
25
#
 
26
# Utility functions for Process management
 
27
#
 
28
 
 
29
use Carp;
 
30
use IO::Pipe;
 
31
 
 
32
use base qw(Exporter);
 
33
our @EXPORT= qw(create_process);
 
34
 
 
35
 
 
36
 
 
37
#
 
38
# safe_fork
 
39
#   Retry a couple of times if fork returns EAGAIN
 
40
#
 
41
sub _safe_fork {
 
42
  my $retries= 5;
 
43
  my $pid;
 
44
 
 
45
 FORK:
 
46
  {
 
47
    $pid= fork;
 
48
    if ( not defined($pid)) {
 
49
 
 
50
      croak("fork failed after: $!") if (!$retries--);
 
51
 
 
52
      warn("fork failed sleep 1 second and redo: $!");
 
53
      sleep(1);
 
54
      redo FORK;
 
55
    }
 
56
  }
 
57
 
 
58
  return $pid;
 
59
};
 
60
 
 
61
 
 
62
#
 
63
# Decode exit status
 
64
#
 
65
sub exit_status {
 
66
  my $self= shift;
 
67
  my $raw= $self->{EXIT_STATUS};
 
68
 
 
69
  croak("Can't call exit_status before process has died")
 
70
    unless defined $raw;
 
71
 
 
72
  if ($raw & 127)
 
73
  {
 
74
    # Killed by signal
 
75
    my $signal_num=  $raw & 127;
 
76
    my $dumped_core= $raw & 128;
 
77
    return 1; # Return error code
 
78
  }
 
79
  else
 
80
  {
 
81
    # Normal process exit
 
82
    return $raw >> 8;
 
83
  };
 
84
}
 
85
 
 
86
 
 
87
#
 
88
# Create a new process
 
89
# Return pid of the new process
 
90
#
 
91
sub create_process {
 
92
  my %opts=
 
93
    (
 
94
     @_
 
95
    );
 
96
 
 
97
  my $path     = delete($opts{'path'})    or die "path required";
 
98
  my $args     = delete($opts{'args'})    or die "args required";
 
99
  my $input    = delete($opts{'input'});
 
100
  my $output   = delete($opts{'output'});
 
101
  my $error    = delete($opts{'error'});
 
102
 
 
103
  my $open_mode= $opts{append} ? ">>" : ">";
 
104
 
 
105
  if ($^O eq "MSWin32"){
 
106
 
 
107
    #printf STDERR "stdin %d, stdout %d, stderr %d\n",
 
108
    #    fileno STDIN, fileno STDOUT, fileno STDERR;
 
109
 
 
110
    # input output redirect
 
111
    my ($oldin, $oldout, $olderr);
 
112
    open $oldin,  '<&', \*STDIN  or die "Failed to save old stdin: $!";
 
113
    open $oldout, '>&', \*STDOUT or die "Failed to save old stdout: $!";
 
114
    open $olderr, '>&', \*STDERR or die "Failed to save old stderr: $!";
 
115
 
 
116
    if ( $input ) {
 
117
      if ( ! open(STDIN, "<", $input) ) {
 
118
        croak("can't redirect STDIN to '$input': $!");
 
119
      }
 
120
    }
 
121
 
 
122
    if ( $output ) {
 
123
      if ( ! open(STDOUT, $open_mode, $output) ) {
 
124
        croak("can't redirect STDOUT to '$output': $!");
 
125
      }
 
126
    }
 
127
 
 
128
    if ( $error ) {
 
129
      if ( $output eq $error ) {
 
130
        if ( ! open(STDERR, ">&STDOUT") ) {
 
131
          croak("can't dup STDOUT: $!");
 
132
        }
 
133
      }
 
134
      elsif ( ! open(STDERR, $open_mode, $error) ) {
 
135
        croak("can't redirect STDERR to '$error': $!");
 
136
      }
 
137
    }
 
138
 
 
139
 
 
140
    # Magic use of 'system(1, @args)' to spawn a process
 
141
    # and get a proper Win32 pid
 
142
    unshift (@$args, $path);
 
143
    my $pid= system(1, @$args);
 
144
    if ( $pid == 0 ){
 
145
      print $olderr "create_process failed: $^E\n";
 
146
      die "create_process failed: $^E";
 
147
    }
 
148
 
 
149
    # Retore IO redirects
 
150
    open STDERR, '>&', $olderr
 
151
      or croak("unable to reestablish STDERR");
 
152
    open STDOUT, '>&', $oldout
 
153
      or croak("unable to reestablish STDOUT");
 
154
    open STDIN, '<&', $oldin
 
155
      or croak("unable to reestablish STDIN");
 
156
    #printf STDERR "stdin %d, stdout %d, stderr %d\n",
 
157
    #    fileno STDIN, fileno STDOUT, fileno STDERR;
 
158
    return $pid;
 
159
 
 
160
  }
 
161
 
 
162
  local $SIG{PIPE}= sub { print STDERR "Got signal $@\n"; };
 
163
  my $pipe= IO::Pipe->new();
 
164
  my $pid= _safe_fork();
 
165
  if ($pid){
 
166
    # Parent
 
167
    $pipe->reader();
 
168
    my $line= <$pipe>; # Wait for child to say it's ready
 
169
    return $pid;
 
170
  }
 
171
 
 
172
  $SIG{INT}= 'DEFAULT';
 
173
 
 
174
  # Make this process it's own process group to be able to kill
 
175
  # it and any childs(that hasn't changed group themself)
 
176
  setpgrp(0,0) if $opts{setpgrp};
 
177
 
 
178
  if ( $output and !open(STDOUT, $open_mode, $output) ) {
 
179
    croak("can't redirect STDOUT to '$output': $!");
 
180
  }
 
181
 
 
182
  if ( $error ) {
 
183
    if ( defined $output and $output eq $error ) {
 
184
      if ( ! open(STDERR, ">&STDOUT") ) {
 
185
        croak("can't dup STDOUT: $!");
 
186
      }
 
187
    }
 
188
    elsif ( ! open(STDERR, $open_mode, $error) ) {
 
189
      croak("can't redirect STDERR to '$error': $!");
 
190
    }
 
191
  }
 
192
 
 
193
  if ( $input ) {
 
194
    if ( ! open(STDIN, "<", $input) ) {
 
195
      croak("can't redirect STDIN to '$input': $!");
 
196
    }
 
197
  }
 
198
 
 
199
  # Tell parent to continue
 
200
  $pipe->writer();
 
201
  print $pipe "ready\n";
 
202
 
 
203
  if ( !exec($path, @$args) ){
 
204
    croak("Failed to exec '$path': $!");
 
205
  }
 
206
 
 
207
  croak("Should never come here");
 
208
 
 
209
}
 
210
 
 
211
1;
 
212