|
|
@@ -26,15 +26,24 @@
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
@@ -44,7 +53,8 @@ debSystem::debSystem()
|
|
|
/* */
|
|
|
debSystem::~debSystem()
|
|
|
{
|
|
|
- delete StatusFile;
|
|
|
+ delete d->StatusFile;
|
|
|
+ delete d;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
// System::Lock - Get the lock /*{{{*/
|
|
|
@@ -54,16 +64,16 @@ 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), "
|
|
|
@@ -76,8 +86,8 @@ bool debSystem::Lock()
|
|
|
// See if we need to abort with a dirty journal
|
|
|
if (CheckUpdates() == true)
|
|
|
{
|
|
|
- close(LockFD);
|
|
|
- LockFD = -1;
|
|
|
+ close(d->LockFD);
|
|
|
+ d->LockFD = -1;
|
|
|
const char *cmd;
|
|
|
if (getenv("SUDO_USER") != NULL)
|
|
|
cmd = "sudo dpkg --configure -a";
|
|
|
@@ -89,7 +99,7 @@ bool debSystem::Lock()
|
|
|
"run '%s' to correct the problem. "), cmd);
|
|
|
}
|
|
|
|
|
|
- LockCount++;
|
|
|
+ d->LockCount++;
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
@@ -99,15 +109,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)
|
|
|
+ if (d->LockCount < 1)
|
|
|
return _error->Error(_("Not locked"));
|
|
|
- if (--LockCount == 0)
|
|
|
+ if (--d->LockCount == 0)
|
|
|
{
|
|
|
- close(LockFD);
|
|
|
- LockCount = 0;
|
|
|
+ close(d->LockFD);
|
|
|
+ d->LockCount = 0;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
@@ -168,9 +178,9 @@ bool debSystem::Initialize(Configuration &Cnf)
|
|
|
Cnf.CndSet("Dir::State::status","/var/lib/dpkg/status");
|
|
|
Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg");
|
|
|
|
|
|
- if (StatusFile) {
|
|
|
- delete StatusFile;
|
|
|
- StatusFile = 0;
|
|
|
+ if (d->StatusFile) {
|
|
|
+ delete d->StatusFile;
|
|
|
+ d->StatusFile = 0;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
@@ -208,9 +218,9 @@ signed debSystem::Score(Configuration const &Cnf)
|
|
|
/* */
|
|
|
bool debSystem::AddStatusFiles(vector<pkgIndexFile *> &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;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
@@ -220,11 +230,11 @@ bool debSystem::AddStatusFiles(vector<pkgIndexFile *> &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;
|
|
|
}
|
|
|
|