|
|
@ -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; |
|
|
|
} |
|
|
|
|
|
|
|