1 /* 2 * Copyright (c) 1996, 1998 Robert Nordier 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS 16 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY 19 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 21 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 23 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 25 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 */ 29 30 #ifndef DOSIO_H 31 #define DOSIO_H 32 33 /* 34 * DOS file attributes 35 */ 36 37 #define FA_RDONLY 001 /* read-only */ 38 #define FA_HIDDEN 002 /* hidden file */ 39 #define FA_SYSTEM 004 /* system file */ 40 #define FA_LABEL 010 /* volume label */ 41 #define FA_DIR 020 /* directory */ 42 #define FA_ARCH 040 /* archive (file modified) */ 43 #define FA_XDE 017 /* extended directory entry */ 44 #define FA_MASK 077 /* all attributes */ 45 46 /* 47 * Macros to convert DOS-format 16-bit and 32-bit quantities 48 */ 49 50 #define cv2(p) ((u_int16_t)(p)[0] | \ 51 ((u_int16_t)(p)[1] << 010)) 52 #define cv4(p) ((u_int32_t)(p)[0] | \ 53 ((u_int32_t)(p)[1] << 010) | \ 54 ((u_int32_t)(p)[2] << 020) | \ 55 ((u_int32_t)(p)[3] << 030)) 56 57 /* 58 * Directory, filesystem, and file structures. 59 */ 60 61 typedef struct { 62 u_char x_case; /* case */ 63 u_char c_hsec; /* created: secs/100 */ 64 u_char c_time[2]; /* created: time */ 65 u_char c_date[2]; /* created: date */ 66 u_char a_date[2]; /* accessed: date */ 67 u_char h_clus[2]; /* clus[hi] */ 68 } DOS_DEX; 69 70 typedef struct { 71 u_char name[8]; /* name */ 72 u_char ext[3]; /* extension */ 73 u_char attr; /* attributes */ 74 DOS_DEX dex; /* VFAT/FAT32 only */ 75 u_char time[2]; /* modified: time */ 76 u_char date[2]; /* modified: date */ 77 u_char clus[2]; /* starting cluster */ 78 u_char size[4]; /* size */ 79 } DOS_DE; 80 81 typedef struct { 82 u_char seq; /* flags */ 83 u_char name1[5][2]; /* 1st name area */ 84 u_char attr; /* (see fat_de) */ 85 u_char res; /* reserved */ 86 u_char chk; /* checksum */ 87 u_char name2[6][2]; /* 2nd name area */ 88 u_char clus[2]; /* (see fat_de) */ 89 u_char name3[2][2]; /* 3rd name area */ 90 } DOS_XDE; 91 92 typedef union { 93 DOS_DE de; /* standard directory entry */ 94 DOS_XDE xde; /* extended directory entry */ 95 } DOS_DIR; 96 97 typedef struct { 98 struct open_file *fd; /* file descriptor */ 99 u_char *fatbuf; /* FAT cache buffer */ 100 u_int fatbuf_blknum; /* number of 128K block in FAT cache buffer */ 101 u_int links; /* active links to structure */ 102 u_int spc; /* sectors per cluster */ 103 u_int bsize; /* cluster size in bytes */ 104 u_int bshift; /* cluster conversion shift */ 105 u_int dirents; /* root directory entries */ 106 u_int spf; /* sectors per fat */ 107 u_int rdcl; /* root directory start cluster */ 108 u_int lsnfat; /* start of fat */ 109 u_int lsndir; /* start of root dir */ 110 u_int lsndta; /* start of data area */ 111 u_int fatsz; /* FAT entry size */ 112 u_int xclus; /* maximum cluster number */ 113 DOS_DE root; 114 } DOS_FS; 115 116 typedef struct { 117 DOS_FS *fs; /* associated filesystem */ 118 DOS_DE de; /* directory entry */ 119 u_int offset; /* current offset */ 120 u_int c; /* last cluster read */ 121 } DOS_FILE; 122 123 #endif /* !DOSIO_H */ 124