xref: /titanic_41/usr/src/uts/common/sys/fs/udf_volume.h (revision cde2885fdf538266ee2a3b08dee2d5075ce8fa2b)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_FS_UDF_VOLUME_H
28 #define	_SYS_FS_UDF_VOLUME_H
29 
30 #include <sys/isa_defs.h>
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 #define	UDF_102	0x66
37 #define	UDF_150	0x96
38 #define	UDF_200	0xC8
39 
40 /* fid_idlen include compression id */
41 #define	FID_LEN(fid)	(((sizeof (struct file_id) +	\
42 		SWAP_16((fid)->fid_iulen) + (fid)->fid_idlen - 2) + 3) & ~3)
43 
44 /*
45  * #define	ID_LEN(fid)	\
46  *		(((SWAP_16((fid)->fid_iulen) + (fid)->fid_idlen - 2) + 3) & ~3)
47  */
48 
49 #define	F_LEN		(sizeof (struct file_id) - 2)
50 
51 #define	UDF_DOMAIN_NAME		"*OSTA UDF Compliant\0\0\0\0"
52 #define	UDF_LV_INFO		"*UDF LV Info\0\0\0\0\0\0\0\0\0\0\0\0"
53 #define	UDF_FREEEASPACE		"*UDF FreeEASpace\0\0\0\0\0\0\0\0"
54 #define	UDF_FREEAEASPACE	"*UDF FreeAppEASpace\0\0\0\0"
55 #define	UDF_CGMS_INFO		"*UDF DVD CGMS Info\0\0\0\0"
56 #define	UDF_OS2_EA		"*UDF OS/2 EA\0\0\0\0\0\0\0\0\0\0\0"
57 #define	UDF_OS2_EA_LEN		"*UDF OS/2 EALength\0\0\0\0\0\0"
58 #define	UDF_MAC_VOLINFO		"*UDF Mac VolumeInfo\0\0\0\0"
59 #define	UDF_MAC_UNIQID		"*UDF Mac UniqueIDTable\0"
60 #define	UDF_MAC_RESFRK		"*UDF Mac ResourceFork\0\0"
61 #define	UDF_VIRT_PART		"*UDF Virtual Partition\0"
62 #define	UDF_SPAR_PART		"*UDF Sparable Partition"
63 #define	UDF_VAT			"*UDF Virtual Alloc Tbl\0"
64 #define	UDF_SPAR_TBL		"*UDF Sparing Table\0\0\0\0\0"
65 
66 
67 #if defined(_BIG_ENDIAN)
68 #define	SWAP_16(a)	(((ushort_t)((a) & 0xff) << 8) | \
69 					((ushort_t)((a) & 0xff00) >> 8))
70 #define	SWAP_32(a)	((((a) & 0xff) << 24) |	\
71 				(((a) & 0xff00) << 8) |	\
72 				(((a) & 0xff0000) >> 8) |	\
73 				(((a) & 0xff000000) >> 24))
74 #define	SWAP_64(a)	((((a) & 0xffULL) << 56)	| \
75 				(((a) & 0xff00ULL) << 40) | \
76 				(((a) & 0xff0000ULL) << 24) | \
77 				(((a) & 0xff000000ULL) << 8) | \
78 				(((a) & 0xff00000000ULL) >> 8) | \
79 				(((a) & 0xff0000000000ULL) >> 24) | \
80 				(((a) & 0xff000000000000ULL) >> 40) | \
81 				(((a) & 0xff00000000000000ULL) >> 56))
82 
83 #define	GET_32(a)	((uint32_t)(*((uint8_t *)a)) | \
84 				(((uint32_t)(*(((uint8_t *)a) + 1))) << 8) | \
85 				(((uint32_t)(*(((uint8_t *)a) + 2))) << 16) | \
86 				(((uint32_t)(*(((uint8_t *)a) + 3))) << 24))
87 #else
88 #define	SWAP_16(a)	(a)
89 #define	SWAP_32(a)	(a)
90 #define	SWAP_64(a)	(a)
91 
92 #define	GET_32(a)	(*((uint32_t *)a))
93 #endif	/* _BIG_ENDIAN */
94 
95 
96 #define	BCD2HEX_16(a)	(((a) & 0xf) + \
97 			(((ushort_t)((a) & 0xf0) >> 4) * 10) + \
98 			(((ushort_t)((a) & 0xf00) >> 8) * 100) + \
99 			(((ushort_t)((a) & 0xf000) >> 12) * 1000))
100 
101 #define	HEX2BCD_16(a)	((((ushort_t)a) % 10) | \
102 			(((ushort_t)((ushort_t)(a) / 10) % 10) << 4) | \
103 			(((ushort_t)((ushort_t)(a) / 100) % 10) << 8) | \
104 			(((ushort_t)((ushort_t)(a) / 1000) % 10) << 12))
105 
106 #define	ANCHOR_VOL_DESC_LOC	(256)
107 #define	ANCHOR_VOL_DESC_LEN	0x200
108 
109 
110 
111 /* Basic data structures */
112 
113 
114 typedef char dstring_t;
115 
116 
117 /*
118  * recorded at the start of the descriptor
119  * used to distinguish between different
120  * descriptors
121  */
122 struct tag {
123 	uint16_t	tag_id;		/* 00 Tag Identifier */
124 	uint16_t	tag_desc_ver;	/* 02 Descriptor Version */
125 	uint8_t		tag_cksum;	/* 04 Tag Checksum */
126 	uint8_t		tag_res;	/* 05 Reserved */
127 	uint16_t	tag_sno;	/* 06 Tag Serial Number */
128 	uint16_t	tag_crc;	/* 08 Descriptor CRC */
129 	uint16_t	tag_crc_len;	/* 0A Descriptor CRC length */
130 	uint32_t	tag_loc;	/* 0C Tag Location */
131 };
132 typedef struct tag tag_t;
133 
134 /*
135  * descriptor tag id values
136  */
137 
138 #define	UD_PRI_VOL_DESC		0x0001
139 #define	UD_ANCH_VOL_DESC	0x0002
140 #define	UD_VOL_DESC_PTR		0x0003
141 #define	UD_IMPL_USE_DESC	0x0004
142 #define	UD_PART_DESC		0x0005
143 #define	UD_LOG_VOL_DESC		0x0006
144 #define	UD_UNALL_SPA_DESC	0x0007
145 #define	UD_TERM_DESC		0x0008
146 #define	UD_LOG_VOL_INT		0x0009
147 
148 #define	UD_FILE_SET_DESC	0x0100
149 #define	UD_FILE_ID_DESC		0x0101
150 #define	UD_ALLOC_EXT_DESC	0x0102
151 #define	UD_INDIRECT_ENT		0x0103
152 #define	UD_TERMINAL_ENT		0x0104
153 #define	UD_FILE_ENTRY		0x0105
154 #define	UD_EXT_ATTR_HDR		0x0106
155 #define	UD_UNALL_SPA_ENT	0x0107
156 #define	UD_SPA_BMAP_DESC	0x0108
157 #define	UD_PART_INT_DESC	0x0109
158 #define	UD_EXT_FILE_ENT		0x010A
159 
160 
161 
162 
163 /*
164  * Character set's allowed in descriptor fields
165  * shall be specified
166  */
167 struct charspec {
168 	uint8_t		cs_type;	/* 00 Character Set Type */
169 	char		cs_info[63];	/* 01 Character Set Information */
170 };
171 typedef struct charspec charspec_t;
172 
173 #define	CS_TYPE0	0x00
174 #define	CS_TYPE1	0x01
175 #define	CS_TYPE2	0x02
176 #define	CS_TYPE3	0x03
177 #define	CS_TYPE4	0x04
178 #define	CS_TYPE5	0x05
179 #define	CS_TYPE6	0x06
180 #define	CS_TYPE7	0x07
181 #define	CS_TYPE8	0x08
182 
183 
184 
185 /*
186  * Entity Identification
187  */
188 struct regid {
189 	uint8_t		reg_flags;	/* 00 Flags */
190 	char		reg_id[23];	/* 01 Identifier */
191 	char		reg_ids[8];	/* 18 Identifier Suffix */
192 };
193 typedef struct regid regid_t;
194 
195 #define	EI_FLAG_DIRTY		0x00
196 #define	EI_FLAG_PROT		0x01
197 
198 struct lb_addr {
199 	/* uint32_t	lba_number;	00 Logical Block Number */
200 	/* uint8_t	lba_prn[2];	04 Partition Reference Number */
201 	char		lba_aaa[6];
202 };
203 typedef	struct lb_addr lb_addr_t;
204 #define	lba_number(x)(((x)->lba_aaa[0]) | \
205 			((x)->lba_aaa[1] << 8) | \
206 			((x)->lba_aaa[2] << 16) | \
207 			((x)->lba_aaa[3] << 24))
208 
209 #define	lba_prn(x)	((x)->lba_aaa[4] | ((x)->lba_aaa[5] << 8))
210 
211 
212 /*
213  * Extend Descriptor
214  */
215 struct extent_ad {
216 	uint32_t	ext_len;	/* 00 Extent Length */
217 	uint32_t	ext_loc;	/* 04 Extent Location */
218 };
219 typedef struct extent_ad extent_ad_t;
220 
221 /*
222  * Short Allocation Descriptor
223  */
224 struct short_ad {
225 	uint32_t	sad_ext_len;	/* 00 Extent Length */
226 	uint32_t	sad_ext_loc;	/* 04 extent Position */
227 };
228 typedef struct short_ad short_ad_t;
229 
230 /*
231  * Long Allocation Descriptor
232  */
233 struct long_ad {
234 	uint32_t	lad_ext_len;	/* 00 Extent Length */
235 	uint32_t	lad_ext_loc;	/* 04 Extent Location */
236 	uint16_t	lad_ext_prn;	/* 08 Extent part ref no */
237 	/* lb_addr_t	lad_ext_loc;	 04 Extent Location */
238 	char		lad_iu[6];	/* 0A Implementation Use */
239 };
240 typedef struct long_ad long_ad_t;
241 
242 
243 
244 
245 /*
246  * Format to record date and time
247  * If zero date & time is not specified
248  */
249 struct tstamp {
250 	uint16_t	ts_tzone;	/* 00 Type and Time Zone */
251 	uint16_t	ts_year;	/* 02 Year */
252 	uint8_t		ts_month;	/* 04 Month */
253 	uint8_t		ts_day;		/* 05 Day */
254 	uint8_t		ts_hour;	/* 06 Hour */
255 	uint8_t		ts_min;		/* 07 Minute */
256 	uint8_t		ts_sec;		/* 08 Second */
257 	uint8_t		ts_csec;	/* 09 Centi-seconds */
258 	uint8_t		ts_husec;	/* 0A Hundreds of Micro sec's */
259 	uint8_t		ts_usec;	/* 0B Micro-seconds */
260 };
261 typedef struct tstamp tstamp_t;
262 
263 
264 /*
265  * ts_tzone
266  */
267 #define	TMODE		0xF000
268 #define	TSIGN		0x0800
269 #define	TOFFSET		0x07FF
270 #define	TINVALID	(TSIGN|TOFFSET)
271 
272 
273 /*
274  * Format of the ICB tag which specifies
275  * most of the infomation of the file
276  */
277 struct icb_tag {
278 	uint32_t	itag_prnde;	/* 00 Prior Recorded No of Dir Entry */
279 	uint16_t	itag_strategy;	/* 04 Strategy Type */
280 	uint16_t	itag_param;	/* 06 Strategy parameter */
281 	uint16_t	itag_max_ent;	/* 08 Maximum No of Entries */
282 	uint8_t		itag_rsvd;	/* 0A Reserved */
283 	uint8_t		itag_ftype;	/* 0B File Type */
284 	/* lb_addr_t	itag_lb_addr;	0C parent ICB Location */
285 	uint32_t	itag_lb_loc;	/* 0C */
286 	uint16_t	itag_lb_prn;	/* 10 */
287 	uint16_t	itag_flags;	/* 12 Flags */
288 };
289 typedef struct icb_tag icb_tag_t;
290 
291 /*
292  * Different strategy types for the file
293  * For DVD_ROM we use onlt type4
294  */
295 #define	STRAT_TYPE1		0x0001
296 #define	STRAT_TYPE2		0x0002
297 #define	STRAT_TYPE3		0x0003
298 #define	STRAT_TYPE4		0x0004
299 #define	STRAT_TYPE4096		0x1000
300 
301 /*
302  * File types
303  */
304 #define	FTYPE_UNALL_SPACE	0x01
305 #define	FTYPE_PART_INTEG	0x02
306 #define	FTYPE_INDIRECT		0x03
307 #define	FTYPE_DIRECTORY		0x04
308 #define	FTYPE_FILE		0x05
309 #define	FTYPE_BLOCK_DEV		0x06
310 #define	FTYPE_CHAR_DEV		0x07
311 #define	FTYPE_EAR		0x08
312 #define	FTYPE_FIFO		0x09
313 #define	FTYPE_C_ISSOCK		0x0A
314 #define	FTYPE_T_ENTRY		0x0B
315 #define	FTYPE_SYMLINK		0x0C
316 
317 /*
318  * Flags
319  */
320 #define	ICB_FLAG_SHORT_AD	0x0000
321 #define	ICB_FLAG_LONG_AD	0x0001
322 #define	ICB_FLAG_EXT_AD		0x0002
323 #define	ICB_FLAG_ONE_AD		0x0003
324 #define	ICB_FLAG_SORTED		0x0008
325 #define	ICB_FLAG_NON_RELOC	0x0010
326 #define	ICB_FLAG_ARCHIVE	0x0020
327 #define	ICB_FLAG_SETUID		0x0040
328 #define	ICB_FLAG_SETGID		0x0080
329 #define	ICB_FLAG_STICKY		0x0100
330 #define	ICB_FLAG_CONTIG		0x0200
331 #define	ICB_FLAG_SYSTEM		0x0400
332 #define	ICB_FLAG_TRNSFRMED	0x0800
333 #define	ICB_FLAG_MVERS		0x1000
334 
335 
336 
337 
338 /* Volume recognition descriptors */
339 
340 
341 
342 
343 /*
344  * Primary volume descriptor identifis the
345  * volume and certain attributes of the volume
346  */
347 struct pri_vol_desc {
348 	tag_t		pvd_tag;	/* 00 Descriptor Tag */
349 	uint32_t	pvd_vdsn;	/* 10 Volume Descriptor Seq Num */
350 	uint32_t	pvd_pvdn;	/* 14 Primary Vol Desc Num */
351 	dstring_t	pvd_vol_id[32];	/* 18 Volume Identifier */
352 	uint16_t	pvd_vsn;	/* 38 Volume Sequence Num */
353 	uint16_t	pvd_mvsn;	/* 3A Max Volume Sequence Num */
354 	uint16_t	pvd_il;		/* 3C Interchange Level */
355 	uint16_t	pvd_mil;	/* 3E Max Interchange Level */
356 	uint32_t	pvd_csl;	/* 40 Character Set List */
357 	uint32_t	pvd_mcsl;	/* 44 Max Character Set List */
358 	dstring_t	pvd_vsi[128];	/* 48 Volume Set Identifier */
359 	charspec_t	pvd_desc_cs;	/* C8 Descriptor Character Set */
360 	charspec_t	pvd_exp_cs;	/* 108 Explanatory Char Set */
361 	extent_ad_t	pvd_vol_abs;	/* 148 Volume Abstract */
362 	extent_ad_t	pvd_vcn;	/* 150 Volume Copyright Notice */
363 	regid_t		pvd_appl_id;	/* 158 Application Identifier */
364 	tstamp_t	pvd_time;	/* 178 Recording Data & Time */
365 	regid_t		pvd_ii;		/* 184 Implementation Identifier */
366 	char		pvd_iu[64];	/* 1A4 Implementation Use */
367 	uint32_t	pvd_pvdsl;	/* 1E4 Pred Vol Desc Seq Loc */
368 	uint16_t	pvd_flags;	/* 1E8 Flags */
369 	uint8_t		pvd_res[22];	/* 1EA Reserved */
370 };
371 
372 
373 
374 
375 /*
376  * Anchor Volume Descriptor Pointer specifies
377  * the extent of Main & Reserve volume descriptor
378  */
379 struct anch_vol_desc_ptr {
380 	tag_t		avd_tag;	/* 00 Descriptor Tag */
381 	extent_ad_t	avd_main_vdse;	/* 10 Main Vol Desc Seq Extent */
382 	extent_ad_t	avd_res_vdse;	/* 18 Reserve Vol Desc Seq Ext */
383 	char		avd_res[480];	/* 20 Reserved */
384 };
385 typedef struct anch_vol_desc_ptr anch_vol_desc_ptr_t;
386 
387 
388 
389 
390 /*
391  * Volume Descriptor Pointer
392  */
393 struct vol_desc_ptr {
394 	tag_t		vdp_tag;	/* 00 Descriptor Tag */
395 	uint32_t	vdp_vdsn;	/* 10 Volume Descriptor Seq Num */
396 	extent_ad_t	vdp_nvdse;	/* 14 Next Vol Desc Seq Extent */
397 	uint8_t		vdp_res[484];	/* 1A Reserved */
398 };
399 typedef struct vol_desc_ptr vol_desc_ptr_t;
400 
401 
402 
403 
404 /*
405  * Implementation Use Volume Descriptor
406  * This is taken from udf1.02/1.50 documents
407  * the fields after iuvd_ii are defined only
408  * for the udf domain
409  */
410 struct iuvd_desc {
411 	tag_t		iuvd_tag;	/* 00 Descriptor Tag */
412 	uint32_t	iuvd_vdsn;	/* 10 Volume Desc Seq Num */
413 	regid_t		iuvd_ii;	/* 14 Domain Identifier */
414 	charspec_t	iuvd_cset;	/* 34 LVI Charset */
415 	dstring_t	iuvd_lvi[128];	/* 74 Logical Vol Identifier */
416 	dstring_t	iuvd_ifo1[36];	/* F4 LV Info1 */
417 	dstring_t	iuvd_ifo2[36];	/* 118 LV Info2 */
418 	dstring_t	iuvd_ifo3[36];	/* 13C LV Info3 */
419 	regid_t		iuvd_iid;	/* 160 Implementation ID */
420 	uint8_t		iuvd_iu[128];	/* 180 Implementation Use */
421 };
422 typedef struct iuvd_desc iuvd_desc_t;
423 
424 
425 
426 
427 
428 /*
429  * Partition Descriptor
430  * specifies the size and location of the partition
431  */
432 struct part_desc {
433 	tag_t		pd_tag;		/* 00 Descriptor Tag */
434 	uint32_t	pd_vdsn;	/* 10 Volume Desc Seq Num */
435 	uint16_t	pd_pflags;	/* 14 Partition Flags */
436 	uint16_t	pd_pnum;	/* 16 partition Number */
437 	regid_t		pd_pcontents;	/* 18 Partition Contents */
438 	uint8_t		pd_pc_use[128];	/* 38 Partition Contents Use */
439 	uint32_t	pd_acc_type;	/* B8 Access Type */
440 	uint32_t	pd_part_start;	/* BC Part Start Location */
441 	uint32_t	pd_part_length;	/* C0 partition Length */
442 	regid_t		pd_ii;		/* C4 Implementation Identifier */
443 	uint8_t		pd_iu[128];	/* E4 Implementation Use */
444 	uint8_t		pd_res[156];	/* 164 Reserved */
445 };
446 typedef struct part_desc part_desc_t;
447 
448 
449 /*
450  * pd_acc_type
451  */
452 #define	PART_ACC_RO	0x01
453 #define	PART_ACC_WO	0x02
454 #define	PART_ACC_RW	0x03
455 #define	PART_ACC_OW	0x04
456 
457 
458 /*
459  * Partition Header Descriptor
460  * Overloads pd_pc_use
461  */
462 struct phdr_desc {
463 	struct short_ad	phdr_ust;		/* Unallocated Space Table */
464 	struct short_ad	phdr_usb;		/* Unallocated Space Bitmap */
465 	struct short_ad	phdr_it;		/* Partition Integrity Table */
466 	struct short_ad	phdr_fst;		/* Freed Space Table */
467 	struct short_ad	phdr_fsb;		/* Freed Space Bitmap */
468 };
469 typedef struct phdr_desc phdr_desc_t;
470 
471 
472 
473 
474 
475 
476 /*
477  * Logical Volume Descriptor
478  */
479 struct log_vol_desc {
480 	tag_t		lvd_tag;	/* 00 Descriptor Tag */
481 	uint32_t	lvd_vdsn;	/* 10 Volume Desc Seq Num */
482 	charspec_t	lvd_desc_cs;	/* 14 Descriptor Char Set */
483 	dstring_t	lvd_lvid[128];	/* 54 Logical Vol Identifier */
484 	uint32_t	lvd_log_bsize;	/* D4 Logical Block Size */
485 	regid_t		lvd_dom_id;	/* D8 Domain Identifier */
486 	long_ad_t	lvd_lvcu;	/* F8 Logical Vol Contents Use */
487 	uint32_t	lvd_mtbl_len;	/* 108 Map Table Length */
488 	uint32_t	lvd_num_pmaps;	/* 10C Number of Partition Maps */
489 	regid_t		lvd_ii;		/* 110 Implementation Identifier */
490 	uint8_t		lvd_iu[128];	/* 130 Implementation Use */
491 	extent_ad_t	lvd_int_seq_ext; /* 1B0 Integrity Sequence Extent */
492 	uint8_t		lvd_pmaps[72];	/* 1B8 Partition Maps */
493 };
494 typedef struct log_vol_desc log_vol_desc_t;
495 
496 
497 
498 
499 
500 /*
501  * Unallocated Space Descriptor
502  * Contains information about the space
503  * that does not belong to any of the
504  * partition
505  */
506 struct unall_spc_desc {
507 	tag_t		ua_tag;		/* 00 Descriptor Tag */
508 	uint32_t	ua_vdsn;	/* 10 Volume Desc Seq Num */
509 	uint32_t	ua_nad;		/* 14 Number of Allocation Desc */
510 	uint8_t		ua_al_dsc[488];	/* 18 Allocation Desc */
511 };
512 typedef struct unall_spc_desc unall_spc_desc_t;
513 
514 
515 
516 
517 /*
518  * Terminating Descriptor
519  * this will be the last in a Volume Descriptor Sequence
520  */
521 struct term_desc {
522 	tag_t		td_tag;		/* 00 Descriptor Tag */
523 	uint8_t		td_res[496];	/* 10 Reserved */
524 };
525 typedef struct term_desc term_desc_t;
526 
527 
528 /*
529  * Logical Volume Header Descriptor
530  * This will be overlaid on lvid_lvcu
531  * and will contain the maximum value of
532  * unique id on the media
533  */
534 struct log_vol_hdr_desc {
535 	uint64_t	lvhd_uniqid;	/* 00 Unique Id */
536 	uint8_t		lvhd_pad[24];	/* 08 reserved */
537 };
538 typedef struct log_vol_hdr_desc log_vol_hdr_desc_t;
539 
540 /*
541  * Logical Volume Integrity Sequence
542  * This will contain the integrity of the
543  * file system
544  */
545 struct log_vol_int_desc {
546 	tag_t		lvid_tag;	/* 00 Descriptor Tag */
547 	tstamp_t	lvid_tstamp;	/* 10 Recording Date and Time */
548 	uint32_t	lvid_int_type;	/* 1C Integrity Type */
549 	extent_ad_t	lvid_nie;	/* 20 Next Integrity Extent */
550 	/* uint8_t	lvid_lvcu[32]; */
551 	log_vol_hdr_desc_t lvid_lvcu;	/* 28 Logical Volume Contents Use */
552 	uint32_t	lvid_npart;	/* 48 Number of Partitions */
553 	uint32_t	lvid_liu;	/* 4C Length of Implementation Use */
554 	uint32_t	lvid_fst[2];	/* 50 Free Space Table */
555 					/* Size Table */
556 					/* Implementation Use */
557 };
558 typedef struct log_vol_int_desc log_vol_int_desc_t;
559 
560 #define	lvid_uniqid	lvid_lvcu.lvhd_uniqid
561 
562 
563 #define	LOG_VOL_OPEN_INT	0x00
564 #define	LOG_VOL_CLOSE_INT	0x01
565 
566 
567 /*
568  * Logical Volume integrity Implementation Use
569  * This is defined in udf spec
570  */
571 struct lvid_iu {
572 	regid_t		lvidiu_regid;	/* 00 Implementation ID */
573 	uint32_t	lvidiu_nfiles;	/* 20 Number of Files */
574 	uint32_t	lvidiu_ndirs;	/* 24 Number of Directories */
575 	uint16_t	lvidiu_mread;	/* 28 Minimum UDF read revision */
576 	uint16_t	lvidiu_mwrite;	/* 2A Minimum UDF write revision */
577 	uint16_t	lvidiu_maxwr;	/* 2C Maximum UDF write revision */
578 };
579 
580 
581 
582 
583 
584 
585 
586 /*
587  * File Set Descriptor
588  * This will point to the root directory.
589  */
590 struct file_set_desc {
591 	tag_t		fsd_tag;	/* 00 Descriptor Tag */
592 	tstamp_t	fsd_time;	/* 10 Recording Date and Time */
593 	uint16_t	fsd_ilevel;	/* 1C Interchange Level */
594 	uint16_t	fsd_mi_level;	/* 1E Max Interchange Level */
595 	uint32_t	fsd_cs_list;	/* 20 Character Set List */
596 	uint32_t	fsd_mcs_list;	/* 24 Max Character Set List */
597 	uint32_t	fsd_fs_no;	/* 28 File Set Number */
598 	uint32_t	fsd_fsd_no;	/* 2C File Set Desc Number */
599 	charspec_t	fsd_lvidcs;	/* 30 Log Vol Id Char Set */
600 	char		fsd_lvid[128];	/* 70 Log Vol Identifier */
601 	charspec_t	fsd_fscs;	/* F0 File Set Character Set */
602 	char		fsd_fsi[32];	/* 130 File Set Identifier */
603 	char		fsd_cfi[32];	/* 150 Copyright File Identifier */
604 	char		fsd_afi[32];	/* 170 Abstract File identifier */
605 	long_ad_t	fsd_root_icb;	/* 190 Root Directory ICB */
606 	regid_t		fsd_did;	/* 1A0 Domain Identifier */
607 	long_ad_t	fsd_next;	/* 1C0 Next Extent */
608 	uint8_t		fsd_res[48];	/* 1D0 Reserved */
609 };
610 typedef struct file_set_desc file_set_desc_t;
611 
612 
613 
614 
615 
616 
617 
618 /*
619  * File Identifier Descriptor
620  * Directory entries
621  */
622 struct file_id {
623 	tag_t		fid_tag;	/* 00 Descriptor Tag */
624 	uint16_t	fid_ver;	/* 10 File Version Number */
625 	uint8_t		fid_flags;	/* 12 File characteristics */
626 	uint8_t		fid_idlen;	/* 13 Length File Identifier */
627 	long_ad_t	fid_icb;	/* 14 ICB */
628 	uint16_t	fid_iulen;	/* 24 Length of Implmentation use */
629 	uint8_t		fid_spec[2];	/* iulen for iu name and padding */
630 };
631 typedef struct file_id file_id_t;
632 
633 #define	FID_EXIST	0x01
634 #define	FID_DIR		0x02
635 #define	FID_DELETED	0x04
636 #define	FID_PARENT	0x08
637 
638 
639 
640 
641 
642 
643 
644 /*
645  * Allocation Extent Descriptor
646  */
647 struct alloc_ext_desc {
648 	tag_t		aed_tag;	/* 00 Descriptor Tag */
649 	uint32_t	aed_rev_ael;	/* 10 Previous Alloc Extent Location */
650 	uint32_t	aed_len_aed;	/* 14 Length of Allocation Desc */
651 };
652 typedef struct alloc_ext_desc alloc_ext_desc_t;
653 
654 
655 
656 
657 
658 /*
659  * Indirect Entry
660  * used to specify the address of another ICB
661  */
662 struct indirect_entry {
663 	tag_t		ie_tag;		/* 00 Descriptor Tag */
664 	icb_tag_t	ie_icb_tag;	/* 10 ICB tag */
665 	long_ad_t	ie_indirecticb;	/* 24 Indirect ICB */
666 };
667 typedef struct indirect_entry indirect_entry_t;
668 
669 
670 
671 
672 /*
673  * Terminal Entry
674  */
675 struct term_entry {
676 	tag_t		te_tag;		/* 00 Descriptor Tag */
677 	icb_tag_t	te_icb_tag;	/* 10 ICB tag */
678 };
679 typedef struct term_entry term_entry_t;
680 
681 
682 
683 
684 /*
685  * File entry describes the
686  * file attributes and location it is recorded on the media
687  */
688 struct file_entry {
689 	tag_t		fe_tag;		/* 00 Descriptor Tag */
690 	icb_tag_t	fe_icb_tag;	/* 10 ICB tag */
691 	uint32_t	fe_uid;		/* 24 Uid */
692 	uint32_t	fe_gid;		/* 28 Gid */
693 	uint32_t	fe_perms;	/* 2C Permissions */
694 	uint16_t	fe_lcount;	/* 30 File Link Count */
695 	uint8_t		fe_rec_for;	/* 32 Record Format */
696 	uint8_t		fe_rec_dis;	/* 33 Record Display Attributes */
697 	uint32_t	fe_rec_len;	/* 34 Record Length */
698 	uint64_t	fe_info_len;	/* 38 Information Length */
699 	uint64_t	fe_lbr;		/* 40 Logical Blocks recorded */
700 	tstamp_t	fe_acc_time;	/* 48 Access Data and Time */
701 	tstamp_t	fe_mod_time;	/* 54 Modification Data and Time */
702 	tstamp_t	fe_attr_time;	/* 60 Attribute Data and Time */
703 	uint32_t	fe_ckpoint;	/* 6C Checkpoint */
704 	long_ad_t	fe_ea_icb;	/* 70 Extended Attr ICB */
705 	regid_t		fe_impl_id;	/* 80 Implementation Identifier */
706 	uint64_t	fe_uniq_id;	/* A0 Unique Id */
707 	uint32_t	fe_len_ear;	/* A8 Length of Extended Attr */
708 	uint32_t	fe_len_adesc;	/* AC Length of Alloc Desc */
709 	char		fe_spec[336];	/* B0 used for EA and AD's */
710 };
711 typedef struct file_entry file_entry_t;
712 
713 
714 
715 
716 
717 /*
718  * Extended Attribute Header
719  */
720 struct ext_attr_hdr {
721 	tag_t		eah_tag;	/* 00 Descriptor Tag */
722 	uint32_t	eah_ial;	/* 10 Implementation Attr Location */
723 	uint32_t	eah_aal;	/* 14 Application Attr Location */
724 };
725 typedef struct ext_attr_hdr ext_attr_hdr_t;
726 
727 
728 
729 
730 
731 
732 
733 /*
734  * Unallocated Space Entry
735  */
736 struct unall_space_ent {
737 	tag_t		use_tag;	/* 00 Descriptor Tag */
738 	icb_tag_t	use_icb_tag;	/* 10 ICB tag */
739 	uint32_t	use_len_ad;	/* 24 Lenght of Allocation desc */
740 	uint8_t		use_ad[484];	/* 28 Allocation Descriptors */
741 };
742 typedef struct unall_space_ent unall_space_ent_t;
743 
744 
745 
746 
747 
748 /*
749  * Space Bitmap Descriptor
750  */
751 struct space_bmap_desc {
752 	tag_t		sbd_tag;	/* 00 Descriptor Tag */
753 	uint32_t	sbd_nbits;	/* 10 Number of Bits */
754 	uint32_t	sbd_nbytes;	/* 14 Number of Bytes */
755 	uint8_t		sbd_bmap[500];	/* 18 Bitmap */
756 };
757 typedef struct space_bmap_desc space_bmap_desc_t;
758 
759 
760 
761 
762 
763 /*
764  * Partition Integrity entry
765  */
766 struct part_int_desc {
767 	tag_t		pid_tag;	/* 00 Descriptor Tag */
768 	icb_tag_t	pid_idb_tag;	/* 10 ICB tag */
769 	tstamp_t	pid_rtime;	/* 24 Recording Data and Time */
770 	uint8_t		pid_integ;	/* 30 Integrity type */
771 	uint8_t		pid_res[175];	/* 31 Reserved */
772 	regid_t		pid_ii;		/* E0 Implementation Identifier */
773 	uint8_t		pid_iu[256];	/* 100 Implementation Use */
774 };
775 typedef struct part_int_desc part_int_desc_t;
776 
777 
778 #define	PART_OPEN_INT		0x00
779 #define	PART_CLOSE_INT		0x01
780 #define	PART_STABLE_INT		0x02
781 
782 
783 
784 
785 struct attr_hdr {
786 	uint32_t	ahdr_atype;	/* Attribute Type */
787 	uint8_t		ahdr_astype;	/* Attribute Subtype */
788 	uint8_t		ahdr_res[3];	/* Reserved */
789 	uint32_t	ahdr_length;	/* Attribute Length */
790 	uint8_t		ahdr_data[4];	/* Attribute Data */
791 };
792 
793 /*
794  * We will support and use the
795  * following Extended Attributes
796  * we will ignore others while reading
797  * and will preserve then when updating
798  * the EAR's
799  * In all the EA's we allocate the last member
800  * as 4 bytes. This is a sort of hack
801  * since the structure has to be
802  * properly alined to 4 bytes.
803  */
804 
805 struct dev_spec_ear {
806 	uint32_t	ds_atype;	/* 00 Attribute Type */
807 	uint8_t		ds_astype;	/* 04 Attribute Subtype */
808 	uint8_t		ds_res[3];	/* 05 Reserved */
809 	uint32_t	ds_attr_len;	/* 08 Attrbute Length */
810 	uint32_t	ds_iu_len;	/* 0C Impl Use Length */
811 	uint32_t	ds_major_id;	/* 10 Major Device ID */
812 	uint32_t	ds_minor_id;	/* 14 Minor Device ID */
813 	uint8_t		ds_iu[4];	/* 18 Implementation Use */
814 };
815 
816 
817 struct ftimes_ear {
818 	uint32_t	ft_atype;	/* 00 Attribute Type */
819 	uint8_t		ft_astype;	/* 04 Attribute Subtype */
820 	uint8_t		ft_res[3];	/* 05 Reserved */
821 	uint32_t	ft_attr_len;	/* 08 Attrbute Length */
822 	uint32_t	ft_data_len;	/* 0C Data Length */
823 	uint32_t	ft_exist;	/* 10 File Time Existence */
824 	uint8_t		ft_ft[4];	/* 14 File Times */
825 };
826 
827 /* ft_exit */
828 #define	FT_EXIST	0x0
829 #define	FT_DELETE	0x2
830 #define	FT_FEDT		0x3
831 #define	FT_BACKUP	0x5
832 
833 struct iu_ea {
834 	uint32_t	iuea_atype;	/* 00 Attribute Type */
835 	uint8_t		iuea_astype;	/* 04 Attribute Subtype */
836 	uint8_t		iuea_res[3];	/* 05 Reserved */
837 	uint32_t	iuea_attr_len;	/* 08 Attrbute Length */
838 	uint32_t	iuea_iu_len;	/* 0C Implementation Use Length */
839 	regid_t		iuea_ii;		/* 10 Implementation ID */
840 	uint8_t		iuea_iu[4];	/* 30 Impl Use */
841 };
842 
843 
844 /*
845  * CGMS & FREE_SPACE will be
846  * over laid on iu_iu field
847  */
848 
849 struct copy_mgt_info {
850 	uint16_t	cgms_cksum;	/* Header Checksum */
851 	uint8_t		cgms_info;	/* CGMS Information */
852 	uint8_t		cgms_dstype;	/* Data Structure Type */
853 	uint32_t	cgms_psi;	/* Protection System Info */
854 };
855 
856 #define	COPY_PROTECTED	0x80
857 
858 struct FREE_SPACE {
859 	uint16_t	fs_cksum;	/* Header Checksum */
860 	uint8_t		fs_freesp[2];	/* Free EA space */
861 };
862 
863 
864 
865 
866 struct nsr_desc {
867 	uint8_t		nsr_str_type;
868 	uint8_t		nsr_id[5];
869 	uint8_t		nsr_ver;
870 	uint8_t		nsr_res;
871 	uint8_t		nsr_data[2040];
872 };
873 
874 
875 
876 /*
877  * Partition Map
878  */
879 struct pmap_hdr {
880 	uint8_t		maph_type;	/* Partition Map Type */
881 	uint8_t		maph_length;	/* Partition Map Length */
882 };
883 
884 #define	MAP_TYPE1	1
885 #define	MAP_TYPE2	2
886 
887 #define	MAP_TYPE1_LEN	6
888 #define	MAP_TYPE2_LEN	64
889 
890 struct pmap_typ1 {
891 	uint8_t		map1_type;	/* Map type == 1 */
892 	uint8_t		map1_length;	/* Map length == 6 */
893 	uint16_t	map1_vsn;	/* Volume Sequence Number */
894 	uint16_t	map1_pn;	/* Partition Number */
895 };
896 
897 
898 /*
899  * Only two types of type2 maps
900  * are supported they are
901  * *UDF Virtual Partition
902  * *UDF Sparable Partition
903  * For vpm fields till map2_pn
904  * are valid and the entire structure is
905  * valid for spm
906  */
907 struct pmap_typ2 {
908 	uint8_t		map2_type;	/* 00 Map type == 2 */
909 	uint8_t		map2_length;	/* 01 Map length == 64 */
910 	uint16_t	map2_pad1;	/* 02 Reserved */
911 	regid_t		map2_pti;	/* 04 Entiry ID */
912 	uint16_t	map2_vsn;	/* 24 Volume Sequence Number */
913 	uint16_t	map2_pn;	/* 26 Partition Number */
914 	uint16_t	map2_pl;	/* 28 Packet Length == 32 */
915 	uint8_t		map2_nst;	/* 2A Number of sparing tables */
916 	uint8_t		map2_pad2;	/* 2B Reserved */
917 	uint32_t	map2_sest;	/* 2C Size of each sparing table */
918 	uint32_t	map2_st[4];	/* 30 sparing Tables */
919 };
920 
921 
922 struct stbl_entry {
923 	uint32_t	sent_ol;	/* Original Location */
924 	uint32_t	sent_ml;	/* Mapped Location */
925 };
926 
927 typedef struct stbl_entry stbl_entry_t;
928 
929 struct stbl {
930 	tag_t		stbl_tag;	/* 00 Tag */
931 	regid_t		stbl_si;	/* 10 Sparing Identifier */
932 	uint16_t	stbl_len;	/* 30 Reallocation Table Len */
933 	uint16_t	stbl_res1;	/* 32 Reserved */
934 	uint32_t	stbl_seqno;	/* 34 Sequence Number */
935 	stbl_entry_t	stbl_entry;	/* 38 Sparing Table Entries */
936 };
937 
938 struct path_comp {
939 	uint8_t		pc_type;	/* Component Type */
940 	uint8_t		pc_len;		/* Length of Component ID */
941 	uint16_t	pc_ver;		/* Component File Version Number */
942 	uint8_t		pc_id[4];	/* Component ID */
943 };
944 
945 #ifdef	__cplusplus
946 }
947 #endif
948 
949 #endif	/* _SYS_FS_UDF_VOLUME_H */
950