xref: /haiku/src/tests/system/boot/loader/Handle.cpp (revision 425ac1b60a56f4df7a0e88bd784545c0ec4fa01f)
177b1fd22SAxel Dörfler /*
277b1fd22SAxel Dörfler  * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
377b1fd22SAxel Dörfler  * Distributed under the terms of the MIT License.
477b1fd22SAxel Dörfler  */
577b1fd22SAxel Dörfler 
677b1fd22SAxel Dörfler 
777b1fd22SAxel Dörfler #include "Handle.h"
877b1fd22SAxel Dörfler 
977b1fd22SAxel Dörfler #include <SupportDefs.h>
1077b1fd22SAxel Dörfler #include <boot/platform.h>
1177b1fd22SAxel Dörfler 
1277b1fd22SAxel Dörfler #include <stdio.h>
1377b1fd22SAxel Dörfler #include <unistd.h>
1477b1fd22SAxel Dörfler #include <fcntl.h>
1577b1fd22SAxel Dörfler #include <string.h>
1677b1fd22SAxel Dörfler #include <stdlib.h>
1777b1fd22SAxel Dörfler #include <errno.h>
1877b1fd22SAxel Dörfler 
1977b1fd22SAxel Dörfler 
2077b1fd22SAxel Dörfler #ifndef HAVE_READ_POS
2177b1fd22SAxel Dörfler #	define read_pos(fd, pos, buffer, size) pread(fd, buffer, size, pos)
2277b1fd22SAxel Dörfler #	define write_pos(fd, pos, buffer, size) pwrite(fd, buffer, size, pos)
2377b1fd22SAxel Dörfler #endif
2477b1fd22SAxel Dörfler 
2577b1fd22SAxel Dörfler 
Handle(int handle,bool takeOwnership)2677b1fd22SAxel Dörfler Handle::Handle(int handle, bool takeOwnership)
2777b1fd22SAxel Dörfler 	:
2877b1fd22SAxel Dörfler 	fHandle(handle),
2977b1fd22SAxel Dörfler 	fOwnHandle(takeOwnership),
3077b1fd22SAxel Dörfler 	fPath(NULL)
3177b1fd22SAxel Dörfler {
3277b1fd22SAxel Dörfler }
3377b1fd22SAxel Dörfler 
3477b1fd22SAxel Dörfler 
Handle(const char * path)3577b1fd22SAxel Dörfler Handle::Handle(const char *path)
3677b1fd22SAxel Dörfler 	:
3777b1fd22SAxel Dörfler 	fOwnHandle(true),
3877b1fd22SAxel Dörfler 	fPath(NULL)
3977b1fd22SAxel Dörfler {
4077b1fd22SAxel Dörfler 	fHandle = open(path, O_RDONLY);
4177b1fd22SAxel Dörfler 	if (fHandle < B_OK) {
4277b1fd22SAxel Dörfler 		fHandle = errno;
4377b1fd22SAxel Dörfler 		return;
4477b1fd22SAxel Dörfler 	}
4577b1fd22SAxel Dörfler 
4677b1fd22SAxel Dörfler 	fPath = strdup(path);
4777b1fd22SAxel Dörfler }
4877b1fd22SAxel Dörfler 
4977b1fd22SAxel Dörfler 
Handle(void)5077b1fd22SAxel Dörfler Handle::Handle(void)
5177b1fd22SAxel Dörfler 	:
5277b1fd22SAxel Dörfler 	fHandle(0)
5377b1fd22SAxel Dörfler {
5477b1fd22SAxel Dörfler }
5577b1fd22SAxel Dörfler 
5677b1fd22SAxel Dörfler 
~Handle()5777b1fd22SAxel Dörfler Handle::~Handle()
5877b1fd22SAxel Dörfler {
5977b1fd22SAxel Dörfler 	if (fOwnHandle)
6077b1fd22SAxel Dörfler 		close(fHandle);
6177b1fd22SAxel Dörfler 
6277b1fd22SAxel Dörfler 	free(fPath);
6377b1fd22SAxel Dörfler }
6477b1fd22SAxel Dörfler 
6577b1fd22SAxel Dörfler 
6677b1fd22SAxel Dörfler status_t
InitCheck()6777b1fd22SAxel Dörfler Handle::InitCheck()
6877b1fd22SAxel Dörfler {
6977b1fd22SAxel Dörfler 	return fHandle < B_OK ? fHandle : B_OK;
7077b1fd22SAxel Dörfler }
7177b1fd22SAxel Dörfler 
7277b1fd22SAxel Dörfler 
7377b1fd22SAxel Dörfler void
SetTo(int handle,bool takeOwnership)7477b1fd22SAxel Dörfler Handle::SetTo(int handle, bool takeOwnership)
7577b1fd22SAxel Dörfler {
7677b1fd22SAxel Dörfler 	if (fHandle && fOwnHandle)
7777b1fd22SAxel Dörfler 		close(fHandle);
7877b1fd22SAxel Dörfler 
7977b1fd22SAxel Dörfler 	fHandle = handle;
8077b1fd22SAxel Dörfler 	fOwnHandle = takeOwnership;
8177b1fd22SAxel Dörfler }
8277b1fd22SAxel Dörfler 
8377b1fd22SAxel Dörfler 
8477b1fd22SAxel Dörfler ssize_t
ReadAt(void * cookie,off_t pos,void * buffer,size_t bufferSize)8577b1fd22SAxel Dörfler Handle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
8677b1fd22SAxel Dörfler {
87*425ac1b6SAlexander von Gluck IV 	//printf("Handle::ReadAt(pos = %lld, buffer = %p, size = %lu)\n", pos, buffer, bufferSize);
8877b1fd22SAxel Dörfler 	return read_pos(fHandle, pos, buffer, bufferSize);
8977b1fd22SAxel Dörfler }
9077b1fd22SAxel Dörfler 
9177b1fd22SAxel Dörfler 
9277b1fd22SAxel Dörfler ssize_t
WriteAt(void * cookie,off_t pos,const void * buffer,size_t bufferSize)9377b1fd22SAxel Dörfler Handle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
9477b1fd22SAxel Dörfler {
9577b1fd22SAxel Dörfler 	return write_pos(fHandle, pos, buffer, bufferSize);
9677b1fd22SAxel Dörfler }
9777b1fd22SAxel Dörfler 
9877b1fd22SAxel Dörfler 
9977b1fd22SAxel Dörfler status_t
GetName(char * nameBuffer,size_t bufferSize) const10077b1fd22SAxel Dörfler Handle::GetName(char *nameBuffer, size_t bufferSize) const
10177b1fd22SAxel Dörfler {
10277b1fd22SAxel Dörfler 	if (fPath == NULL)
10377b1fd22SAxel Dörfler 		return B_ERROR;
10477b1fd22SAxel Dörfler 
10577b1fd22SAxel Dörfler 	strncpy(nameBuffer, fPath, bufferSize - 1);
10677b1fd22SAxel Dörfler 	nameBuffer[bufferSize - 1] = '\0';
10777b1fd22SAxel Dörfler 	return B_OK;
10877b1fd22SAxel Dörfler }
10977b1fd22SAxel Dörfler 
11077b1fd22SAxel Dörfler 
11177b1fd22SAxel Dörfler off_t
Size() const11277b1fd22SAxel Dörfler Handle::Size() const
11377b1fd22SAxel Dörfler {
11477b1fd22SAxel Dörfler 	struct stat stat;
11577b1fd22SAxel Dörfler 	if (fstat(fHandle, &stat) == B_OK) {
11677b1fd22SAxel Dörfler 		if (stat.st_size == 0) {
11777b1fd22SAxel Dörfler 			// ToDo: fix this!
11877b1fd22SAxel Dörfler 			return 1024LL * 1024 * 1024 * 1024;
11977b1fd22SAxel Dörfler 				// 1024 GB
12077b1fd22SAxel Dörfler 		}
12177b1fd22SAxel Dörfler 		return stat.st_size;
12277b1fd22SAxel Dörfler 	}
12377b1fd22SAxel Dörfler 
12477b1fd22SAxel Dörfler 	return 0LL;
12577b1fd22SAxel Dörfler }
12677b1fd22SAxel Dörfler 
127