Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / perl-5.8.0 / lib / site_perl / 5.8.0 / Psh / Builtins / Sudo.pm
CommitLineData
86530b38
AT
1package Psh::Builtins::Sudo;
2
3use strict;
4
5=item * C<sudo>
6
7Wrapper around the sudo program which sets $ENV{PATH},
8expands command aliases and defers shell globbing
9until sudo runs.
10
11=cut
12
13sub bi_sudo {
14
15 # Fix up $ENV{PATH} for root commands:
16 # Replace with sudo_replace_path (if set)
17 # Add any elements in sudo_add_path (if set)
18
19 my $path_sep = Psh::Options::get_option('array_exports')->{'path'};
20
21 my $path = Psh::Options::get_option('path');
22 my $add_path = Psh::Options::get_option('sudo_add_path');
23 my $replace_path = Psh::Options::get_option('sudo_replace_path');
24
25 @$path = @$replace_path if $replace_path and ref $replace_path eq 'ARRAY';
26 push @$path, @$add_path if $add_path and ref $add_path eq 'ARRAY';
27
28 local $ENV{'PATH'} = join $path_sep, @$path;
29
30
31 # We run sudo through a shell, in order to defer shell expansions until
32 # we are running as root. We could use any shell here (including psh)
33 # but psh takes quite a long time to start up, so the default is /bin/sh
34
35 my $sudo_shell = Psh::Options::get_option('sudo_shell');
36 $sudo_shell ||= '/bin/sh -c';
37 my @sudo_shell = split /\s+/, $sudo_shell;
38
39
40 # Parse the command line to expand the command (e.g. aliases)
41
42 my @result = Psh::Parser::parse_line($_[0], 'executable');
43
44 my $cmd = $result[0][2][4];
45
46 # Expand the 'sudo' command itself (in case it is also an alias)
47
48 @result = Psh::Parser::parse_line('sudo', 'executable');
49
50 # We want the sudo command as an array of words (for passing to system)
51 my @sudo_cmd = split /\s+/, $result[0][2][4];
52
53 system(@sudo_cmd, @sudo_shell, $cmd);
54}
55
561;
57