X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/1d1b09d580e2de36f719cd9e1f6004b265b41cb9..49e1672884bf8d50713812bdd4eca26ab2076711:/apt-pkg/deb/debsystem.cc diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index 0b3a4f742..7ed6936c3 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -10,9 +10,7 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ -#ifdef __GNUG__ -#pragma implementation "apt-pkg/debsystem.h" -#endif +#include #include #include @@ -21,24 +19,36 @@ #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; - StatusFile = 0; - + d = new debSystemPrivate(); Label = "Debian dpkg interface"; VS = &debVS; } @@ -48,7 +58,8 @@ debSystem::debSystem() /* */ debSystem::~debSystem() { - delete StatusFile; + delete d->StatusFile; + delete d; } /*}}}*/ // System::Lock - Get the lock /*{{{*/ @@ -58,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; } @@ -96,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; @@ -161,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; } /*}}}*/ @@ -198,11 +221,11 @@ signed debSystem::Score(Configuration const &Cnf) // System::AddStatusFiles - Register the status files /*{{{*/ // --------------------------------------------------------------------- /* */ -bool debSystem::AddStatusFiles(vector &List) +bool debSystem::AddStatusFiles(std::vector &List) { - if (StatusFile == 0) - StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status")); - List.push_back(StatusFile); + if (d->StatusFile == 0) + d->StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status")); + List.push_back(d->StatusFile); return true; } /*}}}*/ @@ -212,11 +235,11 @@ bool debSystem::AddStatusFiles(vector &List) bool debSystem::FindIndex(pkgCache::PkgFileIterator File, pkgIndexFile *&Found) const { - if (StatusFile == 0) + if (d->StatusFile == 0) return false; - if (StatusFile->FindInCache(*File.Cache()) == File) + if (d->StatusFile->FindInCache(*File.Cache()) == File) { - Found = StatusFile; + Found = d->StatusFile; return true; }