summaryrefslogtreecommitdiff
path: root/kernel/fs/vfs.h
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-10-30 22:12:14 +0100
committerAnton Kling <anton@kling.gg>2023-10-31 00:18:38 +0100
commit8a9208612eec8ddae4c418485d848ecfa0613699 (patch)
tree2f4b29200c2f0c19ae52f45bdb9b38a41b356e30 /kernel/fs/vfs.h
parentca76600acc8bf7a02346efa5bd8f17072210ec01 (diff)
Meta: Move kernel and userland to their own folders.
This is to allow both the kernel and the userland to share certain header files and to make the folder structure a bit more clear.
Diffstat (limited to 'kernel/fs/vfs.h')
-rw-r--r--kernel/fs/vfs.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h
new file mode 100644
index 0000000..f8a4b19
--- /dev/null
+++ b/kernel/fs/vfs.h
@@ -0,0 +1,100 @@
+typedef struct vfs_fd vfs_fd_t;
+typedef struct vfs_inode vfs_inode_t;
+typedef struct vfs_vm_object vfs_vm_object_t;
+typedef struct vfs_mounts vfs_mounts_t;
+#ifndef VFS_H
+#define VFS_H
+#include <limits.h>
+#include <sched/scheduler.h>
+#include <socket.h>
+#include <stddef.h>
+#include <stdint.h>
+
+// FIXME: Is there some standard value for this?
+#define O_NONBLOCK (1 << 0)
+#define O_READ (1 << 1)
+#define O_WRITE (1 << 2)
+#define O_CREAT (1 << 3)
+#define O_RDONLY O_READ
+#define O_WRONLY O_WRITE
+#define O_RDWR (O_WRITE | O_READ)
+
+#define FS_TYPE_FILE 0
+#define FS_TYPE_UNIX_SOCKET 1
+#define FS_TYPE_CHAR_DEVICE 2
+#define FS_TYPE_BLOCK_DEVICE 3
+#define FS_TYPE_DIRECTORY 4
+#define FS_TYPE_LINK 7
+
+struct vfs_vm_object {
+ void *virtual_object;
+ void **object;
+ uint64_t size;
+};
+
+struct vfs_mounts {
+ char *path;
+ vfs_inode_t *local_root;
+};
+
+struct dirent {
+ unsigned int d_ino; // File serial number.
+ char d_name[PATH_MAX]; // Filename string of entry.
+};
+
+struct vfs_fd {
+ size_t offset;
+ int flags;
+ int mode;
+ int reference_count; // Number of usages of this file descriptor,
+ // once it reaches zero then the contents can
+ // be freed.
+ vfs_inode_t *inode;
+};
+
+struct vfs_inode {
+ int inode_num;
+ int type;
+ uint8_t has_data;
+ uint8_t can_write;
+ uint8_t is_open;
+ void *internal_object;
+ uint64_t file_size;
+ vfs_inode_t *(*open)(const char *path);
+ int (*create_file)(const char *path, int mode);
+ int (*read)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd);
+ int (*write)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd);
+ void (*close)(vfs_fd_t *fd);
+ int (*create_directory)(const char *path, int mode);
+ vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset,
+ vfs_fd_t *fd);
+ int (*truncate)(vfs_fd_t *fd, size_t length);
+};
+
+int vfs_close(int fd);
+vfs_fd_t *get_vfs_fd(int fd);
+int vfs_open(const char *file, int flags, int mode);
+void vfs_mount(char *path, vfs_inode_t *local_root);
+int vfs_pwrite(int fd, void *buf, uint64_t count, uint64_t offset);
+int raw_vfs_pwrite(vfs_fd_t *vfs_fd, void *buf, uint64_t count,
+ uint64_t offset);
+int vfs_pread(int fd, void *buf, uint64_t count, uint64_t offset);
+vfs_vm_object_t *vfs_get_vm_object(int fd, uint64_t length, uint64_t offset);
+int vfs_dup2(int org_fd, int new_fd);
+vfs_inode_t *vfs_internal_open(const char *file);
+int vfs_mkdir(const char *path, int mode);
+int vfs_create_fd(int flags, int mode, vfs_inode_t *inode, vfs_fd_t **fd);
+int vfs_ftruncate(int fd, size_t length);
+vfs_inode_t *vfs_create_inode(
+ int inode_num, int type, uint8_t has_data, uint8_t can_write,
+ uint8_t is_open, void *internal_object, uint64_t file_size,
+ vfs_inode_t *(*open)(const char *path),
+ int (*create_file)(const char *path, int mode),
+ int (*read)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd),
+ int (*write)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd),
+ void (*close)(vfs_fd_t *fd),
+ int (*create_directory)(const char *path, int mode),
+ vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset,
+ vfs_fd_t *fd),
+ int (*truncate)(vfs_fd_t *fd, size_t length));
+#endif