1 // -*- mode: cpp; mode: fold -*- 
   3 // $Id: cachefile.cc,v 1.8 2002/04/27 04:28:04 jgg Exp $ 
   4 /* ###################################################################### 
   6    CacheFile - Simple wrapper class for opening, generating and whatnot 
   8    This class implements a simple 2 line mechanism to open various sorts 
   9    of caches. It can operate as root, as not root, show progress and so on, 
  10    it transparently handles everything necessary. 
  12    ##################################################################### */ 
  14 // Include Files                                                        /*{{{*/ 
  17 #include <apt-pkg/cachefile.h> 
  18 #include <apt-pkg/error.h> 
  19 #include <apt-pkg/sourcelist.h> 
  20 #include <apt-pkg/pkgcachegen.h> 
  21 #include <apt-pkg/configuration.h> 
  22 #include <apt-pkg/policy.h> 
  23 #include <apt-pkg/pkgsystem.h> 
  24 #include <apt-pkg/fileutl.h> 
  25 #include <apt-pkg/progress.h> 
  26 #include <apt-pkg/depcache.h> 
  27 #include <apt-pkg/mmap.h> 
  28 #include <apt-pkg/pkgcache.h> 
  37 // CacheFile::CacheFile - Constructor                                   /*{{{*/ 
  38 pkgCacheFile::pkgCacheFile() : d(NULL
), ExternOwner(false), Map(NULL
), Cache(NULL
), 
  39                                 DCache(NULL
), SrcList(NULL
), Policy(NULL
) 
  42 pkgCacheFile::pkgCacheFile(pkgDepCache 
* const Owner
) : d(NULL
), ExternOwner(true), 
  43    Map(&Owner
->GetCache().GetMap()), Cache(&Owner
->GetCache()), 
  44    DCache(Owner
), SrcList(NULL
), Policy(NULL
) 
  48 // CacheFile::~CacheFile - Destructor                                   /*{{{*/ 
  49 // --------------------------------------------------------------------- 
  51 pkgCacheFile::~pkgCacheFile() 
  53    if (ExternOwner 
== false) 
  61    if (ExternOwner 
== false) 
  62       _system
->UnLock(true); 
  65 // CacheFile::BuildCaches - Open and build the cache files              /*{{{*/ 
  66 class APT_HIDDEN ScopedErrorMerge 
{ 
  68    ScopedErrorMerge() { _error
->PushToStack(); } 
  69    ~ScopedErrorMerge() { _error
->MergeWithStack(); } 
  71 bool pkgCacheFile::BuildCaches(OpProgress 
*Progress
, bool WithLock
) 
  77    if (_config
->FindB("pkgCacheFile::Generate", true) == false) 
  79       FileFd 
file(_config
->FindFile("Dir::Cache::pkgcache"), FileFd::ReadOnly
); 
  80       if (file
.IsOpen() == false || file
.Failed()) 
  82       Map 
= new MMap(file
, MMap::Public
|MMap::ReadOnly
); 
  83       if (unlikely(Map
->validData() == false)) 
  85       Cache 
= new pkgCache(Map
); 
  86       return _error
->PendingError() == false; 
  90       if (_system
->Lock() == false) 
  93    if (_error
->PendingError() == true) 
  96    BuildSourceList(Progress
); 
 100    bool Res 
= pkgCacheGenerator::MakeStatusCache(*SrcList
,Progress
,&Map
, &Cache
, true); 
 101    if (Progress 
!= NULL
) 
 104       return _error
->Error(_("The package lists or status file could not be parsed or opened.")); 
 106    /* This sux, remove it someday */ 
 107    if (_error
->PendingError() == true) 
 108       _error
->Warning(_("You may want to run apt-get update to correct these problems")); 
 110    if (Cache 
== nullptr) 
 111       Cache 
= new pkgCache(Map
); 
 112    if (_error
->PendingError() == true) 
 117 // CacheFile::BuildSourceList - Open and build all relevant sources.list/*{{{*/ 
 118 // --------------------------------------------------------------------- 
 120 bool pkgCacheFile::BuildSourceList(OpProgress 
* /*Progress*/) 
 125    SrcList 
= new pkgSourceList(); 
 126    if (SrcList
->ReadMainList() == false) 
 127       return _error
->Error(_("The list of sources could not be read.")); 
 131 // CacheFile::BuildPolicy - Open and build all relevant preferences     /*{{{*/ 
 132 // --------------------------------------------------------------------- 
 134 bool pkgCacheFile::BuildPolicy(OpProgress 
* /*Progress*/) 
 139    Policy 
= new pkgPolicy(Cache
); 
 140    if (_error
->PendingError() == true) 
 143    if (ReadPinFile(*Policy
) == false || ReadPinDir(*Policy
) == false) 
 149 // CacheFile::BuildDepCache - Open and build the dependency cache       /*{{{*/ 
 150 // --------------------------------------------------------------------- 
 152 bool pkgCacheFile::BuildDepCache(OpProgress 
*Progress
) 
 157    if (BuildPolicy(Progress
) == false) 
 160    DCache 
= new pkgDepCache(Cache
,Policy
); 
 161    if (_error
->PendingError() == true) 
 164    return DCache
->Init(Progress
); 
 167 // CacheFile::Open - Open the cache files, creating if necessary        /*{{{*/ 
 168 // --------------------------------------------------------------------- 
 170 bool pkgCacheFile::Open(OpProgress 
*Progress
, bool WithLock
) 
 172    if (BuildCaches(Progress
,WithLock
) == false) 
 175    if (BuildPolicy(Progress
) == false) 
 178    if (BuildDepCache(Progress
) == false) 
 181    if (Progress 
!= NULL
) 
 183    if (_error
->PendingError() == true) 
 189 // CacheFile::RemoveCaches - remove all cache files from disk           /*{{{*/ 
 190 // --------------------------------------------------------------------- 
 192 void pkgCacheFile::RemoveCaches() 
 194    std::string 
const pkgcache 
= _config
->FindFile("Dir::cache::pkgcache"); 
 195    std::string 
const srcpkgcache 
= _config
->FindFile("Dir::cache::srcpkgcache"); 
 197    if (pkgcache
.empty() == false && RealFileExists(pkgcache
) == true) 
 198       RemoveFile("RemoveCaches", pkgcache
); 
 199    if (srcpkgcache
.empty() == false && RealFileExists(srcpkgcache
) == true) 
 200       RemoveFile("RemoveCaches", srcpkgcache
); 
 201    if (pkgcache
.empty() == false) 
 203       std::string cachedir 
= flNotFile(pkgcache
); 
 204       std::string cachefile 
= flNotDir(pkgcache
); 
 205       if (cachedir
.empty() != true && cachefile
.empty() != true && DirectoryExists(cachedir
) == true) 
 207          cachefile
.append("."); 
 208          std::vector
<std::string
> caches 
= GetListOfFilesInDir(cachedir
, false); 
 209          for (std::vector
<std::string
>::const_iterator file 
= caches
.begin(); file 
!= caches
.end(); ++file
) 
 211             std::string nuke 
= flNotDir(*file
); 
 212             if (strncmp(cachefile
.c_str(), nuke
.c_str(), cachefile
.length()) != 0) 
 214             RemoveFile("RemoveCaches", *file
); 
 219    if (srcpkgcache
.empty() == true) 
 222    std::string cachedir 
= flNotFile(srcpkgcache
); 
 223    std::string cachefile 
= flNotDir(srcpkgcache
); 
 224    if (cachedir
.empty() == true || cachefile
.empty() == true || DirectoryExists(cachedir
) == false) 
 226    cachefile
.append("."); 
 227    std::vector
<std::string
> caches 
= GetListOfFilesInDir(cachedir
, false); 
 228    for (std::vector
<std::string
>::const_iterator file 
= caches
.begin(); file 
!= caches
.end(); ++file
) 
 230       std::string nuke 
= flNotDir(*file
); 
 231       if (strncmp(cachefile
.c_str(), nuke
.c_str(), cachefile
.length()) != 0) 
 233       RemoveFile("RemoveCaches", *file
); 
 237 // CacheFile::Close - close the cache files                             /*{{{*/ 
 238 // --------------------------------------------------------------------- 
 240 void pkgCacheFile::Close() 
 242    if (ExternOwner 
== false) 
 252    _system
->UnLock(true);