brintos

brintos / linux-shallow public Read only

0
0
Text · 21.7 KiB · 415b050 Raw
817 lines · c
1/*2 * ecma_167.h3 *4 * This file is based on ECMA-167 3rd edition (June 1997)5 * https://www.ecma.ch6 *7 * Copyright (c) 2001-2002  Ben Fennema8 * Copyright (c) 2017-2019  Pali Rohár <pali@kernel.org>9 * All rights reserved.10 *11 * Redistribution and use in source and binary forms, with or without12 * modification, are permitted provided that the following conditions13 * are met:14 * 1. Redistributions of source code must retain the above copyright15 *    notice, this list of conditions, and the following disclaimer,16 *    without modification.17 * 2. The name of the author may not be used to endorse or promote products18 *    derived from this software without specific prior written permission.19 *20 * Alternatively, this software may be distributed under the terms of the21 * GNU Public License ("GPL").22 *23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE26 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF33 * SUCH DAMAGE.34 */35 36/**37 * @file38 * ECMA-167r3 defines and structure definitions39 */40 41#include <linux/types.h>42 43#ifndef _ECMA_167_H44#define _ECMA_167_H 145 46/* Character sets and coding - d-characters (ECMA 167r3 1/7.2) */47typedef uint8_t		dchars;48 49/* Character set specification (ECMA 167r3 1/7.2.1) */50struct charspec {51	uint8_t		charSetType;52	uint8_t		charSetInfo[63];53} __packed;54 55/* Character Set Type (ECMA 167r3 1/7.2.1.1) */56#define CHARSPEC_TYPE_CS0		0x00	/* (1/7.2.2) */57#define CHARSPEC_TYPE_CS1		0x01	/* (1/7.2.3) */58#define CHARSPEC_TYPE_CS2		0x02	/* (1/7.2.4) */59#define CHARSPEC_TYPE_CS3		0x03	/* (1/7.2.5) */60#define CHARSPEC_TYPE_CS4		0x04	/* (1/7.2.6) */61#define CHARSPEC_TYPE_CS5		0x05	/* (1/7.2.7) */62#define CHARSPEC_TYPE_CS6		0x06	/* (1/7.2.8) */63#define CHARSPEC_TYPE_CS7		0x07	/* (1/7.2.9) */64#define CHARSPEC_TYPE_CS8		0x08	/* (1/7.2.10) */65 66/* Fixed-length character fields - d-string (EMCA 167r3 1/7.2.12) */67typedef uint8_t		dstring;68 69/* Timestamp (ECMA 167r3 1/7.3) */70struct timestamp {71	__le16		typeAndTimezone;72	__le16		year;73	uint8_t		month;74	uint8_t		day;75	uint8_t		hour;76	uint8_t		minute;77	uint8_t		second;78	uint8_t		centiseconds;79	uint8_t		hundredsOfMicroseconds;80	uint8_t		microseconds;81} __packed;82 83/* Type and Time Zone (ECMA 167r3 1/7.3.1) */84#define TIMESTAMP_TYPE_MASK		0xF00085#define TIMESTAMP_TYPE_CUT		0x000086#define TIMESTAMP_TYPE_LOCAL		0x100087#define TIMESTAMP_TYPE_AGREEMENT	0x200088#define TIMESTAMP_TIMEZONE_MASK		0x0FFF89 90/* Entity identifier (ECMA 167r3 1/7.4) */91struct regid {92	uint8_t		flags;93	uint8_t		ident[23];94	uint8_t		identSuffix[8];95} __packed;96 97/* Flags (ECMA 167r3 1/7.4.1) */98#define ENTITYID_FLAGS_DIRTY		0x0199#define ENTITYID_FLAGS_PROTECTED	0x02100 101/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */102#define VSD_STD_ID_LEN			5103struct volStructDesc {104	uint8_t		structType;105	uint8_t		stdIdent[VSD_STD_ID_LEN];106	uint8_t		structVersion;107	uint8_t		structData[2041];108} __packed;109 110/* Standard Identifier (EMCA 167r2 2/9.1.2) */111#define VSD_STD_ID_NSR02		"NSR02"	/* (3/9.1) */112 113/* Standard Identifier (ECMA 167r3 2/9.1.2) */114#define VSD_STD_ID_BEA01		"BEA01"	/* (2/9.2) */115#define VSD_STD_ID_BOOT2		"BOOT2"	/* (2/9.4) */116#define VSD_STD_ID_CD001		"CD001"	/* (ECMA-119) */117#define VSD_STD_ID_CDW02		"CDW02"	/* (ECMA-168) */118#define VSD_STD_ID_NSR03		"NSR03"	/* (3/9.1) */119#define VSD_STD_ID_TEA01		"TEA01"	/* (2/9.3) */120 121/* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */122struct beginningExtendedAreaDesc {123	uint8_t		structType;124	uint8_t		stdIdent[VSD_STD_ID_LEN];125	uint8_t		structVersion;126	uint8_t		structData[2041];127} __packed;128 129/* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */130struct terminatingExtendedAreaDesc {131	uint8_t		structType;132	uint8_t		stdIdent[VSD_STD_ID_LEN];133	uint8_t		structVersion;134	uint8_t		structData[2041];135} __packed;136 137/* Boot Descriptor (ECMA 167r3 2/9.4) */138struct bootDesc {139	uint8_t			structType;140	uint8_t			stdIdent[VSD_STD_ID_LEN];141	uint8_t			structVersion;142	uint8_t			reserved1;143	struct regid		archType;144	struct regid		bootIdent;145	__le32			bootExtLocation;146	__le32			bootExtLength;147	__le64			loadAddress;148	__le64			startAddress;149	struct timestamp	descCreationDateAndTime;150	__le16			flags;151	uint8_t			reserved2[32];152	uint8_t			bootUse[1906];153} __packed;154 155/* Flags (ECMA 167r3 2/9.4.12) */156#define BOOT_FLAGS_ERASE		0x01157 158/* Extent Descriptor (ECMA 167r3 3/7.1) */159struct extent_ad {160	__le32		extLength;161	__le32		extLocation;162} __packed;163 164struct kernel_extent_ad {165	uint32_t	extLength;166	uint32_t	extLocation;167};168 169/* Descriptor Tag (ECMA 167r3 3/7.2) */170struct tag {171	__le16		tagIdent;172	__le16		descVersion;173	uint8_t		tagChecksum;174	uint8_t		reserved;175	__le16		tagSerialNum;176	__le16		descCRC;177	__le16		descCRCLength;178	__le32		tagLocation;179} __packed;180 181/* Tag Identifier (ECMA 167r3 3/7.2.1) */182#define TAG_IDENT_PVD			0x0001183#define TAG_IDENT_AVDP			0x0002184#define TAG_IDENT_VDP			0x0003185#define TAG_IDENT_IUVD			0x0004186#define TAG_IDENT_PD			0x0005187#define TAG_IDENT_LVD			0x0006188#define TAG_IDENT_USD			0x0007189#define TAG_IDENT_TD			0x0008190#define TAG_IDENT_LVID			0x0009191 192/* NSR Descriptor (ECMA 167r3 3/9.1) */193struct NSRDesc {194	uint8_t		structType;195	uint8_t		stdIdent[VSD_STD_ID_LEN];196	uint8_t		structVersion;197	uint8_t		reserved;198	uint8_t		structData[2040];199} __packed;200 201/* Generic Descriptor */202struct genericDesc {203	struct tag	descTag;204	__le32		volDescSeqNum;205	uint8_t		reserved[492];206} __packed;207 208/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */209struct primaryVolDesc {210	struct tag		descTag;211	__le32			volDescSeqNum;212	__le32			primaryVolDescNum;213	dstring			volIdent[32];214	__le16			volSeqNum;215	__le16			maxVolSeqNum;216	__le16			interchangeLvl;217	__le16			maxInterchangeLvl;218	__le32			charSetList;219	__le32			maxCharSetList;220	dstring			volSetIdent[128];221	struct charspec		descCharSet;222	struct charspec		explanatoryCharSet;223	struct extent_ad	volAbstract;224	struct extent_ad	volCopyright;225	struct regid		appIdent;226	struct timestamp	recordingDateAndTime;227	struct regid		impIdent;228	uint8_t			impUse[64];229	__le32			predecessorVolDescSeqLocation;230	__le16			flags;231	uint8_t			reserved[22];232} __packed;233 234/* Flags (ECMA 167r3 3/10.1.21) */235#define PVD_FLAGS_VSID_COMMON		0x0001236 237/* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */238struct anchorVolDescPtr {239	struct tag		descTag;240	struct extent_ad	mainVolDescSeqExt;241	struct extent_ad	reserveVolDescSeqExt;242	uint8_t	 		reserved[480];243} __packed;244 245/* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */246struct volDescPtr {247	struct tag		descTag;248	__le32			volDescSeqNum;249	struct extent_ad	nextVolDescSeqExt;250	uint8_t			reserved[484];251} __packed;252 253/* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */254struct impUseVolDesc {255	struct tag	descTag;256	__le32		volDescSeqNum;257	struct regid	impIdent;258	uint8_t		impUse[460];259} __packed;260 261/* Partition Descriptor (ECMA 167r3 3/10.5) */262struct partitionDesc {263	struct tag descTag;264	__le32 volDescSeqNum;265	__le16 partitionFlags;266	__le16 partitionNumber;267	struct regid partitionContents;268	uint8_t partitionContentsUse[128];269	__le32 accessType;270	__le32 partitionStartingLocation;271	__le32 partitionLength;272	struct regid impIdent;273	uint8_t impUse[128];274	uint8_t reserved[156];275} __packed;276 277/* Partition Flags (ECMA 167r3 3/10.5.3) */278#define PD_PARTITION_FLAGS_ALLOC	0x0001279 280/* Partition Contents (ECMA 167r2 3/10.5.3) */281#define PD_PARTITION_CONTENTS_NSR02	"+NSR02"282 283/* Partition Contents (ECMA 167r3 3/10.5.5) */284#define PD_PARTITION_CONTENTS_FDC01	"+FDC01"285#define PD_PARTITION_CONTENTS_CD001	"+CD001"286#define PD_PARTITION_CONTENTS_CDW02	"+CDW02"287#define PD_PARTITION_CONTENTS_NSR03	"+NSR03"288 289/* Access Type (ECMA 167r3 3/10.5.7) */290#define PD_ACCESS_TYPE_NONE		0x00000000291#define PD_ACCESS_TYPE_READ_ONLY	0x00000001292#define PD_ACCESS_TYPE_WRITE_ONCE	0x00000002293#define PD_ACCESS_TYPE_REWRITABLE	0x00000003294#define PD_ACCESS_TYPE_OVERWRITABLE	0x00000004295 296/* Logical Volume Descriptor (ECMA 167r3 3/10.6) */297struct logicalVolDesc {298	struct tag		descTag;299	__le32			volDescSeqNum;300	struct charspec		descCharSet;301	dstring			logicalVolIdent[128];302	__le32			logicalBlockSize;303	struct regid		domainIdent;304	uint8_t			logicalVolContentsUse[16];305	__le32			mapTableLength;306	__le32			numPartitionMaps;307	struct regid		impIdent;308	uint8_t			impUse[128];309	struct extent_ad	integritySeqExt;310	uint8_t			partitionMaps[];311} __packed;312 313/* Generic Partition Map (ECMA 167r3 3/10.7.1) */314struct genericPartitionMap {315	uint8_t		partitionMapType;316	uint8_t		partitionMapLength;317	uint8_t		partitionMapping[];318} __packed;319 320/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */321#define GP_PARTITION_MAP_TYPE_UNDEF	0x00322#define GP_PARTITION_MAP_TYPE_1		0x01323#define GP_PARTITION_MAP_TYPE_2		0x02324 325/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */326struct genericPartitionMap1 {327	uint8_t		partitionMapType;328	uint8_t		partitionMapLength;329	__le16		volSeqNum;330	__le16		partitionNum;331} __packed;332 333/* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */334struct genericPartitionMap2 {335	uint8_t		partitionMapType;336	uint8_t		partitionMapLength;337	uint8_t		partitionIdent[62];338} __packed;339 340/* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */341struct unallocSpaceDesc {342	struct tag		descTag;343	__le32			volDescSeqNum;344	__le32			numAllocDescs;345	struct extent_ad	allocDescs[];346} __packed;347 348/* Terminating Descriptor (ECMA 167r3 3/10.9) */349struct terminatingDesc {350	struct tag	descTag;351	uint8_t		reserved[496];352} __packed;353 354/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */355struct logicalVolIntegrityDesc {356	struct tag		descTag;357	struct timestamp	recordingDateAndTime;358	__le32			integrityType;359	struct extent_ad	nextIntegrityExt;360	uint8_t			logicalVolContentsUse[32];361	__le32			numOfPartitions;362	__le32			lengthOfImpUse;363	__le32			freeSpaceTable[];364	/* __le32		sizeTable[]; */365	/* uint8_t		impUse[]; */366} __packed;367 368/* Integrity Type (ECMA 167r3 3/10.10.3) */369#define LVID_INTEGRITY_TYPE_OPEN	0x00000000370#define LVID_INTEGRITY_TYPE_CLOSE	0x00000001371 372/* Recorded Address (ECMA 167r3 4/7.1) */373struct lb_addr {374	__le32		logicalBlockNum;375	__le16	 	partitionReferenceNum;376} __packed;377 378/* ... and its in-core analog */379struct kernel_lb_addr {380	uint32_t		logicalBlockNum;381	uint16_t	 	partitionReferenceNum;382};383 384/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */385struct short_ad {386        __le32		extLength;387        __le32		extPosition;388} __packed;389 390/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */391struct long_ad {392	__le32		extLength;393	struct lb_addr	extLocation;394	uint8_t		impUse[6];395} __packed;396 397struct kernel_long_ad {398	uint32_t		extLength;399	struct kernel_lb_addr	extLocation;400	uint8_t			impUse[6];401};402 403/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */404struct ext_ad {405	__le32		extLength;406	__le32		recordedLength;407	__le32		informationLength;408	struct lb_addr	extLocation;409} __packed;410 411struct kernel_ext_ad {412	uint32_t		extLength;413	uint32_t		recordedLength;414	uint32_t		informationLength;415	struct kernel_lb_addr	extLocation;416};417 418/* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */419 420/* Tag Identifier (ECMA 167r3 4/7.2.1) */421#define TAG_IDENT_FSD			0x0100422#define TAG_IDENT_FID			0x0101423#define TAG_IDENT_AED			0x0102424#define TAG_IDENT_IE			0x0103425#define TAG_IDENT_TE			0x0104426#define TAG_IDENT_FE			0x0105427#define TAG_IDENT_EAHD			0x0106428#define TAG_IDENT_USE			0x0107429#define TAG_IDENT_SBD			0x0108430#define TAG_IDENT_PIE			0x0109431#define TAG_IDENT_EFE			0x010A432 433/* File Set Descriptor (ECMA 167r3 4/14.1) */434struct fileSetDesc {435	struct tag		descTag;436	struct timestamp	recordingDateAndTime;437	__le16			interchangeLvl;438	__le16			maxInterchangeLvl;439	__le32			charSetList;440	__le32			maxCharSetList;441	__le32			fileSetNum;442	__le32			fileSetDescNum;443	struct charspec		logicalVolIdentCharSet;444	dstring			logicalVolIdent[128];445	struct charspec		fileSetCharSet;446	dstring			fileSetIdent[32];447	dstring			copyrightFileIdent[32];448	dstring			abstractFileIdent[32];449	struct long_ad		rootDirectoryICB;450	struct regid		domainIdent;451	struct long_ad		nextExt;452	struct long_ad		streamDirectoryICB;453	uint8_t			reserved[32];454} __packed;455 456/* Partition Header Descriptor (ECMA 167r3 4/14.3) */457struct partitionHeaderDesc {458	struct short_ad	unallocSpaceTable;459	struct short_ad	unallocSpaceBitmap;460	struct short_ad	partitionIntegrityTable;461	struct short_ad	freedSpaceTable;462	struct short_ad	freedSpaceBitmap;463	uint8_t		reserved[88];464} __packed;465 466/* File Identifier Descriptor (ECMA 167r3 4/14.4) */467struct fileIdentDesc {468	struct tag	descTag;469	__le16		fileVersionNum;470	uint8_t		fileCharacteristics;471	uint8_t		lengthFileIdent;472	struct long_ad	icb;473	__le16		lengthOfImpUse;474	/* uint8_t	impUse[]; */475	/* uint8_t	fileIdent[]; */476	/* uint8_t	padding[]; */477} __packed;478 479/* File Characteristics (ECMA 167r3 4/14.4.3) */480#define FID_FILE_CHAR_HIDDEN		0x01481#define FID_FILE_CHAR_DIRECTORY		0x02482#define FID_FILE_CHAR_DELETED		0x04483#define FID_FILE_CHAR_PARENT		0x08484#define FID_FILE_CHAR_METADATA		0x10485 486/* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */487struct allocExtDesc {488	struct tag	descTag;489	__le32		previousAllocExtLocation;490	__le32		lengthAllocDescs;491} __packed;492 493/* ICB Tag (ECMA 167r3 4/14.6) */494struct icbtag {495	__le32		priorRecordedNumDirectEntries;496	__le16		strategyType;497	__le16		strategyParameter;498	__le16		numEntries;499	uint8_t		reserved;500	uint8_t		fileType;501	struct lb_addr	parentICBLocation;502	__le16		flags;503} __packed;504 505/* Strategy Type (ECMA 167r3 4/14.6.2) */506#define ICBTAG_STRATEGY_TYPE_UNDEF	0x0000507#define ICBTAG_STRATEGY_TYPE_1		0x0001508#define ICBTAG_STRATEGY_TYPE_2		0x0002509#define ICBTAG_STRATEGY_TYPE_3		0x0003510#define ICBTAG_STRATEGY_TYPE_4		0x0004511 512/* File Type (ECMA 167r3 4/14.6.6) */513#define ICBTAG_FILE_TYPE_UNDEF		0x00514#define ICBTAG_FILE_TYPE_USE		0x01515#define ICBTAG_FILE_TYPE_PIE		0x02516#define ICBTAG_FILE_TYPE_IE		0x03517#define ICBTAG_FILE_TYPE_DIRECTORY	0x04518#define ICBTAG_FILE_TYPE_REGULAR	0x05519#define ICBTAG_FILE_TYPE_BLOCK		0x06520#define ICBTAG_FILE_TYPE_CHAR		0x07521#define ICBTAG_FILE_TYPE_EA		0x08522#define ICBTAG_FILE_TYPE_FIFO		0x09523#define ICBTAG_FILE_TYPE_SOCKET		0x0A524#define ICBTAG_FILE_TYPE_TE		0x0B525#define ICBTAG_FILE_TYPE_SYMLINK	0x0C526#define ICBTAG_FILE_TYPE_STREAMDIR	0x0D527 528/* Flags (ECMA 167r3 4/14.6.8) */529#define ICBTAG_FLAG_AD_MASK		0x0007530#define ICBTAG_FLAG_AD_SHORT		0x0000531#define ICBTAG_FLAG_AD_LONG		0x0001532#define ICBTAG_FLAG_AD_EXTENDED		0x0002533#define ICBTAG_FLAG_AD_IN_ICB		0x0003534#define ICBTAG_FLAG_SORTED		0x0008535#define ICBTAG_FLAG_NONRELOCATABLE	0x0010536#define ICBTAG_FLAG_ARCHIVE		0x0020537#define ICBTAG_FLAG_SETUID		0x0040538#define ICBTAG_FLAG_SETGID		0x0080539#define ICBTAG_FLAG_STICKY		0x0100540#define ICBTAG_FLAG_CONTIGUOUS		0x0200541#define ICBTAG_FLAG_SYSTEM		0x0400542#define ICBTAG_FLAG_TRANSFORMED		0x0800543#define ICBTAG_FLAG_MULTIVERSIONS	0x1000544#define ICBTAG_FLAG_STREAM		0x2000545 546/* Indirect Entry (ECMA 167r3 4/14.7) */547struct indirectEntry {548	struct tag	descTag;549	struct icbtag	icbTag;550	struct long_ad	indirectICB;551} __packed;552 553/* Terminal Entry (ECMA 167r3 4/14.8) */554struct terminalEntry {555	struct tag	descTag;556	struct icbtag	icbTag;557} __packed;558 559/* File Entry (ECMA 167r3 4/14.9) */560struct fileEntry {561	struct tag		descTag;562	struct icbtag		icbTag;563	__le32			uid;564	__le32			gid;565	__le32			permissions;566	__le16			fileLinkCount;567	uint8_t			recordFormat;568	uint8_t			recordDisplayAttr;569	__le32			recordLength;570	__le64			informationLength;571	__le64			logicalBlocksRecorded;572	struct timestamp	accessTime;573	struct timestamp	modificationTime;574	struct timestamp	attrTime;575	__le32			checkpoint;576	struct long_ad		extendedAttrICB;577	struct regid		impIdent;578	__le64			uniqueID;579	__le32			lengthExtendedAttr;580	__le32			lengthAllocDescs;581	uint8_t			extendedAttr[];582	/* uint8_t		allocDescs[]; */583} __packed;584 585/* Permissions (ECMA 167r3 4/14.9.5) */586#define FE_PERM_O_EXEC			0x00000001U587#define FE_PERM_O_WRITE			0x00000002U588#define FE_PERM_O_READ			0x00000004U589#define FE_PERM_O_CHATTR		0x00000008U590#define FE_PERM_O_DELETE		0x00000010U591#define FE_PERM_G_EXEC			0x00000020U592#define FE_PERM_G_WRITE			0x00000040U593#define FE_PERM_G_READ			0x00000080U594#define FE_PERM_G_CHATTR		0x00000100U595#define FE_PERM_G_DELETE		0x00000200U596#define FE_PERM_U_EXEC			0x00000400U597#define FE_PERM_U_WRITE			0x00000800U598#define FE_PERM_U_READ			0x00001000U599#define FE_PERM_U_CHATTR		0x00002000U600#define FE_PERM_U_DELETE		0x00004000U601 602/* Record Format (ECMA 167r3 4/14.9.7) */603#define FE_RECORD_FMT_UNDEF		0x00604#define FE_RECORD_FMT_FIXED_PAD		0x01605#define FE_RECORD_FMT_FIXED		0x02606#define FE_RECORD_FMT_VARIABLE8		0x03607#define FE_RECORD_FMT_VARIABLE16	0x04608#define FE_RECORD_FMT_VARIABLE16_MSB	0x05609#define FE_RECORD_FMT_VARIABLE32	0x06610#define FE_RECORD_FMT_PRINT		0x07611#define FE_RECORD_FMT_LF		0x08612#define FE_RECORD_FMT_CR		0x09613#define FE_RECORD_FMT_CRLF		0x0A614#define FE_RECORD_FMT_LFCR		0x0B615 616/* Record Display Attributes (ECMA 167r3 4/14.9.8) */617#define FE_RECORD_DISPLAY_ATTR_UNDEF	0x00618#define FE_RECORD_DISPLAY_ATTR_1	0x01619#define FE_RECORD_DISPLAY_ATTR_2	0x02620#define FE_RECORD_DISPLAY_ATTR_3	0x03621 622/* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */623struct extendedAttrHeaderDesc {624	struct tag	descTag;625	__le32		impAttrLocation;626	__le32		appAttrLocation;627} __packed;628 629/* Generic Format (ECMA 167r3 4/14.10.2) */630struct genericFormat {631	__le32		attrType;632	uint8_t		attrSubtype;633	uint8_t		reserved[3];634	__le32		attrLength;635	uint8_t		attrData[];636} __packed;637 638/* Character Set Information (ECMA 167r3 4/14.10.3) */639struct charSetInfo {640	__le32		attrType;641	uint8_t		attrSubtype;642	uint8_t		reserved[3];643	__le32		attrLength;644	__le32		escapeSeqLength;645	uint8_t		charSetType;646	uint8_t		escapeSeq[];647} __packed;648 649/* Alternate Permissions (ECMA 167r3 4/14.10.4) */650struct altPerms {651	__le32		attrType;652	uint8_t		attrSubtype;653	uint8_t		reserved[3];654	__le32		attrLength;655	__le16		ownerIdent;656	__le16		groupIdent;657	__le16		permission;658} __packed;659 660/* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */661struct fileTimesExtAttr {662	__le32		attrType;663	uint8_t		attrSubtype;664	uint8_t		reserved[3];665	__le32		attrLength;666	__le32		dataLength;667	__le32		fileTimeExistence;668	uint8_t		fileTimes;669} __packed;670 671/* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */672#define FTE_CREATION			0x00000001673#define FTE_DELETION			0x00000004674#define FTE_EFFECTIVE			0x00000008675#define FTE_BACKUP			0x00000002676 677/* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */678struct infoTimesExtAttr {679	__le32		attrType;680	uint8_t		attrSubtype;681	uint8_t		reserved[3];682	__le32		attrLength;683	__le32		dataLength;684	__le32		infoTimeExistence;685	uint8_t		infoTimes[];686} __packed;687 688/* Device Specification (ECMA 167r3 4/14.10.7) */689struct deviceSpec {690	__le32		attrType;691	uint8_t		attrSubtype;692	uint8_t		reserved[3];693	__le32		attrLength;694	__le32		impUseLength;695	__le32		majorDeviceIdent;696	__le32		minorDeviceIdent;697	uint8_t		impUse[];698} __packed;699 700/* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */701struct impUseExtAttr {702	__le32		attrType;703	uint8_t		attrSubtype;704	uint8_t		reserved[3];705	__le32		attrLength;706	__le32		impUseLength;707	struct regid	impIdent;708	uint8_t		impUse[];709} __packed;710 711/* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */712struct appUseExtAttr {713	__le32		attrType;714	uint8_t		attrSubtype;715	uint8_t		reserved[3];716	__le32		attrLength;717	__le32		appUseLength;718	struct regid	appIdent;719	uint8_t		appUse[];720} __packed;721 722#define EXTATTR_CHAR_SET		1723#define EXTATTR_ALT_PERMS		3724#define EXTATTR_FILE_TIMES		5725#define EXTATTR_INFO_TIMES		6726#define EXTATTR_DEV_SPEC		12727#define EXTATTR_IMP_USE			2048728#define EXTATTR_APP_USE			65536729#define EXTATTR_SUBTYPE			1730 731/* Unallocated Space Entry (ECMA 167r3 4/14.11) */732struct unallocSpaceEntry {733	struct tag	descTag;734	struct icbtag	icbTag;735	__le32		lengthAllocDescs;736	uint8_t		allocDescs[];737} __packed;738 739/* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */740struct spaceBitmapDesc {741	struct tag	descTag;742	__le32		numOfBits;743	__le32		numOfBytes;744	uint8_t		bitmap[];745} __packed;746 747/* Partition Integrity Entry (ECMA 167r3 4/14.13) */748struct partitionIntegrityEntry {749	struct tag		descTag;750	struct icbtag		icbTag;751	struct timestamp	recordingDateAndTime;752	uint8_t			integrityType;753	uint8_t			reserved[175];754	struct regid		impIdent;755	uint8_t			impUse[256];756} __packed;757 758/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */759 760/* Extent Length (ECMA 167r3 4/14.14.1.1) */761#define EXT_LENGTH_MASK			0x3FFFFFFF762#define EXT_TYPE_MASK			0xC0000000763#define EXT_RECORDED_ALLOCATED		0x00000000764#define EXT_NOT_RECORDED_ALLOCATED	0x40000000765#define EXT_NOT_RECORDED_NOT_ALLOCATED	0x80000000766#define EXT_NEXT_EXTENT_ALLOCDESCS	0xC0000000767 768/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */769 770/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */771 772/* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */773struct logicalVolHeaderDesc {774	__le64		uniqueID;775	uint8_t		reserved[24];776} __packed;777 778/* Path Component (ECMA 167r3 4/14.16.1) */779struct pathComponent {780	uint8_t		componentType;781	uint8_t		lengthComponentIdent;782	__le16		componentFileVersionNum;783	dchars		componentIdent[];784} __packed;785 786/* File Entry (ECMA 167r3 4/14.17) */787struct extendedFileEntry {788	struct tag		descTag;789	struct icbtag		icbTag;790	__le32			uid;791	__le32			gid;792	__le32			permissions;793	__le16			fileLinkCount;794	uint8_t			recordFormat;795	uint8_t			recordDisplayAttr;796	__le32			recordLength;797	__le64			informationLength;798	__le64			objectSize;799	__le64			logicalBlocksRecorded;800	struct timestamp	accessTime;801	struct timestamp	modificationTime;802	struct timestamp	createTime;803	struct timestamp	attrTime;804	__le32			checkpoint;805	__le32			reserved;806	struct long_ad		extendedAttrICB;807	struct long_ad		streamDirectoryICB;808	struct regid		impIdent;809	__le64			uniqueID;810	__le32			lengthExtendedAttr;811	__le32			lengthAllocDescs;812	uint8_t			extendedAttr[];813	/* uint8_t		allocDescs[]; */814} __packed;815 816#endif /* _ECMA_167_H */817