Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / fs / hfsplus / include / hfsp.h
diff --git a/qemu/roms/openbios/fs/hfsplus/include/hfsp.h b/qemu/roms/openbios/fs/hfsplus/include/hfsp.h
new file mode 100644 (file)
index 0000000..e916473
--- /dev/null
@@ -0,0 +1,305 @@
+/*
+ * libhfsp - library for reading and writing Macintosh HFS+ volumes
+ *
+ * This file includes definitions for the structures found on
+ * HFS+ Volumes. The structures are further wrapped by struct
+ * found in libhfsp.h. fucntions on those enhanced structures
+ * are found in files mentioned in comments below.
+ *
+ * Copyright (C) 2000 Klaus Halfmann <khalfmann@libra.de>
+ * Original code 1996-1998 by Robert Leslie <rob@mars.rog>
+ * other work 2000 from Brad Boyer (flar@pants.nu)
+ *
+ * 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: hfsp.h,v 1.17 2000/10/20 06:16:52 hasi Exp $
+ */
+
+#define HFSP_BLOCKSZ            512    /* A sector for Apple is always 512 bytes */
+#define HFSP_BLOCKSZ_BITS       9      /* 1<<9 == 512  */
+#define        HFSP_VOLHEAD_SIG        0x482B  /* 'H+' */
+
+/* HFS+ includes POSIX permissions , although marked as reserved they will be
+ * used as such. Is ignored by MacOS 8-9 but probably not by MacOS X.
+ */
+typedef struct {
+        UInt32         owner;
+        UInt32         group;
+        UInt32         mode;
+        UInt32         dev;
+} hfsp_perm;
+
+/* A single contiguous area (fragment) of a file */
+typedef struct {
+        UInt32         start_block;
+        UInt32         block_count;
+} hfsp_extent;
+
+/* A file may contain up to 8 normale extents, all other
+   are found in some extra extent area */
+typedef hfsp_extent hfsp_extent_rec[8];
+
+/* Information for a "Fork" in a file
+ * Forks are the "usual" DATA and RSRC forks or special files
+ * (e.g. the Volume Bitmap)
+ */
+typedef struct {
+        UInt64         total_size;  // logical size
+        UInt32         clump_size;  // number of bytes to preallocate
+        UInt32         total_blocks;
+        hfsp_extent_rec extents;     // initial (8) extents
+} hfsp_fork_raw;
+
+/* HFS+ Volume Header
+ * Always found at block 2 of the disk, a copy is stored
+ * at the second to last block of the disk.
+ */
+typedef struct hfsp_vh {
+        UInt16         signature;   // must be HFSPLUS_VOLHEAD_SIG 'H+'
+        UInt16         version;     // currently 4, ignored
+        UInt32         attributes;  // See bit constants below
+        UInt32         last_mount_vers;
+                // Use a registered creator code here (what do we use ?)
+               // Mac OS uses '8.10' well
+        UInt32         reserved;
+
+        UInt32         create_date; // local time !
+        UInt32         modify_date; // GMT (?)
+        UInt32         backup_date; // GMT (?)
+        UInt32         checked_date; // GMT (?) fsck ?
+
+        UInt32         file_count;
+         // not including special files but including DATA and RSRC forks
+        UInt32         folder_count; // excluding the root folder
+
+        UInt32         blocksize;
+         // must be multiple of HFSPLUS_SECTOR_SIZE,
+         // should be a multiple of 4k for harddisk
+        UInt32         total_blocks;
+        UInt32         free_blocks;
+         // The total number of unused allocation blocks on the disk.
+
+        UInt32         next_alloc;
+         // hint wher to search for next allocation blocks
+        UInt32         rsrc_clump_sz;
+         // default clump size for rsrc forks
+        UInt32         data_clump_sz;
+         // default clump size for data forks
+        UInt32        next_cnid;
+         // next unused catalog id
+        UInt32         write_count;
+         // increment on every mount (and write ?)
+        UInt64        encodings_bmp;
+                // for every encoding used on the disk a bit is set
+                // ignored but eventually must be cared for
+        Char          finder_info[32];
+       hfsp_fork_raw   alloc_file;
+         // stores bitmap of use/free blocks
+        hfsp_fork_raw   ext_file;
+         // stores oferflow extents
+        hfsp_fork_raw   cat_file;
+        // This contains the root directory
+        hfsp_fork_raw   attr_file;
+        hfsp_fork_raw   start_file;
+         // a special startup file may be described here (used by ?)
+} hfsp_vh;
+
+/* HFS+ volume attributes */
+/* 0-6 reserved, may be used in memory only */
+#define HFSPLUS_VOL_RESERVED1 0x000000FF
+#define HFSPLUS_VOL_HARDLOCK  0x00000080 // Used in Memory by finder only
+#define HFSPLUS_VOL_UNMNT     0x00000100
+        // clear this bit when mounting, set as last step of unmounting
+        // This is checked by (slower) ROM code
+#define HFSPLUS_VOL_SPARE_BLK 0x00000200
+#define HFSPLUS_VOL_NOCACHE   0x00000400
+        // in case of RAM or ROM disk (try a HFS+ Ramdisk :)
+#define HFSPLUS_VOL_INCNSTNT  0x00000800
+        // Reverse meaning as of HFSPLUS_VOL_UNMNT
+        // This is checked by (faster) Mac OS code
+/* 12-14 reserved */
+#define HFSPLUS_VOL_RESERVED2 0x00007000
+#define HFSPLUS_VOL_SOFTLOCK  0x00008000
+#define HFSPLUS_VOL_RESERVED3 0xFFFF0000
+
+/* HFS+ Btree node descriptor */
+typedef struct {
+       UInt32      next;   /* pointer to next node of this kind, or 0 */
+       UInt32      prev;   /* pointer to previous node of this kind, or 0 */
+       UInt8       kind;   /* see below */
+       UInt8       height; /* root node starts with 0 */
+       UInt16      num_rec;    /* number of records in this node */
+       UInt16      reserved;   /* fill up to 4 byte alignment */
+} btree_node_desc;
+
+/* HFS+ Btree Node types */
+#define HFSP_NODE_NDX  0x00
+#define HFSP_NODE_HEAD 0x01
+#define HFSP_NODE_MAP  0x02
+#define HFSP_NODE_LEAF 0xFF
+
+#define HFSP_CATALOG_MIN_NODE_SIZE  0x1000
+#define HFSP_ATTRMIN_DOE_SIZE      0x1000
+
+/* The record offsets are found at the end of the fork
+ * containing the Btree */
+
+typedef UInt16 btree_record_offset;
+
+typedef struct {
+        UInt16         depth;
+           // equal to height of btree_node_desc
+        UInt32         root;
+           // root node of the hierarchy
+        UInt32         leaf_count;
+        UInt32         leaf_head;
+        UInt32         leaf_tail;
+        UInt16         node_size;
+           // node size of _all_ nodes in this fork
+        UInt16         max_key_len;
+        UInt32         node_count;
+           // count of all (free and used) nodes in tree
+        UInt32         free_nodes;
+        UInt16         reserved1;
+        UInt32         clump_size;
+         // ignored my MacOS used by ?
+        UInt8         btree_type;
+         // always 0 for HFS+
+        UInt8         reserved2;
+        UInt32         attributes;
+        // see below
+        UInt32         reserved3[16];
+} btree_head;
+
+/* BTree attributes */
+#define HFSPLUS_BAD_CLOSE            0x01
+  // Btree was not properly closed and should be checked
+  // not used for HFS+ but reserved
+#define HFSPLUS_TREE_BIGKEYS         0x02
+  // always set for HFS+
+#define HFSPLUS_TREE_VAR_NDXKEY_SIZE 0x04
+  // use variable length index nodes, always set for catalog btree,
+  // always cleared for extents btree.
+
+#define HFSPLUS_TREE_UNUSED          0xFFFFFFF8
+
+/* Some special File ID numbers */
+#define HFSP_POR_CNID             1  /* Parent Of the Root */
+#define HFSP_ROOT_CNID            2  /* ROOT directory */
+#define HFSP_EXT_CNID             3  /* EXTents B-tree */
+#define HFSP_CAT_CNID             4  /* CATalog B-tree */
+#define HFSP_BAD_CNID             5  /* BAD blocks file */
+#define HFSP_ALLOC_CNID           6  /* ALLOCation file */
+#define HFSP_START_CNID           7  /* STARTup file */
+#define HFSP_ATTR_CNID            8  /* ATTRibutes file  */
+#define HFSP_EXCH_CNID           15  /* ExchangeFiles temp id */
+#define HFPS_MIN_CNID           15  /* Minimum expected value */
+
+/* Unicode String */
+typedef struct {
+    UInt16             strlen;
+    UInt16             name[255];      // unicode charcters
+} hfsp_unistr255;
+
+/* HFS+ catalog entry key */
+typedef struct {
+    UInt16             key_length;     /* excluding length */
+    UInt32             parent_cnid;
+    hfsp_unistr255     name;
+} hfsp_cat_key;
+
+/* HFS+ exnteds entry key */
+typedef struct {
+    UInt16             key_length;     /* excluding length */
+    UInt8              fork_type;      /* Seee below */
+    UInt8              filler;
+    UInt32             file_id;
+    UInt32             start_block;
+} hfsp_extent_key;
+
+#define HFSP_EXTENT_DATA    0x00
+#define HFSP_EXTENT_RSRC    0xFF
+
+/* The key is followed by a record, an index or some other data */
+
+/* The types of these records are defined as follows */
+
+#define HFSP_FOLDER         0x0001  // entry fo a Folder
+#define HFSP_FILE           0x0002  // entry for a File
+#define HFSP_FOLDER_THREAD  0x0003
+    // Like '.' in unix, identifies the folder by its id, only
+#define HFSP_FILE_THREAD    0x0004
+    // Im unsure if this is used by HFS+, too
+
+/* HFS+ folder data (part of an hfsp_cat_entry) */
+typedef struct {
+    UInt16          flags;             /* no flags defined yet */
+    UInt32         valence;            /* Numer of files and folders contained in folder */
+    UInt32         id;
+    UInt32         create_date;        // GMT
+    UInt32         content_mod_date;   // GMT
+    UInt32         attribute_mod_date; // GMT
+    UInt32         access_date;        // GMT
+    UInt32         backup_date;        // GMT
+    hfsp_perm      permissions;
+    DInfo          user_info;
+    DXInfo         finder_info;
+    UInt32         text_encoding;
+        // hint fo the finder what encoding to use, unused here
+    UInt32         reserved;
+} hfsp_cat_folder;
+
+/* HFS+ file data (part of a cat_entry) */
+typedef struct {
+    UInt16          flags;             /* See below */
+    UInt32         reserved1;
+    UInt32         id;
+    UInt32         create_date;
+    UInt32         content_mod_date;
+    UInt32         attribute_mod_date;
+    UInt32         access_date;
+    UInt32         backup_date;
+    hfsp_perm      permissions;
+    FInfo           user_info;
+    FXInfo         finder_info;
+    UInt32         text_encoding;
+    UInt32         reserved2;
+
+    hfsp_fork_raw   data_fork;
+    hfsp_fork_raw   res_fork;
+} hfsp_cat_file;
+
+/* File attribute bits */
+#define HFSP_FILE_LOCKED      0x0001
+#define HFSP_THREAD_EXISTS    0x0002 /* Always set in HFS+ */
+
+/* HFS+ catalog thread (part of a cat_entry) */
+typedef struct {
+    UInt16          reserved;
+    UInt32         parentID;
+    hfsp_unistr255   nodeName;
+} hfsp_cat_thread;
+
+
+/* A data record in the catalog tree */
+typedef struct {
+    UInt16         type;
+    union {
+       hfsp_cat_folder folder;
+       hfsp_cat_file   file;
+       hfsp_cat_thread thread;
+    } u;
+} hfsp_cat_entry;