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