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