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