Merge commit 'pam/disklib-fixes'
[profile/ivi/syslinux.git] / libfat / fat.h
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2001-2008 H. Peter Anvin - All Rights Reserved
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, Inc., 53 Temple Place Ste 330,
8  *   Boston MA 02111-1307, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12
13 /*
14  * fat.h
15  *
16  * Basic data structures for a FAT filesystem
17  */
18
19 #ifndef FAT_H
20 #define FAT_H
21
22 #include "ulint.h"
23
24 /* The poor excuse FAT has for a superblock -- in the boot sector */
25 struct fat_bootsect {
26     le8_t bsJump[3];            /* Jump to code */
27     char bsOemName[8];          /* Formatting program */
28     le16_t bsBytesPerSec;       /* Bytes/sector */
29     le8_t bsSecPerClust;        /* Sectors/cluster */
30     le16_t bsResSectors;        /* Reserved sectors */
31     le8_t bsFATs;               /* Number of FATs */
32     le16_t bsRootDirEnts;       /* Number of entries/root directory */
33     le16_t bsSectors;           /* Number of sectors [1] */
34     le8_t bsMedia;              /* Magic media type byte */
35     le16_t bsFATsecs;           /* Sectors/FAT */
36     le16_t bsSecPerTrack;       /* Sectors/track */
37     le16_t bsHeads;             /* Number of heads */
38     le32_t bsHiddenSecs;        /* Number of hidden sectors */
39     le32_t bsHugeSectors;       /* Number of sectors [2] */
40     union {
41         /* FAT12/16 */
42         struct {
43             le8_t bsDriveNumber;        /* Drive number */
44             le8_t bsReserved1;  /* Reserved */
45             le8_t bsBootSignature;      /* 0x29 */
46             le32_t bsVolumeID;  /* Volume serial number */
47             char bsVolumeLabel[11];     /* Volume name */
48             char bsFileSysType[8];      /* File system type */
49
50             le8_t bsCode[448];  /* Boot sector code */
51         } fat16;
52
53         /* FAT32 */
54         struct {
55             le32_t bpb_fatsz32; /* Sectors/FAT */
56             le16_t bpb_extflags;        /* Extended flags */
57             le16_t bpb_fsver;   /* Filesystem version */
58             le32_t bpb_rootclus;        /* Root directory cluster */
59             le16_t bpb_fsinfo;  /* FSINFO sector number */
60             le16_t bpb_bkbootsec;       /* Backup boot sector (superblock) */
61             char bpb_reserved[12];
62
63             /* Same shit, different offset! */
64             le8_t bsDriveNumber;        /* Drive number */
65             le8_t bsReserved1;  /* Reserved */
66             le8_t bsBootSignature;      /* 0x29 */
67             le32_t bsVolumeID;  /* Volume serial number */
68             char bsVolumeLabel[11];     /* Volume name */
69             char bsFileSysType[8];      /* File system type */
70
71             le8_t bsCode[420];  /* Boot sector code */
72         } fat32;
73     } u;
74
75     le16_t bsSignature;         /* 0xAA55 */
76 };
77
78 #define BS_BOOTSIGNATURE        0x29
79 #define BS_SIGNATURE            0xAA55
80
81 /* A FAT filesystem directory entry */
82
83 struct fat_dirent {
84     le8_t name[11];             /* Mangled filename */
85     le8_t attribute;            /* File type/attribute */
86     le8_t caseflags;            /* VFAT: case for basis and extension */
87     le8_t ctime_ms;             /* ms of creation time */
88     le32_t ctime;               /* Creation time */
89     le16_t atime;               /* Date portion (high 16 bits) of atime */
90     le16_t clusthi;             /* FAT32: high 16 bits of cluster */
91     le32_t mtime;               /* Modification time */
92     le16_t clustlo;             /* First cluster pointer */
93     le32_t size;                /* File size (bytes) */
94 };
95
96 /* A VFAT filesystem continuation entry */
97 struct fat_vfat_slot {
98     le8_t id;                   /* Sequence number for slot */
99     le16_t name0[5];            /* 5 characters */
100     le8_t attribute;            /* Attribute byte */
101     le8_t reserved;             /* Reserved, MBZ */
102     le8_t alias_csum;           /* Short name checksum */
103     le16_t name5[6];            /* 6 characters */
104     le16_t firstclust;          /* MBZ */
105     le16_t name11[2];           /* 2 characters */
106 };
107
108 #endif /* FAT_H */