aboutsummaryrefslogtreecommitdiff
path: root/src/common/platform/unix/UnixFileStream.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-10-06 13:57:39 +0800
committercrupest <crupest@outlook.com>2024-10-06 13:57:39 +0800
commitdfe62dcf8bcefc523b466e127c3edc4dc2756629 (patch)
tree1c751a14ba0da07ca2ff805633f97568060aa4c9 /src/common/platform/unix/UnixFileStream.cpp
parentf51eb955e188858272230a990565931e7403f23b (diff)
downloadcru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.tar.gz
cru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.tar.bz2
cru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.zip
Rename common to base.
Diffstat (limited to 'src/common/platform/unix/UnixFileStream.cpp')
-rw-r--r--src/common/platform/unix/UnixFileStream.cpp106
1 files changed, 0 insertions, 106 deletions
diff --git a/src/common/platform/unix/UnixFileStream.cpp b/src/common/platform/unix/UnixFileStream.cpp
deleted file mode 100644
index 804e24f0..00000000
--- a/src/common/platform/unix/UnixFileStream.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#include "cru/common/platform/unix/UnixFileStream.h"
-#include "cru/common/Exception.h"
-#include "cru/common/Format.h"
-#include "cru/common/io/Stream.h"
-#include "cru/common/log/Logger.h"
-
-#include <fcntl.h>
-#include <sys/fcntl.h>
-#include <unistd.h>
-#include <cerrno>
-
-namespace cru::platform::unix {
-using namespace cru::io;
-
-namespace {
-bool OflagCanSeek([[maybe_unused]] int oflag) {
- // Treat every file seekable.
- return true;
-}
-
-bool OflagCanRead(int oflag) {
- // There is a problem: O_RDONLY is 0. So we must test it specially.
- // If it is not write-only. Then it can read.
- return !(oflag & O_WRONLY);
-}
-
-bool OflagCanWrite(int oflag) { return oflag & O_WRONLY || oflag & O_RDWR; }
-
-int MapSeekOrigin(Stream::SeekOrigin origin) {
- switch (origin) {
- case Stream::SeekOrigin::Begin:
- return SEEK_SET;
- case Stream::SeekOrigin::Current:
- return SEEK_CUR;
- case Stream::SeekOrigin::End:
- return SEEK_END;
- default:
- throw Exception(u"Invalid seek origin.");
- }
-}
-} // namespace
-
-UnixFileStream::UnixFileStream(const char *path, int oflag, mode_t mode) {
- file_descriptor_ = ::open(path, oflag, mode);
- if (file_descriptor_ == -1) {
- throw ErrnoException(
- Format(u"Failed to open file {} with oflag {}, mode {}.",
- String::FromUtf8(path), oflag, mode));
- }
-
- SetSupportedOperations(
- {OflagCanSeek(oflag), OflagCanRead(oflag), OflagCanWrite(oflag)});
-
- auto_close_ = true;
-}
-
-UnixFileStream::UnixFileStream(int fd, bool can_seek, bool can_read,
- bool can_write, bool auto_close)
- : Stream(can_seek, can_read, can_write) {
- file_descriptor_ = fd;
- auto_close_ = auto_close;
-}
-
-UnixFileStream::~UnixFileStream() {
- if (auto_close_ && file_descriptor_ >= 0) {
- if (::close(file_descriptor_) == -1) {
- // We are in destructor, so we can not throw.
- CRU_LOG_WARN(u"Failed to close file descriptor {}, errno {}.",
- file_descriptor_, errno);
- }
- }
-}
-
-Index UnixFileStream::DoSeek(Index offset, SeekOrigin origin) {
- off_t result = ::lseek(file_descriptor_, offset, MapSeekOrigin(origin));
- if (result == -1) {
- throw ErrnoException(u"Failed to seek file.");
- }
- return result;
-}
-
-Index UnixFileStream::DoRead(std::byte *buffer, Index offset, Index size) {
- auto result = ::read(file_descriptor_, buffer + offset, size);
- if (result == -1) {
- throw ErrnoException(u"Failed to read file.");
- }
- return result;
-}
-
-Index UnixFileStream::DoWrite(const std::byte *buffer, Index offset,
- Index size) {
- auto result = ::write(file_descriptor_, buffer + offset, size);
- if (result == -1) {
- throw ErrnoException(u"Failed to write file.");
- }
- return result;
-}
-
-void UnixFileStream::DoClose() {
- CRU_STREAM_BEGIN_CLOSE
- if (auto_close_ && ::close(file_descriptor_) == -1) {
- throw ErrnoException(u"Failed to close file.");
- }
- file_descriptor_ = -1;
-}
-} // namespace cru::platform::unix