blob: d9f36a6f640d0d70740fca0e2b7049e88b8c6f54 [file] [log] [blame]
#pragma once
#include "kint.h"
struct fs_vtable;
#define FS_MAX_NAME_LEN 128
struct fs_node
{
/** length of file name */
uint name_len;
/** file name */
char name[128];
/** identifier */
uint inode;
/** type of node */
uint flags;
/** permissions */
uint mask;
/** group id */
uint gid;
/** user id */
uint uid;
/** size in bytes */
size_t size;
/** reserved for driver */
union
{
uint dri_res_i;
void *dri_res_p;
};
struct fs_vtable *vtable;
/** used for mounts */
struct fs_node *mount;
};
struct fs_dirent
{
// EXT2 supports up to 256 byte file names, so we will do the same
char name[256];
uint name_len;
uint inode;
};
typedef uint (*fs_read_t)(struct fs_node *node, size_t offset, size_t size, uchar *buffer);
typedef uint (*fs_write_t)(struct fs_node *node, size_t offset, size_t size, uchar *buffer);
typedef void (*fs_open_t)(struct fs_node *node);
typedef void (*fs_close_t)(struct fs_node *node);
typedef bool (*fs_readdir_t)(struct fs_node *node, uint index, struct fs_dirent *dirent);
typedef struct fs_node *(*fs_finddir_t)(struct fs_node *node, char *name, uint name_len);
struct fs_vtable
{
fs_read_t read;
fs_write_t write;
fs_open_t open;
fs_close_t close;
fs_readdir_t readdir;
fs_finddir_t finddir;
};
enum fs_flags
{
FS_FILE = 1,
FS_DIRECTORY,
FS_CHARDEVICE,
FS_BLOCKDEVICE,
FS_PIPE,
FS_SYMLINK,
FS_MOUNT = 8, /* Can be or'd with others */
};
extern struct fs_node root, dev, initrd;
/* Not to be confused normal open, close, etc functions, these operate
* on the VFS directly
* read and write return the number of bytes written/read, */
uint fs_read(struct fs_node *node, size_t offset, size_t size, uchar *buffer);
uint fs_write(struct fs_node *node, size_t offset, size_t size, uchar *buffer);
void fs_open(struct fs_node *node);
void fs_close(struct fs_node *node);
bool fs_readdir(struct fs_node *node, uint index, struct fs_dirent *out);
struct fs_node *fs_finddir(struct fs_node *node, char *name, uint name_len);
/* Returns the following error codes:
* 0: success
* 1: target is not a directory
* 2: target is already a mount point
* 3: source is not a directory */
uint fs_mount(struct fs_node *target, struct fs_node *source);
void init_vfs();