vfs.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #pragma once
  2. #include <types/types.h>
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. struct inode;
  7. struct inode_flags;
  8. struct inode_ops;
  9. struct stat;
  10. struct dirent;
  11. typedef size_t (*inode_read)(struct inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  12. typedef size_t (*inode_write)(struct inode* file, const char* buf, size_t offset, size_t n);
  13. typedef int (*inode_readdir)(struct inode* dir, struct dirent* entry, size_t i);
  14. typedef struct inode* (*inode_findinode)(struct inode* dir, const char* filename);
  15. typedef int (*inode_mkfile)(struct inode* dir, const char* filename);
  16. typedef int (*inode_rmfile)(struct inode* dir, const char* filename);
  17. typedef int (*inode_mkdir)(struct inode* dir, const char* dirname);
  18. typedef int (*inode_stat)(struct inode* dir, struct stat* stat, const char* dirname);
  19. typedef uint32_t ino_t;
  20. typedef uint32_t blksize_t;
  21. typedef uint32_t blkcnt_t;
  22. struct inode_flags {
  23. uint32_t file : 1;
  24. uint32_t directory : 1;
  25. uint32_t mount_point : 1;
  26. };
  27. struct inode_ops {
  28. inode_read read;
  29. inode_write write;
  30. inode_readdir readdir;
  31. inode_findinode findinode;
  32. inode_mkfile mkfile;
  33. inode_rmfile rmfile;
  34. inode_mkdir mkdir;
  35. inode_stat stat;
  36. };
  37. struct fs_info {
  38. const struct inode_ops* ops;
  39. void* impl;
  40. };
  41. struct inode {
  42. struct inode_flags flags;
  43. uint32_t perm;
  44. void* impl;
  45. ino_t ino;
  46. struct fs_info* fs;
  47. };
  48. struct stat {
  49. ino_t st_ino;
  50. blksize_t st_blksize;
  51. blkcnt_t st_blocks;
  52. };
  53. struct dirent {
  54. char name[128];
  55. uint32_t ino;
  56. };
  57. extern struct inode* fs_root;
  58. void init_vfs(void);
  59. size_t vfs_read(struct inode* file, char* buf, size_t buf_size, size_t offset, size_t n);
  60. size_t vfs_write(struct inode* file, const char* buf, size_t offset, size_t n);
  61. int vfs_readdir(struct inode* dir, struct dirent* entry, size_t i);
  62. struct inode* vfs_findinode(struct inode* dir, const char* filename);
  63. int vfs_mkfile(struct inode* dir, const char* filename);
  64. int vfs_rmfile(struct inode* dir, const char* filename);
  65. int vfs_mkdir(struct inode* dir, const char* dirname);
  66. // @return pointer to the inode if found, nullptr if not
  67. struct inode* vfs_open(const char* path);
  68. // @return GB_OK if succeed, GB_FAILED if failed and set errno
  69. int vfs_stat(struct stat* stat, const char* path);
  70. #ifdef __cplusplus
  71. }
  72. #endif