From 980194f2a71804c9584f0508bd204109844e75d8 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Fri, 10 Jun 2016 13:55:05 -0500 Subject: [PATCH] Fixed issues with how we get the file store header size. --- src/filestore.hpp | 42 ++++++++++++++++++++++++++++-------------- test/filestoreio.cpp | 1 + test/format.cpp | 2 +- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/filestore.hpp b/src/filestore.hpp index b1b450f4d..ef8371043 100644 --- a/src/filestore.hpp +++ b/src/filestore.hpp @@ -20,7 +20,8 @@ class FileStore { public: struct FsHeader { uint32_t version; - FsSize_t rootDir = -1; + FsSize_t size; + FsSize_t rootInode = 0; bool insertLeft = false; // crude tree balancing mechanism }; @@ -71,7 +72,7 @@ class FileStore { * @param data the contents of the file * @param dataLen the number of bytes data points to */ - void write(void *data, FsSize_t dataLen); + int write(void *data, FsSize_t dataLen); /** * Writes the given data to a "file" with the given id. @@ -79,7 +80,7 @@ class FileStore { * @param data the contents of the file * @param dataLen the number of bytes data points to */ - void write(InodeId_t id, void *data, FsSize_t dataLen); + int write(InodeId_t id, void *data, FsSize_t dataLen); /** * Reads the "file" at the given id. You are responsible for freeing @@ -93,7 +94,7 @@ class FileStore { static uint8_t version(); - static uint8_t *format(uint8_t *buffer, size_t size, bool hasDirectories); + static uint8_t *format(uint8_t *buffer, FsSize_t size); private: /** @@ -169,7 +170,7 @@ void FileStore::Inode::setData(uint8_t *data, int size) { // FileStore template -FileStore::FileStore(uint8_t *begin, uint8_t *end, Error *error): m_version(*((uint32_t*) begin)), m_lastRec(*(FsSize_t*) (begin + sizeof(m_version))) { +FileStore::FileStore(uint8_t *begin, uint8_t *end, Error *error): m_version(*((uint32_t*) begin)), m_lastRec(*(FsSize_t*) (begin + sizeof(FsHeader))) { if (version() != m_version) { // version mismatch if (error) { @@ -179,9 +180,10 @@ FileStore::FileStore(uint8_t *begin, uint8_t *end, Error *error): m_ve // ok m_begin = begin; m_end = end; - m_root = (Inode*) (begin + sizeof(FsSize_t)); + auto header = (FsHeader*) m_begin; + m_root = ptr(header->rootInode); if (error) { - *error = 0; + *error = header->size != m_end - m_begin; } } } @@ -193,11 +195,22 @@ void FileStore::init() { } template -void FileStore::write(InodeId_t id, void *data, FsSize_t dataLen) { +int FileStore::write(void *data, FsSize_t dataLen) { + return 1; +} + +template +int FileStore::write(InodeId_t id, void *data, FsSize_t dataLen) { + auto retval = 1; const FsSize_t size = offsetof(Inode, m_id) + dataLen; auto rec = (Inode*) alloc(size); - rec->dataLen = dataLen; - insert(m_root, rec); + if (rec) { + rec->dataLen = dataLen; + if (insert(m_root, rec)) { + retval = 0; + } + } + return retval; } template @@ -317,10 +330,11 @@ uint8_t FileStore::version() { }; template -uint8_t *FileStore::format(uint8_t *buffer, size_t size, bool hasDirectories) { - auto retval = (typename FileStore::FsHeader*) buffer; - retval->version = FileStore::version(); - return (uint8_t*) retval; +uint8_t *FileStore::format(uint8_t *buffer, FsSize_t size) { + auto header = (FsHeader*) buffer; + header->version = FileStore::version(); + header->size = size; + return (uint8_t*) header; } typedef FileStore FileStore16; diff --git a/test/filestoreio.cpp b/test/filestoreio.cpp index 9db49b041..0bd6dbb65 100644 --- a/test/filestoreio.cpp +++ b/test/filestoreio.cpp @@ -15,6 +15,7 @@ int main() { uint8_t volume[size]; char out[6]; uint32_t err; + FileStore32::format(volume, size); FileStore32 fs(volume, volume + size, &err); fs.write(42, (void*) "Hello", 6); diff --git a/test/format.cpp b/test/format.cpp index 0167319d5..9b623dadf 100644 --- a/test/format.cpp +++ b/test/format.cpp @@ -13,7 +13,7 @@ int main() { const auto size = 1 << 16; uint8_t volume[size]; uint32_t err; - FileStore32::format(volume, size, false); + FileStore32::format(volume, size); FileStore32(volume, volume + size, &err); return err; }