1/*
2 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <FdIO.h>
8
9#include <errno.h>
10#include <fcntl.h>
11#include <unistd.h>
12
13
14BFdIO::BFdIO()
15	:
16	BPositionIO(),
17	fFd(-1),
18	fOwnsFd(false)
19{
20}
21
22
23BFdIO::BFdIO(int fd, bool keepFd)
24	:
25	BPositionIO(),
26	fFd(fd),
27	fOwnsFd(keepFd)
28{
29}
30
31
32BFdIO::~BFdIO()
33{
34	Unset();
35}
36
37
38void
39BFdIO::SetTo(int fd, bool keepFd)
40{
41	Unset();
42
43	fFd = fd;
44	fOwnsFd = keepFd;
45}
46
47
48void
49BFdIO::Unset()
50{
51	if (fOwnsFd && fFd >= 0)
52		close(fFd);
53
54	fFd = -1;
55	fOwnsFd = false;
56}
57
58
59ssize_t
60BFdIO::Read(void* buffer, size_t size)
61{
62	ssize_t bytesRead = read(fFd, buffer, size);
63	return bytesRead >= 0 ? bytesRead : errno;
64}
65
66
67ssize_t
68BFdIO::Write(const void* buffer, size_t size)
69{
70	ssize_t bytesWritten = write(fFd, buffer, size);
71	return bytesWritten >= 0 ? bytesWritten : errno;
72}
73
74
75ssize_t
76BFdIO::ReadAt(off_t position, void* buffer, size_t size)
77{
78	ssize_t bytesRead = pread(fFd, buffer, size, position);
79	return bytesRead >= 0 ? bytesRead : errno;
80}
81
82
83ssize_t
84BFdIO::WriteAt(off_t position, const void* buffer, size_t size)
85{
86	ssize_t bytesWritten = pwrite(fFd, buffer, size, position);
87	return bytesWritten >= 0 ? bytesWritten : errno;
88}
89
90
91off_t
92BFdIO::Seek(off_t position, uint32 seekMode)
93{
94	off_t newPosition = lseek(fFd, position, seekMode);
95	return newPosition >= 0 ? newPosition : errno;
96}
97
98
99off_t
100BFdIO::Position() const
101{
102	return const_cast<BFdIO*>(this)->BFdIO::Seek(0, SEEK_CUR);
103}
104
105
106status_t
107BFdIO::SetSize(off_t size)
108{
109	return ftruncate(fFd, size) == 0 ? B_OK : errno;
110}
111
112
113status_t
114BFdIO::GetSize(off_t* _size) const
115{
116	struct stat st;
117	if (fstat(fFd, &st) != 0)
118		return errno;
119
120	*_size = st.st_size;
121	return B_OK;
122}
123