Changeset 033ef7d3 in mainline
- Timestamp:
- 2008-10-26T13:09:24Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0f57d0e
- Parents:
- 6ebaff9
- Location:
- uspace/srv/fs/fat
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat.h
r6ebaff9 r033ef7d3 116 116 } __attribute__ ((packed)) fat_bs_t; 117 117 118 #define FAT_ATTR_RDONLY (1 << 0)119 #define FAT_ATTR_VOLLABEL (1 << 3)120 #define FAT_ATTR_SUBDIR (1 << 4)121 122 typedef struct {123 uint8_t name[8];124 uint8_t ext[3];125 uint8_t attr;126 uint8_t reserved;127 uint8_t ctime_fine;128 uint16_t ctime;129 uint16_t cdate;130 uint16_t adate;131 union {132 uint16_t eaidx; /* FAT12/FAT16 */133 uint16_t firstc_hi; /* FAT32 */134 };135 uint16_t mtime;136 uint16_t mdate;137 union {138 uint16_t firstc; /* FAT12/FAT16 */139 uint16_t firstc_lo; /* FAT32 */140 };141 uint32_t size;142 } __attribute__ ((packed)) fat_dentry_t;143 144 118 typedef uint16_t fat_cluster_t; 145 119 -
uspace/srv/fs/fat/fat_dentry.c
r6ebaff9 r033ef7d3 36 36 */ 37 37 38 #include "fat_dentry.h" 39 40 #define FAT_PAD ' ' 41 42 #define FAT_DENTRY_UNUSED 0x00 43 #define FAT_DENTRY_E5_ESC 0x05 44 #define FAT_DENTRY_DOT 0x2e 45 #define FAT_DENTRY_ERASED 0xe5 46 47 void dentry_name_canonify(fat_dentry_t *d, char *buf) 48 { 49 int i; 50 51 for (i = 0; i < FAT_NAME_LEN; i++) { 52 if (d->name[i] == FAT_PAD) 53 break; 54 if (d->name[i] == FAT_DENTRY_E5_ESC) 55 *buf++ = 0xe5; 56 else 57 *buf++ = d->name[i]; 58 } 59 if (d->ext[0] != FAT_PAD) 60 *buf++ = '.'; 61 for (i = 0; i < FAT_EXT_LEN; i++) { 62 if (d->ext[i] == FAT_PAD) { 63 *buf = '\0'; 64 return; 65 } 66 if (d->ext[i] == FAT_DENTRY_E5_ESC) 67 *buf++ = 0xe5; 68 else 69 *buf++ = d->ext[i]; 70 } 71 *buf = '\0'; 72 } 73 74 fat_dentry_clsf_t fat_classify_dentry(fat_dentry_t *d) 75 { 76 if (d->attr & FAT_ATTR_VOLLABEL) { 77 /* volume label entry */ 78 return FAT_DENTRY_SKIP; 79 } 80 if (d->name[0] == FAT_DENTRY_ERASED) { 81 /* not-currently-used entry */ 82 return FAT_DENTRY_SKIP; 83 } 84 if (d->name[0] == FAT_DENTRY_UNUSED) { 85 /* never used entry */ 86 return FAT_DENTRY_LAST; 87 } 88 if (d->name[0] == FAT_DENTRY_DOT) { 89 /* 90 * Most likely '.' or '..'. 91 * It cannot occur in a regular file name. 92 */ 93 return FAT_DENTRY_SKIP; 94 } 95 return FAT_DENTRY_VALID; 96 } 38 97 39 98 /** -
uspace/srv/fs/fat/fat_dentry.h
r6ebaff9 r033ef7d3 34 34 #define FAT_FAT_DENTRY_H_ 35 35 36 #include <stdint.h> 37 38 #define FAT_NAME_LEN 8 39 #define FAT_EXT_LEN 3 40 41 #define FAT_ATTR_RDONLY (1 << 0) 42 #define FAT_ATTR_VOLLABEL (1 << 3) 43 #define FAT_ATTR_SUBDIR (1 << 4) 44 45 typedef enum { 46 FAT_DENTRY_SKIP, 47 FAT_DENTRY_LAST, 48 FAT_DENTRY_VALID 49 } fat_dentry_clsf_t; 50 51 typedef struct { 52 uint8_t name[8]; 53 uint8_t ext[3]; 54 uint8_t attr; 55 uint8_t reserved; 56 uint8_t ctime_fine; 57 uint16_t ctime; 58 uint16_t cdate; 59 uint16_t adate; 60 union { 61 uint16_t eaidx; /* FAT12/FAT16 */ 62 uint16_t firstc_hi; /* FAT32 */ 63 }; 64 uint16_t mtime; 65 uint16_t mdate; 66 union { 67 uint16_t firstc; /* FAT12/FAT16 */ 68 uint16_t firstc_lo; /* FAT32 */ 69 }; 70 uint32_t size; 71 } __attribute__ ((packed)) fat_dentry_t; 72 73 extern void dentry_name_canonify(fat_dentry_t *, char *); 74 extern fat_dentry_clsf_t fat_classify_dentry(fat_dentry_t *); 75 36 76 #endif 37 77 -
uspace/srv/fs/fat/fat_ops.c
r6ebaff9 r033ef7d3 37 37 38 38 #include "fat.h" 39 #include "fat_dentry.h" 40 #include "fat_fat.h" 39 41 #include "../../vfs/vfs.h" 40 42 #include <libfs.h> … … 62 64 static LIST_INITIALIZE(ffn_head); 63 65 64 #define FAT_NAME_LEN 865 #define FAT_EXT_LEN 366 67 #define FAT_PAD ' '68 69 #define FAT_DENTRY_UNUSED 0x0070 #define FAT_DENTRY_E5_ESC 0x0571 #define FAT_DENTRY_DOT 0x2e72 #define FAT_DENTRY_ERASED 0xe573 74 66 #define min(a, b) ((a) < (b) ? (a) : (b)) 75 76 static void dentry_name_canonify(fat_dentry_t *d, char *buf)77 {78 int i;79 80 for (i = 0; i < FAT_NAME_LEN; i++) {81 if (d->name[i] == FAT_PAD)82 break;83 if (d->name[i] == FAT_DENTRY_E5_ESC)84 *buf++ = 0xe5;85 else86 *buf++ = d->name[i];87 }88 if (d->ext[0] != FAT_PAD)89 *buf++ = '.';90 for (i = 0; i < FAT_EXT_LEN; i++) {91 if (d->ext[i] == FAT_PAD) {92 *buf = '\0';93 return;94 }95 if (d->ext[i] == FAT_DENTRY_E5_ESC)96 *buf++ = 0xe5;97 else98 *buf++ = d->ext[i];99 }100 *buf = '\0';101 }102 67 103 68 static int dev_phone = -1; /* FIXME */ … … 298 263 299 264 return bps; 300 }301 302 typedef enum {303 FAT_DENTRY_SKIP,304 FAT_DENTRY_LAST,305 FAT_DENTRY_VALID306 } fat_dentry_clsf_t;307 308 static fat_dentry_clsf_t fat_classify_dentry(fat_dentry_t *d)309 {310 if (d->attr & FAT_ATTR_VOLLABEL) {311 /* volume label entry */312 return FAT_DENTRY_SKIP;313 }314 if (d->name[0] == FAT_DENTRY_ERASED) {315 /* not-currently-used entry */316 return FAT_DENTRY_SKIP;317 }318 if (d->name[0] == FAT_DENTRY_UNUSED) {319 /* never used entry */320 return FAT_DENTRY_LAST;321 }322 if (d->name[0] == FAT_DENTRY_DOT) {323 /*324 * Most likely '.' or '..'.325 * It cannot occur in a regular file name.326 */327 return FAT_DENTRY_SKIP;328 }329 return FAT_DENTRY_VALID;330 265 } 331 266
Note:
See TracChangeset
for help on using the changeset viewer.