Annotation of qemu/roms/openbios/fs/hfs/include/libhfs.h, revision 1.1.1.1

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;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.