summaryrefslogtreecommitdiff
path: root/genisoimage/iso9660.h
blob: c74c2a9dcc31782937fbbcb076652272da272d97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
/*
 * This file has been modified for the cdrkit suite.
 *
 * The behaviour and appearence of the program code below can differ to a major
 * extent from the version distributed by the original author(s).
 *
 * For details, see Changelog file distributed with the cdrkit package. If you
 * received this file from another source then ask the distributing person for
 * a log of modifications.
 *
 */

/* @(#)iso9660.h	1.19 04/03/02 joerg */
/*
 * Header file iso9660.h - assorted structure definitions and typecasts.
 * specific to iso9660 filesystem.
 *
 * Written by Eric Youngdale (1993).
 *
 * Copyright 1993 Yggdrasil Computing, Incorporated
 * Copyright (c) 1999,2000-2004 J. Schilling
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
#ifndef	_ISOFS_FS_H
#define	_ISOFS_FS_H

/*
 * The isofs filesystem constants/structures
 */

/* This part borrowed from the bsd386 isofs */
#define	ISODCL(from, to) (to - from + 1)

struct iso_volume_descriptor {
	char type	[ISODCL(1, 1)]; /* 711 */
	char id		[ISODCL(2, 6)];
	char version	[ISODCL(7, 7)];
	char data	[ISODCL(8, 2048)];
};

/* volume descriptor types */
#define	ISO_VD_PRIMARY		1
#define	ISO_VD_SUPPLEMENTARY	2	/* Used by Joliet */
#define	ISO_VD_END		255

#define	ISO_STANDARD_ID		"CD001"

#define	EL_TORITO_ID		"EL TORITO SPECIFICATION"
#define	EL_TORITO_ARCH_x86	0
#define	EL_TORITO_ARCH_PPC	1
#define	EL_TORITO_ARCH_MAC	2

#define	EL_TORITO_BOOTABLE	0x88
#define	EL_TORITO_NOT_BOOTABLE	0

#define	EL_TORITO_MEDIA_NOEMUL	0
#define	EL_TORITO_MEDIA_12FLOP	1
#define	EL_TORITO_MEDIA_144FLOP	2
#define	EL_TORITO_MEDIA_288FLOP	3
#define	EL_TORITO_MEDIA_HD	4

struct iso_primary_descriptor {
	char type			[ISODCL(1,    1)]; /* 711 */
	char id				[ISODCL(2,    6)];
	char version			[ISODCL(7,    7)]; /* 711 */
	char unused1			[ISODCL(8,    8)];
	char system_id			[ISODCL(9,   40)]; /* achars */
	char volume_id			[ISODCL(41,  72)]; /* dchars */
	char unused2			[ISODCL(73,  80)];
	char volume_space_size		[ISODCL(81,  88)]; /* 733 */
	char escape_sequences		[ISODCL(89, 120)];
	char volume_set_size		[ISODCL(121, 124)]; /* 723 */
	char volume_sequence_number	[ISODCL(125, 128)]; /* 723 */
	char logical_block_size		[ISODCL(129, 132)]; /* 723 */
	char path_table_size		[ISODCL(133, 140)]; /* 733 */
	char type_l_path_table		[ISODCL(141, 144)]; /* 731 */
	char opt_type_l_path_table	[ISODCL(145, 148)]; /* 731 */
	char type_m_path_table		[ISODCL(149, 152)]; /* 732 */
	char opt_type_m_path_table	[ISODCL(153, 156)]; /* 732 */
	char root_directory_record	[ISODCL(157, 190)]; /* 9.1 */
	char volume_set_id		[ISODCL(191, 318)]; /* dchars */
	char publisher_id		[ISODCL(319, 446)]; /* achars */
	char preparer_id		[ISODCL(447, 574)]; /* achars */
	char application_id		[ISODCL(575, 702)]; /* achars */
	char copyright_file_id		[ISODCL(703, 739)]; /* 7.5 dchars */
	char abstract_file_id		[ISODCL(740, 776)]; /* 7.5 dchars */
	char bibliographic_file_id	[ISODCL(777, 813)]; /* 7.5 dchars */
	char creation_date		[ISODCL(814, 830)]; /* 8.4.26.1 */
	char modification_date		[ISODCL(831, 847)]; /* 8.4.26.1 */
	char expiration_date		[ISODCL(848, 864)]; /* 8.4.26.1 */
	char effective_date		[ISODCL(865, 881)]; /* 8.4.26.1 */
	char file_structure_version	[ISODCL(882, 882)]; /* 711 */
	char unused4			[ISODCL(883, 883)];
	char application_data		[ISODCL(884, 1395)];
	char unused5			[ISODCL(1396, 2048)];
};

/*
 * Supplementary or enhanced volume descriptor
 */
struct iso_enhanced_descriptor {
	char type			[ISODCL(1,    1)]; /* 711 */
	char id				[ISODCL(2,    6)];
	char version			[ISODCL(7,    7)]; /* 711 */
	char flags			[ISODCL(8,    8)];
	char system_id			[ISODCL(9,   40)]; /* achars */
	char volume_id			[ISODCL(41,  72)]; /* dchars */
	char unused2			[ISODCL(73,  80)];
	char volume_space_size		[ISODCL(81,  88)]; /* 733 */
	char escape_sequences		[ISODCL(89, 120)];
	char volume_set_size		[ISODCL(121, 124)]; /* 723 */
	char volume_sequence_number	[ISODCL(125, 128)]; /* 723 */
	char logical_block_size		[ISODCL(129, 132)]; /* 723 */
	char path_table_size		[ISODCL(133, 140)]; /* 733 */
	char type_l_path_table		[ISODCL(141, 144)]; /* 731 */
	char opt_type_l_path_table	[ISODCL(145, 148)]; /* 731 */
	char type_m_path_table		[ISODCL(149, 152)]; /* 732 */
	char opt_type_m_path_table	[ISODCL(153, 156)]; /* 732 */
	char root_directory_record	[ISODCL(157, 190)]; /* 9.1 */
	char volume_set_id		[ISODCL(191, 318)]; /* dchars */
	char publisher_id		[ISODCL(319, 446)]; /* achars */
	char preparer_id		[ISODCL(447, 574)]; /* achars */
	char application_id		[ISODCL(575, 702)]; /* achars */
	char copyright_file_id		[ISODCL(703, 739)]; /* 7.5 dchars */
	char abstract_file_id		[ISODCL(740, 776)]; /* 7.5 dchars */
	char bibliographic_file_id	[ISODCL(777, 813)]; /* 7.5 dchars */
	char creation_date		[ISODCL(814, 830)]; /* 8.4.26.1 */
	char modification_date		[ISODCL(831, 847)]; /* 8.4.26.1 */
	char expiration_date		[ISODCL(848, 864)]; /* 8.4.26.1 */
	char effective_date		[ISODCL(865, 881)]; /* 8.4.26.1 */
	char file_structure_version	[ISODCL(882, 882)]; /* 711 */
	char unused4			[ISODCL(883, 883)];
	char application_data		[ISODCL(884, 1395)];
	char unused5			[ISODCL(1396, 2048)];
};

/* El Torito Boot Record Volume Descriptor */
struct eltorito_boot_descriptor {
	char type			[ISODCL(1,    1)]; /* 711 */
	char id				[ISODCL(2,    6)];
	char version			[ISODCL(7,    7)]; /* 711 */
	char system_id			[ISODCL(8,   39)];
	char unused2			[ISODCL(40,  71)];
	char bootcat_ptr		[ISODCL(72,  75)];
	char unused5			[ISODCL(76, 2048)];
};

/* Validation entry for El Torito */
struct eltorito_validation_entry {
	char headerid			[ISODCL(1,    1)]; /* 711 */
	char arch			[ISODCL(2,    2)];
	char pad1			[ISODCL(3,    4)]; /* 711 */
	char id				[ISODCL(5,   28)]; /* CD devel/man*/
	char cksum			[ISODCL(29,  30)];
	char key1			[ISODCL(31,  31)];
	char key2			[ISODCL(32,  32)];
};

/* El Torito initial/default entry in boot catalog */
struct eltorito_defaultboot_entry {
	char boot_id			[ISODCL(1,    1)]; /* 711 */
	char boot_media			[ISODCL(2,    2)];
	char loadseg			[ISODCL(3,    4)]; /* 711 */
	char sys_type			[ISODCL(5,    5)];
	char pad1			[ISODCL(6,    6)];
	char nsect			[ISODCL(7,    8)];
	char bootoff			[ISODCL(9,   12)];
	char pad2			[ISODCL(13,  32)];
};

/*
 * XXX JS: The next two structures have odd lengths!
 * Some compilers (e.g. on Sun3/mc68020) padd the structures to even length.
 * For this reason, we cannot use sizeof (struct iso_path_table) or
 * sizeof (struct iso_directory_record) to compute on disk sizes.
 * Instead, we use offsetof(..., name) and add the name size.
 * See genisoimage.h
 */

/* We use this to help us look up the parent inode numbers. */

struct iso_path_table {
	unsigned char  name_len[2];	/* 721 */
	char extent[4];			/* 731 */
	char  parent[2];		/* 721 */
	char name[1];
};

/*
 * A ISO filename is: "abcde.eee;1" -> <filename> '.' <ext> ';' <version #>
 *
 * The maximum needed string length is:
 *	30 chars (filename + ext)
 * +	 2 chars ('.' + ';')
 * +	   strlen("32767")
 * +	   null byte
 * ================================
 * =	38 chars
 *
 * We currently do not support CD-ROM-XA entension records, but we must honor
 * the needed space for ISO-9660:1999 (Version 2).
 *
 * XXX If we ever will start to support XA records, we will need to take care
 * XXX that the the maximum ISO-9660 name length will be reduced by another
 * XXX 14 bytes resulting in a new total of 179 Bytes.
 */
#define	LEN_ISONAME		31
#define	MAX_ISONAME_V1		37
#define	MAX_ISONAME_V2		207		/* 254 - 33 - 14 (XA Record) */
#define	MAX_ISONAME_V2_RR	193		/* 254 - 33 - 28 (CE Record) */
#define	MAX_ISONAME_V2_RR_XA	179		/* 254 - 33 - 14 - 28	    */
#define	MAX_ISONAME		MAX_ISONAME_V2	/* Used for array space defs */
#define	MAX_ISODIR		254		/* Must be even and <= 255   */

struct iso_directory_record {
	unsigned char length		[ISODCL(1,  1)];  /* 711 */
	char ext_attr_length		[ISODCL(2,  2)];  /* 711 */
	char extent			[ISODCL(3,  10)]; /* 733 */
	char size			[ISODCL(11, 18)]; /* 733 */
	char date			[ISODCL(19, 25)]; /* 7 by 711 */
	char flags			[ISODCL(26, 26)];
	char file_unit_size		[ISODCL(27, 27)]; /* 711 */
	char interleave			[ISODCL(28, 28)]; /* 711 */
	char volume_sequence_number	[ISODCL(29, 32)]; /* 723 */
	unsigned char name_len		[ISODCL(33, 33)]; /* 711 */
	char name			[MAX_ISONAME+1]; /* Not really, but we need something here */
};


/*
 * Iso directory flags.
 */
#define	ISO_FILE	0	/* Not really a flag...			*/
#define	ISO_EXISTENCE	1	/* Do not make existence known (hidden)	*/
#define	ISO_DIRECTORY	2	/* This file is a directory		*/
#define	ISO_ASSOCIATED	4	/* This file is an assiciated file	*/
#define	ISO_RECORD	8	/* Record format in extended attr. != 0	*/
#define	ISO_PROTECTION	16	/* No read/execute perm. in ext. attr.	*/
#define	ISO_DRESERVED1	32	/* Reserved bit 5			*/
#define	ISO_DRESERVED2	64	/* Reserved bit 6			*/
#define	ISO_MULTIEXTENT	128	/* Not final entry of a mult. ext. file	*/


struct iso_ext_attr_record {
	char owner			[ISODCL(1, 4)];	    /* 723 */
	char group			[ISODCL(5, 8)];	    /* 723 */
	char permissions		[ISODCL(9, 10)];    /* 16 bits */
	char creation_date		[ISODCL(11, 27)];   /* 8.4.26.1 */
	char modification_date		[ISODCL(28, 44)];   /* 8.4.26.1 */
	char expiration_date		[ISODCL(45, 61)];   /* 8.4.26.1 */
	char effective_date		[ISODCL(62, 78)];   /* 8.4.26.1 */
	char record_format		[ISODCL(79, 79)];   /* 711 */
	char record_attributes		[ISODCL(80, 80)];   /* 711 */
	char record_length		[ISODCL(81, 84)];   /* 723 */
	char system_id			[ISODCL(85, 116)];  /* achars */
	char system_use			[ISODCL(117, 180)];
	char ext_attr_version		[ISODCL(181, 181)]; /* 711 */
	char esc_seq_len		[ISODCL(182, 182)]; /* 711 */
	char reserved			[ISODCL(183, 246)]; /* for future use */
	char appl_use_len		[ISODCL(247, 250)]; /* 723 */
	char appl_use[1];		/* really more */
/*	char esc_seq[];			escape sequences recorded after appl_use */
};

/*
 * Iso extended attribute permissions.
 */
#define	ISO_GS_READ		0x0001	/* System Group Read */
#define	ISO_BIT_1		0x0002
#define	ISO_GS_EXEC		0x0004	/* System Group Execute */
#define	ISO_BIT_3		0x0008

#define	ISO_O_READ		0x0010	/* Owner Read */
#define	ISO_BIT_5		0x0020
#define	ISO_O_EXEC		0x0040	/* Owner Exexute */
#define	ISO_BIT_7		0x0080

#define	ISO_G_READ		0x0100	/* Group Read */
#define	ISO_BIT_9		0x0200
#define	ISO_G_EXEC		0x0400	/* Group Execute */
#define	ISO_BIT_11		0x0800

#define	ISO_W_READ		0x1000	/* World (other) Read */
#define	ISO_BIT_13		0x2000
#define	ISO_W_EXEC		0x4000	/* World (other) Execute */
#define	ISO_BIT_15		0x8000

#define	ISO_MB_ONE		(ISO_BIT_1|ISO_BIT_3|ISO_BIT_5|ISO_BIT_7| \
				ISO_BIT_9|ISO_BIT_11|ISO_BIT_13|ISO_BIT_15)

/*
 * Extended Attributes record according to Yellow Book.
 */
struct iso_xa_dir_record {
	char group_id			[ISODCL(1, 2)];
	char user_id			[ISODCL(3, 4)];
	char attributes			[ISODCL(5, 6)];
	char signature			[ISODCL(7, 8)];
	char file_number		[ISODCL(9, 9)];
	char reserved			[ISODCL(10, 14)];
};

/*
 * Definitions for XA attributes
 */
#define	XA_O_READ	0x0001	/* Owner Read				*/
#define	XA_O_RES	0x0002	/* Owner Reserved (write ?)		*/
#define	XA_O_EXEC	0x0004	/* Owner Execute			*/
#define	XA_O_RES2	0x0008	/* Owner Reserved			*/
#define	XA_G_READ	0x0010	/* Group Read				*/
#define	XA_G_RES	0x0020	/* Group Reserved (write ?)		*/
#define	XA_G_EXEC	0x0040	/* Group Execute			*/
#define	XA_G_RES2	0x0080	/* Group Reserved			*/
#define	XA_W_READ	0x0100	/* World Read				*/
#define	XA_W_RES	0x0200	/* World Reserved (write ?)		*/
#define	XA_W_EXEC	0x0400	/* World Execute			*/

#define	XA_FORM1	0x0800	/* File contains Form 1 sector		*/
#define	XA_FORM2	0x1000	/* File contains Form 2 sector		*/
#define	XA_INTERLEAVED	0x2000	/* File contains interleaved sectors	*/
#define	XA_CDDA		0x4000	/* File contains audio data		*/
#define	XA_DIR		0x8000	/* This is a directory			*/

/*
 * Definitions for CD-ROM XA-Mode-2-form-1/2 sector sub-headers
 */
struct xa_subhdr {
	Uchar	file_number;		/* Identifies file for block	*/
	Uchar	channel_number;		/* Playback channel selection	*/
	Uchar	sub_mode;		/* See bit definitions below	*/
	Uchar	coding;			/* Coding information		*/
};

/*
 * Sub mode bit definitions
 */
#define	XA_SUBH_EOR		0x01	/* End-Of-Record		*/
#define	XA_SUBH_VIDEO		0x02	/* Video Block			*/
#define	XA_SUBH_AUDIO		0x04	/* Audio Block (not CD-DA)	*/
#define	XA_SUBH_DATA		0x08	/* Data Block			*/
#define	XA_SUBH_TRIGGER		0x10	/* Trigger Block		*/
#define	XA_SUBH_FORM2		0x20	/* 0 == Form1, 1 == Form2	*/
#define	XA_SUBH_REALTIME	0x40	/* Real Time Block		*/
#define	XA_SUBH_EOF		0x80	/* End-Of-File			*/

#endif	/* _ISOFS_FS_H */