home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / run_program.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  1.4 KB  |  62 lines

  1. package run_program;
  2.  
  3.  
  4.  
  5.  
  6. use log;
  7.  
  8. 1;
  9.  
  10. sub run($@) { rooted('', @_) }
  11.  
  12. sub rooted {
  13.     my ($root, $name, @args) = @_;
  14.     my $str = ref $name ? $name->[0] : $name;
  15.     log::l("running: $str @args" . ($root ? " with root $root" : ""));
  16.  
  17.     return 1 if $root && $<;
  18.  
  19.     $root ? $root .= '/' : ($root = '');
  20.  
  21.     if (my $pid = fork) {
  22.     waitpid $pid, 0;
  23.     return $? == 0;
  24.     }
  25.     {
  26.     my ($stdout, $stdoutm, $stderr, $stderrm);
  27.     ($stdoutm, $stdout, @args) = @args if $args[0] =~ /^>>?$/;
  28.     ($stderrm, $stderr, @args) = @args if $args[0] =~ /^2>>?$/;
  29.  
  30.     open STDIN, "/dev/null" or die "can't open /dev/null as stdin";
  31.  
  32.     if ($stderr) {
  33.         $stderrm =~ s/2//;
  34.         open STDERR, "$stderrm $root$stderr" or die "run_program can't output in $root$stderr (mode `$stderrm')";
  35.     } else {
  36.         open STDERR, ">> /dev/tty7" or open STDERR, ">> /tmp/exec.log" or die "run_program can't log :(";
  37.     }
  38.     if ($stdout) {
  39.         open STDOUT, "$stdoutm $root$stdout" or die "run_program can't output in $root$stdout (mode `$stdoutm')";
  40.     } else {
  41.         open STDOUT, ">> /dev/tty7" or open STDOUT, ">> /tmp/exec.log" or die "run_program can't log :(";
  42.     }
  43.  
  44.     $root and chroot $root;
  45.     chdir "/";
  46.  
  47.     if (ref $name) {
  48.         unless (exec { $name->[0] } $name->[1], @args) {
  49.         log::l("exec of $name->[0] failed: $!");
  50.         c::_exit(1);
  51.         }
  52.     } else {
  53.         unless (exec $name, @args) {
  54.         log::l("exec of $name failed: $!");
  55.         c::_exit(1);
  56.         }
  57.  
  58.     }
  59.     }
  60.  
  61. }
  62.