]>
git.saurik.com Git - apt.git/blob - methods/file.cc
   1 // -*- mode: cpp; mode: fold -*- 
   3 // $Id: file.cc,v 1.9.2.1 2004/01/16 18:58:50 mdz Exp $ 
   4 /* ###################################################################### 
   6    File URI method for APT 
   8    This simply checks that the file specified exists, if so the relevant 
   9    information is returned. If a .gz filename is specified then the file 
  10    name with .gz removed will also be checked and information about it 
  11    will be returned in Alt-* 
  13    ##################################################################### */ 
  15 // Include Files                                                        /*{{{*/ 
  18 #include <apt-pkg/acquire-method.h> 
  19 #include <apt-pkg/aptconfiguration.h> 
  20 #include <apt-pkg/error.h> 
  21 #include <apt-pkg/hashes.h> 
  22 #include <apt-pkg/fileutl.h> 
  23 #include <apt-pkg/strutl.h> 
  31 class FileMethod 
: public pkgAcqMethod
 
  33    virtual bool Fetch(FetchItem 
*Itm
); 
  37    FileMethod() : pkgAcqMethod("1.0",SingleInstance 
| SendConfig 
| LocalOnly
) {}; 
  40 // FileMethod::Fetch - Fetch a file                                     /*{{{*/ 
  41 // --------------------------------------------------------------------- 
  43 bool FileMethod::Fetch(FetchItem 
*Itm
) 
  46    std::string File 
= Get
.Path
; 
  48    if (Get
.Host
.empty() == false) 
  49       return _error
->Error(_("Invalid URI, local URIS must not start with //")); 
  52    // deal with destination files which might linger around 
  53    if (lstat(Itm
->DestFile
.c_str(), &Buf
) == 0) 
  55       if ((Buf
.st_mode 
& S_IFREG
) != 0) 
  57          if (Itm
->LastModified 
== Buf
.st_mtime 
&& Itm
->LastModified 
!= 0) 
  59             HashStringList 
const hsl 
= Itm
->ExpectedHashes
; 
  60             if (Itm
->ExpectedHashes
.VerifyFile(File
)) 
  65    if (Res
.IMSHit 
!= true) 
  66       unlink(Itm
->DestFile
.c_str()); 
  68    // See if the file exists 
  69    if (stat(File
.c_str(),&Buf
) == 0) 
  71       Res
.Size 
= Buf
.st_size
; 
  73       Res
.LastModified 
= Buf
.st_mtime
; 
  75       if (Itm
->LastModified 
== Buf
.st_mtime 
&& Itm
->LastModified 
!= 0) 
  77          unsigned long long const filesize 
= Itm
->ExpectedHashes
.FileSize(); 
  78          if (filesize 
!= 0 && filesize 
== Res
.Size
) 
  83    // See if the uncompressed file exists and reuse it 
  85    AltRes
.Filename
.clear(); 
  86    std::vector
<std::string
> extensions 
= APT::Configuration::getCompressorExtensions(); 
  87    for (std::vector
<std::string
>::const_iterator ext 
= extensions
.begin(); ext 
!= extensions
.end(); ++ext
) 
  89       if (APT::String::Endswith(File
, *ext
) == true) 
  91          std::string 
const unfile 
= File
.substr(0, File
.length() - ext
->length() - 1); 
  92          if (stat(unfile
.c_str(),&Buf
) == 0) 
  94             AltRes
.Size 
= Buf
.st_size
; 
  95             AltRes
.Filename 
= unfile
; 
  96             AltRes
.LastModified 
= Buf
.st_mtime
; 
  97             AltRes
.IMSHit 
= false; 
  98             if (Itm
->LastModified 
== Buf
.st_mtime 
&& Itm
->LastModified 
!= 0) 
 102          // no break here as we could have situations similar to '.gz' vs '.tar.gz' here 
 106    if (Res
.Filename
.empty() == false) 
 108       Hashes 
Hash(Itm
->ExpectedHashes
); 
 109       FileFd 
Fd(Res
.Filename
, FileFd::ReadOnly
); 
 111       Res
.TakeHashes(Hash
); 
 114    if (AltRes
.Filename
.empty() == false) 
 115       URIDone(Res
,&AltRes
); 
 116    else if (Res
.Filename
.empty() == false) 
 119       return _error
->Error(_("File not found")); 
 127    setlocale(LC_ALL
, "");