|
|
1.1 root 1: /*
2: * libhfs - library for reading and writing Macintosh HFS volumes
3: * Copyright (C) 1996-1998 Robert Leslie
4: *
5: * This program is free software; you can redistribute it and/or modify
6: * it under the terms of the GNU General Public License as published by
7: * the Free Software Foundation; either version 2 of the License, or
8: * (at your option) any later version.
9: *
10: * This program is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: * GNU General Public License for more details.
14: *
15: * You should have received a copy of the GNU General Public License
16: * along with this program; if not, write to the Free Software
17: * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
18: * MA 02110-1301, USA.
19: *
20: * $Id: libhfs.h,v 1.7 1998/11/02 22:09:02 rob Exp $
21: */
22:
23: # include "hfs.h"
24: # include "apple.h"
25:
26: # define ERROR(code, str) \
27: do { hfs_error = (str), errno = (code); goto fail; } while (0)
28:
29: # ifdef DEBUG
30: # define ASSERT(cond) do { if (! (cond)) abort(); } while (0)
31: # else
32: # define ASSERT(cond) /* nothing */
33: # endif
34:
35: # define SIZE(type, n) ((size_t) (sizeof(type) * (n)))
36: # define ALLOC(type, n) ((type *) malloc(SIZE(type, n)))
37: # define ALLOCX(type, n) ((n) ? ALLOC(type, n) : (type *) 0)
38: # define FREE(ptr) ((ptr) ? (void) free((void *) ptr) : (void) 0)
39:
40: # define REALLOC(ptr, type, n) \
41: ((type *) ((ptr) ? realloc(ptr, SIZE(type, n)) : malloc(SIZE(type, n))))
42: # define REALLOCX(ptr, type, n) \
43: ((n) ? REALLOC(ptr, type, n) : (FREE(ptr), (type *) 0))
44:
45: # define BMTST(bm, num) \
46: (((const byte *) (bm))[(num) >> 3] & (0x80 >> ((num) & 0x07)))
47: # define BMSET(bm, num) \
48: (((byte *) (bm))[(num) >> 3] |= (0x80 >> ((num) & 0x07)))
49: # define BMCLR(bm, num) \
50: (((byte *) (bm))[(num) >> 3] &= ~(0x80 >> ((num) & 0x07)))
51:
52: # define STRINGIZE(x) #x
53: # define STR(x) STRINGIZE(x)
54:
55: typedef unsigned char byte;
56: typedef byte block[HFS_BLOCKSZ];
57:
58: typedef struct _bucket_ {
59: int flags; /* bit flags */
60: unsigned int count; /* number of times this block is requested */
61:
62: unsigned long bnum; /* logical block number */
63: block *data; /* pointer to block contents */
64:
65: struct _bucket_ *cnext; /* next bucket in cache chain */
66: struct _bucket_ *cprev; /* previous bucket in cache chain */
67:
68: struct _bucket_ *hnext; /* next bucket in hash chain */
69: struct _bucket_ **hprev; /* previous bucket's pointer to this bucket */
70: } bucket;
71:
72: # define HFS_BUCKET_INUSE 0x01
73: # define HFS_BUCKET_DIRTY 0x02
74:
75: # define HFS_CACHESZ 128
76: # define HFS_HASHSZ 32
77: # define HFS_BLOCKBUFSZ 16
78:
79: typedef struct {
80: struct _hfsvol_ *vol; /* volume to which cache belongs */
81: bucket *tail; /* end of bucket chain */
82:
83: unsigned int hits; /* number of cache hits */
84: unsigned int misses; /* number of cache misses */
85:
86: bucket chain[HFS_CACHESZ]; /* cache bucket chain */
87: bucket *hash[HFS_HASHSZ]; /* hash table for bucket chain */
88:
89: block pool[HFS_CACHESZ]; /* physical blocks in cache */
90: } bcache;
91:
92: # define HFS_MAP1SZ 256
93: # define HFS_MAPXSZ 492
94:
95: # define HFS_NODEREC(nd, rnum) ((nd).data + (nd).roff[rnum])
96: # define HFS_RECLEN(nd, rnum) ((nd).roff[(rnum) + 1] - (nd).roff[rnum])
97:
98: # define HFS_RECKEYLEN(ptr) (*(const byte *) (ptr))
99: # define HFS_RECKEYSKIP(ptr) ((size_t) ((1 + HFS_RECKEYLEN(ptr) + 1) & ~1))
100: # define HFS_RECDATA(ptr) ((ptr) + HFS_RECKEYSKIP(ptr))
101:
102: # define HFS_SETKEYLEN(ptr, x) (*(byte *) (ptr) = (x))
103:
104: # define HFS_CATDATALEN sizeof(CatDataRec)
105: # define HFS_EXTDATALEN sizeof(ExtDataRec)
106: # define HFS_MAX_DATALEN (HFS_CATDATALEN > HFS_EXTDATALEN ? \
107: HFS_CATDATALEN : HFS_EXTDATALEN)
108:
109: # define HFS_CATKEYLEN sizeof(CatKeyRec)
110: # define HFS_EXTKEYLEN sizeof(ExtKeyRec)
111: # define HFS_MAX_KEYLEN (HFS_CATKEYLEN > HFS_EXTKEYLEN ? \
112: HFS_CATKEYLEN : HFS_EXTKEYLEN)
113:
114: # define HFS_MAX_CATRECLEN (HFS_CATKEYLEN + HFS_CATDATALEN)
115: # define HFS_MAX_EXTRECLEN (HFS_EXTKEYLEN + HFS_EXTDATALEN)
116: # define HFS_MAX_RECLEN (HFS_MAX_KEYLEN + HFS_MAX_DATALEN)
117:
118: # define HFS_SIGWORD 0x4244
119: # define HFS_SIGWORD_MFS ((Integer) 0xd2d7)
120:
121: # define HFS_ATRB_BUSY (1 << 6)
122: # define HFS_ATRB_HLOCKED (1 << 7)
123: # define HFS_ATRB_UMOUNTED (1 << 8)
124: # define HFS_ATRB_BBSPARED (1 << 9)
125: # define HFS_ATRB_BVINCONSIS (1 << 11)
126: # define HFS_ATRB_COPYPROT (1 << 14)
127: # define HFS_ATRB_SLOCKED (1 << 15)
128:
129: struct _hfsfile_ {
130: struct _hfsvol_ *vol; /* pointer to volume descriptor */
131: unsigned long parid; /* parent directory ID of this file */
132: char name[HFS_MAX_FLEN + 1]; /* catalog name of this file */
133: CatDataRec cat; /* catalog information */
134: ExtDataRec ext; /* current extent record */
135: unsigned int fabn; /* starting file allocation block number */
136: int fork; /* current selected fork for I/O */
137: unsigned long pos; /* current file seek pointer */
138: int flags; /* bit flags */
139:
140: struct _hfsfile_ *prev;
141: struct _hfsfile_ *next;
142: };
143:
144: # define HFS_FILE_UPDATE_CATREC 0x01
145:
146: # define HFS_MAX_NRECS 35 /* maximum based on minimum record size */
147:
148: typedef struct _node_ {
149: struct _btree_ *bt; /* btree to which this node belongs */
150: unsigned long nnum; /* node index */
151: NodeDescriptor nd; /* node descriptor */
152: int rnum; /* current record index */
153: UInteger roff[HFS_MAX_NRECS + 1];
154: /* record offsets */
155: block data; /* raw contents of node */
156: } node;
157:
158: struct _hfsdir_ {
159: struct _hfsvol_ *vol; /* associated volume */
160: unsigned long dirid; /* directory ID of interest (or 0) */
161:
162: node n; /* current B*-tree node */
163: struct _hfsvol_ *vptr; /* current volume pointer */
164:
165: struct _hfsdir_ *prev;
166: struct _hfsdir_ *next;
167: };
168:
169: typedef void (*keyunpackfunc)(const byte *, void *);
170: typedef int (*keycomparefunc)(const void *, const void *);
171:
172: typedef struct _btree_ {
173: hfsfile f; /* subset file information */
174: node hdrnd; /* header node */
175: BTHdrRec hdr; /* header record */
176: byte *map; /* usage bitmap */
177: unsigned long mapsz; /* number of bytes in bitmap */
178: int flags; /* bit flags */
179:
180: keyunpackfunc keyunpack; /* key unpacking function */
181: keycomparefunc keycompare; /* key comparison function */
182: } btree;
183:
184: # define HFS_BT_UPDATE_HDR 0x01
185:
186: struct _hfsvol_ {
187: int os_fd; /* OS-dependent private descriptor data */
188: int flags; /* bit flags */
189:
190: int pnum; /* ordinal HFS partition number */
191: unsigned long vstart; /* logical block offset to start of volume */
192: unsigned long vlen; /* number of logical blocks in volume */
193: unsigned int lpa; /* number of logical blocks per allocation block */
194:
195: bcache *cache; /* cache of recently used blocks */
196:
197: MDB mdb; /* master directory block */
198: block *vbm; /* volume bitmap */
199: unsigned short vbmsz; /* number of blocks in bitmap */
200:
201: btree ext; /* B*-tree control block for extents overflow file */
202: btree cat; /* B*-tree control block for catalog file */
203:
204: unsigned long cwd; /* directory id of current working directory */
205:
206: int refs; /* number of external references to this volume */
207: hfsfile *files; /* list of open files */
208: hfsdir *dirs; /* list of open directories */
209:
210: struct _hfsvol_ *prev;
211: struct _hfsvol_ *next;
212: };
213:
214: # define HFS_VOL_OPEN 0x0001
215: # define HFS_VOL_MOUNTED 0x0002
216: # define HFS_VOL_READONLY 0x0004
217: # define HFS_VOL_USINGCACHE 0x0008
218:
219: # define HFS_VOL_UPDATE_MDB 0x0010
220: # define HFS_VOL_UPDATE_ALTMDB 0x0020
221: # define HFS_VOL_UPDATE_VBM 0x0040
222:
223: # define HFS_VOL_OPT_MASK 0xff00
224:
225: extern hfsvol *hfs_mounts;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.