FileHandle.cpp revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
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> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#if defined(HAVE_UNISTD_H) 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# include <unistd.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#if defined(HAVE_FCNTL_H) 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# include <fcntl.h> 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/stat.h> 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/mman.h> 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#if defined(_MSC_VER) 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <io.h> 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <fcntl.h> 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDIN_FILENO 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# define STDIN_FILENO 0 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDOUT_FILENO 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# define STDOUT_FILENO 1 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef STDERR_FILENO 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao# define STDERR_FILENO 2 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 37affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld; 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// FileHandle 41affc150dc44fab1911775a49636d0ce85333b634Zonr ChangFileHandle::FileHandle() 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : m_Path(), 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Handler(-1), 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_Size(0), 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_State(GoodBit), 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode(NotOpen) { 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 49affc150dc44fab1911775a49636d0ce85333b634Zonr ChangFileHandle::~FileHandle() 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened()) 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang close(); 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 55affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline static int oflag(FileHandle::OpenMode pMode) 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int result = 0x0; 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (FileHandle::Unknown == pMode) 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (FileHandle::ReadWrite == (pMode & FileHandle::ReadWrite)) 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_RDWR; 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else if (FileHandle::ReadOnly == (pMode & FileHandle::ReadOnly)) 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_RDONLY; 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else if (FileHandle::WriteOnly == (pMode & FileHandle::WriteOnly)) 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_WRONLY; 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (FileHandle::Append == (pMode & FileHandle::Append)) 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_APPEND; 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (FileHandle::Create == (pMode & FileHandle::Create)) 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_CREAT; 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (FileHandle::Truncate == (pMode & FileHandle::Truncate)) 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result |= O_TRUNC; 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 80affc150dc44fab1911775a49636d0ce85333b634Zonr Changinline static bool get_size(int pHandler, unsigned int &pSize) 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang struct ::stat file_stat; 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (-1 == ::fstat(pHandler, &file_stat)) { 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pSize = 0; 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pSize = file_stat.st_size; 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 91affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool FileHandle::open(const sys::fs::Path& pPath, 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::OpenMode pMode, 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::Permission pPerm) 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (isOpened() || Unknown == pMode) { 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang setState(BadBit); 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_OpenMode = pMode; 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (System == pPerm) 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Handler = sys::fs::detail::open(pPath, oflag(pMode)); 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao else 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Handler = sys::fs::detail::open(pPath, oflag(pMode), (int)pPerm); 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 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