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