2005-04-17 02:20:36 +04:00
/*
* ecma_167 . h
*
* This file is based on ECMA - 167 3 rd edition ( June 1997 )
* http : //www.ecma.ch
*
* Copyright ( c ) 2001 - 2002 Ben Fennema < bfennema @ falcon . csc . calpoly . edu >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions , and the following disclaimer ,
* without modification .
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* Alternatively , this software may be distributed under the terms of the
* GNU Public License ( " GPL " ) .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 .
*/
# include <linux/types.h>
# ifndef _ECMA_167_H
# define _ECMA_167_H 1
/* Character set specification (ECMA 167r3 1/7.2.1) */
2008-10-15 14:28:03 +04:00
struct charspec {
2007-07-21 15:37:18 +04:00
uint8_t charSetType ;
uint8_t charSetInfo [ 63 ] ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* Character Set Type (ECMA 167r3 1/7.2.1.1) */
# define CHARSPEC_TYPE_CS0 0x00 /* (1/7.2.2) */
# define CHARSPEC_TYPE_CS1 0x01 /* (1/7.2.3) */
# define CHARSPEC_TYPE_CS2 0x02 /* (1/7.2.4) */
# define CHARSPEC_TYPE_CS3 0x03 /* (1/7.2.5) */
# define CHARSPEC_TYPE_CS4 0x04 /* (1/7.2.6) */
# define CHARSPEC_TYPE_CS5 0x05 /* (1/7.2.7) */
# define CHARSPEC_TYPE_CS6 0x06 /* (1/7.2.8) */
# define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */
# define CHARSPEC_TYPE_CS8 0x08 /* (1/7.2.10) */
2007-07-21 15:37:18 +04:00
typedef uint8_t dstring ;
2005-04-17 02:20:36 +04:00
/* Timestamp (ECMA 167r3 1/7.3) */
2008-10-15 14:28:03 +04:00
struct timestamp {
2007-07-21 15:37:18 +04:00
__le16 typeAndTimezone ;
__le16 year ;
uint8_t month ;
uint8_t day ;
uint8_t hour ;
uint8_t minute ;
uint8_t second ;
uint8_t centiseconds ;
uint8_t hundredsOfMicroseconds ;
uint8_t microseconds ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* Type and Time Zone (ECMA 167r3 1/7.3.1) */
# define TIMESTAMP_TYPE_MASK 0xF000
# define TIMESTAMP_TYPE_CUT 0x0000
# define TIMESTAMP_TYPE_LOCAL 0x1000
# define TIMESTAMP_TYPE_AGREEMENT 0x2000
# define TIMESTAMP_TIMEZONE_MASK 0x0FFF
/* Entity identifier (ECMA 167r3 1/7.4) */
2008-10-15 14:28:03 +04:00
struct regid {
2007-07-21 15:37:18 +04:00
uint8_t flags ;
uint8_t ident [ 23 ] ;
uint8_t identSuffix [ 8 ] ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* Flags (ECMA 167r3 1/7.4.1) */
# define ENTITYID_FLAGS_DIRTY 0x00
# define ENTITYID_FLAGS_PROTECTED 0x01
/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
# define VSD_STD_ID_LEN 5
2007-07-19 12:47:43 +04:00
struct volStructDesc {
2007-07-21 15:37:18 +04:00
uint8_t structType ;
uint8_t stdIdent [ VSD_STD_ID_LEN ] ;
uint8_t structVersion ;
uint8_t structData [ 2041 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Standard Identifier (EMCA 167r2 2/9.1.2) */
# define VSD_STD_ID_NSR02 "NSR02" /* (3/9.1) */
/* Standard Identifier (ECMA 167r3 2/9.1.2) */
# define VSD_STD_ID_BEA01 "BEA01" /* (2/9.2) */
# define VSD_STD_ID_BOOT2 "BOOT2" /* (2/9.4) */
# define VSD_STD_ID_CD001 "CD001" /* (ECMA-119) */
# define VSD_STD_ID_CDW02 "CDW02" /* (ECMA-168) */
# define VSD_STD_ID_NSR03 "NSR03" /* (3/9.1) */
# define VSD_STD_ID_TEA01 "TEA01" /* (2/9.3) */
/* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */
2007-07-19 12:47:43 +04:00
struct beginningExtendedAreaDesc {
2007-07-21 15:37:18 +04:00
uint8_t structType ;
uint8_t stdIdent [ VSD_STD_ID_LEN ] ;
uint8_t structVersion ;
uint8_t structData [ 2041 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */
2007-07-19 12:47:43 +04:00
struct terminatingExtendedAreaDesc {
2007-07-21 15:37:18 +04:00
uint8_t structType ;
uint8_t stdIdent [ VSD_STD_ID_LEN ] ;
uint8_t structVersion ;
uint8_t structData [ 2041 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Boot Descriptor (ECMA 167r3 2/9.4) */
2007-07-19 12:47:43 +04:00
struct bootDesc {
2008-10-15 14:28:03 +04:00
uint8_t structType ;
uint8_t stdIdent [ VSD_STD_ID_LEN ] ;
uint8_t structVersion ;
uint8_t reserved1 ;
struct regid archType ;
struct regid bootIdent ;
__le32 bootExtLocation ;
__le32 bootExtLength ;
__le64 loadAddress ;
__le64 startAddress ;
struct timestamp descCreationDateAndTime ;
__le16 flags ;
uint8_t reserved2 [ 32 ] ;
uint8_t bootUse [ 1906 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Flags (ECMA 167r3 2/9.4.12) */
# define BOOT_FLAGS_ERASE 0x01
/* Extent Descriptor (ECMA 167r3 3/7.1) */
2008-10-15 14:28:03 +04:00
struct extent_ad {
2007-07-21 15:37:18 +04:00
__le32 extLength ;
__le32 extLocation ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
2008-10-15 14:28:03 +04:00
struct kernel_extent_ad {
2007-07-21 15:37:18 +04:00
uint32_t extLength ;
uint32_t extLocation ;
2008-10-15 14:28:03 +04:00
} ;
2005-04-17 02:20:36 +04:00
/* Descriptor Tag (ECMA 167r3 3/7.2) */
2008-10-15 14:28:03 +04:00
struct tag {
2007-07-21 15:37:18 +04:00
__le16 tagIdent ;
__le16 descVersion ;
uint8_t tagChecksum ;
uint8_t reserved ;
__le16 tagSerialNum ;
__le16 descCRC ;
__le16 descCRCLength ;
__le32 tagLocation ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* Tag Identifier (ECMA 167r3 3/7.2.1) */
# define TAG_IDENT_PVD 0x0001
# define TAG_IDENT_AVDP 0x0002
# define TAG_IDENT_VDP 0x0003
# define TAG_IDENT_IUVD 0x0004
# define TAG_IDENT_PD 0x0005
# define TAG_IDENT_LVD 0x0006
# define TAG_IDENT_USD 0x0007
# define TAG_IDENT_TD 0x0008
# define TAG_IDENT_LVID 0x0009
/* NSR Descriptor (ECMA 167r3 3/9.1) */
2007-07-19 12:47:43 +04:00
struct NSRDesc {
2007-07-21 15:37:18 +04:00
uint8_t structType ;
uint8_t stdIdent [ VSD_STD_ID_LEN ] ;
uint8_t structVersion ;
uint8_t reserved ;
uint8_t structData [ 2040 ] ;
2007-07-19 12:47:43 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */
2007-07-19 12:47:43 +04:00
struct primaryVolDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
__le32 volDescSeqNum ;
__le32 primaryVolDescNum ;
dstring volIdent [ 32 ] ;
__le16 volSeqNum ;
__le16 maxVolSeqNum ;
__le16 interchangeLvl ;
__le16 maxInterchangeLvl ;
__le32 charSetList ;
__le32 maxCharSetList ;
dstring volSetIdent [ 128 ] ;
struct charspec descCharSet ;
struct charspec explanatoryCharSet ;
struct extent_ad volAbstract ;
struct extent_ad volCopyright ;
struct regid appIdent ;
struct timestamp recordingDateAndTime ;
struct regid impIdent ;
uint8_t impUse [ 64 ] ;
__le32 predecessorVolDescSeqLocation ;
__le16 flags ;
uint8_t reserved [ 22 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Flags (ECMA 167r3 3/10.1.21) */
# define PVD_FLAGS_VSID_COMMON 0x0001
/* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */
2007-07-19 12:47:43 +04:00
struct anchorVolDescPtr {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct extent_ad mainVolDescSeqExt ;
struct extent_ad reserveVolDescSeqExt ;
uint8_t reserved [ 480 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */
2007-07-19 12:47:43 +04:00
struct volDescPtr {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
__le32 volDescSeqNum ;
struct extent_ad nextVolDescSeqExt ;
uint8_t reserved [ 484 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */
2007-07-19 12:47:43 +04:00
struct impUseVolDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
2007-07-21 15:37:18 +04:00
__le32 volDescSeqNum ;
2008-10-15 14:28:03 +04:00
struct regid impIdent ;
2007-07-21 15:37:18 +04:00
uint8_t impUse [ 460 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Partition Descriptor (ECMA 167r3 3/10.5) */
2007-07-19 12:47:43 +04:00
struct partitionDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
2007-07-19 12:47:43 +04:00
__le32 volDescSeqNum ;
__le16 partitionFlags ;
__le16 partitionNumber ;
2008-10-15 14:28:03 +04:00
struct regid partitionContents ;
2007-07-19 12:47:43 +04:00
uint8_t partitionContentsUse [ 128 ] ;
__le32 accessType ;
__le32 partitionStartingLocation ;
__le32 partitionLength ;
2008-10-15 14:28:03 +04:00
struct regid impIdent ;
2007-07-19 12:47:43 +04:00
uint8_t impUse [ 128 ] ;
uint8_t reserved [ 156 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Partition Flags (ECMA 167r3 3/10.5.3) */
# define PD_PARTITION_FLAGS_ALLOC 0x0001
/* Partition Contents (ECMA 167r2 3/10.5.3) */
# define PD_PARTITION_CONTENTS_NSR02 "+NSR02"
/* Partition Contents (ECMA 167r3 3/10.5.5) */
# define PD_PARTITION_CONTENTS_FDC01 "+FDC01"
# define PD_PARTITION_CONTENTS_CD001 "+CD001"
# define PD_PARTITION_CONTENTS_CDW02 "+CDW02"
# define PD_PARTITION_CONTENTS_NSR03 "+NSR03"
/* Access Type (ECMA 167r3 3/10.5.7) */
# define PD_ACCESS_TYPE_NONE 0x00000000
# define PD_ACCESS_TYPE_READ_ONLY 0x00000001
# define PD_ACCESS_TYPE_WRITE_ONCE 0x00000002
# define PD_ACCESS_TYPE_REWRITABLE 0x00000003
# define PD_ACCESS_TYPE_OVERWRITABLE 0x00000004
/* Logical Volume Descriptor (ECMA 167r3 3/10.6) */
2007-07-19 12:47:43 +04:00
struct logicalVolDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
__le32 volDescSeqNum ;
struct charspec descCharSet ;
dstring logicalVolIdent [ 128 ] ;
__le32 logicalBlockSize ;
struct regid domainIdent ;
uint8_t logicalVolContentsUse [ 16 ] ;
__le32 mapTableLength ;
__le32 numPartitionMaps ;
struct regid impIdent ;
uint8_t impUse [ 128 ] ;
struct extent_ad integritySeqExt ;
uint8_t partitionMaps [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Generic Partition Map (ECMA 167r3 3/10.7.1) */
2007-07-19 12:47:43 +04:00
struct genericPartitionMap {
2007-07-21 15:37:18 +04:00
uint8_t partitionMapType ;
uint8_t partitionMapLength ;
uint8_t partitionMapping [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */
# define GP_PARTITION_MAP_TYPE_UNDEF 0x00
# define GP_PARTIITON_MAP_TYPE_1 0x01
# define GP_PARTITION_MAP_TYPE_2 0x02
/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
2007-07-19 12:47:43 +04:00
struct genericPartitionMap1 {
2007-07-21 15:37:18 +04:00
uint8_t partitionMapType ;
uint8_t partitionMapLength ;
__le16 volSeqNum ;
__le16 partitionNum ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */
2007-07-19 12:47:43 +04:00
struct genericPartitionMap2 {
2007-07-21 15:37:18 +04:00
uint8_t partitionMapType ;
uint8_t partitionMapLength ;
uint8_t partitionIdent [ 62 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */
2007-07-19 12:47:43 +04:00
struct unallocSpaceDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
__le32 volDescSeqNum ;
__le32 numAllocDescs ;
struct extent_ad allocDescs [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Terminating Descriptor (ECMA 167r3 3/10.9) */
2007-07-19 12:47:43 +04:00
struct terminatingDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
2007-07-21 15:37:18 +04:00
uint8_t reserved [ 496 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */
2007-07-19 12:47:43 +04:00
struct logicalVolIntegrityDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct timestamp recordingDateAndTime ;
__le32 integrityType ;
struct extent_ad nextIntegrityExt ;
uint8_t logicalVolContentsUse [ 32 ] ;
__le32 numOfPartitions ;
__le32 lengthOfImpUse ;
__le32 freeSpaceTable [ 0 ] ;
__le32 sizeTable [ 0 ] ;
uint8_t impUse [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Integrity Type (ECMA 167r3 3/10.10.3) */
# define LVID_INTEGRITY_TYPE_OPEN 0x00000000
# define LVID_INTEGRITY_TYPE_CLOSE 0x00000001
/* Recorded Address (ECMA 167r3 4/7.1) */
2008-10-15 14:28:03 +04:00
struct lb_addr {
2007-07-21 15:37:18 +04:00
__le32 logicalBlockNum ;
__le16 partitionReferenceNum ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* ... and its in-core analog */
2008-10-15 14:28:03 +04:00
struct kernel_lb_addr {
2007-07-21 15:37:18 +04:00
uint32_t logicalBlockNum ;
uint16_t partitionReferenceNum ;
2008-10-15 14:28:03 +04:00
} ;
2005-04-17 02:20:36 +04:00
/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
2008-10-15 14:28:03 +04:00
struct short_ad {
2007-07-21 15:37:18 +04:00
__le32 extLength ;
__le32 extPosition ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
2008-10-15 14:28:03 +04:00
struct long_ad {
2007-07-21 15:37:18 +04:00
__le32 extLength ;
2008-10-15 14:28:03 +04:00
struct lb_addr extLocation ;
2007-07-21 15:37:18 +04:00
uint8_t impUse [ 6 ] ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
2008-10-15 14:28:03 +04:00
struct kernel_long_ad {
uint32_t extLength ;
struct kernel_lb_addr extLocation ;
uint8_t impUse [ 6 ] ;
} ;
2005-04-17 02:20:36 +04:00
/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
2008-10-15 14:28:03 +04:00
struct ext_ad {
2007-07-21 15:37:18 +04:00
__le32 extLength ;
__le32 recordedLength ;
__le32 informationLength ;
2008-10-15 14:28:03 +04:00
struct lb_addr extLocation ;
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
2008-10-15 14:28:03 +04:00
struct kernel_ext_ad {
uint32_t extLength ;
uint32_t recordedLength ;
uint32_t informationLength ;
struct kernel_lb_addr extLocation ;
} ;
2005-04-17 02:20:36 +04:00
/* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */
/* Tag Identifier (ECMA 167r3 4/7.2.1) */
# define TAG_IDENT_FSD 0x0100
# define TAG_IDENT_FID 0x0101
# define TAG_IDENT_AED 0x0102
# define TAG_IDENT_IE 0x0103
# define TAG_IDENT_TE 0x0104
# define TAG_IDENT_FE 0x0105
# define TAG_IDENT_EAHD 0x0106
# define TAG_IDENT_USE 0x0107
# define TAG_IDENT_SBD 0x0108
# define TAG_IDENT_PIE 0x0109
# define TAG_IDENT_EFE 0x010A
/* File Set Descriptor (ECMA 167r3 4/14.1) */
2007-07-19 12:47:43 +04:00
struct fileSetDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct timestamp recordingDateAndTime ;
__le16 interchangeLvl ;
__le16 maxInterchangeLvl ;
__le32 charSetList ;
__le32 maxCharSetList ;
__le32 fileSetNum ;
__le32 fileSetDescNum ;
struct charspec logicalVolIdentCharSet ;
dstring logicalVolIdent [ 128 ] ;
struct charspec fileSetCharSet ;
dstring fileSetIdent [ 32 ] ;
dstring copyrightFileIdent [ 32 ] ;
dstring abstractFileIdent [ 32 ] ;
struct long_ad rootDirectoryICB ;
struct regid domainIdent ;
struct long_ad nextExt ;
struct long_ad streamDirectoryICB ;
uint8_t reserved [ 32 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Partition Header Descriptor (ECMA 167r3 4/14.3) */
2007-07-19 12:47:43 +04:00
struct partitionHeaderDesc {
2008-10-15 14:28:03 +04:00
struct short_ad unallocSpaceTable ;
struct short_ad unallocSpaceBitmap ;
struct short_ad partitionIntegrityTable ;
struct short_ad freedSpaceTable ;
struct short_ad freedSpaceBitmap ;
2007-07-21 15:37:18 +04:00
uint8_t reserved [ 88 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* File Identifier Descriptor (ECMA 167r3 4/14.4) */
2007-07-19 12:47:43 +04:00
struct fileIdentDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
2007-07-21 15:37:18 +04:00
__le16 fileVersionNum ;
uint8_t fileCharacteristics ;
uint8_t lengthFileIdent ;
2008-10-15 14:28:03 +04:00
struct long_ad icb ;
2007-07-21 15:37:18 +04:00
__le16 lengthOfImpUse ;
uint8_t impUse [ 0 ] ;
uint8_t fileIdent [ 0 ] ;
uint8_t padding [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* File Characteristics (ECMA 167r3 4/14.4.3) */
# define FID_FILE_CHAR_HIDDEN 0x01
# define FID_FILE_CHAR_DIRECTORY 0x02
# define FID_FILE_CHAR_DELETED 0x04
# define FID_FILE_CHAR_PARENT 0x08
# define FID_FILE_CHAR_METADATA 0x10
/* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */
2007-07-19 12:47:43 +04:00
struct allocExtDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
2007-07-21 15:37:18 +04:00
__le32 previousAllocExtLocation ;
__le32 lengthAllocDescs ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* ICB Tag (ECMA 167r3 4/14.6) */
2008-10-15 14:28:03 +04:00
struct icbtag {
2007-07-21 15:37:18 +04:00
__le32 priorRecordedNumDirectEntries ;
__le16 strategyType ;
__le16 strategyParameter ;
__le16 numEntries ;
uint8_t reserved ;
uint8_t fileType ;
2008-10-15 14:28:03 +04:00
struct lb_addr parentICBLocation ;
2007-07-21 15:37:18 +04:00
__le16 flags ;
2008-10-15 14:28:03 +04:00
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/* Strategy Type (ECMA 167r3 4/14.6.2) */
# define ICBTAG_STRATEGY_TYPE_UNDEF 0x0000
# define ICBTAG_STRATEGY_TYPE_1 0x0001
# define ICBTAG_STRATEGY_TYPE_2 0x0002
# define ICBTAG_STRATEGY_TYPE_3 0x0003
# define ICBTAG_STRATEGY_TYPE_4 0x0004
/* File Type (ECMA 167r3 4/14.6.6) */
# define ICBTAG_FILE_TYPE_UNDEF 0x00
# define ICBTAG_FILE_TYPE_USE 0x01
# define ICBTAG_FILE_TYPE_PIE 0x02
# define ICBTAG_FILE_TYPE_IE 0x03
# define ICBTAG_FILE_TYPE_DIRECTORY 0x04
# define ICBTAG_FILE_TYPE_REGULAR 0x05
# define ICBTAG_FILE_TYPE_BLOCK 0x06
# define ICBTAG_FILE_TYPE_CHAR 0x07
# define ICBTAG_FILE_TYPE_EA 0x08
# define ICBTAG_FILE_TYPE_FIFO 0x09
# define ICBTAG_FILE_TYPE_SOCKET 0x0A
# define ICBTAG_FILE_TYPE_TE 0x0B
# define ICBTAG_FILE_TYPE_SYMLINK 0x0C
# define ICBTAG_FILE_TYPE_STREAMDIR 0x0D
/* Flags (ECMA 167r3 4/14.6.8) */
# define ICBTAG_FLAG_AD_MASK 0x0007
# define ICBTAG_FLAG_AD_SHORT 0x0000
# define ICBTAG_FLAG_AD_LONG 0x0001
# define ICBTAG_FLAG_AD_EXTENDED 0x0002
# define ICBTAG_FLAG_AD_IN_ICB 0x0003
# define ICBTAG_FLAG_SORTED 0x0008
# define ICBTAG_FLAG_NONRELOCATABLE 0x0010
# define ICBTAG_FLAG_ARCHIVE 0x0020
# define ICBTAG_FLAG_SETUID 0x0040
# define ICBTAG_FLAG_SETGID 0x0080
# define ICBTAG_FLAG_STICKY 0x0100
# define ICBTAG_FLAG_CONTIGUOUS 0x0200
# define ICBTAG_FLAG_SYSTEM 0x0400
# define ICBTAG_FLAG_TRANSFORMED 0x0800
# define ICBTAG_FLAG_MULTIVERSIONS 0x1000
# define ICBTAG_FLAG_STREAM 0x2000
/* Indirect Entry (ECMA 167r3 4/14.7) */
2007-07-19 12:47:43 +04:00
struct indirectEntry {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct icbtag icbTag ;
struct long_ad indirectICB ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Terminal Entry (ECMA 167r3 4/14.8) */
2007-07-19 12:47:43 +04:00
struct terminalEntry {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct icbtag icbTag ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* File Entry (ECMA 167r3 4/14.9) */
2007-07-19 12:47:43 +04:00
struct fileEntry {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct icbtag icbTag ;
__le32 uid ;
__le32 gid ;
__le32 permissions ;
__le16 fileLinkCount ;
uint8_t recordFormat ;
uint8_t recordDisplayAttr ;
__le32 recordLength ;
__le64 informationLength ;
__le64 logicalBlocksRecorded ;
struct timestamp accessTime ;
struct timestamp modificationTime ;
struct timestamp attrTime ;
__le32 checkpoint ;
struct long_ad extendedAttrICB ;
struct regid impIdent ;
__le64 uniqueID ;
__le32 lengthExtendedAttr ;
__le32 lengthAllocDescs ;
uint8_t extendedAttr [ 0 ] ;
uint8_t allocDescs [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Permissions (ECMA 167r3 4/14.9.5) */
# define FE_PERM_O_EXEC 0x00000001U
# define FE_PERM_O_WRITE 0x00000002U
# define FE_PERM_O_READ 0x00000004U
# define FE_PERM_O_CHATTR 0x00000008U
# define FE_PERM_O_DELETE 0x00000010U
# define FE_PERM_G_EXEC 0x00000020U
# define FE_PERM_G_WRITE 0x00000040U
# define FE_PERM_G_READ 0x00000080U
# define FE_PERM_G_CHATTR 0x00000100U
# define FE_PERM_G_DELETE 0x00000200U
# define FE_PERM_U_EXEC 0x00000400U
# define FE_PERM_U_WRITE 0x00000800U
# define FE_PERM_U_READ 0x00001000U
# define FE_PERM_U_CHATTR 0x00002000U
# define FE_PERM_U_DELETE 0x00004000U
/* Record Format (ECMA 167r3 4/14.9.7) */
# define FE_RECORD_FMT_UNDEF 0x00
# define FE_RECORD_FMT_FIXED_PAD 0x01
# define FE_RECORD_FMT_FIXED 0x02
# define FE_RECORD_FMT_VARIABLE8 0x03
# define FE_RECORD_FMT_VARIABLE16 0x04
# define FE_RECORD_FMT_VARIABLE16_MSB 0x05
# define FE_RECORD_FMT_VARIABLE32 0x06
# define FE_RECORD_FMT_PRINT 0x07
# define FE_RECORD_FMT_LF 0x08
# define FE_RECORD_FMT_CR 0x09
# define FE_RECORD_FMT_CRLF 0x0A
# define FE_RECORD_FMT_LFCR 0x0B
/* Record Display Attributes (ECMA 167r3 4/14.9.8) */
# define FE_RECORD_DISPLAY_ATTR_UNDEF 0x00
# define FE_RECORD_DISPLAY_ATTR_1 0x01
# define FE_RECORD_DISPLAY_ATTR_2 0x02
# define FE_RECORD_DISPLAY_ATTR_3 0x03
/* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */
2007-07-19 12:47:43 +04:00
struct extendedAttrHeaderDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
2007-07-21 15:37:18 +04:00
__le32 impAttrLocation ;
__le32 appAttrLocation ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Generic Format (ECMA 167r3 4/14.10.2) */
2007-07-19 12:47:43 +04:00
struct genericFormat {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
uint8_t attrData [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Character Set Information (ECMA 167r3 4/14.10.3) */
2007-07-19 12:47:43 +04:00
struct charSetInfo {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
__le32 escapeSeqLength ;
uint8_t charSetType ;
uint8_t escapeSeq [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Alternate Permissions (ECMA 167r3 4/14.10.4) */
2007-07-19 12:47:43 +04:00
struct altPerms {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
__le16 ownerIdent ;
__le16 groupIdent ;
__le16 permission ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */
2007-07-19 12:47:43 +04:00
struct fileTimesExtAttr {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
__le32 dataLength ;
__le32 fileTimeExistence ;
uint8_t fileTimes ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */
# define FTE_CREATION 0x00000001
# define FTE_DELETION 0x00000004
# define FTE_EFFECTIVE 0x00000008
# define FTE_BACKUP 0x00000002
/* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */
2007-07-19 12:47:43 +04:00
struct infoTimesExtAttr {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
__le32 dataLength ;
__le32 infoTimeExistence ;
uint8_t infoTimes [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Device Specification (ECMA 167r3 4/14.10.7) */
2007-07-19 12:47:43 +04:00
struct deviceSpec {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
__le32 impUseLength ;
__le32 majorDeviceIdent ;
__le32 minorDeviceIdent ;
uint8_t impUse [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */
2007-07-19 12:47:43 +04:00
struct impUseExtAttr {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
__le32 impUseLength ;
2008-10-15 14:28:03 +04:00
struct regid impIdent ;
2007-07-21 15:37:18 +04:00
uint8_t impUse [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */
2007-07-19 12:47:43 +04:00
struct appUseExtAttr {
2007-07-21 15:37:18 +04:00
__le32 attrType ;
uint8_t attrSubtype ;
uint8_t reserved [ 3 ] ;
__le32 attrLength ;
__le32 appUseLength ;
2008-10-15 14:28:03 +04:00
struct regid appIdent ;
2007-07-21 15:37:18 +04:00
uint8_t appUse [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
# define EXTATTR_CHAR_SET 1
# define EXTATTR_ALT_PERMS 3
# define EXTATTR_FILE_TIMES 5
# define EXTATTR_INFO_TIMES 6
# define EXTATTR_DEV_SPEC 12
# define EXTATTR_IMP_USE 2048
# define EXTATTR_APP_USE 65536
/* Unallocated Space Entry (ECMA 167r3 4/14.11) */
2007-07-19 12:47:43 +04:00
struct unallocSpaceEntry {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct icbtag icbTag ;
2007-07-21 15:37:18 +04:00
__le32 lengthAllocDescs ;
uint8_t allocDescs [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */
2007-07-19 12:47:43 +04:00
struct spaceBitmapDesc {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
2007-07-21 15:37:18 +04:00
__le32 numOfBits ;
__le32 numOfBytes ;
uint8_t bitmap [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Partition Integrity Entry (ECMA 167r3 4/14.13) */
2007-07-19 12:47:43 +04:00
struct partitionIntegrityEntry {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct icbtag icbTag ;
struct timestamp recordingDateAndTime ;
uint8_t integrityType ;
uint8_t reserved [ 175 ] ;
struct regid impIdent ;
uint8_t impUse [ 256 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
/* Extent Length (ECMA 167r3 4/14.14.1.1) */
# define EXT_RECORDED_ALLOCATED 0x00000000
# define EXT_NOT_RECORDED_ALLOCATED 0x40000000
# define EXT_NOT_RECORDED_NOT_ALLOCATED 0x80000000
# define EXT_NEXT_EXTENT_ALLOCDECS 0xC0000000
/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
/* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */
2007-07-19 12:47:43 +04:00
struct logicalVolHeaderDesc {
2007-07-21 15:37:18 +04:00
__le64 uniqueID ;
uint8_t reserved [ 24 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* Path Component (ECMA 167r3 4/14.16.1) */
2007-07-19 12:47:43 +04:00
struct pathComponent {
2007-07-21 15:37:18 +04:00
uint8_t componentType ;
uint8_t lengthComponentIdent ;
__le16 componentFileVersionNum ;
dstring componentIdent [ 0 ] ;
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( packed ) ) ;
/* File Entry (ECMA 167r3 4/14.17) */
2007-07-19 12:47:43 +04:00
struct extendedFileEntry {
2008-10-15 14:28:03 +04:00
struct tag descTag ;
struct icbtag icbTag ;
__le32 uid ;
__le32 gid ;
__le32 permissions ;
__le16 fileLinkCount ;
uint8_t recordFormat ;
uint8_t recordDisplayAttr ;
__le32 recordLength ;
__le64 informationLength ;
__le64 objectSize ;
__le64 logicalBlocksRecorded ;
struct timestamp accessTime ;
struct timestamp modificationTime ;
struct timestamp createTime ;
struct timestamp attrTime ;
__le32 checkpoint ;
__le32 reserved ;
struct long_ad extendedAttrICB ;
struct long_ad streamDirectoryICB ;
struct regid impIdent ;
__le64 uniqueID ;
__le32 lengthExtendedAttr ;
__le32 lengthAllocDescs ;
uint8_t extendedAttr [ 0 ] ;
uint8_t allocDescs [ 0 ] ;
2007-07-21 15:37:18 +04:00
} __attribute__ ( ( packed ) ) ;
# endif /* _ECMA_167_H */