summaryrefslogtreecommitdiff
path: root/apt-pkg/deb/dpkginit.cc
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg/deb/dpkginit.cc')
-rw-r--r--apt-pkg/deb/dpkginit.cc105
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;
+}
+ /*}}}*/