From 9a97287a9664ca5ec25fa7609b6699b06e7ffdd8 Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Tue, 9 Dec 2014 11:13:50 +0100 Subject: [PATCH] A dir stores a magic number --- src/cryfs_lib/impl/DirBlob.cpp | 19 +++++++++++++++++-- src/cryfs_lib/impl/DirBlob.h | 4 ++++ src/cryfs_lib/impl/MagicNumbers.h | 16 ++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/cryfs_lib/impl/MagicNumbers.h diff --git a/src/cryfs_lib/impl/DirBlob.cpp b/src/cryfs_lib/impl/DirBlob.cpp index 70ac3e26..a66648ff 100644 --- a/src/cryfs_lib/impl/DirBlob.cpp +++ b/src/cryfs_lib/impl/DirBlob.cpp @@ -5,6 +5,8 @@ //TODO Remove and replace with exception hierarchy #include "fspp/fuse/FuseErrnoException.h" +#include "MagicNumbers.h" + using std::unique_ptr; using std::make_unique; using std::vector; @@ -22,9 +24,22 @@ DirBlob::~DirBlob() { } void DirBlob::InitializeEmptyDir() { + *magicNumber() = MagicNumbers::DIR; *entryCounter() = 0; } +unsigned char *DirBlob::magicNumber() { + return const_cast(magicNumber(const_cast(*_blob))); +} + +const unsigned char *DirBlob::magicNumber(const blobstore::Blob &blob) { + return (unsigned char*)blob.data(); +} + +bool DirBlob::IsDir(const blobstore::Blob &blob) { + return *magicNumber(blob) == MagicNumbers::DIR; +} + unique_ptr> DirBlob::GetChildren() const { auto result = make_unique>(); unsigned int entryCount = *entryCounter(); @@ -80,7 +95,7 @@ unsigned int *DirBlob::entryCounter() { } const unsigned int *DirBlob::entryCounter() const { - return (unsigned int*)(_blob->data()); + return (unsigned int*)((char*)_blob->data() + sizeof(unsigned char)); } char *DirBlob::entriesBegin() { @@ -88,7 +103,7 @@ char *DirBlob::entriesBegin() { } const char *DirBlob::entriesBegin() const { - return (char *)(_blob->data())+sizeof(unsigned int); + return (char *)(_blob->data())+sizeof(unsigned char) + sizeof(unsigned int); } char *DirBlob::entriesEnd() { diff --git a/src/cryfs_lib/impl/DirBlob.h b/src/cryfs_lib/impl/DirBlob.h index 36deb444..430c326e 100644 --- a/src/cryfs_lib/impl/DirBlob.h +++ b/src/cryfs_lib/impl/DirBlob.h @@ -20,7 +20,11 @@ public: void AddChild(const std::string &name, const std::string &blobKey); std::string GetBlobKeyForName(const std::string &name) const; + static bool IsDir(const blobstore::Blob &blob); + private: + unsigned char *magicNumber(); + static const unsigned char *magicNumber(const blobstore::Blob &blob); unsigned int *entryCounter(); const unsigned int *entryCounter() const; char *entriesBegin(); diff --git a/src/cryfs_lib/impl/MagicNumbers.h b/src/cryfs_lib/impl/MagicNumbers.h new file mode 100644 index 00000000..630c14b9 --- /dev/null +++ b/src/cryfs_lib/impl/MagicNumbers.h @@ -0,0 +1,16 @@ +#pragma once +#ifndef CRYFS_LIB_IMPL_MAGICNUMBERS_H_ +#define CRYFS_LIB_IMPL_MAGICNUMBERS_H_ + +namespace cryfs { +namespace MagicNumbers { + +unsigned char DIR = 0x00; +unsigned char FILE = 0x01; + +} +} + + + +#endif