diff --git a/src/ox/fs/filestore.hpp b/src/ox/fs/filestore.hpp index 4cafea904..8acd7b025 100644 --- a/src/ox/fs/filestore.hpp +++ b/src/ox/fs/filestore.hpp @@ -812,8 +812,8 @@ uint8_t *FileStore
::format(uint8_t *buffer, typename Header::FsSize_t si } typedef FileStore> FileStore16; -typedef FileStore> FileStore32; -typedef FileStore> FileStore64; +typedef FileStore> FileStore32; +typedef FileStore> FileStore64; } } diff --git a/src/ox/fs/filesystem.hpp b/src/ox/fs/filesystem.hpp index 82559432d..52945a467 100644 --- a/src/ox/fs/filesystem.hpp +++ b/src/ox/fs/filesystem.hpp @@ -124,7 +124,9 @@ class FileSystemTemplate: public FileSystem { public: // static members + static typename FileStore::InodeId_t INODE_RANDOM; static typename FileStore::InodeId_t INODE_ROOT_DIR; + static typename FileStore::InodeId_t INODE_RESERVED_END; explicit FileSystemTemplate(void *buff); @@ -163,6 +165,8 @@ class FileSystemTemplate: public FileSystem { static uint8_t *format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories); private: + uint64_t generateInodeId(); + int insertDirectoryEntry(const char *dirPath, const char *fileName, uint64_t inode); }; @@ -171,9 +175,15 @@ FileSystemTemplate::FileSystemTemplate(void *buff) { m_store = (FileStore*) buff; } +template +typename FileStore::InodeId_t FileSystemTemplate::INODE_RANDOM = 1; + template typename FileStore::InodeId_t FileSystemTemplate::INODE_ROOT_DIR = 2; +template +typename FileStore::InodeId_t FileSystemTemplate::INODE_RESERVED_END = 100; + template int FileSystemTemplate::mkdir(const char *path) { Directory dir; @@ -310,14 +320,7 @@ int FileSystemTemplate::write(const char *path, void *buffer uint64_t inode = findInodeOf(path); // find an inode value for the given path if (!inode) { - while (!inode) { - inode = ox_rand() >> 48; - // make sure this does not already exist - if (stat(inode).inode) { - // that result was unusable, try again - inode = 0; - } - } + inode = generateInodeId(); err = insertDirectoryEntry(dirPath, fileName, inode); } @@ -422,6 +425,29 @@ uint8_t *FileSystemTemplate::format(void *buffer, typename F #pragma warning(default:4244) #endif +template +uint64_t FileSystemTemplate::generateInodeId() { + Random rand; + read(INODE_RANDOM, &rand, sizeof(rand)); + + uint64_t inode = 0; + // find an inode value for the given path + while (!inode) { + inode = rand.gen(); + inode >>= 64 - 8 * sizeof(typename FileStore::InodeId_t); + + // make sure this does not already exist + if (inode < INODE_RESERVED_END || stat(inode).inode) { + // that result was unusable, try again + inode = 0; + } + } + + write(INODE_RANDOM, &rand, sizeof(rand)); + + return inode; +} + #ifdef _MSC_VER #pragma warning(disable:4244) #endif