X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b2e465d6d32d2dc884f58b94acb7e35f671a87fe..49e1672884bf8d50713812bdd4eca26ab2076711:/apt-pkg/deb/debsystem.cc diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index 0abd4c8aa..7ed6936c3 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: debsystem.cc,v 1.2 2001/02/20 07:03:17 jgg Exp $ +// $Id: debsystem.cc,v 1.4 2004/01/26 17:01:53 mdz Exp $ /* ###################################################################### System - Abstraction for running on different systems. @@ -10,9 +10,7 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ -#ifdef __GNUG__ -#pragma implementation "apt-pkg/debsystem.h" -#endif +#include #include #include @@ -21,27 +19,49 @@ #include #include #include - #include #include #include #include + +#include /*}}}*/ +using std::string; + debSystem debSys; +class debSystemPrivate { +public: + debSystemPrivate() : LockFD(-1), LockCount(0), StatusFile(0) + { + } + // For locking support + int LockFD; + unsigned LockCount; + + debStatusIndex *StatusFile; +}; + // System::debSystem - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ debSystem::debSystem() { - LockFD = -1; - LockCount = 0; - + d = new debSystemPrivate(); Label = "Debian dpkg interface"; VS = &debVS; } /*}}}*/ +// System::~debSystem - Destructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +debSystem::~debSystem() +{ + delete d->StatusFile; + delete d; +} + /*}}}*/ // System::Lock - Get the lock /*{{{*/ // --------------------------------------------------------------------- /* This mirrors the operations dpkg does when it starts up. Note the @@ -49,35 +69,42 @@ debSystem::debSystem() bool debSystem::Lock() { // Disable file locking - if (_config->FindB("Debug::NoLocking",false) == true || LockCount > 1) + if (_config->FindB("Debug::NoLocking",false) == true || d->LockCount > 1) { - LockCount++; + d->LockCount++; return true; } // Create the lockfile string AdminDir = flNotFile(_config->Find("Dir::State::status")); - LockFD = GetLock(AdminDir + "lock"); - if (LockFD == -1) + d->LockFD = GetLock(AdminDir + "lock"); + if (d->LockFD == -1) { if (errno == EACCES || errno == EAGAIN) - return _error->Error("Unable to lock the administration directory (%s), " - "is another process using it?",AdminDir.c_str()); + return _error->Error(_("Unable to lock the administration directory (%s), " + "is another process using it?"),AdminDir.c_str()); else - return _error->Error("Unable to lock the administration directory (%s), " - "are you root?",AdminDir.c_str()); + return _error->Error(_("Unable to lock the administration directory (%s), " + "are you root?"),AdminDir.c_str()); } // See if we need to abort with a dirty journal if (CheckUpdates() == true) { - close(LockFD); - LockFD = -1; - return _error->Error("dpkg was interrupted, you must manually " - "run 'dpkg --configure -a' to correct the problem. "); + close(d->LockFD); + d->LockFD = -1; + const char *cmd; + if (getenv("SUDO_USER") != NULL) + cmd = "sudo dpkg --configure -a"; + else + cmd = "dpkg --configure -a"; + // TRANSLATORS: the %s contains the recovery command, usually + // dpkg --configure -a + return _error->Error(_("dpkg was interrupted, you must manually " + "run '%s' to correct the problem. "), cmd); } - LockCount++; + d->LockCount++; return true; } @@ -87,15 +114,15 @@ bool debSystem::Lock() /* */ bool debSystem::UnLock(bool NoErrors) { - if (LockCount == 0 && NoErrors == true) + if (d->LockCount == 0 && NoErrors == true) return false; - if (LockCount < 1) - return _error->Error("Not locked"); - if (--LockCount == 0) + if (d->LockCount < 1) + return _error->Error(_("Not locked")); + if (--d->LockCount == 0) { - close(LockFD); - LockCount = 0; + close(d->LockFD); + d->LockCount = 0; } return true; @@ -152,10 +179,15 @@ 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::userstatus","status.user"); // Defunct + Cnf.CndSet("Dir::State::extended_states", "extended_states"); Cnf.CndSet("Dir::State::status","/var/lib/dpkg/status"); Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg"); - + + if (d->StatusFile) { + delete d->StatusFile; + d->StatusFile = 0; + } + return true; } /*}}}*/ @@ -189,9 +221,28 @@ signed debSystem::Score(Configuration const &Cnf) // System::AddStatusFiles - Register the status files /*{{{*/ // --------------------------------------------------------------------- /* */ -bool debSystem::AddStatusFiles(vector &List) +bool debSystem::AddStatusFiles(std::vector &List) { - List.push_back(new debStatusIndex(_config->FindFile("Dir::State::status"))); + if (d->StatusFile == 0) + d->StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status")); + List.push_back(d->StatusFile); return true; } /*}}}*/ +// System::FindIndex - Get an index file for status files /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool debSystem::FindIndex(pkgCache::PkgFileIterator File, + pkgIndexFile *&Found) const +{ + if (d->StatusFile == 0) + return false; + if (d->StatusFile->FindInCache(*File.Cache()) == File) + { + Found = d->StatusFile; + return true; + } + + return false; +} + /*}}}*/