Home | History | Annotate | Download | only in fs
      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