]> code.delx.au - refind/blobdiff - filesystems/fsw_iso9660.h
Added filesystem drivers.
[refind] / filesystems / fsw_iso9660.h
diff --git a/filesystems/fsw_iso9660.h b/filesystems/fsw_iso9660.h
new file mode 100644 (file)
index 0000000..c1dd94b
--- /dev/null
@@ -0,0 +1,206 @@
+/* $Id: fsw_iso9660.h 29125 2010-05-06 09:43:05Z vboxsync $ */
+/** @file
+ * fsw_iso9660.h - ISO9660 file system driver header.
+ */
+
+/*-
+ * Copyright (c) 2006 Christoph Pfisterer
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the
+ *    distribution.
+ *
+ *  * Neither the name of Christoph Pfisterer nor the names of the
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _FSW_ISO9660_H_
+#define _FSW_ISO9660_H_
+
+#define VOLSTRUCTNAME fsw_iso9660_volume
+#define DNODESTRUCTNAME fsw_iso9660_dnode
+#include "fsw_core.h"
+
+
+//! Block size for ISO9660 volumes.
+#define ISO9660_BLOCKSIZE          2048
+#define ISO9660_BLOCKSIZE_BITS       11
+//! Block number where the ISO9660 superblock resides.
+#define ISO9660_SUPERBLOCK_BLOCKNO   16
+//Slice - we already have shifted blockIO by 16
+//but we should use ParentBlockIo
+//#define ISO9660_SUPERBLOCK_BLOCKNO   0
+
+#pragma pack(1)
+
+typedef struct {
+    fsw_u16     lsb;
+    fsw_u16     msb;
+} iso9660_u16;
+
+typedef struct {
+    fsw_u32     lsb;
+    fsw_u32     msb;
+} iso9660_u32;
+
+#define ISOINT(lsbmsbvalue) ((lsbmsbvalue).lsb)
+
+struct iso9660_dirrec {
+    fsw_u8      dirrec_length;
+    fsw_u8      ear_length;
+    iso9660_u32 extent_location;
+    iso9660_u32 data_length;
+    fsw_u8      recording_datetime[7];
+    fsw_u8      file_flags;
+    fsw_u8      file_unit_size;
+    fsw_u8      interleave_gap_size;
+    iso9660_u16 volume_sequence_number;
+    fsw_u8      file_identifier_length;
+    char        file_identifier[1];
+};
+//#if sizeof(struct fsw_iso9660_dirrec) != 34
+//#fail Structure fsw_iso9660_dirrec has wrong size
+//#endif
+
+struct iso9660_volume_descriptor {
+    fsw_u8      volume_descriptor_type;
+    char        standard_identifier[5];
+    fsw_u8      volume_descriptor_version;
+};
+
+struct iso9660_primary_volume_descriptor {
+    fsw_u8      volume_descriptor_type;
+    char        standard_identifier[5];
+    fsw_u8      volume_descriptor_version;
+    fsw_u8      unused1;
+    char        system_identifier[32];
+    char        volume_identifier[32];
+    fsw_u8      unused2[8];
+    iso9660_u32 volume_space_size;
+    fsw_u8      unused3[4];
+    fsw_u8      escape[3];
+    fsw_u8      unused4[25];
+    iso9660_u16 volume_set_size;
+    iso9660_u16 volume_sequence_number;
+    iso9660_u16 logical_block_size;
+    iso9660_u32 path_table_size;
+    fsw_u32     location_type_l_path_table;
+    fsw_u32     location_optional_type_l_path_table;
+    fsw_u32     location_type_m_path_table;
+    fsw_u32     location_optional_type_m_path_table;
+    struct iso9660_dirrec root_directory;
+    char        volume_set_identifier[128];
+    char        publisher_identifier[128];
+    char        data_preparer_identifier[128];
+    char        application_identifier[128];
+    char        copyright_file_identifier[37];
+    char        abstract_file_identifier[37];
+    char        bibliographic_file_identifier[37];
+    char        volume_creation_datetime[17];
+    char        volume_modification_datetime[17];
+    char        volume_expiration_datetime[17];
+    char        volume_effective_datetime[17];
+    fsw_u8      file_structure_version;
+    fsw_u8      reserved1;
+    fsw_u8      application_use[512];
+    fsw_u8      reserved2[653];
+};
+//#if sizeof(struct fsw_iso9660_volume_descriptor) != 2048
+//#fail Structure fsw_iso9660_volume_descriptor has wrong size
+//#endif
+
+#pragma pack()
+
+struct iso9660_dirrec_buffer {
+    fsw_u32     ino;
+    struct fsw_string name;
+    struct iso9660_dirrec dirrec;
+    char        dirrec_buffer[222];
+};
+
+
+/**
+ * ISO9660: Volume structure with ISO9660-specific data.
+ */
+
+struct fsw_iso9660_volume {
+    struct fsw_volume g;            //!< Generic volume structure
+    /*Note: don't move g!*/
+    int fJoliet;
+    /*Joliet specific fields*/
+    int fRockRidge;
+    /*Rock Ridge specific fields*/
+    int rr_susp_skip;
+
+    struct iso9660_primary_volume_descriptor *primary_voldesc;  //!< Full Primary Volume Descriptor
+};
+
+/**
+ * ISO9660: Dnode structure with ISO9660-specific data.
+ */
+
+struct fsw_iso9660_dnode {
+    struct fsw_dnode g;             //!< Generic dnode structure
+
+    struct iso9660_dirrec dirrec;   //!< Fixed part of the directory record (i.e. w/o name)
+};
+
+
+struct fsw_rock_ridge_susp_entry
+{
+    fsw_u8  sig[2];
+    fsw_u8  len;
+    fsw_u8  ver;
+};
+
+struct fsw_rock_ridge_susp_sp
+{
+    struct fsw_rock_ridge_susp_entry e;
+    fsw_u8  magic[2];
+    fsw_u8  skip;
+};
+
+struct fsw_rock_ridge_susp_nm
+{
+    struct fsw_rock_ridge_susp_entry e;
+    fsw_u8  flags;
+    fsw_u8  name[1];
+};
+
+#define RR_NM_CONT (1<<0)
+#define RR_NM_CURR (1<<1)
+#define RR_NM_PARE (1<<2)
+
+union fsw_rock_ridge_susp_ce
+{
+    struct X{
+        struct fsw_rock_ridge_susp_entry e;
+        iso9660_u32 block_loc;
+        iso9660_u32 offset;
+        iso9660_u32 len;
+    } X;
+    fsw_u8 raw[28];
+};
+
+#endif