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