/* * 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 */