Annotation of qemu/roms/openbios/fs/hfs/include/libhfs.h, revision 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.