diff options
author | Arch Librarian <arch@canonical.com> | 2004-09-20 16:51:37 +0000 |
---|---|---|
committer | Arch Librarian <arch@canonical.com> | 2004-09-20 16:51:37 +0000 |
commit | d38b7b3d803a719b189df80820aeda6a818f4909 (patch) | |
tree | 28143d1b948d8b31fc8bec91b50d2fdfe6ff3341 /apt-pkg/deb/dpkginit.cc | |
parent | c217f42adc1a82c7400e85178f61bf429fea1bc4 (diff) |
Needs Unpack fixes
Author: jgg
Date: 1998-11-23 07:02:58 GMT
Needs Unpack fixes
Diffstat (limited to 'apt-pkg/deb/dpkginit.cc')
-rw-r--r-- | apt-pkg/deb/dpkginit.cc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/apt-pkg/deb/dpkginit.cc b/apt-pkg/deb/dpkginit.cc new file mode 100644 index 000000000..095156d0d --- /dev/null +++ b/apt-pkg/deb/dpkginit.cc @@ -0,0 +1,105 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: dpkginit.cc,v 1.1 1998/11/23 07:03:10 jgg Exp $ +/* ###################################################################### + + DPKG init - Initialize the dpkg stuff + + ##################################################################### */ + /*}}}*/ +// Includes /*{{{*/ +#ifdef __GNUG__ +#pragma implementation "apt-pkg/dpkginit.h" +#endif +#include <apt-pkg/dpkginit.h> +#include <apt-pkg/error.h> +#include <apt-pkg/configuration.h> +#include <apt-pkg/fileutl.h> + +#include <sys/types.h> +#include <unistd.h> +#include <dirent.h> + /*}}}*/ + +// DpkgLock::pkgDpkgLock - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgDpkgLock::pkgDpkgLock() +{ + LockFD = -1; + GetLock(); +} + /*}}}*/ +// DpkgLock::~pkgDpkgLock - Destructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgDpkgLock::~pkgDpkgLock() +{ + Close(); +} + /*}}}*/ +// DpkgLock::GetLock - Get the lock /*{{{*/ +// --------------------------------------------------------------------- +/* This mirrors the operations dpkg does when it starts up. Note the + checking of the updates directory. */ +bool pkgDpkgLock::GetLock() +{ + // Disable file locking + if (_config->FindB("Debug::NoLocking",false) == true) + return true; + + Close(); + + // Create the lockfile + string AdminDir = flNotFile(_config->Find("Dir::State::status")); + LockFD = ::GetLock(AdminDir + "lock"); + if (LockFD == -1) + return _error->Errno("Open","Unable to lock the administration directory " + "%s, are you root?",AdminDir.c_str()); + + // Check for updates.. (dirty) + string File = AdminDir + "updates/"; + DIR *DirP = opendir(File.c_str()); + if (DirP != 0) + { + /* We ignore any files that are not all digits, this skips .,.. and + some tmp files dpkg will leave behind.. */ + bool Damaged = false; + for (struct dirent *Ent = readdir(DirP); Ent != 0; Ent = readdir(DirP)) + { + Damaged = true; + for (unsigned int I = 0; Ent->d_name[I] != 0; I++) + { + // Check if its not a digit.. + if (isdigit(Ent->d_name[I]) == 0) + { + Damaged = false; + break; + } + } + if (Damaged == true) + break; + } + closedir(DirP); + + // Woops, we have to run dpkg to rewrite the status file + if (Damaged == true) + { + Close(); + return _error->Error("dpkg was interrupted, you must manually " + "run 'dpkg --configure -a' to correct the problem. "); + } + } + + return true; +} + /*}}}*/ +// DpkgLock::Close - Close the lock /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgDpkgLock::Close() +{ + close(LockFD); + LockFD = -1; +} + /*}}}*/ |