vfs.hpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. namespace fs {
  9. using ino_t = size_t;
  10. using blksize_t = size_t;
  11. using blkcnt_t = size_t;
  12. class vfs;
  13. union inode_flags {
  14. uint32_t v;
  15. struct {
  16. uint32_t file : 1;
  17. uint32_t directory : 1;
  18. uint32_t mount_point : 1;
  19. uint32_t special_node : 1;
  20. } in;
  21. };
  22. struct inode {
  23. inode_flags flags;
  24. uint32_t perm;
  25. void* impl;
  26. ino_t ino;
  27. vfs* fs;
  28. };
  29. struct dirent {
  30. char name[128];
  31. uint32_t ino;
  32. };
  33. union node_t {
  34. uint32_t v;
  35. struct {
  36. uint32_t major : 16;
  37. uint32_t minor : 16;
  38. } in;
  39. };
  40. struct special_node;
  41. typedef size_t (*special_node_read)(special_node* sn, char* buf, size_t buf_size, size_t offset, size_t n);
  42. typedef size_t (*special_node_write)(special_node* sn, const char* buf, size_t offset, size_t n);
  43. struct special_node_ops {
  44. special_node_read read;
  45. special_node_write write;
  46. };
  47. struct special_node {
  48. special_node_ops ops;
  49. uint32_t data1;
  50. uint32_t data2;
  51. };
  52. struct stat {
  53. ino_t st_ino;
  54. node_t st_rdev;
  55. blksize_t st_blksize;
  56. blkcnt_t st_blocks;
  57. };
  58. class vfs {
  59. public:
  60. vfs() = default;
  61. vfs(const vfs&) = delete;
  62. vfs& operator=(const vfs&) = delete;
  63. vfs(vfs&&) = delete;
  64. vfs& operator=(vfs&&) = delete;
  65. virtual size_t inode_read(inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  66. virtual size_t inode_write(inode* file, const char* buf, size_t offset, size_t n);
  67. virtual int inode_readdir(inode* dir, dirent* entry, size_t i);
  68. virtual inode* inode_findinode(inode* dir, const char* filename);
  69. virtual int inode_mkfile(inode* dir, const char* filename);
  70. virtual int inode_mknode(inode* dir, const char* filename, union node_t sn);
  71. virtual int inode_rmfile(inode* dir, const char* filename);
  72. virtual int inode_mkdir(inode* dir, const char* dirname);
  73. virtual int inode_stat(inode* dir, stat* stat, const char* dirname);
  74. };
  75. extern struct inode* fs_root;
  76. void register_special_block(uint16_t major,
  77. uint16_t minor,
  78. special_node_read read,
  79. special_node_write write,
  80. uint32_t data1,
  81. uint32_t data2);
  82. size_t vfs_read(inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  83. size_t vfs_write(inode* file, const char* buf, size_t offset, size_t n);
  84. int vfs_readdir(inode* dir, dirent* entry, size_t i);
  85. inode* vfs_findinode(inode* dir, const char* filename);
  86. int vfs_mkfile(inode* dir, const char* filename);
  87. int vfs_mknode(inode* dir, const char* filename, node_t sn);
  88. int vfs_rmfile(inode* dir, const char* filename);
  89. int vfs_mkdir(inode* dir, const char* dirname);
  90. // @return pointer to the inode if found, nullptr if not
  91. struct inode* vfs_open(const char* path);
  92. // @return GB_OK if succeed, GB_FAILED if failed and set errno
  93. int vfs_stat(struct stat* stat, const char* path);
  94. } // namespace fs
  95. extern "C" void init_vfs(void);