New file, part of MakeMaker 5.21.
[p5sagit/p5-mst-13.2.git] / lib / Shell.pm
CommitLineData
a0d0e21e 1package Shell;
2
4633a7c4 3use Config;
4
a0d0e21e 5sub import {
6 my $self = shift;
7 my ($callpack, $callfile, $callline) = caller;
8 my @EXPORT;
9 if (@_) {
10 @EXPORT = @_;
11 }
12 else {
13 @EXPORT = 'AUTOLOAD';
14 }
15 foreach $sym (@EXPORT) {
16 *{"${callpack}::$sym"} = \&{"Shell::$sym"};
17 }
18};
19
20AUTOLOAD {
21 my $cmd = $AUTOLOAD;
22 $cmd =~ s/^.*:://;
23 eval qq {
24 sub $AUTOLOAD {
4633a7c4 25 if (\@_ < 1) {
26 `$cmd`;
27 }
28 elsif (\$Config{'archname'} eq 'os2') {
29 local(\*SAVEOUT, \*READ, \*WRITE);
30
31 open SAVEOUT, '>&STDOUT' or die;
32 pipe READ, WRITE or die;
33 open STDOUT, '>&WRITE' or die;
34 close WRITE;
35
36 my \$pid = system(1, \$cmd, \@_);
37 die "Can't execute $cmd: \$!\n" if \$pid < 0;
38
39 open STDOUT, '>&SAVEOUT' or die;
40 close SAVEOUT;
41
42 if (wantarray) {
43 my \@ret = <READ>;
44 close READ;
45 waitpid \$pid, 0;
46 \@ret;
47 }
48 else {
49 local(\$/) = undef;
50 my \$ret = <READ>;
51 close READ;
52 waitpid \$pid, 0;
53 \$ret;
54 }
a0d0e21e 55 }
56 else {
57 open(SUBPROC, "-|")
58 or exec '$cmd', \@_
59 or die "Can't exec $cmd: \$!\n";
60 if (wantarray) {
61 my \@ret = <SUBPROC>;
62 close SUBPROC; # XXX Oughta use a destructor.
63 \@ret;
64 }
65 else {
66 local(\$/) = undef;
67 my \$ret = <SUBPROC>;
68 close SUBPROC;
69 \$ret;
70 }
71 }
72 }
73 };
74 goto &$AUTOLOAD;
75}
76
771;