vfs.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #pragma once
  2. #include <types/types.h>
  3. #define INODE_FILE (1 << 0)
  4. #define INODE_DIR (1 << 1)
  5. #define INODE_MNT (1 << 2)
  6. #define INODE_NODE (1 << 3)
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. struct inode;
  11. union inode_flags;
  12. struct inode_ops;
  13. struct stat;
  14. struct dirent;
  15. union special_node;
  16. struct special_node_ops;
  17. typedef size_t (*inode_read)(struct inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  18. typedef size_t (*inode_write)(struct inode* file, const char* buf, size_t offset, size_t n);
  19. typedef int (*inode_readdir)(struct inode* dir, struct dirent* entry, size_t i);
  20. typedef struct inode* (*inode_findinode)(struct inode* dir, const char* filename);
  21. typedef int (*inode_mkfile)(struct inode* dir, const char* filename);
  22. typedef int (*inode_mknode)(struct inode* dir, const char* filename, union special_node sn);
  23. typedef int (*inode_rmfile)(struct inode* dir, const char* filename);
  24. typedef int (*inode_mkdir)(struct inode* dir, const char* dirname);
  25. typedef int (*inode_stat)(struct inode* dir, struct stat* stat, const char* dirname);
  26. typedef size_t (*special_node_read)(char* buf, size_t buf_size, size_t offset, size_t n);
  27. typedef size_t (*special_node_write)(const char* buf, size_t offset, size_t n);
  28. typedef uint32_t ino_t;
  29. typedef uint32_t blksize_t;
  30. typedef uint32_t blkcnt_t;
  31. union inode_flags {
  32. uint32_t v;
  33. struct {
  34. uint32_t file : 1;
  35. uint32_t directory : 1;
  36. uint32_t mount_point : 1;
  37. uint32_t special_node : 1;
  38. } in;
  39. };
  40. struct inode_ops {
  41. inode_read read;
  42. inode_write write;
  43. inode_readdir readdir;
  44. inode_findinode findinode;
  45. inode_mkfile mkfile;
  46. inode_mknode mknode;
  47. inode_rmfile rmfile;
  48. inode_mkdir mkdir;
  49. inode_stat stat;
  50. };
  51. struct fs_info {
  52. const struct inode_ops* ops;
  53. void* impl;
  54. };
  55. struct inode {
  56. union inode_flags flags;
  57. uint32_t perm;
  58. void* impl;
  59. ino_t ino;
  60. struct fs_info* fs;
  61. };
  62. struct dirent {
  63. char name[128];
  64. uint32_t ino;
  65. };
  66. union special_node {
  67. uint32_t v;
  68. struct {
  69. uint32_t major : 16;
  70. uint32_t minor : 16;
  71. } in;
  72. };
  73. struct special_node_ops {
  74. special_node_read read;
  75. special_node_write write;
  76. };
  77. struct stat {
  78. ino_t st_ino;
  79. union special_node st_rdev;
  80. blksize_t st_blksize;
  81. blkcnt_t st_blocks;
  82. };
  83. extern struct inode* fs_root;
  84. void init_vfs(void);
  85. void register_special_block(uint16_t major, uint16_t minor, special_node_read read, special_node_write write);
  86. size_t vfs_read(struct inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  87. size_t vfs_write(struct inode* file, const char* buf, size_t offset, size_t n);
  88. int vfs_readdir(struct inode* dir, struct dirent* entry, size_t i);
  89. struct inode* vfs_findinode(struct inode* dir, const char* filename);
  90. int vfs_mkfile(struct inode* dir, const char* filename);
  91. int vfs_mknode(struct inode* dir, const char* filename, union special_node sn);
  92. int vfs_rmfile(struct inode* dir, const char* filename);
  93. int vfs_mkdir(struct inode* dir, const char* dirname);
  94. // @return pointer to the inode if found, nullptr if not
  95. struct inode* vfs_open(const char* path);
  96. // @return GB_OK if succeed, GB_FAILED if failed and set errno
  97. int vfs_stat(struct stat* stat, const char* path);
  98. #ifdef __cplusplus
  99. }
  100. #endif