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); const auto path_fs = spl_map_to_fs(name_utf8);
assert(!path_fs.IsNull()); assert(!path_fs.IsNull());
if (!RemoveFile(path_fs)) try {
ThrowPlaylistErrno(); 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); idle_add(IDLE_STORED_PLAYLIST);
} }

View File

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

View File

@ -66,3 +66,15 @@ TruncateFile(Path path)
close(fd); close(fd);
#endif #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); 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 void
RemoveFile(Path file) RemoveFile(Path path);
{
#ifdef WIN32
return _tunlink(file.c_str()) == 0;
#else
return unlink(file.c_str()) == 0;
#endif
}
/** /**
* Wrapper for readlink() that uses #Path names. * Wrapper for readlink() that uses #Path names.

View File

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

View File

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

View File

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

View File

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