*
*/
#include <klibc/string.h>
-#include <lunaix/fs.h>
+#include <lunaix/fs/api.h>
#include <lunaix/fs/ramfs.h>
#include <lunaix/mm/valloc.h>
#include <lunaix/spike.h>
rinode->flags = flags;
inode->data = rinode;
+ inode->itype = VFS_IFFILE;
- if (!(flags & RAMF_DIR)) {
- inode->itype = VFS_IFFILE;
+ if ((flags & RAMF_DIR)) {
+ inode->itype |= VFS_IFDIR;
}
if ((flags & RAMF_SYMLINK)) {
int
ramfs_readdir(struct v_file* file, struct dir_context* dctx)
{
- int i = 0;
+ unsigned int i = 2;
struct v_dnode *pos, *n;
+
+ if (fsapi_handle_pseudo_dirent(file, dctx)) {
+ return 1;
+ }
+
llist_for_each(pos, n, &file->dnode->children, siblings)
{
- if (i++ >= dctx->index) {
+ if (i++ >= file->f_pos) {
dctx->read_complete_callback(dctx,
pos->name.value,
pos->name.len,
}
int
-ramfs_create(struct v_inode* this, struct v_dnode* dnode)
+ramfs_create(struct v_inode* this, struct v_dnode* dnode, unsigned int itype)
{
return __ramfs_mknod(dnode, NULL, RAMF_FILE);
}
return 0;
}
-void
-ramfs_init()
-{
- struct filesystem* ramfs = fsm_new_fs("ramfs", -1);
- ramfs->mount = ramfs_mount;
- ramfs->unmount = ramfs_unmount;
-
- fsm_register(ramfs);
-}
-EXPORT_FILE_SYSTEM(ramfs, ramfs_init);
-
int
ramfs_mksymlink(struct v_inode* this, const char* target)
{
assert(!(rinode->flags & RAMF_SYMLINK));
- size_t len = strlen(target);
+ size_t len = strlen(target) + 1;
char* symlink = valloc(len);
if (!symlink) {
memcpy(symlink, target, len);
- this->itype |= VFS_IFSYMLINK;
+ this->itype = VFS_IFSYMLINK;
rinode->flags |= RAMF_SYMLINK;
rinode->symlink = symlink;
+ rinode->size = len;
return 0;
}
*path_out = rinode->symlink;
- return 0;
+ return rinode->size;
}
int
-ramfs_unlink(struct v_inode* this)
+ramfs_unlink(struct v_inode* this, struct v_dnode* name)
{
struct ram_inode* rinode = RAM_INODE(this->data);
if ((rinode->flags & RAMF_SYMLINK)) {
rinode->flags &= ~RAMF_SYMLINK;
- this->itype &= ~VFS_IFSYMLINK;
+ this->itype &= ~F_SYMLINK;
vfree(rinode->symlink);
return 0;
}
+static void
+ramfs_init()
+{
+ struct filesystem* fs;
+ fs = fsapi_fs_declare("ramfs", FSTYPE_PSEUDO);
+
+ fsapi_fs_set_mntops(fs, ramfs_mount, ramfs_unmount);
+ fsapi_fs_finalise(fs);
+}
+EXPORT_FILE_SYSTEM(ramfs, ramfs_init);
+
const struct v_inode_ops ramfs_inode_ops = { .mkdir = ramfs_mkdir,
.rmdir = default_inode_rmdir,
.dir_lookup =
const struct v_file_ops ramfs_file_ops = { .readdir = ramfs_readdir,
.close = default_file_close,
.read = default_file_read,
- .read_page = default_file_read,
+ .read_page = default_file_read_page,
.write = default_file_write,
- .write_page = default_file_write,
+ .write_page =
+ default_file_write_page,
.seek = default_file_seek };
\ No newline at end of file