fat_ent.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #pragma once
  2. #include "fat32.h"
  3. #include <filesystem/VFS/VFS.h>
  4. #include <stdbool.h>
  5. /**
  6. * @brief 请求分配指定数量的簇
  7. *
  8. * @param inode 要分配簇的inode
  9. * @param clusters 返回的被分配的簇的簇号结构体
  10. * @param num_clusters 要分配的簇的数量
  11. * @return int 错误码
  12. */
  13. int fat32_alloc_clusters(struct vfs_index_node_t *inode, uint32_t *clusters, int32_t num_clusters);
  14. /**
  15. * @brief 释放从属于inode的,从cluster开始的所有簇
  16. *
  17. * @param inode 指定的文件的inode
  18. * @param cluster 指定簇
  19. * @return int 错误码
  20. */
  21. int fat32_free_clusters(struct vfs_index_node_t *inode, int32_t cluster);
  22. /**
  23. * @brief 读取指定簇的FAT表项
  24. *
  25. * @param fsbi fat32超级块私有信息结构体
  26. * @param cluster 指定簇
  27. * @return uint32_t 下一个簇的簇号
  28. */
  29. uint32_t fat32_read_FAT_entry(fat32_sb_info_t *fsbi, uint32_t cluster);
  30. /**
  31. * @brief 写入指定簇的FAT表项
  32. *
  33. * @param fsbi fat32超级块私有信息结构体
  34. * @param cluster 指定簇
  35. * @param value 要写入该fat表项的值
  36. * @return uint32_t errcode
  37. */
  38. uint32_t fat32_write_FAT_entry(fat32_sb_info_t *fsbi, uint32_t cluster, uint32_t value);
  39. /**
  40. * @brief 在父亲inode的目录项簇中,寻找连续num个空的目录项
  41. *
  42. * @param parent_inode 父inode
  43. * @param num 请求的目录项数量
  44. * @param mode 操作模式
  45. * @param res_sector 返回信息:缓冲区对应的扇区号
  46. * @param res_cluster 返回信息:缓冲区对应的簇号
  47. * @param res_data_buf_base 返回信息:缓冲区的内存基地址(记得要释放缓冲区内存!!!!)
  48. * @return struct fat32_Directory_t* 符合要求的entry的指针(指向地址高处的空目录项,也就是说,有连续num个≤这个指针的空目录项)
  49. */
  50. struct fat32_Directory_t *fat32_find_empty_dentry(struct vfs_index_node_t *parent_inode, uint32_t num, uint32_t mode, uint32_t *res_sector, uint64_t *res_cluster, uint64_t *res_data_buf_base);
  51. /**
  52. * @brief 检查文件名是否合法
  53. *
  54. * @param name 文件名
  55. * @param namelen 文件名长度
  56. * @param reserved 保留字段
  57. * @return int 合法:0, 其他:错误码
  58. */
  59. int fat32_check_name_available(const char *name, int namelen, int8_t reserved);
  60. /**
  61. * @brief 检查字符在短目录项中是否合法
  62. *
  63. * @param c 给定字符
  64. * @param index 字符在文件名中处于第几位
  65. * @return true 合法
  66. * @return false 不合法
  67. */
  68. bool fat32_check_char_available_in_short_name(const char c, int index);
  69. /**
  70. * @brief 填充短目录项的函数
  71. *
  72. * @param dEntry 目标dentry
  73. * @param target 目标dentry对应的短目录项
  74. * @param cluster 短目录项对应的文件/文件夹起始簇
  75. */
  76. void fat32_fill_shortname(struct vfs_dir_entry_t *dEntry, struct fat32_Directory_t *target, uint32_t cluster);
  77. /**
  78. * @brief 填充长目录项的函数
  79. *
  80. * @param dEntry 目标dentry
  81. * @param target 起始长目录项
  82. * @param checksum 短目录项的校验和
  83. * @param cnt_longname 总的长目录项的个数
  84. */
  85. void fat32_fill_longname(struct vfs_dir_entry_t *dEntry, struct fat32_LongDirectory_t *target, uint8_t checksum, uint32_t cnt_longname);