mirror of
https://github.com/ksherlock/profuse.git
synced 2024-12-25 23:33:15 +00:00
git-svn-id: https://profuse.googlecode.com/svn/branches/v2@201 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
parent
6d4e06b403
commit
b83d2df14b
43
File/File.cpp
Normal file
43
File/File.cpp
Normal 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
33
File/File.h
Normal 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
77
File/MappedFile.cpp
Normal 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
33
File/MappedFile.h
Normal 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
|
Loading…
Reference in New Issue
Block a user