perl 5.002gamma: lib/Getopt/Long.pm
[p5sagit/p5-mst-13.2.git] / lib / Shell.pm
1 package Shell;
2
3 use Config;
4
5 sub 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
20 AUTOLOAD {
21     my $cmd = $AUTOLOAD;
22     $cmd =~ s/^.*:://;
23     eval qq {
24         sub $AUTOLOAD {
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                 }
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
77 1;