]> err.no Git - dpkg/commitdiff
Dpkg::IPC: Modify fork_and_exec() to handle environment variables
authorRaphael Hertzog <hertzog@debian.org>
Wed, 20 Feb 2008 17:09:26 +0000 (18:09 +0100)
committerRaphael Hertzog <hertzog@debian.org>
Wed, 20 Feb 2008 17:09:26 +0000 (18:09 +0100)
* scripts/Dpkg/IPC.pm (fork_and_exec): Add a new "env" option
that enables setting environment variables in the child process.

scripts/Dpkg/IPC.pm

index 5e96d5995db9b70578c28e0955d66fe6e09d3894..5af0e13e0a6e3f4b0d0e828f1a196bd5ae9df587 100644 (file)
@@ -106,6 +106,11 @@ but not the pid.
 Scalar. The child process will chdir in the indicated directory before
 calling exec.
 
+=item env
+
+Hash reference. The child process will populate %ENV with the items of the
+hash before calling exec. This allows exporting environment variables.
+
 =back
 
 =cut
@@ -129,10 +134,14 @@ sub _sanity_check_opts {
     foreach (qw(to_string from_string to_pipe from_pipe)) {
        if (exists $opts{$_} and
            (!ref($opts{$_}) or ref($opts{$_}) ne 'SCALAR')) {
-           error("paramter $_ must be a scalar reference");
+           error("parameter $_ must be a scalar reference");
        }
     }
 
+    if (exists $opts{"env"} and ref($opts{"env"}) ne 'HASH') {
+       error("parameter env must be a hash reference");
+    }
+
     return %opts;
 }
 
@@ -173,6 +182,13 @@ sub fork_and_exec {
     my $pid = fork();
     syserr(_g("fork for %s"), "@prog") unless defined $pid;
     if (not $pid) {
+       # Define environment variables
+       if ($opts{"env"}) {
+           foreach (keys %{$opts{"env"}}) {
+               $ENV{$_} = $opts{"env"}{$_};
+           }
+       }
+       # Change the current directory
        if ($opts{"chdir"}) {
            chdir($opts{"chdir"}) || syserr(_g("chdir to %s"), $opts{"chdir"});
        }