]> git.proxmox.com Git - pve-common.git/blobdiff - data/PVE/Tools.pm
add shellquote utility function
[pve-common.git] / data / PVE / Tools.pm
index 4f85564a5a51aa885558a5040e86a07f13d12156..78d7b9f2140026d4d6d1d4142773a768a05b017d 100644 (file)
@@ -225,6 +225,15 @@ sub run_command {
            local $ENV{LVM_SUPPRESS_FD_WARNINGS} = "1";
 
            $pid = open3($writer, $reader, $error, @$cmd) || die $!;
+
+           # if we pipe fron STDIN, open3 closes STDIN, so we we
+           # a perl warning "Filehandle STDIN reopened as GENXYZ .. "
+           # as soon as we open a new file.
+           # to avoid that we open /dev/null
+           if (!ref($writer) && !defined(fileno(STDIN))) {
+               POSIX::close(0);
+               open(STDIN, "</dev/null");
+           }
        };
 
        my $err = $@;
@@ -241,11 +250,13 @@ sub run_command {
        local $SIG{ALRM} = sub { die "got timeout\n"; } if $timeout;
        $oldtimeout = alarm($timeout) if $timeout;
 
-       print $writer $input if defined $input;
-       close $writer;
+       if (ref($writer)) {
+           print $writer $input if defined $input;
+           close $writer;
+       }
 
        my $select = new IO::Select;
-       $select->add($reader);
+       $select->add($reader) if ref($reader);
        $select->add($error);
 
        my $outlog = '';
@@ -676,4 +687,26 @@ sub random_ether_addr {
     return $mac;
 }
 
+sub shellquote {
+    my $str = shift;
+
+    return "''" if !defined ($str) || ($str eq '');
+    
+    die "unable to quote string containing null (\\000) bytes"
+       if $str =~ m/\x00/;
+
+    # from String::ShellQuote
+    if ($str =~ m|[^\w!%+,\-./:@^]|) {
+
+       # ' -> '\''
+       $str =~ s/'/'\\''/g;
+
+       $str = "'$str'";
+       $str =~ s/^''//;
+       $str =~ s/''$//;
+    }
+
+    return $str;
+}
+
 1;