Merge branch 'master' of github.com:wombatant/memphis

This commit is contained in:
2016-12-17 22:13:30 -06:00
12 changed files with 93 additions and 81 deletions
+9 -3
View File
@@ -1,5 +1,11 @@
language: cpp language: cpp
compiler: clang sudo: false
install: dist: trusty
- sudo apt-get install cmake compiler:
- clang
- gcc
addons:
apt:
packages:
- cmake
script: ./scripts/cibuild script: ./scripts/cibuild
+8 -3
View File
@@ -1,5 +1,10 @@
#! /usr/bin/env sh #! /usr/bin/env bash
set -e
./scripts/setup_build ./scripts/setup_build
./scripts/setup_build_debug ./scripts/setup_build_debug
make -j -C build/release all test make -j -C build/release all
make -j -C build/debug all test make -j -C build/release test
make -j -C build/debug all
make -j -C build/debug test
+3 -1
View File
@@ -24,8 +24,10 @@ install(
include/ox/fs include/ox/fs
) )
install(TARGETS oxfstool install(TARGETS oxfstool OxFS
RUNTIME DESTINATION bin RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
) )
if(OX_BUILD_EXEC STREQUAL "ON") if(OX_BUILD_EXEC STREQUAL "ON")
+17 -17
View File
@@ -16,13 +16,13 @@ template<typename FsT>
class FileStore { class FileStore {
public: public:
typedef uint16_t InodeId_t; typedef uint16_t InodeId_t;
typedef FsT FsSize_t; typedef FsT FsSize_t;
struct StatInfo { struct StatInfo {
InodeId_t inodeId; InodeId_t inodeId;
FsSize_t size; FsSize_t size;
uint8_t fileType; uint8_t fileType;
}; };
private: private:
@@ -31,13 +31,13 @@ class FileStore {
FsSize_t prev, next; FsSize_t prev, next;
FsSize_t dataLen; FsSize_t dataLen;
InodeId_t id; InodeId_t id;
uint8_t refs; uint8_t refs;
uint8_t fileType; uint8_t fileType;
FsSize_t left, right; FsSize_t left, right;
FsSize_t size(); FsSize_t size();
void setId(InodeId_t); void setId(InodeId_t);
void setData(void *data, FsSize_t size); void setData(void *data, FsSize_t size);
void *data(); void *data();
}; };
@@ -52,7 +52,7 @@ class FileStore {
* @param data the contents of the file * @param data the contents of the file
* @param dataLen the number of bytes data points to * @param dataLen the number of bytes data points to
*/ */
int write(void *data, FsSize_t dataLen, uint8_t fileType = 0); int write(void *data, FsSize_t dataLen, uint8_t fileType = 0);
/** /**
* Writes the given data to a "file" with the given id. * Writes the given data to a "file" with the given id.
@@ -60,7 +60,7 @@ class FileStore {
* @param data the contents of the file * @param data the contents of the file
* @param dataLen the number of bytes data points to * @param dataLen the number of bytes data points to
*/ */
int write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0); int write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0);
/** /**
* Removes the inode of the given ID. * Removes the inode of the given ID.
@@ -92,9 +92,9 @@ class FileStore {
*/ */
FsSize_t size(); FsSize_t size();
static uint8_t version(); static uint8_t version();
static uint8_t *format(uint8_t *buffer, FsSize_t size, uint32_t fsType = 0); static uint8_t *format(uint8_t *buffer, FsSize_t size, uint32_t fsType = 0);
private: private:
/** /**
@@ -166,11 +166,11 @@ class FileStore {
*/ */
void updateInodeAddress(InodeId_t id, FsSize_t addr); void updateInodeAddress(InodeId_t id, FsSize_t addr);
uint8_t *begin() { uint8_t *begin() {
return (uint8_t*) this; return (uint8_t*) this;
} }
uint8_t *end() { uint8_t *end() {
return begin() + this->m_size; return begin() + this->m_size;
} }
@@ -411,10 +411,10 @@ FsSize_t FileStore<FsSize_t>::nextInodeAddr() {
template<typename FsSize_t> template<typename FsSize_t>
void *FileStore<FsSize_t>::alloc(FsSize_t size) { void *FileStore<FsSize_t>::alloc(FsSize_t size) {
FsSize_t next = nextInodeAddr(); FsSize_t next = nextInodeAddr();
if ((next + size) > (uint64_t) end()) { if ((next + size) > (uint64_t) end()) {
compress(firstInode()); compress(firstInode());
next = nextInodeAddr(); next = nextInodeAddr();
if ((next + size) > (uint64_t) end()) { if ((next + size) > (uint64_t) end()) {
return nullptr; return nullptr;
} }
} }
@@ -480,7 +480,7 @@ FsSize_t FileStore<FsSize_t>::ptr(void *ptr) {
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
return ((uint8_t*) ptr) - begin(); return ((uint8_t*) ptr) - begin();
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(default:4244) #pragma warning(default:4244)
#endif #endif
@@ -512,7 +512,7 @@ uint8_t *FileStore<FsSize_t>::format(uint8_t *buffer, FsSize_t size, uint32_t fs
((Inode*) (fs + 1))->prev = fs->firstInode(); ((Inode*) (fs + 1))->prev = fs->firstInode();
fs->lastInode()->next = sizeof(FileStore<FsSize_t>); fs->lastInode()->next = sizeof(FileStore<FsSize_t>);
return (uint8_t*) buffer; return (uint8_t*) buffer;
} }
typedef FileStore<uint16_t> FileStore16; typedef FileStore<uint16_t> FileStore16;
-7
View File
@@ -29,12 +29,5 @@ FileSystem *createFileSystem(void *buff) {
return fs; return fs;
} }
template<>
FsType FileSystemTemplate<FileStore16>::FS_TYPE = OxFS_16;
template<>
FsType FileSystemTemplate<FileStore32>::FS_TYPE = OxFS_32;
template<>
FsType FileSystemTemplate<FileStore64>::FS_TYPE = OxFS_64;
} }
} }
+31 -33
View File
@@ -36,9 +36,9 @@ class FileSystem {
public: public:
virtual ~FileSystem() {}; virtual ~FileSystem() {};
virtual int read(uint64_t inode, void *buffer, uint64_t size) = 0; virtual int read(uint64_t inode, void *buffer, size_t size) = 0;
virtual uint8_t *read(uint64_t inode, uint64_t *size) = 0; virtual uint8_t *read(uint64_t inode, size_t *size) = 0;
virtual int remove(uint64_t inode) = 0; virtual int remove(uint64_t inode) = 0;
@@ -49,7 +49,7 @@ class FileSystem {
FileSystem *createFileSystem(void *buff); FileSystem *createFileSystem(void *buff);
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
class FileSystemTemplate: public FileSystem { class FileSystemTemplate: public FileSystem {
private: private:
@@ -82,8 +82,6 @@ class FileSystemTemplate: public FileSystem {
// static members // static members
static typename FileStore::InodeId_t INODE_ROOT_DIR; static typename FileStore::InodeId_t INODE_ROOT_DIR;
static FsType FS_TYPE;
FileStore *store = nullptr; FileStore *store = nullptr;
public: public:
@@ -93,9 +91,9 @@ class FileSystemTemplate: public FileSystem {
int read(const char *path, void *buffer); int read(const char *path, void *buffer);
uint8_t *read(uint64_t inode, uint64_t *size) override; uint8_t *read(uint64_t inode, size_t *size) override;
int read(uint64_t inode, void *buffer, uint64_t size) override; int read(uint64_t inode, void *buffer, size_t size) override;
int remove(uint64_t inode) override; int remove(uint64_t inode) override;
@@ -108,21 +106,21 @@ class FileSystemTemplate: public FileSystem {
static uint8_t *format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories); static uint8_t *format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories);
}; };
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
FileSystemTemplate<FileStore>::FileSystemTemplate(void *buff) { FileSystemTemplate<FileStore, FS_TYPE>::FileSystemTemplate(void *buff) {
store = (FileStore*) buff; store = (FileStore*) buff;
} }
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
typename FileStore::InodeId_t FileSystemTemplate<FileStore>::INODE_ROOT_DIR = 2; typename FileStore::InodeId_t FileSystemTemplate<FileStore, FS_TYPE>::INODE_ROOT_DIR = 2;
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
int FileSystemTemplate<FileStore>::mkdir(const char *path) { int FileSystemTemplate<FileStore, FS_TYPE>::mkdir(const char *path) {
return 0; return 0;
} }
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
FileStat FileSystemTemplate<FileStore>::stat(const char *path) { FileStat FileSystemTemplate<FileStore, FS_TYPE>::stat(const char *path) {
FileStat stat; FileStat stat;
return stat; return stat;
} }
@@ -130,8 +128,8 @@ FileStat FileSystemTemplate<FileStore>::stat(const char *path) {
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
FileStat FileSystemTemplate<FileStore>::stat(uint64_t inode) { FileStat FileSystemTemplate<FileStore, FS_TYPE>::stat(uint64_t inode) {
FileStat stat; FileStat stat;
auto s = store->stat(inode); auto s = store->stat(inode);
stat.size = s.size; stat.size = s.size;
@@ -146,8 +144,8 @@ FileStat FileSystemTemplate<FileStore>::stat(uint64_t inode) {
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
int FileSystemTemplate<FileStore>::read(uint64_t inode, void *buffer, uint64_t size) { int FileSystemTemplate<FileStore, FS_TYPE>::read(uint64_t inode, void *buffer, size_t size) {
auto err = 1; auto err = 1;
auto s = store->stat(inode); auto s = store->stat(inode);
if (size == s.size) { if (size == s.size) {
@@ -162,8 +160,8 @@ int FileSystemTemplate<FileStore>::read(uint64_t inode, void *buffer, uint64_t s
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
uint8_t *FileSystemTemplate<FileStore>::read(uint64_t inode, uint64_t *size) { uint8_t *FileSystemTemplate<FileStore, FS_TYPE>::read(uint64_t inode, size_t *size) {
auto s = store->stat(inode); auto s = store->stat(inode);
auto buff = new uint8_t[s.size]; auto buff = new uint8_t[s.size];
if (size) { if (size) {
@@ -182,8 +180,8 @@ uint8_t *FileSystemTemplate<FileStore>::read(uint64_t inode, uint64_t *size) {
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
int FileSystemTemplate<FileStore>::remove(uint64_t inode) { int FileSystemTemplate<FileStore, FS_TYPE>::remove(uint64_t inode) {
return store->remove(inode); return store->remove(inode);
} }
#ifdef _MSC_VER #ifdef _MSC_VER
@@ -193,8 +191,8 @@ int FileSystemTemplate<FileStore>::remove(uint64_t inode) {
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
int FileSystemTemplate<FileStore>::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) { int FileSystemTemplate<FileStore, FS_TYPE>::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) {
return store->write(inode, buffer, size, fileType); return store->write(inode, buffer, size, fileType);
} }
#ifdef _MSC_VER #ifdef _MSC_VER
@@ -204,16 +202,16 @@ int FileSystemTemplate<FileStore>::write(uint64_t inode, void *buffer, uint64_t
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
template<typename FileStore> template<typename FileStore, FsType FS_TYPE>
uint8_t *FileSystemTemplate<FileStore>::format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories) { uint8_t *FileSystemTemplate<FileStore, FS_TYPE>::format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories) {
buffer = FileStore::format((uint8_t*) buffer, size, (uint32_t) FileSystemTemplate<FileStore>::FS_TYPE); buffer = FileStore::format((uint8_t*) buffer, size, (uint32_t) FS_TYPE);
auto fs = createFileSystem(buffer); FileSystemTemplate<FileStore, FS_TYPE> fs(buffer);
if (buffer && useDirectories) { if (buffer && useDirectories) {
char dirBuff[sizeof(Directory) + sizeof(DirectoryEntry) + 2]; char dirBuff[sizeof(Directory) + sizeof(DirectoryEntry) + 2];
auto *dir = (Directory*) dirBuff; auto *dir = (Directory*) dirBuff;
dir->files(); dir->files();
fs->write(INODE_ROOT_DIR, dirBuff, useDirectories); fs.write(INODE_ROOT_DIR, dirBuff, useDirectories, FileType::Directory);
} }
return (uint8_t*) buffer; return (uint8_t*) buffer;
@@ -222,9 +220,9 @@ uint8_t *FileSystemTemplate<FileStore>::format(void *buffer, typename FileStore:
#pragma warning(default:4244) #pragma warning(default:4244)
#endif #endif
typedef FileSystemTemplate<FileStore16> FileSystem16; typedef FileSystemTemplate<FileStore16, OxFS_16> FileSystem16;
typedef FileSystemTemplate<FileStore32> FileSystem32; typedef FileSystemTemplate<FileStore32, OxFS_32> FileSystem32;
typedef FileSystemTemplate<FileStore64> FileSystem64; typedef FileSystemTemplate<FileStore64, OxFS_64> FileSystem64;
} }
} }
+10 -7
View File
@@ -5,6 +5,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#include <iostream>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -17,6 +18,7 @@
#endif #endif
using namespace ox::fs; using namespace ox::fs;
using namespace std;
const static auto oxfstoolVersion = "1.0.0"; const static auto oxfstoolVersion = "1.0.0";
const static auto usage = "usage:\n" const static auto usage = "usage:\n"
@@ -44,7 +46,7 @@ char *loadFileBuff(const char *path, ::size_t *sizeOut = nullptr) {
} }
} }
uint64_t bytes(const char *str) { size_t bytes(const char *str) {
auto size = ::ox_strlen(str); auto size = ::ox_strlen(str);
const auto lastChar = str[size-1]; const auto lastChar = str[size-1];
auto multiplier = 1; auto multiplier = 1;
@@ -69,7 +71,7 @@ uint64_t bytes(const char *str) {
multiplier = -1; multiplier = -1;
} }
} }
const auto retval = ((uint64_t) ::ox_atoi(copy)) * multiplier; const auto retval = ((size_t) ox_atoi(copy)) * multiplier;
delete []copy; delete []copy;
return retval; return retval;
} }
@@ -79,16 +81,17 @@ int format(int argc, char **args) {
auto err = 0; auto err = 0;
if (argc >= 5) { if (argc >= 5) {
auto type = ox_atoi(args[2]); auto type = ox_atoi(args[2]);
cout << args[3] << endl;
auto size = bytes(args[3]); auto size = bytes(args[3]);
auto path = args[4]; auto path = args[4];
auto buff = (uint8_t*) malloc(size); auto buff = (uint8_t*) malloc(size);
printf("Size: %llu bytes\n", size); cout << "Size: " << size << " bytes\n";
printf("Type: %d\n", type); cout << "Type: " << type << endl;
if (size < sizeof(FileStore64)) { if (size < sizeof(FileStore64)) {
err = 1; err = 1;
fprintf(stderr, "File system size %llu too small, must be at least %llu\n", (uint64_t) size, (uint64_t) sizeof(FileStore64)); cerr << "File system size " << size << " too small, must be at least " << sizeof(FileStore64) << endl;
} }
if (!err) { if (!err) {
@@ -136,8 +139,8 @@ int read(int argc, char **args) {
if (argc >= 4) { if (argc >= 4) {
auto fsPath = args[2]; auto fsPath = args[2];
auto inode = ox_atoi(args[3]); auto inode = ox_atoi(args[3]);
::size_t fsSize; size_t fsSize;
uint64_t fileSize; size_t fileSize;
auto fsBuff = loadFileBuff(fsPath, &fsSize); auto fsBuff = loadFileBuff(fsPath, &fsSize);
+4 -4
View File
@@ -7,18 +7,18 @@
*/ */
#include "memops.hpp" #include "memops.hpp"
void *ox_memcpy(void *dest, const void *src, size_t size) { void *ox_memcpy(void *dest, const void *src, int64_t size) {
char *srcBuf = (char*) src; char *srcBuf = (char*) src;
char *dstBuf = (char*) dest; char *dstBuf = (char*) dest;
for (size_t i = 0; i < size; i++) { for (int64_t i = 0; i < size; i++) {
dstBuf[i] = (char) srcBuf[i]; dstBuf[i] = (char) srcBuf[i];
} }
return dest; return dest;
} }
void *ox_memset(void *ptr, int val, size_t size) { void *ox_memset(void *ptr, int val, int64_t size) {
char *buf = (char*) ptr; char *buf = (char*) ptr;
for (size_t i = 0; i < size; i++) { for (int64_t i = 0; i < size; i++) {
buf[i] = val; buf[i] = val;
} }
return ptr; return ptr;
+2 -2
View File
@@ -9,6 +9,6 @@
#include "types.hpp" #include "types.hpp"
void *ox_memcpy(void *src, const void *dest, size_t size); void *ox_memcpy(void *src, const void *dest, int64_t size);
void *ox_memset(void *ptr, int val, size_t size); void *ox_memset(void *ptr, int val, int64_t size);
+2 -2
View File
@@ -24,7 +24,7 @@ int ox_strcmp(const char *str1, const char *str2) {
return retval; return retval;
} }
size_t ox_strlen(const char *str1) { int ox_strlen(const char *str1) {
int len; int len;
for (len = 0; str1[len]; len++); for (len = 0; str1[len]; len++);
return len; return len;
@@ -34,7 +34,7 @@ int ox_atoi(const char *str) {
int total = 0; int total = 0;
int multiplier = 1; int multiplier = 1;
for (auto i = ox_strlen(str) - 1; i != 0; i--) { for (auto i = ox_strlen(str) - 1; i != -1; i--) {
total += (str[i] - '0') * multiplier; total += (str[i] - '0') * multiplier;
multiplier *= 10; multiplier *= 10;
} }
+1 -1
View File
@@ -11,6 +11,6 @@
int ox_strcmp(const char *str1, const char *str2); int ox_strcmp(const char *str1, const char *str2);
size_t ox_strlen(const char *str1); int ox_strlen(const char *str1);
int ox_atoi(const char *str); int ox_atoi(const char *str);
+6 -1
View File
@@ -14,8 +14,13 @@ typedef unsigned short uint16_t;
typedef int int32_t; typedef int int32_t;
typedef unsigned int uint32_t; typedef unsigned int uint32_t;
typedef unsigned uint_t; typedef unsigned uint_t;
typedef long int64_t; #if defined(_MSC_VER) || defined(__APPLE__)
typedef long long int64_t;
typedef unsigned long long uint64_t; typedef unsigned long long uint64_t;
#else
typedef long int64_t;
typedef unsigned long uint64_t;
#endif
namespace ox { namespace ox {
namespace std { namespace std {