diff options
author | Max Kellermann <max@duempel.org> | 2015-03-23 22:42:07 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2015-03-23 22:51:33 +0100 |
commit | 7f6e1fbc8d463308e374bb7d9b112cd9f452f76e (patch) | |
tree | 594b1bcda0447cef890d071ea558c573df831ec9 /src/fs/io/FileOutputStream.cxx | |
parent | 06827cfcf14f33578432b1c5435f827caaf1de6f (diff) | |
download | mpd-7f6e1fbc8d463308e374bb7d9b112cd9f452f76e.tar.gz mpd-7f6e1fbc8d463308e374bb7d9b112cd9f452f76e.tar.xz mpd-7f6e1fbc8d463308e374bb7d9b112cd9f452f76e.zip |
fs/io/FileOutputStream: add class AppendFileOutputStream
Diffstat (limited to 'src/fs/io/FileOutputStream.cxx')
-rw-r--r-- | src/fs/io/FileOutputStream.cxx | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/fs/io/FileOutputStream.cxx b/src/fs/io/FileOutputStream.cxx index f587874a3..82d9c3dc1 100644 --- a/src/fs/io/FileOutputStream.cxx +++ b/src/fs/io/FileOutputStream.cxx @@ -197,4 +197,59 @@ FileOutputStream::Cancel() RemoveFile(GetPath()); } +#ifdef WIN32 + +FileOutputStream::FileOutputStream(Path _path, Error &error) + :path(_path), + handle(CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH, + nullptr)) +{ + if (handle == INVALID_HANDLE_VALUE) { + const auto path_utf8 = path.ToUTF8(); + error.FormatLastError("Failed to create %s", + path_utf8.c_str()); + } +} + +#else + +AppendFileOutputStream::AppendFileOutputStream(Path _path, Error &error) + :BaseFileOutputStream(_path) +{ +#ifdef WIN32 + SetHandle(CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH, + nullptr)) + if (!IsDefined()) + error.FormatLastError("Failed to append to %s", + GetPath().ToUTF8().c_str()); +#else + if (!SetFD().Open(GetPath().c_str(), + O_WRONLY|O_APPEND)) + error.FormatErrno("Failed to append to %s", + GetPath().c_str()); +#endif +} + +#endif + +bool +AppendFileOutputStream::Commit(gcc_unused Error &error) +{ + assert(IsDefined()); + +#ifdef WIN32 + return Close(); +#else + bool success = Close(); + if (!success) + error.FormatErrno("Failed to commit %s", GetPath().c_str()); + + return success; +#endif +} + #endif |