| 1 | /* $NetBSD: ecma167-udf.h,v 1.14 2011/07/07 17:45:38 reinoud Exp $ */ |
| 2 | |
| 3 | /*- |
| 4 | * Copyright (c) 2003, 2004, 2005, 2006, 2008, 2009 |
| 5 | * Reinoud Zandijk * <reinoud@NetBSD.org> |
| 6 | * Copyright (c) 2001, 2002 Scott Long <scottl@freebsd.org> |
| 7 | * All rights reserved. |
| 8 | * |
| 9 | * Redistribution and use in source and binary forms, with or without |
| 10 | * modification, are permitted provided that the following conditions |
| 11 | * are met: |
| 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * 2. Redistributions in binary form must reproduce the above copyright |
| 15 | * notice, this list of conditions and the following disclaimer in the |
| 16 | * documentation and/or other materials provided with the distribution. |
| 17 | * |
| 18 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
| 19 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 20 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 21 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
| 22 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 23 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 24 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 25 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 26 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 27 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 28 | * SUCH DAMAGE. |
| 29 | * |
| 30 | * |
| 31 | * Extended and adapted for UDFv2.50+ bij Reinoud Zandijk based on the |
| 32 | * original by Scott Long. |
| 33 | * |
| 34 | * 20030508 Made some small typo and explanatory comments |
| 35 | * 20030510 Added UDF 2.01 structures |
| 36 | * 20030519 Added/correct comments on multi-partitioned logical volume space |
| 37 | * 20050616 Added pseudo overwrite |
| 38 | * 20050624 Added the missing extended attribute types and `magic values'. |
| 39 | * 20051106 Reworked some implementation use parts |
| 40 | * |
| 41 | */ |
| 42 | |
| 43 | |
| 44 | #ifndef _FS_UDF_ECMA167_UDF_H_ |
| 45 | #define _FS_UDF_ECMA167_UDF_H_ |
| 46 | |
| 47 | |
| 48 | /* |
| 49 | * in case of an older gcc versions, define the __packed as explicit |
| 50 | * attribute |
| 51 | */ |
| 52 | |
| 53 | /* |
| 54 | * You may specify the `aligned' and `transparent_union' attributes either in |
| 55 | * a `typedef' declaration or just past the closing curly brace of a complete |
| 56 | * enum, struct or union type _definition_ and the `packed' attribute only |
| 57 | * past the closing brace of a definition. You may also specify attributes |
| 58 | * between the enum, struct or union tag and the name of the type rather than |
| 59 | * after the closing brace. |
| 60 | */ |
| 61 | |
| 62 | #ifndef __packed |
| 63 | #define __packed __attribute__((packed)) |
| 64 | #endif |
| 65 | |
| 66 | |
| 67 | /* ecma167-udf.h */ |
| 68 | |
| 69 | /* Volume recognition sequence ECMA 167 rev. 3 16.1 */ |
| 70 | struct vrs_desc { |
| 71 | uint8_t struct_type; |
| 72 | uint8_t identifier[5]; |
| 73 | uint8_t version; |
| 74 | uint8_t data[2041]; |
| 75 | } __packed; |
| 76 | |
| 77 | |
| 78 | #define VRS_NSR02 "NSR02" |
| 79 | #define VRS_NSR03 "NSR03" |
| 80 | #define VRS_BEA01 "BEA01" |
| 81 | #define VRS_TEA01 "TEA01" |
| 82 | #define VRS_CD001 "CD001" |
| 83 | #define VRS_CDW02 "CDW02" |
| 84 | |
| 85 | |
| 86 | /* Structure/definitions/constants a la ECMA 167 rev. 3 */ |
| 87 | |
| 88 | |
| 89 | #define MAX_TAGID_VOLUMES 9 |
| 90 | /* Tag identifiers */ |
| 91 | enum { |
| 92 | TAGID_SPARING_TABLE = 0, |
| 93 | TAGID_PRI_VOL = 1, |
| 94 | TAGID_ANCHOR = 2, |
| 95 | TAGID_VOL = 3, |
| 96 | TAGID_IMP_VOL = 4, |
| 97 | TAGID_PARTITION = 5, |
| 98 | TAGID_LOGVOL = 6, |
| 99 | TAGID_UNALLOC_SPACE = 7, |
| 100 | TAGID_TERM = 8, |
| 101 | TAGID_LOGVOL_INTEGRITY= 9, |
| 102 | TAGID_FSD = 256, |
| 103 | TAGID_FID = 257, |
| 104 | TAGID_ALLOCEXTENT = 258, |
| 105 | TAGID_INDIRECTENTRY = 259, |
| 106 | TAGID_ICB_TERM = 260, |
| 107 | TAGID_FENTRY = 261, |
| 108 | TAGID_EXTATTR_HDR = 262, |
| 109 | TAGID_UNALL_SP_ENTRY = 263, |
| 110 | TAGID_SPACE_BITMAP = 264, |
| 111 | TAGID_PART_INTEGRITY = 265, |
| 112 | TAGID_EXTFENTRY = 266, |
| 113 | TAGID_MAX = 266 |
| 114 | }; |
| 115 | |
| 116 | |
| 117 | enum { |
| 118 | UDF_DOMAIN_FLAG_HARD_WRITE_PROTECT = 1, |
| 119 | UDF_DOMAIN_FLAG_SOFT_WRITE_PROTECT = 2 |
| 120 | }; |
| 121 | |
| 122 | |
| 123 | enum { |
| 124 | UDF_ACCESSTYPE_NOT_SPECIFIED = 0, /* unknown */ |
| 125 | UDF_ACCESSTYPE_PSEUDO_OVERWITE = 0, /* pseudo overwritable, e.g. BD-R's LOW */ |
| 126 | UDF_ACCESSTYPE_READ_ONLY = 1, /* really only readable */ |
| 127 | UDF_ACCESSTYPE_WRITE_ONCE = 2, /* write once and you're done */ |
| 128 | UDF_ACCESSTYPE_REWRITEABLE = 3, /* may need extra work to rewrite */ |
| 129 | UDF_ACCESSTYPE_OVERWRITABLE = 4 /* no limits on rewriting; e.g. harddisc*/ |
| 130 | }; |
| 131 | |
| 132 | |
| 133 | /* Descriptor tag [3/7.2] */ |
| 134 | struct desc_tag { |
| 135 | uint16_t id; |
| 136 | uint16_t descriptor_ver; |
| 137 | uint8_t cksum; |
| 138 | uint8_t reserved; |
| 139 | uint16_t serial_num; |
| 140 | uint16_t desc_crc; |
| 141 | uint16_t desc_crc_len; |
| 142 | uint32_t tag_loc; |
| 143 | } __packed; |
| 144 | #define UDF_DESC_TAG_LENGTH 16 |
| 145 | |
| 146 | |
| 147 | /* Recorded Address [4/7.1] */ |
| 148 | struct lb_addr { /* within partition space */ |
| 149 | uint32_t lb_num; |
| 150 | uint16_t part_num; |
| 151 | } __packed; |
| 152 | |
| 153 | |
| 154 | /* Extent Descriptor [3/7.1] */ |
| 155 | struct extent_ad { |
| 156 | uint32_t len; |
| 157 | uint32_t loc; |
| 158 | } __packed; |
| 159 | |
| 160 | |
| 161 | /* Short Allocation Descriptor [4/14.14.1] */ |
| 162 | struct short_ad { |
| 163 | uint32_t len; |
| 164 | uint32_t lb_num; |
| 165 | } __packed; |
| 166 | |
| 167 | |
| 168 | /* Long Allocation Descriptor [4/14.14.2] */ |
| 169 | struct UDF_ADImp_use { |
| 170 | uint16_t flags; |
| 171 | uint32_t unique_id; |
| 172 | } __packed; |
| 173 | #define UDF_ADIMP_FLAGS_EXTENT_ERASED 1 |
| 174 | |
| 175 | |
| 176 | struct long_ad { |
| 177 | uint32_t len; |
| 178 | struct lb_addr loc; /* within a logical volume mapped partition space !! */ |
| 179 | union { |
| 180 | uint8_t bytes[6]; |
| 181 | struct UDF_ADImp_use im_used; |
| 182 | } impl; |
| 183 | } __packed; |
| 184 | #define longad_uniqueid impl.im_used.unique_id |
| 185 | |
| 186 | |
| 187 | /* Extended Allocation Descriptor [4/14.14.3] ; identifies an extent of allocation descriptors ; also in UDF ? */ |
| 188 | struct ext_ad { |
| 189 | uint32_t ex_len; |
| 190 | uint32_t rec_len; |
| 191 | uint32_t inf_len; |
| 192 | struct lb_addr ex_loc; |
| 193 | uint8_t reserved[2]; |
| 194 | } __packed; |
| 195 | |
| 196 | |
| 197 | /* ICB : Information Control Block; positioning */ |
| 198 | union icb { |
| 199 | struct short_ad s_ad; |
| 200 | struct long_ad l_ad; |
| 201 | struct ext_ad e_ad; |
| 202 | }; |
| 203 | |
| 204 | |
| 205 | /* short/long/ext extent have flags encoded in length */ |
| 206 | #define UDF_EXT_ALLOCATED (0<<30) |
| 207 | #define UDF_EXT_FREED (1<<30) |
| 208 | #define UDF_EXT_ALLOCATED_BUT_NOT_USED (1<<30) |
| 209 | #define UDF_EXT_FREE (2<<30) |
| 210 | #define UDF_EXT_REDIRECT (3<<30) |
| 211 | #define UDF_EXT_FLAGS(len) ((len) & (3<<30)) |
| 212 | #define UDF_EXT_LEN(len) ((len) & ((1<<30)-1)) |
| 213 | #define UDF_EXT_MAXLEN ((1<<30)-1) |
| 214 | |
| 215 | |
| 216 | /* Character set spec [1/7.2.1] */ |
| 217 | struct charspec { |
| 218 | uint8_t type; |
| 219 | uint8_t inf[63]; |
| 220 | } __packed; |
| 221 | |
| 222 | |
| 223 | struct pathcomp { |
| 224 | uint8_t type; |
| 225 | uint8_t l_ci; |
| 226 | uint16_t comp_filever; |
| 227 | uint8_t ident[256]; |
| 228 | } __packed; |
| 229 | #define UDF_PATH_COMP_SIZE 4 |
| 230 | #define UDF_PATH_COMP_RESERVED 0 |
| 231 | #define UDF_PATH_COMP_ROOT 1 |
| 232 | #define UDF_PATH_COMP_MOUNTROOT 2 |
| 233 | #define UDF_PATH_COMP_PARENTDIR 3 |
| 234 | #define UDF_PATH_COMP_CURDIR 4 |
| 235 | #define UDF_PATH_COMP_NAME 5 |
| 236 | |
| 237 | |
| 238 | /* Timestamp [1/7.3] */ |
| 239 | struct timestamp { |
| 240 | uint16_t type_tz; |
| 241 | uint16_t year; |
| 242 | uint8_t month; |
| 243 | uint8_t day; |
| 244 | uint8_t hour; |
| 245 | uint8_t minute; |
| 246 | uint8_t second; |
| 247 | uint8_t centisec; |
| 248 | uint8_t hund_usec; |
| 249 | uint8_t usec; |
| 250 | } __packed; |
| 251 | #define UDF_TIMESTAMP_SIZE 12 |
| 252 | |
| 253 | |
| 254 | /* Entity Identifier [1/7.4] */ |
| 255 | #define UDF_REGID_ID_SIZE 23 |
| 256 | struct regid { |
| 257 | uint8_t flags; |
| 258 | uint8_t id[UDF_REGID_ID_SIZE]; |
| 259 | uint8_t id_suffix[8]; |
| 260 | } __packed; |
| 261 | |
| 262 | |
| 263 | /* ICB Tag [4/14.6] */ |
| 264 | struct icb_tag { |
| 265 | uint32_t prev_num_dirs; |
| 266 | uint16_t strat_type; |
| 267 | uint8_t strat_param[2]; |
| 268 | uint16_t max_num_entries; |
| 269 | uint8_t reserved; |
| 270 | uint8_t file_type; |
| 271 | struct lb_addr parent_icb; |
| 272 | uint16_t flags; |
| 273 | } __packed; |
| 274 | #define UDF_ICB_TAG_FLAGS_ALLOC_MASK 0x03 |
| 275 | #define UDF_ICB_SHORT_ALLOC 0x00 |
| 276 | #define UDF_ICB_LONG_ALLOC 0x01 |
| 277 | #define UDF_ICB_EXT_ALLOC 0x02 |
| 278 | #define UDF_ICB_INTERN_ALLOC 0x03 |
| 279 | |
| 280 | #define UDF_ICB_TAG_FLAGS_DIRORDERED (1<< 3) |
| 281 | #define UDF_ICB_TAG_FLAGS_NONRELOC (1<< 4) |
| 282 | #define UDF_ICB_TAG_FLAGS_CONTIGUES (1<< 9) |
| 283 | #define UDF_ICB_TAG_FLAGS_MULTIPLEVERS (1<<12) |
| 284 | |
| 285 | #define UDF_ICB_TAG_FLAGS_SETUID (1<< 6) |
| 286 | #define UDF_ICB_TAG_FLAGS_SETGID (1<< 7) |
| 287 | #define UDF_ICB_TAG_FLAGS_STICKY (1<< 8) |
| 288 | |
| 289 | #define UDF_ICB_FILETYPE_UNKNOWN 0 |
| 290 | #define UDF_ICB_FILETYPE_UNALLOCSPACE 1 |
| 291 | #define UDF_ICB_FILETYPE_PARTINTEGRITY 2 |
| 292 | #define UDF_ICB_FILETYPE_INDIRECTENTRY 3 |
| 293 | #define UDF_ICB_FILETYPE_DIRECTORY 4 |
| 294 | #define UDF_ICB_FILETYPE_RANDOMACCESS 5 |
| 295 | #define UDF_ICB_FILETYPE_BLOCKDEVICE 6 |
| 296 | #define UDF_ICB_FILETYPE_CHARDEVICE 7 |
| 297 | #define UDF_ICB_FILETYPE_EXTATTRREC 8 |
| 298 | #define UDF_ICB_FILETYPE_FIFO 9 |
| 299 | #define UDF_ICB_FILETYPE_SOCKET 10 |
| 300 | #define UDF_ICB_FILETYPE_TERM 11 |
| 301 | #define UDF_ICB_FILETYPE_SYMLINK 12 |
| 302 | #define UDF_ICB_FILETYPE_STREAMDIR 13 |
| 303 | #define UDF_ICB_FILETYPE_VAT 248 |
| 304 | #define UDF_ICB_FILETYPE_REALTIME 249 |
| 305 | #define UDF_ICB_FILETYPE_META_MAIN 250 |
| 306 | #define UDF_ICB_FILETYPE_META_MIRROR 251 |
| 307 | #define UDF_ICB_FILETYPE_META_BITMAP 252 |
| 308 | |
| 309 | |
| 310 | /* Anchor Volume Descriptor Pointer [3/10.2] */ |
| 311 | struct anchor_vdp { |
| 312 | struct desc_tag tag; |
| 313 | struct extent_ad main_vds_ex; /* to main volume descriptor set ; 16 sectors min */ |
| 314 | struct extent_ad reserve_vds_ex; /* copy of main volume descriptor set ; 16 sectors min */ |
| 315 | } __packed; |
| 316 | |
| 317 | |
| 318 | /* Volume Descriptor Pointer [3/10.3] */ |
| 319 | struct vol_desc_ptr { |
| 320 | struct desc_tag tag; /* use for extending the volume descriptor space */ |
| 321 | uint32_t vds_number; |
| 322 | struct extent_ad next_vds_ex; /* points to the next block for volume descriptor space */ |
| 323 | } __packed; |
| 324 | |
| 325 | |
| 326 | /* Primary Volume Descriptor [3/10.1] */ |
| 327 | struct pri_vol_desc { |
| 328 | struct desc_tag tag; |
| 329 | uint32_t seq_num; /* MAX prevail */ |
| 330 | uint32_t pvd_num; /* assigned by author; 0 is special as in it may only occur once */ |
| 331 | char vol_id[32]; /* KEY ; main identifier of this disc */ |
| 332 | uint16_t vds_num; /* volume descriptor number; i.e. what volume number is it */ |
| 333 | uint16_t max_vol_seq; /* maximum volume descriptor number known */ |
| 334 | uint16_t ichg_lvl; |
| 335 | uint16_t max_ichg_lvl; |
| 336 | uint32_t charset_list; |
| 337 | uint32_t max_charset_list; |
| 338 | char volset_id[128]; /* KEY ; if part of a multi-disc set or a band of volumes */ |
| 339 | struct charspec desc_charset; /* KEY according to ECMA 167 */ |
| 340 | struct charspec explanatory_charset; |
| 341 | struct extent_ad vol_abstract; |
| 342 | struct extent_ad vol_copyright; |
| 343 | struct regid app_id; |
| 344 | struct timestamp time; |
| 345 | struct regid imp_id; |
| 346 | uint8_t imp_use[64]; |
| 347 | uint32_t prev_vds_loc; /* location of predecessor _lov ? */ |
| 348 | uint16_t flags; /* bit 0 : if set indicates volume set name is meaningful */ |
| 349 | uint8_t reserved[22]; |
| 350 | } __packed; |
| 351 | |
| 352 | |
| 353 | /* UDF specific implementation use part of the implementation use volume descriptor */ |
| 354 | struct udf_lv_info { |
| 355 | struct charspec lvi_charset; |
| 356 | char logvol_id[128]; |
| 357 | |
| 358 | char lvinfo1[36]; |
| 359 | char lvinfo2[36]; |
| 360 | char lvinfo3[36]; |
| 361 | |
| 362 | struct regid impl_id; |
| 363 | uint8_t impl_use[128]; |
| 364 | } __packed; |
| 365 | |
| 366 | |
| 367 | /* Implementation use Volume Descriptor */ |
| 368 | struct impvol_desc { |
| 369 | struct desc_tag tag; |
| 370 | uint32_t seq_num; |
| 371 | struct regid impl_id; |
| 372 | union { |
| 373 | struct udf_lv_info lv_info; |
| 374 | char impl_use[460]; |
| 375 | } _impl_use; |
| 376 | } __packed; |
| 377 | |
| 378 | |
| 379 | /* Logical Volume Descriptor [3/10.6] */ |
| 380 | struct logvol_desc { |
| 381 | struct desc_tag tag; |
| 382 | uint32_t seq_num; /* MAX prevail */ |
| 383 | struct charspec desc_charset; /* KEY */ |
| 384 | char logvol_id[128]; /* KEY */ |
| 385 | uint32_t lb_size; |
| 386 | struct regid domain_id; |
| 387 | union { |
| 388 | struct long_ad fsd_loc; /* to fileset descriptor SEQUENCE */ |
| 389 | uint8_t logvol_content_use[16]; |
| 390 | } _lvd_use; |
| 391 | uint32_t mt_l; /* Partition map length */ |
| 392 | uint32_t n_pm; /* Number of partition maps */ |
| 393 | struct regid imp_id; |
| 394 | uint8_t imp_use[128]; |
| 395 | struct extent_ad integrity_seq_loc; |
| 396 | uint8_t maps[1]; |
| 397 | } __packed; |
| 398 | #define lv_fsd_loc _lvd_use.fsd_loc |
| 399 | |
| 400 | #define UDF_INTEGRITY_OPEN 0 |
| 401 | #define UDF_INTEGRITY_CLOSED 1 |
| 402 | |
| 403 | |
| 404 | #define UDF_PMAP_SIZE 64 |
| 405 | |
| 406 | /* Type 1 Partition Map [3/10.7.2] */ |
| 407 | struct part_map_1 { |
| 408 | uint8_t type; |
| 409 | uint8_t len; |
| 410 | uint16_t vol_seq_num; |
| 411 | uint16_t part_num; |
| 412 | } __packed; |
| 413 | |
| 414 | |
| 415 | /* Type 2 Partition Map [3/10.7.3] */ |
| 416 | struct part_map_2 { |
| 417 | uint8_t type; |
| 418 | uint8_t len; |
| 419 | uint8_t reserved[2]; |
| 420 | struct regid part_id; |
| 421 | uint16_t vol_seq_num; |
| 422 | uint16_t part_num; |
| 423 | uint8_t reserved2[24]; |
| 424 | } __packed; |
| 425 | |
| 426 | |
| 427 | /* Virtual Partition Map [UDF 2.01/2.2.8] */ |
| 428 | struct part_map_virt { |
| 429 | uint8_t type; |
| 430 | uint8_t len; |
| 431 | uint8_t reserved[2]; |
| 432 | struct regid id; |
| 433 | uint16_t vol_seq_num; |
| 434 | uint16_t part_num; |
| 435 | uint8_t reserved1[24]; |
| 436 | } __packed; |
| 437 | |
| 438 | |
| 439 | /* Sparable Partition Map [UDF 2.01/2.2.9] */ |
| 440 | struct part_map_spare { |
| 441 | uint8_t type; |
| 442 | uint8_t len; |
| 443 | uint8_t reserved[2]; |
| 444 | struct regid id; |
| 445 | uint16_t vol_seq_num; |
| 446 | uint16_t part_num; |
| 447 | uint16_t packet_len; |
| 448 | uint8_t n_st; /* Number of redundant sparing tables range 1-4 */ |
| 449 | uint8_t reserved1; |
| 450 | uint32_t st_size; /* size of EACH sparing table */ |
| 451 | uint32_t st_loc[1]; /* locations of sparing tables */ |
| 452 | } __packed; |
| 453 | |
| 454 | |
| 455 | /* Metadata Partition Map [UDF 2.50/2.2.10] */ |
| 456 | struct part_map_meta { |
| 457 | uint8_t type; |
| 458 | uint8_t len; |
| 459 | uint8_t reserved[2]; |
| 460 | struct regid id; |
| 461 | uint16_t vol_seq_num; |
| 462 | uint16_t part_num; |
| 463 | uint32_t meta_file_lbn; /* logical block number for file entry within part_num */ |
| 464 | uint32_t meta_mirror_file_lbn; |
| 465 | uint32_t meta_bitmap_file_lbn; |
| 466 | uint32_t alloc_unit_size; /* allocation unit size in blocks */ |
| 467 | uint16_t alignment_unit_size; /* alignment necessary in blocks */ |
| 468 | uint8_t flags; |
| 469 | uint8_t reserved1[5]; |
| 470 | } __packed; |
| 471 | #define METADATA_DUPLICATED 1 |
| 472 | |
| 473 | |
| 474 | union udf_pmap { |
| 475 | uint8_t data[UDF_PMAP_SIZE]; |
| 476 | struct part_map_1 pm1; |
| 477 | struct part_map_2 pm2; |
| 478 | struct part_map_virt pmv; |
| 479 | struct part_map_spare pms; |
| 480 | struct part_map_meta pmm; |
| 481 | }; |
| 482 | |
| 483 | |
| 484 | /* Sparing Map Entry [UDF 2.01/2.2.11] */ |
| 485 | struct spare_map_entry { |
| 486 | uint32_t org; /* partition relative address */ |
| 487 | uint32_t map; /* absolute disc address (!) can be in partition, but doesn't have to be */ |
| 488 | } __packed; |
| 489 | |
| 490 | |
| 491 | /* Sparing Table [UDF 2.01/2.2.11] */ |
| 492 | struct udf_sparing_table { |
| 493 | struct desc_tag tag; |
| 494 | struct regid id; |
| 495 | uint16_t rt_l; /* Relocation Table len */ |
| 496 | uint8_t reserved[2]; |
| 497 | uint32_t seq_num; |
| 498 | struct spare_map_entry entries[1]; |
| 499 | } __packed; |
| 500 | |
| 501 | |
| 502 | #define UDF_NO_PREV_VAT 0xffffffff |
| 503 | /* UDF 1.50 VAT suffix [UDF 2.2.10 (UDF 1.50 spec)] */ |
| 504 | struct udf_oldvat_tail { |
| 505 | struct regid id; /* "*UDF Virtual Alloc Tbl" */ |
| 506 | uint32_t prev_vat; |
| 507 | } __packed; |
| 508 | |
| 509 | |
| 510 | /* VAT table [UDF 2.0.1/2.2.10] */ |
| 511 | struct udf_vat { |
| 512 | uint16_t ; |
| 513 | uint16_t impl_use_len; |
| 514 | char logvol_id[128]; /* newer version of the LVD one */ |
| 515 | uint32_t prev_vat; |
| 516 | uint32_t num_files; |
| 517 | uint32_t num_directories; |
| 518 | uint16_t min_udf_readver; |
| 519 | uint16_t min_udf_writever; |
| 520 | uint16_t max_udf_writever; |
| 521 | uint16_t reserved; |
| 522 | uint8_t data[1]; /* impl.use followed by VAT entries (uint32_t) */ |
| 523 | } __packed; |
| 524 | |
| 525 | |
| 526 | /* Space bitmap descriptor as found in the partition header descriptor */ |
| 527 | struct space_bitmap_desc { |
| 528 | struct desc_tag tag; /* TagId 264 */ |
| 529 | uint32_t num_bits; /* number of bits */ |
| 530 | uint32_t num_bytes; /* bytes that contain it */ |
| 531 | uint8_t data[1]; |
| 532 | } __packed; |
| 533 | |
| 534 | |
| 535 | /* Unalloc space entry as found in the partition header descriptor */ |
| 536 | struct space_entry_desc { |
| 537 | struct desc_tag tag; /* TagId 263 */ |
| 538 | struct icb_tag icbtag; /* type 1 */ |
| 539 | uint32_t l_ad; /* in bytes */ |
| 540 | uint8_t entry[1]; |
| 541 | } __packed; |
| 542 | |
| 543 | |
| 544 | /* Partition header descriptor; in the contents_use of part_desc */ |
| 545 | struct part_hdr_desc { |
| 546 | struct short_ad unalloc_space_table; |
| 547 | struct short_ad unalloc_space_bitmap; |
| 548 | struct short_ad part_integrity_table; /* has to be ZERO for UDF */ |
| 549 | struct short_ad freed_space_table; |
| 550 | struct short_ad freed_space_bitmap; |
| 551 | uint8_t reserved[88]; |
| 552 | } __packed; |
| 553 | |
| 554 | |
| 555 | /* Partition Descriptor [3/10.5] */ |
| 556 | struct part_desc { |
| 557 | struct desc_tag tag; |
| 558 | uint32_t seq_num; /* MAX prevailing */ |
| 559 | uint16_t flags; /* bit 0 : if set the space is allocated */ |
| 560 | uint16_t part_num; /* KEY */ |
| 561 | struct regid contents; |
| 562 | union { |
| 563 | struct part_hdr_desc part_hdr; |
| 564 | uint8_t contents_use[128]; |
| 565 | } _impl_use; |
| 566 | uint32_t access_type; /* R/W, WORM etc. */ |
| 567 | uint32_t start_loc; /* start of partition with given length */ |
| 568 | uint32_t part_len; |
| 569 | struct regid imp_id; |
| 570 | uint8_t imp_use[128]; |
| 571 | uint8_t reserved[156]; |
| 572 | } __packed; |
| 573 | #define pd_part_hdr _impl_use.part_hdr |
| 574 | #define UDF_PART_FLAG_ALLOCATED 1 |
| 575 | |
| 576 | |
| 577 | /* Unallocated Space Descriptor (UDF 2.01/2.2.5) */ |
| 578 | struct unalloc_sp_desc { |
| 579 | struct desc_tag tag; |
| 580 | uint32_t seq_num; /* MAX prevailing */ |
| 581 | uint32_t alloc_desc_num; |
| 582 | struct extent_ad alloc_desc[1]; |
| 583 | } __packed; |
| 584 | |
| 585 | |
| 586 | /* Logical Volume Integrity Descriptor [3/30.10] */ |
| 587 | struct logvolhdr { |
| 588 | uint64_t next_unique_id; |
| 589 | /* rest reserved */ |
| 590 | } __packed; |
| 591 | |
| 592 | |
| 593 | struct udf_logvol_info { |
| 594 | struct regid impl_id; |
| 595 | uint32_t num_files; |
| 596 | uint32_t num_directories; |
| 597 | uint16_t min_udf_readver; |
| 598 | uint16_t min_udf_writever; |
| 599 | uint16_t max_udf_writever; |
| 600 | } __packed; |
| 601 | |
| 602 | |
| 603 | struct logvol_int_desc { |
| 604 | struct desc_tag tag; |
| 605 | struct timestamp time; |
| 606 | uint32_t integrity_type; |
| 607 | struct extent_ad next_extent; |
| 608 | union { |
| 609 | struct logvolhdr logvolhdr; |
| 610 | int8_t reserved[32]; |
| 611 | } _impl_use; |
| 612 | uint32_t num_part; |
| 613 | uint32_t l_iu; |
| 614 | uint32_t tables[1]; /* Freespace table, Sizetable, Implementation use */ |
| 615 | } __packed; |
| 616 | #define lvint_next_unique_id _impl_use.logvolhdr.next_unique_id |
| 617 | |
| 618 | |
| 619 | /* File Set Descriptor [4/14.1] */ |
| 620 | struct fileset_desc { |
| 621 | struct desc_tag tag; |
| 622 | struct timestamp time; |
| 623 | uint16_t ichg_lvl; |
| 624 | uint16_t max_ichg_lvl; |
| 625 | uint32_t charset_list; |
| 626 | uint32_t max_charset_list; |
| 627 | uint32_t fileset_num; /* key! */ |
| 628 | uint32_t fileset_desc_num; |
| 629 | struct charspec logvol_id_charset; |
| 630 | char logvol_id[128]; /* for recovery */ |
| 631 | struct charspec fileset_charset; |
| 632 | char fileset_id[32]; /* Mountpoint !! */ |
| 633 | char copyright_file_id[32]; |
| 634 | char abstract_file_id[32]; |
| 635 | struct long_ad rootdir_icb; /* to rootdir; icb->virtual ? */ |
| 636 | struct regid domain_id; |
| 637 | struct long_ad next_ex; /* to the next fileset_desc extent */ |
| 638 | struct long_ad streamdir_icb; /* streamdir; needed? */ |
| 639 | uint8_t reserved[32]; |
| 640 | } __packed; |
| 641 | |
| 642 | |
| 643 | /* File Identifier Descriptor [4/14.4] */ |
| 644 | struct fileid_desc { |
| 645 | struct desc_tag tag; |
| 646 | uint16_t file_version_num; |
| 647 | uint8_t file_char; |
| 648 | uint8_t l_fi; /* Length of file identifier area */ |
| 649 | struct long_ad icb; |
| 650 | uint16_t l_iu; /* Length of implementation use area */ |
| 651 | uint8_t data[0]; |
| 652 | } __packed; |
| 653 | #define UDF_FID_SIZE 38 |
| 654 | #define UDF_FILE_CHAR_VIS (1 << 0) /* Invisible */ |
| 655 | #define UDF_FILE_CHAR_DIR (1 << 1) /* Directory */ |
| 656 | #define UDF_FILE_CHAR_DEL (1 << 2) /* Deleted */ |
| 657 | #define UDF_FILE_CHAR_PAR (1 << 3) /* Parent Directory */ |
| 658 | #define UDF_FILE_CHAR_META (1 << 4) /* Stream metadata */ |
| 659 | |
| 660 | |
| 661 | /* Extended attributes [4/14.10.1] */ |
| 662 | struct extattrhdr_desc { |
| 663 | struct desc_tag tag; |
| 664 | uint32_t impl_attr_loc; /* offsets within this descriptor */ |
| 665 | uint32_t appl_attr_loc; /* ditto */ |
| 666 | } __packed; |
| 667 | #define UDF_IMPL_ATTR_LOC_NOT_PRESENT 0xffffffff |
| 668 | #define UDF_APPL_ATTR_LOC_NOT_PRESENT 0xffffffff |
| 669 | |
| 670 | |
| 671 | /* Extended attribute entry [4/48.10.2] */ |
| 672 | struct extattr_entry { |
| 673 | uint32_t type; |
| 674 | uint8_t subtype; |
| 675 | uint8_t reserved[3]; |
| 676 | uint32_t a_l; |
| 677 | } __packed; |
| 678 | |
| 679 | |
| 680 | /* Extended attribute entry; type 2048 [4/48.10.8] */ |
| 681 | struct impl_extattr_entry { |
| 682 | struct extattr_entry hdr; |
| 683 | uint32_t iu_l; |
| 684 | struct regid imp_id; |
| 685 | uint8_t data[1]; |
| 686 | } __packed; |
| 687 | |
| 688 | |
| 689 | /* Extended attribute entry; type 65 536 [4/48.10.9] */ |
| 690 | struct appl_extattr_entry { |
| 691 | struct extattr_entry hdr; |
| 692 | uint32_t au_l; |
| 693 | struct regid appl_id; |
| 694 | uint8_t data[1]; |
| 695 | } __packed; |
| 696 | |
| 697 | |
| 698 | /* File Times attribute entry; type 5 or type 6 [4/48.10.5], [4/48.10.6] */ |
| 699 | struct filetimes_extattr_entry { |
| 700 | struct extattr_entry hdr; |
| 701 | uint32_t d_l; /* length of times[] data following */ |
| 702 | uint32_t existence; /* bitmask */ |
| 703 | struct timestamp times[1]; /* in order of ascending bits */ |
| 704 | } __packed; |
| 705 | #define UDF_FILETIMES_ATTR_NO 5 |
| 706 | #define UDF_FILETIMES_FILE_CREATION 1 |
| 707 | #define UDF_FILETIMES_FILE_DELETION 4 |
| 708 | #define UDF_FILETIMES_FILE_EFFECTIVE 8 |
| 709 | #define UDF_FILETIMES_FILE_BACKUPED 16 |
| 710 | #define UDF_FILETIMES_ATTR_SIZE(no) (20 + (no)*sizeof(struct timestamp)) |
| 711 | |
| 712 | |
| 713 | /* Device Specification Extended Attribute [4/4.10.7] */ |
| 714 | struct device_extattr_entry { |
| 715 | struct extattr_entry hdr; |
| 716 | uint32_t iu_l; /* length of implementation use */ |
| 717 | uint32_t major; |
| 718 | uint32_t minor; |
| 719 | uint8_t data[1]; /* UDF: if nonzero length, contain developer ID regid */ |
| 720 | } __packed; |
| 721 | #define UDF_DEVICESPEC_ATTR_NO 12 |
| 722 | |
| 723 | |
| 724 | /* VAT LV extension Extended Attribute [UDF 3.3.4.5.1.3] 1.50 errata */ |
| 725 | struct vatlvext_extattr_entry { |
| 726 | uint64_t unique_id_chk; /* needs to be copy of ICB's */ |
| 727 | uint32_t num_files; |
| 728 | uint32_t num_directories; |
| 729 | char logvol_id[128]; /* replaces logvol name */ |
| 730 | } __packed; |
| 731 | |
| 732 | |
| 733 | /* File Entry [4/14.9] */ |
| 734 | struct file_entry { |
| 735 | struct desc_tag tag; |
| 736 | struct icb_tag icbtag; |
| 737 | uint32_t uid; |
| 738 | uint32_t gid; |
| 739 | uint32_t perm; |
| 740 | uint16_t link_cnt; |
| 741 | uint8_t rec_format; |
| 742 | uint8_t rec_disp_attr; |
| 743 | uint32_t rec_len; |
| 744 | uint64_t inf_len; |
| 745 | uint64_t logblks_rec; |
| 746 | struct timestamp atime; |
| 747 | struct timestamp mtime; |
| 748 | struct timestamp attrtime; |
| 749 | uint32_t ckpoint; |
| 750 | struct long_ad ex_attr_icb; |
| 751 | struct regid imp_id; |
| 752 | uint64_t unique_id; |
| 753 | uint32_t l_ea; /* Length of extended attribute area */ |
| 754 | uint32_t l_ad; /* Length of allocation descriptors */ |
| 755 | uint8_t data[1]; |
| 756 | } __packed; |
| 757 | #define UDF_FENTRY_SIZE 176 |
| 758 | #define UDF_FENTRY_PERM_USER_MASK 0x07 |
| 759 | #define UDF_FENTRY_PERM_GRP_MASK 0xE0 |
| 760 | #define UDF_FENTRY_PERM_OWNER_MASK 0x1C00 |
| 761 | |
| 762 | |
| 763 | /* Extended File Entry [4/48.17] */ |
| 764 | struct extfile_entry { |
| 765 | struct desc_tag tag; |
| 766 | struct icb_tag icbtag; |
| 767 | uint32_t uid; |
| 768 | uint32_t gid; |
| 769 | uint32_t perm; |
| 770 | uint16_t link_cnt; |
| 771 | uint8_t rec_format; |
| 772 | uint8_t rec_disp_attr; |
| 773 | uint32_t rec_len; |
| 774 | uint64_t inf_len; |
| 775 | uint64_t obj_size; |
| 776 | uint64_t logblks_rec; |
| 777 | struct timestamp atime; |
| 778 | struct timestamp mtime; |
| 779 | struct timestamp ctime; |
| 780 | struct timestamp attrtime; |
| 781 | uint32_t ckpoint; |
| 782 | uint32_t reserved1; |
| 783 | struct long_ad ex_attr_icb; |
| 784 | struct long_ad streamdir_icb; |
| 785 | struct regid imp_id; |
| 786 | uint64_t unique_id; |
| 787 | uint32_t l_ea; /* Length of extended attribute area */ |
| 788 | uint32_t l_ad; /* Length of allocation descriptors */ |
| 789 | uint8_t data[1]; |
| 790 | } __packed; |
| 791 | #define UDF_EXTFENTRY_SIZE 216 |
| 792 | |
| 793 | |
| 794 | /* Indirect entry [ecma 48.7] */ |
| 795 | struct indirect_entry { |
| 796 | struct desc_tag tag; |
| 797 | struct icb_tag icbtag; |
| 798 | struct long_ad indirect_icb; |
| 799 | } __packed; |
| 800 | |
| 801 | |
| 802 | /* Allocation extent descriptor [ecma 48.5] */ |
| 803 | struct alloc_ext_entry { |
| 804 | struct desc_tag tag; |
| 805 | uint32_t prev_entry; |
| 806 | uint32_t l_ad; |
| 807 | uint8_t data[1]; |
| 808 | } __packed; |
| 809 | |
| 810 | |
| 811 | union dscrptr { |
| 812 | struct desc_tag tag; |
| 813 | struct anchor_vdp avdp; |
| 814 | struct vol_desc_ptr vdp; |
| 815 | struct pri_vol_desc pvd; |
| 816 | struct logvol_desc lvd; |
| 817 | struct unalloc_sp_desc usd; |
| 818 | struct logvol_int_desc lvid; |
| 819 | struct impvol_desc ivd; |
| 820 | struct part_desc pd; |
| 821 | struct fileset_desc fsd; |
| 822 | struct fileid_desc fid; |
| 823 | struct file_entry fe; |
| 824 | struct extfile_entry efe; |
| 825 | struct extattrhdr_desc eahd; |
| 826 | struct indirect_entry inde; |
| 827 | struct alloc_ext_entry aee; |
| 828 | struct udf_sparing_table spt; |
| 829 | struct space_bitmap_desc sbd; |
| 830 | struct space_entry_desc sed; |
| 831 | }; |
| 832 | |
| 833 | |
| 834 | #endif /* !_FS_UDF_ECMA167_UDF_H_ */ |
| 835 | |
| 836 | |