]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/acquire-item.cc
Fixed protect bug
[apt.git] / apt-pkg / acquire-item.cc
index db334de98fd38f8ebc570301d879ea0269ab9ee4..ebef611d83e28bde1c75ad37ee0363d92ec13a21 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: acquire-item.cc,v 1.14 1998/11/29 01:24:14 jgg Exp $
+// $Id: acquire-item.cc,v 1.23 1999/02/01 08:11:57 jgg Exp $
 /* ######################################################################
 
    Acquire Item - Item to acquire
 /* ######################################################################
 
    Acquire Item - Item to acquire
@@ -9,7 +9,7 @@
    cannot create an item that fetches two uri's to two files at the same 
    time. The pkgAcqIndex class creates a second class upon instantiation
    to fetch the other index files because of this.
    cannot create an item that fetches two uri's to two files at the same 
    time. The pkgAcqIndex class creates a second class upon instantiation
    to fetch the other index files because of this.
-   
+
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
@@ -19,7 +19,7 @@
 #include <apt-pkg/acquire-item.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/acquire-item.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/error.h>
-#include <strutl.h>
+#include <apt-pkg/strutl.h>
 
 #include <sys/stat.h>
 #include <unistd.h>
 
 #include <sys/stat.h>
 #include <unistd.h>
@@ -51,30 +51,32 @@ pkgAcquire::Item::~Item()
 // ---------------------------------------------------------------------
 /* We return to an idle state if there are still other queues that could
    fetch this object */
 // ---------------------------------------------------------------------
 /* We return to an idle state if there are still other queues that could
    fetch this object */
-void pkgAcquire::Item::Failed(string Message)
+void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
    Status = StatIdle;
 {
    Status = StatIdle;
+   ErrorText = LookupTag(Message,"Message");
    if (QueueCounter <= 1)
    {
       /* This indicates that the file is not available right now but might
    if (QueueCounter <= 1)
    {
       /* This indicates that the file is not available right now but might
-         be sometime later. If we do a retry cycle then this should be 
-        retried */
-      if (StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
+         be sometime later. If we do a retry cycle then this should be
+        retried [CDROMs] */
+      if (Cnf->LocalOnly == true &&
+         StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
       {
         Status = StatIdle;
       {
         Status = StatIdle;
-        Owner->Dequeue(this);
+        Dequeue();
         return;
       }
       
         return;
       }
       
-      ErrorText = LookupTag(Message,"Message");
       Status = StatError;
       Status = StatError;
-      Owner->Dequeue(this);
+      Dequeue();
    }   
 }
                                                                        /*}}}*/
 // Acquire::Item::Start - Item has begun to download                   /*{{{*/
 // ---------------------------------------------------------------------
    }   
 }
                                                                        /*}}}*/
 // Acquire::Item::Start - Item has begun to download                   /*{{{*/
 // ---------------------------------------------------------------------
-/* */
+/* Stash status and the file size. Note that setting Complete means 
+   sub-phases of the acquire process such as decompresion are operating */
 void pkgAcquire::Item::Start(string Message,unsigned long Size)
 {
    Status = StatFetching;
 void pkgAcquire::Item::Start(string Message,unsigned long Size)
 {
    Status = StatFetching;
@@ -328,18 +330,55 @@ string pkgAcqIndexRel::Describe()
    return Location->ReleaseURI();
 }
                                                                        /*}}}*/
    return Location->ReleaseURI();
 }
                                                                        /*}}}*/
+// AcqIndexRel::Failed - Silence failure messages for missing rel files        /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void pkgAcqIndexRel::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
+{
+   // This is the retry counter
+   if (Cnf->LocalOnly == true || 
+       StringToBool(LookupTag(Message,"Transient-Failure"),false) == false)
+   {      
+      Status = StatIdle;
+      Dequeue();
+      return;
+   }
+   
+   Item::Failed(Message,Cnf);
+}
+                                                                       /*}}}*/
 
 // AcqArchive::AcqArchive - Constructor                                        /*{{{*/
 // ---------------------------------------------------------------------
 
 // AcqArchive::AcqArchive - Constructor                                        /*{{{*/
 // ---------------------------------------------------------------------
-/* */
+/* This just sets up the initial fetch environment and queues the first
+   possibilitiy */
 pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
                             pkgRecords *Recs,pkgCache::VerIterator const &Version,
                             string &StoreFilename) :
                Item(Owner), Version(Version), Sources(Sources), Recs(Recs), 
 pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
                             pkgRecords *Recs,pkgCache::VerIterator const &Version,
                             string &StoreFilename) :
                Item(Owner), Version(Version), Sources(Sources), Recs(Recs), 
-               StoreFilename(StoreFilename)
+               StoreFilename(StoreFilename), Vf(Version.FileList())
 {
 {
+   Retries = _config->FindI("Acquire::Retries",0);
+      
+   // Generate the final file name as: package_version_arch.deb
+   StoreFilename = QuoteString(Version.ParentPkg().Name(),"_:") + '_' +
+                   QuoteString(Version.VerStr(),"_:") + '_' +
+                   QuoteString(Version.Arch(),"_:.") + ".deb";
+   
    // Select a source
    // Select a source
-   pkgCache::VerFileIterator Vf = Version.FileList();
+   if (QueueNext() == false && _error->PendingError() == false)
+      _error->Error("I wasn't able to locate file for the %s package. "
+                   "This might mean you need to manually fix this package.",
+                   Version.ParentPkg().Name());
+}
+                                                                       /*}}}*/
+// AcqArchive::QueueNext - Queue the next file source                  /*{{{*/
+// ---------------------------------------------------------------------
+/* This queues the next available file version for download. It checks if
+   the archive is already available in the cache and stashs the MD5 for
+   checking later. */
+bool pkgAcqArchive::QueueNext()
+{
    for (; Vf.end() == false; Vf++)
    {
       // Ignore not source sources
    for (; Vf.end() == false; Vf++)
    {
       // Ignore not source sources
@@ -359,19 +398,16 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
       // Grab the text package record
       pkgRecords::Parser &Parse = Recs->Lookup(Vf);
       if (_error->PendingError() == true)
       // Grab the text package record
       pkgRecords::Parser &Parse = Recs->Lookup(Vf);
       if (_error->PendingError() == true)
-        return;
+        return false;
       
       PkgFile = Parse.FileName();
       MD5 = Parse.MD5Hash();
       if (PkgFile.empty() == true)
       
       PkgFile = Parse.FileName();
       MD5 = Parse.MD5Hash();
       if (PkgFile.empty() == true)
-      {
-        _error->Error("Unable to locate a file name for package %s, "
-                      "perhaps the package files are corrupted.",
-                      Version.ParentPkg().Name());
-        return;
-      }
+        return _error->Error("The package index files are corrupted. No Filename: "
+                             "field for package %s."
+                             ,Version.ParentPkg().Name());
 
 
-      // See if we already have the file.
+      // See if we already have the file. (Legacy filenames)
       FileSize = Version->Size;
       string FinalFile = _config->FindDir("Dir::Cache::Archives") + flNotDir(PkgFile);
       struct stat Buf;
       FileSize = Version->Size;
       string FinalFile = _config->FindDir("Dir::Cache::Archives") + flNotDir(PkgFile);
       struct stat Buf;
@@ -384,15 +420,34 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
            Local = true;
            Status = StatDone;
            StoreFilename = DestFile = FinalFile;
            Local = true;
            Status = StatDone;
            StoreFilename = DestFile = FinalFile;
-           return;
+           return true;
         }
         
         /* Hmm, we have a file and its size does not match, this shouldnt
            happen.. */
         unlink(FinalFile.c_str());
       }
         }
         
         /* Hmm, we have a file and its size does not match, this shouldnt
            happen.. */
         unlink(FinalFile.c_str());
       }
-      
-      DestFile = _config->FindDir("Dir::Cache::Archives") + "partial/" + flNotDir(PkgFile);
+
+      // Check it again using the new style output filenames
+      FinalFile = _config->FindDir("Dir::Cache::Archives") + flNotDir(StoreFilename);
+      if (stat(FinalFile.c_str(),&Buf) == 0)
+      {
+        // Make sure the size matches
+        if ((unsigned)Buf.st_size == Version->Size)
+        {
+           Complete = true;
+           Local = true;
+           Status = StatDone;
+           StoreFilename = DestFile = FinalFile;
+           return true;
+        }
+        
+        /* Hmm, we have a file and its size does not match, this shouldnt
+           happen.. */
+        unlink(FinalFile.c_str());
+      }
+
+      DestFile = _config->FindDir("Dir::Cache::Archives") + "partial/" + flNotDir(StoreFilename);
       
       // Create the item
       Desc.URI = Location->ArchiveURI(PkgFile);
       
       // Create the item
       Desc.URI = Location->ArchiveURI(PkgFile);
@@ -400,21 +455,19 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
       Desc.Owner = this;
       Desc.ShortDesc = Version.ParentPkg().Name();
       QueueURI(Desc);
       Desc.Owner = this;
       Desc.ShortDesc = Version.ParentPkg().Name();
       QueueURI(Desc);
-      
-      return;
+
+      Vf++;
+      return true;
    }
    }
-   
-  _error->Error("I wasn't able to locate file for the %s package. "
-               "This probably means you need to rerun update.",
-               Version.ParentPkg().Name());
-}
+   return false;
+}   
                                                                        /*}}}*/
 // AcqArchive::Done - Finished fetching                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash)
 {
                                                                        /*}}}*/
 // AcqArchive::Done - Finished fetching                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash)
 {
-   Item::Done(Message,Size,MD5);
+   Item::Done(Message,Size,Md5Hash);
    
    // Check the size
    if (Size != Version->Size)
    
    // Check the size
    if (Size != Version->Size)
@@ -454,7 +507,7 @@ void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash)
    
    // Done, move it into position
    string FinalFile = _config->FindDir("Dir::Cache::Archives");
    
    // Done, move it into position
    string FinalFile = _config->FindDir("Dir::Cache::Archives");
-   FinalFile += flNotDir(DestFile);
+   FinalFile += flNotDir(StoreFilename);
    Rename(DestFile,FinalFile);
    
    StoreFilename = DestFile = FinalFile;
    Rename(DestFile,FinalFile);
    
    StoreFilename = DestFile = FinalFile;
@@ -469,4 +522,26 @@ string pkgAcqArchive::Describe()
    return Desc.URI;
 }
                                                                        /*}}}*/
    return Desc.URI;
 }
                                                                        /*}}}*/
-
+// AcqArchive::Failed - Failure handler                                        /*{{{*/
+// ---------------------------------------------------------------------
+/* Here we try other sources */
+void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
+{
+   ErrorText = LookupTag(Message,"Message");
+   if (QueueNext() == false)
+   {
+      // This is the retry counter
+      if (Retries != 0 &&
+         Cnf->LocalOnly == false &&
+         StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
+      {
+        Retries--;
+        Vf = Version.FileList();
+        if (QueueNext() == true)
+           return;
+      }
+      
+      Item::Failed(Message,Cnf);
+   }
+}
+                                                                       /*}}}*/