import source from 3.0.10
[external/dosfstools.git] / src / dosfsck.h
1 /* dosfsck.h  -  Common data structures and global variables
2
3    Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
4    Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
5
6    This program is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation, either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19    On Debian systems, the complete text of the GNU General Public License
20    can be found in /usr/share/common-licenses/GPL-3 file.
21 */
22
23 /* FAT32, VFAT, Atari format support, and various fixes additions May 1998
24  * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
25
26
27 #ifndef _DOSFSCK_H
28 #define _DOSFSCK_H
29
30 #include <sys/types.h>
31 #define _LINUX_STAT_H           /* hack to avoid inclusion of <linux/stat.h> */
32 #define _LINUX_STRING_H_        /* hack to avoid inclusion of <linux/string.h>*/
33 #define _LINUX_FS_H             /* hack to avoid inclusion of <linux/fs.h> */
34
35 # include <asm/types.h>
36 # include <asm/byteorder.h>
37
38 #include <linux/msdos_fs.h>
39
40 #undef CF_LE_W
41 #undef CF_LE_L
42 #undef CT_LE_W
43 #undef CT_LE_L
44
45 #if __BYTE_ORDER == __BIG_ENDIAN
46 #include <byteswap.h>
47 #define CF_LE_W(v) bswap_16(v)
48 #define CF_LE_L(v) bswap_32(v)
49 #define CT_LE_W(v) CF_LE_W(v)
50 #define CT_LE_L(v) CF_LE_L(v)
51 #else
52 #define CF_LE_W(v) (v)
53 #define CF_LE_L(v) (v)
54 #define CT_LE_W(v) (v)
55 #define CT_LE_L(v) (v)
56 #endif /* __BIG_ENDIAN */
57
58 #define VFAT_LN_ATTR (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
59
60 /* ++roman: Use own definition of boot sector structure -- the kernel headers'
61  * name for it is msdos_boot_sector in 2.0 and fat_boot_sector in 2.1 ... */
62 struct boot_sector {
63     __u8        ignored[3];     /* Boot strap short or near jump */
64     __u8        system_id[8];   /* Name - can be used to special case
65                                    partition manager volumes */
66     __u8        sector_size[2]; /* bytes per logical sector */
67     __u8        cluster_size;   /* sectors/cluster */
68     __u16       reserved;       /* reserved sectors */
69     __u8        fats;           /* number of FATs */
70     __u8        dir_entries[2]; /* root directory entries */
71     __u8        sectors[2];     /* number of sectors */
72     __u8        media;          /* media code (unused) */
73     __u16       fat_length;     /* sectors/FAT */
74     __u16       secs_track;     /* sectors per track */
75     __u16       heads;          /* number of heads */
76     __u32       hidden;         /* hidden sectors (unused) */
77     __u32       total_sect;     /* number of sectors (if sectors == 0) */
78
79     /* The following fields are only used by FAT32 */
80     __u32       fat32_length;   /* sectors/FAT */
81     __u16       flags;          /* bit 8: fat mirroring, low 4: active fat */
82     __u8        version[2];     /* major, minor filesystem version */
83     __u32       root_cluster;   /* first cluster in root directory */
84     __u16       info_sector;    /* filesystem info sector */
85     __u16       backup_boot;    /* backup boot sector */
86     __u8        reserved2[12];  /* Unused */
87
88     __u8        drive_number;   /* Logical Drive Number */
89     __u8        reserved3;      /* Unused */
90
91     __u8        extended_sig;   /* Extended Signature (0x29) */
92     __u32       serial;         /* Serial number */
93     __u8        label[11];      /* FS label */
94     __u8        fs_type[8];     /* FS Type */
95
96     /* fill up to 512 bytes */
97     __u8        junk[422];
98 } __attribute__ ((packed));
99
100 struct boot_sector_16 {
101     __u8        ignored[3];     /* Boot strap short or near jump */
102     __u8        system_id[8];   /* Name - can be used to special case
103                                    partition manager volumes */
104     __u8        sector_size[2]; /* bytes per logical sector */
105     __u8        cluster_size;   /* sectors/cluster */
106     __u16       reserved;       /* reserved sectors */
107     __u8        fats;           /* number of FATs */
108     __u8        dir_entries[2]; /* root directory entries */
109     __u8        sectors[2];     /* number of sectors */
110     __u8        media;          /* media code (unused) */
111     __u16       fat_length;     /* sectors/FAT */
112     __u16       secs_track;     /* sectors per track */
113     __u16       heads;          /* number of heads */
114     __u32       hidden;         /* hidden sectors (unused) */
115     __u32       total_sect;     /* number of sectors (if sectors == 0) */
116
117     __u8        drive_number;   /* Logical Drive Number */
118     __u8        reserved2;      /* Unused */
119
120     __u8        extended_sig;   /* Extended Signature (0x29) */
121     __u32       serial;         /* Serial number */
122     __u8        label[11];      /* FS label */
123     __u8        fs_type[8];     /* FS Type */
124
125     /* fill up to 512 bytes */
126     __u8        junk[450];
127 } __attribute__ ((packed));
128
129 struct info_sector {
130     __u32       magic;          /* Magic for info sector ('RRaA') */
131     __u8        junk[0x1dc];
132     __u32       reserved1;      /* Nothing as far as I can tell */
133     __u32       signature;      /* 0x61417272 ('rrAa') */
134     __u32       free_clusters;  /* Free cluster count.  -1 if unknown */
135     __u32       next_cluster;   /* Most recently allocated cluster. */
136     __u32       reserved2[3];
137     __u16       reserved3;
138     __u16       boot_sign;
139 };
140
141 typedef struct {
142     __u8        name[8],ext[3]; /* name and extension */
143     __u8        attr;           /* attribute bits */
144     __u8        lcase;          /* Case for base and extension */
145     __u8        ctime_ms;       /* Creation time, milliseconds */
146     __u16       ctime;          /* Creation time */
147     __u16       cdate;          /* Creation date */
148     __u16       adate;          /* Last access date */
149     __u16       starthi;        /* High 16 bits of cluster in FAT32 */
150     __u16       time,date,start;/* time, date and first cluster */
151     __u32       size;           /* file size (in bytes) */
152 } __attribute__ ((packed)) DIR_ENT;
153
154 typedef struct _dos_file {
155     DIR_ENT dir_ent;
156     char *lfn;
157     loff_t offset;
158     loff_t lfn_offset;
159     struct _dos_file *parent; /* parent directory */
160     struct _dos_file *next; /* next entry */
161     struct _dos_file *first; /* first entry (directory only) */
162 } DOS_FILE;
163
164 typedef struct {
165     unsigned long value;
166     unsigned long reserved;
167 } FAT_ENTRY;
168
169 typedef struct {
170     int nfats;
171     loff_t fat_start;
172     unsigned int fat_size; /* unit is bytes */
173     unsigned int fat_bits; /* size of a FAT entry */
174     unsigned int eff_fat_bits; /* # of used bits in a FAT entry */
175     unsigned long root_cluster; /* 0 for old-style root dir */
176     loff_t root_start;
177     unsigned int root_entries;
178     loff_t data_start;
179     unsigned int cluster_size;
180     unsigned long clusters;
181     loff_t fsinfo_start; /* 0 if not present */
182     long free_clusters;
183     loff_t backupboot_start; /* 0 if not present */
184     unsigned char *fat;
185     DOS_FILE **cluster_owner;
186     char *label;
187 } DOS_FS;
188
189 #ifndef offsetof
190 #define offsetof(t,e)   ((int)&(((t *)0)->e))
191 #endif
192
193 extern int interactive,rw,list,verbose,test,write_immed;
194 extern int atari_format;
195 extern unsigned n_files;
196 extern void *mem_queue;
197
198 /* value to use as end-of-file marker */
199 #define FAT_EOF(fs)     ((atari_format ? 0xfff : 0xff8) | FAT_EXTD(fs))
200 #define FAT_IS_EOF(fs,v) ((unsigned long)(v) >= (0xff8|FAT_EXTD(fs)))
201 /* value to mark bad clusters */
202 #define FAT_BAD(fs)     (0xff7 | FAT_EXTD(fs))
203 /* range of values used for bad clusters */
204 #define FAT_MIN_BAD(fs) ((atari_format ? 0xff0 : 0xff7) | FAT_EXTD(fs))
205 #define FAT_MAX_BAD(fs) ((atari_format ? 0xff7 : 0xff7) | FAT_EXTD(fs))
206 #define FAT_IS_BAD(fs,v) ((v) >= FAT_MIN_BAD(fs) && (v) <= FAT_MAX_BAD(fs))
207
208 /* return -16 as a number with fs->fat_bits bits */
209 #define FAT_EXTD(fs)    (((1 << fs->eff_fat_bits)-1) & ~0xf)
210
211 /* marker for files with no 8.3 name */
212 #define FAT_NO_83NAME 32
213
214 #endif