]> git.saurik.com Git - apt.git/blobdiff - methods/cdrom.cc
Fixed dumpavail bug with dup packageS
[apt.git] / methods / cdrom.cc
index 0d1e8f031b0363ed0c5fd4d7eaa1c28d2efe638d..3049e5ba8a6010a1b97a4c0fd4d3107faa680483 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: cdrom.cc,v 1.1 1998/12/03 07:29:21 jgg Exp $
+// $Id: cdrom.cc,v 1.7 1998/12/22 08:20:55 jgg Exp $
 /* ######################################################################
 
    CDROM URI method for APT
@@ -21,6 +21,7 @@
 class CDROMMethod : public pkgAcqMethod
 {
    Configuration Database;
+   bool DatabaseLoaded;
    string CurrentID;
    
    virtual bool Fetch(FetchItem *Itm);
@@ -34,19 +35,9 @@ class CDROMMethod : public pkgAcqMethod
 // CDROMMethod::CDROMethod - Constructor                               /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-CDROMMethod::CDROMMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly) 
+CDROMMethod::CDROMMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly | 
+                                         SendConfig), DatabaseLoaded(false)
 {
-   // Read the database
-   string DFile = _config->FindFile("Dir::State::cdroms");
-   if (FileExists(DFile) == true)
-   {
-      if (ReadConfigFile(Database,DFile) == false)
-      {
-        _error->Error("Unable to read the cdrom database %s",
-                      DFile.c_str());
-        Fail();
-      }   
-   }      
 };
                                                                        /*}}}*/
 // CDROMMethod::GetID - Get the ID hash for                                                                    /*{{{*/
@@ -55,7 +46,26 @@ CDROMMethod::CDROMMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly)
    tag associated with it. */
 string CDROMMethod::GetID(string Name)
 {
-   const Configuration::Item *Top = Database.Tree(0);
+   if (DatabaseLoaded == false)
+   {
+      // Read the database
+      string DFile = _config->FindFile("Dir::State::cdroms");
+      if (FileExists(DFile) == true)
+      {
+        if (ReadConfigFile(Database,DFile) == false)
+        {
+           _error->Error("Unable to read the cdrom database %s",
+                         DFile.c_str());
+           return string();
+        }   
+      }
+      DatabaseLoaded = true;
+   }
+   
+   const Configuration::Item *Top = Database.Tree("CD");
+   if (Top != 0)
+      Top = Top->Child;
+
    for (; Top != 0;)
    {
       if (Top->Value == Name)
@@ -87,9 +97,11 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
    }
    
    string ID = GetID(Get.Host);
+   if (_error->PendingError() == true)
+      return false;
    
    // All non IMS queries for package files fail.
-   if (Itm->IndexFile == true || ID.empty() == false)
+   if (Itm->IndexFile == true || ID.empty() == true)
    {
       Fail("Please use apt-cdrom to make this CD recognized by APT."
           " apt-get update cannot be used to add new CDs");
@@ -104,6 +116,8 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
    }
    
    string CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/");
+   if (CDROM[0] == '.')
+      CDROM= SafeGetCWD() + '/' + CDROM;
    string NewID;
    while (1)
    {
@@ -115,7 +129,13 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
         break;
       
       UnmountCdrom(CDROM);
-      MediaFail(Get.Host,CDROM);
+      if (MediaFail(Get.Host,CDROM) == false)
+      {
+        CurrentID = "FAIL";
+        Fail("Wrong CD",true);
+        return true;
+      }
+      
       MountCdrom(CDROM);
    }
    
@@ -123,12 +143,14 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
    if (NewID == ID)
    {
       Res.Filename = CDROM + File;
-      if (FileExists(Res.Filename) == false)
+      struct stat Buf;
+      if (stat(Res.Filename.c_str(),&Buf) != 0)
         return _error->Error("File not found");
     
       CurrentID = ID;
-      Res.LastModified = Itm->LastModified;
+      Res.LastModified = Buf.st_mtime;
       Res.IMSHit = true;
+      Res.Size = Buf.st_size;
       URIDone(Res);
       return true;
    }