vfs.h 3.4 KB

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