diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-07-19 18:20:38 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2016-07-19 18:20:38 +0200 |
commit | 475f75506db48a7fa90711fce4ed129f6a14cc9a (patch) | |
tree | ee4682166475a14a47c71b4dd6aa8a24c2c29229 /apt-pkg/deb/debsystem.cc | |
parent | bbd8308cc01941e51e2cbcf88168a5560abe6042 (diff) |
don't hardcode /var/lib/dpkg/status as dir::state::status
Theoretically it should be enough to change the Dir setting and have apt
pick the dpkg/status file from that. Also, it should be consistently
effected by RootDir. Both wasn't really the case through, so a user had
to explicitly set it too (or ignore it and have or not have expected
sideeffects caused by it).
This commit tries to guess better the location of the dpkg/status file
by setting dir::state::status to a naive "../dpkg/status", just that
this setting would be interpreted as relative to the CWD and not
relative to the dir::state directory. Also, the status file isn't really
relative to the state files apt has in /var/lib/apt/ as evident if we
consider that apt/ could be a symlink to someplace else and "../dpkg"
not effected by it, so what we do here is an explicit replace on apt/
– similar to how we create directories if it ends in apt/ – with dpkg/.
As this is a change it has the potential to cause regressions in so far
as the dpkg/status file of the "host" system is no longer used if you
set a "chroot" system via the Dir setting – but that tends to be
intended and causes people to painfully figure out that they had to set
this explicitly before, so that it now works more in terms of how the
other Dir settings work (aka "as expected"). If using the host status
file is really intended it is in fact easier to set this explicitely
compared to setting the new "magic" location explicitely.
Diffstat (limited to 'apt-pkg/deb/debsystem.cc')
-rw-r--r-- | apt-pkg/deb/debsystem.cc | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index e2b1df950..fd702b3c6 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -86,7 +86,7 @@ bool debSystem::Lock() } // Create the lockfile - string AdminDir = flNotFile(_config->Find("Dir::State::status")); + string AdminDir = flNotFile(_config->FindFile("Dir::State::status")); d->LockFD = GetLock(AdminDir + "lock"); if (d->LockFD == -1) { @@ -145,7 +145,7 @@ bool debSystem::UnLock(bool NoErrors) bool debSystem::CheckUpdates() { // Check for updates.. (dirty) - string File = flNotFile(_config->Find("Dir::State::status")) + "updates/"; + string File = flNotFile(_config->FindFile("Dir::State::status")) + "updates/"; DIR *DirP = opendir(File.c_str()); if (DirP == 0) return false; @@ -184,13 +184,35 @@ pkgPackageManager *debSystem::CreatePM(pkgDepCache *Cache) const // System::Initialize - Setup the configuration space.. /*{{{*/ // --------------------------------------------------------------------- /* These are the Debian specific configuration variables.. */ +static std::string getDpkgStatusLocation(Configuration &Cnf) { + auto const cnfstatedir = Cnf.Find("Dir::State", "var/lib/apt/"); + std::string statedir; + if (APT::String::Endswith(cnfstatedir, "/apt/")) + statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 5); + else if (APT::String::Endswith(cnfstatedir, "/apt")) + statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 4); + if (statedir.empty()) + Cnf.Set("Dir::State", "var/lib/dpkg"); + else + Cnf.Set("Dir::State", flCombine(statedir, "dpkg")); + auto const cnfrootdir = Cnf.Find("RootDir"); + if (Cnf.Exists("RootDir") == true) + Cnf.Set("RootDir", ""); + Cnf.Set("Dir::State::status", "status"); + auto const statusfile = Cnf.FindFile("Dir::State::status"); + if (cnfrootdir.empty() == false) + Cnf.Set("RootDir", cnfrootdir); + Cnf.Set("Dir::State", cnfstatedir); + return statusfile; +} bool debSystem::Initialize(Configuration &Cnf) { /* These really should be jammed into a generic 'Local Database' engine which is yet to be determined. The functions in pkgcachegen should be the only users of these */ Cnf.CndSet("Dir::State::extended_states", "extended_states"); - Cnf.CndSet("Dir::State::status","/var/lib/dpkg/status"); + if (Cnf.Exists("Dir::State::status") == false) + Cnf.Set("Dir::State::status", getDpkgStatusLocation(Cnf)); Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg"); if (d->StatusFile) { |