1/* 2 * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include <FileDescriptorIO.h> 8 9#include <errno.h> 10#include <stdio.h> 11#include <sys/stat.h> 12#include <unistd.h> 13 14 15BFileDescriptorIO::BFileDescriptorIO(int fd, bool takeOverOwnership) 16 : 17 fFD(fd), 18 fOwnsFD(takeOverOwnership) 19{ 20} 21 22 23BFileDescriptorIO::~BFileDescriptorIO() 24{ 25 if (fOwnsFD) 26 close(fFD); 27} 28 29 30ssize_t 31BFileDescriptorIO::Read(void* buffer, size_t size) 32{ 33 ssize_t bytesRead = read(fFD, buffer, size); 34 return bytesRead >= 0 ? bytesRead : errno; 35} 36 37 38ssize_t 39BFileDescriptorIO::Write(const void* buffer, size_t size) 40{ 41 ssize_t bytesWritten = write(fFD, buffer, size); 42 return bytesWritten >= 0 ? bytesWritten : errno; 43} 44 45 46ssize_t 47BFileDescriptorIO::ReadAt(off_t position, void* buffer, size_t size) 48{ 49 ssize_t bytesRead = pread(fFD, buffer, size, position); 50 return bytesRead >= 0 ? bytesRead : errno; 51} 52 53 54ssize_t 55BFileDescriptorIO::WriteAt(off_t position, const void* buffer, size_t size) 56{ 57 ssize_t bytesWritten = pwrite(fFD, buffer, size, position); 58 return bytesWritten >= 0 ? bytesWritten : errno; 59} 60 61 62off_t 63BFileDescriptorIO::Seek(off_t position, uint32 seekMode) 64{ 65 off_t result = lseek(fFD, position, seekMode); 66 return result >= 0 ? result : errno; 67} 68 69 70off_t 71BFileDescriptorIO::Position() const 72{ 73 off_t result = lseek(fFD, 0, SEEK_CUR); 74 return result >= 0 ? result : errno; 75} 76 77 78status_t 79BFileDescriptorIO::SetSize(off_t size) 80{ 81 return ftruncate(fFD, size) == 0 ? B_OK : errno; 82} 83 84 85status_t 86BFileDescriptorIO::GetSize(off_t* size) const 87{ 88 struct stat st; 89 if (fstat(fFD, &st) < 0) 90 return errno; 91 92 *size = st.st_size; 93 return B_OK; 94} 95