#if !defined(_LINUX_UDF_167_H)
#define _LINUX_UDF_167_H
/*
 * udf_167.h
 *
 * DESCRIPTION
 *	Definitions from the ECMA 167 standard.
 *	http://www.ecma.ch/
 *
 *	These abbreviations are used to keep the symbols short:
 *		Alloc	Allocation
 *		App	Application
 *		Attr	Attribute
 *		Char	Characters
 *		Desc	Descriptor
 *		Descs	Descriptors
 *		Ext	Extent
 *		Ident	Identifier
 *		Imp	Implementation
 *		Lvl	Level
 *		Max	Maximum
 *		Num	Number
 *		Ptr	Pointer
 *		Seq	Sequence
 *		Std	Standard
 *		Struct	Structure
 *		Vol	Volume
 *	The symbols are otherwise identical to the standard, and the
 *	sections of the standard to refer to are indicated.
 *
 * CONTACTS
 *	E-mail regarding any portion of the Linux UDF file system should be
 *	directed to the development team mailing list (run by majordomo):
 *		linux_udf@hootie.lvld.hp.com
 *
 * COPYRIGHT
 *	This file is distributed under the terms of the GNU General Public
 *	License (GPL). Copies of the GPL can be obtained from:
 *		ftp://prep.ai.mit.edu/pub/gnu/GPL
 *	Each contributing author retains all rights to their own work.
 *
 * HISTORY
 *	July 12, 1997 - Andrew E. Mileski
 *	Adapted from the ECMA-167 standard.
 *
 * 10/2/98 dgb	Adaptation
 * 10/4/98 	Changes by HJA Sandkuyl
 * 10/7/98	Changed FILE_EXISTENCE to FILE_HIDDEN, per UDF 2.0 spec
 * 11/26/98	Modifed some entries for UDF 1.5/2.0
 * 11/26/98 bf  Fixed typos, non-linux types, more structures
 * 12/5/98 dgb  Adjusted structure and content of include files.
 */

#ifdef __KERNEL__
#include <linux/types.h>
#define Uint8	__u8
#define Uint16	__u16
#define Uint32	__u32
#define Uint64	__u64
typedef Uint8	dstring;
#else
#define Uint8	unsigned char
#define Uint16	unsigned short
#define Uint32	unsigned int
#define Uint64	unsigned long long
typedef Uint8	dstring;
#endif

/* make sure all structures are packed! */
#pragma pack(1)

/* CS0 Charspec (ECMA 167 1/7.2.1) */
typedef struct {
	Uint8 charSetType;
	Uint8 charSetInfo[63];
} charspec;

/* Timestamp (ECMA 167 1/7.3) */
typedef struct {
	Uint16 typeAndTimezone;
	Uint16 year;
	Uint8 month;
	Uint8 day;
	Uint8 hour;
	Uint8 minute;
	Uint8 second;
	Uint8 centiseconds;
	Uint8 hundredsOfMicroseconds;
	Uint8 microseconds;
} timestamp;

/* Timestamp types (ECMA 167 1/7.3.1) */
#define TIMESTAMP_TYPE_CUT		0x0000U
#define TIMESTAMP_TYPE_LOCAL		0x0001U
#define TIMESTAMP_TYPE_AGREEMENT	0x0002U

/* Entity Identifier (ECMA 167 1/7.4) */
typedef struct {
	Uint8 flags;
	Uint8 ident[23];
	Uint8 identSuffix[8];
} EntityID;
#define regid EntityID

/* Entity identifier flags (ECMA 167 1/7.4.1) */
#define ENTITYID_FLAGS_DIRTY		0x01U
#define ENTITYID_FLAGS_PROTECTED	0x02U

/* Volume Structure Descriptor (ECMA 167 2/9.1) */
#define STD_ID_LEN	5
struct VolStructDesc {
	Uint8 structType;
	Uint8 stdIdent[STD_ID_LEN];
	Uint8 structVersion;
	Uint8 structData[2041];
};

/* Std structure identifiers (ECMA 167 2/9.1.2) */
#define STD_ID_BEA01	"BEA01"
#define STD_ID_BOOT2	"BOOT2"
#define STD_ID_CD001	"CD001"
#define STD_ID_CDW02	"CDW02"
#define STD_ID_NSR02	"NSR02"
#define STD_ID_NSR03	"NSR03"
#define STD_ID_TEA01	"TEA01"

/* Beginning Extended Area Descriptor (ECMA 167 2/9.2) */
struct BeginningExtendedAreaDesc {
	Uint8 structType;
	Uint8 stdIdent[STD_ID_LEN];
	Uint8 structVersion;
	Uint8 structData[2041];
};

/* Terminating Extended Area Descriptor (ECMA 167 2/9.3) */
struct TerminatingExtendedAreaDesc {
	Uint8 structType;
	Uint8 stdIdent[STD_ID_LEN];
	Uint8 structVersion;
	Uint8 structData[2041];
};

/* Boot Descriptor (ECMA 167 2/9.4) */
struct BootDesc {
	Uint8 structType;
	Uint8 stdIdent[STD_ID_LEN];
	Uint8 structVersion;
	Uint8 reserved1;
	EntityID architectureType;
	EntityID bootIdent;
	Uint32 bootExtLocation;
	Uint32 bootExtLength;
	Uint64 loadAddress;
	Uint64 startAddress;
	timestamp descCreationDateAndTime;
	Uint16 flags;
	Uint8 reserved2[32];
	Uint8 bootUse[1906];
};

/* Boot flags (ECMA 167 2/9.4.12) */
#define BOOT_FLAGS_ERASE	1

/* Extent Descriptor (ECMA 167 3/7.1) */
typedef struct {
	Uint32 extLength;
	Uint32 extLocation;
} extent_ad;

/* Descriptor Tag (ECMA 167 3/7.2) */
typedef struct {
	Uint16 tagIdent;
	Uint16 descVersion;
	Uint8 tagChecksum;
	Uint8 reserved;
	Uint16 tagSerialNum;
	Uint16 descCRC;
	Uint16 descCRCLength;
	Uint32 tagLocation;
} tag;

/* Tag Identifiers (ECMA 167 3/7.2.1) */
#define TID_UNUSED_DESC			0x0000U
#define TID_PRIMARY_VOL_DESC		0x0001U
#define TID_ANCHOR_VOL_DESC_PTR		0x0002U
#define TID_VOL_DESC_PTR		0x0003U
#define TID_IMP_USE_VOL_DESC		0x0004U
#define TID_PARTITION_DESC		0x0005U
#define TID_LOGICAL_VOL_DESC		0x0006U
#define TID_UNALLOC_SPACE_DESC		0x0007U
#define TID_TERMINATING_DESC		0x0008U
#define TID_LOGICAL_VOL_INTEGRITY_DESC	0x0009U

/* Tag Identifiers (ECMA 167 4/7.2.1) */
#define TID_FILE_SET_DESC		0x0100U
#define TID_FILE_IDENT_DESC		0x0101U
#define TID_ALLOC_EXTENT_DESC		0x0102U
#define TID_INDIRECT_ENTRY		0x0103U
#define TID_TERMINAL_ENTRY		0x0104U
#define TID_FILE_ENTRY			0x0105U
#define TID_EXTENDED_ATTRE_HEADER_DESC	0x0106U
#define TID_UNALLOCATED_SPACE_ENTRY	0x0107U
#define TID_SPACE_BITMAP_DESC		0x0108U
#define TID_PARTITION_INTEGRITY_ENTRY	0x0109U
#define TID_EXTENDED_FILE_ENTRY		0x010AU

/* NSR Descriptor (ECMA 167 3/9.1) */
struct NSRDesc {
	Uint8 structType;
	Uint8 stdIdent[STD_ID_LEN];
	Uint8 structVersion;
	Uint8 reserved;
	Uint8 structData[2040];
};
	
/* Primary Volume Descriptor (ECMA 167 3/10.1) */
struct PrimaryVolDesc {
	tag descTag;
	Uint32 volDescSeqNum;
	Uint32 primaryVolDescNum;
	dstring volIdent[32];
	Uint16 volSeqNum;
	Uint16 maxVolSeqNum;
	Uint16 interchangeLvl;
	Uint16 maxInterchangeLvl;
	Uint32 charSetList;
	Uint32 maxCharSetList;
	dstring volSetIdent[128];
	charspec descCharSet;
	charspec explanatoryCharSet;
	extent_ad volAbstract;
	extent_ad volCopyright;
	EntityID appIdent;
	timestamp recordingDateAndTime;
	EntityID impIdent;
	Uint8 impUse[64];
	Uint32 predecessorVolDescSeqLocation;
	Uint16 flags;
	Uint8 reserved[22];
};

/* Primary volume descriptor flags (ECMA 167 3/10.1.21) */
#define VOL_SET_IDENT	1

/* Anchor Volume Descriptor Pointer (ECMA 167 3/10.2) */
struct AnchorVolDescPtr {
	tag descTag;
	extent_ad mainVolDescSeqExt;
	extent_ad reserveVolDescSeqExt;
	Uint8 reserved[480];
};

/* Volume Descriptor Pointer (ECMA 167 3/10.3) */
struct VolDescPtr {
	tag descTag;
	Uint32 volDescSeqNum;
	extent_ad nextVolDescSeqExt;
	Uint8 reserved[484];
};

/* Implementation Use Volume Descriptor (ECMA 167 3/10.4) */
struct ImpUseVolDesc {
	tag descTag;
	Uint32 volDescSeqNum;
	EntityID impIdent;
	Uint8 impUse[460];
};

/* Partition Descriptor (ECMA 167 3/10.5) */
struct PartitionDesc {
	tag descTag;
	Uint32 volDescSeqNum;
	Uint16 partitionFlags;
	Uint16 partitionNumber;
	EntityID partitionContents;
	Uint8 partitionContentsUse[128];
	Uint32 accessType;
	Uint32 partitionStartingLocation;
	Uint32 partitionLength;
	EntityID impIdent;
	Uint8 impUse[128];
	Uint8 reserved[156];
};

/* Partition Flags (ECMA 167 3/10.5.3) */
#define PARTITION_FLAGS_ALLOC	1

/* Partition Contents (ECMA 167 3/10.5.5) */
#define PARTITION_CONTENTS_FDC01	"+FDC01"
#define PARTITION_CONTENTS_CD001	"+CD001"
#define PARTITION_CONTENTS_CDW02	"+CDW02"
#define PARTITION_CONTENTS_NSR02	"+NSR02"
#define PARTITION_CONTENTS_NSR03	"+NSR03"

/* Partition Access Types (ECMA 167 3/10.5.7) */
#define PARTITION_ACCESS_NONE	0
#define PARTITION_ACCESS_R	1
#define PARTITION_ACCESS_WO	2
#define PARTITION_ACCESS_RW	3
#define PARTITION_ACCESS_OW	4

/* Logical Volume Descriptor (ECMA 167 3/10.6) */
struct LogicalVolDesc {
	tag descTag;
	Uint32 volDescSeqNum;
	charspec descCharSet;
	dstring logicalVolIdent[128];
	Uint32 logicalBlockSize;
	EntityID domainIdent;
	Uint8 logicalVolContentsUse[16]; /* used to find fileset */
	Uint32 mapTableLength;
	Uint32 numPartitionMaps;
	EntityID impIdent;
	Uint8 impUse[128];
	extent_ad integritySeqExt;
	Uint8 partitionMaps[0];
};

/* Generic Partition Map (ECMA 167 3/10.7.1) */
struct GenericPartitionMap {
	Uint8 partitionMapType;
	Uint8 partitionMapLength;
	Uint8 partitionMapping[0];
};

/* Partition Map Type (ECMA 167 3/10.7.1.1) */
#define PARTITION_MAP_TYPE_NONE		0
#define PARTITION_MAP_TYPE_1		1
#define PARTITION_MAP_TYPE_2		2

/* Type 1 Partition Map (ECMA 167 3/10.7.2) */
struct GenericPartitionMap1 {
	Uint8 partitionMapType;
	Uint8 partitionMapLength;
	Uint16 volSeqNum;
	Uint16 partitionNum;
};

/* Type 2 Partition Map (ECMA 167 3/10.7.3) */
struct GenericPartitionMap2 {
	Uint8 partitionMapType; /* 2 */
	Uint8 partitionMapLength; 
	Uint8 partitionIdent[62];
};

/* Unallocated Space Descriptor (ECMA 167 3/10.8) */
struct UnallocatedSpaceDesc {
	tag descTag;
	Uint32 volDescSeqNum;
	Uint32 numAllocDescs;
	extent_ad allocDescs[0];
};

/* Terminating Descriptor (ECMA 3/10.9) */
struct TerminatingDesc {
	tag descTag;
	Uint8 reserved[496];
};

struct GenericDesc
{
        tag descTag;
        Uint32 volDescSeqNum;
};

/* Logical Volume Integrity Descriptor (ECMA 167 3/10.10) */
struct LogicalVolIntegrityDesc {
	tag descTag;
	timestamp recordingDateAndTime;
	Uint32 integrityType;
	extent_ad nextIntegrityExt;
	Uint8 logicalVolContentsUse[32];
	Uint32 numOfPartitions;
	Uint32 lengthOfImpUse;
	Uint32 freeSpaceTable[0];
	Uint32 sizeTable[0];
	Uint8 impUse[0];
};

/* Integrity Types (ECMA 167 3/10.10.3) */
#define INTEGRITY_TYPE_OPEN	0
#define INTEGRITY_TYPE_CLOSE	1

/* Recorded Address (ECMA 167 4/7.1) */
typedef struct {
	Uint32 logicalBlockNum;
	Uint16 partitionReferenceNum;
} lb_addr;

/* Extent interpretation (ECMA 167 4/14.14.1.1) */
#define EXTENT_RECORDED_ALLOCATED               0x00
#define EXTENT_NOT_RECORDED_ALLOCATED           0x01
#define EXTENT_NOT_RECORDED_NOT_ALLOCATED       0x02
#define EXTENT_NEXT_EXTENT_ALLOCDECS            0x03

/* Long Allocation Descriptor (ECMA 167 4/14.14.2) */
typedef struct {
	Uint32 extLength;
	lb_addr extLocation;
	Uint8 impUse[6];
} long_ad;
	/* upper 2 bits of extLength indicate type */

/* File Set Descriptor (ECMA 167 4/14.1) */
struct FileSetDesc {
	tag descTag;
	timestamp recordingDateAndTime;
	Uint16 interchangeLvl;
	Uint16 maxInterchangeLvl;
	Uint32 charSetList;
	Uint32 maxCharSetList;
	Uint32 fileSetNum;
	Uint32 fileSetDescNum;
	charspec logicalVolIdentCharSet;
	dstring logicalVolIdent[128];
	charspec fileSetCharSet;
	dstring fileSetIdent[32];
	dstring copyrightFileIdent[32];
	dstring abstractFileIdent[32];
	long_ad rootDirectoryICB;
	EntityID domainIdent;
	long_ad nextExt;
	long_ad streamDirectoryICB;
	Uint8 reserved[32];
};

/* Short Allocation Descriptor (ECMA 167 4/14.14.1) */
typedef struct {
	Uint32 extLength;
	Uint32 extPosition;
} short_ad;

/* Partition Header Descriptor (ECMA 167 4/14.3) */
struct PartitionHeaderDesc {
	short_ad unallocatedSpaceTable;
	short_ad unallocatedSpaceBitmap;
	short_ad partitionIntegrityTable;
	short_ad freedSpaceTable;
	short_ad freedSpaceBitmap;
	Uint8 reserved[88];
};

/* File Identifier Descriptor (ECMA 167 4/14.4) */
struct FileIdentDesc
{
	tag descTag;
	Uint16 fileVersionNum; /* 1 */
	Uint8 fileCharacteristics;
	Uint8 lengthFileIdent;
	long_ad icb;
	Uint16 lengthOfImpUse;
	Uint8 impUse[0];
	Uint8 fileIdent[0];
	Uint8 padding[0];
};

/* File Characteristics (ECMA 167 4/14.4.3) */
#define FILE_HIDDEN	1
#define FILE_DIRECTORY	2
#define FILE_DELETED	4
#define FILE_PARENT	8
#define FILE_METADATA	0x10 /* UDF 2.0 */

/* Allocation Ext Descriptor (ECMA 167 4/14.5) */
struct AllocExtDesc
{
	tag descTag;
	Uint32 previousAllocExtLocation;
	Uint32 lengthAllocDescs;
};

/* ICB Tag (ECMA 167 4/14.6) */
typedef struct {
	Uint32 priorRecordedNumDirectEntries;
	Uint16 strategyType;
	Uint16 strategyParameter;
	Uint16 numEntries;
	Uint8 reserved;
	Uint8 fileType;
	lb_addr parentICBLocation;
	Uint16 flags;
} icbtag;

/* ICB File Type (ECMA 167 4/14.6.6) */
#define FILE_TYPE_NONE		0x00U
#define FILE_TYPE_UNALLOC	0x01U
#define FILE_TYPE_INTEGRITY	0x02U
#define FILE_TYPE_INDIRECT	0x03U
#define FILE_TYPE_DIRECTORY	0x04U
#define FILE_TYPE_REGULAR	0x05U
#define FILE_TYPE_BLOCK		0x06U
#define FILE_TYPE_CHAR		0x07U
#define FILE_TYPE_EXTENDED	0x08U
#define FILE_TYPE_FIFO		0x09U
#define FILE_TYPE_SOCKET	0x0aU
#define FILE_TYPE_TERMINAL	0x0bU
#define FILE_TYPE_SYMLINK	0x0cU
#define FILE_TYPE_STREAMDIR	0x0dU /* ECMA 167 4/13 */

/* ICB Flags (ECMA 167 4/14.6.8) */
#define ICB_FLAG_ALLOC_MASK	0x0007U
#define ICB_FLAG_SORTED		0x0008U
#define ICB_FLAG_NONRELOCATABLE	0x0010U
#define ICB_FLAG_ARCHIVE	0x0020U
#define ICB_FLAG_SETUID		0x0040U
#define ICB_FLAG_SETGID		0x0080U
#define ICB_FLAG_STICKY		0x0100U
#define ICB_FLAG_CONTIGUOUS	0x0200U
#define ICB_FLAG_SYSTEM		0x0400U
#define ICB_FLAG_TRANSFORMED	0x0800U
#define ICB_FLAG_MULTIVERSIONS	0x1000U

/* ICB Flags Allocation type(ECMA 167 4/14.6.8) */
#define ICB_FLAG_AD_SHORT	0
#define ICB_FLAG_AD_LONG	1
#define ICB_FLAG_AD_EXTENDED	2
#define ICB_FLAG_AD_IN_ICB	3

/* Indirect Entry (ECMA 167 4/14.7) */
struct IndirectEntry {
	tag descTag;
	icbtag icbTag;
	long_ad indirectICB;
};

/* Terminal Entry (ECMA 167 4/14.8) */
struct TerminalEntry {
	tag descTag;
	icbtag icbTag;
};

/* File Entry (ECMA 167 4/14.9) */
struct FileEntry {
	tag			descTag;
	icbtag		icbTag;
	Uint32		uid;
	Uint32		gid;
	Uint32		permissions;
	Uint16		fileLinkCount;
	Uint8		recordFormat;
	Uint8		recordDisplayAttr;
	Uint32		recordLength;
	Uint64		informationLength;
	Uint64		logicalBlocksRecorded;
	timestamp	accessTime;
	timestamp	modificationTime;
	timestamp	attrTime;
	Uint32		checkpoint;
	long_ad		extendedAttrICB;
	EntityID	impIdent;
	Uint64		uniqueID; /* 0= root, 16- (2^32-1) */
	Uint32		lengthExtendedAttr;
	Uint32		lengthAllocDescs;
	Uint8		extendedAttr[0];
	Uint8		allocDescs[0];
};

/* File Permissions (ECMA 167 4/14.9.5) */
#define PERM_O_EXEC	0x00000001U
#define PERM_O_WRITE	0x00000002U
#define PERM_O_READ	0x00000004U
#define PERM_O_CHATTR	0x00000008U
#define PERM_O_DELETE	0x00000010U
#define PERM_G_EXEC	0x00000020U
#define PERM_G_WRITE	0x00000040U
#define PERM_G_READ	0x00000080U
#define PERM_G_CHATTR	0x00000100U
#define PERM_G_DELETE	0x00000200U
#define PERM_U_EXEC	0x00000400U
#define PERM_U_WRITE	0x00000800U
#define PERM_U_READ	0x00001000U
#define PERM_U_CHATTR	0x00002000U
#define PERM_U_DELETE	0x00004000U

/* File Record Format (ECMA 167 4/14.9.7) */
#define RECORD_FMT_NONE			0
#define RECORD_FMT_FIXED_PAD		1
#define RECORD_FMT_FIXED		2
#define RECORD_FMT_VARIABLE8		3
#define RECORD_FMT_VARIABLE16		4
#define RECORD_FMT_VARIABLE16_MSB	5
#define RECORD_FMT_VARIABLE32		6
#define RECORD_FMT_PRINT		7
#define RECORD_FMT_LF			8
#define RECORD_FMT_CR			9
#define RECORD_FMT_CRLF			10
#define RECORD_FMT_LFCR			10

/* Extended Attribute Header Descriptor (ECMA 167 4/14.10.1) */
struct ExtendedAttrHeaderDesc {
	tag descTag;
	Uint32 impAttrLocation;
	Uint32 appAttrLocation;
};

/* Generic Attribute Format (ECMA 4/14.10.2) */
struct GenericAttrFormat {
	Uint32 attrType;
	Uint8 attrSubtype;
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint8 attrData[0];
};

/* Character Set Attribute Format (ECMA 4/14.10.3) */
struct CharSetAttrFormat {
	Uint32 attrType;		/* 1 */
	Uint8 attrSubtype;		/* 1 */
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint32 escapeSeqLength;
	Uint8 charSetType;
	Uint8 escapeSeq[0];
};

/* Alternate Permissions (ECMA 167 4/14.10.4) */
struct AlternatePermissionsExtendedAttr {
	Uint32 attrType;		/* 3 */
	Uint8 attrSubtype;		/* 1 */
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint16 ownerIdent;
	Uint16 groupIdent;
	Uint16 permission;
};

/* File Times Extended Attribute (ECMA 167 4/14.10.5) */
struct FileTimesExtendedAttr {
	Uint32 attrType;		/* 5 */
	Uint8 attrSubtype;		/* 1 */
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint32 dataLength;
	Uint32 fileTimeExistence;
	Uint8 fileTimes;
};

/* FileTimeExistence (ECMA 167 4/14.10.5.6) */
#define FTE_CREATION	0
#define FTE_DELETION	2
#define FTE_EFFECTIVE	3
#define FTE_BACKUP	5

/* Information Times Extended Attribute (ECMA 167 4/14.10.6) */
struct InfoTimesExtendedAttr {
	Uint32 attrType;		/* 6 */
	Uint8 attrSubtype;		/* 1 */
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint32 dataLength;
	Uint32 infoTimeExistence;
	Uint8 infoTimes[0];
};

/* Device Specification Extended Attribute (ECMA 167 4/14.10.7) */
struct DeviceSpecificationExtendedAttr {
	Uint32 attrType;		/* 12 */
	Uint8 attrSubtype;		/* 1 */
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint32 impUseLength;
	Uint32 majorDeviceIdent;
	Uint32 minorDeviceIdent;
	Uint8 impUse[0];
};

/* Implementation Use Extended Attr (ECMA 167 4/14.10.8) */
struct ImpUseExtendedAttr {
	Uint32 attrType;		/* 2048 */
	Uint8 attrSubtype;		/* 1 */
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint32 impUseLength;
	EntityID impIdent;
	Uint8 impUse[0];
};

/* Application Use Extended Attribute (ECMA 167 4/14.10.9) */
struct AppUseExtendedAttr {
	Uint32 attrType;		/* 65536 */
	Uint8 attrSubtype;		/* 1 */
	Uint8 reserved[3];
	Uint32 attrLength;
	Uint32 appUseLength;
	EntityID appIdent;
	Uint8 appUse[0];
};

#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 167 4/14.11) */
struct UnallocatedSpaceEntry {
	tag descTag;
	icbtag icbTag;
	Uint32 lengthAllocDescs;
	Uint8 allocDescs[0];
};

/* Space Bitmap Descriptor (ECMA 167 4/14.12) */
struct SpaceBitmapDesc {
	tag descTag;
	Uint32 numOfBits;
	Uint32 numOfBytes;
	Uint8 bitmap[0];
};

/* Partition Integrity Entry (ECMA 167 4/14.13) */
struct PartitionIntegrityEntry {
	tag descTag;
	icbtag icbTag;
	timestamp recordingDateAndTime;
	Uint8 integrityType;
	Uint8 reserved[175];
	EntityID impIdent;
	Uint8 impUse[256];
};

/* Extended Allocation Descriptor (ECMA 167 4/14.14.3) */
typedef struct { /* ECMA 167 4/14.14.3 */
	Uint32 extLength;
	Uint32 recordedLength;
	Uint32 informationLength;
	lb_addr extLocation;
} ext_ad;

/* Logical Volume Header Descriptor (ECMA 167 4/14.5) */
struct LogicalVolHeaderDesc {
	Uint64 uniqueID;
	Uint8 reserved[24];
};

/* Path Component (ECMA 167 4/14.16.1) */
struct PathComponent {
	Uint8 componentType;
	Uint8 lengthComponentIdent;
	Uint16 componentFileVersionNum;
	dstring componentIdent[0];
};

/* File Entry (ECMA 167 4/14.17) */
struct ExtendedFileEntry {
	tag			descTag;
	icbtag		icbTag;
	Uint32		uid;
	Uint32		gid;
	Uint32		permissions;
	Uint16		fileLinkCount;
	Uint8		recordFormat;
	Uint8		recordDisplayAttr;
	Uint32		recordLength;
	Uint64		informationLength;
	Uint64		objectSize;
	Uint64		logicalBlocksRecorded;
	timestamp	accessTime;
	timestamp	modificationTime;
	timestamp	createTime;
	timestamp	attrTime;
	Uint32		checkpoint;
	Uint32		reserved;
	long_ad		extendedAttrICB;
	long_ad		streamDirectoryICB;
	EntityID	impIdent;
	Uint64		uniqueID;
	Uint32		lengthExtendedAttr;
	Uint32		lengthAllocDescs;
	Uint8		extendedAttr[0];
	Uint8		allocDescs[0];
};
#pragma pack()

#endif /* !defined(_LINUX_UDF_167_H) */
