BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / blob / master / vfs / tmpfs / file.c

// Related

Nucleus

Barry System headers (remove libc dependency) 18495cf (3 years, 2 months ago)
#include <stddef.h>
#include <stdint.h>
#include <nucleus/lib.h>
#include <nucleus/memory.h>
#include <nucleus/vfs.h>

size_t tmpfs_read(File *file, char *buf, size_t size, off_t offset);
size_t tmpfs_write(File *file, char *buf, size_t size, off_t offset);
int tmpfs_open(File *file);

FileOps tmpfsFileOps = {
	.read = tmpfs_read,
	.write = tmpfs_write,
	.open = tmpfs_open,
};

/* Read a file */
size_t
tmpfs_read(File *file, char *buf, size_t size, off_t offset)
{
	if (offset > file->inode->size)
		return 0;
	if (size + offset > file->inode->size)
		size = file->inode->size - offset;

	Page *page;
	char *data;
	size_t count = 0;
	uint16_t min, indent = offset % PAGE_SIZE;
	while (size) {
		min = (size > PAGE_SIZE) ? PAGE_SIZE : size;
		page = find_page(file->inode->pages, offset);
		if (!page)
			break;
		data = map_page(page);
		memcpy(buf + count, data + indent, min);
		size -= min;
		count += min;
		indent = 0;
	}
	return count;
}

/* Write a file */
size_t
tmpfs_write(File *file, char *buf, size_t size, off_t offset)
{
	if (size + offset > file->inode->size)
		file->inode->size = size + offset;

	Page *page;
	char *data;
	size_t count = 0;
	uint16_t min, indent = offset % PAGE_SIZE;
	while (size) {
		min = (size > PAGE_SIZE) ? PAGE_SIZE : size;
		page = find_page(file->inode->pages, offset);
		if (!page)
			page = create_page(file->inode->pages, alloc_frame(),
			                   offset);
		data = map_page(page);
		memcpy(data + indent, buf + count, min);
		size -= min;
		count += min;
		indent = 0;
	}
	return count;
}

/* Open a file */
int
tmpfs_open(File *file)
{
	return 0;
}