Blame include/cdio/ecma_167.h

Packit dd8086
/* 
Packit dd8086
    Copyright (c) 2005, 2006, 2008, 2012 Rocky Bernstein <rocky@cpan.org>
Packit dd8086
    Copyright (c) 2001-2002  Ben Fennema <bfennema@falcon.csc.calpoly.edu>
Packit dd8086
Packit dd8086
    This program is free software: you can redistribute it and/or modify
Packit dd8086
    it under the terms of the GNU General Public License as published by
Packit dd8086
    the Free Software Foundation, either version 3 of the License, or
Packit dd8086
    (at your option) any later version.
Packit dd8086
Packit dd8086
    This program is distributed in the hope that it will be useful,
Packit dd8086
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
    GNU General Public License for more details.
Packit dd8086
Packit dd8086
    You should have received a copy of the GNU General Public License
Packit dd8086
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
/*
Packit dd8086
 * Some portions taken from FreeBSD ecma167-udf.h which states:
Packit dd8086
 * Copyright (c) 2001, 2002 Scott Long <scottl@freebsd.org>
Packit dd8086
 * All rights reserved.
Packit dd8086
 *
Packit dd8086
 * Redistribution and use in source and binary forms, with or without
Packit dd8086
 * modification, are permitted provided that the following conditions
Packit dd8086
 * are met:
Packit dd8086
 * 1. Redistributions of source code must retain the above copyright
Packit dd8086
 *    notice, this list of conditions and the following disclaimer.
Packit dd8086
 * 2. Redistributions in binary form must reproduce the above copyright
Packit dd8086
 *    notice, this list of conditions and the following disclaimer in the
Packit dd8086
 *    documentation and/or other materials provided with the distribution.
Packit dd8086
 *
Packit dd8086
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit dd8086
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit dd8086
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit dd8086
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit dd8086
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit dd8086
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit dd8086
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit dd8086
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit dd8086
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit dd8086
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit dd8086
 * SUCH DAMAGE.
Packit dd8086
 */
Packit dd8086
Packit dd8086
/*!
Packit dd8086
 * \file ecma_167.h
Packit dd8086
 *
Packit dd8086
 * \brief Definitions based on ECMA-167 3rd edition (June 1997)
Packit dd8086
 * See http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-167.pdf
Packit dd8086
*/
Packit dd8086
Packit dd8086
#ifndef CDIO_ECMA_167_H
Packit dd8086
#define CDIO_ECMA_167_H 1
Packit dd8086
Packit dd8086
#include <cdio/types.h>
Packit dd8086
Packit dd8086
/**
Packit dd8086
   Imagine the below enum values as \#define'd values rather than
Packit dd8086
   distinct values of an enum.
Packit dd8086
*/
Packit dd8086
typedef enum {
Packit dd8086
  VSD_STD_ID_SIZE    =    5, /** Volume Structure Descriptor (ECMA 167r3 
Packit dd8086
                                2/9.1) */
Packit dd8086
  UDF_REGID_ID_SIZE  =   23, /**< See identifier (ECMA 167r3 1/7.4) */
Packit dd8086
  UDF_VOLID_SIZE     =   32,
Packit dd8086
  UDF_FID_SIZE       =   38,
Packit dd8086
  UDF_VOLSET_ID_SIZE =  128
Packit dd8086
} ecma_167_enum1_t ;
Packit dd8086
Packit dd8086
/** Tag Identifier (ECMA 167r3 3/7.2.1) */
Packit dd8086
Packit dd8086
typedef enum {
Packit dd8086
  TAGID_PRI_VOL          = 0x0001,
Packit dd8086
  TAGID_ANCHOR           = 0x0002,
Packit dd8086
  TAGID_VOL              = 0x0003,
Packit dd8086
  TAGID_IMP_VOL          = 0x0004,
Packit dd8086
  TAGID_PARTITION        = 0x0005,
Packit dd8086
  TAGID_LOGVOL           = 0x0006,
Packit dd8086
  TAGID_UNALLOC_SPACE    = 0x0007,
Packit dd8086
  TAGID_TERM             = 0x0008,
Packit dd8086
  TAGID_LOGVOL_INTEGRITY = 0x0009,
Packit dd8086
  TAGID_FSD              = 0x0100,
Packit dd8086
  TAGID_FID              = 0x0101,
Packit dd8086
  TAGID_AED              = 0x0102,
Packit dd8086
  TAGID_IE               = 0x0103,
Packit dd8086
  TAGID_TE               = 0x0104,
Packit dd8086
  TAGID_FILE_ENTRY       = 0x0105,
Packit dd8086
  TAGID_EAHD             = 0x0106,
Packit dd8086
  TAGID_USE              = 0x0107,
Packit dd8086
  TAGID_SBD              = 0x0108,
Packit dd8086
  TAGID_PIE              = 0x0109,
Packit dd8086
  TAGID_EFE              = 0x010A,
Packit dd8086
} tag_id_t ;
Packit dd8086
Packit dd8086
/** Character Set Type (ECMA 167r3 1/7.2.1.1) */
Packit dd8086
typedef enum {
Packit dd8086
  CHARSPEC_TYPE_CS0 = 0x00,     /**< Section 1/7.2.2 */
Packit dd8086
  CHARSPEC_TYPE_CS1 = 0x01,     /**< Section 1/7.2.3 */
Packit dd8086
  CHARSPEC_TYPE_CS2 = 0x02,     /**< Section 1/7.2.4 */
Packit dd8086
  CHARSPEC_TYPE_CS3 = 0x03,     /**< Section 1/7.2.5 */
Packit dd8086
  CHARSPEC_TYPE_CS4 = 0x04,     /**< Section 1/7.2.6 */
Packit dd8086
  CHARSPEC_TYPE_CS5 = 0x05,     /**< Section 1/7.2.7 */
Packit dd8086
  CHARSPEC_TYPE_CS6 = 0x06,     /**< Section 1/7.2.8 */
Packit dd8086
  CHARSPEC_TYPE_CS7 = 0x07,     /**< Section 1/7.2.9 */
Packit dd8086
Packit dd8086
  CHARSPEC_TYPE_CS8 = 0x08,     /**< Section 1/7.2.10 */
Packit dd8086
} udf_charspec_enum_t;
Packit dd8086
  
Packit dd8086
typedef uint8_t  udf_Uint8_t;  /*! Section 1/7/1.1 */
Packit dd8086
typedef uint16_t udf_Uint16_t; /*! Section 1/7.1.3 */
Packit dd8086
typedef uint32_t udf_Uint32_t; /*! Section 1/7.1.5 */
Packit dd8086
typedef uint64_t udf_Uint64_t; /*! Section 1/7.1.7 */
Packit dd8086
typedef char     udf_dstring;  /*! Section 1/7.1.12 */
Packit dd8086
Packit dd8086
#define UDF_LENGTH_MASK 0x3fffffff
Packit dd8086
Packit dd8086
PRAGMA_BEGIN_PACKED
Packit dd8086
Packit dd8086
/** Character set specification (ECMA 167r3 1/7.2.1) */
Packit dd8086
struct udf_charspec_s
Packit dd8086
{
Packit dd8086
  udf_Uint8_t   charset_type;
Packit dd8086
  udf_Uint8_t   charset_info[63];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_charspec_s udf_charspec_t;
Packit dd8086
Packit dd8086
/** Timestamp (ECMA 167r3 1/7.3) */
Packit dd8086
struct udf_timestamp_s
Packit dd8086
{
Packit dd8086
  udf_Uint16_t          type_tz;
Packit dd8086
  udf_Uint16_t          year;
Packit dd8086
  udf_Uint8_t           month;
Packit dd8086
  udf_Uint8_t           day;
Packit dd8086
  udf_Uint8_t           hour;
Packit dd8086
  udf_Uint8_t           minute;
Packit dd8086
  udf_Uint8_t           second;
Packit dd8086
  udf_Uint8_t           centiseconds;
Packit dd8086
  udf_Uint8_t           hundreds_of_microseconds;
Packit dd8086
  udf_Uint8_t           microseconds;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_timestamp_s udf_timestamp_t;
Packit dd8086
Packit dd8086
/** Type and Time Zone (ECMA 167r3 1/7.3.1) 
Packit dd8086
Packit dd8086
    Imagine the below enum values as \#define'd values rather than
Packit dd8086
    distinct values of an enum.
Packit dd8086
*/
Packit dd8086
typedef enum { 
Packit dd8086
  TIMESTAMP_TYPE_CUT        =   0x0000,
Packit dd8086
  TIMESTAMP_TYPE_LOCAL      =   0x1000,
Packit dd8086
  TIMESTAMP_TYPE_AGREEMENT  =   0x2000,
Packit dd8086
  TIMESTAMP_TYPE_MASK       =   0xF000,
Packit dd8086
  TIMESTAMP_TIMEZONE_MASK   =   0x0FFF,
Packit dd8086
} ecma_167_timezone_enum_t ;
Packit dd8086
Packit dd8086
Packit dd8086
#define TIMESTAMP_TYPE_MASK             0xF000
Packit dd8086
#define TIMESTAMP_TYPE_CUT              0x0000
Packit dd8086
#define TIMESTAMP_TYPE_LOCAL            0x1000
Packit dd8086
#define TIMESTAMP_TYPE_AGREEMENT        0x2000
Packit dd8086
#define TIMESTAMP_TIMEZONE_MASK         0x0FFF
Packit dd8086
Packit dd8086
struct udf_id_suffix_s
Packit dd8086
{
Packit dd8086
  udf_Uint16_t  udf_revision;
Packit dd8086
  udf_Uint8_t   os_class;
Packit dd8086
  udf_Uint8_t   os_identifier;
Packit dd8086
  udf_Uint8_t   reserved[4];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_id_suffix_s udf_id_suffix_t;
Packit dd8086
Packit dd8086
/** Entity identifier (ECMA 167r3 1/7.4) */
Packit dd8086
struct udf_regid_s
Packit dd8086
{
Packit dd8086
  udf_Uint8_t           flags;
Packit dd8086
  udf_Uint8_t           id[UDF_REGID_ID_SIZE];
Packit dd8086
  udf_id_suffix_t       id_suffix;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_regid_s udf_regid_t;
Packit dd8086
Packit dd8086
/** Flags (ECMA 167r3 1/7.4.1) */
Packit dd8086
#define ENTITYID_FLAGS_DIRTY            0x00
Packit dd8086
#define ENTITYID_FLAGS_PROTECTED        0x01
Packit dd8086
Packit dd8086
/** Volume Structure Descriptor (ECMA 167r3 2/9.1) */
Packit dd8086
struct vol_struct_desc_s
Packit dd8086
{
Packit dd8086
  udf_Uint8_t           struct_type;
Packit dd8086
  udf_Uint8_t           std_id[VSD_STD_ID_SIZE];
Packit dd8086
  udf_Uint8_t           struct_version;
Packit dd8086
  udf_Uint8_t           struct_data[2041];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Standard Identifier (EMCA 167r2 2/9.1.2) */
Packit dd8086
#define VSD_STD_ID_NSR02                "NSR02" /* (3/9.1) */
Packit dd8086
Packit dd8086
/** Standard Identifier (ECMA 167r3 2/9.1.2) */
Packit dd8086
Packit dd8086
/* The below const definitions are to faciltate debugging of the
Packit dd8086
   values #define'd below. */
Packit dd8086
extern const char VSD_STD_ID_BEA01[sizeof("BEA01")-1];
Packit dd8086
extern const char VSD_STD_ID_BOOT2[sizeof("BOOT2")-1];
Packit dd8086
extern const char VSD_STD_ID_CD001[sizeof("CD001")-1];
Packit dd8086
extern const char VSD_STD_ID_CDW01[sizeof("CDW02")-1];
Packit dd8086
extern const char VSD_STD_ID_NSR03[sizeof("NSR03")-1];
Packit dd8086
extern const char VSD_STD_ID_TEA01[sizeof("TEA01")-1];
Packit dd8086
Packit dd8086
#define VSD_STD_ID_BEA01                "BEA01" /**< ECMA-167 2/9.2 */
Packit dd8086
#define VSD_STD_ID_BOOT2                "BOOT2" /**< ECMA-167 2/9.4 */
Packit dd8086
#define VSD_STD_ID_CD001                "CD001" /**< ECMA-119 */
Packit dd8086
#define VSD_STD_ID_CDW02                "CDW02" /**< ECMA-168 */
Packit dd8086
#define VSD_STD_ID_NSR02                "NSR02" /**< ECMA-167, 3/9.1 
Packit dd8086
                                               NOTE: ECMA-167, 2nd edition */
Packit dd8086
#define VSD_STD_ID_NSR03                "NSR03" /**< ECMA-167 3/9.1 */
Packit dd8086
#define VSD_STD_ID_TEA01                "TEA01" /**< ECMA-168 2/9.3 */
Packit dd8086
Packit dd8086
/** Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */
Packit dd8086
struct beginning_extended_area_desc_s
Packit dd8086
{
Packit dd8086
  udf_Uint8_t           struct_type;
Packit dd8086
  udf_Uint8_t           std_id[VSD_STD_ID_SIZE];
Packit dd8086
  udf_Uint8_t           struct_version;
Packit dd8086
  udf_Uint8_t           struct_data[2041];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */
Packit dd8086
struct terminating_extended_area_desc_s
Packit dd8086
{
Packit dd8086
  udf_Uint8_t           struct_type;
Packit dd8086
  udf_Uint8_t           std_id[VSD_STD_ID_SIZE];
Packit dd8086
  udf_Uint8_t           struct_version;
Packit dd8086
  udf_Uint8_t           struct_data[2041];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Boot Descriptor (ECMA 167r3 2/9.4) */
Packit dd8086
struct boot_desc_s
Packit dd8086
{
Packit dd8086
  udf_Uint8_t           struct_type;
Packit dd8086
  udf_Uint8_t           std_ident[VSD_STD_ID_SIZE];
Packit dd8086
  udf_Uint8_t           struct_version;
Packit dd8086
  udf_Uint8_t           reserved1;
Packit dd8086
  udf_regid_t           arch_type;
Packit dd8086
  udf_regid_t           boot_ident;
Packit dd8086
  udf_Uint32_t          bool_ext_location;
Packit dd8086
  udf_Uint32_t          bool_ext_length;
Packit dd8086
  udf_Uint64_t          load_address;
Packit dd8086
  udf_Uint64_t          start_address;
Packit dd8086
  udf_timestamp_t       desc_creation_time;
Packit dd8086
  udf_Uint16_t          flags;
Packit dd8086
  udf_Uint8_t           reserved2[32];
Packit dd8086
  udf_Uint8_t           boot_use[1906];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Flags (ECMA 167r3 2/9.4.12) */
Packit dd8086
#define BOOT_FLAGS_ERASE                0x01
Packit dd8086
Packit dd8086
/** Extent Descriptor (ECMA 167r3 3/7.1) */
Packit dd8086
struct udf_extent_ad_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t          len;
Packit dd8086
  udf_Uint32_t          loc;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_extent_ad_s udf_extent_ad_t;
Packit dd8086
Packit dd8086
/** Descriptor Tag (ECMA 167r3 3/7.2) */
Packit dd8086
struct udf_tag_s
Packit dd8086
{
Packit dd8086
  udf_Uint16_t          id;
Packit dd8086
  udf_Uint16_t          desc_version;
Packit dd8086
  udf_Uint8_t           cksum;
Packit dd8086
  udf_Uint8_t           reserved;
Packit dd8086
  udf_Uint16_t          i_serial;
Packit dd8086
  udf_Uint16_t          desc_CRC;
Packit dd8086
  udf_Uint16_t          desc_CRC_len;
Packit dd8086
  udf_Uint32_t          loc;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_tag_s udf_tag_t;
Packit dd8086
Packit dd8086
/** NSR Descriptor (ECMA 167r3 3/9.1) */
Packit dd8086
struct NSR_desc_s
Packit dd8086
{
Packit dd8086
  udf_Uint8_t   struct_type;
Packit dd8086
  udf_Uint8_t   std_id[VSD_STD_ID_SIZE];
Packit dd8086
  udf_Uint8_t   struct_version;
Packit dd8086
  udf_Uint8_t   reserved;
Packit dd8086
  udf_Uint8_t   struct_data[2040];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Primary Volume Descriptor (ECMA 167r3 3/10.1) */
Packit dd8086
struct udf_pvd_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_Uint32_t    vol_desc_seq_num;
Packit dd8086
  udf_Uint32_t    primary_vol_desc_num;
Packit dd8086
  udf_dstring     vol_ident[UDF_VOLID_SIZE];
Packit dd8086
  udf_Uint16_t    vol_seq_num;
Packit dd8086
  udf_Uint16_t    max_vol_seqnum;
Packit dd8086
  udf_Uint16_t    interchange_lvl;
Packit dd8086
  udf_Uint16_t    max_interchange_lvl;
Packit dd8086
  udf_Uint32_t    charset_list;
Packit dd8086
  udf_Uint32_t    max_charset_list;
Packit dd8086
  udf_dstring     volset_id[UDF_VOLSET_ID_SIZE];
Packit dd8086
  udf_charspec_t  desc_charset;
Packit dd8086
  udf_charspec_t  explanatory_charset;
Packit dd8086
  udf_extent_ad_t vol_abstract;
Packit dd8086
  udf_extent_ad_t vol_copyright;
Packit dd8086
  udf_regid_t     app_ident;
Packit dd8086
  udf_timestamp_t recording_time;
Packit dd8086
  udf_regid_t     imp_ident;
Packit dd8086
  udf_Uint8_t     imp_use[64];
Packit dd8086
  udf_Uint32_t    predecessor_vol_desc_seq_location;
Packit dd8086
  udf_Uint16_t    flags;
Packit dd8086
  udf_Uint8_t     reserved[22];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_pvd_s udf_pvd_t;
Packit dd8086
Packit dd8086
/** Flags (ECMA 167r3 3/10.1.21) */
Packit dd8086
#define PVD_FLAGS_VSID_COMMON           0x0001
Packit dd8086
Packit dd8086
/** Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */
Packit dd8086
struct anchor_vol_desc_ptr_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_extent_ad_t main_vol_desc_seq_ext;
Packit dd8086
  udf_extent_ad_t reserve_vol_desc_seq_ext;
Packit dd8086
  udf_Uint8_t     reserved[480];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct anchor_vol_desc_ptr_s anchor_vol_desc_ptr_t;
Packit dd8086
Packit dd8086
/** Volume Descriptor Pointer (ECMA 167r3 3/10.3) */
Packit dd8086
struct vol_desc_ptr_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_Uint32_t    vol_desc_seq_num;
Packit dd8086
  udf_extent_ad_t next_vol_desc_set_ext;
Packit dd8086
  udf_Uint8_t     reserved[484];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */
Packit dd8086
struct imp_use_vol_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t    tag;
Packit dd8086
  udf_Uint32_t vol_desc_seq_num;
Packit dd8086
  udf_regid_t  imp_id;
Packit dd8086
  udf_Uint8_t  imp_use[460];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Partition Descriptor (ECMA 167r3 3/10.5) */
Packit dd8086
struct partition_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t     tag;
Packit dd8086
  udf_Uint32_t  vol_desc_seq_num;
Packit dd8086
  udf_Uint16_t  flags;
Packit dd8086
  udf_Uint16_t  number;             /**< Partition number */
Packit dd8086
  udf_regid_t   contents;
Packit dd8086
  udf_Uint8_t   contents_use[128];
Packit dd8086
  udf_Uint32_t  access_type;
Packit dd8086
  udf_Uint32_t  start_loc;
Packit dd8086
  udf_Uint32_t  part_len;
Packit dd8086
  udf_regid_t   imp_id;
Packit dd8086
  udf_Uint8_t   imp_use[128];
Packit dd8086
  udf_Uint8_t   reserved[156];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct partition_desc_s partition_desc_t;
Packit dd8086
Packit dd8086
/** Partition Flags (ECMA 167r3 3/10.5.3) */
Packit dd8086
#define PD_PARTITION_FLAGS_ALLOC        0x0001
Packit dd8086
Packit dd8086
/** Partition Contents (ECMA 167r2 3/10.5.3) */
Packit dd8086
#define PD_PARTITION_CONTENTS_NSR02     "+NSR02"
Packit dd8086
Packit dd8086
/** Partition Contents (ECMA 167r3 3/10.5.5) */
Packit dd8086
#define PD_PARTITION_CONTENTS_FDC01     "+FDC01"
Packit dd8086
#define PD_PARTITION_CONTENTS_CD001     "+CD001"
Packit dd8086
#define PD_PARTITION_CONTENTS_CDW02     "+CDW02"
Packit dd8086
#define PD_PARTITION_CONTENTS_NSR03     "+NSR03"
Packit dd8086
Packit dd8086
/** Access Type (ECMA 167r3 3/10.5.7) */
Packit dd8086
#define PD_ACCESS_TYPE_NONE             0x00000000
Packit dd8086
#define PD_ACCESS_TYPE_READ_ONLY        0x00000001
Packit dd8086
#define PD_ACCESS_TYPE_WRITE_ONCE       0x00000002
Packit dd8086
#define PD_ACCESS_TYPE_REWRITABLE       0x00000003
Packit dd8086
#define PD_ACCESS_TYPE_OVERWRITABLE     0x00000004
Packit dd8086
Packit dd8086
/** Recorded Address (ECMA 167r3 4/7.1) */
Packit dd8086
struct udf_lb_addr_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  lba;
Packit dd8086
  udf_Uint16_t  partitionReferenceNum;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_lb_addr_s udf_lb_addr_t;
Packit dd8086
Packit dd8086
/** Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
Packit dd8086
struct udf_short_ad_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  len;
Packit dd8086
  udf_Uint32_t  pos;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_short_ad_s udf_short_ad_t;
Packit dd8086
Packit dd8086
/** Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
Packit dd8086
struct udf_long_ad_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  len;
Packit dd8086
  udf_lb_addr_t loc;
Packit dd8086
  udf_Uint8_t   imp_use[6];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_long_ad_s udf_long_ad_t;
Packit dd8086
Packit dd8086
/** Logical Volume Descriptor (ECMA 167r3 3/10.6) */
Packit dd8086
struct logical_vol_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_Uint32_t    seq_num;
Packit dd8086
  udf_charspec_t  desc_charset;
Packit dd8086
  udf_dstring     logvol_id[128];
Packit dd8086
  udf_Uint32_t    logical_blocksize;
Packit dd8086
  udf_regid_t     domain_id;
Packit dd8086
  union {
Packit dd8086
    udf_long_ad_t fsd_loc;
Packit dd8086
    udf_Uint8_t   logvol_content_use[16];
Packit dd8086
  } lvd_use;
Packit dd8086
  udf_Uint8_t     logvol_contents_use[16];
Packit dd8086
  udf_Uint32_t    maptable_len;
Packit dd8086
  udf_Uint32_t    i_partition_maps;
Packit dd8086
  udf_regid_t     imp_id;
Packit dd8086
  udf_Uint8_t     imp_use[128];
Packit dd8086
  udf_extent_ad_t integrity_seq_ext;
Packit dd8086
  udf_Uint8_t     partition_maps[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct logical_vol_desc_s logical_vol_desc_t;
Packit dd8086
Packit dd8086
/** Generic Partition Map (ECMA 167r3 3/10.7.1) */
Packit dd8086
struct generic_partition_map
Packit dd8086
{
Packit dd8086
  udf_Uint8_t   partition_map_type;
Packit dd8086
  udf_Uint8_t   partition_map_length;
Packit dd8086
  udf_Uint8_t   partition_mapping[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Partition Map Type (ECMA 167r3 3/10.7.1.1) */
Packit dd8086
#define GP_PARTITION_MAP_TYPE_UNDEF     0x00
Packit dd8086
#define GP_PARTIITON_MAP_TYPE_1         0x01
Packit dd8086
#define GP_PARTITION_MAP_TYPE_2         0x02
Packit dd8086
Packit dd8086
/** Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
Packit dd8086
struct generic_partition_map1
Packit dd8086
{
Packit dd8086
  udf_Uint8_t   partition_map_type;
Packit dd8086
  udf_Uint8_t   partition_map_length;
Packit dd8086
  udf_Uint16_t  vol_seq_num;
Packit dd8086
  udf_Uint16_t  i_partition;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Type 2 Partition Map (ECMA 167r3 3/10.7.3) */
Packit dd8086
struct generic_partition_map2
Packit dd8086
{
Packit dd8086
  udf_Uint8_t   partition_map_type;
Packit dd8086
  udf_Uint8_t   partition_map_length; 
Packit dd8086
  udf_Uint8_t   partition_id[62];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Unallocated Space Descriptor (ECMA 167r3 3/10.8) */
Packit dd8086
struct unalloc_space_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_Uint32_t    vol_desc_seq_num;
Packit dd8086
  udf_Uint32_t    i_alloc_descs;
Packit dd8086
  udf_extent_ad_t allocDescs[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Terminating Descriptor (ECMA 167r3 3/10.9) */
Packit dd8086
struct terminating_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t    tag;
Packit dd8086
  udf_Uint8_t   reserved[496];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */
Packit dd8086
struct logvol_integrity_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_timestamp_t recording_time;
Packit dd8086
  udf_Uint32_t    integrity_type;
Packit dd8086
  udf_extent_ad_t next_integrity_ext;
Packit dd8086
  udf_Uint8_t     logvol_contents_use[32];
Packit dd8086
  udf_Uint32_t    i_partitions;
Packit dd8086
  union { /* Same MSVC workaround as with struct udf_fileid_desc_s */
Packit dd8086
    udf_Uint32_t  imp_use_len;
Packit dd8086
    struct {
Packit dd8086
      udf_Uint32_t unused;
Packit dd8086
      udf_Uint32_t data[0];
Packit dd8086
    } freespace_table;
Packit dd8086
    struct {
Packit dd8086
      udf_Uint32_t unused;
Packit dd8086
      udf_Uint32_t data[0];
Packit dd8086
    } size_table;
Packit dd8086
    struct {
Packit dd8086
      udf_Uint32_t unused;
Packit dd8086
      udf_Uint32_t data[0];
Packit dd8086
    } imp_use;
Packit dd8086
  } u;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Integrity Type (ECMA 167r3 3/10.10.3) */
Packit dd8086
#define LVID_INTEGRITY_TYPE_OPEN        0x00000000
Packit dd8086
#define LVID_INTEGRITY_TYPE_CLOSE       0x00000001
Packit dd8086
Packit dd8086
/** Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
Packit dd8086
struct udf_ext_ad_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  len;
Packit dd8086
  udf_Uint32_t  recorded_len;
Packit dd8086
  udf_Uint32_t  information_len;
Packit dd8086
  udf_lb_addr_t ext_loc;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_ext_ad_s udf_ext_ad_t;
Packit dd8086
Packit dd8086
/** Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */
Packit dd8086
Packit dd8086
/** Tag Identifier (ECMA 167r3 4/7.2.1) */
Packit dd8086
Packit dd8086
/** File Set Descriptor (ECMA 167r3 4/14.1) */
Packit dd8086
struct udf_fsd_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_timestamp_t recording_time;
Packit dd8086
  udf_Uint16_t    interchange_lvl;
Packit dd8086
  udf_Uint16_t    maxInterchange_lvl;
Packit dd8086
  udf_Uint32_t    charset_list;
Packit dd8086
  udf_Uint32_t    max_charset_list;
Packit dd8086
  udf_Uint32_t    fileset_num;
Packit dd8086
  udf_Uint32_t    udf_fsd_num;
Packit dd8086
  udf_charspec_t  logical_vol_id_charset;
Packit dd8086
  udf_dstring     logical_vol_id[128];
Packit dd8086
  udf_charspec_t  fileset_charset;
Packit dd8086
  udf_dstring     fileSet_id[32];
Packit dd8086
  udf_dstring     copyright_file_id[32];
Packit dd8086
  udf_dstring     abstract_file_id[32];
Packit dd8086
  udf_long_ad_t   root_icb;
Packit dd8086
  udf_regid_t     domain_id;
Packit dd8086
  udf_long_ad_t   next_ext;
Packit dd8086
  udf_long_ad_t   stream_directory_ICB;
Packit dd8086
  udf_Uint8_t     reserved[32];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_fsd_s udf_fsd_t;
Packit dd8086
Packit dd8086
/** Partition Header Descriptor (ECMA 167r3 4/14.3) */
Packit dd8086
struct partition_header_desc_s
Packit dd8086
{
Packit dd8086
  udf_short_ad_t unalloc_space_table;
Packit dd8086
  udf_short_ad_t unalloc_space_bitmap;
Packit dd8086
  udf_short_ad_t partition_integrity_table;
Packit dd8086
  udf_short_ad_t freed_space_table;
Packit dd8086
  udf_short_ad_t freed_space_bitmap;
Packit dd8086
  udf_Uint8_t    reserved[88];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct partition_header_desc_s partition_header_desc_t;
Packit dd8086
Packit dd8086
/** File Identifier Descriptor (ECMA 167r3 4/14.4) */
Packit dd8086
struct udf_fileid_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t     tag;
Packit dd8086
  udf_Uint16_t  file_version_num;
Packit dd8086
  udf_Uint8_t   file_characteristics;
Packit dd8086
  udf_Uint8_t   i_file_id;
Packit dd8086
  udf_long_ad_t icb;
Packit dd8086
  /* MSVC workaround for multiple zero sized arrays
Packit dd8086
     Unlike what is the case with GNU, and against logic, an union of zero
Packit dd8086
     sized arrays in the Microsoft world is not zero bytes but one byte!
Packit dd8086
     Thus, for sizeof() to be consistent across platforms, we must use an
Packit dd8086
     ugly workaround that attaches the union to the last non-zero member. */
Packit dd8086
  union {
Packit dd8086
    udf_Uint16_t        i_imp_use;
Packit dd8086
    struct {
Packit dd8086
      udf_Uint16_t      unused;
Packit dd8086
      udf_Uint8_t       data[0];
Packit dd8086
    } imp_use;
Packit dd8086
    struct {
Packit dd8086
      udf_Uint16_t      unused;
Packit dd8086
      udf_Uint8_t       data[0];
Packit dd8086
    } file_id;
Packit dd8086
    struct {
Packit dd8086
      udf_Uint16_t      unused;
Packit dd8086
      udf_Uint8_t       data[0];
Packit dd8086
    } padding;
Packit dd8086
  } u;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_fileid_desc_s udf_fileid_desc_t;
Packit dd8086
Packit dd8086
/** File Characteristics (ECMA 167r3 4/14.4.3) 
Packit dd8086
Packit dd8086
    Imagine the below enumeration values are \#defines to be used in a
Packit dd8086
    bitmask rather than distinct values of an enum.
Packit dd8086
*/
Packit dd8086
typedef enum {
Packit dd8086
  UDF_FILE_HIDDEN       = (1 << 0),
Packit dd8086
  UDF_FILE_DIRECTORY    = (1 << 1),
Packit dd8086
  UDF_FILE_DELETED      = (1 << 2),
Packit dd8086
  UDF_FILE_PARENT       = (1 << 3),
Packit dd8086
  UDF_FILE_METADATA     = (1 << 4)
Packit dd8086
} file_characteristics_t;
Packit dd8086
Packit dd8086
/** Allocation Ext Descriptor (ECMA 167r3 4/14.5) */
Packit dd8086
struct allocExtDesc
Packit dd8086
{
Packit dd8086
  udf_tag_t    tag;
Packit dd8086
  udf_Uint32_t previous_alloc_ext_loc;
Packit dd8086
  udf_Uint32_t i_alloc_descs;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** ICB Tag (ECMA 167r3 4/14.6) */
Packit dd8086
struct udf_icbtag_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  prev_num_dirs;
Packit dd8086
  udf_Uint16_t  strat_type;
Packit dd8086
  udf_Uint16_t  strat_param;
Packit dd8086
  udf_Uint16_t  max_num_entries;
Packit dd8086
  udf_Uint8_t   reserved;
Packit dd8086
  udf_Uint8_t   file_type;
Packit dd8086
  udf_lb_addr_t parent_ICB;
Packit dd8086
  udf_Uint16_t  flags;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_icbtag_s udf_icbtag_t;
Packit dd8086
Packit dd8086
#define UDF_ICB_TAG_FLAGS_SETUID        0x40
Packit dd8086
#define UDF_ICB_TAG_FLAGS_SETGID        0x80
Packit dd8086
#define UDF_ICB_TAG_FLAGS_STICKY        0x100
Packit dd8086
Packit dd8086
/** Strategy Type (ECMA 167r3 4/14.6.2) which helpfully points
Packit dd8086
    largely to 4/A.x */
Packit dd8086
#define ICBTAG_STRATEGY_TYPE_UNDEF 0x0000 
Packit dd8086
#define ICBTAG_STRATEGY_TYPE_1     0x0001 /**< 4/A.2 Direct entries Uint16 */
Packit dd8086
#define ICBTAG_STRATEGY_TYPE_2     0x0002 /**< 4/A.3 List of ICB direct entries */
Packit dd8086
#define ICBTAG_STRATEGY_TYPE_3     0x0003 /**< 4/A.4 */
Packit dd8086
#define ICBTAG_STRATEGY_TYPE_4     0x0004 /**< 4/A.5 Hierarchy having one
Packit dd8086
                                           single ICB with one direct entry.
Packit dd8086
                                           This is what's most often used.
Packit dd8086
                                          */
Packit dd8086
Packit dd8086
/** File Type (ECMA 167r3 4/14.6.6) 
Packit dd8086
Packit dd8086
   Imagine the below enum values as \#define'd values rather than
Packit dd8086
   distinct values of an enum.
Packit dd8086
*/
Packit dd8086
typedef enum {
Packit dd8086
  ICBTAG_FILE_TYPE_UNDEF =      0x00,
Packit dd8086
  ICBTAG_FILE_TYPE_USE =        0x01,
Packit dd8086
  ICBTAG_FILE_TYPE_PIE =        0x02,
Packit dd8086
  ICBTAG_FILE_TYPE_IE =         0x03,
Packit dd8086
  ICBTAG_FILE_TYPE_DIRECTORY =  0x04,
Packit dd8086
  ICBTAG_FILE_TYPE_REGULAR =    0x05,
Packit dd8086
  ICBTAG_FILE_TYPE_BLOCK =      0x06,
Packit dd8086
  ICBTAG_FILE_TYPE_CHAR =       0x07,
Packit dd8086
  ICBTAG_FILE_TYPE_EA =         0x08,
Packit dd8086
  ICBTAG_FILE_TYPE_FIFO =       0x09,
Packit dd8086
  ICBTAG_FILE_TYPE_SOCKET =     0x0A,
Packit dd8086
  ICBTAG_FILE_TYPE_TE =         0x0B,
Packit dd8086
  ICBTAG_FILE_TYPE_SYMLINK =    0x0C,
Packit dd8086
  ICBTAG_FILE_TYPE_STREAMDIR =  0x0D
Packit dd8086
} icbtag_file_type_enum_t;
Packit dd8086
Packit dd8086
/** Flags (ECMA 167r3 4/14.6.8) */
Packit dd8086
typedef enum {
Packit dd8086
  ICBTAG_FLAG_AD_MASK        =  0x0007, /**< "&" this to get below address
Packit dd8086
                                             flags */
Packit dd8086
  ICBTAG_FLAG_AD_SHORT       =  0x0000, /**< The allocation descriptor
Packit dd8086
                                             field is filled with
Packit dd8086
                                             short_ad's.  If the
Packit dd8086
                                             offset is beyond the
Packit dd8086
                                             current extent, look for
Packit dd8086
                                             the next extent. */
Packit dd8086
  ICBTAG_FLAG_AD_LONG        =  0x0001, /**< The allocation descriptor
Packit dd8086
                                             field is filled with
Packit dd8086
                                             long_ad's If the offset
Packit dd8086
                                             is beyond the current
Packit dd8086
                                             extent, look for the next
Packit dd8086
                                             extent. */
Packit dd8086
  ICBTAG_FLAG_AD_EXTENDED    =  0x0002,
Packit dd8086
  ICBTAG_FLAG_AD_IN_ICB      =  0x0003, /**< This type means that the
Packit dd8086
                                             file *data* is stored in
Packit dd8086
                                             the allocation descriptor
Packit dd8086
                                             field of the file entry. */
Packit dd8086
  ICBTAG_FLAG_SORTED         =  0x0008,
Packit dd8086
  ICBTAG_FLAG_NONRELOCATABLE =  0x0010,
Packit dd8086
  ICBTAG_FLAG_ARCHIVE        =  0x0020,
Packit dd8086
  ICBTAG_FLAG_SETUID         =  0x0040,
Packit dd8086
  ICBTAG_FLAG_SETGID         =  0x0080,
Packit dd8086
  ICBTAG_FLAG_STICKY         =  0x0100,
Packit dd8086
  ICBTAG_FLAG_CONTIGUOUS     =  0x0200,
Packit dd8086
  ICBTAG_FLAG_SYSTEM         =  0x0400,
Packit dd8086
  ICBTAG_FLAG_TRANSFORMED    =  0x0800,
Packit dd8086
  ICBTAG_FLAG_MULTIVERSIONS  =  0x1000,
Packit dd8086
  ICBTAG_FLAG_STREAM =          0x2000
Packit dd8086
} icbtag_flag_enum_t;
Packit dd8086
  
Packit dd8086
/** Indirect Entry (ECMA 167r3 4/14.7) */
Packit dd8086
struct indirect_entry_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_icbtag_t    icb_tag;
Packit dd8086
  udf_long_ad_t   indirect_ICB;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Terminal Entry (ECMA 167r3 4/14.8) */
Packit dd8086
struct terminal_entry_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_icbtag_t    icb_tag;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** File Entry (ECMA 167r3 4/14.9) */
Packit dd8086
struct udf_file_entry_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;                   
Packit dd8086
  udf_icbtag_t    icb_tag;                /**< 4/14.9.2 */
Packit dd8086
  udf_Uint32_t    uid;                    /**< 4/14.9.3 */
Packit dd8086
  udf_Uint32_t    gid;                    /**< 4/14.9.4 */
Packit dd8086
  udf_Uint32_t    permissions;            /**< 4/14.9.5 */
Packit dd8086
  udf_Uint16_t    link_count;             /**< 4/14.9.6 */
Packit dd8086
  udf_Uint8_t     rec_format;             /**< 4/14.9.7 */ 
Packit dd8086
  udf_Uint8_t     rec_disp_attr;          /**< 4/14.9.8 */
Packit dd8086
  udf_Uint32_t    rec_len;                /**< 4/14.9.9 */
Packit dd8086
  udf_Uint64_t    info_len;               /**< 4/14.9.10 */
Packit dd8086
  udf_Uint64_t    logblks_recorded;       /**< 4/14.9.11 */
Packit dd8086
  udf_timestamp_t access_time;            /**< 4/14.9.12 - last access to 
Packit dd8086
                                           any stream of file prior to 
Packit dd8086
                                           recording file entry */
Packit dd8086
  udf_timestamp_t modification_time;      /**< 4/14.9.13 - last access to 
Packit dd8086
                                             modification to any stream of 
Packit dd8086
                                             file */
Packit dd8086
  udf_timestamp_t attribute_time;
Packit dd8086
  udf_Uint32_t    checkpoint;
Packit dd8086
  udf_long_ad_t   ext_attr_ICB;
Packit dd8086
  udf_regid_t     imp_id;
Packit dd8086
  udf_Uint64_t    unique_ID;
Packit dd8086
  udf_Uint32_t    i_extended_attr;
Packit dd8086
  udf_Uint32_t    i_alloc_descs;
Packit dd8086
  /* The following union allows file entry reuse without worrying
Packit dd8086
     about overflows, by ensuring the struct is always the
Packit dd8086
     maximum possible size allowed by the specs: one UDF block. */
Packit dd8086
  union {
Packit dd8086
    udf_Uint8_t   ext_attr[0];
Packit dd8086
    udf_Uint8_t   alloc_descs[0];
Packit dd8086
    udf_Uint8_t   pad_to_one_block[2048-176];
Packit dd8086
  } u;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct udf_file_entry_s udf_file_entry_t;
Packit dd8086
Packit dd8086
#define UDF_FENTRY_SIZE 176
Packit dd8086
#define UDF_FENTRY_PERM_USER_MASK       0x07
Packit dd8086
#define UDF_FENTRY_PERM_GRP_MASK        0xE0
Packit dd8086
#define UDF_FENTRY_PERM_OWNER_MASK      0x1C00
Packit dd8086
Packit dd8086
/** Permissions (ECMA 167r3 4/14.9.5) */
Packit dd8086
#define FE_PERM_O_EXEC                  0x00000001U
Packit dd8086
#define FE_PERM_O_WRITE                 0x00000002U
Packit dd8086
#define FE_PERM_O_READ                  0x00000004U
Packit dd8086
#define FE_PERM_O_CHATTR                0x00000008U
Packit dd8086
#define FE_PERM_O_DELETE                0x00000010U
Packit dd8086
#define FE_PERM_G_EXEC                  0x00000020U
Packit dd8086
#define FE_PERM_G_WRITE                 0x00000040U
Packit dd8086
#define FE_PERM_G_READ                  0x00000080U
Packit dd8086
#define FE_PERM_G_CHATTR                0x00000100U
Packit dd8086
#define FE_PERM_G_DELETE                0x00000200U
Packit dd8086
#define FE_PERM_U_EXEC                  0x00000400U
Packit dd8086
#define FE_PERM_U_WRITE                 0x00000800U
Packit dd8086
#define FE_PERM_U_READ                  0x00001000U
Packit dd8086
#define FE_PERM_U_CHATTR                0x00002000U
Packit dd8086
#define FE_PERM_U_DELETE                0x00004000U
Packit dd8086
Packit dd8086
/** Record Format (ECMA 167r3 4/14.9.7) */
Packit dd8086
#define FE_RECORD_FMT_UNDEF             0x00
Packit dd8086
#define FE_RECORD_FMT_FIXED_PAD         0x01
Packit dd8086
#define FE_RECORD_FMT_FIXED             0x02
Packit dd8086
#define FE_RECORD_FMT_VARIABLE8         0x03
Packit dd8086
#define FE_RECORD_FMT_VARIABLE16        0x04
Packit dd8086
#define FE_RECORD_FMT_VARIABLE16_MSB    0x05
Packit dd8086
#define FE_RECORD_FMT_VARIABLE32        0x06
Packit dd8086
#define FE_RECORD_FMT_PRINT             0x07
Packit dd8086
#define FE_RECORD_FMT_LF                0x08
Packit dd8086
#define FE_RECORD_FMT_CR                0x09
Packit dd8086
#define FE_RECORD_FMT_CRLF              0x0A
Packit dd8086
#define FE_RECORD_FMT_LFCR              0x0B
Packit dd8086
Packit dd8086
/** Record Display Attributes (ECMA 167r3 4/14.9.8) */
Packit dd8086
#define FE_RECORD_DISPLAY_ATTR_UNDEF    0x00
Packit dd8086
#define FE_RECORD_DISPLAY_ATTR_1        0x01
Packit dd8086
#define FE_RECORD_DISPLAY_ATTR_2        0x02
Packit dd8086
#define FE_RECORD_DISPLAY_ATTR_3        0x03
Packit dd8086
Packit dd8086
/** Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */
Packit dd8086
struct extended_attr_header_desc_s
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_Uint32_t    imp_attr_location;
Packit dd8086
  udf_Uint32_t    app_attr_location;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Generic Format (ECMA 167r3 4/14.10.2) */
Packit dd8086
struct generic_format_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint8_t   attrData[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Character Set Information (ECMA 167r3 4/14.10.3) */
Packit dd8086
struct charSet_info_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint32_t  escapeSeqLength;
Packit dd8086
  udf_Uint8_t   charSetType;
Packit dd8086
  udf_Uint8_t   escapeSeq[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/* Alternate Permissions (ECMA 167r3 4/14.10.4) */
Packit dd8086
struct alt_perms_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint16_t  owner_id;
Packit dd8086
  udf_Uint16_t  group_id;
Packit dd8086
  udf_Uint16_t  permission;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** File Times Extended Attribute (ECMA 167r3 4/14.10.5) */
Packit dd8086
struct filetimes_ext_attr_s
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint32_t  dataLength;
Packit dd8086
  udf_Uint32_t  fileTimeExistence;
Packit dd8086
  udf_Uint8_t   fileTimes;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** FileTimeExistence (ECMA 167r3 4/14.10.5.6) */
Packit dd8086
#define FTE_CREATION                    0x00000001
Packit dd8086
#define FTE_DELETION                    0x00000004
Packit dd8086
#define FTE_EFFECTIVE                   0x00000008
Packit dd8086
#define FTE_BACKUP                      0x00000002
Packit dd8086
Packit dd8086
/** Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */
Packit dd8086
struct infoTimesExtAttr
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint32_t  dataLength;
Packit dd8086
  udf_Uint32_t  infoTimeExistence;
Packit dd8086
  udf_Uint8_t   infoTimes[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Device Specification (ECMA 167r3 4/14.10.7) */
Packit dd8086
struct deviceSpec
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint32_t  imp_useLength;
Packit dd8086
  udf_Uint32_t  majorDevice_id;
Packit dd8086
  udf_Uint32_t  minorDevice_id;
Packit dd8086
  udf_Uint8_t   imp_use[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */
Packit dd8086
struct impUseExtAttr
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint32_t  imp_useLength;
Packit dd8086
  udf_regid_t   imp_id;
Packit dd8086
  udf_Uint8_t   imp_use[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */
Packit dd8086
struct appUseExtAttr
Packit dd8086
{
Packit dd8086
  udf_Uint32_t  attr_type;
Packit dd8086
  udf_Uint8_t   attr_subtype;
Packit dd8086
  udf_Uint8_t   reserved[3];
Packit dd8086
  udf_Uint32_t  attrLength;
Packit dd8086
  udf_Uint32_t  appUseLength;
Packit dd8086
  udf_regid_t   app_id;
Packit dd8086
  udf_Uint8_t   appUse[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
#define EXTATTR_CHAR_SET                1
Packit dd8086
#define EXTATTR_ALT_PERMS               3
Packit dd8086
#define EXTATTR_FILE_TIMES              5
Packit dd8086
#define EXTATTR_INFO_TIMES              6
Packit dd8086
#define EXTATTR_DEV_SPEC                12
Packit dd8086
#define EXTATTR_IMP_USE                 2048
Packit dd8086
#define EXTATTR_APP_USE                 65536
Packit dd8086
Packit dd8086
Packit dd8086
/** Unallocated Space Entry (ECMA 167r3 4/14.11) */
Packit dd8086
struct unallocSpaceEntry
Packit dd8086
{
Packit dd8086
  udf_tag_t     tag;
Packit dd8086
  udf_icbtag_t  icb_tag;
Packit dd8086
  udf_Uint32_t  lengthAllocDescs;
Packit dd8086
  udf_Uint8_t   allocDescs[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Space Bitmap Descriptor (ECMA 167r3 4/14.12) */
Packit dd8086
struct spaceBitmapDesc
Packit dd8086
{
Packit dd8086
  udf_tag_t     tag;
Packit dd8086
  udf_Uint32_t  i_bits;
Packit dd8086
  udf_Uint32_t  i_bytes;
Packit dd8086
  udf_Uint8_t   bitmap[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Partition Integrity Entry (ECMA 167r3 4/14.13) */
Packit dd8086
struct partitionIntegrityEntry
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;
Packit dd8086
  udf_icbtag_t    icb_tag;
Packit dd8086
  udf_timestamp_t recording_time;
Packit dd8086
  udf_Uint8_t     integrityType;
Packit dd8086
  udf_Uint8_t     reserved[175];
Packit dd8086
  udf_regid_t     imp_id;
Packit dd8086
  udf_Uint8_t     imp_use[256];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
Packit dd8086
Packit dd8086
/** Extent Length (ECMA 167r3 4/14.14.1.1) */
Packit dd8086
#define EXT_RECORDED_ALLOCATED          0x00000000
Packit dd8086
#define EXT_NOT_RECORDED_ALLOCATED      0x40000000
Packit dd8086
#define EXT_NOT_RECORDED_NOT_ALLOCATED  0x80000000
Packit dd8086
#define EXT_NEXT_EXTENT_ALLOCDECS       0xC0000000
Packit dd8086
Packit dd8086
/** Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
Packit dd8086
Packit dd8086
/** Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
Packit dd8086
Packit dd8086
/** Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */
Packit dd8086
struct logical_vol_header_desc_s 
Packit dd8086
{
Packit dd8086
  udf_Uint64_t  uniqueID;
Packit dd8086
  udf_Uint8_t   reserved[24];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
typedef struct logical_vol_header_desc_s logical_vol_header_desc_t;
Packit dd8086
Packit dd8086
/** Path Component (ECMA 167r3 4/14.16.1) */
Packit dd8086
struct pathComponent
Packit dd8086
{
Packit dd8086
  udf_Uint8_t   component_type;
Packit dd8086
  udf_Uint8_t   lengthComponent_id;
Packit dd8086
  udf_Uint16_t  componentFileVersionNum;
Packit dd8086
  udf_dstring   component_id[0];
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
/** File Entry (ECMA 167r3 4/14.17) */
Packit dd8086
struct extended_file_entry
Packit dd8086
{
Packit dd8086
  udf_tag_t       tag;                     /**< 4/14.17.1 - id = 266  */
Packit dd8086
  udf_icbtag_t    icb_tag;                 /**< 4/14.17.2  & 4/14.9.2 */
Packit dd8086
  udf_Uint32_t    uid;                     /**< 4/14.17.3  & 4/14.9.3 */
Packit dd8086
  udf_Uint32_t    gid;                     /**< 4/14.17.4  & 4/14.9.4 */
Packit dd8086
  udf_Uint32_t    permissions;             /**< 4/14.17.5  & 4/14.9.5 */
Packit dd8086
  udf_Uint16_t    link_count;              /**< 4/14.17.6  & 4/14.9.6 */
Packit dd8086
  udf_Uint8_t     rec_format;              /**< 4/14.17.7  & 4/14.9.7 */
Packit dd8086
  udf_Uint8_t     rec_display_attr;        /**< 4/14.17.8  & 4/14.9.8 */
Packit dd8086
  udf_Uint32_t    record_len;              /**< 4/14.17.9  & 4/14.9.9 */
Packit dd8086
  udf_Uint64_t    info_len;                /**< 4/14.17.10 & 4/14.9.10 */
Packit dd8086
  udf_Uint64_t    object_size;             /**< 4/14.17.11 */
Packit dd8086
  udf_Uint64_t    logblks_recorded;        /**< 4/14.17.12 & 4/14.9.11 */
Packit dd8086
  udf_timestamp_t access_time;             /**< 4/14.17.13 & 4/14.9.12 - last 
Packit dd8086
                                              access to any stream of file */
Packit dd8086
  udf_timestamp_t modification_time;       /**< 4/14.17.14 & 4/14.9.13 - last
Packit dd8086
                                              modification to any stream of 
Packit dd8086
                                              file*/
Packit dd8086
  udf_timestamp_t create_time;             /**< 4/14.17.15 */
Packit dd8086
  udf_timestamp_t attribute_time;          /**< 4/14.17.16 & 4/14.9.14 - 
Packit dd8086
                                              most recent create or modify 
Packit dd8086
                                              time */
Packit dd8086
  udf_Uint32_t    checkpoint;
Packit dd8086
  udf_Uint32_t    reserved;                /**< #00 bytes */
Packit dd8086
  udf_long_ad_t   ext_attr_ICB;
Packit dd8086
  udf_long_ad_t   stream_directory_ICB;
Packit dd8086
  udf_regid_t     imp_id;
Packit dd8086
  udf_Uint64_t    unique_ID;
Packit dd8086
  udf_Uint32_t    length_extended_attr;
Packit dd8086
  udf_Uint32_t    length_alloc_descs;
Packit dd8086
  union { /* MSVC workaround for multiple zero sized arrays */
Packit dd8086
    udf_Uint8_t   ext_attr[0];
Packit dd8086
    udf_Uint8_t   alloc_descs[0];
Packit dd8086
        udf_Uint8_t       pad_to_one_block[2048-216];
Packit dd8086
  } u;
Packit dd8086
} GNUC_PACKED;
Packit dd8086
Packit dd8086
PRAGMA_END_PACKED
Packit dd8086
Packit dd8086
/** The below variables are trickery to force the above enum symbol
Packit dd8086
    values to be recorded in debug symbol tables. They are used to
Packit dd8086
    allow one refer to the enumeration value names in the typedefs
Packit dd8086
    above in a debugger and in debugger expressions.
Packit dd8086
*/
Packit dd8086
extern tag_id_t                 debug_tagid;
Packit dd8086
extern file_characteristics_t   debug_file_characteristics;
Packit dd8086
extern icbtag_file_type_enum_t  debug_icbtag_file_type_enum;
Packit dd8086
extern icbtag_flag_enum_t       debug_flag_enum;
Packit dd8086
extern ecma_167_enum1_t         debug_ecma_167_enum1;
Packit dd8086
extern ecma_167_timezone_enum_t debug_ecma_167_timezone_enum;
Packit dd8086
  
Packit dd8086
#endif /* CDIO_ECMA_167_H */