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