📄 fat_file.h
字号:
/* * fat_file.h * * Constants/data structures/prototypes for operations on "fat-file" * * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia * Author: Eugeny S. Mints <Eugeny.Mints@oktet.ru> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * @(#) $Id: fat_file.h,v 1.2.2.1 2003/09/04 18:47:02 joel Exp $ */#ifndef __DOSFS_FAT_FILE_H__#define __DOSFS_FAT_FILE_H__#ifdef __cplusplusextern "C" {#endif#include <rtems.h>#include <rtems/libio_.h>#include <time.h>/* "fat-file" representation * * the idea is: fat-file is nothing but a cluster chain, any open fat-file is * represented in system by fat-file descriptor and has well-known * file interface: * * fat_file_open() * fat_file_close() * fat_file_read() * fat_file_write() * * Such interface hides the architecture of fat-file and represents it like * linear file */ typedef rtems_filesystem_node_types_t fat_file_type_t;#define FAT_DIRECTORY RTEMS_FILESYSTEM_DIRECTORY#define FAT_FILE RTEMS_FILESYSTEM_MEMORY_FILEtypedef struct fat_file_map_s{ unsigned32 file_cln; unsigned32 disk_cln; unsigned32 last_cln;} fat_file_map_t;/* * descriptor of a fat-file * * To each particular clusters chain */typedef struct fat_file_fd_s{ Chain_Node link; /* * fat-file descriptors organized into hash; * collision lists are handled via link * field */ unsigned32 links_num; /* * the number of fat_file_open call on * this fat-file */ unsigned32 ino; /* inode, file serial number :)))) */ fat_file_type_t fat_file_type; unsigned32 size_limit; unsigned32 fat_file_size; /* length */ unsigned32 info_cln; unsigned32 cln; unsigned16 info_ofs; unsigned char first_char; unsigned8 flags; fat_file_map_t map; time_t mtime; } fat_file_fd_t;#define FAT_FILE_REMOVED 0x01#define FAT_FILE_IS_REMOVED(p)\ (((p)->flags & FAT_FILE_REMOVED) ? 1 : 0)/* ioctl macros */#define F_CLU_NUM 0x01/* * Each file and directory on a MSDOS volume is unique identified by it * location, i.e. location of it 32 Bytes Directory Entry Structure. We can * distinguish them by cluster number it locates on and offset inside this * cluster. But root directory on any volumes (FAT12/16/32) has no 32 Bytes * Directory Entry Structure corresponded to it. So we assume 32 Bytes * Directory Entry Structure of root directory locates at cluster 1 (invalid * cluaster number) and offset 0 */#define FAT_ROOTDIR_CLUSTER_NUM 0x01 #define FAT_FD_OF_ROOT_DIR(fat_fd) \ ((fat_fd->info_cln == FAT_ROOTDIR_CLUSTER_NUM ) && \ (fat_fd->info_ofs == 0))#define FAT_EOF 0x00/* fat_construct_key -- * Construct key for hash access: convert (cluster num, offset) to * (sector512 num, new offset) and than construct key as * key = (sector512 num) << 4 | (new offset) * * PARAMETERS: * cl - cluster number * ofs - offset inside cluster 'cl' * mt_entry - mount table entry * * RETURNS: * constructed key */static inline unsigned32 fat_construct_key( rtems_filesystem_mount_table_entry_t *mt_entry, unsigned32 cl, unsigned32 ofs){ return ( ((fat_cluster_num_to_sector512_num(mt_entry, cl) + (ofs >> FAT_SECTOR512_BITS)) << 4) + ((ofs >> 5) & (FAT_DIRENTRIES_PER_SEC512 - 1)) );}/* Prototypes for "fat-file" operations */int fat_file_open(rtems_filesystem_mount_table_entry_t *mt_entry, unsigned32 cln, unsigned32 ofs, fat_file_fd_t **fat_fd);intfat_file_reopen(fat_file_fd_t *fat_fd);int fat_file_close(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd);ssize_tfat_file_read(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd, unsigned32 start, unsigned32 count, char *buf);ssize_tfat_file_write(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd, unsigned32 start, unsigned32 count, const char *buf);intfat_file_extend(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd, unsigned32 new_length, unsigned32 *a_length);intfat_file_truncate(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd, unsigned32 new_length); intfat_file_datasync(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd); intfat_file_ioctl(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd, int cmd, ...);intfat_file_size(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd);voidfat_file_mark_removed(rtems_filesystem_mount_table_entry_t *mt_entry, fat_file_fd_t *fat_fd);#ifdef __cplusplus}#endif#endif /* __DOSFS_FAT_FILE_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -