summaryrefslogtreecommitdiff
path: root/apt-pkg/deb
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-07-19 18:20:38 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2016-07-19 18:20:38 +0200
commit475f75506db48a7fa90711fce4ed129f6a14cc9a (patch)
treeee4682166475a14a47c71b4dd6aa8a24c2c29229 /apt-pkg/deb
parentbbd8308cc01941e51e2cbcf88168a5560abe6042 (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')
-rw-r--r--apt-pkg/deb/debsystem.cc28
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) {