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