]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/fileutl.cc
* add "purge" commandline argument, closes: #133421)
[apt.git] / apt-pkg / contrib / fileutl.cc
index 92181472cea55b904f0c9dc4dd6da940479e3383..5d294c36a99076ac2e1435d95e84cfe3f8cda5df 100644 (file)
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/sptr.h>
+#include <apt-pkg/configuration.h>
 
 #include <apti18n.h>
 
+#include <cstdlib>
 #include <iostream>
 #include <unistd.h>
 #include <fcntl.h>
@@ -32,6 +34,7 @@
 #include <sys/wait.h>
 #include <signal.h>
 #include <errno.h>
+#include <set>
                                                                        /*}}}*/
 
 using namespace std;
@@ -306,7 +309,7 @@ bool WaitFd(int Fd,bool write,unsigned long timeout)
 /* This is used if you want to cleanse the environment for the forked 
    child, it fixes up the important signals and nukes all of the fds,
    otherwise acts like normal fork. */
-pid_t ExecFork(int dontCloseThisFd)
+pid_t ExecFork()
 {
    // Fork off the process
    pid_t Process = fork();
@@ -326,11 +329,27 @@ pid_t ExecFork(int dontCloseThisFd)
       signal(SIGWINCH,SIG_DFL);
       signal(SIGCONT,SIG_DFL);
       signal(SIGTSTP,SIG_DFL);
-      
+
+      set<int> KeepFDs;
+      Configuration::Item const *Opts = _config->Tree("APT::Keep-Fds");
+      if (Opts != 0 && Opts->Child != 0)
+      {
+        Opts = Opts->Child;
+        for (; Opts != 0; Opts = Opts->Next)
+        {
+           if (Opts->Value.empty() == true)
+              continue;
+           int fd = atoi(Opts->Value.c_str());
+           KeepFDs.insert(fd);
+        }
+      }
+
       // Close all of our FDs - just in case
       for (int K = 3; K != 40; K++)
-        if(K != dontCloseThisFd)
+      {
+        if(KeepFDs.find(K) == KeepFDs.end())
            fcntl(K,F_SETFD,FD_CLOEXEC);
+      }
    }
    
    return Process;
@@ -356,7 +375,7 @@ bool ExecWait(pid_t Pid,const char *Name,bool Reap)
       if (Reap == true)
         return false;
       
-      return _error->Error(_("Waited, for %s but it wasn't there"),Name);
+      return _error->Error(_("Waited for %s but it wasn't there"),Name);
    }