1/*
2 * Copyright 2003-2005, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "Handle.h"
8
9#include <SupportDefs.h>
10#include <boot/platform.h>
11
12#include <stdio.h>
13#include <unistd.h>
14#include <fcntl.h>
15#include <string.h>
16#include <stdlib.h>
17#include <errno.h>
18
19
20#ifndef HAVE_READ_POS
21#	define read_pos(fd, pos, buffer, size) pread(fd, buffer, size, pos)
22#	define write_pos(fd, pos, buffer, size) pwrite(fd, buffer, size, pos)
23#endif
24
25
26Handle::Handle(int handle, bool takeOwnership)
27	:
28	fHandle(handle),
29	fOwnHandle(takeOwnership),
30	fPath(NULL)
31{
32}
33
34
35Handle::Handle(const char *path)
36	:
37	fOwnHandle(true),
38	fPath(NULL)
39{
40	fHandle = open(path, O_RDONLY);
41	if (fHandle < B_OK) {
42		fHandle = errno;
43		return;
44	}
45
46	fPath = strdup(path);
47}
48
49
50Handle::Handle(void)
51	:
52	fHandle(0)
53{
54}
55
56
57Handle::~Handle()
58{
59	if (fOwnHandle)
60		close(fHandle);
61
62	free(fPath);
63}
64
65
66status_t
67Handle::InitCheck()
68{
69	return fHandle < B_OK ? fHandle : B_OK;
70}
71
72
73void
74Handle::SetTo(int handle, bool takeOwnership)
75{
76	if (fHandle && fOwnHandle)
77		close(fHandle);
78
79	fHandle = handle;
80	fOwnHandle = takeOwnership;
81}
82
83
84ssize_t
85Handle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
86{
87	//printf("Handle::ReadAt(pos = %lld, buffer = %p, size = %lu)\n", pos, buffer, bufferSize);
88	return read_pos(fHandle, pos, buffer, bufferSize);
89}
90
91
92ssize_t
93Handle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
94{
95	return write_pos(fHandle, pos, buffer, bufferSize);
96}
97
98
99status_t
100Handle::GetName(char *nameBuffer, size_t bufferSize) const
101{
102	if (fPath == NULL)
103		return B_ERROR;
104
105	strncpy(nameBuffer, fPath, bufferSize - 1);
106	nameBuffer[bufferSize - 1] = '\0';
107	return B_OK;
108}
109
110
111off_t
112Handle::Size() const
113{
114	struct stat stat;
115	if (fstat(fHandle, &stat) == B_OK) {
116		if (stat.st_size == 0) {
117			// ToDo: fix this!
118			return 1024LL * 1024 * 1024 * 1024;
119				// 1024 GB
120		}
121		return stat.st_size;
122	}
123
124	return 0LL;
125}
126
127