git-svn-id: https://profuse.googlecode.com/svn/branches/v2@201 aa027e90-d47c-11dd-86d7-074df07e0730

This commit is contained in:
ksherlock 2010-03-15 03:05:48 +00:00
parent 6d4e06b403
commit b83d2df14b
4 changed files with 186 additions and 0 deletions

43
File/File.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "File.h"
#include <cerrno>
using namespace File;
File::File()
{
_fd = -1;
}
File::File(int fd)
{
_fd = fd;
}
File::File(File& f)
{
_fd = f._fd;
f._fd = -1;
}
File::File(const char *name, int flags)
{
_fd = ::open(name, flags);
if (_fd < 0)
throw ProFUSE::PosixException(errno);
}
File::~File()
{
close();
}
File::close()
{
int fd = _fd;
_fd = -1;
if (fd >= 0 && ::close(fd) != 0)
throw ProFUSE::PosixException(errno);
}

33
File/File.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef __FILE_H__
#define __FILE_H__
#include <unistd.h>
#include <fcntl.h>
namespace File {
enum Flags {
ReadOnly = O_RDONLY,
WriteOnly = O_WRONLY,
ReadWrite = O_RDWR
};
class File {
public:
File();
File(File &);
File(int fd);
File(const char *name, int flags);
~File();
int fd() const { return _fd; }
void close();
private:
int _fd;
};
}
#endif

77
File/MappedFile.cpp Normal file
View File

@ -0,0 +1,77 @@
#include "MappedFile.h"
#include <cerrno>
#include <sys/stat.h>
using namespace File;
MappedFile::MappedFile()
{
_length = -1;
_address = MAP_FAILED;
}
MappedFile::MappedFile(MappedFile &mf)
{
_address = mf._address;
_length = mf._length;
mf._address = MAP_FAILED;
mf._length = -1;
}
MappedFile::MappedFile(File f, int flags)
{
struct stat st;
// close enough
if (f.fd() < 0)
throw ProFUSE::PosixException(EBADF);
if (::fstat(f.fd(), st) != 0)
throw ProFUSE::PosixException(errno);
if (!S_ISREG(st.st_mode))
throw ProFUSE::PosixException(ENODEV);
_length = st.st_size;
_address = ::mmap(0, _length,
readOnly ? PROT_READ : PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, f.fd(), 0);
if (_address == MAP_FAILED)
throw ProFUSE::PosixException(errno);
}
MappedFile::~MappedFile()
{
close();
}
MappedFile::close()
{
if (_address != MAP_FAILED)
{
void *address = _address;
size_t length = _length;
_address = MAP_FAILED;
_length = -1;
if (::munmap(address, length) != 0)
throw ProFUSE::PosixException(errno);
}
}
MappedFile::sync()
{
if (_address != MAP_FAILED)
{
if (::msync(_address, _length, MS_SYNC) != 0)
throw ProFUSE::PosixException(errno);
}
}

33
File/MappedFile.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef __MAPPED_FILE_H__
#define __MAPPED_FILE_H__
#include <sys/mman.h>
#include "File.h"
namespace File {
class MappedFile {
public:
MappedFile();
MappedFile(File f, int flags);
MappedFile(MappedFile&);
~MappedFile();
void sync();
void close();
void *address() const { return _address; }
size_t length() const { return _length; }
private:
void *_address;
size_t _length;
};
}
#endif