10121b42aSDavid E. O'Brien /* 20121b42aSDavid E. O'Brien * Copyright (C) 1995, 1996, 1997 Wolfgang Solfrank 30121b42aSDavid E. O'Brien * Copyright (c) 1995 Martin Husemann 40121b42aSDavid E. O'Brien * Some structure declaration borrowed from Paul Popelka 50121b42aSDavid E. O'Brien * (paulp@uts.amdahl.com), see /sys/msdosfs/ for reference. 60121b42aSDavid E. O'Brien * 70121b42aSDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 80121b42aSDavid E. O'Brien * modification, are permitted provided that the following conditions 90121b42aSDavid E. O'Brien * are met: 100121b42aSDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 110121b42aSDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 120121b42aSDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 130121b42aSDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 140121b42aSDavid E. O'Brien * documentation and/or other materials provided with the distribution. 150121b42aSDavid E. O'Brien * 160121b42aSDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 170121b42aSDavid E. O'Brien * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 180121b42aSDavid E. O'Brien * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 190121b42aSDavid E. O'Brien * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 200121b42aSDavid E. O'Brien * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 210121b42aSDavid E. O'Brien * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 220121b42aSDavid E. O'Brien * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 230121b42aSDavid E. O'Brien * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 240121b42aSDavid E. O'Brien * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 250121b42aSDavid E. O'Brien * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260121b42aSDavid E. O'Brien * $NetBSD: dosfs.h,v 1.4 1997/01/03 14:32:48 ws Exp $ 270121b42aSDavid E. O'Brien * $FreeBSD$ 280121b42aSDavid E. O'Brien */ 290121b42aSDavid E. O'Brien 300121b42aSDavid E. O'Brien #ifndef DOSFS_H 310121b42aSDavid E. O'Brien #define DOSFS_H 320121b42aSDavid E. O'Brien 33*db0b8e10SDoug Ambrisko /* support 4Kn disk reads */ 34*db0b8e10SDoug Ambrisko #define DOSBOOTBLOCKSIZE_REAL 512 35*db0b8e10SDoug Ambrisko #define DOSBOOTBLOCKSIZE 4096 360121b42aSDavid E. O'Brien 370121b42aSDavid E. O'Brien typedef u_int32_t cl_t; /* type holding a cluster number */ 380121b42aSDavid E. O'Brien 390121b42aSDavid E. O'Brien /* 400121b42aSDavid E. O'Brien * architecture independent description of all the info stored in a 410121b42aSDavid E. O'Brien * FAT boot block. 420121b42aSDavid E. O'Brien */ 430121b42aSDavid E. O'Brien struct bootblock { 4475fb5353SKonstantin Belousov u_int bpbBytesPerSec; /* bytes per sector */ 4575fb5353SKonstantin Belousov u_int bpbSecPerClust; /* sectors per cluster */ 4675fb5353SKonstantin Belousov u_int bpbResSectors; /* number of reserved sectors */ 4775fb5353SKonstantin Belousov u_int bpbFATs; /* number of bpbFATs */ 4875fb5353SKonstantin Belousov u_int bpbRootDirEnts; /* number of root directory entries */ 4975fb5353SKonstantin Belousov u_int32_t bpbSectors; /* total number of sectors */ 5075fb5353SKonstantin Belousov u_int bpbMedia; /* media descriptor */ 5175fb5353SKonstantin Belousov u_int bpbFATsmall; /* number of sectors per FAT */ 520121b42aSDavid E. O'Brien u_int SecPerTrack; /* sectors per track */ 5375fb5353SKonstantin Belousov u_int bpbHeads; /* number of heads */ 5475fb5353SKonstantin Belousov u_int32_t bpbHiddenSecs; /* # of hidden sectors */ 5575fb5353SKonstantin Belousov u_int32_t bpbHugeSectors; /* # of sectors if bpbbpbSectors == 0 */ 5675fb5353SKonstantin Belousov cl_t bpbRootClust; /* Start of Root Directory */ 5775fb5353SKonstantin Belousov u_int bpbFSInfo; /* FSInfo sector */ 5875fb5353SKonstantin Belousov u_int bpbBackup; /* Backup of Bootblocks */ 590121b42aSDavid E. O'Brien cl_t FSFree; /* Number of free clusters acc. FSInfo */ 600121b42aSDavid E. O'Brien cl_t FSNext; /* Next free cluster acc. FSInfo */ 610121b42aSDavid E. O'Brien 620121b42aSDavid E. O'Brien /* and some more calculated values */ 630121b42aSDavid E. O'Brien u_int flags; /* some flags: */ 6475fb5353SKonstantin Belousov #define FAT32 1 /* this is a FAT32 file system */ 6575fb5353SKonstantin Belousov /* 6675fb5353SKonstantin Belousov * Maybe, we should separate out 6775fb5353SKonstantin Belousov * various parts of FAT32? XXX 6875fb5353SKonstantin Belousov */ 690121b42aSDavid E. O'Brien int ValidFat; /* valid fat if FAT32 non-mirrored */ 700121b42aSDavid E. O'Brien cl_t ClustMask; /* mask for entries in FAT */ 710121b42aSDavid E. O'Brien cl_t NumClusters; /* # of entries in a FAT */ 720121b42aSDavid E. O'Brien u_int32_t NumSectors; /* how many sectors are there */ 730121b42aSDavid E. O'Brien u_int32_t FATsecs; /* how many sectors are in FAT */ 740121b42aSDavid E. O'Brien u_int32_t NumFatEntries; /* how many entries really are there */ 750121b42aSDavid E. O'Brien u_int ClusterOffset; /* at what sector would sector 0 start */ 760121b42aSDavid E. O'Brien u_int ClusterSize; /* Cluster size in bytes */ 770121b42aSDavid E. O'Brien 780121b42aSDavid E. O'Brien /* Now some statistics: */ 790121b42aSDavid E. O'Brien u_int NumFiles; /* # of plain files */ 800121b42aSDavid E. O'Brien u_int NumFree; /* # of free clusters */ 810121b42aSDavid E. O'Brien u_int NumBad; /* # of bad clusters */ 820121b42aSDavid E. O'Brien }; 830121b42aSDavid E. O'Brien 840121b42aSDavid E. O'Brien struct fatEntry { 850121b42aSDavid E. O'Brien cl_t next; /* pointer to next cluster */ 860121b42aSDavid E. O'Brien cl_t head; /* pointer to start of chain */ 870121b42aSDavid E. O'Brien u_int32_t length; /* number of clusters on chain */ 880121b42aSDavid E. O'Brien int flags; /* see below */ 890121b42aSDavid E. O'Brien }; 900121b42aSDavid E. O'Brien 910121b42aSDavid E. O'Brien #define CLUST_FREE 0 /* 0 means cluster is free */ 920121b42aSDavid E. O'Brien #define CLUST_FIRST 2 /* 2 is the minimum valid cluster number */ 930121b42aSDavid E. O'Brien #define CLUST_RSRVD 0xfffffff6 /* start of reserved clusters */ 940121b42aSDavid E. O'Brien #define CLUST_BAD 0xfffffff7 /* a cluster with a defect */ 950121b42aSDavid E. O'Brien #define CLUST_EOFS 0xfffffff8 /* start of EOF indicators */ 960121b42aSDavid E. O'Brien #define CLUST_EOF 0xffffffff /* standard value for last cluster */ 970121b42aSDavid E. O'Brien 980121b42aSDavid E. O'Brien /* 990121b42aSDavid E. O'Brien * Masks for cluster values 1000121b42aSDavid E. O'Brien */ 1010121b42aSDavid E. O'Brien #define CLUST12_MASK 0xfff 1020121b42aSDavid E. O'Brien #define CLUST16_MASK 0xffff 1030121b42aSDavid E. O'Brien #define CLUST32_MASK 0xfffffff 1040121b42aSDavid E. O'Brien 1050121b42aSDavid E. O'Brien #define FAT_USED 1 /* This fat chain is used in a file */ 1060121b42aSDavid E. O'Brien 1070121b42aSDavid E. O'Brien #define DOSLONGNAMELEN 256 /* long name maximal length */ 1080121b42aSDavid E. O'Brien #define LRFIRST 0x40 /* first long name record */ 1090121b42aSDavid E. O'Brien #define LRNOMASK 0x1f /* mask to extract long record 1100121b42aSDavid E. O'Brien * sequence number */ 1110121b42aSDavid E. O'Brien 1120121b42aSDavid E. O'Brien /* 1130121b42aSDavid E. O'Brien * Architecture independent description of a directory entry 1140121b42aSDavid E. O'Brien */ 1150121b42aSDavid E. O'Brien struct dosDirEntry { 1160121b42aSDavid E. O'Brien struct dosDirEntry 1170121b42aSDavid E. O'Brien *parent, /* previous tree level */ 1180121b42aSDavid E. O'Brien *next, /* next brother */ 1190121b42aSDavid E. O'Brien *child; /* if this is a directory */ 1200121b42aSDavid E. O'Brien char name[8+1+3+1]; /* alias name first part */ 1210121b42aSDavid E. O'Brien char lname[DOSLONGNAMELEN]; /* real name */ 1220121b42aSDavid E. O'Brien uint flags; /* attributes */ 1230121b42aSDavid E. O'Brien cl_t head; /* cluster no */ 1240121b42aSDavid E. O'Brien u_int32_t size; /* filesize in bytes */ 1250121b42aSDavid E. O'Brien uint fsckflags; /* flags during fsck */ 1260121b42aSDavid E. O'Brien }; 1270121b42aSDavid E. O'Brien /* Flags in fsckflags: */ 1280121b42aSDavid E. O'Brien #define DIREMPTY 1 1290121b42aSDavid E. O'Brien #define DIREMPWARN 2 1300121b42aSDavid E. O'Brien 1310121b42aSDavid E. O'Brien /* 1320121b42aSDavid E. O'Brien * TODO-list of unread directories 1330121b42aSDavid E. O'Brien */ 1340121b42aSDavid E. O'Brien struct dirTodoNode { 1350121b42aSDavid E. O'Brien struct dosDirEntry *dir; 1360121b42aSDavid E. O'Brien struct dirTodoNode *next; 1370121b42aSDavid E. O'Brien }; 1380121b42aSDavid E. O'Brien 1390121b42aSDavid E. O'Brien #endif 140