1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- FileHandle.cpp -----------------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileHandle.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileSystem.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <errno.h> 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <fcntl.h> 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/stat.h> 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/mman.h> 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 16affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld; 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// FileHandle 20affc150dc44fab1911775a49636d0ce85333b634Zonr ChangFileHandle::FileHandle() 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : m_Path(), 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Handler(-1), 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Size(0), 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State(GoodBit), 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode(NotOpen) { 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 28affc150dc44fab1911775a49636d0ce85333b634Zonr ChangFileHandle::~FileHandle() 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened()) 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang close(); 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 34affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline static int oflag(FileHandle::OpenMode pMode) 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int result = 0x0; 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (FileHandle::Unknown == pMode) 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (FileHandle::ReadWrite == (pMode & FileHandle::ReadWrite)) 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_RDWR; 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else if (pMode & FileHandle::ReadOnly) 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_RDONLY; 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else if (pMode & FileHandle::WriteOnly) 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_WRONLY; 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pMode & FileHandle::Append) 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_APPEND; 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pMode & FileHandle::Create) 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_CREAT; 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pMode & FileHandle::Truncate) 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_TRUNC; 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 59affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline static bool get_size(int pHandler, unsigned int &pSize) 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang struct ::stat file_stat; 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == ::fstat(pHandler, &file_stat)) { 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pSize = 0; 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pSize = file_stat.st_size; 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 70affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::open(const sys::fs::Path& pPath, 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::OpenMode pMode) 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened() || Unknown == pMode) { 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = pMode; 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Handler = ::open(pPath.native().c_str(), oflag(pMode)); 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Path = pPath; 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == m_Handler) { 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = NotOpen; 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!get_size(m_Handler, m_Size)) { 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 95affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::open(const sys::fs::Path& pPath, 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::OpenMode pMode, 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::Permission pPerm) 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened() || Unknown == pMode) { 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = pMode; 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Handler = sys::fs::detail::open(pPath, oflag(pMode), (int)pPerm); 106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Path = pPath; 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == m_Handler) { 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = NotOpen; 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!get_size(m_Handler, m_Size)) { 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 121affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::delegate(int pFD, FileHandle::OpenMode pMode) 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened()) { 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Handler = pFD; 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = pMode; 130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State = GoodBit; 131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!get_size(m_Handler, m_Size)) { 133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 140affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::close() 141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened()) { 143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == ::close(m_Handler)) { 148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Path.native().clear(); 153affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Size = 0; 154affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = NotOpen; 155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang cleanState(); 156affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 157affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 159affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::truncate(size_t pSize) 160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 161affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened() || !isWritable()) { 162affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 164affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == sys::fs::detail::ftruncate(m_Handler, pSize)) { 167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 168affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 169affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Size = pSize; 172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 173affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 175affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::read(void* pMemBuffer, size_t pStartOffset, size_t pLength) 176affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 177affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened() || !isReadable()) { 178affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 179affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 181affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 182affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == pLength) 183affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 184affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 185affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ssize_t read_bytes = sys::fs::detail::pread(m_Handler, 186affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pMemBuffer, 187affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pLength, 188affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pStartOffset); 189affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 190affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == read_bytes) { 191affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 193affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 194affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 195affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 196affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 197affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 198affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::write(const void* pMemBuffer, size_t pStartOffset, size_t pLength) 199affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 200affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened() || !isWritable()) { 201affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 202affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 203affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 204affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == pLength) 206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 207affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 208affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 209affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ssize_t write_bytes = sys::fs::detail::pwrite(m_Handler, 210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pMemBuffer, 211affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pLength, 212affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pStartOffset); 213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 214affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == write_bytes) { 215affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 217affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 218affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 219affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 220affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 221affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 222affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::mmap(void*& pMemBuffer, size_t pStartOffset, size_t pLength) 223affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 224affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened()) { 225affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 226affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 227affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 228affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 229affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == pLength) 230affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 231affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 232affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int prot, flag; 233affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isReadable() && !isWritable()) { 234affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // read-only 235affc150dc44fab1911775a49636d0ce85333b634Zonr Chang prot = PROT_READ; 236affc150dc44fab1911775a49636d0ce85333b634Zonr Chang flag = MAP_FILE | MAP_PRIVATE; 237affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 238affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else if (!isReadable() && isWritable()) { 239affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // write-only 240affc150dc44fab1911775a49636d0ce85333b634Zonr Chang prot = PROT_WRITE; 241affc150dc44fab1911775a49636d0ce85333b634Zonr Chang flag = MAP_FILE | MAP_SHARED; 242affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 243affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else if (isReadWrite()) { 244affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // read and write 245affc150dc44fab1911775a49636d0ce85333b634Zonr Chang prot = PROT_READ | PROT_WRITE; 246affc150dc44fab1911775a49636d0ce85333b634Zonr Chang flag = MAP_FILE | MAP_SHARED; 247affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 248affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else { 249affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // can not read/write 250affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 251affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 252affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 253affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 254affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pMemBuffer = ::mmap(NULL, pLength, prot, flag, m_Handler, pStartOffset); 255affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 256affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (MAP_FAILED == pMemBuffer) { 257affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 258affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 259affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 260affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 261affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 262affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 263affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 264affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::munmap(void* pMemBuffer, size_t pLength) 265affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 266affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened()) { 267affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 268affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 269affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 270affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 271affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == ::munmap(pMemBuffer, pLength)) { 272affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 273affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 274affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 275affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 276affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 277affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 278affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 279affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid FileHandle::setState(FileHandle::IOState pState) 280affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 281affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State |= pState; 282affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 283affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 284affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid FileHandle::cleanState(FileHandle::IOState pState) 285affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 286affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State = pState; 287affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 288affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 289affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isOpened() const 290affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 291affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 != m_Handler && m_OpenMode != NotOpen && isGood()) 292affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 293affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 294affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 295affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 296affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 297affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Assume Unknown OpenMode is readable 298affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isReadable() const 299affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 300affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_OpenMode & ReadOnly); 301affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 302affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 303affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Assume Unknown OpenMode is writable 304affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isWritable() const 305affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 306affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_OpenMode & WriteOnly); 307affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 308affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 309affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Assume Unknown OpenMode is both readable and writable 310affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isReadWrite() const 311affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 312affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (FileHandle::ReadWrite == (m_OpenMode & FileHandle::ReadWrite)); 313affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 314affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 315affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isGood() const 316affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 317affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return !(m_State & (BadBit | FailBit)); 318affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 319affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 320affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isBad() const 321affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 322affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_State & BadBit); 323affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 324affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 325affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isFailed() const 326affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 327affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_State & (BadBit | FailBit)); 328affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 329affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 330