2015-04-23 09:18:30 +02:00
|
|
|
#include "CrySymlink.h"
|
|
|
|
|
|
|
|
#include "messmer/fspp/fuse/FuseErrnoException.h"
|
|
|
|
#include "CryDevice.h"
|
|
|
|
#include "CrySymlink.h"
|
|
|
|
#include "impl/SymlinkBlob.h"
|
|
|
|
|
|
|
|
//TODO Get rid of this in favor of exception hierarchy
|
|
|
|
using fspp::fuse::CHECK_RETVAL;
|
|
|
|
using fspp::fuse::FuseErrnoException;
|
|
|
|
|
|
|
|
namespace bf = boost::filesystem;
|
|
|
|
|
|
|
|
using std::string;
|
|
|
|
using std::vector;
|
|
|
|
|
|
|
|
using blockstore::Key;
|
2015-06-18 12:47:08 +02:00
|
|
|
using boost::none;
|
2015-06-18 13:45:08 +02:00
|
|
|
using boost::optional;
|
2015-06-18 13:14:43 +02:00
|
|
|
using cpputils::unique_ref;
|
2015-06-18 13:45:08 +02:00
|
|
|
using cpputils::make_unique_ref;
|
2015-04-23 09:18:30 +02:00
|
|
|
|
|
|
|
namespace cryfs {
|
|
|
|
|
2015-06-18 13:14:43 +02:00
|
|
|
CrySymlink::CrySymlink(CryDevice *device, unique_ref<DirBlob> parent, const Key &key)
|
2015-04-23 09:18:30 +02:00
|
|
|
: CryNode(device, std::move(parent), key) {
|
|
|
|
}
|
|
|
|
|
|
|
|
CrySymlink::~CrySymlink() {
|
|
|
|
}
|
|
|
|
|
2015-06-18 13:45:08 +02:00
|
|
|
optional<unique_ref<SymlinkBlob>> CrySymlink::LoadBlob() const {
|
2015-06-18 12:47:08 +02:00
|
|
|
auto blob = CryNode::LoadBlob();
|
|
|
|
if (blob == none) {
|
2015-06-18 13:45:08 +02:00
|
|
|
return none;
|
2015-06-18 12:47:08 +02:00
|
|
|
}
|
2015-06-18 13:45:08 +02:00
|
|
|
return make_unique_ref<SymlinkBlob>(std::move(*blob));
|
2015-04-23 09:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
fspp::Dir::EntryType CrySymlink::getType() const {
|
|
|
|
return fspp::Dir::EntryType::SYMLINK;
|
|
|
|
}
|
|
|
|
|
|
|
|
bf::path CrySymlink::target() const {
|
2015-06-18 13:45:08 +02:00
|
|
|
auto blob = LoadBlob();
|
|
|
|
if (blob == none) {
|
|
|
|
//TODO Return correct fuse error
|
|
|
|
throw FuseErrnoException(EIO);
|
|
|
|
}
|
|
|
|
return (*blob)->target();
|
2015-04-23 09:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|