vfs.hpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #pragma once
  2. #include <bits/alltypes.h>
  3. #include <stdint.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <types/path.hpp>
  7. #include <kernel/mem/paging.hpp>
  8. #include <kernel/vfs/dentry.hpp>
  9. #include <kernel/vfs/file.hpp>
  10. #define NODE_MAJOR(node) (((node) >> 8) & 0xFFU)
  11. #define NODE_MINOR(node) ((node) & 0xFFU)
  12. namespace fs {
  13. constexpr dev_t make_device(uint32_t major, uint32_t minor) {
  14. return ((major << 8) & 0xFF00U) | (minor & 0xFFU);
  15. }
  16. // buf, buf_size, cnt
  17. using chrdev_read = std::function<ssize_t(char*, std::size_t, std::size_t)>;
  18. // buf, cnt
  19. using chrdev_write = std::function<ssize_t(const char*, std::size_t)>;
  20. struct chrdev_ops {
  21. chrdev_read read;
  22. chrdev_write write;
  23. };
  24. struct PACKED user_dirent {
  25. ino_t d_ino; // inode number
  26. uint32_t d_off; // ignored
  27. uint16_t d_reclen; // length of this struct user_dirent
  28. char d_name[1]; // file name with a padding zero
  29. // uint8_t d_type; // file type, with offset of (d_reclen - 1)
  30. };
  31. struct PACKED user_dirent64 {
  32. ino64_t d_ino; // inode number
  33. uint64_t d_off; // implementation-defined field, ignored
  34. uint16_t d_reclen; // length of this struct user_dirent
  35. uint8_t d_type; // file type, with offset of (d_reclen - 1)
  36. char d_name[1]; // file name with a padding zero
  37. };
  38. struct fs_context {
  39. dentry_pointer root;
  40. };
  41. int register_char_device(dev_t node, const chrdev_ops& ops);
  42. ssize_t char_device_read(dev_t node, char* buf, size_t buf_size, size_t n);
  43. ssize_t char_device_write(dev_t node, const char* buf, size_t n);
  44. extern "C" int fs_creat(struct dentry* at, mode_t mode);
  45. extern "C" int fs_mkdir(struct dentry* at, mode_t mode);
  46. extern "C" int fs_mknod(struct dentry* at, mode_t mode, dev_t sn);
  47. extern "C" int fs_unlink(struct dentry* at);
  48. extern "C" int fs_symlink(struct dentry* at, const char* target);
  49. extern "C" int fs_statx(const struct rust_inode_handle* inode,
  50. struct statx* stat, unsigned int mask);
  51. extern "C" int fs_readlink(const struct rust_inode_handle* inode, char* buf,
  52. size_t buf_size);
  53. extern "C" int fs_truncate(const struct rust_inode_handle* file, size_t size);
  54. extern "C" size_t fs_read(const struct rust_inode_handle* file, char* buf,
  55. size_t buf_size, size_t offset, size_t n);
  56. extern "C" size_t fs_write(const struct rust_inode_handle* file,
  57. const char* buf, size_t offset, size_t n);
  58. using readdir_callback_fn = std::function<int(const char*, size_t, ino_t)>;
  59. extern "C" ssize_t fs_readdir(const struct rust_inode_handle* file,
  60. size_t offset,
  61. const readdir_callback_fn* callback);
  62. extern "C" int fs_mount(dentry* mnt, const char* source,
  63. const char* mount_point, const char* fstype,
  64. unsigned long flags, const void* data);
  65. extern "C" mode_t r_get_inode_mode(struct rust_inode_handle* inode);
  66. extern "C" size_t r_get_inode_size(struct rust_inode_handle* inode);
  67. extern "C" bool r_dentry_is_directory(struct dentry* dentry);
  68. extern "C" bool r_dentry_is_invalid(struct dentry* dentry);
  69. // borrow from dentry->inode
  70. extern "C" struct rust_inode_handle* r_dentry_get_inode(struct dentry* dentry);
  71. extern "C" struct dentry* r_get_root_dentry();
  72. #define current_open(...) \
  73. fs::open(current_process->fs_context, current_process->cwd, __VA_ARGS__)
  74. std::pair<dentry_pointer, int> open(const fs_context& context,
  75. const dentry_pointer& cwd,
  76. types::string_view path,
  77. bool follow_symlinks = true);
  78. } // namespace fs