summaryrefslogtreecommitdiff
path: root/kernel/fs/vfs.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-11-15 02:43:03 +0100
committerAnton Kling <anton@kling.gg>2023-11-15 02:55:54 +0100
commit6747f9407a061684c2fba837541c254f48bfcff0 (patch)
treef4d323bb6569ce755ae6425488c211387849a2f7 /kernel/fs/vfs.c
parent6fc8ef497409f83201aa92094d725407861881e7 (diff)
VFS: Add stat
Diffstat (limited to 'kernel/fs/vfs.c')
-rw-r--r--kernel/fs/vfs.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c
index 1353547..0911c95 100644
--- a/kernel/fs/vfs.c
+++ b/kernel/fs/vfs.c
@@ -23,17 +23,17 @@ vfs_fd_t *get_vfs_fd(int fd) {
}
vfs_inode_t *vfs_create_inode(
- int inode_num, int type, u8 has_data, u8 can_write,
- u8 is_open, void *internal_object, u64 file_size,
+ int inode_num, int type, u8 has_data, u8 can_write, u8 is_open,
+ void *internal_object, u64 file_size,
vfs_inode_t *(*open)(const char *path),
int (*create_file)(const char *path, int mode),
int (*read)(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd),
int (*write)(u8 *buffer, u64 offset, u64 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)(u64 length, u64 offset,
- vfs_fd_t *fd),
- int (*truncate)(vfs_fd_t *fd, size_t length)) {
+ vfs_vm_object_t *(*get_vm_object)(u64 length, u64 offset, vfs_fd_t *fd),
+ int (*truncate)(vfs_fd_t *fd, size_t length),
+ int (*stat)(vfs_fd_t *fd, struct stat *buf)) {
vfs_inode_t *r = kmalloc(sizeof(inode_t));
r->inode_num = inode_num;
r->type = type;
@@ -50,6 +50,7 @@ vfs_inode_t *vfs_create_inode(
r->create_directory = create_directory;
r->get_vm_object = get_vm_object;
r->truncate = truncate;
+ r->stat = stat;
return r;
}
@@ -96,7 +97,6 @@ int vfs_create_file(const char *file) {
}
// ext2_create_file("/etc/oscreated", 0);
assert(file_mount->local_root->create_file);
- kprintf("Creating a file\n");
return file_mount->local_root->create_file(file, 0);
}
@@ -160,6 +160,14 @@ char *vfs_resolve_path(const char *file, char *resolved_path) {
return final;
}
+int vfs_fstat(int fd, struct stat *buf) {
+ vfs_fd_t *fd_ptr = get_vfs_fd(fd);
+ if (!fd_ptr)
+ return -EBADF;
+ assert(fd_ptr->inode->stat);
+ return fd_ptr->inode->stat(fd_ptr, buf);
+}
+
int vfs_mkdir(const char *path, int mode) {
vfs_mounts_t *file_mount = 0;
int length = 0;