Commit | Line | Data |
---|---|---|
984263bc MD |
1 | /*- |
2 | * Copyright (c) 1994 | |
3 | * The Regents of the University of California. All rights reserved. | |
4 | * | |
5 | * This code is derived from software contributed to Berkeley | |
6 | * by Pace Willisson (pace@blitz.com). The Rock Ridge Extension | |
7 | * Support code is derived from software contributed to Berkeley | |
8 | * by Atsushi Murai (amurai@spec.co.jp). | |
9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | |
15 | * 2. Redistributions in binary form must reproduce the above copyright | |
16 | * notice, this list of conditions and the following disclaimer in the | |
17 | * documentation and/or other materials provided with the distribution. | |
18 | * 3. All advertising materials mentioning features or use of this software | |
19 | * must display the following acknowledgement: | |
20 | * This product includes software developed by the University of | |
21 | * California, Berkeley and its contributors. | |
22 | * 4. Neither the name of the University nor the names of its contributors | |
23 | * may be used to endorse or promote products derived from this software | |
24 | * without specific prior written permission. | |
25 | * | |
26 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
27 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
28 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
29 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
30 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
31 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
32 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
33 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
34 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
35 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
36 | * SUCH DAMAGE. | |
37 | * | |
38 | * @(#)iso.h 8.6 (Berkeley) 5/10/95 | |
39 | * $FreeBSD: src/sys/isofs/cd9660/iso.h,v 1.19.2.1 2000/07/08 14:35:56 bp Exp $ | |
b13267a5 | 40 | * $DragonFly: src/sys/vfs/isofs/cd9660/iso.h,v 1.8 2006/09/10 01:26:41 dillon Exp $ |
984263bc MD |
41 | */ |
42 | ||
43 | #define ISODCL(from, to) (to - from + 1) | |
44 | ||
45 | struct iso_volume_descriptor { | |
46 | char type[ISODCL(1,1)]; /* 711 */ | |
47 | char id[ISODCL(2,6)]; | |
48 | char version[ISODCL(7,7)]; | |
49 | char unused[ISODCL(8,8)]; | |
50 | char type_sierra[ISODCL(9,9)]; /* 711 */ | |
51 | char id_sierra[ISODCL(10,14)]; | |
52 | char version_sierra[ISODCL(15,15)]; | |
53 | char data[ISODCL(16,2048)]; | |
54 | }; | |
55 | ||
56 | /* volume descriptor types */ | |
57 | #define ISO_VD_PRIMARY 1 | |
58 | #define ISO_VD_SUPPLEMENTARY 2 | |
59 | #define ISO_VD_END 255 | |
60 | ||
61 | #define ISO_STANDARD_ID "CD001" | |
62 | #define ISO_ECMA_ID "CDW01" | |
63 | ||
64 | #define ISO_SIERRA_ID "CDROM" | |
65 | ||
66 | struct iso_primary_descriptor { | |
67 | char type [ISODCL ( 1, 1)]; /* 711 */ | |
68 | char id [ISODCL ( 2, 6)]; | |
69 | char version [ISODCL ( 7, 7)]; /* 711 */ | |
70 | char unused1 [ISODCL ( 8, 8)]; | |
71 | char system_id [ISODCL ( 9, 40)]; /* achars */ | |
72 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ | |
73 | char unused2 [ISODCL ( 73, 80)]; | |
74 | char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ | |
75 | char unused3 [ISODCL ( 89, 120)]; | |
76 | char volume_set_size [ISODCL (121, 124)]; /* 723 */ | |
77 | char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ | |
78 | char logical_block_size [ISODCL (129, 132)]; /* 723 */ | |
79 | char path_table_size [ISODCL (133, 140)]; /* 733 */ | |
80 | char type_l_path_table [ISODCL (141, 144)]; /* 731 */ | |
81 | char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ | |
82 | char type_m_path_table [ISODCL (149, 152)]; /* 732 */ | |
83 | char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ | |
84 | char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ | |
85 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ | |
86 | char publisher_id [ISODCL (319, 446)]; /* achars */ | |
87 | char preparer_id [ISODCL (447, 574)]; /* achars */ | |
88 | char application_id [ISODCL (575, 702)]; /* achars */ | |
89 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ | |
90 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ | |
91 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ | |
92 | char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ | |
93 | char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ | |
94 | char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ | |
95 | char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ | |
96 | char file_structure_version [ISODCL (882, 882)]; /* 711 */ | |
97 | char unused4 [ISODCL (883, 883)]; | |
98 | char application_data [ISODCL (884, 1395)]; | |
99 | char unused5 [ISODCL (1396, 2048)]; | |
100 | }; | |
101 | #define ISO_DEFAULT_BLOCK_SIZE 2048 | |
102 | ||
103 | /* | |
104 | * Used by Microsoft Joliet extension to ISO9660. Almost the same | |
105 | * as PVD, but byte position 8 is a flag, and 89-120 is for escape. | |
106 | */ | |
107 | ||
108 | struct iso_supplementary_descriptor { | |
109 | char type [ISODCL ( 1, 1)]; /* 711 */ | |
110 | char id [ISODCL ( 2, 6)]; | |
111 | char version [ISODCL ( 7, 7)]; /* 711 */ | |
112 | char flags [ISODCL ( 8, 8)]; /* 711? */ | |
113 | char system_id [ISODCL ( 9, 40)]; /* achars */ | |
114 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ | |
115 | char unused2 [ISODCL ( 73, 80)]; | |
116 | char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ | |
117 | char escape [ISODCL ( 89, 120)]; | |
118 | char volume_set_size [ISODCL (121, 124)]; /* 723 */ | |
119 | char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ | |
120 | char logical_block_size [ISODCL (129, 132)]; /* 723 */ | |
121 | char path_table_size [ISODCL (133, 140)]; /* 733 */ | |
122 | char type_l_path_table [ISODCL (141, 144)]; /* 731 */ | |
123 | char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ | |
124 | char type_m_path_table [ISODCL (149, 152)]; /* 732 */ | |
125 | char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ | |
126 | char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ | |
127 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ | |
128 | char publisher_id [ISODCL (319, 446)]; /* achars */ | |
129 | char preparer_id [ISODCL (447, 574)]; /* achars */ | |
130 | char application_id [ISODCL (575, 702)]; /* achars */ | |
131 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ | |
132 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ | |
133 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ | |
134 | char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ | |
135 | char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ | |
136 | char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ | |
137 | char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ | |
138 | char file_structure_version [ISODCL (882, 882)]; /* 711 */ | |
139 | char unused4 [ISODCL (883, 883)]; | |
140 | char application_data [ISODCL (884, 1395)]; | |
141 | char unused5 [ISODCL (1396, 2048)]; | |
142 | }; | |
143 | ||
144 | struct iso_sierra_primary_descriptor { | |
145 | char unknown1 [ISODCL ( 1, 8)]; /* 733 */ | |
146 | char type [ISODCL ( 9, 9)]; /* 711 */ | |
147 | char id [ISODCL ( 10, 14)]; | |
148 | char version [ISODCL ( 15, 15)]; /* 711 */ | |
149 | char unused1 [ISODCL ( 16, 16)]; | |
150 | char system_id [ISODCL ( 17, 48)]; /* achars */ | |
151 | char volume_id [ISODCL ( 49, 80)]; /* dchars */ | |
152 | char unused2 [ISODCL ( 81, 88)]; | |
153 | char volume_space_size [ISODCL ( 89, 96)]; /* 733 */ | |
154 | char unused3 [ISODCL ( 97, 128)]; | |
155 | char volume_set_size [ISODCL (129, 132)]; /* 723 */ | |
156 | char volume_sequence_number [ISODCL (133, 136)]; /* 723 */ | |
157 | char logical_block_size [ISODCL (137, 140)]; /* 723 */ | |
158 | char path_table_size [ISODCL (141, 148)]; /* 733 */ | |
159 | char type_l_path_table [ISODCL (149, 152)]; /* 731 */ | |
160 | char opt_type_l_path_table [ISODCL (153, 156)]; /* 731 */ | |
161 | char unknown2 [ISODCL (157, 160)]; /* 731 */ | |
162 | char unknown3 [ISODCL (161, 164)]; /* 731 */ | |
163 | char type_m_path_table [ISODCL (165, 168)]; /* 732 */ | |
164 | char opt_type_m_path_table [ISODCL (169, 172)]; /* 732 */ | |
165 | char unknown4 [ISODCL (173, 176)]; /* 732 */ | |
166 | char unknown5 [ISODCL (177, 180)]; /* 732 */ | |
167 | char root_directory_record [ISODCL (181, 214)]; /* 9.1 */ | |
168 | char volume_set_id [ISODCL (215, 342)]; /* dchars */ | |
169 | char publisher_id [ISODCL (343, 470)]; /* achars */ | |
170 | char preparer_id [ISODCL (471, 598)]; /* achars */ | |
171 | char application_id [ISODCL (599, 726)]; /* achars */ | |
172 | char copyright_id [ISODCL (727, 790)]; /* achars */ | |
173 | char creation_date [ISODCL (791, 806)]; /* ? */ | |
174 | char modification_date [ISODCL (807, 822)]; /* ? */ | |
175 | char expiration_date [ISODCL (823, 838)]; /* ? */ | |
176 | char effective_date [ISODCL (839, 854)]; /* ? */ | |
177 | char file_structure_version [ISODCL (855, 855)]; /* 711 */ | |
178 | char unused4 [ISODCL (856, 2048)]; | |
179 | }; | |
180 | ||
181 | struct iso_directory_record { | |
182 | char length [ISODCL (1, 1)]; /* 711 */ | |
183 | char ext_attr_length [ISODCL (2, 2)]; /* 711 */ | |
184 | u_char extent [ISODCL (3, 10)]; /* 733 */ | |
185 | u_char size [ISODCL (11, 18)]; /* 733 */ | |
186 | char date [ISODCL (19, 25)]; /* 7 by 711 */ | |
187 | char flags [ISODCL (26, 26)]; | |
188 | char file_unit_size [ISODCL (27, 27)]; /* 711 */ | |
189 | char interleave [ISODCL (28, 28)]; /* 711 */ | |
190 | char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ | |
191 | char name_len [ISODCL (33, 33)]; /* 711 */ | |
192 | char name [1]; /* XXX */ | |
193 | }; | |
194 | /* can't take sizeof(iso_directory_record), because of possible alignment | |
195 | of the last entry (34 instead of 33) */ | |
196 | #define ISO_DIRECTORY_RECORD_SIZE 33 | |
197 | ||
198 | struct iso_extended_attributes { | |
199 | u_char owner [ISODCL (1, 4)]; /* 723 */ | |
200 | u_char group [ISODCL (5, 8)]; /* 723 */ | |
201 | u_char perm [ISODCL (9, 10)]; /* 9.5.3 */ | |
202 | char ctime [ISODCL (11, 27)]; /* 8.4.26.1 */ | |
203 | char mtime [ISODCL (28, 44)]; /* 8.4.26.1 */ | |
204 | char xtime [ISODCL (45, 61)]; /* 8.4.26.1 */ | |
205 | char ftime [ISODCL (62, 78)]; /* 8.4.26.1 */ | |
206 | char recfmt [ISODCL (79, 79)]; /* 711 */ | |
207 | char recattr [ISODCL (80, 80)]; /* 711 */ | |
208 | u_char reclen [ISODCL (81, 84)]; /* 723 */ | |
209 | char system_id [ISODCL (85, 116)]; /* achars */ | |
210 | char system_use [ISODCL (117, 180)]; | |
211 | char version [ISODCL (181, 181)]; /* 711 */ | |
212 | char len_esc [ISODCL (182, 182)]; /* 711 */ | |
213 | char reserved [ISODCL (183, 246)]; | |
214 | u_char len_au [ISODCL (247, 250)]; /* 723 */ | |
215 | }; | |
216 | ||
217 | #ifdef _KERNEL | |
218 | ||
219 | /* CD-ROM Format type */ | |
220 | enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP, | |
221 | ISO_FTYPE_JOLIET, ISO_FTYPE_ECMA, ISO_FTYPE_HIGH_SIERRA }; | |
222 | ||
223 | #ifndef ISOFSMNT_ROOT | |
224 | #define ISOFSMNT_ROOT 0 | |
225 | #endif | |
226 | ||
227 | struct iso_mnt { | |
228 | int im_flags; | |
229 | ||
230 | struct mount *im_mountp; | |
b13267a5 | 231 | cdev_t im_dev; |
984263bc MD |
232 | struct vnode *im_devvp; |
233 | ||
234 | int logical_block_size; | |
235 | int im_bshift; | |
236 | int im_bmask; | |
237 | ||
238 | int volume_space_size; | |
239 | struct netexport im_export; | |
240 | ||
241 | char root[ISODCL (157, 190)]; | |
242 | int root_extent; | |
243 | int root_size; | |
244 | enum ISO_FTYPE iso_ftype; | |
245 | ||
246 | int rr_skip; | |
247 | int rr_skip0; | |
248 | ||
249 | int joliet_level; | |
60c47c5e AP |
250 | |
251 | void *im_d2l; | |
252 | void *im_l2d; | |
984263bc MD |
253 | }; |
254 | ||
255 | #define VFSTOISOFS(mp) ((struct iso_mnt *)((mp)->mnt_data)) | |
256 | ||
257 | #define blkoff(imp, loc) ((loc) & (imp)->im_bmask) | |
258 | #define lblktosize(imp, blk) ((blk) << (imp)->im_bshift) | |
54078292 | 259 | #define lblktooff(imp, blk) ((off_t)(blk) << (imp)->im_bshift) |
984263bc MD |
260 | #define lblkno(imp, loc) ((loc) >> (imp)->im_bshift) |
261 | #define blksize(imp, ip, lbn) ((imp)->logical_block_size) | |
262 | ||
a6ee311a RG |
263 | int cd9660_vget_internal (struct mount *, ino_t, struct vnode **, int, |
264 | struct iso_directory_record *); | |
265 | int cd9660_init (struct vfsconf *); | |
266 | int cd9660_uninit (struct vfsconf *); | |
267 | #define cd9660_sysctl ((int (*) (int *, u_int, void *, size_t *, void *, \ | |
268 | size_t, struct proc *))eopnotsupp) | |
984263bc | 269 | |
60c47c5e AP |
270 | int isochar(u_char *, u_char *, int, u_short *, int *, int, void *); |
271 | int isofncmp(u_char *, int, u_char *, int, int, int, void *, void *); | |
272 | void isofntrans(u_char *, int, u_char *, u_short *, int, int, int, int, void *); | |
a6ee311a | 273 | ino_t isodirino (struct iso_directory_record *, struct iso_mnt *); |
60c47c5e | 274 | u_short sgetrune(const char *, size_t, char const **, int, void *); |
984263bc MD |
275 | |
276 | #endif /* _KERNEL */ | |
277 | ||
278 | /* | |
279 | * The isonum_xxx functions are inlined anyway, and could come handy even | |
280 | * outside the kernel. Thus we don't hide them here. | |
281 | */ | |
282 | ||
60c47c5e AP |
283 | static __inline uint8_t |
284 | isonum_711(unsigned char *p) | |
285 | { | |
286 | return p[0]; | |
287 | } | |
87cceb63 | 288 | |
60c47c5e AP |
289 | static __inline uint8_t |
290 | isonum_712(unsigned char *p) | |
984263bc | 291 | { |
60c47c5e | 292 | return p[0]; |
984263bc MD |
293 | } |
294 | ||
dd8d2a03 | 295 | #ifndef UNALIGNED_ACCESS |
f5ff88dc | 296 | |
60c47c5e AP |
297 | static __inline uint16_t |
298 | isonum_723(unsigned char *p) | |
984263bc | 299 | { |
60c47c5e | 300 | return (p[0] | p[1] << 8); |
984263bc MD |
301 | } |
302 | ||
60c47c5e AP |
303 | static __inline uint32_t |
304 | isonum_733(unsigned char *p) | |
984263bc | 305 | { |
60c47c5e | 306 | return (p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24); |
984263bc MD |
307 | } |
308 | ||
309 | #else /* UNALIGNED_ACCESS */ | |
310 | ||
311 | #if BYTE_ORDER == LITTLE_ENDIAN | |
312 | ||
313 | static __inline int | |
b1ce5639 | 314 | isonum_723(u_char *p) |
984263bc MD |
315 | { |
316 | return *(u_int16t *)p; | |
317 | } | |
318 | ||
319 | static __inline int | |
b1ce5639 | 320 | isonum_733(u_char *p) |
984263bc MD |
321 | { |
322 | return *(u_int32t *)p; | |
323 | } | |
324 | ||
325 | #endif | |
326 | ||
327 | #if BYTE_ORDER == BIG_ENDIAN | |
328 | ||
329 | static __inline int | |
b1ce5639 | 330 | isonum_723(u_char *p) |
984263bc MD |
331 | { |
332 | return *(u_int16t *)(p + 2); | |
333 | } | |
334 | ||
335 | static __inline int | |
b1ce5639 | 336 | isonum_733(u_char *p) |
984263bc MD |
337 | { |
338 | return *(u_int32t *)(p + 4); | |
339 | } | |
340 | ||
341 | #endif | |
342 | ||
343 | #endif /* UNALIGNED_ACCESS */ | |
344 | ||
345 | /* | |
346 | * Associated files have a leading '='. | |
347 | */ | |
348 | #define ASSOCCHAR '=' |