1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * osta_udf.h 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This file is based on OSTA UDF(tm) 2.60 (March 1, 2005) 5*4882a593Smuzhiyun * http://www.osta.org 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (c) 2001-2004 Ben Fennema 8*4882a593Smuzhiyun * Copyright (c) 2017-2019 Pali Rohár <pali@kernel.org> 9*4882a593Smuzhiyun * All rights reserved. 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 12*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 13*4882a593Smuzhiyun * are met: 14*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright 15*4882a593Smuzhiyun * notice, this list of conditions, and the following disclaimer, 16*4882a593Smuzhiyun * without modification. 17*4882a593Smuzhiyun * 2. The name of the author may not be used to endorse or promote products 18*4882a593Smuzhiyun * derived from this software without specific prior written permission. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * Alternatively, this software may be distributed under the terms of the 21*4882a593Smuzhiyun * GNU Public License ("GPL"). 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 24*4882a593Smuzhiyun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25*4882a593Smuzhiyun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26*4882a593Smuzhiyun * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 27*4882a593Smuzhiyun * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28*4882a593Smuzhiyun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29*4882a593Smuzhiyun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30*4882a593Smuzhiyun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31*4882a593Smuzhiyun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32*4882a593Smuzhiyun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33*4882a593Smuzhiyun * SUCH DAMAGE. 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /** 37*4882a593Smuzhiyun * @file 38*4882a593Smuzhiyun * OSTA-UDF defines and structure definitions 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #include "ecma_167.h" 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #ifndef _OSTA_UDF_H 44*4882a593Smuzhiyun #define _OSTA_UDF_H 1 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* OSTA CS0 Charspec (UDF 2.60 2.1.2) */ 47*4882a593Smuzhiyun #define UDF_CHAR_SET_TYPE 0 48*4882a593Smuzhiyun #define UDF_CHAR_SET_INFO "OSTA Compressed Unicode" 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* Entity Identifier (UDF 2.60 2.1.5) */ 51*4882a593Smuzhiyun /* Identifiers (UDF 2.60 2.1.5.2) */ 52*4882a593Smuzhiyun /* Implementation Use Extended Attribute (UDF 2.60 3.3.4.5) */ 53*4882a593Smuzhiyun /* Virtual Allocation Table (UDF 1.50 2.2.10) */ 54*4882a593Smuzhiyun /* Logical Volume Extended Information (UDF 1.50 Errata, DCN 5003, 3.3.4.5.1.3) */ 55*4882a593Smuzhiyun /* OS2EA (UDF 1.50 3.3.4.5.3.1) */ 56*4882a593Smuzhiyun /* MacUniqueIDTable (UDF 1.50 3.3.4.5.4.3) */ 57*4882a593Smuzhiyun /* MacResourceFork (UDF 1.50 3.3.4.5.4.4) */ 58*4882a593Smuzhiyun #define UDF_ID_DEVELOPER "*Linux UDFFS" 59*4882a593Smuzhiyun #define UDF_ID_COMPLIANT "*OSTA UDF Compliant" 60*4882a593Smuzhiyun #define UDF_ID_LV_INFO "*UDF LV Info" 61*4882a593Smuzhiyun #define UDF_ID_FREE_EA "*UDF FreeEASpace" 62*4882a593Smuzhiyun #define UDF_ID_FREE_APP_EA "*UDF FreeAppEASpace" 63*4882a593Smuzhiyun #define UDF_ID_DVD_CGMS "*UDF DVD CGMS Info" 64*4882a593Smuzhiyun #define UDF_ID_VAT_LVEXTENSION "*UDF VAT LVExtension" 65*4882a593Smuzhiyun #define UDF_ID_OS2_EA "*UDF OS/2 EA" 66*4882a593Smuzhiyun #define UDF_ID_OS2_EA_LENGTH "*UDF OS/2 EALength" 67*4882a593Smuzhiyun #define UDF_ID_MAC_VOLUME "*UDF Mac VolumeInfo" 68*4882a593Smuzhiyun #define UDF_ID_MAC_FINDER "*UDF Mac FinderInfo" 69*4882a593Smuzhiyun #define UDF_ID_MAC_UNIQUE "*UDF Mac UniqueIDTable" 70*4882a593Smuzhiyun #define UDF_ID_MAC_RESOURCE "*UDF Mac ResourceFork" 71*4882a593Smuzhiyun #define UDF_ID_OS400_DIRINFO "*UDF OS/400 DirInfo" 72*4882a593Smuzhiyun #define UDF_ID_VIRTUAL "*UDF Virtual Partition" 73*4882a593Smuzhiyun #define UDF_ID_SPARABLE "*UDF Sparable Partition" 74*4882a593Smuzhiyun #define UDF_ID_ALLOC "*UDF Virtual Alloc Tbl" 75*4882a593Smuzhiyun #define UDF_ID_SPARING "*UDF Sparing Table" 76*4882a593Smuzhiyun #define UDF_ID_METADATA "*UDF Metadata Partition" 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* Identifier Suffix (UDF 2.60 2.1.5.3) */ 79*4882a593Smuzhiyun #define DOMAIN_FLAGS_HARD_WRITE_PROTECT 0x01 80*4882a593Smuzhiyun #define DOMAIN_FLAGS_SOFT_WRITE_PROTECT 0x02 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct domainIdentSuffix { 83*4882a593Smuzhiyun __le16 UDFRevision; 84*4882a593Smuzhiyun uint8_t domainFlags; 85*4882a593Smuzhiyun uint8_t reserved[5]; 86*4882a593Smuzhiyun } __packed; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct UDFIdentSuffix { 89*4882a593Smuzhiyun __le16 UDFRevision; 90*4882a593Smuzhiyun uint8_t OSClass; 91*4882a593Smuzhiyun uint8_t OSIdentifier; 92*4882a593Smuzhiyun uint8_t reserved[4]; 93*4882a593Smuzhiyun } __packed; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct impIdentSuffix { 96*4882a593Smuzhiyun uint8_t OSClass; 97*4882a593Smuzhiyun uint8_t OSIdentifier; 98*4882a593Smuzhiyun uint8_t impUse[6]; 99*4882a593Smuzhiyun } __packed; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct appIdentSuffix { 102*4882a593Smuzhiyun uint8_t impUse[8]; 103*4882a593Smuzhiyun } __packed; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* Logical Volume Integrity Descriptor (UDF 2.60 2.2.6) */ 106*4882a593Smuzhiyun /* Implementation Use (UDF 2.60 2.2.6.4) */ 107*4882a593Smuzhiyun struct logicalVolIntegrityDescImpUse { 108*4882a593Smuzhiyun struct regid impIdent; 109*4882a593Smuzhiyun __le32 numFiles; 110*4882a593Smuzhiyun __le32 numDirs; 111*4882a593Smuzhiyun __le16 minUDFReadRev; 112*4882a593Smuzhiyun __le16 minUDFWriteRev; 113*4882a593Smuzhiyun __le16 maxUDFWriteRev; 114*4882a593Smuzhiyun uint8_t impUse[0]; 115*4882a593Smuzhiyun } __packed; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* Implementation Use Volume Descriptor (UDF 2.60 2.2.7) */ 118*4882a593Smuzhiyun /* Implementation Use (UDF 2.60 2.2.7.2) */ 119*4882a593Smuzhiyun struct impUseVolDescImpUse { 120*4882a593Smuzhiyun struct charspec LVICharset; 121*4882a593Smuzhiyun dstring logicalVolIdent[128]; 122*4882a593Smuzhiyun dstring LVInfo1[36]; 123*4882a593Smuzhiyun dstring LVInfo2[36]; 124*4882a593Smuzhiyun dstring LVInfo3[36]; 125*4882a593Smuzhiyun struct regid impIdent; 126*4882a593Smuzhiyun uint8_t impUse[128]; 127*4882a593Smuzhiyun } __packed; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun struct udfPartitionMap2 { 130*4882a593Smuzhiyun uint8_t partitionMapType; 131*4882a593Smuzhiyun uint8_t partitionMapLength; 132*4882a593Smuzhiyun uint8_t reserved1[2]; 133*4882a593Smuzhiyun struct regid partIdent; 134*4882a593Smuzhiyun __le16 volSeqNum; 135*4882a593Smuzhiyun __le16 partitionNum; 136*4882a593Smuzhiyun } __packed; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* Virtual Partition Map (UDF 2.60 2.2.8) */ 139*4882a593Smuzhiyun struct virtualPartitionMap { 140*4882a593Smuzhiyun uint8_t partitionMapType; 141*4882a593Smuzhiyun uint8_t partitionMapLength; 142*4882a593Smuzhiyun uint8_t reserved1[2]; 143*4882a593Smuzhiyun struct regid partIdent; 144*4882a593Smuzhiyun __le16 volSeqNum; 145*4882a593Smuzhiyun __le16 partitionNum; 146*4882a593Smuzhiyun uint8_t reserved2[24]; 147*4882a593Smuzhiyun } __packed; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* Sparable Partition Map (UDF 2.60 2.2.9) */ 150*4882a593Smuzhiyun struct sparablePartitionMap { 151*4882a593Smuzhiyun uint8_t partitionMapType; 152*4882a593Smuzhiyun uint8_t partitionMapLength; 153*4882a593Smuzhiyun uint8_t reserved1[2]; 154*4882a593Smuzhiyun struct regid partIdent; 155*4882a593Smuzhiyun __le16 volSeqNum; 156*4882a593Smuzhiyun __le16 partitionNum; 157*4882a593Smuzhiyun __le16 packetLength; 158*4882a593Smuzhiyun uint8_t numSparingTables; 159*4882a593Smuzhiyun uint8_t reserved2[1]; 160*4882a593Smuzhiyun __le32 sizeSparingTable; 161*4882a593Smuzhiyun __le32 locSparingTable[4]; 162*4882a593Smuzhiyun } __packed; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun /* Metadata Partition Map (UDF 2.60 2.2.10) */ 165*4882a593Smuzhiyun struct metadataPartitionMap { 166*4882a593Smuzhiyun uint8_t partitionMapType; 167*4882a593Smuzhiyun uint8_t partitionMapLength; 168*4882a593Smuzhiyun uint8_t reserved1[2]; 169*4882a593Smuzhiyun struct regid partIdent; 170*4882a593Smuzhiyun __le16 volSeqNum; 171*4882a593Smuzhiyun __le16 partitionNum; 172*4882a593Smuzhiyun __le32 metadataFileLoc; 173*4882a593Smuzhiyun __le32 metadataMirrorFileLoc; 174*4882a593Smuzhiyun __le32 metadataBitmapFileLoc; 175*4882a593Smuzhiyun __le32 allocUnitSize; 176*4882a593Smuzhiyun __le16 alignUnitSize; 177*4882a593Smuzhiyun uint8_t flags; 178*4882a593Smuzhiyun uint8_t reserved2[5]; 179*4882a593Smuzhiyun } __packed; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Virtual Allocation Table (UDF 1.5 2.2.10) */ 182*4882a593Smuzhiyun struct virtualAllocationTable15 { 183*4882a593Smuzhiyun __le32 vatEntry[0]; 184*4882a593Smuzhiyun struct regid vatIdent; 185*4882a593Smuzhiyun __le32 previousVATICBLoc; 186*4882a593Smuzhiyun } __packed; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_VAT15 0x00U 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* Virtual Allocation Table (UDF 2.60 2.2.11) */ 191*4882a593Smuzhiyun struct virtualAllocationTable20 { 192*4882a593Smuzhiyun __le16 lengthHeader; 193*4882a593Smuzhiyun __le16 lengthImpUse; 194*4882a593Smuzhiyun dstring logicalVolIdent[128]; 195*4882a593Smuzhiyun __le32 previousVATICBLoc; 196*4882a593Smuzhiyun __le32 numFiles; 197*4882a593Smuzhiyun __le32 numDirs; 198*4882a593Smuzhiyun __le16 minUDFReadRev; 199*4882a593Smuzhiyun __le16 minUDFWriteRev; 200*4882a593Smuzhiyun __le16 maxUDFWriteRev; 201*4882a593Smuzhiyun __le16 reserved; 202*4882a593Smuzhiyun uint8_t impUse[0]; 203*4882a593Smuzhiyun __le32 vatEntry[0]; 204*4882a593Smuzhiyun } __packed; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_VAT20 0xF8U 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun /* Sparing Table (UDF 2.60 2.2.12) */ 209*4882a593Smuzhiyun struct sparingEntry { 210*4882a593Smuzhiyun __le32 origLocation; 211*4882a593Smuzhiyun __le32 mappedLocation; 212*4882a593Smuzhiyun } __packed; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun struct sparingTable { 215*4882a593Smuzhiyun struct tag descTag; 216*4882a593Smuzhiyun struct regid sparingIdent; 217*4882a593Smuzhiyun __le16 reallocationTableLen; 218*4882a593Smuzhiyun __le16 reserved; 219*4882a593Smuzhiyun __le32 sequenceNum; 220*4882a593Smuzhiyun struct sparingEntry 221*4882a593Smuzhiyun mapEntry[0]; 222*4882a593Smuzhiyun } __packed; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /* Metadata File (and Metadata Mirror File) (UDF 2.60 2.2.13.1) */ 225*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_MAIN 0xFA 226*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_MIRROR 0xFB 227*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_BITMAP 0xFC 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* struct long_ad ICB - ADImpUse (UDF 2.60 2.2.4.3) */ 230*4882a593Smuzhiyun struct allocDescImpUse { 231*4882a593Smuzhiyun __le16 flags; 232*4882a593Smuzhiyun uint8_t impUse[4]; 233*4882a593Smuzhiyun } __packed; 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun #define AD_IU_EXT_ERASED 0x0001 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun /* Real-Time Files (UDF 2.60 6.11) */ 238*4882a593Smuzhiyun #define ICBTAG_FILE_TYPE_REALTIME 0xF9U 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun /* Implementation Use Extended Attribute (UDF 2.60 3.3.4.5) */ 241*4882a593Smuzhiyun /* FreeEASpace (UDF 2.60 3.3.4.5.1.1) */ 242*4882a593Smuzhiyun struct freeEaSpace { 243*4882a593Smuzhiyun __le16 headerChecksum; 244*4882a593Smuzhiyun uint8_t freeEASpace[0]; 245*4882a593Smuzhiyun } __packed; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /* DVD Copyright Management Information (UDF 2.60 3.3.4.5.1.2) */ 248*4882a593Smuzhiyun struct DVDCopyrightImpUse { 249*4882a593Smuzhiyun __le16 headerChecksum; 250*4882a593Smuzhiyun uint8_t CGMSInfo; 251*4882a593Smuzhiyun uint8_t dataType; 252*4882a593Smuzhiyun uint8_t protectionSystemInfo[4]; 253*4882a593Smuzhiyun } __packed; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /* Logical Volume Extended Information (UDF 1.50 Errata, DCN 5003, 3.3.4.5.1.3) */ 256*4882a593Smuzhiyun struct LVExtensionEA { 257*4882a593Smuzhiyun __le16 headerChecksum; 258*4882a593Smuzhiyun __le64 verificationID; 259*4882a593Smuzhiyun __le32 numFiles; 260*4882a593Smuzhiyun __le32 numDirs; 261*4882a593Smuzhiyun dstring logicalVolIdent[128]; 262*4882a593Smuzhiyun } __packed; 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun /* Application Use Extended Attribute (UDF 2.60 3.3.4.6) */ 265*4882a593Smuzhiyun /* FreeAppEASpace (UDF 2.60 3.3.4.6.1) */ 266*4882a593Smuzhiyun struct freeAppEASpace { 267*4882a593Smuzhiyun __le16 headerChecksum; 268*4882a593Smuzhiyun uint8_t freeEASpace[0]; 269*4882a593Smuzhiyun } __packed; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* UDF Defined System Stream (UDF 2.60 3.3.7) */ 272*4882a593Smuzhiyun #define UDF_ID_UNIQUE_ID "*UDF Unique ID Mapping Data" 273*4882a593Smuzhiyun #define UDF_ID_NON_ALLOC "*UDF Non-Allocatable Space" 274*4882a593Smuzhiyun #define UDF_ID_POWER_CAL "*UDF Power Cal Table" 275*4882a593Smuzhiyun #define UDF_ID_BACKUP "*UDF Backup" 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun /* UDF Defined Non-System Streams (UDF 2.60 3.3.8) */ 278*4882a593Smuzhiyun #define UDF_ID_MAC_RESOURCE_FORK_STREAM "*UDF Macintosh Resource Fork" 279*4882a593Smuzhiyun /* #define UDF_ID_OS2_EA "*UDF OS/2 EA" */ 280*4882a593Smuzhiyun #define UDF_ID_NT_ACL "*UDF NT ACL" 281*4882a593Smuzhiyun #define UDF_ID_UNIX_ACL "*UDF UNIX ACL" 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* Operating System Identifiers (UDF 2.60 6.3) */ 284*4882a593Smuzhiyun #define UDF_OS_CLASS_UNDEF 0x00U 285*4882a593Smuzhiyun #define UDF_OS_CLASS_DOS 0x01U 286*4882a593Smuzhiyun #define UDF_OS_CLASS_OS2 0x02U 287*4882a593Smuzhiyun #define UDF_OS_CLASS_MAC 0x03U 288*4882a593Smuzhiyun #define UDF_OS_CLASS_UNIX 0x04U 289*4882a593Smuzhiyun #define UDF_OS_CLASS_WIN9X 0x05U 290*4882a593Smuzhiyun #define UDF_OS_CLASS_WINNT 0x06U 291*4882a593Smuzhiyun #define UDF_OS_CLASS_OS400 0x07U 292*4882a593Smuzhiyun #define UDF_OS_CLASS_BEOS 0x08U 293*4882a593Smuzhiyun #define UDF_OS_CLASS_WINCE 0x09U 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define UDF_OS_ID_UNDEF 0x00U 296*4882a593Smuzhiyun #define UDF_OS_ID_DOS 0x00U 297*4882a593Smuzhiyun #define UDF_OS_ID_OS2 0x00U 298*4882a593Smuzhiyun #define UDF_OS_ID_MAC 0x00U 299*4882a593Smuzhiyun #define UDF_OS_ID_MAX_OSX 0x01U 300*4882a593Smuzhiyun #define UDF_OS_ID_UNIX 0x00U 301*4882a593Smuzhiyun #define UDF_OS_ID_AIX 0x01U 302*4882a593Smuzhiyun #define UDF_OS_ID_SOLARIS 0x02U 303*4882a593Smuzhiyun #define UDF_OS_ID_HPUX 0x03U 304*4882a593Smuzhiyun #define UDF_OS_ID_IRIX 0x04U 305*4882a593Smuzhiyun #define UDF_OS_ID_LINUX 0x05U 306*4882a593Smuzhiyun #define UDF_OS_ID_MKLINUX 0x06U 307*4882a593Smuzhiyun #define UDF_OS_ID_FREEBSD 0x07U 308*4882a593Smuzhiyun #define UDF_OS_ID_NETBSD 0x08U 309*4882a593Smuzhiyun #define UDF_OS_ID_WIN9X 0x00U 310*4882a593Smuzhiyun #define UDF_OS_ID_WINNT 0x00U 311*4882a593Smuzhiyun #define UDF_OS_ID_OS400 0x00U 312*4882a593Smuzhiyun #define UDF_OS_ID_BEOS 0x00U 313*4882a593Smuzhiyun #define UDF_OS_ID_WINCE 0x00U 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun #endif /* _OSTA_UDF_H */ 316