blob: 912cfbd05b84fc4b91d07e853f86717143de6e20 [file] [log] [blame]
/*
* 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 */