mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-06 12:59:18 +00:00
Updated kernel (tl;dr: improved filesystem, tasking, loading files, etc..)
This commit is contained in:
@ -3,90 +3,75 @@
|
||||
|
||||
#include <types.h>
|
||||
|
||||
#include <smartptr.hpp>
|
||||
#include <vector.hpp>
|
||||
|
||||
// show debug messages
|
||||
// #define DEBUG_FILESYSTEM 1
|
||||
|
||||
#ifdef DEBUG_FILESYSTEM
|
||||
#define vfsdbg(m, ...) debug(m, ##__VA_ARGS__)
|
||||
#else
|
||||
#define vfsdbg(m, ...)
|
||||
#endif
|
||||
|
||||
namespace FileSystem
|
||||
namespace VirtualFileSystem
|
||||
{
|
||||
#define FILENAME_LENGTH 256
|
||||
|
||||
struct FileSystemNode;
|
||||
struct Node;
|
||||
|
||||
typedef size_t (*OperationMount)(const char *, unsigned long, const void *);
|
||||
typedef size_t (*OperationUmount)(int);
|
||||
typedef size_t (*OperationRead)(FileSystemNode *Node, size_t Offset, size_t Size, uint8_t *Buffer);
|
||||
typedef size_t (*OperationWrite)(FileSystemNode *Node, size_t Offset, size_t Size, uint8_t *Buffer);
|
||||
typedef void (*OperationOpen)(FileSystemNode *Node, uint8_t Mode, uint8_t Flags);
|
||||
typedef void (*OperationClose)(FileSystemNode *Node);
|
||||
typedef size_t (*OperationRead)(Node *node, size_t Offset, size_t Size, uint8_t *Buffer);
|
||||
typedef size_t (*OperationWrite)(Node *node, size_t Offset, size_t Size, uint8_t *Buffer);
|
||||
typedef void (*OperationOpen)(Node *node, uint8_t Mode, uint8_t Flags);
|
||||
typedef void (*OperationClose)(Node *node);
|
||||
typedef size_t (*OperationSync)(void);
|
||||
typedef void (*OperationCreate)(FileSystemNode *Node, char *Name, uint16_t NameLength);
|
||||
typedef void (*OperationMkdir)(FileSystemNode *Node, char *Name, uint16_t NameLength);
|
||||
typedef void (*OperationCreate)(Node *node, char *Name, uint16_t NameLength);
|
||||
typedef void (*OperationMkdir)(Node *node, char *Name, uint16_t NameLength);
|
||||
|
||||
#define MountFSFunction(name) size_t name(const char *unknown0, unsigned long unknown1, const uint8_t *unknown2)
|
||||
#define UMountFSFunction(name) size_t name(int unknown0)
|
||||
|
||||
#define ReadFSFunction(name) size_t name(FileSystem::FileSystemNode *Node, size_t Offset, size_t Size, uint8_t *Buffer)
|
||||
#define WriteFSFunction(name) size_t name(FileSystem::FileSystemNode *Node, size_t Offset, size_t Size, uint8_t *Buffer)
|
||||
#define OpenFSFunction(name) void name(FileSystem::FileSystemNode *Node, uint8_t Mode, uint8_t Flags)
|
||||
#define CloseFSFunction(name) void name(FileSystem::FileSystemNode *Node)
|
||||
#define ReadFSFunction(name) size_t name(VirtualFileSystem::Node *node, size_t Offset, size_t Size, uint8_t *Buffer)
|
||||
#define WriteFSFunction(name) size_t name(VirtualFileSystem::Node *node, size_t Offset, size_t Size, uint8_t *Buffer)
|
||||
#define OpenFSFunction(name) void name(VirtualFileSystem::Node *node, uint8_t Mode, uint8_t Flags)
|
||||
#define CloseFSFunction(name) void name(VirtualFileSystem::Node *node)
|
||||
#define SyncFSFunction(name) size_t name(void)
|
||||
#define CreateFSFunction(name) void name(FileSystem::FileSystemNode *Node, char *Name, uint16_t NameLength)
|
||||
#define MkdirFSFunction(name) void name(FileSystem::FileSystemNode *Node, char *Name, uint16_t NameLength)
|
||||
#define CreateFSFunction(name) void name(VirtualFileSystem::Node *node, char *Name, uint16_t NameLength)
|
||||
#define MkdirFSFunction(name) void name(VirtualFileSystem::Node *node, char *Name, uint16_t NameLength)
|
||||
|
||||
enum FileStatus
|
||||
{
|
||||
OK = 0,
|
||||
NOT_FOUND = 1,
|
||||
ACCESS_DENIED = 2,
|
||||
INVALID_NAME = 3,
|
||||
INVALID_PARAMETER = 4,
|
||||
INVALID_HANDLE = 5,
|
||||
INVALID_PATH = 6,
|
||||
INVALID_FILE = 7,
|
||||
INVALID_DEVICE = 8,
|
||||
NOT_EMPTY = 9,
|
||||
NOT_SUPPORTED = 10,
|
||||
INVALID_DRIVE = 11,
|
||||
VOLUME_IN_USE = 12,
|
||||
TIMEOUT = 13,
|
||||
NO_MORE_FILES = 14,
|
||||
END_OF_FILE = 15,
|
||||
FILE_EXISTS = 16,
|
||||
PIPE_BUSY = 17,
|
||||
PIPE_DISCONNECTED = 18,
|
||||
MORE_DATA = 19,
|
||||
NO_DATA = 20,
|
||||
PIPE_NOT_CONNECTED = 21,
|
||||
MORE_ENTRIES = 22,
|
||||
DIRECTORY_NOT_EMPTY = 23,
|
||||
NOT_A_DIRECTORY = 24,
|
||||
FILE_IS_A_DIRECTORY = 25,
|
||||
DIRECTORY_NOT_ROOT = 26,
|
||||
DIRECTORY_NOT_EMPTY_2 = 27,
|
||||
END_OF_MEDIA = 28,
|
||||
NO_MEDIA = 29,
|
||||
UNRECOGNIZED_MEDIA = 30,
|
||||
SECTOR_NOT_FOUND = 31
|
||||
OK,
|
||||
NotFound,
|
||||
NotEmpty,
|
||||
NotSupported,
|
||||
AccessDenied,
|
||||
Timeout,
|
||||
SectorNotFound,
|
||||
PartiallyCompleted,
|
||||
|
||||
InvalidName,
|
||||
InvalidParameter,
|
||||
InvalidHandle,
|
||||
InvalidPath,
|
||||
InvalidDevice,
|
||||
InvalidOperator,
|
||||
InvalidNode,
|
||||
|
||||
FileExists,
|
||||
FileIsADirectory,
|
||||
FileIsInvalid,
|
||||
|
||||
DirectoryNotEmpty,
|
||||
NotADirectory,
|
||||
|
||||
UnknownFileStatusError
|
||||
};
|
||||
|
||||
enum NodeFlags
|
||||
{
|
||||
FS_ERROR = 0x0,
|
||||
FS_FILE = 0x01,
|
||||
FS_DIRECTORY = 0x02,
|
||||
FS_CHARDEVICE = 0x03,
|
||||
FS_BLOCKDEVICE = 0x04,
|
||||
FS_PIPE = 0x05,
|
||||
FS_SYMLINK = 0x06,
|
||||
FS_MOUNTPOINT = 0x08
|
||||
NODE_FLAG_ERROR = 0x0,
|
||||
FILE = 0x01,
|
||||
DIRECTORY = 0x02,
|
||||
CHARDEVICE = 0x03,
|
||||
BLOCKDEVICE = 0x04,
|
||||
PIPE = 0x05,
|
||||
SYMLINK = 0x06,
|
||||
MOUNTPOINT = 0x08
|
||||
};
|
||||
|
||||
struct FileSystemOperations
|
||||
@ -102,62 +87,67 @@ namespace FileSystem
|
||||
OperationMkdir MakeDirectory = nullptr;
|
||||
};
|
||||
|
||||
struct FileSystemNode
|
||||
struct Node
|
||||
{
|
||||
char Name[FILENAME_LENGTH];
|
||||
uint64_t IndexNode = 0;
|
||||
uint64_t Mask = 0;
|
||||
uint64_t Mode = 0;
|
||||
int Flags = NodeFlags::FS_ERROR;
|
||||
NodeFlags Flags = NodeFlags::NODE_FLAG_ERROR;
|
||||
uint64_t UserIdentifier = 0, GroupIdentifier = 0;
|
||||
uintptr_t Address = 0;
|
||||
size_t Length = 0;
|
||||
FileSystemNode *Parent = nullptr;
|
||||
Node *Parent = nullptr;
|
||||
FileSystemOperations *Operator = nullptr;
|
||||
/* For root node:
|
||||
0 - root "/"
|
||||
1 - etc
|
||||
...
|
||||
*/
|
||||
Vector<FileSystemNode *> Children;
|
||||
Vector<Node *> Children;
|
||||
};
|
||||
|
||||
struct FILE
|
||||
struct File
|
||||
{
|
||||
const char *Name;
|
||||
char Name[FILENAME_LENGTH];
|
||||
FileStatus Status;
|
||||
FileSystemNode *Node;
|
||||
Node *node;
|
||||
};
|
||||
|
||||
/* Manage / etc.. */
|
||||
class Virtual
|
||||
{
|
||||
private:
|
||||
FileSystemNode *FileSystemRoot = nullptr;
|
||||
Node *FileSystemRoot = nullptr;
|
||||
|
||||
public:
|
||||
FileSystemNode *GetRootNode() { return FileSystemRoot; }
|
||||
FILE *ConvertNodeToFILE(FileSystemNode *Node)
|
||||
{
|
||||
FILE *File = new FILE;
|
||||
File->Name = Node->Name;
|
||||
File->Status = FileStatus::OK;
|
||||
File->Node = Node;
|
||||
return File;
|
||||
}
|
||||
char *GetPathFromNode(FileSystemNode *Node);
|
||||
FileSystemNode *GetNodeFromPath(FileSystemNode *Parent, const char *Path);
|
||||
char *NormalizePath(FileSystemNode *Parent, const char *Path);
|
||||
shared_ptr<char> GetPathFromNode(Node *node);
|
||||
Node *GetNodeFromPath(const char *Path, Node *Parent = nullptr);
|
||||
shared_ptr<File> ConvertNodeToFILE(Node *node);
|
||||
|
||||
FileStatus FileExists(FileSystemNode *Parent, const char *Path);
|
||||
FILE *Mount(FileSystemOperations *Operator, const char *Path);
|
||||
FileStatus Unmount(FILE *File);
|
||||
FILE *Open(const char *Path, FileSystemNode *Parent = nullptr);
|
||||
size_t Read(FILE *File, size_t Offset, uint8_t *Buffer, size_t Size);
|
||||
size_t Write(FILE *File, size_t Offset, uint8_t *Buffer, size_t Size);
|
||||
FileStatus Close(FILE *File);
|
||||
FileSystemNode *CreateRoot(FileSystemOperations *Operator, const char *RootName);
|
||||
FileSystemNode *Create(FileSystemNode *Parent, const char *Path);
|
||||
Node *GetParent(const char *Path, Node *Parent);
|
||||
Node *GetRootNode() { return FileSystemRoot; }
|
||||
|
||||
Node *AddNewChild(const char *Name, Node *Parent);
|
||||
Node *GetChild(const char *Name, Node *Parent);
|
||||
FileStatus RemoveChild(const char *Name, Node *Parent);
|
||||
|
||||
shared_ptr<char> NormalizePath(const char *Path, Node *Parent = nullptr);
|
||||
bool PathExists(const char *Path, Node *Parent = nullptr);
|
||||
Node *CreateRoot(const char *RootName, FileSystemOperations *Operator);
|
||||
Node *Create(const char *Path, NodeFlags Flag, Node *Parent = nullptr);
|
||||
|
||||
FileStatus Delete(const char *Path, bool Recursive = false, Node *Parent = nullptr);
|
||||
FileStatus Delete(Node *Path, bool Recursive = false, Node *Parent = nullptr);
|
||||
|
||||
shared_ptr<File> Mount(const char *Path, FileSystemOperations *Operator);
|
||||
FileStatus Unmount(shared_ptr<File> File);
|
||||
|
||||
size_t Read(shared_ptr<File> File, size_t Offset, uint8_t *Buffer, size_t Size);
|
||||
size_t Write(shared_ptr<File> File, size_t Offset, uint8_t *Buffer, size_t Size);
|
||||
|
||||
shared_ptr<File> Open(const char *Path, Node *Parent = nullptr);
|
||||
FileStatus Close(shared_ptr<File> File);
|
||||
|
||||
Virtual();
|
||||
~Virtual();
|
||||
|
Reference in New Issue
Block a user