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