[ox/fs] Cleanup, Fix FileLocation to make copy of non-const strings
This commit is contained in:
parent
147a37ac6e
commit
1d600186cd
@ -28,7 +28,9 @@ FileAddress::FileAddress(uint64_t inode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FileAddress::FileAddress(char *path) {
|
FileAddress::FileAddress(char *path) {
|
||||||
m_data.path = path;
|
auto pathSize = ox_strlen(path) + 1;
|
||||||
|
m_data.path = new char[pathSize];
|
||||||
|
memcpy(m_data.path, path, pathSize);
|
||||||
m_type = FileAddressType::Path;
|
m_type = FileAddressType::Path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
397
deps/ox/src/ox/fs/oxfstool.cpp
vendored
397
deps/ox/src/ox/fs/oxfstool.cpp
vendored
@ -1,397 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 - 2018 gtalent2@gmail.com
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* 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/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iomanip>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <map>
|
|
||||||
#include <ox/std/strops.hpp>
|
|
||||||
#include <ox/fs/fs.hpp>
|
|
||||||
|
|
||||||
#include "toollib.hpp"
|
|
||||||
|
|
||||||
// suppress warnings about using fopen
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable:4996)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace ox;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
const static auto oxfstoolVersion = "1.4.0";
|
|
||||||
const static auto usage = "usage:\n"
|
|
||||||
"\toxfs format [16,32,64] <size> <path>\n"
|
|
||||||
"\toxfs read <FS file> <inode>\n"
|
|
||||||
"\toxfs write <FS file> <inode> <insertion file>\n"
|
|
||||||
"\toxfs write-expand <FS file> <inode> <insertion file>\n"
|
|
||||||
"\toxfs rm <FS file> <inode>\n"
|
|
||||||
"\toxfs compact <FS file>\n"
|
|
||||||
"\toxfs walk <FS file>\n"
|
|
||||||
"\toxfs version\n";
|
|
||||||
|
|
||||||
size_t bytes(const char *str) {
|
|
||||||
auto size = ::ox_strlen(str);
|
|
||||||
const auto lastChar = str[size-1];
|
|
||||||
auto multiplier = 1;
|
|
||||||
char copy[size + 1];
|
|
||||||
ox_memcpy(copy, str, size + 1);
|
|
||||||
// parse size unit
|
|
||||||
if (lastChar < '0' || lastChar > '9') {
|
|
||||||
copy[size-1] = 0;
|
|
||||||
switch (lastChar) {
|
|
||||||
case 'k':
|
|
||||||
case 'K':
|
|
||||||
multiplier = 1024;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
case 'M':
|
|
||||||
multiplier = 1024 * 1024;
|
|
||||||
break;
|
|
||||||
case 'g':
|
|
||||||
case 'G':
|
|
||||||
multiplier = 1024 * 1024 * 1024;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
multiplier = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ox_atoi(copy) * multiplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
int format(int argc, char **args) {
|
|
||||||
printf("Creating file system...\n");
|
|
||||||
auto err = 0;
|
|
||||||
if (argc >= 5) {
|
|
||||||
auto type = ox_atoi(args[2]);
|
|
||||||
auto size = bytes(args[3]);
|
|
||||||
auto path = args[4];
|
|
||||||
auto buff = new uint8_t[size];
|
|
||||||
|
|
||||||
|
|
||||||
if (size < sizeof(FileStore64)) {
|
|
||||||
err = 1;
|
|
||||||
cerr << "File system size " << size << " too small, must be at least " << sizeof(FileStore64) << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!err) {
|
|
||||||
// format
|
|
||||||
switch (type) {
|
|
||||||
case 16:
|
|
||||||
FileSystem16::format(buff, (FileStore16::FsSize_t) size, true);
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
FileSystem32::format(buff, (FileStore32::FsSize_t) size, true);
|
|
||||||
break;
|
|
||||||
case 64:
|
|
||||||
FileSystem64::format(buff, size, true);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!err) {
|
|
||||||
auto file = fopen(path, "wb");
|
|
||||||
if (file) {
|
|
||||||
err = fwrite(buff, size, 1, file) != 1;
|
|
||||||
err |= fclose(file);
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "Could not write to file: %s.\n", path);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Could not open file: %s.\n", path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete []buff;
|
|
||||||
|
|
||||||
if (err == 0) {
|
|
||||||
cerr << "Created file system " << path << endl;
|
|
||||||
cerr << " type " << type << endl;
|
|
||||||
cerr << " wrote " << size << " bytes\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Insufficient arguments\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int read(int argc, char **args) {
|
|
||||||
auto err = 1;
|
|
||||||
if (argc >= 4) {
|
|
||||||
auto fsPath = args[2];
|
|
||||||
auto inode = ox_atoi(args[3]);
|
|
||||||
size_t fsSize;
|
|
||||||
size_t fileSize;
|
|
||||||
|
|
||||||
auto fsBuff = loadFileBuff(fsPath, &fsSize);
|
|
||||||
|
|
||||||
if (fsBuff) {
|
|
||||||
auto fs = createFileSystem(fsBuff, fsSize);
|
|
||||||
|
|
||||||
if (fs) {
|
|
||||||
auto output = fs->read(inode, &fileSize);
|
|
||||||
|
|
||||||
if (output) {
|
|
||||||
fwrite(output, fileSize, 1, stdout);
|
|
||||||
delete []output;
|
|
||||||
err = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete fs;
|
|
||||||
delete []fsBuff;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Invalid file system type: %d.\n", *(uint32_t*) fsBuff);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Could not open file: %s\n", fsPath);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Insufficient arguments\n");
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int write(int argc, char **args, bool expand) {
|
|
||||||
auto err = 0;
|
|
||||||
if (argc >= 5) {
|
|
||||||
auto fsPath = args[2];
|
|
||||||
auto inode = ox_atoi(args[3]);
|
|
||||||
auto srcPath = args[4];
|
|
||||||
size_t srcSize;
|
|
||||||
|
|
||||||
auto fsFile = fopen(fsPath, "rb");
|
|
||||||
if (fsFile) {
|
|
||||||
fseek(fsFile, 0, SEEK_END);
|
|
||||||
|
|
||||||
auto fsSize = (size_t) ftell(fsFile);
|
|
||||||
rewind(fsFile);
|
|
||||||
auto fsBuff = new uint8_t[fsSize];
|
|
||||||
auto itemsRead = fread(fsBuff, fsSize, 1, fsFile);
|
|
||||||
fclose(fsFile);
|
|
||||||
|
|
||||||
if (itemsRead) {
|
|
||||||
auto srcBuff = loadFileBuff(srcPath, &srcSize);
|
|
||||||
if (srcBuff) {
|
|
||||||
auto expanded = false;
|
|
||||||
auto fs = createFileSystem(fsBuff, fsSize);
|
|
||||||
if (fs) {
|
|
||||||
if (expand && fs->available() <= srcSize) {
|
|
||||||
auto needed = fs->size() + fs->spaceNeeded(srcSize);
|
|
||||||
fsSize = needed;
|
|
||||||
fs = expandCopyCleanup(fs, needed);
|
|
||||||
fsBuff = fs->buff();
|
|
||||||
}
|
|
||||||
err |= fs->write(inode, srcBuff, srcSize);
|
|
||||||
|
|
||||||
// compact the file system if it was expanded
|
|
||||||
if (expanded) {
|
|
||||||
fs->resize();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "Could not write to file system.\n");
|
|
||||||
}
|
|
||||||
delete fs;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Invalid file system type: %d.\n", *(uint32_t*) fsBuff);
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!err) {
|
|
||||||
fsFile = fopen(fsPath, "wb");
|
|
||||||
|
|
||||||
if (fsFile) {
|
|
||||||
err = fwrite(fsBuff, fsSize, 1, fsFile) != 1;
|
|
||||||
err |= fclose(fsFile);
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "Could not write to file system file.\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete []srcBuff;
|
|
||||||
} else {
|
|
||||||
err = 1;
|
|
||||||
fprintf(stderr, "Could not load source file: %s.\n", srcPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete []fsBuff;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Could not open file system\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Insufficient arguments\n");
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int compact(int argc, char **args) {
|
|
||||||
auto err = 1;
|
|
||||||
if (argc >= 2) {
|
|
||||||
auto fsPath = args[2];
|
|
||||||
size_t fsSize;
|
|
||||||
|
|
||||||
auto fsBuff = loadFileBuff(fsPath, &fsSize);
|
|
||||||
if (fsBuff) {
|
|
||||||
auto fs = createFileSystem(fsBuff, fsSize);
|
|
||||||
|
|
||||||
if (fs) {
|
|
||||||
fs->resize();
|
|
||||||
|
|
||||||
// write back to file
|
|
||||||
auto fsFile = fopen(fsPath, "wb");
|
|
||||||
if (fsFile) {
|
|
||||||
err = fwrite(fsBuff, fs->size(), 1, fsFile) != 1;
|
|
||||||
err |= fclose(fsFile);
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "Could not write to file system file.\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete fs;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Invalid file system.\n");
|
|
||||||
}
|
|
||||||
delete []fsBuff;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Could not open file: %s\n", fsPath);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Insufficient arguments\n");
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int remove(int argc, char **args) {
|
|
||||||
auto err = 1;
|
|
||||||
if (argc >= 4) {
|
|
||||||
auto fsPath = args[2];
|
|
||||||
auto inode = ox_atoi(args[3]);
|
|
||||||
size_t fsSize;
|
|
||||||
|
|
||||||
auto fsBuff = loadFileBuff(fsPath, &fsSize);
|
|
||||||
if (fsBuff) {
|
|
||||||
auto fs = createFileSystem(fsBuff, fsSize);
|
|
||||||
|
|
||||||
if (fs) {
|
|
||||||
err = fs->remove(inode);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Invalid file system.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "Could not write to file system.\n");
|
|
||||||
} else {
|
|
||||||
auto fsFile = fopen(fsPath, "wb");
|
|
||||||
if (fsFile) {
|
|
||||||
err = fwrite(fsBuff, fsSize, 1, fsFile) != 1;
|
|
||||||
err |= fclose(fsFile);
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "Could not write to file system file.\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete fs;
|
|
||||||
delete []fsBuff;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Could not open file: %s\n", fsPath);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Insufficient arguments\n");
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int walk(int argc, char **args) {
|
|
||||||
int err = 0;
|
|
||||||
size_t fsSize;
|
|
||||||
if (argc >= 2) {
|
|
||||||
auto fsPath = args[2];
|
|
||||||
auto fsBuff = loadFileBuff(fsPath, &fsSize);
|
|
||||||
if (fsBuff) {
|
|
||||||
auto fs = createFileSystem(fsBuff, fsSize);
|
|
||||||
if (fs) {
|
|
||||||
cout << setw(9) << "Type |";
|
|
||||||
cout << setw(10) << "Start |";
|
|
||||||
cout << setw(10) << "End |";
|
|
||||||
cout << setw(8) << "Size";
|
|
||||||
cout << endl;
|
|
||||||
cout << "-------------------------------------";
|
|
||||||
cout << endl;
|
|
||||||
fs->walk([](const char *type, uint64_t start, uint64_t end) {
|
|
||||||
cout << setw(7) << type << " |";
|
|
||||||
cout << setw(8) << start << " |";
|
|
||||||
cout << setw(8) << end << " |";
|
|
||||||
cout << setw(8) << (end - start);
|
|
||||||
cout << endl;
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
delete fs;
|
|
||||||
} else {
|
|
||||||
cerr << "Invalid file system.\n";
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
delete []fsBuff;
|
|
||||||
} else {
|
|
||||||
err = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int help(int, char**) {
|
|
||||||
cout << usage << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int version(int, char**) {
|
|
||||||
cout << "oxfstool version " << oxfstoolVersion << endl;
|
|
||||||
cout << "oxfs format version " << FileStore16::VERSION << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **args) {
|
|
||||||
auto err = 0;
|
|
||||||
map<string, int(*)(int, char**)> cmdMap = {
|
|
||||||
{ "format", format },
|
|
||||||
{ "read", read },
|
|
||||||
{ "write", [](int argc, char **args) { return write(argc, args, false); } },
|
|
||||||
{ "write-expand", [](int argc, char **args) { return write(argc, args, true); } },
|
|
||||||
{ "compact", compact },
|
|
||||||
{ "rm", remove },
|
|
||||||
{ "walk", walk },
|
|
||||||
{ "help", help },
|
|
||||||
{ "version", version },
|
|
||||||
};
|
|
||||||
|
|
||||||
if (argc > 1) {
|
|
||||||
auto cmd = args[1];
|
|
||||||
auto f = cmdMap[cmd];
|
|
||||||
if (f) {
|
|
||||||
err = f(argc, args);
|
|
||||||
} else {
|
|
||||||
cout << "Command '" << cmd << "' not recognized." << endl;
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
help(argc, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
33
deps/ox/src/ox/fs/toollib.cpp
vendored
33
deps/ox/src/ox/fs/toollib.cpp
vendored
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 - 2018 gtalent2@gmail.com
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* 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/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "toollib.hpp"
|
|
||||||
|
|
||||||
uint8_t *loadFileBuff(FILE *file, ::size_t *sizeOut) {
|
|
||||||
if (file) {
|
|
||||||
fseek(file, 0, SEEK_END);
|
|
||||||
const auto size = ftell(file);
|
|
||||||
rewind(file);
|
|
||||||
auto buff = new uint8_t[size];
|
|
||||||
auto itemsRead = fread(buff, size, 1, file);
|
|
||||||
fclose(file);
|
|
||||||
if (sizeOut) {
|
|
||||||
*sizeOut = itemsRead ? size : 0;
|
|
||||||
}
|
|
||||||
return buff;
|
|
||||||
} else {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *loadFileBuff(const char *path, ::size_t *sizeOut) {
|
|
||||||
return loadFileBuff(fopen(path, "rb"), sizeOut);
|
|
||||||
}
|
|
14
deps/ox/src/ox/fs/toollib.hpp
vendored
14
deps/ox/src/ox/fs/toollib.hpp
vendored
@ -1,14 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 - 2018 gtalent2@gmail.com
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* 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/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
uint8_t *loadFileBuff(FILE *file, size_t *sizeOut = nullptr);
|
|
||||||
|
|
||||||
uint8_t *loadFileBuff(const char *path, size_t *sizeOut = nullptr);
|
|
Loading…
x
Reference in New Issue
Block a user