X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/9f697f69cf1adaced476598cfe08ab03c76c5d18..91414dd77ec7efe1d3fc053e32cbe4d82263e015:/methods/file.cc diff --git a/methods/file.cc b/methods/file.cc index 5d5fffa67..36f3c39b9 100644 --- a/methods/file.cc +++ b/methods/file.cc @@ -21,6 +21,7 @@ #include <apt-pkg/hashes.h> #include <apt-pkg/fileutl.h> #include <apt-pkg/strutl.h> +#include "aptmethod.h" #include <string> #include <sys/stat.h> @@ -28,13 +29,12 @@ #include <apti18n.h> /*}}}*/ -class FileMethod : public pkgAcqMethod +class FileMethod : public aptMethod { - virtual bool Fetch(FetchItem *Itm); - + virtual bool Fetch(FetchItem *Itm) APT_OVERRIDE; + public: - - FileMethod() : pkgAcqMethod("1.0",SingleInstance | SendConfig | LocalOnly) {}; + FileMethod() : aptMethod("file", "1.0", SingleInstance | SendConfig | LocalOnly) {}; }; // FileMethod::Fetch - Fetch a file /*{{{*/ @@ -58,13 +58,17 @@ bool FileMethod::Fetch(FetchItem *Itm) { HashStringList const hsl = Itm->ExpectedHashes; if (Itm->ExpectedHashes.VerifyFile(File)) + { + Res.Filename = Itm->DestFile; Res.IMSHit = true; + } } } } if (Res.IMSHit != true) - unlink(Itm->DestFile.c_str()); + RemoveFile("file", Itm->DestFile); + int olderrno = 0; // See if the file exists if (stat(File.c_str(),&Buf) == 0) { @@ -78,7 +82,13 @@ bool FileMethod::Fetch(FetchItem *Itm) if (filesize != 0 && filesize == Res.Size) Res.IMSHit = true; } + + CalculateHashes(Itm, Res); } + else + olderrno = errno; + if (Res.IMSHit == false) + URIStart(Res); // See if the uncompressed file exists and reuse it FetchResult AltRes; @@ -88,7 +98,7 @@ bool FileMethod::Fetch(FetchItem *Itm) { if (APT::String::Endswith(File, *ext) == true) { - std::string const unfile = File.substr(0, File.length() - ext->length() - 1); + std::string const unfile = File.substr(0, File.length() - ext->length()); if (stat(unfile.c_str(),&Buf) == 0) { AltRes.Size = Buf.st_size; @@ -103,20 +113,15 @@ bool FileMethod::Fetch(FetchItem *Itm) } } - if (Res.Filename.empty() == false) - { - Hashes Hash(Itm->ExpectedHashes); - FileFd Fd(Res.Filename, FileFd::ReadOnly); - Hash.AddFD(Fd); - Res.TakeHashes(Hash); - } - if (AltRes.Filename.empty() == false) URIDone(Res,&AltRes); else if (Res.Filename.empty() == false) URIDone(Res); else - return _error->Error(_("File not found")); + { + errno = olderrno; + return _error->Errno(File.c_str(), _("File not found")); + } return true; }