fs/FileSystem: RemoveFile() throws exception on error

This commit is contained in:
Max Kellermann 2016-08-15 22:25:15 +02:00
parent 14d3da0e18
commit ea0e6d9824
8 changed files with 48 additions and 22 deletions

View File

@ -321,8 +321,15 @@ spl_delete(const char *name_utf8)
const auto path_fs = spl_map_to_fs(name_utf8);
assert(!path_fs.IsNull());
if (!RemoveFile(path_fs))
ThrowPlaylistErrno();
try {
RemoveFile(path_fs);
} catch (const std::system_error &e) {
if (IsFileNotFound(e))
throw PlaylistError(PlaylistResult::NO_SUCH_LIST,
"No such playlist");
else
throw;
}
idle_add(IDLE_STORED_PLAYLIST);
}

View File

@ -426,7 +426,7 @@ ServerSocket::AddPath(AllocatedPath &&path, Error &error)
#ifdef HAVE_UN
(void)error;
RemoveFile(path);
unlink(path.c_str());
AllocatedSocketAddress address;
address.SetLocal(path.c_str());

View File

@ -66,3 +66,15 @@ TruncateFile(Path path)
close(fd);
#endif
}
void
RemoveFile(Path path)
{
#ifdef WIN32
if (!DeleteFile(path.c_str()))
throw FormatLastError("Failed to delete %s", path.c_str());
#else
if (unlink(path.c_str()) < 0)
throw FormatErrno("Failed to delete %s", path.c_str());
#endif
}

View File

@ -100,17 +100,11 @@ void
TruncateFile(Path path);
/**
* Wrapper for unlink() that uses #Path names.
* Wrapper for unlink() that uses #Path names. Throws
* std::system_error on error.
*/
static inline bool
RemoveFile(Path file)
{
#ifdef WIN32
return _tunlink(file.c_str()) == 0;
#else
return unlink(file.c_str()) == 0;
#endif
}
void
RemoveFile(Path path);
/**
* Wrapper for readlink() that uses #Path names.

View File

@ -76,7 +76,11 @@ FileOutputStream::Cancel()
assert(IsDefined());
Close();
RemoveFile(GetPath());
try {
RemoveFile(GetPath());
} catch (std::runtime_error) {
}
}
#else
@ -153,7 +157,10 @@ FileOutputStream::Commit()
#if HAVE_LINKAT
if (is_tmpfile) {
RemoveFile(GetPath());
try {
RemoveFile(GetPath());
} catch (std::runtime_error) {
}
/* hard-link the temporary file to the final path */
char fd_path[64];
@ -186,7 +193,10 @@ FileOutputStream::Cancel()
#ifdef HAVE_LINKAT
if (!is_tmpfile)
#endif
RemoveFile(GetPath());
try {
RemoveFile(GetPath());
} catch (std::runtime_error) {
}
}
#endif

View File

@ -87,10 +87,10 @@ FifoOutput::Delete()
FormatDebug(fifo_output_domain,
"Removing FIFO \"%s\"", path_utf8.c_str());
if (!RemoveFile(path)) {
FormatErrno(fifo_output_domain,
"Could not remove FIFO \"%s\"",
path_utf8.c_str());
try {
RemoveFile(path);
} catch (const std::runtime_error &e) {
LogError(e, "Could not remove FIFO");
return;
}

View File

@ -22,7 +22,10 @@
#include "system/FatalError.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/FileSystem.hxx"
#ifndef WIN32
#include "PidFile.hxx"
#endif
#include <stdlib.h>
#include <unistd.h>
@ -247,7 +250,7 @@ void
daemonize_finish(void)
{
if (!pidfile.IsNull()) {
RemoveFile(pidfile);
unlink(pidfile.c_str());
pidfile = AllocatedPath::Null();
}

View File

@ -64,7 +64,7 @@ public:
assert(!path.IsNull());
close(fd);
RemoveFile(path);
unlink(path.c_str());
}
void Write(pid_t pid) {