162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * ecma_167.h
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This file is based on ECMA-167 3rd edition (June 1997)
562306a36Sopenharmony_ci * https://www.ecma.ch
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (c) 2001-2002  Ben Fennema
862306a36Sopenharmony_ci * Copyright (c) 2017-2019  Pali Rohár <pali@kernel.org>
962306a36Sopenharmony_ci * All rights reserved.
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without
1262306a36Sopenharmony_ci * modification, are permitted provided that the following conditions
1362306a36Sopenharmony_ci * are met:
1462306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright
1562306a36Sopenharmony_ci *    notice, this list of conditions, and the following disclaimer,
1662306a36Sopenharmony_ci *    without modification.
1762306a36Sopenharmony_ci * 2. The name of the author may not be used to endorse or promote products
1862306a36Sopenharmony_ci *    derived from this software without specific prior written permission.
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci * Alternatively, this software may be distributed under the terms of the
2162306a36Sopenharmony_ci * GNU Public License ("GPL").
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2462306a36Sopenharmony_ci * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2562306a36Sopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2662306a36Sopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2762306a36Sopenharmony_ci * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2862306a36Sopenharmony_ci * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2962306a36Sopenharmony_ci * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3062306a36Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3162306a36Sopenharmony_ci * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3262306a36Sopenharmony_ci * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3362306a36Sopenharmony_ci * SUCH DAMAGE.
3462306a36Sopenharmony_ci */
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/**
3762306a36Sopenharmony_ci * @file
3862306a36Sopenharmony_ci * ECMA-167r3 defines and structure definitions
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#include <linux/types.h>
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#ifndef _ECMA_167_H
4462306a36Sopenharmony_ci#define _ECMA_167_H 1
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* Character sets and coding - d-characters (ECMA 167r3 1/7.2) */
4762306a36Sopenharmony_citypedef uint8_t		dchars;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* Character set specification (ECMA 167r3 1/7.2.1) */
5062306a36Sopenharmony_cistruct charspec {
5162306a36Sopenharmony_ci	uint8_t		charSetType;
5262306a36Sopenharmony_ci	uint8_t		charSetInfo[63];
5362306a36Sopenharmony_ci} __packed;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/* Character Set Type (ECMA 167r3 1/7.2.1.1) */
5662306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS0		0x00	/* (1/7.2.2) */
5762306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS1		0x01	/* (1/7.2.3) */
5862306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS2		0x02	/* (1/7.2.4) */
5962306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS3		0x03	/* (1/7.2.5) */
6062306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS4		0x04	/* (1/7.2.6) */
6162306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS5		0x05	/* (1/7.2.7) */
6262306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS6		0x06	/* (1/7.2.8) */
6362306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS7		0x07	/* (1/7.2.9) */
6462306a36Sopenharmony_ci#define CHARSPEC_TYPE_CS8		0x08	/* (1/7.2.10) */
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* Fixed-length character fields - d-string (EMCA 167r3 1/7.2.12) */
6762306a36Sopenharmony_citypedef uint8_t		dstring;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* Timestamp (ECMA 167r3 1/7.3) */
7062306a36Sopenharmony_cistruct timestamp {
7162306a36Sopenharmony_ci	__le16		typeAndTimezone;
7262306a36Sopenharmony_ci	__le16		year;
7362306a36Sopenharmony_ci	uint8_t		month;
7462306a36Sopenharmony_ci	uint8_t		day;
7562306a36Sopenharmony_ci	uint8_t		hour;
7662306a36Sopenharmony_ci	uint8_t		minute;
7762306a36Sopenharmony_ci	uint8_t		second;
7862306a36Sopenharmony_ci	uint8_t		centiseconds;
7962306a36Sopenharmony_ci	uint8_t		hundredsOfMicroseconds;
8062306a36Sopenharmony_ci	uint8_t		microseconds;
8162306a36Sopenharmony_ci} __packed;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/* Type and Time Zone (ECMA 167r3 1/7.3.1) */
8462306a36Sopenharmony_ci#define TIMESTAMP_TYPE_MASK		0xF000
8562306a36Sopenharmony_ci#define TIMESTAMP_TYPE_CUT		0x0000
8662306a36Sopenharmony_ci#define TIMESTAMP_TYPE_LOCAL		0x1000
8762306a36Sopenharmony_ci#define TIMESTAMP_TYPE_AGREEMENT	0x2000
8862306a36Sopenharmony_ci#define TIMESTAMP_TIMEZONE_MASK		0x0FFF
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/* Entity identifier (ECMA 167r3 1/7.4) */
9162306a36Sopenharmony_cistruct regid {
9262306a36Sopenharmony_ci	uint8_t		flags;
9362306a36Sopenharmony_ci	uint8_t		ident[23];
9462306a36Sopenharmony_ci	uint8_t		identSuffix[8];
9562306a36Sopenharmony_ci} __packed;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* Flags (ECMA 167r3 1/7.4.1) */
9862306a36Sopenharmony_ci#define ENTITYID_FLAGS_DIRTY		0x01
9962306a36Sopenharmony_ci#define ENTITYID_FLAGS_PROTECTED	0x02
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
10262306a36Sopenharmony_ci#define VSD_STD_ID_LEN			5
10362306a36Sopenharmony_cistruct volStructDesc {
10462306a36Sopenharmony_ci	uint8_t		structType;
10562306a36Sopenharmony_ci	uint8_t		stdIdent[VSD_STD_ID_LEN];
10662306a36Sopenharmony_ci	uint8_t		structVersion;
10762306a36Sopenharmony_ci	uint8_t		structData[2041];
10862306a36Sopenharmony_ci} __packed;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/* Standard Identifier (EMCA 167r2 2/9.1.2) */
11162306a36Sopenharmony_ci#define VSD_STD_ID_NSR02		"NSR02"	/* (3/9.1) */
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci/* Standard Identifier (ECMA 167r3 2/9.1.2) */
11462306a36Sopenharmony_ci#define VSD_STD_ID_BEA01		"BEA01"	/* (2/9.2) */
11562306a36Sopenharmony_ci#define VSD_STD_ID_BOOT2		"BOOT2"	/* (2/9.4) */
11662306a36Sopenharmony_ci#define VSD_STD_ID_CD001		"CD001"	/* (ECMA-119) */
11762306a36Sopenharmony_ci#define VSD_STD_ID_CDW02		"CDW02"	/* (ECMA-168) */
11862306a36Sopenharmony_ci#define VSD_STD_ID_NSR03		"NSR03"	/* (3/9.1) */
11962306a36Sopenharmony_ci#define VSD_STD_ID_TEA01		"TEA01"	/* (2/9.3) */
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci/* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */
12262306a36Sopenharmony_cistruct beginningExtendedAreaDesc {
12362306a36Sopenharmony_ci	uint8_t		structType;
12462306a36Sopenharmony_ci	uint8_t		stdIdent[VSD_STD_ID_LEN];
12562306a36Sopenharmony_ci	uint8_t		structVersion;
12662306a36Sopenharmony_ci	uint8_t		structData[2041];
12762306a36Sopenharmony_ci} __packed;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci/* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */
13062306a36Sopenharmony_cistruct terminatingExtendedAreaDesc {
13162306a36Sopenharmony_ci	uint8_t		structType;
13262306a36Sopenharmony_ci	uint8_t		stdIdent[VSD_STD_ID_LEN];
13362306a36Sopenharmony_ci	uint8_t		structVersion;
13462306a36Sopenharmony_ci	uint8_t		structData[2041];
13562306a36Sopenharmony_ci} __packed;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/* Boot Descriptor (ECMA 167r3 2/9.4) */
13862306a36Sopenharmony_cistruct bootDesc {
13962306a36Sopenharmony_ci	uint8_t			structType;
14062306a36Sopenharmony_ci	uint8_t			stdIdent[VSD_STD_ID_LEN];
14162306a36Sopenharmony_ci	uint8_t			structVersion;
14262306a36Sopenharmony_ci	uint8_t			reserved1;
14362306a36Sopenharmony_ci	struct regid		archType;
14462306a36Sopenharmony_ci	struct regid		bootIdent;
14562306a36Sopenharmony_ci	__le32			bootExtLocation;
14662306a36Sopenharmony_ci	__le32			bootExtLength;
14762306a36Sopenharmony_ci	__le64			loadAddress;
14862306a36Sopenharmony_ci	__le64			startAddress;
14962306a36Sopenharmony_ci	struct timestamp	descCreationDateAndTime;
15062306a36Sopenharmony_ci	__le16			flags;
15162306a36Sopenharmony_ci	uint8_t			reserved2[32];
15262306a36Sopenharmony_ci	uint8_t			bootUse[1906];
15362306a36Sopenharmony_ci} __packed;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci/* Flags (ECMA 167r3 2/9.4.12) */
15662306a36Sopenharmony_ci#define BOOT_FLAGS_ERASE		0x01
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* Extent Descriptor (ECMA 167r3 3/7.1) */
15962306a36Sopenharmony_cistruct extent_ad {
16062306a36Sopenharmony_ci	__le32		extLength;
16162306a36Sopenharmony_ci	__le32		extLocation;
16262306a36Sopenharmony_ci} __packed;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistruct kernel_extent_ad {
16562306a36Sopenharmony_ci	uint32_t	extLength;
16662306a36Sopenharmony_ci	uint32_t	extLocation;
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci/* Descriptor Tag (ECMA 167r3 3/7.2) */
17062306a36Sopenharmony_cistruct tag {
17162306a36Sopenharmony_ci	__le16		tagIdent;
17262306a36Sopenharmony_ci	__le16		descVersion;
17362306a36Sopenharmony_ci	uint8_t		tagChecksum;
17462306a36Sopenharmony_ci	uint8_t		reserved;
17562306a36Sopenharmony_ci	__le16		tagSerialNum;
17662306a36Sopenharmony_ci	__le16		descCRC;
17762306a36Sopenharmony_ci	__le16		descCRCLength;
17862306a36Sopenharmony_ci	__le32		tagLocation;
17962306a36Sopenharmony_ci} __packed;
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci/* Tag Identifier (ECMA 167r3 3/7.2.1) */
18262306a36Sopenharmony_ci#define TAG_IDENT_PVD			0x0001
18362306a36Sopenharmony_ci#define TAG_IDENT_AVDP			0x0002
18462306a36Sopenharmony_ci#define TAG_IDENT_VDP			0x0003
18562306a36Sopenharmony_ci#define TAG_IDENT_IUVD			0x0004
18662306a36Sopenharmony_ci#define TAG_IDENT_PD			0x0005
18762306a36Sopenharmony_ci#define TAG_IDENT_LVD			0x0006
18862306a36Sopenharmony_ci#define TAG_IDENT_USD			0x0007
18962306a36Sopenharmony_ci#define TAG_IDENT_TD			0x0008
19062306a36Sopenharmony_ci#define TAG_IDENT_LVID			0x0009
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci/* NSR Descriptor (ECMA 167r3 3/9.1) */
19362306a36Sopenharmony_cistruct NSRDesc {
19462306a36Sopenharmony_ci	uint8_t		structType;
19562306a36Sopenharmony_ci	uint8_t		stdIdent[VSD_STD_ID_LEN];
19662306a36Sopenharmony_ci	uint8_t		structVersion;
19762306a36Sopenharmony_ci	uint8_t		reserved;
19862306a36Sopenharmony_ci	uint8_t		structData[2040];
19962306a36Sopenharmony_ci} __packed;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci/* Generic Descriptor */
20262306a36Sopenharmony_cistruct genericDesc {
20362306a36Sopenharmony_ci	struct tag	descTag;
20462306a36Sopenharmony_ci	__le32		volDescSeqNum;
20562306a36Sopenharmony_ci	uint8_t		reserved[492];
20662306a36Sopenharmony_ci} __packed;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */
20962306a36Sopenharmony_cistruct primaryVolDesc {
21062306a36Sopenharmony_ci	struct tag		descTag;
21162306a36Sopenharmony_ci	__le32			volDescSeqNum;
21262306a36Sopenharmony_ci	__le32			primaryVolDescNum;
21362306a36Sopenharmony_ci	dstring			volIdent[32];
21462306a36Sopenharmony_ci	__le16			volSeqNum;
21562306a36Sopenharmony_ci	__le16			maxVolSeqNum;
21662306a36Sopenharmony_ci	__le16			interchangeLvl;
21762306a36Sopenharmony_ci	__le16			maxInterchangeLvl;
21862306a36Sopenharmony_ci	__le32			charSetList;
21962306a36Sopenharmony_ci	__le32			maxCharSetList;
22062306a36Sopenharmony_ci	dstring			volSetIdent[128];
22162306a36Sopenharmony_ci	struct charspec		descCharSet;
22262306a36Sopenharmony_ci	struct charspec		explanatoryCharSet;
22362306a36Sopenharmony_ci	struct extent_ad	volAbstract;
22462306a36Sopenharmony_ci	struct extent_ad	volCopyright;
22562306a36Sopenharmony_ci	struct regid		appIdent;
22662306a36Sopenharmony_ci	struct timestamp	recordingDateAndTime;
22762306a36Sopenharmony_ci	struct regid		impIdent;
22862306a36Sopenharmony_ci	uint8_t			impUse[64];
22962306a36Sopenharmony_ci	__le32			predecessorVolDescSeqLocation;
23062306a36Sopenharmony_ci	__le16			flags;
23162306a36Sopenharmony_ci	uint8_t			reserved[22];
23262306a36Sopenharmony_ci} __packed;
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci/* Flags (ECMA 167r3 3/10.1.21) */
23562306a36Sopenharmony_ci#define PVD_FLAGS_VSID_COMMON		0x0001
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci/* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */
23862306a36Sopenharmony_cistruct anchorVolDescPtr {
23962306a36Sopenharmony_ci	struct tag		descTag;
24062306a36Sopenharmony_ci	struct extent_ad	mainVolDescSeqExt;
24162306a36Sopenharmony_ci	struct extent_ad	reserveVolDescSeqExt;
24262306a36Sopenharmony_ci	uint8_t	 		reserved[480];
24362306a36Sopenharmony_ci} __packed;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci/* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */
24662306a36Sopenharmony_cistruct volDescPtr {
24762306a36Sopenharmony_ci	struct tag		descTag;
24862306a36Sopenharmony_ci	__le32			volDescSeqNum;
24962306a36Sopenharmony_ci	struct extent_ad	nextVolDescSeqExt;
25062306a36Sopenharmony_ci	uint8_t			reserved[484];
25162306a36Sopenharmony_ci} __packed;
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci/* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */
25462306a36Sopenharmony_cistruct impUseVolDesc {
25562306a36Sopenharmony_ci	struct tag	descTag;
25662306a36Sopenharmony_ci	__le32		volDescSeqNum;
25762306a36Sopenharmony_ci	struct regid	impIdent;
25862306a36Sopenharmony_ci	uint8_t		impUse[460];
25962306a36Sopenharmony_ci} __packed;
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci/* Partition Descriptor (ECMA 167r3 3/10.5) */
26262306a36Sopenharmony_cistruct partitionDesc {
26362306a36Sopenharmony_ci	struct tag descTag;
26462306a36Sopenharmony_ci	__le32 volDescSeqNum;
26562306a36Sopenharmony_ci	__le16 partitionFlags;
26662306a36Sopenharmony_ci	__le16 partitionNumber;
26762306a36Sopenharmony_ci	struct regid partitionContents;
26862306a36Sopenharmony_ci	uint8_t partitionContentsUse[128];
26962306a36Sopenharmony_ci	__le32 accessType;
27062306a36Sopenharmony_ci	__le32 partitionStartingLocation;
27162306a36Sopenharmony_ci	__le32 partitionLength;
27262306a36Sopenharmony_ci	struct regid impIdent;
27362306a36Sopenharmony_ci	uint8_t impUse[128];
27462306a36Sopenharmony_ci	uint8_t reserved[156];
27562306a36Sopenharmony_ci} __packed;
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci/* Partition Flags (ECMA 167r3 3/10.5.3) */
27862306a36Sopenharmony_ci#define PD_PARTITION_FLAGS_ALLOC	0x0001
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci/* Partition Contents (ECMA 167r2 3/10.5.3) */
28162306a36Sopenharmony_ci#define PD_PARTITION_CONTENTS_NSR02	"+NSR02"
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci/* Partition Contents (ECMA 167r3 3/10.5.5) */
28462306a36Sopenharmony_ci#define PD_PARTITION_CONTENTS_FDC01	"+FDC01"
28562306a36Sopenharmony_ci#define PD_PARTITION_CONTENTS_CD001	"+CD001"
28662306a36Sopenharmony_ci#define PD_PARTITION_CONTENTS_CDW02	"+CDW02"
28762306a36Sopenharmony_ci#define PD_PARTITION_CONTENTS_NSR03	"+NSR03"
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci/* Access Type (ECMA 167r3 3/10.5.7) */
29062306a36Sopenharmony_ci#define PD_ACCESS_TYPE_NONE		0x00000000
29162306a36Sopenharmony_ci#define PD_ACCESS_TYPE_READ_ONLY	0x00000001
29262306a36Sopenharmony_ci#define PD_ACCESS_TYPE_WRITE_ONCE	0x00000002
29362306a36Sopenharmony_ci#define PD_ACCESS_TYPE_REWRITABLE	0x00000003
29462306a36Sopenharmony_ci#define PD_ACCESS_TYPE_OVERWRITABLE	0x00000004
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/* Logical Volume Descriptor (ECMA 167r3 3/10.6) */
29762306a36Sopenharmony_cistruct logicalVolDesc {
29862306a36Sopenharmony_ci	struct tag		descTag;
29962306a36Sopenharmony_ci	__le32			volDescSeqNum;
30062306a36Sopenharmony_ci	struct charspec		descCharSet;
30162306a36Sopenharmony_ci	dstring			logicalVolIdent[128];
30262306a36Sopenharmony_ci	__le32			logicalBlockSize;
30362306a36Sopenharmony_ci	struct regid		domainIdent;
30462306a36Sopenharmony_ci	uint8_t			logicalVolContentsUse[16];
30562306a36Sopenharmony_ci	__le32			mapTableLength;
30662306a36Sopenharmony_ci	__le32			numPartitionMaps;
30762306a36Sopenharmony_ci	struct regid		impIdent;
30862306a36Sopenharmony_ci	uint8_t			impUse[128];
30962306a36Sopenharmony_ci	struct extent_ad	integritySeqExt;
31062306a36Sopenharmony_ci	uint8_t			partitionMaps[];
31162306a36Sopenharmony_ci} __packed;
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci/* Generic Partition Map (ECMA 167r3 3/10.7.1) */
31462306a36Sopenharmony_cistruct genericPartitionMap {
31562306a36Sopenharmony_ci	uint8_t		partitionMapType;
31662306a36Sopenharmony_ci	uint8_t		partitionMapLength;
31762306a36Sopenharmony_ci	uint8_t		partitionMapping[];
31862306a36Sopenharmony_ci} __packed;
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */
32162306a36Sopenharmony_ci#define GP_PARTITION_MAP_TYPE_UNDEF	0x00
32262306a36Sopenharmony_ci#define GP_PARTITION_MAP_TYPE_1		0x01
32362306a36Sopenharmony_ci#define GP_PARTITION_MAP_TYPE_2		0x02
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
32662306a36Sopenharmony_cistruct genericPartitionMap1 {
32762306a36Sopenharmony_ci	uint8_t		partitionMapType;
32862306a36Sopenharmony_ci	uint8_t		partitionMapLength;
32962306a36Sopenharmony_ci	__le16		volSeqNum;
33062306a36Sopenharmony_ci	__le16		partitionNum;
33162306a36Sopenharmony_ci} __packed;
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci/* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */
33462306a36Sopenharmony_cistruct genericPartitionMap2 {
33562306a36Sopenharmony_ci	uint8_t		partitionMapType;
33662306a36Sopenharmony_ci	uint8_t		partitionMapLength;
33762306a36Sopenharmony_ci	uint8_t		partitionIdent[62];
33862306a36Sopenharmony_ci} __packed;
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci/* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */
34162306a36Sopenharmony_cistruct unallocSpaceDesc {
34262306a36Sopenharmony_ci	struct tag		descTag;
34362306a36Sopenharmony_ci	__le32			volDescSeqNum;
34462306a36Sopenharmony_ci	__le32			numAllocDescs;
34562306a36Sopenharmony_ci	struct extent_ad	allocDescs[];
34662306a36Sopenharmony_ci} __packed;
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci/* Terminating Descriptor (ECMA 167r3 3/10.9) */
34962306a36Sopenharmony_cistruct terminatingDesc {
35062306a36Sopenharmony_ci	struct tag	descTag;
35162306a36Sopenharmony_ci	uint8_t		reserved[496];
35262306a36Sopenharmony_ci} __packed;
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */
35562306a36Sopenharmony_cistruct logicalVolIntegrityDesc {
35662306a36Sopenharmony_ci	struct tag		descTag;
35762306a36Sopenharmony_ci	struct timestamp	recordingDateAndTime;
35862306a36Sopenharmony_ci	__le32			integrityType;
35962306a36Sopenharmony_ci	struct extent_ad	nextIntegrityExt;
36062306a36Sopenharmony_ci	uint8_t			logicalVolContentsUse[32];
36162306a36Sopenharmony_ci	__le32			numOfPartitions;
36262306a36Sopenharmony_ci	__le32			lengthOfImpUse;
36362306a36Sopenharmony_ci	__le32			freeSpaceTable[];
36462306a36Sopenharmony_ci	/* __le32		sizeTable[]; */
36562306a36Sopenharmony_ci	/* uint8_t		impUse[]; */
36662306a36Sopenharmony_ci} __packed;
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci/* Integrity Type (ECMA 167r3 3/10.10.3) */
36962306a36Sopenharmony_ci#define LVID_INTEGRITY_TYPE_OPEN	0x00000000
37062306a36Sopenharmony_ci#define LVID_INTEGRITY_TYPE_CLOSE	0x00000001
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci/* Recorded Address (ECMA 167r3 4/7.1) */
37362306a36Sopenharmony_cistruct lb_addr {
37462306a36Sopenharmony_ci	__le32		logicalBlockNum;
37562306a36Sopenharmony_ci	__le16	 	partitionReferenceNum;
37662306a36Sopenharmony_ci} __packed;
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci/* ... and its in-core analog */
37962306a36Sopenharmony_cistruct kernel_lb_addr {
38062306a36Sopenharmony_ci	uint32_t		logicalBlockNum;
38162306a36Sopenharmony_ci	uint16_t	 	partitionReferenceNum;
38262306a36Sopenharmony_ci};
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
38562306a36Sopenharmony_cistruct short_ad {
38662306a36Sopenharmony_ci        __le32		extLength;
38762306a36Sopenharmony_ci        __le32		extPosition;
38862306a36Sopenharmony_ci} __packed;
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
39162306a36Sopenharmony_cistruct long_ad {
39262306a36Sopenharmony_ci	__le32		extLength;
39362306a36Sopenharmony_ci	struct lb_addr	extLocation;
39462306a36Sopenharmony_ci	uint8_t		impUse[6];
39562306a36Sopenharmony_ci} __packed;
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_cistruct kernel_long_ad {
39862306a36Sopenharmony_ci	uint32_t		extLength;
39962306a36Sopenharmony_ci	struct kernel_lb_addr	extLocation;
40062306a36Sopenharmony_ci	uint8_t			impUse[6];
40162306a36Sopenharmony_ci};
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
40462306a36Sopenharmony_cistruct ext_ad {
40562306a36Sopenharmony_ci	__le32		extLength;
40662306a36Sopenharmony_ci	__le32		recordedLength;
40762306a36Sopenharmony_ci	__le32		informationLength;
40862306a36Sopenharmony_ci	struct lb_addr	extLocation;
40962306a36Sopenharmony_ci} __packed;
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_cistruct kernel_ext_ad {
41262306a36Sopenharmony_ci	uint32_t		extLength;
41362306a36Sopenharmony_ci	uint32_t		recordedLength;
41462306a36Sopenharmony_ci	uint32_t		informationLength;
41562306a36Sopenharmony_ci	struct kernel_lb_addr	extLocation;
41662306a36Sopenharmony_ci};
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci/* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci/* Tag Identifier (ECMA 167r3 4/7.2.1) */
42162306a36Sopenharmony_ci#define TAG_IDENT_FSD			0x0100
42262306a36Sopenharmony_ci#define TAG_IDENT_FID			0x0101
42362306a36Sopenharmony_ci#define TAG_IDENT_AED			0x0102
42462306a36Sopenharmony_ci#define TAG_IDENT_IE			0x0103
42562306a36Sopenharmony_ci#define TAG_IDENT_TE			0x0104
42662306a36Sopenharmony_ci#define TAG_IDENT_FE			0x0105
42762306a36Sopenharmony_ci#define TAG_IDENT_EAHD			0x0106
42862306a36Sopenharmony_ci#define TAG_IDENT_USE			0x0107
42962306a36Sopenharmony_ci#define TAG_IDENT_SBD			0x0108
43062306a36Sopenharmony_ci#define TAG_IDENT_PIE			0x0109
43162306a36Sopenharmony_ci#define TAG_IDENT_EFE			0x010A
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci/* File Set Descriptor (ECMA 167r3 4/14.1) */
43462306a36Sopenharmony_cistruct fileSetDesc {
43562306a36Sopenharmony_ci	struct tag		descTag;
43662306a36Sopenharmony_ci	struct timestamp	recordingDateAndTime;
43762306a36Sopenharmony_ci	__le16			interchangeLvl;
43862306a36Sopenharmony_ci	__le16			maxInterchangeLvl;
43962306a36Sopenharmony_ci	__le32			charSetList;
44062306a36Sopenharmony_ci	__le32			maxCharSetList;
44162306a36Sopenharmony_ci	__le32			fileSetNum;
44262306a36Sopenharmony_ci	__le32			fileSetDescNum;
44362306a36Sopenharmony_ci	struct charspec		logicalVolIdentCharSet;
44462306a36Sopenharmony_ci	dstring			logicalVolIdent[128];
44562306a36Sopenharmony_ci	struct charspec		fileSetCharSet;
44662306a36Sopenharmony_ci	dstring			fileSetIdent[32];
44762306a36Sopenharmony_ci	dstring			copyrightFileIdent[32];
44862306a36Sopenharmony_ci	dstring			abstractFileIdent[32];
44962306a36Sopenharmony_ci	struct long_ad		rootDirectoryICB;
45062306a36Sopenharmony_ci	struct regid		domainIdent;
45162306a36Sopenharmony_ci	struct long_ad		nextExt;
45262306a36Sopenharmony_ci	struct long_ad		streamDirectoryICB;
45362306a36Sopenharmony_ci	uint8_t			reserved[32];
45462306a36Sopenharmony_ci} __packed;
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci/* Partition Header Descriptor (ECMA 167r3 4/14.3) */
45762306a36Sopenharmony_cistruct partitionHeaderDesc {
45862306a36Sopenharmony_ci	struct short_ad	unallocSpaceTable;
45962306a36Sopenharmony_ci	struct short_ad	unallocSpaceBitmap;
46062306a36Sopenharmony_ci	struct short_ad	partitionIntegrityTable;
46162306a36Sopenharmony_ci	struct short_ad	freedSpaceTable;
46262306a36Sopenharmony_ci	struct short_ad	freedSpaceBitmap;
46362306a36Sopenharmony_ci	uint8_t		reserved[88];
46462306a36Sopenharmony_ci} __packed;
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci/* File Identifier Descriptor (ECMA 167r3 4/14.4) */
46762306a36Sopenharmony_cistruct fileIdentDesc {
46862306a36Sopenharmony_ci	struct tag	descTag;
46962306a36Sopenharmony_ci	__le16		fileVersionNum;
47062306a36Sopenharmony_ci	uint8_t		fileCharacteristics;
47162306a36Sopenharmony_ci	uint8_t		lengthFileIdent;
47262306a36Sopenharmony_ci	struct long_ad	icb;
47362306a36Sopenharmony_ci	__le16		lengthOfImpUse;
47462306a36Sopenharmony_ci	uint8_t		impUse[];
47562306a36Sopenharmony_ci	/* uint8_t	fileIdent[]; */
47662306a36Sopenharmony_ci	/* uint8_t	padding[]; */
47762306a36Sopenharmony_ci} __packed;
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci/* File Characteristics (ECMA 167r3 4/14.4.3) */
48062306a36Sopenharmony_ci#define FID_FILE_CHAR_HIDDEN		0x01
48162306a36Sopenharmony_ci#define FID_FILE_CHAR_DIRECTORY		0x02
48262306a36Sopenharmony_ci#define FID_FILE_CHAR_DELETED		0x04
48362306a36Sopenharmony_ci#define FID_FILE_CHAR_PARENT		0x08
48462306a36Sopenharmony_ci#define FID_FILE_CHAR_METADATA		0x10
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci/* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */
48762306a36Sopenharmony_cistruct allocExtDesc {
48862306a36Sopenharmony_ci	struct tag	descTag;
48962306a36Sopenharmony_ci	__le32		previousAllocExtLocation;
49062306a36Sopenharmony_ci	__le32		lengthAllocDescs;
49162306a36Sopenharmony_ci} __packed;
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci/* ICB Tag (ECMA 167r3 4/14.6) */
49462306a36Sopenharmony_cistruct icbtag {
49562306a36Sopenharmony_ci	__le32		priorRecordedNumDirectEntries;
49662306a36Sopenharmony_ci	__le16		strategyType;
49762306a36Sopenharmony_ci	__le16		strategyParameter;
49862306a36Sopenharmony_ci	__le16		numEntries;
49962306a36Sopenharmony_ci	uint8_t		reserved;
50062306a36Sopenharmony_ci	uint8_t		fileType;
50162306a36Sopenharmony_ci	struct lb_addr	parentICBLocation;
50262306a36Sopenharmony_ci	__le16		flags;
50362306a36Sopenharmony_ci} __packed;
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci/* Strategy Type (ECMA 167r3 4/14.6.2) */
50662306a36Sopenharmony_ci#define ICBTAG_STRATEGY_TYPE_UNDEF	0x0000
50762306a36Sopenharmony_ci#define ICBTAG_STRATEGY_TYPE_1		0x0001
50862306a36Sopenharmony_ci#define ICBTAG_STRATEGY_TYPE_2		0x0002
50962306a36Sopenharmony_ci#define ICBTAG_STRATEGY_TYPE_3		0x0003
51062306a36Sopenharmony_ci#define ICBTAG_STRATEGY_TYPE_4		0x0004
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci/* File Type (ECMA 167r3 4/14.6.6) */
51362306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_UNDEF		0x00
51462306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_USE		0x01
51562306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_PIE		0x02
51662306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_IE		0x03
51762306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_DIRECTORY	0x04
51862306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_REGULAR	0x05
51962306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_BLOCK		0x06
52062306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_CHAR		0x07
52162306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_EA		0x08
52262306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_FIFO		0x09
52362306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_SOCKET		0x0A
52462306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_TE		0x0B
52562306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_SYMLINK	0x0C
52662306a36Sopenharmony_ci#define ICBTAG_FILE_TYPE_STREAMDIR	0x0D
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci/* Flags (ECMA 167r3 4/14.6.8) */
52962306a36Sopenharmony_ci#define ICBTAG_FLAG_AD_MASK		0x0007
53062306a36Sopenharmony_ci#define ICBTAG_FLAG_AD_SHORT		0x0000
53162306a36Sopenharmony_ci#define ICBTAG_FLAG_AD_LONG		0x0001
53262306a36Sopenharmony_ci#define ICBTAG_FLAG_AD_EXTENDED		0x0002
53362306a36Sopenharmony_ci#define ICBTAG_FLAG_AD_IN_ICB		0x0003
53462306a36Sopenharmony_ci#define ICBTAG_FLAG_SORTED		0x0008
53562306a36Sopenharmony_ci#define ICBTAG_FLAG_NONRELOCATABLE	0x0010
53662306a36Sopenharmony_ci#define ICBTAG_FLAG_ARCHIVE		0x0020
53762306a36Sopenharmony_ci#define ICBTAG_FLAG_SETUID		0x0040
53862306a36Sopenharmony_ci#define ICBTAG_FLAG_SETGID		0x0080
53962306a36Sopenharmony_ci#define ICBTAG_FLAG_STICKY		0x0100
54062306a36Sopenharmony_ci#define ICBTAG_FLAG_CONTIGUOUS		0x0200
54162306a36Sopenharmony_ci#define ICBTAG_FLAG_SYSTEM		0x0400
54262306a36Sopenharmony_ci#define ICBTAG_FLAG_TRANSFORMED		0x0800
54362306a36Sopenharmony_ci#define ICBTAG_FLAG_MULTIVERSIONS	0x1000
54462306a36Sopenharmony_ci#define ICBTAG_FLAG_STREAM		0x2000
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci/* Indirect Entry (ECMA 167r3 4/14.7) */
54762306a36Sopenharmony_cistruct indirectEntry {
54862306a36Sopenharmony_ci	struct tag	descTag;
54962306a36Sopenharmony_ci	struct icbtag	icbTag;
55062306a36Sopenharmony_ci	struct long_ad	indirectICB;
55162306a36Sopenharmony_ci} __packed;
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci/* Terminal Entry (ECMA 167r3 4/14.8) */
55462306a36Sopenharmony_cistruct terminalEntry {
55562306a36Sopenharmony_ci	struct tag	descTag;
55662306a36Sopenharmony_ci	struct icbtag	icbTag;
55762306a36Sopenharmony_ci} __packed;
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci/* File Entry (ECMA 167r3 4/14.9) */
56062306a36Sopenharmony_cistruct fileEntry {
56162306a36Sopenharmony_ci	struct tag		descTag;
56262306a36Sopenharmony_ci	struct icbtag		icbTag;
56362306a36Sopenharmony_ci	__le32			uid;
56462306a36Sopenharmony_ci	__le32			gid;
56562306a36Sopenharmony_ci	__le32			permissions;
56662306a36Sopenharmony_ci	__le16			fileLinkCount;
56762306a36Sopenharmony_ci	uint8_t			recordFormat;
56862306a36Sopenharmony_ci	uint8_t			recordDisplayAttr;
56962306a36Sopenharmony_ci	__le32			recordLength;
57062306a36Sopenharmony_ci	__le64			informationLength;
57162306a36Sopenharmony_ci	__le64			logicalBlocksRecorded;
57262306a36Sopenharmony_ci	struct timestamp	accessTime;
57362306a36Sopenharmony_ci	struct timestamp	modificationTime;
57462306a36Sopenharmony_ci	struct timestamp	attrTime;
57562306a36Sopenharmony_ci	__le32			checkpoint;
57662306a36Sopenharmony_ci	struct long_ad		extendedAttrICB;
57762306a36Sopenharmony_ci	struct regid		impIdent;
57862306a36Sopenharmony_ci	__le64			uniqueID;
57962306a36Sopenharmony_ci	__le32			lengthExtendedAttr;
58062306a36Sopenharmony_ci	__le32			lengthAllocDescs;
58162306a36Sopenharmony_ci	uint8_t			extendedAttr[];
58262306a36Sopenharmony_ci	/* uint8_t		allocDescs[]; */
58362306a36Sopenharmony_ci} __packed;
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci/* Permissions (ECMA 167r3 4/14.9.5) */
58662306a36Sopenharmony_ci#define FE_PERM_O_EXEC			0x00000001U
58762306a36Sopenharmony_ci#define FE_PERM_O_WRITE			0x00000002U
58862306a36Sopenharmony_ci#define FE_PERM_O_READ			0x00000004U
58962306a36Sopenharmony_ci#define FE_PERM_O_CHATTR		0x00000008U
59062306a36Sopenharmony_ci#define FE_PERM_O_DELETE		0x00000010U
59162306a36Sopenharmony_ci#define FE_PERM_G_EXEC			0x00000020U
59262306a36Sopenharmony_ci#define FE_PERM_G_WRITE			0x00000040U
59362306a36Sopenharmony_ci#define FE_PERM_G_READ			0x00000080U
59462306a36Sopenharmony_ci#define FE_PERM_G_CHATTR		0x00000100U
59562306a36Sopenharmony_ci#define FE_PERM_G_DELETE		0x00000200U
59662306a36Sopenharmony_ci#define FE_PERM_U_EXEC			0x00000400U
59762306a36Sopenharmony_ci#define FE_PERM_U_WRITE			0x00000800U
59862306a36Sopenharmony_ci#define FE_PERM_U_READ			0x00001000U
59962306a36Sopenharmony_ci#define FE_PERM_U_CHATTR		0x00002000U
60062306a36Sopenharmony_ci#define FE_PERM_U_DELETE		0x00004000U
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci/* Record Format (ECMA 167r3 4/14.9.7) */
60362306a36Sopenharmony_ci#define FE_RECORD_FMT_UNDEF		0x00
60462306a36Sopenharmony_ci#define FE_RECORD_FMT_FIXED_PAD		0x01
60562306a36Sopenharmony_ci#define FE_RECORD_FMT_FIXED		0x02
60662306a36Sopenharmony_ci#define FE_RECORD_FMT_VARIABLE8		0x03
60762306a36Sopenharmony_ci#define FE_RECORD_FMT_VARIABLE16	0x04
60862306a36Sopenharmony_ci#define FE_RECORD_FMT_VARIABLE16_MSB	0x05
60962306a36Sopenharmony_ci#define FE_RECORD_FMT_VARIABLE32	0x06
61062306a36Sopenharmony_ci#define FE_RECORD_FMT_PRINT		0x07
61162306a36Sopenharmony_ci#define FE_RECORD_FMT_LF		0x08
61262306a36Sopenharmony_ci#define FE_RECORD_FMT_CR		0x09
61362306a36Sopenharmony_ci#define FE_RECORD_FMT_CRLF		0x0A
61462306a36Sopenharmony_ci#define FE_RECORD_FMT_LFCR		0x0B
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci/* Record Display Attributes (ECMA 167r3 4/14.9.8) */
61762306a36Sopenharmony_ci#define FE_RECORD_DISPLAY_ATTR_UNDEF	0x00
61862306a36Sopenharmony_ci#define FE_RECORD_DISPLAY_ATTR_1	0x01
61962306a36Sopenharmony_ci#define FE_RECORD_DISPLAY_ATTR_2	0x02
62062306a36Sopenharmony_ci#define FE_RECORD_DISPLAY_ATTR_3	0x03
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci/* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */
62362306a36Sopenharmony_cistruct extendedAttrHeaderDesc {
62462306a36Sopenharmony_ci	struct tag	descTag;
62562306a36Sopenharmony_ci	__le32		impAttrLocation;
62662306a36Sopenharmony_ci	__le32		appAttrLocation;
62762306a36Sopenharmony_ci} __packed;
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci/* Generic Format (ECMA 167r3 4/14.10.2) */
63062306a36Sopenharmony_cistruct genericFormat {
63162306a36Sopenharmony_ci	__le32		attrType;
63262306a36Sopenharmony_ci	uint8_t		attrSubtype;
63362306a36Sopenharmony_ci	uint8_t		reserved[3];
63462306a36Sopenharmony_ci	__le32		attrLength;
63562306a36Sopenharmony_ci	uint8_t		attrData[];
63662306a36Sopenharmony_ci} __packed;
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci/* Character Set Information (ECMA 167r3 4/14.10.3) */
63962306a36Sopenharmony_cistruct charSetInfo {
64062306a36Sopenharmony_ci	__le32		attrType;
64162306a36Sopenharmony_ci	uint8_t		attrSubtype;
64262306a36Sopenharmony_ci	uint8_t		reserved[3];
64362306a36Sopenharmony_ci	__le32		attrLength;
64462306a36Sopenharmony_ci	__le32		escapeSeqLength;
64562306a36Sopenharmony_ci	uint8_t		charSetType;
64662306a36Sopenharmony_ci	uint8_t		escapeSeq[];
64762306a36Sopenharmony_ci} __packed;
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci/* Alternate Permissions (ECMA 167r3 4/14.10.4) */
65062306a36Sopenharmony_cistruct altPerms {
65162306a36Sopenharmony_ci	__le32		attrType;
65262306a36Sopenharmony_ci	uint8_t		attrSubtype;
65362306a36Sopenharmony_ci	uint8_t		reserved[3];
65462306a36Sopenharmony_ci	__le32		attrLength;
65562306a36Sopenharmony_ci	__le16		ownerIdent;
65662306a36Sopenharmony_ci	__le16		groupIdent;
65762306a36Sopenharmony_ci	__le16		permission;
65862306a36Sopenharmony_ci} __packed;
65962306a36Sopenharmony_ci
66062306a36Sopenharmony_ci/* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */
66162306a36Sopenharmony_cistruct fileTimesExtAttr {
66262306a36Sopenharmony_ci	__le32		attrType;
66362306a36Sopenharmony_ci	uint8_t		attrSubtype;
66462306a36Sopenharmony_ci	uint8_t		reserved[3];
66562306a36Sopenharmony_ci	__le32		attrLength;
66662306a36Sopenharmony_ci	__le32		dataLength;
66762306a36Sopenharmony_ci	__le32		fileTimeExistence;
66862306a36Sopenharmony_ci	uint8_t		fileTimes;
66962306a36Sopenharmony_ci} __packed;
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci/* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */
67262306a36Sopenharmony_ci#define FTE_CREATION			0x00000001
67362306a36Sopenharmony_ci#define FTE_DELETION			0x00000004
67462306a36Sopenharmony_ci#define FTE_EFFECTIVE			0x00000008
67562306a36Sopenharmony_ci#define FTE_BACKUP			0x00000002
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci/* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */
67862306a36Sopenharmony_cistruct infoTimesExtAttr {
67962306a36Sopenharmony_ci	__le32		attrType;
68062306a36Sopenharmony_ci	uint8_t		attrSubtype;
68162306a36Sopenharmony_ci	uint8_t		reserved[3];
68262306a36Sopenharmony_ci	__le32		attrLength;
68362306a36Sopenharmony_ci	__le32		dataLength;
68462306a36Sopenharmony_ci	__le32		infoTimeExistence;
68562306a36Sopenharmony_ci	uint8_t		infoTimes[];
68662306a36Sopenharmony_ci} __packed;
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_ci/* Device Specification (ECMA 167r3 4/14.10.7) */
68962306a36Sopenharmony_cistruct deviceSpec {
69062306a36Sopenharmony_ci	__le32		attrType;
69162306a36Sopenharmony_ci	uint8_t		attrSubtype;
69262306a36Sopenharmony_ci	uint8_t		reserved[3];
69362306a36Sopenharmony_ci	__le32		attrLength;
69462306a36Sopenharmony_ci	__le32		impUseLength;
69562306a36Sopenharmony_ci	__le32		majorDeviceIdent;
69662306a36Sopenharmony_ci	__le32		minorDeviceIdent;
69762306a36Sopenharmony_ci	uint8_t		impUse[];
69862306a36Sopenharmony_ci} __packed;
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci/* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */
70162306a36Sopenharmony_cistruct impUseExtAttr {
70262306a36Sopenharmony_ci	__le32		attrType;
70362306a36Sopenharmony_ci	uint8_t		attrSubtype;
70462306a36Sopenharmony_ci	uint8_t		reserved[3];
70562306a36Sopenharmony_ci	__le32		attrLength;
70662306a36Sopenharmony_ci	__le32		impUseLength;
70762306a36Sopenharmony_ci	struct regid	impIdent;
70862306a36Sopenharmony_ci	uint8_t		impUse[];
70962306a36Sopenharmony_ci} __packed;
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci/* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */
71262306a36Sopenharmony_cistruct appUseExtAttr {
71362306a36Sopenharmony_ci	__le32		attrType;
71462306a36Sopenharmony_ci	uint8_t		attrSubtype;
71562306a36Sopenharmony_ci	uint8_t		reserved[3];
71662306a36Sopenharmony_ci	__le32		attrLength;
71762306a36Sopenharmony_ci	__le32		appUseLength;
71862306a36Sopenharmony_ci	struct regid	appIdent;
71962306a36Sopenharmony_ci	uint8_t		appUse[];
72062306a36Sopenharmony_ci} __packed;
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_ci#define EXTATTR_CHAR_SET		1
72362306a36Sopenharmony_ci#define EXTATTR_ALT_PERMS		3
72462306a36Sopenharmony_ci#define EXTATTR_FILE_TIMES		5
72562306a36Sopenharmony_ci#define EXTATTR_INFO_TIMES		6
72662306a36Sopenharmony_ci#define EXTATTR_DEV_SPEC		12
72762306a36Sopenharmony_ci#define EXTATTR_IMP_USE			2048
72862306a36Sopenharmony_ci#define EXTATTR_APP_USE			65536
72962306a36Sopenharmony_ci#define EXTATTR_SUBTYPE			1
73062306a36Sopenharmony_ci
73162306a36Sopenharmony_ci/* Unallocated Space Entry (ECMA 167r3 4/14.11) */
73262306a36Sopenharmony_cistruct unallocSpaceEntry {
73362306a36Sopenharmony_ci	struct tag	descTag;
73462306a36Sopenharmony_ci	struct icbtag	icbTag;
73562306a36Sopenharmony_ci	__le32		lengthAllocDescs;
73662306a36Sopenharmony_ci	uint8_t		allocDescs[];
73762306a36Sopenharmony_ci} __packed;
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci/* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */
74062306a36Sopenharmony_cistruct spaceBitmapDesc {
74162306a36Sopenharmony_ci	struct tag	descTag;
74262306a36Sopenharmony_ci	__le32		numOfBits;
74362306a36Sopenharmony_ci	__le32		numOfBytes;
74462306a36Sopenharmony_ci	uint8_t		bitmap[];
74562306a36Sopenharmony_ci} __packed;
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci/* Partition Integrity Entry (ECMA 167r3 4/14.13) */
74862306a36Sopenharmony_cistruct partitionIntegrityEntry {
74962306a36Sopenharmony_ci	struct tag		descTag;
75062306a36Sopenharmony_ci	struct icbtag		icbTag;
75162306a36Sopenharmony_ci	struct timestamp	recordingDateAndTime;
75262306a36Sopenharmony_ci	uint8_t			integrityType;
75362306a36Sopenharmony_ci	uint8_t			reserved[175];
75462306a36Sopenharmony_ci	struct regid		impIdent;
75562306a36Sopenharmony_ci	uint8_t			impUse[256];
75662306a36Sopenharmony_ci} __packed;
75762306a36Sopenharmony_ci
75862306a36Sopenharmony_ci/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci/* Extent Length (ECMA 167r3 4/14.14.1.1) */
76162306a36Sopenharmony_ci#define EXT_LENGTH_MASK			0x3FFFFFFF
76262306a36Sopenharmony_ci#define EXT_TYPE_MASK			0xC0000000
76362306a36Sopenharmony_ci#define EXT_RECORDED_ALLOCATED		0x00000000
76462306a36Sopenharmony_ci#define EXT_NOT_RECORDED_ALLOCATED	0x40000000
76562306a36Sopenharmony_ci#define EXT_NOT_RECORDED_NOT_ALLOCATED	0x80000000
76662306a36Sopenharmony_ci#define EXT_NEXT_EXTENT_ALLOCDESCS	0xC0000000
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_ci/* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */
77362306a36Sopenharmony_cistruct logicalVolHeaderDesc {
77462306a36Sopenharmony_ci	__le64		uniqueID;
77562306a36Sopenharmony_ci	uint8_t		reserved[24];
77662306a36Sopenharmony_ci} __packed;
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci/* Path Component (ECMA 167r3 4/14.16.1) */
77962306a36Sopenharmony_cistruct pathComponent {
78062306a36Sopenharmony_ci	uint8_t		componentType;
78162306a36Sopenharmony_ci	uint8_t		lengthComponentIdent;
78262306a36Sopenharmony_ci	__le16		componentFileVersionNum;
78362306a36Sopenharmony_ci	dchars		componentIdent[];
78462306a36Sopenharmony_ci} __packed;
78562306a36Sopenharmony_ci
78662306a36Sopenharmony_ci/* File Entry (ECMA 167r3 4/14.17) */
78762306a36Sopenharmony_cistruct extendedFileEntry {
78862306a36Sopenharmony_ci	struct tag		descTag;
78962306a36Sopenharmony_ci	struct icbtag		icbTag;
79062306a36Sopenharmony_ci	__le32			uid;
79162306a36Sopenharmony_ci	__le32			gid;
79262306a36Sopenharmony_ci	__le32			permissions;
79362306a36Sopenharmony_ci	__le16			fileLinkCount;
79462306a36Sopenharmony_ci	uint8_t			recordFormat;
79562306a36Sopenharmony_ci	uint8_t			recordDisplayAttr;
79662306a36Sopenharmony_ci	__le32			recordLength;
79762306a36Sopenharmony_ci	__le64			informationLength;
79862306a36Sopenharmony_ci	__le64			objectSize;
79962306a36Sopenharmony_ci	__le64			logicalBlocksRecorded;
80062306a36Sopenharmony_ci	struct timestamp	accessTime;
80162306a36Sopenharmony_ci	struct timestamp	modificationTime;
80262306a36Sopenharmony_ci	struct timestamp	createTime;
80362306a36Sopenharmony_ci	struct timestamp	attrTime;
80462306a36Sopenharmony_ci	__le32			checkpoint;
80562306a36Sopenharmony_ci	__le32			reserved;
80662306a36Sopenharmony_ci	struct long_ad		extendedAttrICB;
80762306a36Sopenharmony_ci	struct long_ad		streamDirectoryICB;
80862306a36Sopenharmony_ci	struct regid		impIdent;
80962306a36Sopenharmony_ci	__le64			uniqueID;
81062306a36Sopenharmony_ci	__le32			lengthExtendedAttr;
81162306a36Sopenharmony_ci	__le32			lengthAllocDescs;
81262306a36Sopenharmony_ci	uint8_t			extendedAttr[];
81362306a36Sopenharmony_ci	/* uint8_t		allocDescs[]; */
81462306a36Sopenharmony_ci} __packed;
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci#endif /* _ECMA_167_H */
817