From c55a06055f7c2523d188ce382806fe98eaa06bb6 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 12 Jul 2014 13:23:31 +0200 Subject: [PATCH] Add private class BFdIO Simple BPositionIO implementation using the POSIX API on a FD. In effect similar to BFile, but more easily ported to kernel and boot loader (and the FD is reusable). --- headers/build/private/storage/FdIO.h | 1 + headers/private/storage/FdIO.h | 45 ++++++++++ src/build/libbe/storage/Jamfile | 1 + src/kits/storage/FdIO.cpp | 122 +++++++++++++++++++++++++++ src/kits/storage/Jamfile | 1 + 5 files changed, 170 insertions(+) create mode 100644 headers/build/private/storage/FdIO.h create mode 100644 headers/private/storage/FdIO.h create mode 100644 src/kits/storage/FdIO.cpp diff --git a/headers/build/private/storage/FdIO.h b/headers/build/private/storage/FdIO.h new file mode 100644 index 0000000000..d61b0a0da9 --- /dev/null +++ b/headers/build/private/storage/FdIO.h @@ -0,0 +1 @@ +#include <../private/storage/FdIO.h> diff --git a/headers/private/storage/FdIO.h b/headers/private/storage/FdIO.h new file mode 100644 index 0000000000..ca531d01d6 --- /dev/null +++ b/headers/private/storage/FdIO.h @@ -0,0 +1,45 @@ +/* + * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef _FD_IO_H_ +#define _FD_IO_H_ + + +#include + + +class BFdIO : public BPositionIO { +public: + BFdIO(); + BFdIO(int fd, bool keepFd); + virtual ~BFdIO(); + + void SetTo(int fd, bool keepFd); + void Unset(); + + virtual ssize_t Read(void* buffer, size_t size); + virtual ssize_t Write(const void* buffer, size_t size); + + virtual ssize_t ReadAt(off_t position, void* buffer, + size_t size); + virtual ssize_t WriteAt(off_t position, const void* buffer, + size_t size); + + virtual off_t Seek(off_t position, uint32 seekMode); + virtual off_t Position() const; + + virtual status_t SetSize(off_t size); + virtual status_t GetSize(off_t* _size) const; + +private: + BFdIO(const BFdIO& other); + BFdIO& operator=(const BFdIO& other); + +private: + int fFd; + bool fOwnsFd; +}; + + +#endif // _FD_IO_H_ diff --git a/src/build/libbe/storage/Jamfile b/src/build/libbe/storage/Jamfile index da3e194723..f4a5dfd2ad 100644 --- a/src/build/libbe/storage/Jamfile +++ b/src/build/libbe/storage/Jamfile @@ -14,6 +14,7 @@ BuildPlatformMergeObjectPIC storage_kit.o : DriverSettings.cpp Entry.cpp EntryList.cpp + FdIO.cpp File.cpp FileIO.cpp FindDirectory.cpp diff --git a/src/kits/storage/FdIO.cpp b/src/kits/storage/FdIO.cpp new file mode 100644 index 0000000000..19e83b3f29 --- /dev/null +++ b/src/kits/storage/FdIO.cpp @@ -0,0 +1,122 @@ +/* + * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include +#include +#include + + +BFdIO::BFdIO() + : + BPositionIO(), + fFd(-1), + fOwnsFd(false) +{ +} + + +BFdIO::BFdIO(int fd, bool keepFd) + : + BPositionIO(), + fFd(fd), + fOwnsFd(keepFd) +{ +} + + +BFdIO::~BFdIO() +{ + Unset(); +} + + +void +BFdIO::SetTo(int fd, bool keepFd) +{ + Unset(); + + fFd = fd; + fOwnsFd = keepFd; +} + + +void +BFdIO::Unset() +{ + if (fOwnsFd && fFd >= 0) + close(fFd); + + fFd = -1; + fOwnsFd = false; +} + + +ssize_t +BFdIO::Read(void* buffer, size_t size) +{ + ssize_t bytesRead = read(fFd, buffer, size); + return bytesRead >= 0 ? bytesRead : errno; +} + + +ssize_t +BFdIO::Write(const void* buffer, size_t size) +{ + ssize_t bytesWritten = write(fFd, buffer, size); + return bytesWritten >= 0 ? bytesWritten : errno; +} + + +ssize_t +BFdIO::ReadAt(off_t position, void* buffer, size_t size) +{ + ssize_t bytesRead = pread(fFd, buffer, size, position); + return bytesRead >= 0 ? bytesRead : errno; +} + + +ssize_t +BFdIO::WriteAt(off_t position, const void* buffer, size_t size) +{ + ssize_t bytesWritten = pwrite(fFd, buffer, size, position); + return bytesWritten >= 0 ? bytesWritten : errno; +} + + +off_t +BFdIO::Seek(off_t position, uint32 seekMode) +{ + off_t newPosition = lseek(fFd, position, seekMode); + return newPosition >= 0 ? newPosition : errno; +} + + +off_t +BFdIO::Position() const +{ + return const_cast(this)->BFdIO::Seek(0, SEEK_CUR); +} + + +status_t +BFdIO::SetSize(off_t size) +{ + return ftruncate(fFd, size) == 0 ? B_OK : errno; +} + + +status_t +BFdIO::GetSize(off_t* _size) const +{ + struct stat st; + if (fstat(fFd, &st) != 0) + return errno; + + *_size = st.st_size; + return B_OK; +} diff --git a/src/kits/storage/Jamfile b/src/kits/storage/Jamfile index f7703a39f0..2343954a97 100644 --- a/src/kits/storage/Jamfile +++ b/src/kits/storage/Jamfile @@ -27,6 +27,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { Entry.cpp EntryList.cpp EntryOperationEngineBase.cpp + FdIO.cpp File.cpp FileDescriptorIO.cpp FileIO.cpp