iso.h revision 120492
1193326Sed/*- 2193326Sed * Copyright (c) 1994 3193326Sed * The Regents of the University of California. All rights reserved. 4193326Sed * 5193326Sed * This code is derived from software contributed to Berkeley 6193326Sed * by Pace Willisson (pace@blitz.com). The Rock Ridge Extension 7193326Sed * Support code is derived from software contributed to Berkeley 8193326Sed * by Atsushi Murai (amurai@spec.co.jp). 9193326Sed * 10193326Sed * Redistribution and use in source and binary forms, with or without 11193326Sed * modification, are permitted provided that the following conditions 12193326Sed * are met: 13193326Sed * 1. Redistributions of source code must retain the above copyright 14193326Sed * notice, this list of conditions and the following disclaimer. 15193326Sed * 2. Redistributions in binary form must reproduce the above copyright 16193326Sed * notice, this list of conditions and the following disclaimer in the 17193326Sed * documentation and/or other materials provided with the distribution. 18193326Sed * 3. All advertising materials mentioning features or use of this software 19193326Sed * must display the following acknowledgement: 20193326Sed * This product includes software developed by the University of 21193326Sed * California, Berkeley and its contributors. 22198092Srdivacky * 4. Neither the name of the University nor the names of its contributors 23193326Sed * may be used to endorse or promote products derived from this software 24198092Srdivacky * without specific prior written permission. 25193326Sed * 26198954Srdivacky * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27193326Sed * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28193326Sed * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29193326Sed * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30193326Sed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31199482Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32193326Sed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33193326Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34193326Sed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35194613Sed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36193380Sed * SUCH DAMAGE. 37193326Sed * 38193326Sed * @(#)iso.h 8.6 (Berkeley) 5/10/95 39193326Sed * $FreeBSD: head/sys/fs/cd9660/iso.h 120492 2003-09-26 20:26:25Z fjoe $ 40193326Sed */ 41193326Sed 42193326Sed#define ISODCL(from, to) (to - from + 1) 43199482Srdivacky 44198092Srdivackystruct iso_volume_descriptor { 45193326Sed char type[ISODCL(1,1)]; /* 711 */ 46193326Sed char id[ISODCL(2,6)]; 47193326Sed char version[ISODCL(7,7)]; 48194613Sed char unused[ISODCL(8,8)]; 49193326Sed char type_sierra[ISODCL(9,9)]; /* 711 */ 50193326Sed char id_sierra[ISODCL(10,14)]; 51193326Sed char version_sierra[ISODCL(15,15)]; 52198954Srdivacky char data[ISODCL(16,2048)]; 53193326Sed}; 54193326Sed 55193326Sed/* volume descriptor types */ 56193326Sed#define ISO_VD_PRIMARY 1 57198092Srdivacky#define ISO_VD_SUPPLEMENTARY 2 58193326Sed#define ISO_VD_END 255 59193326Sed 60193326Sed#define ISO_STANDARD_ID "CD001" 61193326Sed#define ISO_ECMA_ID "CDW01" 62199482Srdivacky 63193326Sed#define ISO_SIERRA_ID "CDROM" 64198092Srdivacky 65198092Srdivackystruct iso_primary_descriptor { 66193326Sed char type [ISODCL ( 1, 1)]; /* 711 */ 67198092Srdivacky char id [ISODCL ( 2, 6)]; 68193326Sed char version [ISODCL ( 7, 7)]; /* 711 */ 69193326Sed char unused1 [ISODCL ( 8, 8)]; 70193326Sed char system_id [ISODCL ( 9, 40)]; /* achars */ 71199482Srdivacky char volume_id [ISODCL ( 41, 72)]; /* dchars */ 72193326Sed char unused2 [ISODCL ( 73, 80)]; 73193326Sed char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ 74193326Sed char unused3 [ISODCL ( 89, 120)]; 75199482Srdivacky char volume_set_size [ISODCL (121, 124)]; /* 723 */ 76199482Srdivacky char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ 77193326Sed char logical_block_size [ISODCL (129, 132)]; /* 723 */ 78198092Srdivacky char path_table_size [ISODCL (133, 140)]; /* 733 */ 79198092Srdivacky char type_l_path_table [ISODCL (141, 144)]; /* 731 */ 80198092Srdivacky char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ 81199990Srdivacky char type_m_path_table [ISODCL (149, 152)]; /* 732 */ 82193326Sed char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ 83193326Sed char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ 84193326Sed char volume_set_id [ISODCL (191, 318)]; /* dchars */ 85193326Sed char publisher_id [ISODCL (319, 446)]; /* achars */ 86193326Sed char preparer_id [ISODCL (447, 574)]; /* achars */ 87199990Srdivacky char application_id [ISODCL (575, 702)]; /* achars */ 88193326Sed char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ 89193326Sed char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ 90193326Sed char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ 91199990Srdivacky char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ 92199990Srdivacky char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ 93199990Srdivacky char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ 94193326Sed char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ 95193326Sed char file_structure_version [ISODCL (882, 882)]; /* 711 */ 96193326Sed char unused4 [ISODCL (883, 883)]; 97193326Sed char application_data [ISODCL (884, 1395)]; 98193326Sed char unused5 [ISODCL (1396, 2048)]; 99193326Sed}; 100193326Sed#define ISO_DEFAULT_BLOCK_SIZE 2048 101193326Sed 102193326Sed/* 103193326Sed * Used by Microsoft Joliet extension to ISO9660. Almost the same 104193326Sed * as PVD, but byte position 8 is a flag, and 89-120 is for escape. 105193725Sed */ 106193725Sed 107193725Sedstruct iso_supplementary_descriptor { 108193725Sed char type [ISODCL ( 1, 1)]; /* 711 */ 109193326Sed char id [ISODCL ( 2, 6)]; 110193326Sed char version [ISODCL ( 7, 7)]; /* 711 */ 111194613Sed char flags [ISODCL ( 8, 8)]; /* 711? */ 112198092Srdivacky char system_id [ISODCL ( 9, 40)]; /* achars */ 113194613Sed char volume_id [ISODCL ( 41, 72)]; /* dchars */ 114198092Srdivacky char unused2 [ISODCL ( 73, 80)]; 115193326Sed char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ 116193326Sed char escape [ISODCL ( 89, 120)]; 117193326Sed char volume_set_size [ISODCL (121, 124)]; /* 723 */ 118193326Sed char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ 119198092Srdivacky char logical_block_size [ISODCL (129, 132)]; /* 723 */ 120193326Sed char path_table_size [ISODCL (133, 140)]; /* 733 */ 121193326Sed char type_l_path_table [ISODCL (141, 144)]; /* 731 */ 122193326Sed char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ 123199482Srdivacky char type_m_path_table [ISODCL (149, 152)]; /* 732 */ 124199482Srdivacky char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ 125199482Srdivacky char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ 126193326Sed char volume_set_id [ISODCL (191, 318)]; /* dchars */ 127199482Srdivacky char publisher_id [ISODCL (319, 446)]; /* achars */ 128199482Srdivacky char preparer_id [ISODCL (447, 574)]; /* achars */ 129199482Srdivacky char application_id [ISODCL (575, 702)]; /* achars */ 130199482Srdivacky char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ 131199482Srdivacky char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ 132193725Sed char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ 133193725Sed char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ 134193725Sed char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ 135193725Sed char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ 136193326Sed char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ 137193326Sed char file_structure_version [ISODCL (882, 882)]; /* 711 */ 138193326Sed char unused4 [ISODCL (883, 883)]; 139193326Sed char application_data [ISODCL (884, 1395)]; 140193326Sed char unused5 [ISODCL (1396, 2048)]; 141193326Sed}; 142193326Sed 143193326Sedstruct iso_sierra_primary_descriptor { 144194613Sed char unknown1 [ISODCL ( 1, 8)]; /* 733 */ 145199482Srdivacky char type [ISODCL ( 9, 9)]; /* 711 */ 146199482Srdivacky char id [ISODCL ( 10, 14)]; 147194613Sed char version [ISODCL ( 15, 15)]; /* 711 */ 148194613Sed char unused1 [ISODCL ( 16, 16)]; 149193326Sed char system_id [ISODCL ( 17, 48)]; /* achars */ 150193326Sed char volume_id [ISODCL ( 49, 80)]; /* dchars */ 151193326Sed char unused2 [ISODCL ( 81, 88)]; 152193326Sed char volume_space_size [ISODCL ( 89, 96)]; /* 733 */ 153193326Sed char unused3 [ISODCL ( 97, 128)]; 154193326Sed char volume_set_size [ISODCL (129, 132)]; /* 723 */ 155193326Sed char volume_sequence_number [ISODCL (133, 136)]; /* 723 */ 156198092Srdivacky char logical_block_size [ISODCL (137, 140)]; /* 723 */ 157193326Sed char path_table_size [ISODCL (141, 148)]; /* 733 */ 158193326Sed char type_l_path_table [ISODCL (149, 152)]; /* 731 */ 159193326Sed char opt_type_l_path_table [ISODCL (153, 156)]; /* 731 */ 160193326Sed char unknown2 [ISODCL (157, 160)]; /* 731 */ 161193326Sed char unknown3 [ISODCL (161, 164)]; /* 731 */ 162193326Sed char type_m_path_table [ISODCL (165, 168)]; /* 732 */ 163193326Sed char opt_type_m_path_table [ISODCL (169, 172)]; /* 732 */ 164194613Sed char unknown4 [ISODCL (173, 176)]; /* 732 */ 165198092Srdivacky char unknown5 [ISODCL (177, 180)]; /* 732 */ 166198092Srdivacky char root_directory_record [ISODCL (181, 214)]; /* 9.1 */ 167193326Sed char volume_set_id [ISODCL (215, 342)]; /* dchars */ 168193326Sed char publisher_id [ISODCL (343, 470)]; /* achars */ 169193326Sed char preparer_id [ISODCL (471, 598)]; /* achars */ 170193326Sed char application_id [ISODCL (599, 726)]; /* achars */ 171193326Sed char copyright_id [ISODCL (727, 790)]; /* achars */ 172193326Sed char creation_date [ISODCL (791, 806)]; /* ? */ 173193326Sed char modification_date [ISODCL (807, 822)]; /* ? */ 174193326Sed char expiration_date [ISODCL (823, 838)]; /* ? */ 175193326Sed char effective_date [ISODCL (839, 854)]; /* ? */ 176199482Srdivacky char file_structure_version [ISODCL (855, 855)]; /* 711 */ 177199482Srdivacky char unused4 [ISODCL (856, 2048)]; 178199482Srdivacky}; 179199482Srdivacky 180struct iso_directory_record { 181 char length [ISODCL (1, 1)]; /* 711 */ 182 char ext_attr_length [ISODCL (2, 2)]; /* 711 */ 183 u_char extent [ISODCL (3, 10)]; /* 733 */ 184 u_char size [ISODCL (11, 18)]; /* 733 */ 185 char date [ISODCL (19, 25)]; /* 7 by 711 */ 186 char flags [ISODCL (26, 26)]; 187 char file_unit_size [ISODCL (27, 27)]; /* 711 */ 188 char interleave [ISODCL (28, 28)]; /* 711 */ 189 char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ 190 char name_len [ISODCL (33, 33)]; /* 711 */ 191 char name [1]; /* XXX */ 192}; 193/* can't take sizeof(iso_directory_record), because of possible alignment 194 of the last entry (34 instead of 33) */ 195#define ISO_DIRECTORY_RECORD_SIZE 33 196 197struct iso_extended_attributes { 198 u_char owner [ISODCL (1, 4)]; /* 723 */ 199 u_char group [ISODCL (5, 8)]; /* 723 */ 200 u_char perm [ISODCL (9, 10)]; /* 9.5.3 */ 201 char ctime [ISODCL (11, 27)]; /* 8.4.26.1 */ 202 char mtime [ISODCL (28, 44)]; /* 8.4.26.1 */ 203 char xtime [ISODCL (45, 61)]; /* 8.4.26.1 */ 204 char ftime [ISODCL (62, 78)]; /* 8.4.26.1 */ 205 char recfmt [ISODCL (79, 79)]; /* 711 */ 206 char recattr [ISODCL (80, 80)]; /* 711 */ 207 u_char reclen [ISODCL (81, 84)]; /* 723 */ 208 char system_id [ISODCL (85, 116)]; /* achars */ 209 char system_use [ISODCL (117, 180)]; 210 char version [ISODCL (181, 181)]; /* 711 */ 211 char len_esc [ISODCL (182, 182)]; /* 711 */ 212 char reserved [ISODCL (183, 246)]; 213 u_char len_au [ISODCL (247, 250)]; /* 723 */ 214}; 215 216#ifdef _KERNEL 217 218/* CD-ROM Format type */ 219enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP, 220 ISO_FTYPE_JOLIET, ISO_FTYPE_ECMA, ISO_FTYPE_HIGH_SIERRA }; 221 222#ifndef ISOFSMNT_ROOT 223#define ISOFSMNT_ROOT 0 224#endif 225 226struct iso_mnt { 227 int im_flags; 228 229 struct mount *im_mountp; 230 dev_t im_dev; 231 struct vnode *im_devvp; 232 233 int logical_block_size; 234 int im_bshift; 235 int im_bmask; 236 237 int volume_space_size; 238 239 char root[ISODCL (157, 190)]; 240 int root_extent; 241 int root_size; 242 enum ISO_FTYPE iso_ftype; 243 244 int rr_skip; 245 int rr_skip0; 246 247 int joliet_level; 248 249 void *im_d2l; 250 void *im_l2d; 251}; 252 253#define VFSTOISOFS(mp) ((struct iso_mnt *)((mp)->mnt_data)) 254 255#define blkoff(imp, loc) ((loc) & (imp)->im_bmask) 256#define lblktosize(imp, blk) ((blk) << (imp)->im_bshift) 257#define lblkno(imp, loc) ((loc) >> (imp)->im_bshift) 258#define blksize(imp, ip, lbn) ((imp)->logical_block_size) 259 260int cd9660_vget_internal(struct mount *, ino_t, int, struct vnode **, int, 261 struct iso_directory_record *); 262int cd9660_init(struct vfsconf *); 263int cd9660_uninit(struct vfsconf *); 264#define cd9660_sysctl ((int (*)(int *, u_int, void *, size_t *, void *, \ 265 size_t, struct proc *))eopnotsupp) 266 267extern vop_t **cd9660_vnodeop_p; 268extern vop_t **cd9660_specop_p; 269extern vop_t **cd9660_fifoop_p; 270 271int isochar(u_char *, u_char *, int, u_short *, int *, int, void *); 272int isofncmp(u_char *, int, u_char *, int, int, int, void *, void *); 273void isofntrans(u_char *, int, u_char *, u_short *, int, int, int, int, void *); 274ino_t isodirino(struct iso_directory_record *, struct iso_mnt *); 275u_short sgetrune(const char *, size_t, char const **, int, void *); 276 277#endif /* _KERNEL */ 278 279/* 280 * The isonum_xxx functions are inlined anyway, and could come handy even 281 * outside the kernel. Thus we don't hide them here. 282 */ 283 284static __inline int isonum_711(u_char *); 285static __inline int 286isonum_711(p) 287 u_char *p; 288{ 289 return *p; 290} 291 292static __inline int isonum_712(char *); 293static __inline int 294isonum_712(p) 295 char *p; 296{ 297 return *p; 298} 299 300#ifndef UNALIGNED_ACCESS 301 302static __inline int isonum_723(u_char *); 303static __inline int 304isonum_723(p) 305 u_char *p; 306{ 307 return *p|(p[1] << 8); 308} 309 310static __inline int isonum_733(u_char *); 311static __inline int 312isonum_733(p) 313 u_char *p; 314{ 315 return *p|(p[1] << 8)|(p[2] << 16)|(p[3] << 24); 316} 317 318#else /* UNALIGNED_ACCESS */ 319 320#if BYTE_ORDER == LITTLE_ENDIAN 321 322static __inline int 323isonum_723(p) 324 u_char *p 325{ 326 return *(u_int16t *)p; 327} 328 329static __inline int 330isonum_733(p) 331 u_char *p; 332{ 333 return *(u_int32t *)p; 334} 335 336#endif 337 338#if BYTE_ORDER == BIG_ENDIAN 339 340static __inline int 341isonum_723(p) 342 u_char *p 343{ 344 return *(u_int16t *)(p + 2); 345} 346 347static __inline int 348isonum_733(p) 349 u_char *p; 350{ 351 return *(u_int32t *)(p + 4); 352} 353 354#endif 355 356#endif /* UNALIGNED_ACCESS */ 357 358/* 359 * Associated files have a leading '='. 360 */ 361#define ASSOCCHAR '=' 362