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 */ 28 29 #ifndef DOSIO_H 30 #define DOSIO_H 31 32 /* 33 * DOS file attributes 34 */ 35 36 #define FA_RDONLY 001 /* read-only */ 37 #define FA_HIDDEN 002 /* hidden file */ 38 #define FA_SYSTEM 004 /* system file */ 39 #define FA_LABEL 010 /* volume label */ 40 #define FA_DIR 020 /* directory */ 41 #define FA_ARCH 040 /* archive (file modified) */ 42 #define FA_XDE 017 /* extended directory entry */ 43 #define FA_MASK 077 /* all attributes */ 44 45 /* 46 * Macros to convert DOS-format 16-bit and 32-bit quantities 47 */ 48 49 #define cv2(p) ((u_int16_t)(p)[0] | \ 50 ((u_int16_t)(p)[1] << 010)) 51 #define cv4(p) ((u_int32_t)(p)[0] | \ 52 ((u_int32_t)(p)[1] << 010) | \ 53 ((u_int32_t)(p)[2] << 020) | \ 54 ((u_int32_t)(p)[3] << 030)) 55 56 /* 57 * Directory, filesystem, and file structures. 58 */ 59 60 typedef struct { 61 u_char x_case; /* case */ 62 u_char c_hsec; /* created: secs/100 */ 63 u_char c_time[2]; /* created: time */ 64 u_char c_date[2]; /* created: date */ 65 u_char a_date[2]; /* accessed: date */ 66 u_char h_clus[2]; /* clus[hi] */ 67 } DOS_DEX; 68 69 typedef struct { 70 u_char name[8]; /* name */ 71 u_char ext[3]; /* extension */ 72 u_char attr; /* attributes */ 73 DOS_DEX dex; /* VFAT/FAT32 only */ 74 u_char time[2]; /* modified: time */ 75 u_char date[2]; /* modified: date */ 76 u_char clus[2]; /* starting cluster */ 77 u_char size[4]; /* size */ 78 } DOS_DE; 79 80 typedef struct { 81 u_char seq; /* flags */ 82 u_char name1[5][2]; /* 1st name area */ 83 u_char attr; /* (see fat_de) */ 84 u_char res; /* reserved */ 85 u_char chk; /* checksum */ 86 u_char name2[6][2]; /* 2nd name area */ 87 u_char clus[2]; /* (see fat_de) */ 88 u_char name3[2][2]; /* 3rd name area */ 89 } DOS_XDE; 90 91 typedef union { 92 DOS_DE de; /* standard directory entry */ 93 DOS_XDE xde; /* extended directory entry */ 94 } DOS_DIR; 95 96 typedef struct { 97 struct open_file *fd; /* file descriptor */ 98 u_char *fatbuf; /* FAT cache buffer */ 99 u_int fatbuf_blknum; /* number of 128K block in FAT cache buffer */ 100 u_int links; /* active links to structure */ 101 u_int spc; /* sectors per cluster */ 102 u_int bsize; /* cluster size in bytes */ 103 u_int bshift; /* cluster conversion shift */ 104 u_int dirents; /* root directory entries */ 105 u_int spf; /* sectors per fat */ 106 u_int rdcl; /* root directory start cluster */ 107 u_int lsnfat; /* start of fat */ 108 u_int lsndir; /* start of root dir */ 109 u_int lsndta; /* start of data area */ 110 u_int fatsz; /* FAT entry size */ 111 u_int xclus; /* maximum cluster number */ 112 DOS_DE root; 113 } DOS_FS; 114 115 typedef struct { 116 DOS_FS *fs; /* associated filesystem */ 117 DOS_DE de; /* directory entry */ 118 u_int offset; /* current offset */ 119 u_int c; /* last cluster read */ 120 } DOS_FILE; 121 122 #endif /* !DOSIO_H */ 123