* Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include <FileDescriptorIO.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
BFileDescriptorIO::BFileDescriptorIO(int fd, bool takeOverOwnership)
:
fFD(fd),
fOwnsFD(takeOverOwnership)
{
}
BFileDescriptorIO::~BFileDescriptorIO()
{
if (fOwnsFD)
close(fFD);
}
ssize_t
BFileDescriptorIO::Read(void* buffer, size_t size)
{
ssize_t bytesRead = read(fFD, buffer, size);
return bytesRead >= 0 ? bytesRead : errno;
}
ssize_t
BFileDescriptorIO::Write(const void* buffer, size_t size)
{
ssize_t bytesWritten = write(fFD, buffer, size);
return bytesWritten >= 0 ? bytesWritten : errno;
}
ssize_t
BFileDescriptorIO::ReadAt(off_t position, void* buffer, size_t size)
{
ssize_t bytesRead = pread(fFD, buffer, size, position);
return bytesRead >= 0 ? bytesRead : errno;
}
ssize_t
BFileDescriptorIO::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
BFileDescriptorIO::Seek(off_t position, uint32 seekMode)
{
off_t result = lseek(fFD, position, seekMode);
return result >= 0 ? result : errno;
}
off_t
BFileDescriptorIO::Position() const
{
off_t result = lseek(fFD, 0, SEEK_CUR);
return result >= 0 ? result : errno;
}
status_t
BFileDescriptorIO::SetSize(off_t size)
{
return ftruncate(fFD, size) == 0 ? B_OK : errno;
}
status_t
BFileDescriptorIO::GetSize(off_t* size) const
{
struct stat st;
if (fstat(fFD, &st) < 0)
return errno;
*size = st.st_size;
return B_OK;
}