X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/171c45bcc2a0a59db27f6bfc142efdd466cdd8bc..89b70b5a5c80b15d928b6593604bacc02a1b9a51:/apt-pkg/contrib/fileutl.cc diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index 00afc8050..9fd71728e 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: fileutl.cc,v 1.41 2002/04/24 05:02:40 jgg Exp $ +// $Id: fileutl.cc,v 1.42 2002/09/14 05:29:22 jgg Exp $ /* ###################################################################### File Utilities @@ -9,7 +9,7 @@ GetLock - dpkg compatible lock file manipulation (fcntl) This source is placed in the Public Domain, do with it what you will - It was originally written by Jason Gunthorpe. + It was originally written by Jason Gunthorpe . ##################################################################### */ /*}}}*/ @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -32,6 +33,7 @@ #include #include #include +#include /*}}}*/ using namespace std; @@ -306,7 +308,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. */ -int ExecFork() +pid_t ExecFork() { // Fork off the process pid_t Process = fork(); @@ -326,10 +328,27 @@ int ExecFork() signal(SIGWINCH,SIG_DFL); signal(SIGCONT,SIG_DFL); signal(SIGTSTP,SIG_DFL); - + + set 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++) - fcntl(K,F_SETFD,FD_CLOEXEC); + { + if(KeepFDs.find(K) == KeepFDs.end()) + fcntl(K,F_SETFD,FD_CLOEXEC); + } } return Process; @@ -340,7 +359,7 @@ int ExecFork() /* Waits for the given sub process. If Reap is set then no errors are generated. Otherwise a failed subprocess will generate a proper descriptive message */ -bool ExecWait(int Pid,const char *Name,bool Reap) +bool ExecWait(pid_t Pid,const char *Name,bool Reap) { if (Pid <= 1) return true; @@ -355,7 +374,7 @@ bool ExecWait(int 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); }