]> git.saurik.com Git - apt.git/commitdiff
* apt-pkg/cachefile.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 11 Feb 2012 21:36:03 +0000 (22:36 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 11 Feb 2012 21:36:03 +0000 (22:36 +0100)
  - clean up lost atomic cachefiles with 'clean' (Closes: #650513)

apt-pkg/cachefile.cc
apt-pkg/contrib/fileutl.cc
apt-pkg/contrib/fileutl.h
debian/changelog

index 1b8d91a44951b31c37c1d9fcb112c8c77af437b9..e425c940de09880ccf547e9fad9167e84a0fa2e1 100644 (file)
@@ -178,6 +178,40 @@ void pkgCacheFile::RemoveCaches()
       unlink(pkgcache.c_str());
    if (srcpkgcache.empty() == false && RealFileExists(srcpkgcache) == true)
       unlink(srcpkgcache.c_str());
+   if (pkgcache.empty() == false)
+   {
+      std::string cachedir = flNotFile(pkgcache);
+      std::string cachefile = flNotDir(pkgcache);
+      if (cachedir.empty() != true && cachefile.empty() != true)
+      {
+        cachefile.append(".");
+        std::vector<std::string> caches = GetListOfFilesInDir(cachedir, false);
+        for (std::vector<std::string>::const_iterator file = caches.begin(); file != caches.end(); ++file)
+        {
+           std::string nuke = flNotDir(*file);
+           if (strncmp(cachefile.c_str(), nuke.c_str(), cachefile.length()) != 0)
+              continue;
+           unlink(file->c_str());
+        }
+      }
+   }
+
+   if (srcpkgcache.empty() == true)
+      return;
+
+   std::string cachedir = flNotFile(srcpkgcache);
+   std::string cachefile = flNotDir(srcpkgcache);
+   if (cachedir.empty() == true || cachefile.empty() == true)
+      return;
+   cachefile.append(".");
+   std::vector<std::string> caches = GetListOfFilesInDir(cachedir, false);
+   for (std::vector<std::string>::const_iterator file = caches.begin(); file != caches.end(); ++file)
+   {
+      std::string nuke = flNotDir(*file);
+      if (strncmp(cachefile.c_str(), nuke.c_str(), cachefile.length()) != 0)
+        continue;
+      unlink(file->c_str());
+   }
 }
                                                                        /*}}}*/
 // CacheFile::Close - close the cache files                            /*{{{*/
index 529e7d65577bb8cfe516966fd3e72712c5981a92..557ba0ca63411e12551cb3aa61d1a5a9a3c5d5aa 100644 (file)
@@ -454,6 +454,80 @@ std::vector<string> GetListOfFilesInDir(string const &Dir, std::vector<string> c
    }
    closedir(D);
 
+   if (SortList == true)
+      std::sort(List.begin(),List.end());
+   return List;
+}
+std::vector<string> GetListOfFilesInDir(string const &Dir, bool SortList)
+{
+   bool const Debug = _config->FindB("Debug::GetListOfFilesInDir", false);
+   if (Debug == true)
+      std::clog << "Accept in " << Dir << " all regular files" << std::endl;
+
+   std::vector<string> List;
+
+   if (DirectoryExists(Dir.c_str()) == false)
+   {
+      _error->Error(_("List of files can't be created as '%s' is not a directory"), Dir.c_str());
+      return List;
+   }
+
+   DIR *D = opendir(Dir.c_str());
+   if (D == 0)
+   {
+      _error->Errno("opendir",_("Unable to read %s"),Dir.c_str());
+      return List;
+   }
+
+   for (struct dirent *Ent = readdir(D); Ent != 0; Ent = readdir(D)) 
+   {
+      // skip "hidden" files
+      if (Ent->d_name[0] == '.')
+        continue;
+
+      // Make sure it is a file and not something else
+      string const File = flCombine(Dir,Ent->d_name);
+#ifdef _DIRENT_HAVE_D_TYPE
+      if (Ent->d_type != DT_REG)
+#endif
+      {
+        if (RealFileExists(File.c_str()) == false)
+        {
+           if (Debug == true)
+              std::clog << "Bad file: " << Ent->d_name << " → it is not a real file" << std::endl;
+           continue;
+        }
+      }
+
+      // Skip bad filenames ala run-parts
+      const char *C = Ent->d_name;
+      for (; *C != 0; ++C)
+        if (isalpha(*C) == 0 && isdigit(*C) == 0
+            && *C != '_' && *C != '-' && *C != '.')
+           break;
+
+      // we don't reach the end of the name -> bad character included
+      if (*C != 0)
+      {
+        if (Debug == true)
+           std::clog << "Bad file: " << Ent->d_name << " → bad character »" << *C << "« in filename" << std::endl;
+        continue;
+      }
+
+      // skip filenames which end with a period. These are never valid
+      if (*(C - 1) == '.')
+      {
+        if (Debug == true)
+           std::clog << "Bad file: " << Ent->d_name << " → Period as last character" << std::endl;
+        continue;
+      }
+
+      if (Debug == true)
+        std::clog << "Accept file: " << Ent->d_name << " in " << Dir << std::endl;
+      List.push_back(File);
+   }
+   closedir(D);
+
    if (SortList == true)
       std::sort(List.begin(),List.end());
    return List;
index 3814cfe44cbe99ef00c0a92781fe998e8b0d8a26..1ca41cb7d66c6b21cc3950613e30f696f4e6357b 100644 (file)
@@ -171,6 +171,7 @@ std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::string
                                        bool const &SortList, bool const &AllowNoExt=false);
 std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::vector<std::string> const &Ext,
                                        bool const &SortList);
+std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, bool SortList);
 std::string SafeGetCWD();
 void SetCloseExec(int Fd,bool Close);
 void SetNonBlock(int Fd,bool Block);
index 0a366a6fbc556d1a9873706d9e365609c0dfd43c..6ef3c4a781fa8f499431a7bf160b82f1212afc15 100644 (file)
@@ -23,6 +23,8 @@ apt (0.8.16~exp13) UNRELEASED; urgency=low
   * cmdline/apt-mark.cc:
     - detect if dpkg has multiarch support before calling --set-selections
     - correctly ignore already (un)hold packages
+  * apt-pkg/cachefile.cc:
+    - clean up lost atomic cachefiles with 'clean' (Closes: #650513)
 
   [ Steve Langasek ]
   * cmdline/apt-get.cc:
@@ -45,7 +47,7 @@ apt (0.8.16~exp13) UNRELEASED; urgency=low
   * apt-pkg/contrib/fileutl.h:
     - fix compat with FileFd::OpenDescriptor() in ReadOnlyGzip mode
 
- -- David Kalnischkies <kalnischkies@gmail.com>  Sat, 11 Feb 2012 21:23:00 +0100
+ -- David Kalnischkies <kalnischkies@gmail.com>  Sat, 11 Feb 2012 22:34:29 +0100
 
 apt (0.8.16~exp12) experimental; urgency=low