165789Smckusick /*- 265789Smckusick * Copyright (c) 1994 365789Smckusick * The Regents of the University of California. All rights reserved. 465789Smckusick * 565789Smckusick * This code is derived from software contributed to Berkeley 665789Smckusick * by Pace Willisson (pace@blitz.com). The Rock Ridge Extension 765789Smckusick * Support code is derived from software contributed to Berkeley 865789Smckusick * by Atsushi Murai (amurai@spec.co.jp). 965789Smckusick * 1065789Smckusick * %sccs.include.redist.c% 1165789Smckusick * 12*65855Smckusick * @(#)iso.h 8.2 (Berkeley) 01/23/94 1365789Smckusick */ 1465789Smckusick 1565789Smckusick #define ISODCL(from, to) (to - from + 1) 1665789Smckusick 1765789Smckusick struct iso_volume_descriptor { 1865789Smckusick char type[ISODCL(1,1)]; /* 711 */ 1965789Smckusick char id[ISODCL(2,6)]; 2065789Smckusick char version[ISODCL(7,7)]; 2165789Smckusick char data[ISODCL(8,2048)]; 2265789Smckusick }; 2365789Smckusick 2465789Smckusick /* volume descriptor types */ 2565789Smckusick #define ISO_VD_PRIMARY 1 2665789Smckusick #define ISO_VD_END 255 2765789Smckusick 2865789Smckusick #define ISO_STANDARD_ID "CD001" 2965789Smckusick #define ISO_ECMA_ID "CDW01" 3065789Smckusick 3165789Smckusick struct iso_primary_descriptor { 3265789Smckusick char type [ISODCL ( 1, 1)]; /* 711 */ 3365789Smckusick char id [ISODCL ( 2, 6)]; 3465789Smckusick char version [ISODCL ( 7, 7)]; /* 711 */ 3565789Smckusick char unused1 [ISODCL ( 8, 8)]; 3665789Smckusick char system_id [ISODCL ( 9, 40)]; /* achars */ 3765789Smckusick char volume_id [ISODCL ( 41, 72)]; /* dchars */ 3865789Smckusick char unused2 [ISODCL ( 73, 80)]; 3965789Smckusick char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ 4065789Smckusick char unused3 [ISODCL ( 89, 120)]; 4165789Smckusick char volume_set_size [ISODCL (121, 124)]; /* 723 */ 4265789Smckusick char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ 4365789Smckusick char logical_block_size [ISODCL (129, 132)]; /* 723 */ 4465789Smckusick char path_table_size [ISODCL (133, 140)]; /* 733 */ 4565789Smckusick char type_l_path_table [ISODCL (141, 144)]; /* 731 */ 4665789Smckusick char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ 4765789Smckusick char type_m_path_table [ISODCL (149, 152)]; /* 732 */ 4865789Smckusick char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ 4965789Smckusick char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ 5065789Smckusick char volume_set_id [ISODCL (191, 318)]; /* dchars */ 5165789Smckusick char publisher_id [ISODCL (319, 446)]; /* achars */ 5265789Smckusick char preparer_id [ISODCL (447, 574)]; /* achars */ 5365789Smckusick char application_id [ISODCL (575, 702)]; /* achars */ 5465789Smckusick char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ 5565789Smckusick char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ 5665789Smckusick char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ 5765789Smckusick char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ 5865789Smckusick char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ 5965789Smckusick char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ 6065789Smckusick char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ 6165789Smckusick char file_structure_version [ISODCL (882, 882)]; /* 711 */ 6265789Smckusick char unused4 [ISODCL (883, 883)]; 6365789Smckusick char application_data [ISODCL (884, 1395)]; 6465789Smckusick char unused5 [ISODCL (1396, 2048)]; 6565789Smckusick }; 6665789Smckusick #define ISO_DEFAULT_BLOCK_SIZE 2048 6765789Smckusick 6865789Smckusick struct iso_directory_record { 6965789Smckusick char length [ISODCL (1, 1)]; /* 711 */ 7065789Smckusick char ext_attr_length [ISODCL (2, 2)]; /* 711 */ 7165789Smckusick unsigned char extent [ISODCL (3, 10)]; /* 733 */ 7265789Smckusick unsigned char size [ISODCL (11, 18)]; /* 733 */ 7365789Smckusick char date [ISODCL (19, 25)]; /* 7 by 711 */ 7465789Smckusick char flags [ISODCL (26, 26)]; 7565789Smckusick char file_unit_size [ISODCL (27, 27)]; /* 711 */ 7665789Smckusick char interleave [ISODCL (28, 28)]; /* 711 */ 7765789Smckusick char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ 7865789Smckusick char name_len [ISODCL (33, 33)]; /* 711 */ 7965789Smckusick char name [0]; 8065789Smckusick }; 8165789Smckusick /* can't take sizeof(iso_directory_record), because of possible alignment 8265789Smckusick of the last entry (34 instead of 33) */ 8365789Smckusick #define ISO_DIRECTORY_RECORD_SIZE 33 8465789Smckusick 8565789Smckusick struct iso_extended_attributes { 8665789Smckusick unsigned char owner [ISODCL (1, 4)]; /* 723 */ 8765789Smckusick unsigned char group [ISODCL (5, 8)]; /* 723 */ 8865789Smckusick unsigned char perm [ISODCL (9, 10)]; /* 9.5.3 */ 8965789Smckusick char ctime [ISODCL (11, 27)]; /* 8.4.26.1 */ 9065789Smckusick char mtime [ISODCL (28, 44)]; /* 8.4.26.1 */ 9165789Smckusick char xtime [ISODCL (45, 61)]; /* 8.4.26.1 */ 9265789Smckusick char ftime [ISODCL (62, 78)]; /* 8.4.26.1 */ 9365789Smckusick char recfmt [ISODCL (79, 79)]; /* 711 */ 9465789Smckusick char recattr [ISODCL (80, 80)]; /* 711 */ 9565789Smckusick unsigned char reclen [ISODCL (81, 84)]; /* 723 */ 9665789Smckusick char system_id [ISODCL (85, 116)]; /* achars */ 9765789Smckusick char system_use [ISODCL (117, 180)]; 9865789Smckusick char version [ISODCL (181, 181)]; /* 711 */ 9965789Smckusick char len_esc [ISODCL (182, 182)]; /* 711 */ 10065789Smckusick char reserved [ISODCL (183, 246)]; 10165789Smckusick unsigned char len_au [ISODCL (247, 250)]; /* 723 */ 10265789Smckusick }; 10365789Smckusick 10465789Smckusick /* CD-ROM Format type */ 10565789Smckusick enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP, ISO_FTYPE_ECMA }; 10665789Smckusick 10765789Smckusick #ifndef ISOFSMNT_ROOT 10865789Smckusick #define ISOFSMNT_ROOT 0 10965789Smckusick #endif 11065789Smckusick 11165789Smckusick struct iso_mnt { 11265789Smckusick int im_flags; 11365789Smckusick 11465789Smckusick struct mount *im_mountp; 11565789Smckusick dev_t im_dev; 11665789Smckusick struct vnode *im_devvp; 11765789Smckusick 11865789Smckusick int logical_block_size; 11965789Smckusick int im_bshift; 12065789Smckusick int im_bmask; 12165789Smckusick 12265789Smckusick int volume_space_size; 12365789Smckusick char im_fsmnt[50]; 12465789Smckusick struct netexport im_export; 12565789Smckusick 12665789Smckusick char root[ISODCL (157, 190)]; 12765789Smckusick int root_extent; 12865789Smckusick int root_size; 12965789Smckusick enum ISO_FTYPE iso_ftype; 13065789Smckusick 13165789Smckusick int rr_skip; 13265789Smckusick int rr_skip0; 13365789Smckusick }; 13465789Smckusick 13565789Smckusick #define VFSTOISOFS(mp) ((struct iso_mnt *)((mp)->mnt_data)) 13665789Smckusick 13765789Smckusick #define iso_blkoff(imp, loc) ((loc) & (imp)->im_bmask) 13865789Smckusick #define iso_lblkno(imp, loc) ((loc) >> (imp)->im_bshift) 13965789Smckusick #define iso_blksize(imp, ip, lbn) ((imp)->logical_block_size) 14065789Smckusick #define iso_lblktosize(imp, blk) ((blk) << (imp)->im_bshift) 14165789Smckusick 142*65855Smckusick int cd9660_mount __P((struct mount *, 14365789Smckusick char *, caddr_t, struct nameidata *, struct proc *)); 144*65855Smckusick int cd9660_start __P((struct mount *, int, struct proc *)); 145*65855Smckusick int cd9660_unmount __P((struct mount *, int, struct proc *)); 146*65855Smckusick int cd9660_root __P((struct mount *, struct vnode **)); 147*65855Smckusick int cd9660_quotactl __P((struct mount *, int, uid_t, caddr_t, struct proc *)); 148*65855Smckusick int cd9660_statfs __P((struct mount *, struct statfs *, struct proc *)); 149*65855Smckusick int cd9660_sync __P((struct mount *, int, struct ucred *, struct proc *)); 150*65855Smckusick int cd9660_vget __P((struct mount *, ino_t, struct vnode **)); 151*65855Smckusick int cd9660_fhtovp __P((struct mount *, struct fid *, struct mbuf *, 15265789Smckusick struct vnode **, int *, struct ucred **)); 153*65855Smckusick int cd9660_vptofh __P((struct vnode *, struct fid *)); 154*65855Smckusick int cd9660_init __P(()); 15565789Smckusick 15665789Smckusick struct iso_node; 15765789Smckusick int iso_blkatoff __P((struct iso_node *ip, long offset, struct buf **bpp)); 15865789Smckusick int iso_iget __P((struct iso_node *xp, ino_t ino, int relocated, 15965789Smckusick struct iso_node **ipp, struct iso_directory_record *isodir)); 16065789Smckusick int iso_iput __P((struct iso_node *ip)); 16165789Smckusick int iso_ilock __P((struct iso_node *ip)); 16265789Smckusick int iso_iunlock __P((struct iso_node *ip)); 163*65855Smckusick int cd9660_mountroot __P((void)); 16465789Smckusick 165*65855Smckusick extern int (**cd9660_vnodeop_p)(); 16665789Smckusick 16765789Smckusick extern inline int 16865789Smckusick isonum_711(p) 16965789Smckusick unsigned char *p; 17065789Smckusick { 17165789Smckusick return *p; 17265789Smckusick } 17365789Smckusick 17465789Smckusick extern inline int 17565789Smckusick isonum_712(p) 17665789Smckusick char *p; 17765789Smckusick { 17865789Smckusick return *p; 17965789Smckusick } 18065789Smckusick 18165789Smckusick extern inline int 18265789Smckusick isonum_721(p) 18365789Smckusick unsigned char *p; 18465789Smckusick { 18565789Smckusick return *p|((char)p[1] << 8); 18665789Smckusick } 18765789Smckusick 18865789Smckusick extern inline int 18965789Smckusick isonum_722(p) 19065789Smckusick unsigned char *p; 19165789Smckusick { 19265789Smckusick return ((char)*p << 8)|p[1]; 19365789Smckusick } 19465789Smckusick 19565789Smckusick extern inline int 19665789Smckusick isonum_723(p) 19765789Smckusick unsigned char *p; 19865789Smckusick { 19965789Smckusick return isonum_721(p); 20065789Smckusick } 20165789Smckusick 20265789Smckusick extern inline int 20365789Smckusick isonum_731(p) 20465789Smckusick unsigned char *p; 20565789Smckusick { 20665789Smckusick return *p|(p[1] << 8)|(p[2] << 16)|(p[3] << 24); 20765789Smckusick } 20865789Smckusick 20965789Smckusick extern inline int 21065789Smckusick isonum_732(p) 21165789Smckusick unsigned char *p; 21265789Smckusick { 21365789Smckusick return (*p << 24)|(p[1] << 16)|(p[2] << 8)|p[3]; 21465789Smckusick } 21565789Smckusick 21665789Smckusick extern inline int 21765789Smckusick isonum_733(p) 21865789Smckusick unsigned char *p; 21965789Smckusick { 22065789Smckusick return isonum_731(p); 22165789Smckusick } 22265789Smckusick 22365789Smckusick int isofncmp __P((unsigned char *, int, unsigned char *, int)); 22465789Smckusick void isofntrans __P((unsigned char *, int, unsigned char *, unsigned short *, 22565789Smckusick int, int)); 22665789Smckusick 22765789Smckusick /* 22865789Smckusick * Associated files have a leading '='. 22965789Smckusick */ 23065789Smckusick #define ASSOCCHAR '=' 231