The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Apache::SubProcess;

use strict;
use DynaLoader ();
use Exporter ();
*import = \&Exporter::import;

{
    no strict;
    $VERSION = '0.03';
    @ISA = qw(DynaLoader);
    if ($ENV{MOD_PERL}) {
	__PACKAGE__->bootstrap($VERSION);
    }
    @EXPORT_OK = qw(system exec);
}

sub parse_pgm {
    my $list = shift;
    my($pgm, @args) = split /\s+/, shift @$list;
    push @args, @$list if @$list;
    return($pgm, \@args);
}

sub __system {
    my($is_exec, $aref) = @_;
    
    my $r = Apache->request;
    my($pgm, $args) = parse_pgm($aref);
    #warn "__system: $pgm ", (map { "`$_', " } @$args), "\n";
    my $fh = $r->spawn_child(sub {
	my $r = shift;
	$r->filename($pgm);
	$r->args(join '+', @$args) if @$args;
	$r->call_exec;
    });
    $r->send_fd($fh);
    $r->pfclose($fh);
    if ($is_exec) {
	$ENV{PERL_DESTRUCT_LEVEL} = -2;
	Apache::exit(-2);
    }
}

sub system {
    __system(0, \@_);
}

sub exec {
    __system(1, \@_);
}

1;
__END__->