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