1 /* 2 libparted 3 Copyright (C) 1998-2001, 2007 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef FAT_H_INCLUDED 20 #define FAT_H_INCLUDED 21 22 #include <parted/parted.h> 23 #include <parted/endian.h> 24 #include <parted/debug.h> 25 26 #if ENABLE_NLS 27 # include <libintl.h> 28 # define _(String) dgettext (PACKAGE, String) 29 #else 30 # define _(String) (String) 31 #endif /* ENABLE_NLS */ 32 33 #include <stdlib.h> 34 #include <sys/types.h> 35 #include <sys/stat.h> 36 #include <fcntl.h> 37 38 #define BUFFER_SIZE 1024 /* buffer size in sectors (512 bytes) */ 39 40 typedef uint32_t FatCluster; 41 typedef int32_t FatFragment; 42 43 enum _FatType { 44 FAT_TYPE_FAT12, 45 FAT_TYPE_FAT16, 46 FAT_TYPE_FAT32 47 }; 48 typedef enum _FatType FatType; 49 50 typedef struct _FatSpecific FatSpecific; 51 typedef struct _FatDirEntry FatDirEntry; 52 53 /* FIXME: YUCKY */ 54 #include "table.h" 55 #include "bootsector.h" 56 #include "context.h" 57 #include "fatio.h" 58 #include "traverse.h" 59 #include "calc.h" 60 #include "count.h" 61 #include "clstdup.h" 62 63 #ifdef __sun 64 #define __attribute__(X) /*nothing*/ 65 #endif /* __sun */ 66 67 #ifdef __sun 68 #pragma pack(1) 69 #endif 70 struct __attribute__ ((packed)) _FatDirEntry { 71 char name[8]; 72 uint8_t extension[3]; 73 uint8_t attributes; 74 uint8_t is_upper_case_name; 75 uint8_t creation_time_low; /* milliseconds */ 76 uint16_t creation_time_high; 77 uint16_t creation_date; 78 uint16_t access_date; 79 uint16_t first_cluster_high; /* for FAT32 */ 80 uint16_t time; 81 uint16_t date; 82 uint16_t first_cluster; 83 uint32_t length; 84 }; 85 #ifdef __sun 86 #pragma pack() 87 #endif 88 89 struct _FatSpecific { 90 FatBootSector boot_sector; /* structure of boot sector */ 91 FatInfoSector info_sector; /* fat32-only information sector */ 92 93 int logical_sector_size; /* illogical sector size :-) */ 94 PedSector sector_count; 95 96 int sectors_per_track; /* BIOS CHS stuff (S) */ 97 int heads; /* BIOS CHS stuff (H) */ 98 99 int cluster_size; 100 PedSector cluster_sectors; 101 FatCluster cluster_count; 102 int dir_entries_per_cluster; 103 104 FatType fat_type; 105 int fat_table_count; 106 PedSector fat_sectors; 107 108 uint32_t serial_number; 109 110 PedSector info_sector_offset; /* FAT32 only */ 111 PedSector fat_offset; 112 PedSector root_dir_offset; /* non-FAT32 */ 113 PedSector cluster_offset; 114 PedSector boot_sector_backup_offset; 115 116 FatCluster root_cluster; /* FAT32 only */ 117 int root_dir_entry_count; /* non-FAT32 */ 118 PedSector root_dir_sector_count; /* non-FAT32 */ 119 FatCluster total_dir_clusters; 120 121 FatTable* fat; 122 FatClusterInfo* cluster_info; 123 124 PedSector buffer_sectors; 125 char* buffer; 126 127 int frag_size; 128 PedSector frag_sectors; 129 FatFragment frag_count; 130 FatFragment buffer_frags; 131 FatFragment cluster_frags; 132 }; 133 134 #define FAT_SPECIFIC(fs) ((FatSpecific*) fs->type_specific) 135 136 #define FAT_ROOT 0 137 138 #define DELETED_FLAG 0xe5 139 140 #define READONLY_ATTR 0x01 141 #define HIDDEN_ATTR 0x02 142 #define SYSTEM_ATTR 0x04 143 #define VOLUME_LABEL_ATTR 0x08 144 #define VFAT_ATTR 0x0f 145 #define DIRECTORY_ATTR 0x10 146 #define ARCH_ATTR 0x20 147 148 #define MAX_FAT12_CLUSTERS 4086 149 #define MAX_FAT16_CLUSTERS 65526 150 #define MAX_FAT32_CLUSTERS 2000000 151 152 #define FAT_ROOT_DIR_ENTRY_COUNT 512 153 154 extern PedFileSystemType fat16_type; 155 extern PedFileSystemType fat32_type; 156 157 extern void fat_print (const PedFileSystem* fs); 158 159 extern PedFileSystem* fat_alloc (const PedGeometry* geom); 160 extern void fat_free (PedFileSystem* fs); 161 extern int fat_alloc_buffers (PedFileSystem* fs); 162 extern void fat_free_buffers (PedFileSystem* fs); 163 164 extern int fat_resize (PedFileSystem* fs, PedGeometry* geom, PedTimer* timer); 165 166 extern int fat_set_frag_sectors (PedFileSystem* fs, PedSector frag_sectors); 167 168 #endif /* FAT_H_INCLUDED */