xref: /OK3568_Linux_fs/kernel/fs/udf/ecma_167.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * ecma_167.h
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * This file is based on ECMA-167 3rd edition (June 1997)
5*4882a593Smuzhiyun  * https://www.ecma.ch
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (c) 2001-2002  Ben Fennema
8*4882a593Smuzhiyun  * Copyright (c) 2017-2019  Pali Rohár <pali@kernel.org>
9*4882a593Smuzhiyun  * All rights reserved.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Redistribution and use in source and binary forms, with or without
12*4882a593Smuzhiyun  * modification, are permitted provided that the following conditions
13*4882a593Smuzhiyun  * are met:
14*4882a593Smuzhiyun  * 1. Redistributions of source code must retain the above copyright
15*4882a593Smuzhiyun  *    notice, this list of conditions, and the following disclaimer,
16*4882a593Smuzhiyun  *    without modification.
17*4882a593Smuzhiyun  * 2. The name of the author may not be used to endorse or promote products
18*4882a593Smuzhiyun  *    derived from this software without specific prior written permission.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  * Alternatively, this software may be distributed under the terms of the
21*4882a593Smuzhiyun  * GNU Public License ("GPL").
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24*4882a593Smuzhiyun  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25*4882a593Smuzhiyun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26*4882a593Smuzhiyun  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
27*4882a593Smuzhiyun  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28*4882a593Smuzhiyun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29*4882a593Smuzhiyun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30*4882a593Smuzhiyun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31*4882a593Smuzhiyun  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32*4882a593Smuzhiyun  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33*4882a593Smuzhiyun  * SUCH DAMAGE.
34*4882a593Smuzhiyun  */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /**
37*4882a593Smuzhiyun  * @file
38*4882a593Smuzhiyun  * ECMA-167r3 defines and structure definitions
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #include <linux/types.h>
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #ifndef _ECMA_167_H
44*4882a593Smuzhiyun #define _ECMA_167_H 1
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /* Character sets and coding - d-characters (ECMA 167r3 1/7.2) */
47*4882a593Smuzhiyun typedef uint8_t		dchars;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* Character set specification (ECMA 167r3 1/7.2.1) */
50*4882a593Smuzhiyun struct charspec {
51*4882a593Smuzhiyun 	uint8_t		charSetType;
52*4882a593Smuzhiyun 	uint8_t		charSetInfo[63];
53*4882a593Smuzhiyun } __packed;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /* Character Set Type (ECMA 167r3 1/7.2.1.1) */
56*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS0		0x00	/* (1/7.2.2) */
57*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS1		0x01	/* (1/7.2.3) */
58*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS2		0x02	/* (1/7.2.4) */
59*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS3		0x03	/* (1/7.2.5) */
60*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS4		0x04	/* (1/7.2.6) */
61*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS5		0x05	/* (1/7.2.7) */
62*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS6		0x06	/* (1/7.2.8) */
63*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS7		0x07	/* (1/7.2.9) */
64*4882a593Smuzhiyun #define CHARSPEC_TYPE_CS8		0x08	/* (1/7.2.10) */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* Fixed-length character fields - d-string (EMCA 167r3 1/7.2.12) */
67*4882a593Smuzhiyun typedef uint8_t		dstring;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /* Timestamp (ECMA 167r3 1/7.3) */
70*4882a593Smuzhiyun struct timestamp {
71*4882a593Smuzhiyun 	__le16		typeAndTimezone;
72*4882a593Smuzhiyun 	__le16		year;
73*4882a593Smuzhiyun 	uint8_t		month;
74*4882a593Smuzhiyun 	uint8_t		day;
75*4882a593Smuzhiyun 	uint8_t		hour;
76*4882a593Smuzhiyun 	uint8_t		minute;
77*4882a593Smuzhiyun 	uint8_t		second;
78*4882a593Smuzhiyun 	uint8_t		centiseconds;
79*4882a593Smuzhiyun 	uint8_t		hundredsOfMicroseconds;
80*4882a593Smuzhiyun 	uint8_t		microseconds;
81*4882a593Smuzhiyun } __packed;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun /* Type and Time Zone (ECMA 167r3 1/7.3.1) */
84*4882a593Smuzhiyun #define TIMESTAMP_TYPE_MASK		0xF000
85*4882a593Smuzhiyun #define TIMESTAMP_TYPE_CUT		0x0000
86*4882a593Smuzhiyun #define TIMESTAMP_TYPE_LOCAL		0x1000
87*4882a593Smuzhiyun #define TIMESTAMP_TYPE_AGREEMENT	0x2000
88*4882a593Smuzhiyun #define TIMESTAMP_TIMEZONE_MASK		0x0FFF
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /* Entity identifier (ECMA 167r3 1/7.4) */
91*4882a593Smuzhiyun struct regid {
92*4882a593Smuzhiyun 	uint8_t		flags;
93*4882a593Smuzhiyun 	uint8_t		ident[23];
94*4882a593Smuzhiyun 	uint8_t		identSuffix[8];
95*4882a593Smuzhiyun } __packed;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* Flags (ECMA 167r3 1/7.4.1) */
98*4882a593Smuzhiyun #define ENTITYID_FLAGS_DIRTY		0x01
99*4882a593Smuzhiyun #define ENTITYID_FLAGS_PROTECTED	0x02
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
102*4882a593Smuzhiyun #define VSD_STD_ID_LEN			5
103*4882a593Smuzhiyun struct volStructDesc {
104*4882a593Smuzhiyun 	uint8_t		structType;
105*4882a593Smuzhiyun 	uint8_t		stdIdent[VSD_STD_ID_LEN];
106*4882a593Smuzhiyun 	uint8_t		structVersion;
107*4882a593Smuzhiyun 	uint8_t		structData[2041];
108*4882a593Smuzhiyun } __packed;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /* Standard Identifier (EMCA 167r2 2/9.1.2) */
111*4882a593Smuzhiyun #define VSD_STD_ID_NSR02		"NSR02"	/* (3/9.1) */
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /* Standard Identifier (ECMA 167r3 2/9.1.2) */
114*4882a593Smuzhiyun #define VSD_STD_ID_BEA01		"BEA01"	/* (2/9.2) */
115*4882a593Smuzhiyun #define VSD_STD_ID_BOOT2		"BOOT2"	/* (2/9.4) */
116*4882a593Smuzhiyun #define VSD_STD_ID_CD001		"CD001"	/* (ECMA-119) */
117*4882a593Smuzhiyun #define VSD_STD_ID_CDW02		"CDW02"	/* (ECMA-168) */
118*4882a593Smuzhiyun #define VSD_STD_ID_NSR03		"NSR03"	/* (3/9.1) */
119*4882a593Smuzhiyun #define VSD_STD_ID_TEA01		"TEA01"	/* (2/9.3) */
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */
122*4882a593Smuzhiyun struct beginningExtendedAreaDesc {
123*4882a593Smuzhiyun 	uint8_t		structType;
124*4882a593Smuzhiyun 	uint8_t		stdIdent[VSD_STD_ID_LEN];
125*4882a593Smuzhiyun 	uint8_t		structVersion;
126*4882a593Smuzhiyun 	uint8_t		structData[2041];
127*4882a593Smuzhiyun } __packed;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */
130*4882a593Smuzhiyun struct terminatingExtendedAreaDesc {
131*4882a593Smuzhiyun 	uint8_t		structType;
132*4882a593Smuzhiyun 	uint8_t		stdIdent[VSD_STD_ID_LEN];
133*4882a593Smuzhiyun 	uint8_t		structVersion;
134*4882a593Smuzhiyun 	uint8_t		structData[2041];
135*4882a593Smuzhiyun } __packed;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* Boot Descriptor (ECMA 167r3 2/9.4) */
138*4882a593Smuzhiyun struct bootDesc {
139*4882a593Smuzhiyun 	uint8_t			structType;
140*4882a593Smuzhiyun 	uint8_t			stdIdent[VSD_STD_ID_LEN];
141*4882a593Smuzhiyun 	uint8_t			structVersion;
142*4882a593Smuzhiyun 	uint8_t			reserved1;
143*4882a593Smuzhiyun 	struct regid		archType;
144*4882a593Smuzhiyun 	struct regid		bootIdent;
145*4882a593Smuzhiyun 	__le32			bootExtLocation;
146*4882a593Smuzhiyun 	__le32			bootExtLength;
147*4882a593Smuzhiyun 	__le64			loadAddress;
148*4882a593Smuzhiyun 	__le64			startAddress;
149*4882a593Smuzhiyun 	struct timestamp	descCreationDateAndTime;
150*4882a593Smuzhiyun 	__le16			flags;
151*4882a593Smuzhiyun 	uint8_t			reserved2[32];
152*4882a593Smuzhiyun 	uint8_t			bootUse[1906];
153*4882a593Smuzhiyun } __packed;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /* Flags (ECMA 167r3 2/9.4.12) */
156*4882a593Smuzhiyun #define BOOT_FLAGS_ERASE		0x01
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun /* Extent Descriptor (ECMA 167r3 3/7.1) */
159*4882a593Smuzhiyun struct extent_ad {
160*4882a593Smuzhiyun 	__le32		extLength;
161*4882a593Smuzhiyun 	__le32		extLocation;
162*4882a593Smuzhiyun } __packed;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun struct kernel_extent_ad {
165*4882a593Smuzhiyun 	uint32_t	extLength;
166*4882a593Smuzhiyun 	uint32_t	extLocation;
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun /* Descriptor Tag (ECMA 167r3 3/7.2) */
170*4882a593Smuzhiyun struct tag {
171*4882a593Smuzhiyun 	__le16		tagIdent;
172*4882a593Smuzhiyun 	__le16		descVersion;
173*4882a593Smuzhiyun 	uint8_t		tagChecksum;
174*4882a593Smuzhiyun 	uint8_t		reserved;
175*4882a593Smuzhiyun 	__le16		tagSerialNum;
176*4882a593Smuzhiyun 	__le16		descCRC;
177*4882a593Smuzhiyun 	__le16		descCRCLength;
178*4882a593Smuzhiyun 	__le32		tagLocation;
179*4882a593Smuzhiyun } __packed;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /* Tag Identifier (ECMA 167r3 3/7.2.1) */
182*4882a593Smuzhiyun #define TAG_IDENT_PVD			0x0001
183*4882a593Smuzhiyun #define TAG_IDENT_AVDP			0x0002
184*4882a593Smuzhiyun #define TAG_IDENT_VDP			0x0003
185*4882a593Smuzhiyun #define TAG_IDENT_IUVD			0x0004
186*4882a593Smuzhiyun #define TAG_IDENT_PD			0x0005
187*4882a593Smuzhiyun #define TAG_IDENT_LVD			0x0006
188*4882a593Smuzhiyun #define TAG_IDENT_USD			0x0007
189*4882a593Smuzhiyun #define TAG_IDENT_TD			0x0008
190*4882a593Smuzhiyun #define TAG_IDENT_LVID			0x0009
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun /* NSR Descriptor (ECMA 167r3 3/9.1) */
193*4882a593Smuzhiyun struct NSRDesc {
194*4882a593Smuzhiyun 	uint8_t		structType;
195*4882a593Smuzhiyun 	uint8_t		stdIdent[VSD_STD_ID_LEN];
196*4882a593Smuzhiyun 	uint8_t		structVersion;
197*4882a593Smuzhiyun 	uint8_t		reserved;
198*4882a593Smuzhiyun 	uint8_t		structData[2040];
199*4882a593Smuzhiyun } __packed;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun /* Generic Descriptor */
202*4882a593Smuzhiyun struct genericDesc {
203*4882a593Smuzhiyun 	struct tag	descTag;
204*4882a593Smuzhiyun 	__le32		volDescSeqNum;
205*4882a593Smuzhiyun 	uint8_t		reserved[492];
206*4882a593Smuzhiyun } __packed;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun /* Primary Volume Descriptor (ECMA 167r3 3/10.1) */
209*4882a593Smuzhiyun struct primaryVolDesc {
210*4882a593Smuzhiyun 	struct tag		descTag;
211*4882a593Smuzhiyun 	__le32			volDescSeqNum;
212*4882a593Smuzhiyun 	__le32			primaryVolDescNum;
213*4882a593Smuzhiyun 	dstring			volIdent[32];
214*4882a593Smuzhiyun 	__le16			volSeqNum;
215*4882a593Smuzhiyun 	__le16			maxVolSeqNum;
216*4882a593Smuzhiyun 	__le16			interchangeLvl;
217*4882a593Smuzhiyun 	__le16			maxInterchangeLvl;
218*4882a593Smuzhiyun 	__le32			charSetList;
219*4882a593Smuzhiyun 	__le32			maxCharSetList;
220*4882a593Smuzhiyun 	dstring			volSetIdent[128];
221*4882a593Smuzhiyun 	struct charspec		descCharSet;
222*4882a593Smuzhiyun 	struct charspec		explanatoryCharSet;
223*4882a593Smuzhiyun 	struct extent_ad	volAbstract;
224*4882a593Smuzhiyun 	struct extent_ad	volCopyright;
225*4882a593Smuzhiyun 	struct regid		appIdent;
226*4882a593Smuzhiyun 	struct timestamp	recordingDateAndTime;
227*4882a593Smuzhiyun 	struct regid		impIdent;
228*4882a593Smuzhiyun 	uint8_t			impUse[64];
229*4882a593Smuzhiyun 	__le32			predecessorVolDescSeqLocation;
230*4882a593Smuzhiyun 	__le16			flags;
231*4882a593Smuzhiyun 	uint8_t			reserved[22];
232*4882a593Smuzhiyun } __packed;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun /* Flags (ECMA 167r3 3/10.1.21) */
235*4882a593Smuzhiyun #define PVD_FLAGS_VSID_COMMON		0x0001
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */
238*4882a593Smuzhiyun struct anchorVolDescPtr {
239*4882a593Smuzhiyun 	struct tag		descTag;
240*4882a593Smuzhiyun 	struct extent_ad	mainVolDescSeqExt;
241*4882a593Smuzhiyun 	struct extent_ad	reserveVolDescSeqExt;
242*4882a593Smuzhiyun 	uint8_t	 		reserved[480];
243*4882a593Smuzhiyun } __packed;
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */
246*4882a593Smuzhiyun struct volDescPtr {
247*4882a593Smuzhiyun 	struct tag		descTag;
248*4882a593Smuzhiyun 	__le32			volDescSeqNum;
249*4882a593Smuzhiyun 	struct extent_ad	nextVolDescSeqExt;
250*4882a593Smuzhiyun 	uint8_t			reserved[484];
251*4882a593Smuzhiyun } __packed;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun /* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */
254*4882a593Smuzhiyun struct impUseVolDesc {
255*4882a593Smuzhiyun 	struct tag	descTag;
256*4882a593Smuzhiyun 	__le32		volDescSeqNum;
257*4882a593Smuzhiyun 	struct regid	impIdent;
258*4882a593Smuzhiyun 	uint8_t		impUse[460];
259*4882a593Smuzhiyun } __packed;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /* Partition Descriptor (ECMA 167r3 3/10.5) */
262*4882a593Smuzhiyun struct partitionDesc {
263*4882a593Smuzhiyun 	struct tag descTag;
264*4882a593Smuzhiyun 	__le32 volDescSeqNum;
265*4882a593Smuzhiyun 	__le16 partitionFlags;
266*4882a593Smuzhiyun 	__le16 partitionNumber;
267*4882a593Smuzhiyun 	struct regid partitionContents;
268*4882a593Smuzhiyun 	uint8_t partitionContentsUse[128];
269*4882a593Smuzhiyun 	__le32 accessType;
270*4882a593Smuzhiyun 	__le32 partitionStartingLocation;
271*4882a593Smuzhiyun 	__le32 partitionLength;
272*4882a593Smuzhiyun 	struct regid impIdent;
273*4882a593Smuzhiyun 	uint8_t impUse[128];
274*4882a593Smuzhiyun 	uint8_t reserved[156];
275*4882a593Smuzhiyun } __packed;
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun /* Partition Flags (ECMA 167r3 3/10.5.3) */
278*4882a593Smuzhiyun #define PD_PARTITION_FLAGS_ALLOC	0x0001
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /* Partition Contents (ECMA 167r2 3/10.5.3) */
281*4882a593Smuzhiyun #define PD_PARTITION_CONTENTS_NSR02	"+NSR02"
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /* Partition Contents (ECMA 167r3 3/10.5.5) */
284*4882a593Smuzhiyun #define PD_PARTITION_CONTENTS_FDC01	"+FDC01"
285*4882a593Smuzhiyun #define PD_PARTITION_CONTENTS_CD001	"+CD001"
286*4882a593Smuzhiyun #define PD_PARTITION_CONTENTS_CDW02	"+CDW02"
287*4882a593Smuzhiyun #define PD_PARTITION_CONTENTS_NSR03	"+NSR03"
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun /* Access Type (ECMA 167r3 3/10.5.7) */
290*4882a593Smuzhiyun #define PD_ACCESS_TYPE_NONE		0x00000000
291*4882a593Smuzhiyun #define PD_ACCESS_TYPE_READ_ONLY	0x00000001
292*4882a593Smuzhiyun #define PD_ACCESS_TYPE_WRITE_ONCE	0x00000002
293*4882a593Smuzhiyun #define PD_ACCESS_TYPE_REWRITABLE	0x00000003
294*4882a593Smuzhiyun #define PD_ACCESS_TYPE_OVERWRITABLE	0x00000004
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /* Logical Volume Descriptor (ECMA 167r3 3/10.6) */
297*4882a593Smuzhiyun struct logicalVolDesc {
298*4882a593Smuzhiyun 	struct tag		descTag;
299*4882a593Smuzhiyun 	__le32			volDescSeqNum;
300*4882a593Smuzhiyun 	struct charspec		descCharSet;
301*4882a593Smuzhiyun 	dstring			logicalVolIdent[128];
302*4882a593Smuzhiyun 	__le32			logicalBlockSize;
303*4882a593Smuzhiyun 	struct regid		domainIdent;
304*4882a593Smuzhiyun 	uint8_t			logicalVolContentsUse[16];
305*4882a593Smuzhiyun 	__le32			mapTableLength;
306*4882a593Smuzhiyun 	__le32			numPartitionMaps;
307*4882a593Smuzhiyun 	struct regid		impIdent;
308*4882a593Smuzhiyun 	uint8_t			impUse[128];
309*4882a593Smuzhiyun 	struct extent_ad	integritySeqExt;
310*4882a593Smuzhiyun 	uint8_t			partitionMaps[0];
311*4882a593Smuzhiyun } __packed;
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun /* Generic Partition Map (ECMA 167r3 3/10.7.1) */
314*4882a593Smuzhiyun struct genericPartitionMap {
315*4882a593Smuzhiyun 	uint8_t		partitionMapType;
316*4882a593Smuzhiyun 	uint8_t		partitionMapLength;
317*4882a593Smuzhiyun 	uint8_t		partitionMapping[0];
318*4882a593Smuzhiyun } __packed;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun /* Partition Map Type (ECMA 167r3 3/10.7.1.1) */
321*4882a593Smuzhiyun #define GP_PARTITION_MAP_TYPE_UNDEF	0x00
322*4882a593Smuzhiyun #define GP_PARTITION_MAP_TYPE_1		0x01
323*4882a593Smuzhiyun #define GP_PARTITION_MAP_TYPE_2		0x02
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun /* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
326*4882a593Smuzhiyun struct genericPartitionMap1 {
327*4882a593Smuzhiyun 	uint8_t		partitionMapType;
328*4882a593Smuzhiyun 	uint8_t		partitionMapLength;
329*4882a593Smuzhiyun 	__le16		volSeqNum;
330*4882a593Smuzhiyun 	__le16		partitionNum;
331*4882a593Smuzhiyun } __packed;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */
334*4882a593Smuzhiyun struct genericPartitionMap2 {
335*4882a593Smuzhiyun 	uint8_t		partitionMapType;
336*4882a593Smuzhiyun 	uint8_t		partitionMapLength;
337*4882a593Smuzhiyun 	uint8_t		partitionIdent[62];
338*4882a593Smuzhiyun } __packed;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */
341*4882a593Smuzhiyun struct unallocSpaceDesc {
342*4882a593Smuzhiyun 	struct tag		descTag;
343*4882a593Smuzhiyun 	__le32			volDescSeqNum;
344*4882a593Smuzhiyun 	__le32			numAllocDescs;
345*4882a593Smuzhiyun 	struct extent_ad	allocDescs[0];
346*4882a593Smuzhiyun } __packed;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun /* Terminating Descriptor (ECMA 167r3 3/10.9) */
349*4882a593Smuzhiyun struct terminatingDesc {
350*4882a593Smuzhiyun 	struct tag	descTag;
351*4882a593Smuzhiyun 	uint8_t		reserved[496];
352*4882a593Smuzhiyun } __packed;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun /* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */
355*4882a593Smuzhiyun struct logicalVolIntegrityDesc {
356*4882a593Smuzhiyun 	struct tag		descTag;
357*4882a593Smuzhiyun 	struct timestamp	recordingDateAndTime;
358*4882a593Smuzhiyun 	__le32			integrityType;
359*4882a593Smuzhiyun 	struct extent_ad	nextIntegrityExt;
360*4882a593Smuzhiyun 	uint8_t			logicalVolContentsUse[32];
361*4882a593Smuzhiyun 	__le32			numOfPartitions;
362*4882a593Smuzhiyun 	__le32			lengthOfImpUse;
363*4882a593Smuzhiyun 	__le32			freeSpaceTable[0];
364*4882a593Smuzhiyun 	__le32			sizeTable[0];
365*4882a593Smuzhiyun 	uint8_t			impUse[0];
366*4882a593Smuzhiyun } __packed;
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun /* Integrity Type (ECMA 167r3 3/10.10.3) */
369*4882a593Smuzhiyun #define LVID_INTEGRITY_TYPE_OPEN	0x00000000
370*4882a593Smuzhiyun #define LVID_INTEGRITY_TYPE_CLOSE	0x00000001
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun /* Recorded Address (ECMA 167r3 4/7.1) */
373*4882a593Smuzhiyun struct lb_addr {
374*4882a593Smuzhiyun 	__le32		logicalBlockNum;
375*4882a593Smuzhiyun 	__le16	 	partitionReferenceNum;
376*4882a593Smuzhiyun } __packed;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /* ... and its in-core analog */
379*4882a593Smuzhiyun struct kernel_lb_addr {
380*4882a593Smuzhiyun 	uint32_t		logicalBlockNum;
381*4882a593Smuzhiyun 	uint16_t	 	partitionReferenceNum;
382*4882a593Smuzhiyun };
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
385*4882a593Smuzhiyun struct short_ad {
386*4882a593Smuzhiyun         __le32		extLength;
387*4882a593Smuzhiyun         __le32		extPosition;
388*4882a593Smuzhiyun } __packed;
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun /* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
391*4882a593Smuzhiyun struct long_ad {
392*4882a593Smuzhiyun 	__le32		extLength;
393*4882a593Smuzhiyun 	struct lb_addr	extLocation;
394*4882a593Smuzhiyun 	uint8_t		impUse[6];
395*4882a593Smuzhiyun } __packed;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun struct kernel_long_ad {
398*4882a593Smuzhiyun 	uint32_t		extLength;
399*4882a593Smuzhiyun 	struct kernel_lb_addr	extLocation;
400*4882a593Smuzhiyun 	uint8_t			impUse[6];
401*4882a593Smuzhiyun };
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun /* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
404*4882a593Smuzhiyun struct ext_ad {
405*4882a593Smuzhiyun 	__le32		extLength;
406*4882a593Smuzhiyun 	__le32		recordedLength;
407*4882a593Smuzhiyun 	__le32		informationLength;
408*4882a593Smuzhiyun 	struct lb_addr	extLocation;
409*4882a593Smuzhiyun } __packed;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun struct kernel_ext_ad {
412*4882a593Smuzhiyun 	uint32_t		extLength;
413*4882a593Smuzhiyun 	uint32_t		recordedLength;
414*4882a593Smuzhiyun 	uint32_t		informationLength;
415*4882a593Smuzhiyun 	struct kernel_lb_addr	extLocation;
416*4882a593Smuzhiyun };
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun /* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun /* Tag Identifier (ECMA 167r3 4/7.2.1) */
421*4882a593Smuzhiyun #define TAG_IDENT_FSD			0x0100
422*4882a593Smuzhiyun #define TAG_IDENT_FID			0x0101
423*4882a593Smuzhiyun #define TAG_IDENT_AED			0x0102
424*4882a593Smuzhiyun #define TAG_IDENT_IE			0x0103
425*4882a593Smuzhiyun #define TAG_IDENT_TE			0x0104
426*4882a593Smuzhiyun #define TAG_IDENT_FE			0x0105
427*4882a593Smuzhiyun #define TAG_IDENT_EAHD			0x0106
428*4882a593Smuzhiyun #define TAG_IDENT_USE			0x0107
429*4882a593Smuzhiyun #define TAG_IDENT_SBD			0x0108
430*4882a593Smuzhiyun #define TAG_IDENT_PIE			0x0109
431*4882a593Smuzhiyun #define TAG_IDENT_EFE			0x010A
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun /* File Set Descriptor (ECMA 167r3 4/14.1) */
434*4882a593Smuzhiyun struct fileSetDesc {
435*4882a593Smuzhiyun 	struct tag		descTag;
436*4882a593Smuzhiyun 	struct timestamp	recordingDateAndTime;
437*4882a593Smuzhiyun 	__le16			interchangeLvl;
438*4882a593Smuzhiyun 	__le16			maxInterchangeLvl;
439*4882a593Smuzhiyun 	__le32			charSetList;
440*4882a593Smuzhiyun 	__le32			maxCharSetList;
441*4882a593Smuzhiyun 	__le32			fileSetNum;
442*4882a593Smuzhiyun 	__le32			fileSetDescNum;
443*4882a593Smuzhiyun 	struct charspec		logicalVolIdentCharSet;
444*4882a593Smuzhiyun 	dstring			logicalVolIdent[128];
445*4882a593Smuzhiyun 	struct charspec		fileSetCharSet;
446*4882a593Smuzhiyun 	dstring			fileSetIdent[32];
447*4882a593Smuzhiyun 	dstring			copyrightFileIdent[32];
448*4882a593Smuzhiyun 	dstring			abstractFileIdent[32];
449*4882a593Smuzhiyun 	struct long_ad		rootDirectoryICB;
450*4882a593Smuzhiyun 	struct regid		domainIdent;
451*4882a593Smuzhiyun 	struct long_ad		nextExt;
452*4882a593Smuzhiyun 	struct long_ad		streamDirectoryICB;
453*4882a593Smuzhiyun 	uint8_t			reserved[32];
454*4882a593Smuzhiyun } __packed;
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun /* Partition Header Descriptor (ECMA 167r3 4/14.3) */
457*4882a593Smuzhiyun struct partitionHeaderDesc {
458*4882a593Smuzhiyun 	struct short_ad	unallocSpaceTable;
459*4882a593Smuzhiyun 	struct short_ad	unallocSpaceBitmap;
460*4882a593Smuzhiyun 	struct short_ad	partitionIntegrityTable;
461*4882a593Smuzhiyun 	struct short_ad	freedSpaceTable;
462*4882a593Smuzhiyun 	struct short_ad	freedSpaceBitmap;
463*4882a593Smuzhiyun 	uint8_t		reserved[88];
464*4882a593Smuzhiyun } __packed;
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun /* File Identifier Descriptor (ECMA 167r3 4/14.4) */
467*4882a593Smuzhiyun struct fileIdentDesc {
468*4882a593Smuzhiyun 	struct tag	descTag;
469*4882a593Smuzhiyun 	__le16		fileVersionNum;
470*4882a593Smuzhiyun 	uint8_t		fileCharacteristics;
471*4882a593Smuzhiyun 	uint8_t		lengthFileIdent;
472*4882a593Smuzhiyun 	struct long_ad	icb;
473*4882a593Smuzhiyun 	__le16		lengthOfImpUse;
474*4882a593Smuzhiyun 	uint8_t		impUse[0];
475*4882a593Smuzhiyun 	uint8_t		fileIdent[0];
476*4882a593Smuzhiyun 	uint8_t		padding[0];
477*4882a593Smuzhiyun } __packed;
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun /* File Characteristics (ECMA 167r3 4/14.4.3) */
480*4882a593Smuzhiyun #define FID_FILE_CHAR_HIDDEN		0x01
481*4882a593Smuzhiyun #define FID_FILE_CHAR_DIRECTORY		0x02
482*4882a593Smuzhiyun #define FID_FILE_CHAR_DELETED		0x04
483*4882a593Smuzhiyun #define FID_FILE_CHAR_PARENT		0x08
484*4882a593Smuzhiyun #define FID_FILE_CHAR_METADATA		0x10
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun /* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */
487*4882a593Smuzhiyun struct allocExtDesc {
488*4882a593Smuzhiyun 	struct tag	descTag;
489*4882a593Smuzhiyun 	__le32		previousAllocExtLocation;
490*4882a593Smuzhiyun 	__le32		lengthAllocDescs;
491*4882a593Smuzhiyun } __packed;
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun /* ICB Tag (ECMA 167r3 4/14.6) */
494*4882a593Smuzhiyun struct icbtag {
495*4882a593Smuzhiyun 	__le32		priorRecordedNumDirectEntries;
496*4882a593Smuzhiyun 	__le16		strategyType;
497*4882a593Smuzhiyun 	__le16		strategyParameter;
498*4882a593Smuzhiyun 	__le16		numEntries;
499*4882a593Smuzhiyun 	uint8_t		reserved;
500*4882a593Smuzhiyun 	uint8_t		fileType;
501*4882a593Smuzhiyun 	struct lb_addr	parentICBLocation;
502*4882a593Smuzhiyun 	__le16		flags;
503*4882a593Smuzhiyun } __packed;
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun /* Strategy Type (ECMA 167r3 4/14.6.2) */
506*4882a593Smuzhiyun #define ICBTAG_STRATEGY_TYPE_UNDEF	0x0000
507*4882a593Smuzhiyun #define ICBTAG_STRATEGY_TYPE_1		0x0001
508*4882a593Smuzhiyun #define ICBTAG_STRATEGY_TYPE_2		0x0002
509*4882a593Smuzhiyun #define ICBTAG_STRATEGY_TYPE_3		0x0003
510*4882a593Smuzhiyun #define ICBTAG_STRATEGY_TYPE_4		0x0004
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun /* File Type (ECMA 167r3 4/14.6.6) */
513*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_UNDEF		0x00
514*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_USE		0x01
515*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_PIE		0x02
516*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_IE		0x03
517*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_DIRECTORY	0x04
518*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_REGULAR	0x05
519*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_BLOCK		0x06
520*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_CHAR		0x07
521*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_EA		0x08
522*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_FIFO		0x09
523*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_SOCKET		0x0A
524*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_TE		0x0B
525*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_SYMLINK	0x0C
526*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_STREAMDIR	0x0D
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun /* Flags (ECMA 167r3 4/14.6.8) */
529*4882a593Smuzhiyun #define ICBTAG_FLAG_AD_MASK		0x0007
530*4882a593Smuzhiyun #define ICBTAG_FLAG_AD_SHORT		0x0000
531*4882a593Smuzhiyun #define ICBTAG_FLAG_AD_LONG		0x0001
532*4882a593Smuzhiyun #define ICBTAG_FLAG_AD_EXTENDED		0x0002
533*4882a593Smuzhiyun #define ICBTAG_FLAG_AD_IN_ICB		0x0003
534*4882a593Smuzhiyun #define ICBTAG_FLAG_SORTED		0x0008
535*4882a593Smuzhiyun #define ICBTAG_FLAG_NONRELOCATABLE	0x0010
536*4882a593Smuzhiyun #define ICBTAG_FLAG_ARCHIVE		0x0020
537*4882a593Smuzhiyun #define ICBTAG_FLAG_SETUID		0x0040
538*4882a593Smuzhiyun #define ICBTAG_FLAG_SETGID		0x0080
539*4882a593Smuzhiyun #define ICBTAG_FLAG_STICKY		0x0100
540*4882a593Smuzhiyun #define ICBTAG_FLAG_CONTIGUOUS		0x0200
541*4882a593Smuzhiyun #define ICBTAG_FLAG_SYSTEM		0x0400
542*4882a593Smuzhiyun #define ICBTAG_FLAG_TRANSFORMED		0x0800
543*4882a593Smuzhiyun #define ICBTAG_FLAG_MULTIVERSIONS	0x1000
544*4882a593Smuzhiyun #define ICBTAG_FLAG_STREAM		0x2000
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun /* Indirect Entry (ECMA 167r3 4/14.7) */
547*4882a593Smuzhiyun struct indirectEntry {
548*4882a593Smuzhiyun 	struct tag	descTag;
549*4882a593Smuzhiyun 	struct icbtag	icbTag;
550*4882a593Smuzhiyun 	struct long_ad	indirectICB;
551*4882a593Smuzhiyun } __packed;
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun /* Terminal Entry (ECMA 167r3 4/14.8) */
554*4882a593Smuzhiyun struct terminalEntry {
555*4882a593Smuzhiyun 	struct tag	descTag;
556*4882a593Smuzhiyun 	struct icbtag	icbTag;
557*4882a593Smuzhiyun } __packed;
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun /* File Entry (ECMA 167r3 4/14.9) */
560*4882a593Smuzhiyun struct fileEntry {
561*4882a593Smuzhiyun 	struct tag		descTag;
562*4882a593Smuzhiyun 	struct icbtag		icbTag;
563*4882a593Smuzhiyun 	__le32			uid;
564*4882a593Smuzhiyun 	__le32			gid;
565*4882a593Smuzhiyun 	__le32			permissions;
566*4882a593Smuzhiyun 	__le16			fileLinkCount;
567*4882a593Smuzhiyun 	uint8_t			recordFormat;
568*4882a593Smuzhiyun 	uint8_t			recordDisplayAttr;
569*4882a593Smuzhiyun 	__le32			recordLength;
570*4882a593Smuzhiyun 	__le64			informationLength;
571*4882a593Smuzhiyun 	__le64			logicalBlocksRecorded;
572*4882a593Smuzhiyun 	struct timestamp	accessTime;
573*4882a593Smuzhiyun 	struct timestamp	modificationTime;
574*4882a593Smuzhiyun 	struct timestamp	attrTime;
575*4882a593Smuzhiyun 	__le32			checkpoint;
576*4882a593Smuzhiyun 	struct long_ad		extendedAttrICB;
577*4882a593Smuzhiyun 	struct regid		impIdent;
578*4882a593Smuzhiyun 	__le64			uniqueID;
579*4882a593Smuzhiyun 	__le32			lengthExtendedAttr;
580*4882a593Smuzhiyun 	__le32			lengthAllocDescs;
581*4882a593Smuzhiyun 	uint8_t			extendedAttr[0];
582*4882a593Smuzhiyun 	uint8_t			allocDescs[0];
583*4882a593Smuzhiyun } __packed;
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun /* Permissions (ECMA 167r3 4/14.9.5) */
586*4882a593Smuzhiyun #define FE_PERM_O_EXEC			0x00000001U
587*4882a593Smuzhiyun #define FE_PERM_O_WRITE			0x00000002U
588*4882a593Smuzhiyun #define FE_PERM_O_READ			0x00000004U
589*4882a593Smuzhiyun #define FE_PERM_O_CHATTR		0x00000008U
590*4882a593Smuzhiyun #define FE_PERM_O_DELETE		0x00000010U
591*4882a593Smuzhiyun #define FE_PERM_G_EXEC			0x00000020U
592*4882a593Smuzhiyun #define FE_PERM_G_WRITE			0x00000040U
593*4882a593Smuzhiyun #define FE_PERM_G_READ			0x00000080U
594*4882a593Smuzhiyun #define FE_PERM_G_CHATTR		0x00000100U
595*4882a593Smuzhiyun #define FE_PERM_G_DELETE		0x00000200U
596*4882a593Smuzhiyun #define FE_PERM_U_EXEC			0x00000400U
597*4882a593Smuzhiyun #define FE_PERM_U_WRITE			0x00000800U
598*4882a593Smuzhiyun #define FE_PERM_U_READ			0x00001000U
599*4882a593Smuzhiyun #define FE_PERM_U_CHATTR		0x00002000U
600*4882a593Smuzhiyun #define FE_PERM_U_DELETE		0x00004000U
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun /* Record Format (ECMA 167r3 4/14.9.7) */
603*4882a593Smuzhiyun #define FE_RECORD_FMT_UNDEF		0x00
604*4882a593Smuzhiyun #define FE_RECORD_FMT_FIXED_PAD		0x01
605*4882a593Smuzhiyun #define FE_RECORD_FMT_FIXED		0x02
606*4882a593Smuzhiyun #define FE_RECORD_FMT_VARIABLE8		0x03
607*4882a593Smuzhiyun #define FE_RECORD_FMT_VARIABLE16	0x04
608*4882a593Smuzhiyun #define FE_RECORD_FMT_VARIABLE16_MSB	0x05
609*4882a593Smuzhiyun #define FE_RECORD_FMT_VARIABLE32	0x06
610*4882a593Smuzhiyun #define FE_RECORD_FMT_PRINT		0x07
611*4882a593Smuzhiyun #define FE_RECORD_FMT_LF		0x08
612*4882a593Smuzhiyun #define FE_RECORD_FMT_CR		0x09
613*4882a593Smuzhiyun #define FE_RECORD_FMT_CRLF		0x0A
614*4882a593Smuzhiyun #define FE_RECORD_FMT_LFCR		0x0B
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun /* Record Display Attributes (ECMA 167r3 4/14.9.8) */
617*4882a593Smuzhiyun #define FE_RECORD_DISPLAY_ATTR_UNDEF	0x00
618*4882a593Smuzhiyun #define FE_RECORD_DISPLAY_ATTR_1	0x01
619*4882a593Smuzhiyun #define FE_RECORD_DISPLAY_ATTR_2	0x02
620*4882a593Smuzhiyun #define FE_RECORD_DISPLAY_ATTR_3	0x03
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun /* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */
623*4882a593Smuzhiyun struct extendedAttrHeaderDesc {
624*4882a593Smuzhiyun 	struct tag	descTag;
625*4882a593Smuzhiyun 	__le32		impAttrLocation;
626*4882a593Smuzhiyun 	__le32		appAttrLocation;
627*4882a593Smuzhiyun } __packed;
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun /* Generic Format (ECMA 167r3 4/14.10.2) */
630*4882a593Smuzhiyun struct genericFormat {
631*4882a593Smuzhiyun 	__le32		attrType;
632*4882a593Smuzhiyun 	uint8_t		attrSubtype;
633*4882a593Smuzhiyun 	uint8_t		reserved[3];
634*4882a593Smuzhiyun 	__le32		attrLength;
635*4882a593Smuzhiyun 	uint8_t		attrData[0];
636*4882a593Smuzhiyun } __packed;
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun /* Character Set Information (ECMA 167r3 4/14.10.3) */
639*4882a593Smuzhiyun struct charSetInfo {
640*4882a593Smuzhiyun 	__le32		attrType;
641*4882a593Smuzhiyun 	uint8_t		attrSubtype;
642*4882a593Smuzhiyun 	uint8_t		reserved[3];
643*4882a593Smuzhiyun 	__le32		attrLength;
644*4882a593Smuzhiyun 	__le32		escapeSeqLength;
645*4882a593Smuzhiyun 	uint8_t		charSetType;
646*4882a593Smuzhiyun 	uint8_t		escapeSeq[0];
647*4882a593Smuzhiyun } __packed;
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun /* Alternate Permissions (ECMA 167r3 4/14.10.4) */
650*4882a593Smuzhiyun struct altPerms {
651*4882a593Smuzhiyun 	__le32		attrType;
652*4882a593Smuzhiyun 	uint8_t		attrSubtype;
653*4882a593Smuzhiyun 	uint8_t		reserved[3];
654*4882a593Smuzhiyun 	__le32		attrLength;
655*4882a593Smuzhiyun 	__le16		ownerIdent;
656*4882a593Smuzhiyun 	__le16		groupIdent;
657*4882a593Smuzhiyun 	__le16		permission;
658*4882a593Smuzhiyun } __packed;
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun /* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */
661*4882a593Smuzhiyun struct fileTimesExtAttr {
662*4882a593Smuzhiyun 	__le32		attrType;
663*4882a593Smuzhiyun 	uint8_t		attrSubtype;
664*4882a593Smuzhiyun 	uint8_t		reserved[3];
665*4882a593Smuzhiyun 	__le32		attrLength;
666*4882a593Smuzhiyun 	__le32		dataLength;
667*4882a593Smuzhiyun 	__le32		fileTimeExistence;
668*4882a593Smuzhiyun 	uint8_t		fileTimes;
669*4882a593Smuzhiyun } __packed;
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun /* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */
672*4882a593Smuzhiyun #define FTE_CREATION			0x00000001
673*4882a593Smuzhiyun #define FTE_DELETION			0x00000004
674*4882a593Smuzhiyun #define FTE_EFFECTIVE			0x00000008
675*4882a593Smuzhiyun #define FTE_BACKUP			0x00000002
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun /* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */
678*4882a593Smuzhiyun struct infoTimesExtAttr {
679*4882a593Smuzhiyun 	__le32		attrType;
680*4882a593Smuzhiyun 	uint8_t		attrSubtype;
681*4882a593Smuzhiyun 	uint8_t		reserved[3];
682*4882a593Smuzhiyun 	__le32		attrLength;
683*4882a593Smuzhiyun 	__le32		dataLength;
684*4882a593Smuzhiyun 	__le32		infoTimeExistence;
685*4882a593Smuzhiyun 	uint8_t		infoTimes[0];
686*4882a593Smuzhiyun } __packed;
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun /* Device Specification (ECMA 167r3 4/14.10.7) */
689*4882a593Smuzhiyun struct deviceSpec {
690*4882a593Smuzhiyun 	__le32		attrType;
691*4882a593Smuzhiyun 	uint8_t		attrSubtype;
692*4882a593Smuzhiyun 	uint8_t		reserved[3];
693*4882a593Smuzhiyun 	__le32		attrLength;
694*4882a593Smuzhiyun 	__le32		impUseLength;
695*4882a593Smuzhiyun 	__le32		majorDeviceIdent;
696*4882a593Smuzhiyun 	__le32		minorDeviceIdent;
697*4882a593Smuzhiyun 	uint8_t		impUse[0];
698*4882a593Smuzhiyun } __packed;
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun /* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */
701*4882a593Smuzhiyun struct impUseExtAttr {
702*4882a593Smuzhiyun 	__le32		attrType;
703*4882a593Smuzhiyun 	uint8_t		attrSubtype;
704*4882a593Smuzhiyun 	uint8_t		reserved[3];
705*4882a593Smuzhiyun 	__le32		attrLength;
706*4882a593Smuzhiyun 	__le32		impUseLength;
707*4882a593Smuzhiyun 	struct regid	impIdent;
708*4882a593Smuzhiyun 	uint8_t		impUse[0];
709*4882a593Smuzhiyun } __packed;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun /* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */
712*4882a593Smuzhiyun struct appUseExtAttr {
713*4882a593Smuzhiyun 	__le32		attrType;
714*4882a593Smuzhiyun 	uint8_t		attrSubtype;
715*4882a593Smuzhiyun 	uint8_t		reserved[3];
716*4882a593Smuzhiyun 	__le32		attrLength;
717*4882a593Smuzhiyun 	__le32		appUseLength;
718*4882a593Smuzhiyun 	struct regid	appIdent;
719*4882a593Smuzhiyun 	uint8_t		appUse[0];
720*4882a593Smuzhiyun } __packed;
721*4882a593Smuzhiyun 
722*4882a593Smuzhiyun #define EXTATTR_CHAR_SET		1
723*4882a593Smuzhiyun #define EXTATTR_ALT_PERMS		3
724*4882a593Smuzhiyun #define EXTATTR_FILE_TIMES		5
725*4882a593Smuzhiyun #define EXTATTR_INFO_TIMES		6
726*4882a593Smuzhiyun #define EXTATTR_DEV_SPEC		12
727*4882a593Smuzhiyun #define EXTATTR_IMP_USE			2048
728*4882a593Smuzhiyun #define EXTATTR_APP_USE			65536
729*4882a593Smuzhiyun #define EXTATTR_SUBTYPE			1
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun /* Unallocated Space Entry (ECMA 167r3 4/14.11) */
732*4882a593Smuzhiyun struct unallocSpaceEntry {
733*4882a593Smuzhiyun 	struct tag	descTag;
734*4882a593Smuzhiyun 	struct icbtag	icbTag;
735*4882a593Smuzhiyun 	__le32		lengthAllocDescs;
736*4882a593Smuzhiyun 	uint8_t		allocDescs[0];
737*4882a593Smuzhiyun } __packed;
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun /* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */
740*4882a593Smuzhiyun struct spaceBitmapDesc {
741*4882a593Smuzhiyun 	struct tag	descTag;
742*4882a593Smuzhiyun 	__le32		numOfBits;
743*4882a593Smuzhiyun 	__le32		numOfBytes;
744*4882a593Smuzhiyun 	uint8_t		bitmap[0];
745*4882a593Smuzhiyun } __packed;
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun /* Partition Integrity Entry (ECMA 167r3 4/14.13) */
748*4882a593Smuzhiyun struct partitionIntegrityEntry {
749*4882a593Smuzhiyun 	struct tag		descTag;
750*4882a593Smuzhiyun 	struct icbtag		icbTag;
751*4882a593Smuzhiyun 	struct timestamp	recordingDateAndTime;
752*4882a593Smuzhiyun 	uint8_t			integrityType;
753*4882a593Smuzhiyun 	uint8_t			reserved[175];
754*4882a593Smuzhiyun 	struct regid		impIdent;
755*4882a593Smuzhiyun 	uint8_t			impUse[256];
756*4882a593Smuzhiyun } __packed;
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun /* Extent Length (ECMA 167r3 4/14.14.1.1) */
761*4882a593Smuzhiyun #define EXT_LENGTH_MASK			0x3FFFFFFF
762*4882a593Smuzhiyun #define EXT_TYPE_MASK			0xC0000000
763*4882a593Smuzhiyun #define EXT_RECORDED_ALLOCATED		0x00000000
764*4882a593Smuzhiyun #define EXT_NOT_RECORDED_ALLOCATED	0x40000000
765*4882a593Smuzhiyun #define EXT_NOT_RECORDED_NOT_ALLOCATED	0x80000000
766*4882a593Smuzhiyun #define EXT_NEXT_EXTENT_ALLOCDESCS	0xC0000000
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun /* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun /* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun /* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */
773*4882a593Smuzhiyun struct logicalVolHeaderDesc {
774*4882a593Smuzhiyun 	__le64		uniqueID;
775*4882a593Smuzhiyun 	uint8_t		reserved[24];
776*4882a593Smuzhiyun } __packed;
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun /* Path Component (ECMA 167r3 4/14.16.1) */
779*4882a593Smuzhiyun struct pathComponent {
780*4882a593Smuzhiyun 	uint8_t		componentType;
781*4882a593Smuzhiyun 	uint8_t		lengthComponentIdent;
782*4882a593Smuzhiyun 	__le16		componentFileVersionNum;
783*4882a593Smuzhiyun 	dchars		componentIdent[0];
784*4882a593Smuzhiyun } __packed;
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun /* File Entry (ECMA 167r3 4/14.17) */
787*4882a593Smuzhiyun struct extendedFileEntry {
788*4882a593Smuzhiyun 	struct tag		descTag;
789*4882a593Smuzhiyun 	struct icbtag		icbTag;
790*4882a593Smuzhiyun 	__le32			uid;
791*4882a593Smuzhiyun 	__le32			gid;
792*4882a593Smuzhiyun 	__le32			permissions;
793*4882a593Smuzhiyun 	__le16			fileLinkCount;
794*4882a593Smuzhiyun 	uint8_t			recordFormat;
795*4882a593Smuzhiyun 	uint8_t			recordDisplayAttr;
796*4882a593Smuzhiyun 	__le32			recordLength;
797*4882a593Smuzhiyun 	__le64			informationLength;
798*4882a593Smuzhiyun 	__le64			objectSize;
799*4882a593Smuzhiyun 	__le64			logicalBlocksRecorded;
800*4882a593Smuzhiyun 	struct timestamp	accessTime;
801*4882a593Smuzhiyun 	struct timestamp	modificationTime;
802*4882a593Smuzhiyun 	struct timestamp	createTime;
803*4882a593Smuzhiyun 	struct timestamp	attrTime;
804*4882a593Smuzhiyun 	__le32			checkpoint;
805*4882a593Smuzhiyun 	__le32			reserved;
806*4882a593Smuzhiyun 	struct long_ad		extendedAttrICB;
807*4882a593Smuzhiyun 	struct long_ad		streamDirectoryICB;
808*4882a593Smuzhiyun 	struct regid		impIdent;
809*4882a593Smuzhiyun 	__le64			uniqueID;
810*4882a593Smuzhiyun 	__le32			lengthExtendedAttr;
811*4882a593Smuzhiyun 	__le32			lengthAllocDescs;
812*4882a593Smuzhiyun 	uint8_t			extendedAttr[0];
813*4882a593Smuzhiyun 	uint8_t			allocDescs[0];
814*4882a593Smuzhiyun } __packed;
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun #endif /* _ECMA_167_H */
817