#include <apt-pkg/strutl.h>
#include <apt-pkg/hashes.h>
+#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
ItemDone();
// Change the status so that it can be dequeued
- for (pkgAcquire::Queue::QItem::owner_iterator O = Itm->Owners.begin(); O != Itm->Owners.end(); ++O)
- (*O)->Status = pkgAcquire::Item::StatIdle;
+ for (auto const &O: Itm->Owners)
+ O->Status = pkgAcquire::Item::StatIdle;
// Mark the item as done (taking care of all queues)
// and then put it in the main queue again
std::vector<Item*> const ItmOwners = Itm->Owners;
else if (Owner->HashesRequired() == true)
consideredOkay = false;
else
+ {
consideredOkay = true;
+ // even if the hashes aren't usable to declare something secure
+ // we can at least use them to declare it an integrity failure
+ if (ExpectedHashes.empty() == false && ReceivedHashes != ExpectedHashes && _config->Find("Acquire::ForceHash").empty())
+ consideredOkay = false;
+ }
if (consideredOkay == true)
consideredOkay = Owner->VerifyDone(Message, Config);
OwnerQ->ItemDone(Itm);
Itm = NULL;
+ bool errTransient;
+ {
+ std::string const failReason = LookupTag(Message, "FailReason");
+ std::string const reasons[] = { "Timeout", "ConnectionRefused",
+ "ConnectionTimedOut", "ResolveFailure", "TmpResolveFailure" };
+ errTransient = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons);
+ }
+
for (pkgAcquire::Queue::QItem::owner_iterator O = ItmOwners.begin(); O != ItmOwners.end(); ++O)
{
- // set some status
- if(LookupTag(Message,"FailReason") == "Timeout" ||
- LookupTag(Message,"FailReason") == "TmpResolveFailure" ||
- LookupTag(Message,"FailReason") == "ResolveFailure" ||
- LookupTag(Message,"FailReason") == "ConnectionRefused")
+ if (errTransient)
(*O)->Status = pkgAcquire::Item::StatTransientNetworkError;
-
(*O)->Failed(Message,Config);
if (Log != 0)