1 1.12 thorpej /* $NetBSD: direntry.h,v 1.12 2021/10/23 16:58:17 thorpej Exp $ */ 2 1.1 jdolecek 3 1.1 jdolecek /*- 4 1.1 jdolecek * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. 5 1.1 jdolecek * Copyright (C) 1994, 1995, 1997 TooLs GmbH. 6 1.1 jdolecek * All rights reserved. 7 1.1 jdolecek * Original code by Paul Popelka (paulp (at) uts.amdahl.com) (see below). 8 1.1 jdolecek * 9 1.1 jdolecek * Redistribution and use in source and binary forms, with or without 10 1.1 jdolecek * modification, are permitted provided that the following conditions 11 1.1 jdolecek * are met: 12 1.1 jdolecek * 1. Redistributions of source code must retain the above copyright 13 1.1 jdolecek * notice, this list of conditions and the following disclaimer. 14 1.1 jdolecek * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 jdolecek * notice, this list of conditions and the following disclaimer in the 16 1.1 jdolecek * documentation and/or other materials provided with the distribution. 17 1.1 jdolecek * 3. All advertising materials mentioning features or use of this software 18 1.1 jdolecek * must display the following acknowledgement: 19 1.1 jdolecek * This product includes software developed by TooLs GmbH. 20 1.1 jdolecek * 4. The name of TooLs GmbH may not be used to endorse or promote products 21 1.1 jdolecek * derived from this software without specific prior written permission. 22 1.1 jdolecek * 23 1.1 jdolecek * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR 24 1.1 jdolecek * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 1.1 jdolecek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 1.1 jdolecek * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 1.1 jdolecek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 28 1.1 jdolecek * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 29 1.1 jdolecek * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 30 1.1 jdolecek * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 31 1.1 jdolecek * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 32 1.1 jdolecek * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 1.1 jdolecek */ 34 1.1 jdolecek /* 35 1.1 jdolecek * Written by Paul Popelka (paulp (at) uts.amdahl.com) 36 1.1 jdolecek * 37 1.1 jdolecek * You can do anything you want with this software, just don't say you wrote 38 1.1 jdolecek * it, and don't remove this notice. 39 1.1 jdolecek * 40 1.1 jdolecek * This software is provided "as is". 41 1.1 jdolecek * 42 1.1 jdolecek * The author supplies this software to be publicly redistributed on the 43 1.1 jdolecek * understanding that the author is not responsible for the correct 44 1.1 jdolecek * functioning of this software in any circumstances and is not liable for 45 1.1 jdolecek * any damages caused by this software. 46 1.1 jdolecek * 47 1.1 jdolecek * October 1992 48 1.1 jdolecek */ 49 1.5 christos #ifndef _MSDOSFS_DIRENTRY_H_ 50 1.5 christos #define _MSDOSFS_DIRENTRY_H_ 51 1.1 jdolecek 52 1.1 jdolecek /* 53 1.1 jdolecek * Structure of a dos directory entry. 54 1.1 jdolecek */ 55 1.1 jdolecek struct direntry { 56 1.8 dholland uint8_t deName[8]; /* filename, blank filled */ 57 1.1 jdolecek #define SLOT_EMPTY 0x00 /* slot has never been used */ 58 1.1 jdolecek #define SLOT_E5 0x05 /* the real value is 0xe5 */ 59 1.1 jdolecek #define SLOT_DELETED 0xe5 /* file in this slot deleted */ 60 1.8 dholland uint8_t deExtension[3]; /* extension, blank filled */ 61 1.8 dholland uint8_t deAttributes; /* file attributes */ 62 1.1 jdolecek #define ATTR_NORMAL 0x00 /* normal file */ 63 1.1 jdolecek #define ATTR_READONLY 0x01 /* file is readonly */ 64 1.1 jdolecek #define ATTR_HIDDEN 0x02 /* file is hidden */ 65 1.1 jdolecek #define ATTR_SYSTEM 0x04 /* file is a system file */ 66 1.1 jdolecek #define ATTR_VOLUME 0x08 /* entry is a volume label */ 67 1.1 jdolecek #define ATTR_DIRECTORY 0x10 /* entry is a directory name */ 68 1.1 jdolecek #define ATTR_ARCHIVE 0x20 /* file is new or modified */ 69 1.8 dholland uint8_t deReserved; /* reserved */ 70 1.8 dholland uint8_t deCHundredth; /* hundredth of seconds in CTime */ 71 1.8 dholland uint8_t deCTime[2]; /* create time */ 72 1.8 dholland uint8_t deCDate[2]; /* create date */ 73 1.8 dholland uint8_t deADate[2]; /* access date */ 74 1.8 dholland uint8_t deHighClust[2]; /* high bytes of cluster number */ 75 1.8 dholland uint8_t deMTime[2]; /* last update time */ 76 1.8 dholland uint8_t deMDate[2]; /* last update date */ 77 1.8 dholland uint8_t deStartCluster[2]; /* starting cluster of file */ 78 1.8 dholland uint8_t deFileSize[4]; /* size of file in bytes */ 79 1.1 jdolecek }; 80 1.1 jdolecek 81 1.7 christos static __inline uint8_t 82 1.7 christos msdos_dirchar(const struct direntry *de, size_t i) { 83 1.7 christos return i < sizeof(de->deName) ? de->deName[i] : 84 1.7 christos de->deExtension[i - sizeof(de->deName)]; 85 1.7 christos } 86 1.7 christos 87 1.1 jdolecek /* 88 1.1 jdolecek * Structure of a Win95 long name directory entry 89 1.1 jdolecek */ 90 1.1 jdolecek struct winentry { 91 1.8 dholland uint8_t weCnt; 92 1.1 jdolecek #define WIN_LAST 0x40 93 1.1 jdolecek #define WIN_CNT 0x3f 94 1.8 dholland uint8_t wePart1[10]; 95 1.8 dholland uint8_t weAttributes; 96 1.1 jdolecek #define ATTR_WIN95 0x0f 97 1.8 dholland uint8_t weReserved1; 98 1.8 dholland uint8_t weChksum; 99 1.8 dholland uint8_t wePart2[12]; 100 1.8 dholland uint16_t weReserved2; 101 1.8 dholland uint8_t wePart3[4]; 102 1.1 jdolecek }; 103 1.1 jdolecek #define WIN_CHARS 13 /* Number of chars per winentry */ 104 1.1 jdolecek 105 1.1 jdolecek /* 106 1.1 jdolecek * This is the format of the contents of the deTime field in the direntry 107 1.1 jdolecek * structure. 108 1.1 jdolecek * We don't use bitfields because we don't know how compilers for 109 1.1 jdolecek * arbitrary machines will lay them out. 110 1.1 jdolecek */ 111 1.1 jdolecek #define DT_2SECONDS_MASK 0x1F /* seconds divided by 2 */ 112 1.1 jdolecek #define DT_2SECONDS_SHIFT 0 113 1.1 jdolecek #define DT_MINUTES_MASK 0x7E0 /* minutes */ 114 1.1 jdolecek #define DT_MINUTES_SHIFT 5 115 1.1 jdolecek #define DT_HOURS_MASK 0xF800 /* hours */ 116 1.1 jdolecek #define DT_HOURS_SHIFT 11 117 1.1 jdolecek 118 1.1 jdolecek /* 119 1.1 jdolecek * This is the format of the contents of the deDate field in the direntry 120 1.1 jdolecek * structure. 121 1.1 jdolecek */ 122 1.1 jdolecek #define DD_DAY_MASK 0x1F /* day of month */ 123 1.1 jdolecek #define DD_DAY_SHIFT 0 124 1.1 jdolecek #define DD_MONTH_MASK 0x1E0 /* month */ 125 1.1 jdolecek #define DD_MONTH_SHIFT 5 126 1.1 jdolecek #define DD_YEAR_MASK 0xFE00 /* year - 1980 */ 127 1.1 jdolecek #define DD_YEAR_SHIFT 9 128 1.1 jdolecek 129 1.6 christos #if defined(_KERNEL) || defined(MAKEFS) 130 1.6 christos struct dirent; 131 1.12 thorpej void msdosfs_unix2dostime(const struct timespec *tsp, int gmtoff, 132 1.12 thorpej uint16_t *ddp, uint16_t *dtp, uint8_t *dhp); 133 1.12 thorpej void msdosfs_dos2unixtime(unsigned int dd, unsigned int dt, unsigned int dh, 134 1.9 dholland int gmtoff, struct timespec *tsp); 135 1.12 thorpej int msdosfs_dos2unixfn(unsigned char dn[11], unsigned char *un, int lower); 136 1.12 thorpej int msdosfs_unix2dosfn(const unsigned char *un, unsigned char dn[12], 137 1.12 thorpej int unlen, unsigned int gen); 138 1.12 thorpej int msdosfs_unix2winfn(const unsigned char *un, int unlen, 139 1.12 thorpej struct winentry *wep, int cnt, int chksum, int utf8); 140 1.12 thorpej int msdosfs_winChkName(const unsigned char *un, int unlen, 141 1.12 thorpej struct winentry *wep, int chksum, int utf8); 142 1.12 thorpej int msdosfs_win2unixfn(struct winentry *wep, struct dirent *dp, int chksum, 143 1.11 christos uint16_t *namlen, int utf8); 144 1.12 thorpej uint8_t msdosfs_winChksum(uint8_t *name); 145 1.12 thorpej int msdosfs_winSlotCnt(const unsigned char *un, int unlen, int utf8); 146 1.6 christos #endif /* _KERNEL || MAKEFS */ 147 1.5 christos #endif /* _MSDOSFS_DIRENTRY_H_ */ 148