FileHandle.cpp revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
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//===----------------------------------------------------------------------===// 96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "mcld/Config/Config.h" 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileHandle.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileSystem.h> 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <errno.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#if defined(HAVE_UNISTD_H) 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# include <unistd.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#if defined(HAVE_FCNTL_H) 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# include <fcntl.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/stat.h> 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/mman.h> 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#if defined(_MSC_VER) 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <io.h> 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <fcntl.h> 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDIN_FILENO 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# define STDIN_FILENO 0 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDOUT_FILENO 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# define STDOUT_FILENO 1 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDERR_FILENO 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# define STDERR_FILENO 2 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 38affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld; 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// FileHandle 42affc150dc44fab1911775a49636d0ce85333b634Zonr ChangFileHandle::FileHandle() 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : m_Path(), 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Handler(-1), 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Size(0), 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State(GoodBit), 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode(NotOpen) { 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 50affc150dc44fab1911775a49636d0ce85333b634Zonr ChangFileHandle::~FileHandle() 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened()) 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang close(); 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 56affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline static int oflag(FileHandle::OpenMode pMode) 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int result = 0x0; 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (FileHandle::Unknown == pMode) 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (FileHandle::ReadWrite == (pMode & FileHandle::ReadWrite)) 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_RDWR; 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else if (FileHandle::ReadOnly == (pMode & FileHandle::ReadOnly)) 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_RDONLY; 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else if (FileHandle::WriteOnly == (pMode & FileHandle::WriteOnly)) 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_WRONLY; 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (FileHandle::Append == (pMode & FileHandle::Append)) 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_APPEND; 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (FileHandle::Create == (pMode & FileHandle::Create)) 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_CREAT; 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (FileHandle::Truncate == (pMode & FileHandle::Truncate)) 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_TRUNC; 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 81affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline static bool get_size(int pHandler, unsigned int &pSize) 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang struct ::stat file_stat; 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == ::fstat(pHandler, &file_stat)) { 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pSize = 0; 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pSize = file_stat.st_size; 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 92affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::open(const sys::fs::Path& pPath, 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::OpenMode pMode, 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::Permission pPerm) 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened() || Unknown == pMode) { 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = pMode; 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (System == pPerm) 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Handler = sys::fs::detail::open(pPath, oflag(pMode)); 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Handler = sys::fs::detail::open(pPath, oflag(pMode), (int)pPerm); 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Path = pPath; 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == m_Handler) { 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = NotOpen; 110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!get_size(m_Handler, m_Size)) { 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 122affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::delegate(int pFD, FileHandle::OpenMode pMode) 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened()) { 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Handler = pFD; 130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = pMode; 1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_State = (GoodBit | DeputedBit); 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!get_size(m_Handler, m_Size)) { 134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 141affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::close() 142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened()) { 144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (isOwned()) { 1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (-1 == ::close(m_Handler)) { 1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines setState(FailBit); 1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return false; 1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 153affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 154affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Path.native().clear(); 156affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Size = 0; 157affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = NotOpen; 158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang cleanState(); 159affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 161affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 162affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::truncate(size_t pSize) 163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 164affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened() || !isWritable()) { 165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 168affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 169affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == sys::fs::detail::ftruncate(m_Handler, pSize)) { 170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 173affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Size = pSize; 175affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 176affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 177affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 178affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::read(void* pMemBuffer, size_t pStartOffset, size_t pLength) 179affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened() || !isReadable()) { 181affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 182affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 183affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 184affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 185affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == pLength) 186affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 187affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 188affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ssize_t read_bytes = sys::fs::detail::pread(m_Handler, 189affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pMemBuffer, 190affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pLength, 191affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pStartOffset); 192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 193affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == read_bytes) { 194affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 195affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 196affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 197affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 198affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 199affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 200affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 201affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::write(const void* pMemBuffer, size_t pStartOffset, size_t pLength) 202affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 203affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened() || !isWritable()) { 204affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 207affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 208affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == pLength) 209affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 211affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 212affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ssize_t write_bytes = sys::fs::detail::pwrite(m_Handler, 213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pMemBuffer, 214affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pLength, 215affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pStartOffset); 216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 217affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == write_bytes) { 218affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 219affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 220affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 221affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 222affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 223affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 224affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 225affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::mmap(void*& pMemBuffer, size_t pStartOffset, size_t pLength) 226affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 227affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened()) { 228affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 229affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 230affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 231affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 232affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (0 == pLength) 233affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 234affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 235affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int prot, flag; 236affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isReadable() && !isWritable()) { 237affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // read-only 238affc150dc44fab1911775a49636d0ce85333b634Zonr Chang prot = PROT_READ; 239affc150dc44fab1911775a49636d0ce85333b634Zonr Chang flag = MAP_FILE | MAP_PRIVATE; 240affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 241affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else if (!isReadable() && isWritable()) { 242affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // write-only 243affc150dc44fab1911775a49636d0ce85333b634Zonr Chang prot = PROT_WRITE; 244affc150dc44fab1911775a49636d0ce85333b634Zonr Chang flag = MAP_FILE | MAP_SHARED; 245affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 246affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else if (isReadWrite()) { 247affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // read and write 248affc150dc44fab1911775a49636d0ce85333b634Zonr Chang prot = PROT_READ | PROT_WRITE; 249affc150dc44fab1911775a49636d0ce85333b634Zonr Chang flag = MAP_FILE | MAP_SHARED; 250affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 251affc150dc44fab1911775a49636d0ce85333b634Zonr Chang else { 252affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // can not read/write 253affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 254affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 255affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 256affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 257affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pMemBuffer = ::mmap(NULL, pLength, prot, flag, m_Handler, pStartOffset); 258affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 259affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (MAP_FAILED == pMemBuffer) { 260affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 261affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 262affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 263affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 264affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 265affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 266affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 267affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::munmap(void* pMemBuffer, size_t pLength) 268affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 269affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!isOpened()) { 270affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 271affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 272affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 273affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 274affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == ::munmap(pMemBuffer, pLength)) { 275affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(FailBit); 276affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 277affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 278affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 279affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 280affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 281affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 282affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid FileHandle::setState(FileHandle::IOState pState) 283affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 284affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State |= pState; 285affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 286affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 287affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid FileHandle::cleanState(FileHandle::IOState pState) 288affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 289affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State = pState; 290affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 291affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 292affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isOpened() const 293affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 294affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 != m_Handler && m_OpenMode != NotOpen && isGood()) 295affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 296affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 297affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 298affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 299affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 300affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Assume Unknown OpenMode is readable 301affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isReadable() const 302affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 303affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_OpenMode & ReadOnly); 304affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 305affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 306affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Assume Unknown OpenMode is writable 307affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isWritable() const 308affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 309affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_OpenMode & WriteOnly); 310affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 311affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 312affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// Assume Unknown OpenMode is both readable and writable 313affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isReadWrite() const 314affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 315affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (FileHandle::ReadWrite == (m_OpenMode & FileHandle::ReadWrite)); 316affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 317affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 318affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isGood() const 319affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 320affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return !(m_State & (BadBit | FailBit)); 321affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 322affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 323affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isBad() const 324affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 325affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_State & BadBit); 326affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 327affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 328affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::isFailed() const 329affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 330affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return (m_State & (BadBit | FailBit)); 331affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 332affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 3336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesbool FileHandle::isOwned() const 3346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 3356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return !(m_State & DeputedBit); 3366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 3376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 338