mirror of
https://github.com/NeoFlock/neonucleus.git
synced 2025-09-24 09:03:32 +02:00
tmpfs loading an image
This commit is contained in:
parent
b25f830f3b
commit
9320a19d1c
@ -1,7 +1,5 @@
|
|||||||
#include "../neonucleus.h"
|
#include "../neonucleus.h"
|
||||||
|
|
||||||
// TODO: finish
|
|
||||||
|
|
||||||
// Data structures
|
// Data structures
|
||||||
|
|
||||||
typedef struct nn_vfnode {
|
typedef struct nn_vfnode {
|
||||||
@ -556,7 +554,39 @@ nn_size_t nn_vfs_seek(nn_vfilesystem *fs, nn_vfhandle *handle, const char *whenc
|
|||||||
return handle->position;
|
return handle->position;
|
||||||
}
|
}
|
||||||
|
|
||||||
// main funciton
|
typedef struct nn_vfilesystemImage {
|
||||||
|
nn_vfilesystemImageNode *nodes;
|
||||||
|
nn_size_t ptr;
|
||||||
|
} nn_vfilesystemImage;
|
||||||
|
|
||||||
|
static nn_vfilesystemImageNode nni_vfsimg_nextNode(nn_vfilesystemImage *stream) {
|
||||||
|
nn_vfilesystemImageNode node = stream->nodes[stream->ptr];
|
||||||
|
stream->ptr++;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nn_vfnode *nni_vfsimg_parseNode(nn_vfilesystem *fs, nn_vfilesystemImage *stream) {
|
||||||
|
// TODO: make this handle OOMs
|
||||||
|
nn_vfilesystemImageNode node = nni_vfsimg_nextNode(stream);
|
||||||
|
if(node.data == NULL) {
|
||||||
|
// directory!!!!!
|
||||||
|
nn_vfnode *dir = nn_vf_allocDirectory(fs, node.name);
|
||||||
|
dir->len = node.len;
|
||||||
|
for(int i = 0; i < node.len; i++) {
|
||||||
|
nn_vfnode *entry = nni_vfsimg_parseNode(fs, stream);
|
||||||
|
dir->entries[i] = entry;
|
||||||
|
}
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
// file!!!!!
|
||||||
|
nn_vfnode *file = nn_vf_allocFile(fs, node.name);
|
||||||
|
nn_vf_ensureFileCapacity(file, node.len);
|
||||||
|
file->len = node.len;
|
||||||
|
nn_memcpy(file->data, node.data, node.len);
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
|
||||||
nn_filesystem *nn_volatileFilesystem(nn_Context *context, nn_vfilesystemOptions opts, nn_filesystemControl control) {
|
nn_filesystem *nn_volatileFilesystem(nn_Context *context, nn_vfilesystemOptions opts, nn_filesystemControl control) {
|
||||||
// TODO: handle OOM
|
// TODO: handle OOM
|
||||||
@ -567,6 +597,20 @@ nn_filesystem *nn_volatileFilesystem(nn_Context *context, nn_vfilesystemOptions
|
|||||||
fs->birthday = time;
|
fs->birthday = time;
|
||||||
fs->opts = opts;
|
fs->opts = opts;
|
||||||
fs->root = nn_vf_allocDirectory(fs, "/");
|
fs->root = nn_vf_allocDirectory(fs, "/");
|
||||||
|
|
||||||
|
if(opts.image != NULL) {
|
||||||
|
nn_vfilesystemImage stream = {
|
||||||
|
.nodes = opts.image,
|
||||||
|
.ptr = 0,
|
||||||
|
};
|
||||||
|
// we got supplied an image, shit
|
||||||
|
fs->root->len = opts.rootEntriesInImage;
|
||||||
|
for(int i = 0; i < opts.rootEntriesInImage; i++) {
|
||||||
|
nn_vfnode *entry = nni_vfsimg_parseNode(fs, &stream);
|
||||||
|
fs->root->entries[i] = entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nn_filesystemTable table = {
|
nn_filesystemTable table = {
|
||||||
.userdata = fs,
|
.userdata = fs,
|
||||||
.deinit = (void *)nn_vfs_deinit,
|
.deinit = (void *)nn_vfs_deinit,
|
||||||
|
@ -671,6 +671,14 @@ int main() {
|
|||||||
nn_filesystem *genericFS = nn_newFilesystem(&ctx, genericFSTable, ne_fs_ctrl);
|
nn_filesystem *genericFS = nn_newFilesystem(&ctx, genericFSTable, ne_fs_ctrl);
|
||||||
nn_addFileSystem(computer, NULL, 1, genericFS);
|
nn_addFileSystem(computer, NULL, 1, genericFS);
|
||||||
|
|
||||||
|
nn_vfilesystemImageNode tmpfsImg[] = {
|
||||||
|
(nn_vfilesystemImageNode) {
|
||||||
|
.name = "testScript.lua",
|
||||||
|
.data = "print('Hello, world!')",
|
||||||
|
.len = nn_strlen("print('Hello, world!')"),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
nn_vfilesystemOptions tmpfsOpts = {
|
nn_vfilesystemOptions tmpfsOpts = {
|
||||||
.isReadOnly = false,
|
.isReadOnly = false,
|
||||||
.capacity = 64*1024,
|
.capacity = 64*1024,
|
||||||
@ -678,6 +686,8 @@ int main() {
|
|||||||
.labelLen = 5,
|
.labelLen = 5,
|
||||||
.creationTime = 0, // we are at the start of time
|
.creationTime = 0, // we are at the start of time
|
||||||
.maxDirEntries = 64,
|
.maxDirEntries = 64,
|
||||||
|
.image = tmpfsImg,
|
||||||
|
.rootEntriesInImage = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
nn_filesystem *tmpFS = nn_volatileFilesystem(&ctx, tmpfsOpts, ne_fs_ctrl);
|
nn_filesystem *tmpFS = nn_volatileFilesystem(&ctx, tmpfsOpts, ne_fs_ctrl);
|
||||||
|
@ -727,6 +727,14 @@ typedef struct nn_filesystemTable {
|
|||||||
|
|
||||||
typedef struct nn_filesystem nn_filesystem;
|
typedef struct nn_filesystem nn_filesystem;
|
||||||
|
|
||||||
|
typedef struct nn_vfilesystemImageNode {
|
||||||
|
const char *name;
|
||||||
|
// if NULL, the node is a directory
|
||||||
|
const char *data;
|
||||||
|
// if it is a directory, this is the amount of entries encoded afterwards
|
||||||
|
nn_size_t len;
|
||||||
|
} nn_vfilesystemImageNode;
|
||||||
|
|
||||||
typedef struct nn_vfilesystemOptions {
|
typedef struct nn_vfilesystemOptions {
|
||||||
// used to compute lastModified
|
// used to compute lastModified
|
||||||
nn_size_t creationTime;
|
nn_size_t creationTime;
|
||||||
@ -735,6 +743,9 @@ typedef struct nn_vfilesystemOptions {
|
|||||||
nn_bool_t isReadOnly;
|
nn_bool_t isReadOnly;
|
||||||
char label[NN_LABEL_SIZE];
|
char label[NN_LABEL_SIZE];
|
||||||
nn_size_t labelLen;
|
nn_size_t labelLen;
|
||||||
|
// loading the files into the tmpfs
|
||||||
|
nn_vfilesystemImageNode *image;
|
||||||
|
nn_size_t rootEntriesInImage;
|
||||||
} nn_vfilesystemOptions;
|
} nn_vfilesystemOptions;
|
||||||
|
|
||||||
nn_filesystem *nn_newFilesystem(nn_Context *context, nn_filesystemTable table, nn_filesystemControl control);
|
nn_filesystem *nn_newFilesystem(nn_Context *context, nn_filesystemTable table, nn_filesystemControl control);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user