fat_initsupp.c
来自「A FAT filesystem library in C. Very easy」· C语言 代码 · 共 160 行
C
160 行
/* * FAT Initialization * * Copyright(C) 2001 * Camilo Alejandro Arboleda * * The contents of this file are distributed under the GNU General * Public License version 2. * * As a special exception, when this code is included in the RTEMS * operating system, linking other files with RTEMS objects including * this code does not cause the resulting executable application to * be covered by the GNU General Public License. This exception does * not however invalidate any other reasons why the executable file might * be covered by the GNU General Public License. */#include <sys/types.h> /* for mkdir */#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#include <assert.h>#include "fat.h"#include "mtd.h"#if defined(FAT_DEBUG)#include <stdio.h>#endifrtems_filesystem_limits_and_options_t FAT_LIMITS_AND_OPTIONS = { 1, /* link_max */ 1, /* max_canon */ 1, /* max_input */ FAT_NAME_MAX, /* name_max */ 63, /* path_max */ 1, /* pipe_buf */ 1, /* posix_async_io */ 1, /* posix_chown_restrictions */ 1, /* posix_no_trunc */ 1, /* posix_prio_io */ 1, /* posix_sync_io */ 1 /* posix_vdisable */};extern FAT_jnode_t *fat_root_dir;extern FAT_jnode_t *fat_tail;/* * Reads FAT MBR (master boot record) */voidread_mbr(fat_geom_t *fat_geom, int fd){ unsigned char buffer[512]; read(fd, buffer, 512); /* MBR */ fat_geom->bytes_per_sect = * (unsigned short *) (buffer + 11); fat_geom->cluster_size = * (buffer + 13); fat_geom->reserved_sect = * (unsigned short *) (buffer + 14); fat_geom->total_FATs = * (buffer + 16); fat_geom->root_dir_entries = * (unsigned short *) (buffer + 17); fat_geom->logical_sectors = * (unsigned short *) (buffer + 19); fat_geom->mdb = * (buffer + 21); fat_geom->sectors_per_fat = * (unsigned short *) (buffer + 22); fat_geom->sectors_per_track = * (unsigned short *) (buffer + 24); fat_geom->head = * (unsigned short *) (buffer + 26); fat_geom->hidden_sectors = * (unsigned short *) (buffer + 28); fat_geom->root_dir_offset = (fat_geom->total_FATs * fat_geom->sectors_per_fat + 1) * fat_geom->bytes_per_sect; fat_geom->data_offset = fat_geom->root_dir_offset + (fat_geom->root_dir_entries * 32); fat_geom->data_size = fat_geom->logical_sectors * fat_geom->bytes_per_sect - fat_geom->data_offset; fat_geom->cluster_size *= fat_geom->bytes_per_sect; /* cluster size in bytes */ fat_geom->first_cluster_offset = fat_geom->data_offset - (fat_geom->cluster_size * 2); fat_geom->fat_entries = fat_geom->data_size / fat_geom->cluster_size; fat_geom->type = 1; /* By default, FAT12 */#ifdef FAT_USE_DoC /* This is a hack used to get partition type (FAT12/FAT16/FAT32) * A real *standard* ioctl should be put here to get this info */ ioctl(fd,PARTGETTYPE,buffer); fat_geom->type = *buffer;#endif}/* * FAT_initialize */intFAT_initialize(rtems_filesystem_mount_table_entry_t *mt_entry){ FAT_jnode_t *node; fat_geom_t *geom; rtems_filesystem_operations_table *op_table = &FAT_ops; rtems_filesystem_file_handlers_r *root_handlers = &FAT_directory_handlers; int fd; unsigned status; /* Open hard disk device */ if (!mt_entry->dev) return -1; fd = open(mt_entry->dev,O_RDWR); if (fd <= 0) return -1; /* Read FAT_Geometry */ geom = calloc(1,sizeof(fat_geom_t)); if (!geom) return -1; read_mbr(geom,fd); geom->fd = fd; status = rtems_semaphore_create(rtems_build_name('F','D','S','0'),1, RTEMS_BINARY_SEMAPHORE, RTEMS_PRIORITY,&(geom->mutex_id)); if (status != RTEMS_SUCCESSFUL) { free(geom); return -1; } status = rtems_semaphore_create(rtems_build_name('R','W','M','T'),1, RTEMS_BINARY_SEMAPHORE, RTEMS_PRIORITY,&(geom->rw_mutex_id)); if (status != RTEMS_SUCCESSFUL) { free(geom); return -1; } node = calloc(1,sizeof(FAT_jnode_t)); if (!node) { free(geom); return -1; } mt_entry->mt_fs_root.handlers = root_handlers; mt_entry->mt_fs_root.ops = op_table; mt_entry->mt_fs_root.node_access = node; mt_entry->mt_fs_root.mt_entry = mt_entry; mt_entry->pathconf_limits_and_options = FAT_LIMITS_AND_OPTIONS; mt_entry->fs_info = (void *) geom; node->st_ino = 0; /* root dir */ node->parent = NULL; node->type = FAT_DIRECTORY; node->offset = 0; node->reference = 1; node->attrib = 0x30; node->cache_offset = -1; node->geometry = geom; fat_root_dir = node; fat_tail = node; /* Init FAT_cache */ read_fat_block(0,geom); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?