41#define RTEMS_FATFS_POSIX_CACHE_SIZE 64
52 rtems_recursive_mutex vol_mutex;
56 char mount_path[ 256 ];
57 char current_dir[ 256 ];
75 bool posix_time_valid;
79int fatfs_diskio_register_device( uint8_t pdrv,
const char *device_path );
80void fatfs_diskio_unregister_device( uint8_t pdrv );
83static inline int rtems_fatfs_get_full_path(
85 const char *relative_path,
90 size_t mount_len = strlen( fs_info->mount_path );
91 size_t rel_len = strlen( relative_path );
93 if ( mount_len + rel_len >= path_size ) {
97 memcpy( full_path, fs_info->mount_path, mount_len );
98 memcpy( full_path + mount_len, relative_path, rel_len + 1 );
103static inline int rtems_fatfs_fresult_to_errno( FRESULT fr )
115 case FR_INVALID_NAME:
121 case FR_INVALID_OBJECT:
123 case FR_WRITE_PROTECTED:
125 case FR_INVALID_DRIVE:
127 case FR_NO_FILESYSTEM:
129 case FR_MKFS_ABORTED:
135 case FR_NOT_ENOUGH_CORE:
137 case FR_TOO_MANY_OPEN_FILES:
139 case FR_INVALID_PARAMETER:
146static inline void rtems_fatfs_unlock(
151 rtems_recursive_mutex_unlock( &fs_info->vol_mutex );
154static inline int rtems_fatfs_resolve_node_path(
163 rc = rtems_fatfs_get_full_path( fs_info, node->path, full_path, path_size );
164 if ( rc != 0 && mt_entry != NULL ) {
165 rtems_fatfs_unlock( mt_entry );
170static inline void rtems_fatfs_filinfo_to_stat(
175 const char *name = fno->fname;
176 ino_t inode_hash = 1;
178 memset( st, 0,
sizeof( *st ) );
180 while ( *name !=
'\0' ) {
181 inode_hash = ( inode_hash * 33 ) + (
unsigned char) *name;
184 inode_hash ^= fno->fsize ^ ( fno->fdate << 16 ) ^ fno->ftime;
186 st->st_ino = ( inode_hash != 0 ) ? inode_hash : 1;
188 st->st_size = (off_t) fno->fsize;
189 st->st_blksize = 512;
190 st->st_blocks = ( st->st_size + 511 ) / 512;
192 if ( fno->fdate != 0 || fno->ftime != 0 ) {
194 memset( &tm, 0,
sizeof( tm ) );
196 tm.tm_year = ( ( fno->fdate >> 9 ) & 0x7F ) + 80;
197 tm.tm_mon = ( ( fno->fdate >> 5 ) & 0x0F ) - 1;
198 tm.tm_mday = fno->fdate & 0x1F;
199 tm.tm_hour = ( fno->ftime >> 11 ) & 0x1F;
200 tm.tm_min = ( fno->ftime >> 5 ) & 0x3F;
201 tm.tm_sec = ( fno->ftime & 0x1F ) * 2;
203 st->st_mtime = mktime( &tm );
204 st->st_ctime = st->st_mtime;
205 st->st_atime = st->st_mtime;
208 if ( fno->fattrib & AM_DIR ) {
209 st->st_mode = S_IFDIR | 0755;
211 st->st_mode = S_IFREG | 0644;
214 if ( fno->fattrib & AM_RDO ) {
215 st->st_mode &= ~( S_IWUSR | S_IWGRP | S_IWOTH );
219static inline void rtems_fatfs_node_to_stat_basic(
224 rtems_fatfs_filinfo_to_stat( &node->info, st );
227static inline void rtems_fatfs_node_to_stat(
233 rtems_fatfs_filinfo_to_stat( &node->info, st );
235 if ( fs_info != NULL ) {
236 blksize_t cluster_size = fs_info->fatfs.csize * 512;
237 st->st_blksize = cluster_size;
238 blkcnt_t clusters_used = ( st->st_size + cluster_size - 1 ) / cluster_size;
239 st->st_blocks = clusters_used * fs_info->fatfs.csize;
242 if ( node->posix_time_valid ) {
243 st->st_mtime = node->posix_mtime;
244 st->st_ctime = node->posix_ctime;
245 st->st_atime = node->posix_mtime;
246 }
else if ( fs_info != NULL ) {
247 for (
int i = 0; i < RTEMS_FATFS_POSIX_CACHE_SIZE; i++ ) {
248 if ( fs_info->posix_cache[ i ].valid &&
249 strcmp( fs_info->posix_cache[ i ].path, node->path ) == 0 ) {
250 st->st_mtime = fs_info->posix_cache[ i ].mtime;
251 st->st_ctime = fs_info->posix_cache[ i ].ctime;
252 st->st_atime = fs_info->posix_cache[ i ].mtime;
259static inline void rtems_fatfs_lock(
264 rtems_recursive_mutex_lock( &fs_info->vol_mutex );
277int rtems_fatfs_mknod(
285int rtems_fatfs_rmnod(
290int rtems_fatfs_rename(
294 const char *new_name,
298int rtems_fatfs_utimens(
300 struct timespec
times[ 2 ]
303int rtems_fatfs_statvfs(
308bool rtems_fatfs_are_nodes_equal(
318ssize_t rtems_fatfs_file_read(
rtems_libio_t *iop,
void *buffer,
size_t count );
320ssize_t rtems_fatfs_file_write(
326off_t rtems_fatfs_file_lseek(
rtems_libio_t *iop, off_t offset,
int whence );
328int rtems_fatfs_file_fstat(
333int rtems_fatfs_file_ftruncate(
rtems_libio_t *iop, off_t length );
338ssize_t rtems_fatfs_dir_read(
rtems_libio_t *iop,
void *buffer,
size_t count );
340int rtems_fatfs_dir_fstat(
345int rtems_fatfs_opendir(
354int rtems_fatfs_openfile(
clock_t times(struct tms *ptms)
Definition: __times.c:97
Block Device Disk Management API.
int rtems_fatfs_initialize(rtems_filesystem_mount_table_entry_t *mt_entry, const void *data)
Initialize FatFS filesystem.
Definition: rtems-fatfs-init.c:150
#define rtems_set_errno_and_return_minus_one(_error)
Definition: seterr.h:67
This header file defines macros to set errno and return minus one.
File system node operations table.
Definition: libio.h:1008
File system operations table.
Definition: libio.h:475
Definition: rtems-fatfs.h:35
Description of a disk device (logical and physical disks).
Definition: diskdevs.h:177
Definition: rtems-fatfs.h:50
Definition: rtems-fatfs.h:62
Definition: rtems-fatfs.h:43
Path evaluation context.
Definition: libio.h:105
File system location.
Definition: fs.h:72
Mount table entry.
Definition: libio.h:1661
An open file data structure.
Definition: libio.h:1325