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. | |
2c64e990 | 18 | * 3. Neither the name of the University nor the names of its contributors |
984263bc MD |
19 | * may be used to endorse or promote products derived from this software |
20 | * without specific prior written permission. | |
21 | * | |
22 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
23 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
24 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
25 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
27 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
28 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
29 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
30 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
31 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
32 | * SUCH DAMAGE. | |
33 | * | |
34 | * @(#)iso.h 8.6 (Berkeley) 5/10/95 | |
0d1c136d | 35 | * $FreeBSD: head/sys/fs/cd9660/iso.h 151447 2005-10-18 13:35:08Z des $ |
984263bc MD |
36 | */ |
37 | ||
38 | #define ISODCL(from, to) (to - from + 1) | |
39 | ||
40 | struct iso_volume_descriptor { | |
41 | char type[ISODCL(1,1)]; /* 711 */ | |
42 | char id[ISODCL(2,6)]; | |
43 | char version[ISODCL(7,7)]; | |
44 | char unused[ISODCL(8,8)]; | |
45 | char type_sierra[ISODCL(9,9)]; /* 711 */ | |
46 | char id_sierra[ISODCL(10,14)]; | |
47 | char version_sierra[ISODCL(15,15)]; | |
48 | char data[ISODCL(16,2048)]; | |
49 | }; | |
50 | ||
51 | /* volume descriptor types */ | |
52 | #define ISO_VD_PRIMARY 1 | |
53 | #define ISO_VD_SUPPLEMENTARY 2 | |
54 | #define ISO_VD_END 255 | |
55 | ||
56 | #define ISO_STANDARD_ID "CD001" | |
57 | #define ISO_ECMA_ID "CDW01" | |
58 | ||
59 | #define ISO_SIERRA_ID "CDROM" | |
60 | ||
61 | struct iso_primary_descriptor { | |
62 | char type [ISODCL ( 1, 1)]; /* 711 */ | |
63 | char id [ISODCL ( 2, 6)]; | |
64 | char version [ISODCL ( 7, 7)]; /* 711 */ | |
65 | char unused1 [ISODCL ( 8, 8)]; | |
66 | char system_id [ISODCL ( 9, 40)]; /* achars */ | |
67 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ | |
68 | char unused2 [ISODCL ( 73, 80)]; | |
69 | char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ | |
70 | char unused3 [ISODCL ( 89, 120)]; | |
71 | char volume_set_size [ISODCL (121, 124)]; /* 723 */ | |
72 | char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ | |
73 | char logical_block_size [ISODCL (129, 132)]; /* 723 */ | |
74 | char path_table_size [ISODCL (133, 140)]; /* 733 */ | |
75 | char type_l_path_table [ISODCL (141, 144)]; /* 731 */ | |
76 | char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ | |
77 | char type_m_path_table [ISODCL (149, 152)]; /* 732 */ | |
78 | char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ | |
79 | char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ | |
80 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ | |
81 | char publisher_id [ISODCL (319, 446)]; /* achars */ | |
82 | char preparer_id [ISODCL (447, 574)]; /* achars */ | |
83 | char application_id [ISODCL (575, 702)]; /* achars */ | |
84 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ | |
85 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ | |
86 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ | |
87 | char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ | |
88 | char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ | |
89 | char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ | |
90 | char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ | |
91 | char file_structure_version [ISODCL (882, 882)]; /* 711 */ | |
92 | char unused4 [ISODCL (883, 883)]; | |
93 | char application_data [ISODCL (884, 1395)]; | |
94 | char unused5 [ISODCL (1396, 2048)]; | |
95 | }; | |
96 | #define ISO_DEFAULT_BLOCK_SIZE 2048 | |
97 | ||
98 | /* | |
99 | * Used by Microsoft Joliet extension to ISO9660. Almost the same | |
100 | * as PVD, but byte position 8 is a flag, and 89-120 is for escape. | |
101 | */ | |
102 | ||
103 | struct iso_supplementary_descriptor { | |
e961ef71 | 104 | char type [ISODCL ( 1, 1)]; /* 711 */ |
105 | char id [ISODCL ( 2, 6)]; | |
106 | char version [ISODCL ( 7, 7)]; /* 711 */ | |
107 | char flags [ISODCL ( 8, 8)]; /* 711? */ | |
108 | char system_id [ISODCL ( 9, 40)]; /* achars */ | |
109 | char volume_id [ISODCL ( 41, 72)]; /* dchars */ | |
110 | char unused2 [ISODCL ( 73, 80)]; | |
111 | char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ | |
112 | char escape [ISODCL ( 89, 120)]; | |
113 | char volume_set_size [ISODCL (121, 124)]; /* 723 */ | |
114 | char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ | |
115 | char logical_block_size [ISODCL (129, 132)]; /* 723 */ | |
116 | char path_table_size [ISODCL (133, 140)]; /* 733 */ | |
117 | char type_l_path_table [ISODCL (141, 144)]; /* 731 */ | |
118 | char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ | |
119 | char type_m_path_table [ISODCL (149, 152)]; /* 732 */ | |
120 | char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ | |
121 | char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ | |
122 | char volume_set_id [ISODCL (191, 318)]; /* dchars */ | |
123 | char publisher_id [ISODCL (319, 446)]; /* achars */ | |
124 | char preparer_id [ISODCL (447, 574)]; /* achars */ | |
125 | char application_id [ISODCL (575, 702)]; /* achars */ | |
126 | char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ | |
127 | char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ | |
128 | char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ | |
129 | char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ | |
130 | char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ | |
131 | char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ | |
132 | char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ | |
133 | char file_structure_version [ISODCL (882, 882)]; /* 711 */ | |
134 | char unused4 [ISODCL (883, 883)]; | |
135 | char application_data [ISODCL (884, 1395)]; | |
136 | char unused5 [ISODCL (1396, 2048)]; | |
984263bc MD |
137 | }; |
138 | ||
139 | struct iso_sierra_primary_descriptor { | |
140 | char unknown1 [ISODCL ( 1, 8)]; /* 733 */ | |
141 | char type [ISODCL ( 9, 9)]; /* 711 */ | |
142 | char id [ISODCL ( 10, 14)]; | |
143 | char version [ISODCL ( 15, 15)]; /* 711 */ | |
144 | char unused1 [ISODCL ( 16, 16)]; | |
145 | char system_id [ISODCL ( 17, 48)]; /* achars */ | |
146 | char volume_id [ISODCL ( 49, 80)]; /* dchars */ | |
147 | char unused2 [ISODCL ( 81, 88)]; | |
148 | char volume_space_size [ISODCL ( 89, 96)]; /* 733 */ | |
149 | char unused3 [ISODCL ( 97, 128)]; | |
150 | char volume_set_size [ISODCL (129, 132)]; /* 723 */ | |
151 | char volume_sequence_number [ISODCL (133, 136)]; /* 723 */ | |
152 | char logical_block_size [ISODCL (137, 140)]; /* 723 */ | |
153 | char path_table_size [ISODCL (141, 148)]; /* 733 */ | |
154 | char type_l_path_table [ISODCL (149, 152)]; /* 731 */ | |
155 | char opt_type_l_path_table [ISODCL (153, 156)]; /* 731 */ | |
156 | char unknown2 [ISODCL (157, 160)]; /* 731 */ | |
157 | char unknown3 [ISODCL (161, 164)]; /* 731 */ | |
158 | char type_m_path_table [ISODCL (165, 168)]; /* 732 */ | |
159 | char opt_type_m_path_table [ISODCL (169, 172)]; /* 732 */ | |
160 | char unknown4 [ISODCL (173, 176)]; /* 732 */ | |
161 | char unknown5 [ISODCL (177, 180)]; /* 732 */ | |
162 | char root_directory_record [ISODCL (181, 214)]; /* 9.1 */ | |
163 | char volume_set_id [ISODCL (215, 342)]; /* dchars */ | |
164 | char publisher_id [ISODCL (343, 470)]; /* achars */ | |
165 | char preparer_id [ISODCL (471, 598)]; /* achars */ | |
166 | char application_id [ISODCL (599, 726)]; /* achars */ | |
167 | char copyright_id [ISODCL (727, 790)]; /* achars */ | |
168 | char creation_date [ISODCL (791, 806)]; /* ? */ | |
169 | char modification_date [ISODCL (807, 822)]; /* ? */ | |
170 | char expiration_date [ISODCL (823, 838)]; /* ? */ | |
171 | char effective_date [ISODCL (839, 854)]; /* ? */ | |
172 | char file_structure_version [ISODCL (855, 855)]; /* 711 */ | |
173 | char unused4 [ISODCL (856, 2048)]; | |
174 | }; | |
175 | ||
176 | struct iso_directory_record { | |
177 | char length [ISODCL (1, 1)]; /* 711 */ | |
178 | char ext_attr_length [ISODCL (2, 2)]; /* 711 */ | |
179 | u_char extent [ISODCL (3, 10)]; /* 733 */ | |
180 | u_char size [ISODCL (11, 18)]; /* 733 */ | |
181 | char date [ISODCL (19, 25)]; /* 7 by 711 */ | |
182 | char flags [ISODCL (26, 26)]; | |
183 | char file_unit_size [ISODCL (27, 27)]; /* 711 */ | |
184 | char interleave [ISODCL (28, 28)]; /* 711 */ | |
185 | char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ | |
186 | char name_len [ISODCL (33, 33)]; /* 711 */ | |
187 | char name [1]; /* XXX */ | |
188 | }; | |
189 | /* can't take sizeof(iso_directory_record), because of possible alignment | |
190 | of the last entry (34 instead of 33) */ | |
191 | #define ISO_DIRECTORY_RECORD_SIZE 33 | |
192 | ||
193 | struct iso_extended_attributes { | |
194 | u_char owner [ISODCL (1, 4)]; /* 723 */ | |
195 | u_char group [ISODCL (5, 8)]; /* 723 */ | |
196 | u_char perm [ISODCL (9, 10)]; /* 9.5.3 */ | |
197 | char ctime [ISODCL (11, 27)]; /* 8.4.26.1 */ | |
198 | char mtime [ISODCL (28, 44)]; /* 8.4.26.1 */ | |
199 | char xtime [ISODCL (45, 61)]; /* 8.4.26.1 */ | |
200 | char ftime [ISODCL (62, 78)]; /* 8.4.26.1 */ | |
201 | char recfmt [ISODCL (79, 79)]; /* 711 */ | |
202 | char recattr [ISODCL (80, 80)]; /* 711 */ | |
203 | u_char reclen [ISODCL (81, 84)]; /* 723 */ | |
204 | char system_id [ISODCL (85, 116)]; /* achars */ | |
205 | char system_use [ISODCL (117, 180)]; | |
206 | char version [ISODCL (181, 181)]; /* 711 */ | |
207 | char len_esc [ISODCL (182, 182)]; /* 711 */ | |
208 | char reserved [ISODCL (183, 246)]; | |
209 | u_char len_au [ISODCL (247, 250)]; /* 723 */ | |
210 | }; | |
211 | ||
212 | #ifdef _KERNEL | |
213 | ||
214 | /* CD-ROM Format type */ | |
215 | enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP, | |
216 | ISO_FTYPE_JOLIET, ISO_FTYPE_ECMA, ISO_FTYPE_HIGH_SIERRA }; | |
217 | ||
218 | #ifndef ISOFSMNT_ROOT | |
219 | #define ISOFSMNT_ROOT 0 | |
220 | #endif | |
221 | ||
222 | struct iso_mnt { | |
223 | int im_flags; | |
224 | ||
225 | struct mount *im_mountp; | |
b13267a5 | 226 | cdev_t im_dev; |
984263bc MD |
227 | struct vnode *im_devvp; |
228 | ||
7764eb66 RB |
229 | uid_t im_uid; |
230 | gid_t im_gid; | |
231 | mode_t im_fmask; | |
232 | mode_t im_dmask; | |
233 | ||
984263bc MD |
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 | 250 | |
e961ef71 | 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 | ||
e961ef71 | 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 *); | |
e961ef71 | 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 | ||
0d1c136d | 283 | /* |
284 | * 7xy | |
285 | * x -> 1 = 8 bits, 2 = 16 bits, 3 = 32 bits | |
286 | * y -> 1 = little-endian, 2 = big-endian, 3 = both (le then be) | |
287 | */ | |
288 | ||
60c47c5e | 289 | static __inline uint8_t |
0d1c136d | 290 | isonum_711(const unsigned char *p) |
60c47c5e | 291 | { |
e961ef71 | 292 | return (p[0]); |
60c47c5e | 293 | } |
87cceb63 | 294 | |
0d1c136d | 295 | static __inline int8_t |
296 | isonum_712(const unsigned char *p) | |
297 | { | |
298 | return ((signed char)p[0]); | |
299 | } | |
300 | ||
60c47c5e | 301 | static __inline uint8_t |
0d1c136d | 302 | isonum_713(const unsigned char *p) |
984263bc | 303 | { |
e961ef71 | 304 | return (p[0]); |
984263bc MD |
305 | } |
306 | ||
60c47c5e | 307 | static __inline uint16_t |
0d1c136d | 308 | isonum_721(const unsigned char *p) |
309 | { | |
310 | return (p[0] | p[1] << 8); | |
311 | } | |
312 | ||
313 | static __inline uint16_t | |
314 | isonum_722(const unsigned char *p) | |
315 | { | |
316 | return (p[1] | p[0] << 8); | |
317 | } | |
318 | ||
319 | static __inline uint16_t | |
320 | isonum_723(const unsigned char *p) | |
984263bc | 321 | { |
e961ef71 | 322 | return (p[0] | p[1] << 8); |
984263bc MD |
323 | } |
324 | ||
60c47c5e | 325 | static __inline uint32_t |
0d1c136d | 326 | isonum_731(const unsigned char *p) |
327 | { | |
328 | return (p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24); | |
329 | } | |
330 | ||
331 | static __inline uint32_t | |
332 | isonum_732(const unsigned char *p) | |
333 | { | |
334 | return (p[3] | p[2] << 8 | p[1] << 16 | p[0] << 24); | |
335 | } | |
336 | ||
337 | static __inline uint32_t | |
338 | isonum_733(const unsigned char *p) | |
984263bc | 339 | { |
e961ef71 | 340 | return (p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24); |
984263bc MD |
341 | } |
342 | ||
984263bc MD |
343 | /* |
344 | * Associated files have a leading '='. | |
345 | */ | |
346 | #define ASSOCCHAR '=' |