From 65409d2312e702a48d3cf5b32479d25266bda3c3 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Wed, 1 Jan 2020 18:22:19 -0800 Subject: 5858 Move script to create a Soso boot image into a sub-directory. I'm trying to streamline newcomer attention to just a couple of use cases. --- tools/iso/kernel.soso/rootfs.c | 96 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 tools/iso/kernel.soso/rootfs.c (limited to 'tools/iso/kernel.soso/rootfs.c') diff --git a/tools/iso/kernel.soso/rootfs.c b/tools/iso/kernel.soso/rootfs.c new file mode 100644 index 00000000..9104b01f --- /dev/null +++ b/tools/iso/kernel.soso/rootfs.c @@ -0,0 +1,96 @@ +#include "rootfs.h" +#include "alloc.h" + +static BOOL rootfs_open(File *node, uint32 flags); +static void rootfs_close(File *file); +static FileSystemNode *rootfs_finddir(FileSystemNode *node, char *name); +static struct FileSystemDirent *rootfs_readdir(FileSystemNode *node, uint32 index); +static BOOL rootfs_mkdir(FileSystemNode *node, const char *name, uint32 flags); + +FileSystemNode* initializeRootFS() { + FileSystemNode* root = (FileSystemNode*)kmalloc(sizeof(FileSystemNode)); + memset((uint8*)root, 0, sizeof(FileSystemNode)); + root->nodeType = FT_Directory; + root->open = rootfs_open; + root->close = rootfs_close; + root->readdir = rootfs_readdir; + root->finddir = rootfs_finddir; + root->mkdir = rootfs_mkdir; + + return root; +} + +static FileSystemDirent gDirent; + +static BOOL rootfs_open(File *node, uint32 flags) { + return TRUE; +} + +static void rootfs_close(File *file) { + +} + +static struct FileSystemDirent *rootfs_readdir(FileSystemNode *node, uint32 index) { + FileSystemNode *n = node->firstChild; + uint32 i = 0; + while (NULL != n) { + if (index == i) { + gDirent.fileType = n->nodeType; + gDirent.inode = n->inode; + strcpy(gDirent.name, n->name); + + return &gDirent; + } + n = n->nextSibling; + ++i; + } + + return NULL; +} + +static FileSystemNode *rootfs_finddir(FileSystemNode *node, char *name) { + FileSystemNode *n = node->firstChild; + while (NULL != n) { + if (strcmp(name, n->name) == 0) { + return n; + } + n = n->nextSibling; + } + + return NULL; +} + +static BOOL rootfs_mkdir(FileSystemNode *node, const char *name, uint32 flags) { + FileSystemNode *n = node->firstChild; + while (NULL != n) { + if (strcmp(name, n->name) == 0) { + return FALSE; + } + n = n->nextSibling; + } + + FileSystemNode* newNode = (FileSystemNode*)kmalloc(sizeof(FileSystemNode)); + memset((uint8*)newNode, 0, sizeof(FileSystemNode)); + strcpy(newNode->name, name); + newNode->nodeType = FT_Directory; + newNode->open = rootfs_open; + newNode->close = rootfs_close; + newNode->readdir = rootfs_readdir; + newNode->finddir = rootfs_finddir; + newNode->mkdir = rootfs_mkdir; + newNode->parent = node; + + if (node->firstChild == NULL) { + node->firstChild = newNode; + } + else { + FileSystemNode *n = node->firstChild; + while (NULL != n->nextSibling) { + n = n->nextSibling; + } + n->nextSibling = newNode; + } + + return TRUE; +} + -- cgit 1.4.1-2-gfad0