X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/917ae8051ca9a28c724875eaa77058ef162b4278..a3eaf9544039a9adfef159e8185f376f19b15c68:/apt-pkg/acquire-item.cc?ds=inline diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 5dc9413a9..ddaf260ea 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-item.cc,v 1.36 1999/08/28 03:22:34 jgg Exp $ +// $Id: acquire-item.cc,v 1.40 1999/10/31 06:32:27 jgg Exp $ /* ###################################################################### Acquire Item - Item to acquire @@ -136,7 +136,7 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,const pkgSourceList::Item *Location) DestFile = _config->FindDir("Dir::State::lists") + "partial/"; DestFile += URItoFileName(Location->PackagesURI()); - // Create the item + // Create the item Desc.URI = Location->PackagesURI() + ".gz"; Desc.Description = Location->PackagesInfo(); Desc.Owner = this; @@ -565,8 +565,10 @@ void pkgAcqArchive::Finished() /* The file is added to the queue */ pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string MD5, unsigned long Size,string Dsc,string ShortDesc) : - Item(Owner), MD5(MD5) + Item(Owner), Md5Hash(MD5) { + Retries = _config->FindI("Acquire::Retries",0); + DestFile = flNotDir(URI); // Create the item @@ -597,6 +599,18 @@ pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string MD5, /* */ void pkgAcqFile::Done(string Message,unsigned long Size,string MD5) { + // Check the md5 + if (Md5Hash.empty() == false && MD5.empty() == false) + { + if (Md5Hash != MD5) + { + Status = StatError; + ErrorText = "MD5Sum mismatch"; + Rename(DestFile,DestFile + ".FAILED"); + return; + } + } + Item::Done(Message,Size,MD5); string FileName = LookupTag(Message,"Filename"); @@ -624,12 +638,41 @@ void pkgAcqFile::Done(string Message,unsigned long Size,string MD5) return; } + // Erase the file if it is a symlink so we can overwrite it + struct stat St; + if (lstat(DestFile.c_str(),&St) == 0) + { + if (S_ISLNK(St.st_mode) != 0) + unlink(DestFile.c_str()); + } + + // Symlink the file if (symlink(FileName.c_str(),DestFile.c_str()) != 0) { - ErrorText = "Link to " + DestFile + "failure "; + ErrorText = "Link to " + DestFile + " failure "; Status = StatError; Complete = false; } } } /*}}}*/ +// AcqFile::Failed - Failure handler /*{{{*/ +// --------------------------------------------------------------------- +/* Here we try other sources */ +void pkgAcqFile::Failed(string Message,pkgAcquire::MethodConfig *Cnf) +{ + ErrorText = LookupTag(Message,"Message"); + + // This is the retry counter + if (Retries != 0 && + Cnf->LocalOnly == false && + StringToBool(LookupTag(Message,"Transient-Failure"),false) == true) + { + Retries--; + QueueURI(Desc); + return; + } + + Item::Failed(Message,Cnf); +} + /*}}}*/