| /* |
| * libhfs - library for reading and writing Macintosh HFS volumes |
| * Copyright (C) 2000 Klaus Halfmann (khalfmann@libra.de) |
| * Original work by 1996-1998 Robert Leslie (rob@mars.org) |
| * |
| * This file defines constants,structs etc needed for this library. |
| * Everything found here is usually not related to Apple defintions. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
| * MA 02110-1301, USA. |
| * |
| * $Id: libhfsp.h,v 1.17 2000/10/20 06:16:52 hasi Exp $ |
| */ |
| |
| # include "apple.h" |
| # include "hfs.h" |
| # include "hfsp.h" |
| |
| /* Last error is eventually found here */ |
| extern const char *hfsp_error; |
| |
| # define HFSP_ERROR(code, str) \ |
| do { hfsp_error = (str), errno = (code); goto fail; } while (0) |
| |
| # ifdef DEBUG |
| # define ASSERT(cond) do { if (! (cond)) abort(); } while (0) |
| # else |
| # define ASSERT(cond) /* nothing */ |
| # endif |
| |
| # define SIZE(type, n) ((size_t) (sizeof(type) * (n))) |
| # define ALLOC(type, n) ((type *) malloc(SIZE(type, n))) |
| # define ALLOCX(type, n) ((n) ? ALLOC(type, n) : (type *) 0) |
| # define FREE(ptr) ((ptr) ? (void) free((void *) ptr) : (void) 0) |
| |
| # define REALLOC(ptr, type, n) \ |
| ((type *) ((ptr) ? realloc(ptr, SIZE(type, n)) : malloc(SIZE(type, n)))) |
| # define REALLOCX(ptr, type, n) \ |
| ((n) ? REALLOC(ptr, type, n) : (FREE(ptr), (type *) 0)) |
| |
| # define BMTST(bm, num) \ |
| (((const byte *) (bm))[(num) >> 3] & (0x80 >> ((num) & 0x07))) |
| # define BMSET(bm, num) \ |
| (((byte *) (bm))[(num) >> 3] |= (0x80 >> ((num) & 0x07))) |
| # define BMCLR(bm, num) \ |
| (((byte *) (bm))[(num) >> 3] &= ~(0x80 >> ((num) & 0x07))) |
| |
| # define STRINGIZE(x) #x |
| # define STR(x) STRINGIZE(x) |
| |
| /* used by internal routines to specify the open modes */ |
| # define HFSP_MODE_RDONLY 0 |
| # define HFSP_MODE_RDWR 1 |
| # define HFSP_MODE_ANY 2 |
| |
| /* Signatures registered with Apple to identify this driver */ |
| /* Identifies the userland implementation */ |
| # define HPLS_SIGNATURE 0x482B4C58 // 'H+LX' |
| /* Identifies the kernel module by Brad Boyer (flar@pants.nu) */ |
| # define HPLS_SIGRES1 0x482B4C78 // 'H+Lx' |
| /* not jet in use ... */ |
| # define HPLS_SIGRES2 0x482B6C78 // 'H+lx' |
| /* Signature used by Apple */ |
| # define HPAPPLE_SIGNATURE 0x382e3130 // '8.10' |
| |
| /* Version used for this implementation of HFS+. This is not related |
| * to the VERSION file found at the top-level of this package, |
| * but designates the version of the low level code */ |
| #define HPLS_VERSION 1 /* must fit in a short */ |
| |
| |
| /* Othe Signatures may follow for informational purpos */ |
| |
| /* prototype for key comparing functions. */ |
| typedef int (*hfsp_key_compare) (void* key1, void* key2); |
| |
| /* prototype for key reading (necessary for byte swapping) */ |
| typedef void* (*hfsp_key_read) (void* p, void* key); |
| |
| struct volume; /* foreward declaration for btree needed */ |
| |
| /* Structures for a node cache. The cache is an array |
| * with linear search. (So making it to big may make |
| * things slower). It is searched in a round robin |
| * fashion. |
| */ |
| |
| typedef struct |
| { |
| UInt32 priority; |
| // as lower this number as higher the priority. |
| // decremetned on any sucessfull usage |
| // incremented else, intial value height*DEPTHFACTOR |
| UInt16 index; // of node in fork |
| // 0 means empty, since first node is node header |
| // contents of node in original byte order |
| UInt16 flags; // like DIRTY etc. |
| } node_entry; |
| |
| typedef struct |
| { |
| UInt32 index; // duplicate of above |
| btree_node_desc desc; // header of node |
| char node[0]; // actual node_size |
| // contents of node in original byte order |
| } node_buf; |
| |
| typedef struct |
| { |
| int size; // number of nodes in the cache |
| int currindex; // round robin index |
| int nodebufsize; // size of complete node_buf, including node |
| node_entry *entries; |
| char *buffers; // actually *node_buf |
| } node_cache; |
| |
| typedef struct |
| { |
| struct volume* vol; /* pointer to volume this tree is part of */ |
| hfsp_fork_raw* fork; /* pointer to fork this tree is part of */ |
| UInt32 cnid; /* (pseudo) file id for the fork */ |
| hfsp_key_compare kcomp; |
| /* function used for key compare in _this_ btree */ |
| hfsp_key_read kread; |
| /* fucntion used to read a key int _this_ btree */ |
| btree_head head; |
| |
| UInt16 blkpernode; |
| /* Number of volume blocks per node (usually 1-4) */ |
| node_cache cache; |
| /* Warning all functions of btrees and records may modify |
| the following values ! */ |
| // UInt16 node_index; /* index of node in fork */ |
| // btree_node_desc node; /* current node under examination */ |
| // char* buf; /* buf with size of a node */ |
| } btree; |
| |
| /* Function on btrees are defined in btree.h */ |
| |
| /* A Wrapper around the raw hfs+ volume header for additional information |
| * needed by this library. |
| */ |
| |
| typedef struct volume |
| { |
| int os_fd; /* OS dependend reference to device */ |
| UInt16 blksize_bits; /* blocksize of device = 1 << blksize_bits */ |
| UInt16 filler; |
| UInt32 blksize; /* always 1 << blksize_bits */ |
| UInt32 startblock; |
| /* Offset from physical to logical blocks, |
| eventually intodruced by HFS wrapper */ |
| UInt32 maxblocks; /* maximum number of blocks in device */ |
| // UInt32 currblock; /* value of current block, to cache blocks */ |
| hfsp_vh vol; /* raw volume data */ |
| // void* blockbuf; /* (single) buffer for fetching one block */ |
| /* Buffer has double size of blksize to allow cross block reading */ |
| |
| btree* extents; /* is NULL by default and intialized when needed */ |
| btree catalog; /* This is always neeeded */ |
| } volume; |
| |
| /* Functions on volumes are defined in volume.h */ |
| |
| typedef struct { // may not be used as found here |
| btree* tree; // tree where this record is contained in. |
| UInt16 node_index; /* index of record in btree */ |
| UInt16 keyind; /* index of current key in btree */ |
| hfsp_cat_key key; /* current key */ |
| UInt32 child; /* child node belonging to this key */ |
| } index_record; |
| |
| typedef struct { |
| btree* tree; // tree where this record is contained in. |
| UInt16 node_index; /* index of record in btree */ |
| UInt16 keyind; /* index of current key in btree */ |
| hfsp_extent_key key; /* current key */ |
| hfsp_extent_rec extent; /* The payload carried around */ |
| } extent_record; |
| |
| typedef struct { |
| btree* tree; // tree where this record is contained in. |
| UInt16 node_index; /* index of record in btree */ |
| UInt16 keyind; /* index of current key in btree */ |
| hfsp_cat_key key; /* current key */ |
| hfsp_cat_entry record; /* current record */ |
| } record; |
| |
| /* Functions on records are defined in record.h */ |