Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# Build
build/

# Visual Studio

# CLion
.idea/

# Windows image file caches
Thumbs.db
ehthumbs.db
Expand Down Expand Up @@ -44,3 +52,10 @@ bin/
Network Trash Folder
Temporary Items
.apdisk
*.suo
*.opensdf
VFS.sdf
*.sln
VFS.vcxproj
*.user
VFS.vcxproj.filters
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 2.8.5)
project(VFS)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb3 -std=c++11")
set(CMAKE_CXX "clang++")

Expand Down
54 changes: 54 additions & 0 deletions fs-descriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,33 @@ struct FileDescriptor {
return length;
}

virtual long long read( utils::Vector< std::pair< char *, size_t > > &buf ) {
if (!_inode)
throw Error( EBADF );
if (!_flags.has( flags::Open::Read ))
throw Error( EBADF );

File *file = _inode->data()->as< File >();
if (!file)
throw Error( EBADF );
if (_flags.has( flags::Open::NonBlock ) && !file->canRead())
throw Error( EAGAIN );

long long length = 0; //combined length of all members of buf
for ( auto & dst : buf ) {
size_t originalLengthBuf = dst.second;
if ( !file->read( dst.first, _offset, dst.second ))
throw Error( EBADF );
length += dst.second;
_setOffset( _offset + dst.second );
if (dst.second < originalLengthBuf) { //nothing left to read
break;
}
}

return length;
}

virtual long long write( const void *buf, size_t length ) {
if ( !_inode )
throw Error( EBADF );
Expand All @@ -97,6 +124,33 @@ struct FileDescriptor {
return length;
}

virtual long long write( utils::Vector< std::pair< const char *, size_t > > &buf) {
if (!_inode)
throw Error( EBADF );
if (!_flags.has( flags::Open::Write ))
throw Error( EBADF );

File *file = _inode->data()->as< File >();
if (!file)
throw Error( EBADF );
if (_flags.has( flags::Open::NonBlock ) && !file->canWrite())
throw Error( EAGAIN );

if (_flags.has( flags::Open::Append ))
_offset = file->size();

long long length = 0;
for (auto & src : buf) {
if (!file->write( src.first, _offset, src.second )) {
throw Error( EBADF );
}
_setOffset( _offset + src.second );
length += src.second;
}

return length;
}

size_t offset() const {
return _offset;
}
Expand Down
8 changes: 5 additions & 3 deletions fs-file.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ struct Link : DataItem {
};

struct File : DataItem {

//TODO lower: write documentation
virtual bool read( char *, size_t, size_t & ) = 0;
virtual bool write( const char *, size_t, size_t & ) = 0;

Expand Down Expand Up @@ -72,18 +72,20 @@ struct RegularFile : File {
bool canWrite() const override {
return true;
}

bool read( char *buffer, size_t offset, size_t &length ) override {
if ( offset >= _size ) {
length = 0;
return true;
}
const char *source = _isSnapshot() ?
const char *source = _isSnapshot() ? //copy on write
_roContent + offset :
_content.data() + offset;

if ( offset + length > _size )
length = _size - offset;
std::copy( source, source + length, buffer );

return true;
}

Expand Down
4 changes: 2 additions & 2 deletions fs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ ssize_t write( int fd, const void *buf, size_t count ) {
return -1;
}
}
ssize_t pwrite( int fd, const void *buf, size_t count, off_t offset ) {
ssize_t pwrite( int fd, const void *buf, size_t count, off_t offset ) { //TODO this
FS_ENTRYPOINT();
try {
auto f = vfs.instance().getFile( fd );
Expand All @@ -258,7 +258,7 @@ ssize_t read( int fd, void *buf, size_t count ) {
return -1;
}
}
ssize_t pread( int fd, void *buf, size_t count, off_t offset ) {
ssize_t pread( int fd, void *buf, size_t count, off_t offset ) { //TODO this
FS_ENTRYPOINT();
try {
auto f = vfs.instance().getFile( fd );
Expand Down