Unlinking /dev/null is bad, we shouldn't do that. Also, we should print
at least a warning if we tried to unlink a file but didn't manage to
pull it of (ignoring the case were the file is /dev/null or doesn't
exist in the first place).
This got triggered by a relatively unlikely to cause problem in
pkgAcquire::Worker::PrepareFiles which would while temporary
uncompressed files (which are set to keep compressed) figure out that to
files are the same and prepare for sharing by deleting them. Bad move.
That also shows why not printing a warning is a bad idea as this hide
the error for in non-root test runs.
Git-Dch: Ignore
20 files changed:
return typeItr != types.cend();
}
/*}}}*/
return typeItr != types.cend();
}
/*}}}*/
-static bool RemoveFile(char const * const Function, std::string const &FileName)/*{{{*/
-{
- if (FileName == "/dev/null")
- return true;
- errno = 0;
- if (unlink(FileName.c_str()) != 0)
- {
- if (errno == ENOENT)
- return true;
- return _error->WarningE(Function, "Removal of file %s failed", FileName.c_str());
- }
- return true;
-}
- /*}}}*/
static bool MessageInsecureRepository(bool const isError, std::string const &msg)/*{{{*/
{
static bool MessageInsecureRepository(bool const isError, std::string const &msg)/*{{{*/
{
for (pkgAcquire::Queue::QItem::owner_iterator O = Itm->Owners.begin(); O != Itm->Owners.end(); ++O)
{
pkgAcquire::Item const * const Owner = *O;
for (pkgAcquire::Queue::QItem::owner_iterator O = Itm->Owners.begin(); O != Itm->Owners.end(); ++O)
{
pkgAcquire::Item const * const Owner = *O;
- if (Owner->DestFile == filename)
+ if (Owner->DestFile == filename || filename == "/dev/null")
- unlink(Owner->DestFile.c_str());
+ RemoveFile("PrepareFiles", Owner->DestFile);
if (link(filename.c_str(), Owner->DestFile.c_str()) != 0)
{
// different mounts can't happen for us as we download to lists/ by default,
if (link(filename.c_str(), Owner->DestFile.c_str()) != 0)
{
// different mounts can't happen for us as we download to lists/ by default,
else
{
for (pkgAcquire::Queue::QItem::owner_iterator O = Itm->Owners.begin(); O != Itm->Owners.end(); ++O)
else
{
for (pkgAcquire::Queue::QItem::owner_iterator O = Itm->Owners.begin(); O != Itm->Owners.end(); ++O)
- unlink((*O)->DestFile.c_str());
+ RemoveFile("PrepareFiles", (*O)->DestFile);
// Nothing found, nuke it
if (I == Items.end())
// Nothing found, nuke it
if (I == Items.end())
+ RemoveFile("Clean", Dir->d_name);
if (lstat((*O)->DestFile.c_str(),&file) == 0)
{
if ((file.st_mode & S_IFREG) == 0)
if (lstat((*O)->DestFile.c_str(),&file) == 0)
{
if ((file.st_mode & S_IFREG) == 0)
- unlink((*O)->DestFile.c_str());
+ RemoveFile("SyncDestinationFiles", (*O)->DestFile);
else if (supersize < file.st_size)
{
supersize = file.st_size;
else if (supersize < file.st_size)
{
supersize = file.st_size;
- unlink(superfile.c_str());
+ RemoveFile("SyncDestinationFiles", superfile);
rename((*O)->DestFile.c_str(), superfile.c_str());
}
else
rename((*O)->DestFile.c_str(), superfile.c_str());
}
else
- unlink((*O)->DestFile.c_str());
+ RemoveFile("SyncDestinationFiles", (*O)->DestFile);
if (symlink(superfile.c_str(), (*O)->DestFile.c_str()) != 0)
{
; // not a problem per-se and no real alternative
if (symlink(superfile.c_str(), (*O)->DestFile.c_str()) != 0)
{
; // not a problem per-se and no real alternative
std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache");
if (pkgcache.empty() == false && RealFileExists(pkgcache) == true)
std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache");
if (pkgcache.empty() == false && RealFileExists(pkgcache) == true)
- unlink(pkgcache.c_str());
+ RemoveFile("RemoveCaches", pkgcache);
if (srcpkgcache.empty() == false && RealFileExists(srcpkgcache) == true)
if (srcpkgcache.empty() == false && RealFileExists(srcpkgcache) == true)
- unlink(srcpkgcache.c_str());
+ RemoveFile("RemoveCaches", srcpkgcache);
if (pkgcache.empty() == false)
{
std::string cachedir = flNotFile(pkgcache);
if (pkgcache.empty() == false)
{
std::string cachedir = flNotFile(pkgcache);
std::string nuke = flNotDir(*file);
if (strncmp(cachefile.c_str(), nuke.c_str(), cachefile.length()) != 0)
continue;
std::string nuke = flNotDir(*file);
if (strncmp(cachefile.c_str(), nuke.c_str(), cachefile.length()) != 0)
continue;
+ RemoveFile("RemoveCaches", *file);
std::string nuke = flNotDir(*file);
if (strncmp(cachefile.c_str(), nuke.c_str(), cachefile.length()) != 0)
continue;
std::string nuke = flNotDir(*file);
if (strncmp(cachefile.c_str(), nuke.c_str(), cachefile.length()) != 0)
continue;
+ RemoveFile("RemoveCaches", *file);
{
string DFile = _config->FindFile("Dir::State::cdroms");
string NewFile = DFile + ".new";
{
string DFile = _config->FindFile("Dir::State::cdroms");
string NewFile = DFile + ".new";
-
- unlink(NewFile.c_str());
+
+ RemoveFile("WriteDatabase", NewFile);
ofstream Out(NewFile.c_str());
if (!Out)
return _error->Errno("ofstream::ofstream",
ofstream Out(NewFile.c_str());
if (!Out)
return _error->Errno("ofstream::ofstream",
return _error->Errno("ifstream::ifstream","Opening %s",File.c_str());
string NewFile = File + ".new";
return _error->Errno("ifstream::ifstream","Opening %s",File.c_str());
string NewFile = File + ".new";
- unlink(NewFile.c_str());
+ RemoveFile("WriteDatabase", NewFile);
ofstream Out(NewFile.c_str());
if (!Out)
return _error->Errno("ofstream::ofstream",
ofstream Out(NewFile.c_str());
if (!Out)
return _error->Errno("ofstream::ofstream",
return false;
} while (ToRead != 0);
return false;
} while (ToRead != 0);
+ return true;
+}
+ /*}}}*/
+bool RemoveFile(char const * const Function, std::string const &FileName)/*{{{*/
+{
+ if (FileName == "/dev/null")
+ return true;
+ errno = 0;
+ if (unlink(FileName.c_str()) != 0)
+ {
+ if (errno == ENOENT)
+ return true;
+
+ return _error->WarningE(Function,_("Problem unlinking the file %s"), FileName.c_str());
+ }
else if ((OpenMode & (Exclusive | Create)) == (Exclusive | Create))
{
// for atomic, this will be done by rename in Close()
else if ((OpenMode & (Exclusive | Create)) == (Exclusive | Create))
{
// for atomic, this will be done by rename in Close()
- unlink(FileName.c_str());
+ RemoveFile("FileFd::Open", FileName);
}
if ((OpenMode & Empty) == Empty)
{
struct stat Buf;
if (lstat(FileName.c_str(),&Buf) == 0 && S_ISLNK(Buf.st_mode))
}
if ((OpenMode & Empty) == Empty)
{
struct stat Buf;
if (lstat(FileName.c_str(),&Buf) == 0 && S_ISLNK(Buf.st_mode))
- unlink(FileName.c_str());
+ RemoveFile("FileFd::Open", FileName);
if ((Flags & Fail) == Fail && (Flags & DelOnFail) == DelOnFail &&
FileName.empty() == false)
if ((Flags & Fail) == Fail && (Flags & DelOnFail) == DelOnFail &&
FileName.empty() == false)
- if (unlink(FileName.c_str()) != 0)
- Res &= _error->WarningE("unlnk",_("Problem unlinking the file %s"), FileName.c_str());
+ Res &= RemoveFile("FileFd::Close", FileName);
if (Res == false)
Flags |= Fail;
if (Res == false)
Flags |= Fail;
bool RunScripts(const char *Cnf);
bool CopyFile(FileFd &From,FileFd &To);
bool RunScripts(const char *Cnf);
bool CopyFile(FileFd &From,FileFd &To);
+bool RemoveFile(char const * const Function, std::string const &FileName);
int GetLock(std::string File,bool Errors = true);
bool FileExists(std::string File);
bool RealFileExists(std::string File);
int GetLock(std::string File,bool Errors = true);
bool FileExists(std::string File);
bool RealFileExists(std::string File);
{
std::string const oldpkgcache = _config->FindFile("Dir::cache::pkgcache");
if (oldpkgcache.empty() == false && RealFileExists(oldpkgcache) == true &&
{
std::string const oldpkgcache = _config->FindFile("Dir::cache::pkgcache");
if (oldpkgcache.empty() == false && RealFileExists(oldpkgcache) == true &&
- unlink(oldpkgcache.c_str()) == 0)
+ RemoveFile("pkgDPkgPM::Go", oldpkgcache))
{
std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache");
if (srcpkgcache.empty() == false && RealFileExists(srcpkgcache) == true)
{
std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache");
if (srcpkgcache.empty() == false && RealFileExists(srcpkgcache) == true)
edspListParserPrivate()
{
std::string const states = _config->FindFile("Dir::State::extended_states");
edspListParserPrivate()
{
std::string const states = _config->FindFile("Dir::State::extended_states");
- if (states != "/dev/null")
- unlink(states.c_str());
+ RemoveFile("edspListParserPrivate", states);
extendedstates.Open(states, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600);
std::string const prefs = _config->FindFile("Dir::Etc::preferences");
extendedstates.Open(states, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600);
std::string const prefs = _config->FindFile("Dir::Etc::preferences");
- if (prefs != "/dev/null")
- unlink(prefs.c_str());
+ RemoveFile("edspListParserPrivate", prefs);
preferences.Open(prefs, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600);
}
};
preferences.Open(prefs, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600);
}
};
if (tempDir.empty())
return;
if (tempDir.empty())
return;
- unlink(tempStatesFile.c_str());
- unlink(tempPrefsFile.c_str());
+ RemoveFile("DeInitialize", tempStatesFile);
+ RemoveFile("DeInitialize", tempPrefsFile);
rmdir(tempDir.c_str());
}
rmdir(tempDir.c_str());
}
c1out << "Del " << Pkg << " " << Ver << " [" << SizeToStr(St.st_size) << "B]" << std::endl;
if (_config->FindB("APT::Get::Simulate") == false)
c1out << "Del " << Pkg << " " << Ver << " [" << SizeToStr(St.st_size) << "B]" << std::endl;
if (_config->FindB("APT::Get::Simulate") == false)
+ RemoveFile("Cleaner::Erase", File);
};
};
bool DoAutoClean(CommandLine &)
};
};
bool DoAutoClean(CommandLine &)
- if (strcmp(filename, "/dev/null") != 0)
- unlink(filename);
+ RemoveFile(argv[0], filename);
FileFd input, output;
if (input.OpenDescriptor(STDIN_FILENO, FileFd::ReadOnly) == false ||
output.Open(filename, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600) == false ||
FileFd input, output;
if (input.OpenDescriptor(STDIN_FILENO, FileFd::ReadOnly) == false ||
output.Open(filename, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600) == false ||
auto files = GetListOfFilesInDir(dir, false);
std::sort(files.begin(), files.end(), Cmp());
auto files = GetListOfFilesInDir(dir, false);
std::sort(files.begin(), files.end(), Cmp());
- for (auto I=files.begin(); I<files.end()-KeepFiles; I++) {
- unlink((*I).c_str());
- }
+ for (auto I=files.begin(); I<files.end()-KeepFiles; ++I)
+ RemoveFile("DeleteAllButMostRecent", *I);
}
// Takes a input filename (e.g. binary-i386/Packages) and a hashstring
}
// Takes a input filename (e.g. binary-i386/Packages) and a hashstring
for (Files *I = Outputs; I != 0; I = I->Next)
{
I->TmpFile.Close();
for (Files *I = Outputs; I != 0; I = I->Next)
{
I->TmpFile.Close();
- if (unlink(I->TmpFile.Name().c_str()) != 0)
- _error->Errno("unlink",_("Problem unlinking %s"),
- I->TmpFile.Name().c_str());
+ RemoveFile("MultiCompress::Child", I->TmpFile.Name());
}
return !_error->PendingError();
}
}
return !_error->PendingError();
}
_error->Errno("readlink",_("Failed to readlink %s"),OriginalPath);
else
{
_error->Errno("readlink",_("Failed to readlink %s"),OriginalPath);
else
{
- if (unlink(OriginalPath) != 0)
- _error->Errno("unlink",_("Failed to unlink %s"),OriginalPath);
- else
+ if (RemoveFile("FTWScanner::Delink", OriginalPath))
{
if (link(FileName.c_str(),OriginalPath) != 0)
{
{
if (link(FileName.c_str(),OriginalPath) != 0)
{
}
}
if (Res.IMSHit != true)
}
}
if (Res.IMSHit != true)
- unlink(Itm->DestFile.c_str());
+ RemoveFile("file", Itm->DestFile);
// See if the file exists
if (stat(File.c_str(),&Buf) == 0)
// See if the file exists
if (stat(File.c_str(),&Buf) == 0)
// If the file is missing we hard fail and delete the destfile
// otherwise transient fail
if (Missing == true) {
// If the file is missing we hard fail and delete the destfile
// otherwise transient fail
if (Missing == true) {
- unlink(FailFile.c_str());
+ RemoveFile("ftp", FailFile);
return false;
}
Fail(true);
return false;
}
Fail(true);
// server says file not modified
if (Server->Result == 304 || curl_condition_unmet == 1)
{
// server says file not modified
if (Server->Result == 304 || curl_condition_unmet == 1)
{
- unlink(File->Name().c_str());
+ RemoveFile("https", File->Name());
Res.IMSHit = true;
Res.LastModified = Itm->LastModified;
Res.Size = 0;
Res.IMSHit = true;
Res.LastModified = Itm->LastModified;
Res.Size = 0;
SetFailReason(err);
_error->Error("%i %s", Server->Result, Server->Code);
// unlink, no need keep 401/404 page content in partial/
SetFailReason(err);
_error->Error("%i %s", Server->Result, Server->Code);
// unlink, no need keep 401/404 page content in partial/
- unlink(File->Name().c_str());
+ RemoveFile("https", File->Name());
return false;
}
// invalid range-request
if (Server->Result == 416)
{
return false;
}
// invalid range-request
if (Server->Result == 416)
{
- unlink(File->Name().c_str());
+ RemoveFile("https", File->Name());
delete File;
Redirect(Itm->Uri);
return true;
delete File;
Redirect(Itm->Uri);
return true;
}
// nothing found, nuke it
if (I == list.end())
}
// nothing found, nuke it
if (I == list.end())
+ RemoveFile("mirror", Dir->d_name);
// Not Modified
if (Server->Result == 304)
{
// Not Modified
if (Server->Result == 304)
{
- unlink(Queue->DestFile.c_str());
+ RemoveFile("server", Queue->DestFile);
Res.IMSHit = true;
Res.LastModified = Queue->LastModified;
return IMS_HIT;
Res.IMSHit = true;
Res.LastModified = Queue->LastModified;
return IMS_HIT;
Server->StartPos = Server->TotalFileSize;
Server->Result = 200;
}
Server->StartPos = Server->TotalFileSize;
Server->Result = 200;
}
- else if (unlink(Queue->DestFile.c_str()) == 0)
+ else if (RemoveFile("server", Queue->DestFile))
{
NextURI = Queue->Uri;
return TRY_AGAIN_OR_REDIRECT;
{
NextURI = Queue->Uri;
return TRY_AGAIN_OR_REDIRECT;