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);