]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/debsystem.cc
implement Signed-By option for sources.list
[apt.git] / apt-pkg / deb / debsystem.cc
index 0abd4c8aa50e1651047d7f968b026e69c77f101e..465e13b9eb2f3db700736c785ef7fa40b73eb64c 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: debsystem.cc,v 1.2 2001/02/20 07:03:17 jgg Exp $
+// $Id: debsystem.cc,v 1.4 2004/01/26 17:01:53 mdz Exp $
 /* ######################################################################
 
    System - Abstraction for running on different systems.
@@ -10,9 +10,7 @@
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/debsystem.h"
-#endif
+#include <config.h>
 
 #include <apt-pkg/debsystem.h>
 #include <apt-pkg/debversion.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/fileutl.h>
-    
-#include <sys/types.h>
+#include <apt-pkg/pkgcache.h>
+#include <apt-pkg/cacheiterators.h>
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <string>
+#include <vector>
 #include <unistd.h>
 #include <dirent.h>
 #include <errno.h>
+
+#include <apti18n.h>
                                                                        /*}}}*/
 
+using std::string;
+
 debSystem debSys;
 
+class APT_HIDDEN debSystemPrivate {
+public:
+   debSystemPrivate() : LockFD(-1), LockCount(0), StatusFile(0)
+   {
+   }
+   // For locking support
+   int LockFD;
+   unsigned LockCount;
+   
+   debStatusIndex *StatusFile;
+};
+
 // System::debSystem - Constructor                                     /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-debSystem::debSystem()
+debSystem::debSystem() : pkgSystem("Debian dpkg interface", &debVS), d(new debSystemPrivate())
 {
-   LockFD = -1;
-   LockCount = 0;
-   
-   Label = "Debian dpkg interface";
-   VS = &debVS;
+}
+                                                                       /*}}}*/
+// System::~debSystem - Destructor                                     /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+debSystem::~debSystem()
+{
+   delete d->StatusFile;
+   delete d;
 }
                                                                        /*}}}*/
 // System::Lock - Get the lock                                         /*{{{*/
@@ -49,35 +73,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;
 }
@@ -87,15 +118,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;
@@ -152,18 +183,23 @@ 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;
 }
                                                                        /*}}}*/
 // System::ArchiveSupported - Is a file format supported               /*{{{*/
 // ---------------------------------------------------------------------
-/* The standard name for a deb is 'deb'.. There are no seperate versions
+/* The standard name for a deb is 'deb'.. There are no separate versions
    of .deb to worry about.. */
-bool debSystem::ArchiveSupported(const char *Type)
+APT_PURE bool debSystem::ArchiveSupported(const char *Type)
 {
    if (strcmp(Type,"deb") == 0)
       return true;
@@ -189,9 +225,28 @@ signed debSystem::Score(Configuration const &Cnf)
 // System::AddStatusFiles - Register the status files                  /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool debSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
+bool debSystem::AddStatusFiles(std::vector<pkgIndexFile *> &List)
 {
-   List.push_back(new debStatusIndex(_config->FindFile("Dir::State::status")));
+   if (d->StatusFile == 0)
+      d->StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status"));
+   List.push_back(d->StatusFile);
    return true;
 }
                                                                        /*}}}*/
+// System::FindIndex - Get an index file for status files              /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool debSystem::FindIndex(pkgCache::PkgFileIterator File,
+                         pkgIndexFile *&Found) const
+{
+   if (d->StatusFile == 0)
+      return false;
+   if (d->StatusFile->FindInCache(*File.Cache()) == File)
+   {
+      Found = d->StatusFile;
+      return true;
+   }
+   
+   return false;
+}
+                                                                       /*}}}*/