vfs.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 special_node;
  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 special_node 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)(char* buf, size_t buf_size, size_t offset, size_t n);
  28. typedef size_t (*special_node_write)(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 special_node {
  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 stat {
  79. ino_t st_ino;
  80. union special_node st_rdev;
  81. blksize_t st_blksize;
  82. blkcnt_t st_blocks;
  83. };
  84. extern struct inode* fs_root;
  85. void init_vfs(void);
  86. void register_special_block(uint16_t major, uint16_t minor, special_node_read read, special_node_write write);
  87. size_t vfs_read(struct inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  88. size_t vfs_write(struct inode* file, const char* buf, size_t offset, size_t n);
  89. int vfs_readdir(struct inode* dir, struct dirent* entry, size_t i);
  90. struct inode* vfs_findinode(struct inode* dir, const char* filename);
  91. int vfs_mkfile(struct inode* dir, const char* filename);
  92. int vfs_mknode(struct inode* dir, const char* filename, union special_node sn);
  93. int vfs_rmfile(struct inode* dir, const char* filename);
  94. int vfs_mkdir(struct inode* dir, const char* dirname);
  95. // @return pointer to the inode if found, nullptr if not
  96. struct inode* vfs_open(const char* path);
  97. // @return GB_OK if succeed, GB_FAILED if failed and set errno
  98. int vfs_stat(struct stat* stat, const char* path);
  99. #ifdef __cplusplus
  100. }
  101. #endif