--- /dev/null
+/* $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