BarryServer : Git

All the code for all my projects
// BarryServer : Git / Orion / commit / d41a53cbc7d055b1c00cf0a339dbed6925f4f02c / vfs / vfs.h

// Related

Orion

Barry Importing existing Orion kernel d41a53c (2 years, 4 months ago)
diff --git a/vfs/vfs.h b/vfs/vfs.h
new file mode 100644
index 0000000..ece5679
--- /dev/null
+++ b/vfs/vfs.h
@@ -0,0 +1,202 @@
+#ifndef KERNEL_VFS_H
+#define KERNEL_VFS_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include "../spinlock.h"
+#include "../mem/paging.h"
+
+#define NFILES 32
+#define NAME_MAX 255
+#define PATH_MAX 1024
+
+#define MAY_READ 4
+#define MAY_WRITE 2
+#define MAY_EXECUTE 1
+
+typedef struct FileSystemType FileSystemType;
+typedef struct SuperBlock SuperBlock;
+typedef struct SuperOps SuperOps;
+typedef struct Inode Inode;
+typedef struct InodeOps InodeOps;
+typedef struct File File;
+typedef struct FileOps FileOps;
+typedef struct DirEntry DirEntry;
+typedef struct Page Page;
+typedef struct PageCache PageCache;
+typedef struct Custody Custody;
+typedef struct CustodyChain CustodyChain;
+
+/* Structure for a File System Type */
+struct FileSystemType {
+	const char *name;
+	Inode *(*mount)(FileSystemType *, int, const char *, void *);
+	void (*kill_sb)(SuperBlock *);
+	pid_t owner;
+	FileSystemType *next;
+};
+
+/* Structure for a Super Block */
+struct SuperBlock {
+	FileSystemType *type;
+	SuperOps *ops;
+	Spinlock lock;
+	Inode *root;
+	Inode *inodes; /* List of cached inodes */
+	size_t cachedInodes;
+	File *back;
+	void *data;
+};
+struct SuperOps {
+	Inode *(*alloc_inode)(SuperBlock *);
+	int (*write_inode)(Inode *);
+	void (*delete_inode)(Inode *);
+};
+
+/* Structure for an Inode */
+struct Inode {
+	ino_t ino;
+	refcount_t usage;
+	unsigned short uid, gid;
+	mode_t mode;
+	nlink_t nlink;
+	uint32_t flags;
+	size_t size;
+	dev_t dev;
+	Spinlock lock;
+	InodeOps *ops;
+	FileOps *fileOps;
+	SuperBlock *super;
+	union {
+		DirEntry *dirEntries; /* List of Directory Entries */
+		PageCache *pages; /* List of Pages */
+	};
+	Inode *lnext; /* Next inode in super list */
+};
+struct InodeOps {
+	int (*create)(Inode *, DirEntry *, mode_t);
+	Inode *(*lookup)(Inode *, const char *);
+	int (*mkdir)(Inode *, DirEntry *, mode_t);
+	int (*rmdir)(Inode *, DirEntry *);
+	int (*mknod)(Inode *, DirEntry *, mode_t, dev_t);
+	int (*rename) (Inode *, DirEntry *, Inode *, DirEntry *);
+};
+
+/* Structure for an open File */
+struct File {
+	Inode *inode;
+	unsigned short uid, gid;
+	int flags;
+	mode_t mode;
+	off_t pos;
+	Spinlock lock;
+	FileOps *ops;
+	CustodyChain *path;
+	refcount_t usage;
+};
+struct FileOps {
+	off_t (*lseek)(File *, off_t, int);
+	size_t (*read)(File *, char *, size_t, off_t);
+	size_t (*write)(File *, char *, size_t, off_t);
+	int (*ioctl)(File *, unsigned long, uintptr_t);
+	int (*readdir)(File *, DirEnt *, off_t);
+	int (*open)(File *);
+	int (*flush)(File *);
+	int (*release)(File *);
+	void (*mmap)(File *, void *, size_t, off_t);
+};
+
+/* Structure for a Directory Entry */
+struct DirEntry {
+	DirEntry *next;
+	Inode *inode, *mnt;
+	uint32_t hash;
+	char name[NAME_MAX];
+	Spinlock lock;
+	SuperBlock *super;
+	refcount_t usage;
+	DirEntry *lnext; /* Next directory entry in global list */
+};
+
+/* Structure for a Page in a block cache */
+struct Page {
+	page_t frame;
+	off_t offset;
+	refcount_t usage;
+};
+struct PageCache {
+        Page *page;
+        PageCache *next;
+};
+
+/* Custody Chains */
+struct Custody {
+	Custody *prev, *next;
+	CustodyChain *chain;
+	DirEntry *entry;
+};
+struct CustodyChain {
+	Custody *start, *end;
+	size_t size;
+	Spinlock lock;
+};
+
+/* File System Namespace */
+typedef struct FileSystem {
+	Inode *cwd;
+	CustodyChain cwdCustody;
+	Inode *root;
+	refcount_t usage;
+} FileSystem;
+
+/* Files Namespace */
+typedef struct Files {
+	File *fd[NFILES];
+	refcount_t usage;
+} Files;
+
+void init_vfs(void);
+void register_fstype(FileSystemType *fstype);
+Inode *lookup(const char *name, CustodyChain *chain);
+
+int open(const char *name, int flags, ...); /* mode_t mode */
+int close(int fd);
+size_t read(int fd, void *buf, size_t count);
+size_t write(int fd, void *buf, size_t count);
+int ioctl(int fd, unsigned long request, ...);
+off_t lseek(int fd, off_t offset, int whence);
+int stat(const char *pathname, struct stat *statbuf);
+size_t getdents(int fd, void *buf, size_t count);
+int mkdir(const char *pathname, mode_t mode);
+int rmdir(const char *pathname);
+int mknod(const char *pathname, mode_t mode, dev_t dev);
+int rename(const char *oldpath, const char *newpath);
+int dup(int oldfd);
+int dup2(int oldfd, int newfd);
+int mount(const char *src, const char *target, const char *type,
+          unsigned long flags, void *data);
+int chdir(const char *path);
+int chroot(const char *path);
+char *getcwd(char *buf, size_t size);
+
+void init_custody_chain(CustodyChain *chain);
+CustodyChain *create_custody_chain(void);
+void clean_custody_chain(CustodyChain *chain);
+void destroy_custody_chain(CustodyChain *chain);
+void copy_custody_chain(CustodyChain *chain, CustodyChain *newchain);
+void add_custody(CustodyChain *chain, DirEntry *entry);
+DirEntry *remove_custody(CustodyChain *chain);
+char *custody_path(CustodyChain *chain, char *buf, size_t size);
+
+File *file_get(File *file);
+void file_put(File *file);
+size_t file_read(File *file, char *buf, size_t size);
+size_t file_write(File *file, char *buf, size_t size);
+int file_ioctl(File *file, unsigned long reqeust, uintptr_t argp);
+int file_readdir(File *file, DirEnt *dent, off_t index);
+int file_open(File *file);
+void file_mmap(File *file, void *buf, size_t len, off_t offset);
+
+#endif