|
|
1.1 ! root 1: /* ! 2: * libhfs - library for reading and writing Macintosh HFS volumes ! 3: * Copyright (C) 2000 Klaus Halfmann ([email protected]) ! 4: * Original work by 1996-1998 Robert Leslie ([email protected]) ! 5: * ! 6: * This file defines constants,structs etc needed for this library. ! 7: * Everything found here is usually not related to Apple defintions. ! 8: * ! 9: * This program is free software; you can redistribute it and/or modify ! 10: * it under the terms of the GNU General Public License as published by ! 11: * the Free Software Foundation; either version 2 of the License, or ! 12: * (at your option) any later version. ! 13: * ! 14: * This program is distributed in the hope that it will be useful, ! 15: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 17: * GNU General Public License for more details. ! 18: * ! 19: * You should have received a copy of the GNU General Public License ! 20: * along with this program; if not, write to the Free Software ! 21: * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, ! 22: * MA 02110-1301, USA. ! 23: * ! 24: * $Id: libhfsp.h,v 1.17 2000/10/20 06:16:52 hasi Exp $ ! 25: */ ! 26: ! 27: # include "apple.h" ! 28: # include "hfs.h" ! 29: # include "hfsp.h" ! 30: ! 31: /* Last error is eventually found here */ ! 32: extern const char *hfsp_error; ! 33: ! 34: # define HFSP_ERROR(code, str) \ ! 35: do { hfsp_error = (str), errno = (code); goto fail; } while (0) ! 36: ! 37: # ifdef DEBUG ! 38: # define ASSERT(cond) do { if (! (cond)) abort(); } while (0) ! 39: # else ! 40: # define ASSERT(cond) /* nothing */ ! 41: # endif ! 42: ! 43: # define SIZE(type, n) ((size_t) (sizeof(type) * (n))) ! 44: # define ALLOC(type, n) ((type *) malloc(SIZE(type, n))) ! 45: # define ALLOCX(type, n) ((n) ? ALLOC(type, n) : (type *) 0) ! 46: # define FREE(ptr) ((ptr) ? (void) free((void *) ptr) : (void) 0) ! 47: ! 48: # define REALLOC(ptr, type, n) \ ! 49: ((type *) ((ptr) ? realloc(ptr, SIZE(type, n)) : malloc(SIZE(type, n)))) ! 50: # define REALLOCX(ptr, type, n) \ ! 51: ((n) ? REALLOC(ptr, type, n) : (FREE(ptr), (type *) 0)) ! 52: ! 53: # define BMTST(bm, num) \ ! 54: (((const byte *) (bm))[(num) >> 3] & (0x80 >> ((num) & 0x07))) ! 55: # define BMSET(bm, num) \ ! 56: (((byte *) (bm))[(num) >> 3] |= (0x80 >> ((num) & 0x07))) ! 57: # define BMCLR(bm, num) \ ! 58: (((byte *) (bm))[(num) >> 3] &= ~(0x80 >> ((num) & 0x07))) ! 59: ! 60: # define STRINGIZE(x) #x ! 61: # define STR(x) STRINGIZE(x) ! 62: ! 63: /* used by internal routines to specify the open modes */ ! 64: # define HFSP_MODE_RDONLY 0 ! 65: # define HFSP_MODE_RDWR 1 ! 66: # define HFSP_MODE_ANY 2 ! 67: ! 68: /* Signatures registered with Apple to identify this driver */ ! 69: /* Identifies the userland implementation */ ! 70: # define HPLS_SIGNATURE 0x482B4C58 // 'H+LX' ! 71: /* Identifies the kernel module by Brad Boyer ([email protected]) */ ! 72: # define HPLS_SIGRES1 0x482B4C78 // 'H+Lx' ! 73: /* not jet in use ... */ ! 74: # define HPLS_SIGRES2 0x482B6C78 // 'H+lx' ! 75: /* Signature used by Apple */ ! 76: # define HPAPPLE_SIGNATURE 0x382e3130 // '8.10' ! 77: ! 78: /* Version used for this implementation of HFS+. This is not related ! 79: * to the VERSION file found at the top-level of this package, ! 80: * but designates the version of the low level code */ ! 81: #define HPLS_VERSION 1 /* must fit in a short */ ! 82: ! 83: ! 84: /* Othe Signatures may follow for informational purpos */ ! 85: ! 86: /* prototype for key comparing functions. */ ! 87: typedef int (*hfsp_key_compare) (void* key1, void* key2); ! 88: ! 89: /* prototype for key reading (necessary for byte swapping) */ ! 90: typedef void* (*hfsp_key_read) (void* p, void* key); ! 91: ! 92: struct volume; /* foreward declaration for btree needed */ ! 93: ! 94: /* Structures for a node cache. The cache is an array ! 95: * with linear search. (So making it to big may make ! 96: * things slower). It is searched in a round robin ! 97: * fashion. ! 98: */ ! 99: ! 100: typedef struct ! 101: { ! 102: UInt32 priority; ! 103: // as lower this number as higher the priority. ! 104: // decremetned on any sucessfull usage ! 105: // incremented else, intial value height*DEPTHFACTOR ! 106: UInt16 index; // of node in fork ! 107: // 0 means empty, since first node is node header ! 108: // contents of node in original byte order ! 109: UInt16 flags; // like DIRTY etc. ! 110: } node_entry; ! 111: ! 112: typedef struct ! 113: { ! 114: UInt32 index; // duplicate of above ! 115: btree_node_desc desc; // header of node ! 116: char node[0]; // actual node_size ! 117: // contents of node in original byte order ! 118: } node_buf; ! 119: ! 120: typedef struct ! 121: { ! 122: int size; // number of nodes in the cache ! 123: int currindex; // round robin index ! 124: int nodebufsize; // size of complete node_buf, including node ! 125: node_entry *entries; ! 126: char *buffers; // actually *node_buf ! 127: } node_cache; ! 128: ! 129: typedef struct ! 130: { ! 131: struct volume* vol; /* pointer to volume this tree is part of */ ! 132: hfsp_fork_raw* fork; /* pointer to fork this tree is part of */ ! 133: UInt32 cnid; /* (pseudo) file id for the fork */ ! 134: hfsp_key_compare kcomp; ! 135: /* function used for key compare in _this_ btree */ ! 136: hfsp_key_read kread; ! 137: /* fucntion used to read a key int _this_ btree */ ! 138: btree_head head; ! 139: ! 140: UInt16 blkpernode; ! 141: /* Number of volume blocks per node (usually 1-4) */ ! 142: node_cache cache; ! 143: /* Warning all functions of btrees and records may modify ! 144: the following values ! */ ! 145: // UInt16 node_index; /* index of node in fork */ ! 146: // btree_node_desc node; /* current node under examination */ ! 147: // char* buf; /* buf with size of a node */ ! 148: } btree; ! 149: ! 150: /* Function on btrees are defined in btree.h */ ! 151: ! 152: /* A Wrapper around the raw hfs+ volume header for additional information ! 153: * needed by this library. ! 154: */ ! 155: ! 156: typedef struct volume ! 157: { ! 158: int os_fd; /* OS dependend reference to device */ ! 159: UInt16 blksize_bits; /* blocksize of device = 1 << blksize_bits */ ! 160: UInt16 filler; ! 161: UInt32 blksize; /* always 1 << blksize_bits */ ! 162: UInt32 startblock; ! 163: /* Offset from physical to logical blocks, ! 164: eventually intodruced by HFS wrapper */ ! 165: UInt32 maxblocks; /* maximum number of blocks in device */ ! 166: // UInt32 currblock; /* value of current block, to cache blocks */ ! 167: hfsp_vh vol; /* raw volume data */ ! 168: // void* blockbuf; /* (single) buffer for fetching one block */ ! 169: /* Buffer has double size of blksize to allow cross block reading */ ! 170: ! 171: btree* extents; /* is NULL by default and intialized when needed */ ! 172: btree catalog; /* This is always neeeded */ ! 173: } volume; ! 174: ! 175: /* Functions on volumes are defined in volume.h */ ! 176: ! 177: typedef struct { // may not be used as found here ! 178: btree* tree; // tree where this record is contained in. ! 179: UInt16 node_index; /* index of record in btree */ ! 180: UInt16 keyind; /* index of current key in btree */ ! 181: hfsp_cat_key key; /* current key */ ! 182: UInt32 child; /* child node belonging to this key */ ! 183: } index_record; ! 184: ! 185: typedef struct { ! 186: btree* tree; // tree where this record is contained in. ! 187: UInt16 node_index; /* index of record in btree */ ! 188: UInt16 keyind; /* index of current key in btree */ ! 189: hfsp_extent_key key; /* current key */ ! 190: hfsp_extent_rec extent; /* The payload carried around */ ! 191: } extent_record; ! 192: ! 193: typedef struct { ! 194: btree* tree; // tree where this record is contained in. ! 195: UInt16 node_index; /* index of record in btree */ ! 196: UInt16 keyind; /* index of current key in btree */ ! 197: hfsp_cat_key key; /* current key */ ! 198: hfsp_cat_entry record; /* current record */ ! 199: } record; ! 200: ! 201: /* Functions on records are defined in record.h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.