feat: symlink(2) and realpathat syscall
[lunaix-os.git] / lunaix-os / includes / lunaix / fs.h
index fce04ca1dfbb1dbd86fbf40c241512be686d6887..bc22fd537e371c13f1c7c32e39f9256726a3c26b 100644 (file)
@@ -14,6 +14,7 @@
 #define VFS_INODE_TYPE_DIR 0x1
 #define VFS_INODE_TYPE_FILE 0x2
 #define VFS_INODE_TYPE_DEVICE 0x4
+#define VFS_INODE_TYPE_SYMLINK 0x8
 
 #define VFS_ENOFS -2
 #define VFS_EBADMNT -3
 #define VFS_WALK_MKPARENT 0x1
 #define VFS_WALK_FSRELATIVE 0x2
 #define VFS_WALK_PARENT 0x4
+#define VFS_WALK_NOFOLLOW 0x4
 
 #define VFS_IOBUF_FDIRTY 0x1
 
+#define FSTYPE_ROFS 0x1
+
 #define VFS_VALID_CHAR(chr)                                                    \
     ('A' <= (chr) && (chr) <= 'Z' || 'a' <= (chr) && (chr) <= 'z' ||           \
      '0' <= (chr) && (chr) <= '9' || (chr) == '.' || (chr) == '_' ||           \
      (chr) == '-')
 
+extern struct hstr vfs_ddot;
+extern struct hstr vfs_dot;
+
 struct v_dnode;
 
 struct filesystem
 {
     struct hlist_node fs_list;
     struct hstr fs_name;
+    uint32_t types;
     int (*mount)(struct v_superblock* vsb, struct v_dnode* mount_point);
     int (*unmount)(struct v_superblock* vsb);
 };
@@ -83,6 +91,7 @@ struct v_file_ops
 struct v_file
 {
     struct v_inode* inode;
+    struct v_dnode* dnode;
     struct llist_header* f_list;
     uint32_t f_pos;
     void* data; // 允许底层FS绑定他的一些专有数据
@@ -93,6 +102,7 @@ struct v_fd
 {
     struct v_file* file;
     int pos;
+    int flags;
 };
 
 struct v_inode
@@ -101,17 +111,23 @@ struct v_inode
     uint32_t ctime;
     uint32_t mtime;
     uint64_t lb_addr;
-    uint32_t ref_count;
+    uint32_t open_count;
+    uint32_t link_count;
     uint32_t lb_usage;
     uint32_t fsize;
     void* data; // 允许底层FS绑定他的一些专有数据
     struct
     {
-        int (*create)(struct v_inode* inode, struct v_file* file);
-        int (*open)(struct v_inode* inode, struct v_file* file);
-        int (*sync)(struct v_inode* inode);
-        int (*mkdir)(struct v_inode* inode, struct v_dnode* dnode);
-        int (*dir_lookup)(struct v_inode* inode, struct v_dnode* dnode);
+        int (*create)(struct v_inode* this, struct v_file* file);
+        int (*open)(struct v_inode* this, struct v_file* file);
+        int (*sync)(struct v_inode* this);
+        int (*mkdir)(struct v_inode* this, struct v_dnode* dnode);
+        int (*rmdir)(struct v_inode* this);
+        int (*unlink)(struct v_inode* this);
+        int (*link)(struct v_inode* this, struct v_dnode* new_name);
+        int (*read_symlink)(struct v_inode* this, const char** path_out);
+        int (*symlink)(struct v_inode* this, const char* target);
+        int (*dir_lookup)(struct v_inode* this, struct v_dnode* dnode);
     } ops;
 };