From fdddc7f4a8884a8481dc71c0f34b8775659ba236 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Thu, 4 Sep 2025 22:51:27 +0800 Subject: UnixFileDescriptor Read and ErrnoException std::string. --- src/base/platform/unix/UnixFile.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/base/platform/unix/UnixFile.cpp') diff --git a/src/base/platform/unix/UnixFile.cpp b/src/base/platform/unix/UnixFile.cpp index a3c5cc6c..763161ce 100644 --- a/src/base/platform/unix/UnixFile.cpp +++ b/src/base/platform/unix/UnixFile.cpp @@ -3,8 +3,9 @@ #include "cru/base/log/Logger.h" #include -#include +#include #include +#include namespace cru::platform::unix { @@ -68,7 +69,7 @@ int UnixFileDescriptor::GetValue() const { void UnixFileDescriptor::Close() { EnsureValid(); if (!this->DoClose()) { - throw ErrnoException(u"Failed to call close on file descriptor."); + throw ErrnoException("Failed to call close on file descriptor."); } descriptor_ = -1; auto_close_ = false; @@ -82,17 +83,30 @@ bool UnixFileDescriptor::DoClose() { } } +ssize_t UnixFileDescriptor::Read(void* buffer, size_t size) { + EnsureValid(); + auto result = ::read(GetValue(), buffer, size); + if (result == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return -1; + } else { + throw ErrnoException("Failed to read on file descriptor."); + } + } + return result; +} + void UnixFileDescriptor::SetFileDescriptorFlags(int flags) { EnsureValid(); if (::fcntl(GetValue(), F_SETFL, flags) != -1) { - throw ErrnoException(u"Failed to set flags on file descriptor."); + throw ErrnoException("Failed to set flags on file descriptor."); } } UniDirectionalUnixPipeResult OpenUniDirectionalPipe(UnixPipeFlag flags) { int fds[2]; if (::pipe(fds) != 0) { - throw ErrnoException(u"Failed to create unix pipe."); + throw ErrnoException("Failed to create unix pipe."); } UnixFileDescriptor read(fds[0]), write(fds[1]); -- cgit v1.2.3