X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/93bf083d699c60f1ac40297bfa6783fb0cb800d8..51da0c3587c9d36a3c04b3e28b99d8331a29b230:/methods/file.cc?ds=sidebyside diff --git a/methods/file.cc b/methods/file.cc index 64490749b..12db62203 100644 --- a/methods/file.cc +++ b/methods/file.cc @@ -1,11 +1,11 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: file.cc,v 1.4 1998/10/30 07:53:52 jgg Exp $ +// $Id: file.cc,v 1.9.2.1 2004/01/16 18:58:50 mdz Exp $ /* ###################################################################### File URI method for APT - This simply checks that the file specified exists, if so the relevent + This simply checks that the file specified exists, if so the relevant information is returned. If a .gz filename is specified then the file name with .gz removed will also be checked and information about it will be returned in Alt-* @@ -13,30 +13,40 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ +#include + #include #include +#include +#include +#include +#include #include -#include + +#include /*}}}*/ class FileMethod : public pkgAcqMethod { - virtual bool Fetch(string Message,URI Get); + virtual bool Fetch(FetchItem *Itm); public: - FileMethod() : pkgAcqMethod("1.0",SingleInstance) {}; + FileMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly) {}; }; // FileMethod::Fetch - Fetch a file /*{{{*/ // --------------------------------------------------------------------- /* */ -bool FileMethod::Fetch(string Message,URI Get) +bool FileMethod::Fetch(FetchItem *Itm) { - string File = Get.Path; + URI Get = Itm->Uri; + std::string File = Get.Path; FetchResult Res; - + if (Get.Host.empty() == false) + return _error->Error(_("Invalid URI, local URIS must not start with //")); + // See if the file exists struct stat Buf; if (stat(File.c_str(),&Buf) == 0) @@ -45,15 +55,15 @@ bool FileMethod::Fetch(string Message,URI Get) Res.Filename = File; Res.LastModified = Buf.st_mtime; Res.IMSHit = false; - if (LastModified == Buf.st_mtime) + if (Itm->LastModified == Buf.st_mtime && Itm->LastModified != 0) Res.IMSHit = true; } // See if we can compute a file without a .gz exentsion - string::size_type Pos = File.rfind(".gz"); + std::string::size_type Pos = File.rfind(".gz"); if (Pos + 3 == File.length()) { - File = string(File,0,Pos); + File = std::string(File,0,Pos); if (stat(File.c_str(),&Buf) == 0) { FetchResult AltRes; @@ -61,7 +71,7 @@ bool FileMethod::Fetch(string Message,URI Get) AltRes.Filename = File; AltRes.LastModified = Buf.st_mtime; AltRes.IMSHit = false; - if (LastModified == Buf.st_mtime) + if (Itm->LastModified == Buf.st_mtime && Itm->LastModified != 0) AltRes.IMSHit = true; URIDone(Res,&AltRes); @@ -70,8 +80,12 @@ bool FileMethod::Fetch(string Message,URI Get) } if (Res.Filename.empty() == true) - return _error->Error("File not found"); - + return _error->Error(_("File not found")); + + Hashes Hash; + FileFd Fd(Res.Filename, FileFd::ReadOnly); + Hash.AddFD(Fd); + Res.TakeHashes(Hash); URIDone(Res); return true; } @@ -79,6 +93,8 @@ bool FileMethod::Fetch(string Message,URI Get) int main() { + setlocale(LC_ALL, ""); + FileMethod Mth; return Mth.Run(); }