// vfs.h // Author: Josh Holtrop // Date: 08/22/04 // Modified: 12/21/04 #ifndef __HOS_VFS_H__ #define __HOS_VFS_H__ __HOS_VFS_H__ #include "hos_defines.h" #include "fs/devices.h" #define FS_EXT2 1 #define VFS_MAX_FS 10 #define VFS_FT_UNKNOWN 0 #define VFS_FT_FILE 1 #define VFS_FT_DIR 2 #define VFS_FT_CHAR 3 #define VFS_FT_BLOCK 4 #define VFS_FT_FIFO 5 #define VFS_FT_SOCK 6 #define VFS_FT_SYMLINK 7 #define VFS_PERMS_OX 0x0001 #define VFS_PERMS_OW 0x0002 #define VFS_PERMS_OR 0x0004 #define VFS_PERMS_GX 0x0008 #define VFS_PERMS_GW 0x0010 #define VFS_PERMS_GR 0x0020 #define VFS_PERMS_UX 0x0040 #define VFS_PERMS_UW 0x0080 #define VFS_PERMS_UR 0x0100 #define VFS_PERMS_STICKY 0x0200 #define VFS_PERMS_SGID 0x0400 #define VFS_PERMS_SUID 0x0800 #define EOF 1000000 typedef u64_t vfs_inode_t; /* Structure to hold information about a mount point */ struct vfs_mount_s { int refs; void *super; int fs; major_t major; minor_t minor; char *mountPoint; vfs_inode_t vfs_mount_inode; vfs_inode_t vfs_up_inode; vfs_inode_t vfs_root_inode; struct vfs_mount_s *next; struct vfs_mount_s *prev; }; typedef struct vfs_mount_s vfs_mount_t; typedef struct { u16_t type; // file type, of VFS_FILE_TYPE_* u32_t size; u32_t inode; u16_t permissions; u16_t uid; u16_t gid; u32_t atime; u32_t mtime; u32_t ctime; u16_t links; u32_t dev; } vfs_stat_t; typedef struct { vfs_mount_t *mount; void *fs_data; } vfs_open_file_t; typedef struct { char name[257]; u32_t inode_number; // relative inode number returned from fs } vfs_dir_entry_t; typedef struct { vfs_mount_t *mount; u32_t inode; } vfs_file_addr_t; /* Every filesystem must provide pointers to its respective functions in a structure like this */ typedef struct { void *(*mount_super)(major_t major, minor_t minor); int (*umount_super)(vfs_mount_t *mount); int (*stat)(vfs_mount_t *mount, u32_t inode_number, vfs_stat_t *stat); u32_t (*get_root_inode)(vfs_mount_t *mount); int (*link_deref)(vfs_mount_t *mount, u32_t inode_number, char *link); int (*free_inodes)(vfs_mount_t *mount); int (*total_inodes)(vfs_mount_t *mount); int (*free_blocks)(vfs_mount_t *mount); int (*total_blocks)(vfs_mount_t *mount); u32_t (*alloc_inode)(vfs_mount_t *mount); int (*free_inode)(vfs_mount_t *mount, u32_t inode_number); u32_t (*alloc_block)(vfs_mount_t *mount); int (*free_block)(vfs_mount_t *mount, u32_t block_number); int (*open_dir)(vfs_mount_t *mount, u32_t inode_number, vfs_open_file_t *dir); int (*read_dir)(vfs_mount_t *mount, vfs_open_file_t *dir, vfs_dir_entry_t *dentry); int (*close_dir)(vfs_mount_t *mount, vfs_open_file_t *dir); int (*open_file)(vfs_mount_t *mount, u32_t inode_number, vfs_open_file_t *open_file); int (*read_file)(vfs_mount_t *mount, vfs_open_file_t *open_file); int (*close_file)(vfs_mount_t *mount, vfs_open_file_t *open_file); int (*open_block_file)(vfs_mount_t *mount, u32_t inode_number, vfs_open_file_t *open_file); int (*read_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer); int (*block_file_seek)(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number); int (*close_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file); } vfs_fs_t; int vfs_init(); int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint); int vfs_umount(char *mountPoint); int vfs_register_fs(int fsn, vfs_fs_t *fs); int vfs_umount(char *mountPoint); vfs_inode_t vfs_get_inode_number(char *path); vfs_inode_t vfs_get_inode_number_rel(vfs_inode_t dir_inode, char *path); vfs_inode_t vfs_real_inode(vfs_inode_t vfs_inode); vfs_file_addr_t vfs_get_file_addr(vfs_inode_t vfs_inode); vfs_inode_t vfs_entry_lookup(vfs_inode_t dir_inode, char *entry); int vfs_mount_count(); vfs_mount_t *vfs_get_mount(int index); int vfs_free_inodes(vfs_mount_t *mount); int vfs_total_inodes(vfs_mount_t *mount); int vfs_free_blocks(vfs_mount_t *mount); int vfs_total_blocks(vfs_mount_t *mount); vfs_inode_t vfs_alloc_inode(vfs_mount_t *mount); int vfs_free_inode(vfs_mount_t *mount, u32_t inode_number); u32_t vfs_alloc_block(vfs_mount_t *mount); int vfs_free_block(vfs_mount_t *mount, u32_t block_number); int vfs_link_deref(vfs_inode_t vfs_inode, char *link); int vfs_stat(char *file, vfs_stat_t *stat); int vfs_stat_inode(vfs_inode_t vfs_inode, vfs_stat_t *stat); vfs_open_file_t *vfs_open_dir(char *path); vfs_open_file_t *vfs_open_dir_inode(vfs_inode_t inode); int vfs_read_dir(vfs_open_file_t *open_dir, vfs_dir_entry_t *dentry); int vfs_close_dir(vfs_open_file_t *open_dir); vfs_open_file_t *vfs_open_block_file(char *file); vfs_open_file_t *vfs_open_block_file_inode(vfs_inode_t vfs_inode); int vfs_read_block_file(vfs_open_file_t *open_file, void *buffer); int vfs_block_file_seek(vfs_open_file_t *open_file, u32_t block_number); int vfs_close_block_file(vfs_open_file_t *open_file); #endif