X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/0a8a80e58374771acc225fe1e08ed8e0fe0016cc..3da8b680afd82541ce0168cf0c42d77f08d4c79f:/methods/file.cc?ds=sidebyside diff --git a/methods/file.cc b/methods/file.cc index 71c564301..7ed4e6f60 100644 --- a/methods/file.cc +++ b/methods/file.cc @@ -1,10 +1,99 @@ -#include +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $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 + 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-* + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + /*}}}*/ + +class FileMethod : public pkgAcqMethod +{ + virtual bool Fetch(FetchItem *Itm); + + public: + + FileMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly) {}; +}; + +// FileMethod::Fetch - Fetch a file /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool FileMethod::Fetch(FetchItem *Itm) +{ + 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) + { + Res.Size = Buf.st_size; + Res.Filename = File; + Res.LastModified = Buf.st_mtime; + Res.IMSHit = false; + if (Itm->LastModified == Buf.st_mtime && Itm->LastModified != 0) + Res.IMSHit = true; + } + + // See if we can compute a file without a .gz exentsion + std::string::size_type Pos = File.rfind(".gz"); + if (Pos + 3 == File.length()) + { + File = std::string(File,0,Pos); + if (stat(File.c_str(),&Buf) == 0) + { + FetchResult AltRes; + AltRes.Size = Buf.st_size; + AltRes.Filename = File; + AltRes.LastModified = Buf.st_mtime; + AltRes.IMSHit = false; + if (Itm->LastModified == Buf.st_mtime && Itm->LastModified != 0) + AltRes.IMSHit = true; + + URIDone(Res,&AltRes); + return true; + } + } + + if (Res.Filename.empty() == true) + return _error->Error(_("File not found")); + + Hashes Hash; + FileFd Fd(Res.Filename, FileFd::ReadOnly); + Hash.AddFD(Fd); + Res.TakeHashes(Hash); + URIDone(Res); + return true; +} + /*}}}*/ int main() { - printf("100 Capabilities\n" - "Version: 1.0\n" - "Pre-Scan: true\n\n"); - fflush(stdout); - sleep(10); + setlocale(LC_ALL, ""); + + FileMethod Mth; + return Mth.Run(); }