#include "vfs.h"

struct fs_node root, dev, initrd;

uint fs_read(struct fs_node *node, size_t offset, size_t size, uchar *buffer)
{
	if (!node || !node->vtable || !node->vtable->read)
		return 0;

	return node->vtable->read(node, offset, size, buffer);
}

uint fs_write(struct fs_node *node, size_t offset, size_t size, uchar *buffer)
{
	if (!node || !node->vtable || !node->vtable->write)
		return 0;

	return node->vtable->write(node, offset, size, buffer);
}

void fs_open(struct fs_node *node)
{
	if (!node || !node->vtable || !node->vtable->open)
		return;

	node->vtable->open(node);
}

void fs_close(struct fs_node *node)
{
	if (!node || !node->vtable || !node->vtable->close)
		return;

	node->vtable->close(node);
}

struct fs_dirent *fs_readdir(struct fs_node *node, uint index)
{
	if (!node || !node->vtable || !node->vtable->readdir || (node->flags & 7) != FS_DIRECTORY)
		return NULL;

	return node->vtable->readdir(node, index);
}

struct fs_node *fs_finddir(struct fs_node *node, char *name)
{
	if (!node || !node->vtable || !node->vtable->finddir || (node->flags & 7) != FS_DIRECTORY)
		return NULL;

	return node->vtable->finddir(node, name);
}

struct fs_dirent *root_readdir(struct fs_node *node, uint index)
{

}

void init_vfs()
{
}
