Fix IdList and implement statfs()
This commit is contained in:
parent
31aa6228bb
commit
df80fdfb74
@ -14,15 +14,6 @@ using fusepp::path;
|
|||||||
|
|
||||||
namespace cryfs {
|
namespace cryfs {
|
||||||
|
|
||||||
namespace {
|
|
||||||
int errcode_map(int exit_status) {
|
|
||||||
if (exit_status < 0) {
|
|
||||||
return -errno;
|
|
||||||
}
|
|
||||||
return exit_status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CryFuse::CryFuse(CryDevice *device)
|
CryFuse::CryFuse(CryDevice *device)
|
||||||
:_device(device) {
|
:_device(device) {
|
||||||
}
|
}
|
||||||
@ -235,10 +226,13 @@ int CryFuse::write(const path &path, const char *buf, size_t size, off_t offset,
|
|||||||
|
|
||||||
//TODO
|
//TODO
|
||||||
int CryFuse::statfs(const path &path, struct statvfs *fsstat) {
|
int CryFuse::statfs(const path &path, struct statvfs *fsstat) {
|
||||||
printf("HALF-IMPLEMENTED: statfs(%s, _)\n", path.c_str());
|
//printf("statfs(%s, _)\n", path.c_str());
|
||||||
auto real_path = _device->RootDir() / path;
|
try {
|
||||||
int retstat = ::statvfs(real_path.c_str(), fsstat);
|
_device->statfs(path, fsstat);
|
||||||
return errcode_map(retstat);
|
return 0;
|
||||||
|
} catch (CryErrnoException &e) {
|
||||||
|
return -e.getErrno();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO
|
//TODO
|
||||||
|
@ -148,3 +148,8 @@ void CryDevice::utimens(const bf::path &path, const timespec times[2]) {
|
|||||||
auto node = Load(path);
|
auto node = Load(path);
|
||||||
node->utimens(times);
|
node->utimens(times);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CryDevice::statfs(const bf::path &path, struct statvfs *fsstat) {
|
||||||
|
int retval = ::statvfs(path.c_str(), fsstat);
|
||||||
|
CHECK_RETVAL(retval);
|
||||||
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
|
||||||
#include "utils/macros.h"
|
#include "utils/macros.h"
|
||||||
#include "CryOpenFileList.h"
|
#include "CryOpenFileList.h"
|
||||||
@ -43,6 +44,7 @@ public:
|
|||||||
std::unique_ptr<std::vector<std::string>> readDir(int descriptor);
|
std::unique_ptr<std::vector<std::string>> readDir(int descriptor);
|
||||||
void closeDir(int descriptor);
|
void closeDir(int descriptor);
|
||||||
void utimens(const bf::path &path, const timespec times[2]);
|
void utimens(const bf::path &path, const timespec times[2]);
|
||||||
|
void statfs(const bf::path &path, struct statvfs *fsstat);
|
||||||
|
|
||||||
const bf::path &RootDir() const;
|
const bf::path &RootDir() const;
|
||||||
private:
|
private:
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
#include "utils/macros.h"
|
#include "utils/macros.h"
|
||||||
|
|
||||||
namespace cryfs {
|
namespace cryfs {
|
||||||
@ -19,13 +20,15 @@ public:
|
|||||||
void remove(int id);
|
void remove(int id);
|
||||||
private:
|
private:
|
||||||
std::map<int, std::unique_ptr<Entry>> _entries;
|
std::map<int, std::unique_ptr<Entry>> _entries;
|
||||||
|
int _id_counter;
|
||||||
|
mutable std::mutex _mutex;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(IdList<Entry>)
|
DISALLOW_COPY_AND_ASSIGN(IdList<Entry>)
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class Entry>
|
template<class Entry>
|
||||||
IdList<Entry>::IdList()
|
IdList<Entry>::IdList()
|
||||||
: _entries() {
|
: _entries(), _id_counter(0), _mutex() {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Entry>
|
template<class Entry>
|
||||||
@ -34,8 +37,9 @@ IdList<Entry>::~IdList() {
|
|||||||
|
|
||||||
template<class Entry>
|
template<class Entry>
|
||||||
int IdList<Entry>::add(std::unique_ptr<Entry> entry) {
|
int IdList<Entry>::add(std::unique_ptr<Entry> entry) {
|
||||||
|
std::lock_guard<std::mutex> lock(_mutex);
|
||||||
//TODO Reuse IDs (ids = descriptors)
|
//TODO Reuse IDs (ids = descriptors)
|
||||||
int new_id = _entries.size();
|
int new_id = ++_id_counter;
|
||||||
_entries[new_id] = std::move(entry);
|
_entries[new_id] = std::move(entry);
|
||||||
return new_id;
|
return new_id;
|
||||||
}
|
}
|
||||||
@ -47,11 +51,14 @@ Entry *IdList<Entry>::get(int id) {
|
|||||||
|
|
||||||
template<class Entry>
|
template<class Entry>
|
||||||
const Entry *IdList<Entry>::get(int id) const {
|
const Entry *IdList<Entry>::get(int id) const {
|
||||||
return _entries.at(id).get();
|
std::lock_guard<std::mutex> lock(_mutex);
|
||||||
|
const Entry *result = _entries.at(id).get();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Entry>
|
template<class Entry>
|
||||||
void IdList<Entry>::remove(int id) {
|
void IdList<Entry>::remove(int id) {
|
||||||
|
std::lock_guard<std::mutex> lock(_mutex);
|
||||||
_entries.erase(id);
|
_entries.erase(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ namespace bf = boost::filesystem;
|
|||||||
using namespace fusepp;
|
using namespace fusepp;
|
||||||
|
|
||||||
#define FUSE_OBJ ((Fuse *) fuse_get_context()->private_data)
|
#define FUSE_OBJ ((Fuse *) fuse_get_context()->private_data)
|
||||||
|
#define UNUSED(obj) (void)obj
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
int fusepp_getattr(const char *path, struct stat *stbuf) {
|
int fusepp_getattr(const char *path, struct stat *stbuf) {
|
||||||
@ -131,6 +132,7 @@ void* fusepp_init(fuse_conn_info *conn) {
|
|||||||
void fusepp_destroy(void *userdata) {
|
void fusepp_destroy(void *userdata) {
|
||||||
auto f = FUSE_OBJ;
|
auto f = FUSE_OBJ;
|
||||||
assert(userdata == f);
|
assert(userdata == f);
|
||||||
|
UNUSED(userdata); //In the Release build, the assert doesn't run
|
||||||
f->destroy();
|
f->destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user