Annotation of sys/isofs/cd9660/iso.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: iso.h,v 1.14 2005/09/28 20:53:54 miod Exp $ */
2: /* $NetBSD: iso.h,v 1.20 1997/07/07 22:45:34 cgd Exp $ */
3:
4: /*-
5: * Copyright (c) 1994
6: * The Regents of the University of California. All rights reserved.
7: *
8: * This code is derived from software contributed to Berkeley
9: * by Pace Willisson (pace@blitz.com). The Rock Ridge Extension
10: * Support code is derived from software contributed to Berkeley
11: * by Atsushi Murai (amurai@spec.co.jp).
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: * 3. Neither the name of the University nor the names of its contributors
22: * may be used to endorse or promote products derived from this software
23: * without specific prior written permission.
24: *
25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35: * SUCH DAMAGE.
36: *
37: * @(#)iso.h 8.4 (Berkeley) 12/5/94
38: */
39:
40: /*
41: * Definitions describing ISO9660 file system structure, as well as
42: * the functions necessary to access fields of ISO9660 file system
43: * structures.
44: */
45:
46: #define ISODCL(from, to) (to - from + 1)
47:
48: struct iso_volume_descriptor {
49: char type[ISODCL(1,1)]; /* 711 */
50: char id[ISODCL(2,6)];
51: char version[ISODCL(7,7)];
52: char data[ISODCL(8,2048)];
53: };
54:
55: /* volume descriptor types */
56: #define ISO_VD_PRIMARY 1
57: #define ISO_VD_SUPPLEMENTARY 2
58: #define ISO_VD_END 255
59:
60: #define ISO_STANDARD_ID "CD001"
61: #define ISO_ECMA_ID "CDW01"
62:
63: struct iso_primary_descriptor {
64: char type [ISODCL ( 1, 1)]; /* 711 */
65: char id [ISODCL ( 2, 6)];
66: char version [ISODCL ( 7, 7)]; /* 711 */
67: char unused1 [ISODCL ( 8, 8)];
68: char system_id [ISODCL ( 9, 40)]; /* achars */
69: char volume_id [ISODCL ( 41, 72)]; /* dchars */
70: char unused2 [ISODCL ( 73, 80)];
71: char volume_space_size [ISODCL ( 81, 88)]; /* 733 */
72: char unused3 [ISODCL ( 89, 120)];
73: char volume_set_size [ISODCL (121, 124)]; /* 723 */
74: char volume_sequence_number [ISODCL (125, 128)]; /* 723 */
75: char logical_block_size [ISODCL (129, 132)]; /* 723 */
76: char path_table_size [ISODCL (133, 140)]; /* 733 */
77: char type_l_path_table [ISODCL (141, 144)]; /* 731 */
78: char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */
79: char type_m_path_table [ISODCL (149, 152)]; /* 732 */
80: char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */
81: char root_directory_record [ISODCL (157, 190)]; /* 9.1 */
82: char volume_set_id [ISODCL (191, 318)]; /* dchars */
83: char publisher_id [ISODCL (319, 446)]; /* achars */
84: char preparer_id [ISODCL (447, 574)]; /* achars */
85: char application_id [ISODCL (575, 702)]; /* achars */
86: char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */
87: char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */
88: char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */
89: char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */
90: char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */
91: char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */
92: char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */
93: char file_structure_version [ISODCL (882, 882)]; /* 711 */
94: char unused4 [ISODCL (883, 883)];
95: char application_data [ISODCL (884, 1395)];
96: char unused5 [ISODCL (1396, 2048)];
97: };
98: #define ISO_DEFAULT_BLOCK_SHIFT 11
99: #define ISO_DEFAULT_BLOCK_SIZE (1<<ISO_DEFAULT_BLOCK_SHIFT)
100:
101: /*
102: * Used by Microsoft Joliet extension to ISO9660. Almost the same
103: * as PVD, but byte position 8 is a flag, and 89-120 is for escape.
104: */
105:
106: struct iso_supplementary_descriptor {
107: char type [ISODCL ( 1, 1)]; /* 711 */
108: char id [ISODCL ( 2, 6)];
109: char version [ISODCL ( 7, 7)]; /* 711 */
110: char flags [ISODCL ( 8, 8)];
111: char system_id [ISODCL ( 9, 40)]; /* achars */
112: char volume_id [ISODCL ( 41, 72)]; /* dchars */
113: char unused2 [ISODCL ( 73, 80)];
114: char volume_space_size [ISODCL ( 81, 88)]; /* 733 */
115: char escape [ISODCL ( 89, 120)];
116: char volume_set_size [ISODCL (121, 124)]; /* 723 */
117: char volume_sequence_number [ISODCL (125, 128)]; /* 723 */
118: char logical_block_size [ISODCL (129, 132)]; /* 723 */
119: char path_table_size [ISODCL (133, 140)]; /* 733 */
120: char type_l_path_table [ISODCL (141, 144)]; /* 731 */
121: char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */
122: char type_m_path_table [ISODCL (149, 152)]; /* 732 */
123: char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */
124: char root_directory_record [ISODCL (157, 190)]; /* 9.1 */
125: char volume_set_id [ISODCL (191, 318)]; /* dchars */
126: char publisher_id [ISODCL (319, 446)]; /* achars */
127: char preparer_id [ISODCL (447, 574)]; /* achars */
128: char application_id [ISODCL (575, 702)]; /* achars */
129: char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */
130: char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */
131: char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */
132: char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */
133: char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */
134: char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */
135: char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */
136: char file_structure_version [ISODCL (882, 882)]; /* 711 */
137: char unused4 [ISODCL (883, 883)];
138: char application_data [ISODCL (884, 1395)];
139: char unused5 [ISODCL (1396, 2048)];
140: };
141:
142: struct iso_directory_record {
143: char length [ISODCL (1, 1)]; /* 711 */
144: char ext_attr_length [ISODCL (2, 2)]; /* 711 */
145: u_char extent [ISODCL (3, 10)]; /* 733 */
146: u_char size [ISODCL (11, 18)]; /* 733 */
147: char date [ISODCL (19, 25)]; /* 7 by 711 */
148: char flags [ISODCL (26, 26)];
149: char file_unit_size [ISODCL (27, 27)]; /* 711 */
150: char interleave [ISODCL (28, 28)]; /* 711 */
151: char volume_sequence_number [ISODCL (29, 32)]; /* 723 */
152: char name_len [ISODCL (33, 33)]; /* 711 */
153: char name [1]; /* XXX */
154: };
155: /* can't take sizeof(iso_directory_record), because of possible alignment
156: of the last entry (34 instead of 33) */
157: #define ISO_DIRECTORY_RECORD_SIZE 33
158:
159: struct iso_extended_attributes {
160: u_char owner [ISODCL (1, 4)]; /* 723 */
161: u_char group [ISODCL (5, 8)]; /* 723 */
162: u_char perm [ISODCL (9, 10)]; /* 9.5.3 */
163: char ctime [ISODCL (11, 27)]; /* 8.4.26.1 */
164: char mtime [ISODCL (28, 44)]; /* 8.4.26.1 */
165: char xtime [ISODCL (45, 61)]; /* 8.4.26.1 */
166: char ftime [ISODCL (62, 78)]; /* 8.4.26.1 */
167: char recfmt [ISODCL (79, 79)]; /* 711 */
168: char recattr [ISODCL (80, 80)]; /* 711 */
169: u_char reclen [ISODCL (81, 84)]; /* 723 */
170: char system_id [ISODCL (85, 116)]; /* achars */
171: char system_use [ISODCL (117, 180)];
172: char version [ISODCL (181, 181)]; /* 711 */
173: char len_esc [ISODCL (182, 182)]; /* 711 */
174: char reserved [ISODCL (183, 246)];
175: u_char len_au [ISODCL (247, 250)]; /* 723 */
176: };
177:
178: static __inline int isonum_711(u_char *) __attribute__ ((__unused__));
179: static __inline int isonum_712(char *) __attribute__ ((__unused__));
180: static __inline int isonum_721(u_char *) __attribute__ ((__unused__));
181: static __inline int isonum_722(u_char *) __attribute__ ((__unused__));
182: static __inline int isonum_723(u_char *) __attribute__ ((__unused__));
183: static __inline int isonum_731(u_char *) __attribute__ ((__unused__));
184: static __inline int isonum_732(u_char *) __attribute__ ((__unused__));
185: static __inline int isonum_733(u_char *) __attribute__ ((__unused__));
186:
187: /* 7.1.1: unsigned char */
188: static __inline int
189: isonum_711(u_char *p)
190: {
191: return *p;
192: }
193:
194: /* 7.1.2: signed(?) char */
195: static __inline int
196: isonum_712(char *p)
197: {
198: return *p;
199: }
200:
201: /* 7.2.1: unsigned little-endian 16-bit value. NOT USED IN KERNEL. */
202: static __inline int
203: isonum_721(p)
204: u_char *p;
205: {
206: #if !defined(__STRICT_ALIGNMENT) && (BYTE_ORDER == LITTLE_ENDIAN)
207: return *(u_int16_t *)p;
208: #else
209: return *p|((char)p[1] << 8);
210: #endif
211: }
212:
213: /* 7.2.2: unsigned big-endian 16-bit value. NOT USED IN KERNEL. */
214: static __inline int
215: isonum_722(p)
216: unsigned char *p;
217: {
218: #if !defined(__STRICT_ALIGNMENT) && (BYTE_ORDER == BIG_ENDIAN)
219: return *(u_int16_t *)p;
220: #else
221: return ((char)*p << 8)|p[1];
222: #endif
223: }
224:
225: /* 7.2.3: unsigned both-endian (little, then big) 16-bit value */
226: static __inline int
227: isonum_723(u_char *p)
228: {
229: #if !defined(__STRICT_ALIGNMENT) && \
230: ((BYTE_ORDER == LITTLE_ENDIAN) || (BYTE_ORDER == BIG_ENDIAN))
231: #if BYTE_ORDER == LITTLE_ENDIAN
232: return *(u_int16_t *)p;
233: #else
234: return *(u_int16_t *)(p + 2);
235: #endif
236: #else /* __STRICT_ALIGNMENT or weird byte order */
237: return *p|(p[1] << 8);
238: #endif
239: }
240:
241: /* 7.3.1: unsigned little-endian 32-bit value. NOT USED IN KERNEL. */
242: static __inline int
243: isonum_731(p)
244: u_char *p;
245: {
246: #if !defined(__STRICT_ALIGNMENT) && (BYTE_ORDER == LITTLE_ENDIAN)
247: return *(u_int32_t *)p;
248: #else
249: return *p|(p[1] << 8)|(p[2] << 16)|(p[3] << 24);
250: #endif
251: }
252:
253: /* 7.3.2: unsigned big-endian 32-bit value. NOT USED IN KERNEL. */
254: static __inline int
255: isonum_732(p)
256: unsigned char *p;
257: {
258: #if !defined(__STRICT_ALIGNMENT) && (BYTE_ORDER == BIG_ENDIAN)
259: return *(u_int32_t *)p;
260: #else
261: return (*p << 24)|(p[1] << 16)|(p[2] << 8)|p[3];
262: #endif
263: }
264:
265: /* 7.3.3: unsigned both-endian (little, then big) 32-bit value */
266: static __inline int
267: isonum_733(u_char *p)
268: {
269: #if !defined(__STRICT_ALIGNMENT) && \
270: ((BYTE_ORDER == LITTLE_ENDIAN) || (BYTE_ORDER == BIG_ENDIAN))
271: #if BYTE_ORDER == LITTLE_ENDIAN
272: return *(u_int32_t *)p;
273: #else
274: return *(u_int32_t *)(p + 4);
275: #endif
276: #else /* __STRICT_ALIGNMENT or weird byte order */
277: return *p|(p[1] << 8)|(p[2] << 16)|(p[3] << 24);
278: #endif
279: }
280:
281: /*
282: * Associated files have a leading '='.
283: */
284: #define ASSOCCHAR '='
CVSweb