diff options
author | Michael Vogt <michael.vogt@ubuntu.com> | 2005-08-05 11:59:11 +0000 |
---|---|---|
committer | Michael Vogt <michael.vogt@ubuntu.com> | 2005-08-05 11:59:11 +0000 |
commit | f77bf408f3f7ae650bac2a967f28610737acf1ab (patch) | |
tree | 5accceacc75700babd93772e813f3a6ef9fa9144 /apt-pkg/contrib | |
parent | 93abae08dbdac43c8ddb4f83c966b16ea7d0107c (diff) |
* merged with apt@packages.debian.org/apt--main--0
Patches applied:
* apt@packages.debian.org/apt--main--0--patch-100
Use debian.org address in mainline
* apt@packages.debian.org/apt--main--0--patch-101
Update pot file
* apt@packages.debian.org/apt--main--0--patch-102
Open 0.6.40
* apt@packages.debian.org/apt--main--0--patch-103
Patch from Jordi Mallach to mark some additional strings for translation
* apt@packages.debian.org/apt--main--0--patch-104
Updated Catalan translation from Jordi Mallach
* apt@packages.debian.org/apt--main--0--patch-105
Merge from bubulle@debian.org--2005/apt--main--0
* apt@packages.debian.org/apt--main--0--patch-106
Restore lost changelog entries
* apt@packages.debian.org/apt--main--0--patch-107
Merge michael.vogt@ubuntu.com--2005/apt--progress-reporting--0
* apt@packages.debian.org/apt--main--0--patch-108
Merge michael.vogt@ubuntu.com--2005/apt--progress-reporting--0
* bubulle@debian.org--2005/apt--main--0--patch-90
Merge with Matt
* bubulle@debian.org--2005/apt--main--0--patch-91
Updated Slovak translation
* bubulle@debian.org--2005/apt--main--0--patch-92
Add apt-key French man page
* bubulle@debian.org--2005/apt--main--0--patch-93
Update Greek translations
* bubulle@debian.org--2005/apt--main--0--patch-94
Merge with Matt
* bubulle@debian.org--2005/apt--main--0--patch-95
Sync PO files with the POT file/French translation update
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--base-0
tag of apt@packages.debian.org/apt--main--0--patch-85
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-1
* inital proof of concept code, understands what dpkg tells it already
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-2
* progress reporting works now
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-3
* added "APT::Status-Fd" variable
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-4
* do i18n now too
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-5
* define N_(x) if it is not defined already
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-6
* PackageManager::DoInstall(int status_fd) added (does not break the ABI)
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-7
* merged with apt--fixes--0 to make it build again
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-8
* added support for "error" and "conffile-prompt" messages from dpkg
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-9
merge with main
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-10
* use sizeof() for all snprintf() uses; fix a potential line break problem in the status reading code; changed the N_() to _() calls
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-11
* added APT::KeepFDs configuration list for file descriptors that apt should leave open (needed for various frontends like debconf, synaptic)
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-12
* fixed a API breakage
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-13
* doc added, should be releasable now
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-14
* merged with apt--main--0
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-15
* more source comments, added Debug::DpkgPM debug code to inspect the dpkg<->apt communication, broke the abi (ok with matt)
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-16
* the progress reporting has it's own "Debug::pkgDPkgProgressReporting" debug variable now
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-17
* merged PackageOps and TranslatedPackageOps into a single Map with the new DpkgState struct
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-18
* clear the APT::Keep-Fds configuration when it's no longer needed
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-19
* rewrote the reading from dpkg so that it never blocks
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-20
* merged the two status arrays into one
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-21
* added support for download progress reporting too (for Kamion and base-config)
* michael.vogt@ubuntu.com--2005/apt--progress-reporting--0--patch-22
* ABI break; added Configuration::Clear(string List, {int,string} value) added (to remove a single Value from a list); test/conf_clear.cc added
Diffstat (limited to 'apt-pkg/contrib')
-rw-r--r-- | apt-pkg/contrib/configuration.cc | 46 | ||||
-rw-r--r-- | apt-pkg/contrib/configuration.h | 7 | ||||
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 24 | ||||
-rw-r--r-- | apt-pkg/contrib/fileutl.h | 2 |
4 files changed, 72 insertions, 7 deletions
diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index 69f8d1dca..4b2c0fbb5 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -327,15 +327,57 @@ void Configuration::Set(const char *Name,int Value) Itm->Value = S; } /*}}}*/ +// Configuration::Clear - Clear an single value from a list /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void Configuration::Clear(string Name, int Value) +{ + char S[300]; + snprintf(S,sizeof(S),"%i",Value); + Clear(Name, S); +} + /*}}}*/ +// Configuration::Clear - Clear an single value from a list /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void Configuration::Clear(string Name, string Value) +{ + Item *Top = Lookup(Name.c_str(),false); + if (Top == 0 || Top->Child == 0) + return; + + Item *Tmp, *Prev, *I; + Prev = I = Top->Child; + + while(I != NULL) + { + if(I->Value == Value) + { + Tmp = I; + // was first element, point parent to new first element + if(Top->Child == Tmp) + Top->Child = I->Next; + I = I->Next; + Prev->Next = I; + delete Tmp; + } else { + Prev = I; + I = I->Next; + } + } + +} + /*}}}*/ // Configuration::Clear - Clear an entire tree /*{{{*/ // --------------------------------------------------------------------- /* */ void Configuration::Clear(string Name) { Item *Top = Lookup(Name.c_str(),false); - if (Top == 0) + if (Top == 0) { + cout << "config item: " << Name << " not found" << endl; return; - + } Top->Value = string(); Item *Stop = Top; Top = Top->Child; diff --git a/apt-pkg/contrib/configuration.h b/apt-pkg/contrib/configuration.h index 0ed8f59d3..789bc82cf 100644 --- a/apt-pkg/contrib/configuration.h +++ b/apt-pkg/contrib/configuration.h @@ -87,8 +87,13 @@ class Configuration bool Exists(const char *Name) const; bool ExistsAny(const char *Name) const; + // clear a whole tree void Clear(string Name); - + + // remove a certain value from a list (e.g. the list of "APT::Keep-Fds") + void Clear(string List, string Value); + void Clear(string List, int Value); + inline const Item *Tree(const char *Name) const {return Lookup(Name);}; inline void Dump() { Dump(std::clog); }; diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index 0ce0c9b9d..9fd71728e 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -20,6 +20,7 @@ #include <apt-pkg/fileutl.h> #include <apt-pkg/error.h> #include <apt-pkg/sptr.h> +#include <apt-pkg/configuration.h> #include <apti18n.h> @@ -32,6 +33,7 @@ #include <sys/wait.h> #include <signal.h> #include <errno.h> +#include <set> /*}}}*/ 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. */ -pid_t ExecFork(int dontCloseThisFd) +pid_t ExecFork() { // Fork off the process pid_t Process = fork(); @@ -326,11 +328,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; diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 4716e261e..041aa3309 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -87,7 +87,7 @@ string SafeGetCWD(); void SetCloseExec(int Fd,bool Close); void SetNonBlock(int Fd,bool Block); bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0); -pid_t ExecFork(int dontCloseThisFd=-1); +pid_t ExecFork(); bool ExecWait(pid_t Pid,const char *Name,bool Reap = false); // File string manipulators |