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*69354Smckusick * @(#)iso.h 8.6 (Berkeley) 05/10/95
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 */
7168046Smckusick u_char extent [ISODCL (3, 10)]; /* 733 */
7268046Smckusick u_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 */
7968046Smckusick char name [1]; /* XXX */
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 {
8668046Smckusick u_char owner [ISODCL (1, 4)]; /* 723 */
8768046Smckusick u_char group [ISODCL (5, 8)]; /* 723 */
8868046Smckusick u_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 */
9568046Smckusick u_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)];
10168046Smckusick u_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 struct netexport im_export;
12465789Smckusick
12565789Smckusick char root[ISODCL (157, 190)];
12665789Smckusick int root_extent;
12765789Smckusick int root_size;
12865789Smckusick enum ISO_FTYPE iso_ftype;
12965789Smckusick
13065789Smckusick int rr_skip;
13165789Smckusick int rr_skip0;
13265789Smckusick };
13365789Smckusick
13465789Smckusick #define VFSTOISOFS(mp) ((struct iso_mnt *)((mp)->mnt_data))
13565789Smckusick
13668046Smckusick #define blkoff(imp, loc) ((loc) & (imp)->im_bmask)
13768046Smckusick #define lblktosize(imp, blk) ((blk) << (imp)->im_bshift)
13868046Smckusick #define lblkno(imp, loc) ((loc) >> (imp)->im_bshift)
13968046Smckusick #define blksize(imp, ip, lbn) ((imp)->logical_block_size)
14065789Smckusick
14165855Smckusick int cd9660_mount __P((struct mount *,
14265789Smckusick char *, caddr_t, struct nameidata *, struct proc *));
14365855Smckusick int cd9660_start __P((struct mount *, int, struct proc *));
14465855Smckusick int cd9660_unmount __P((struct mount *, int, struct proc *));
14565855Smckusick int cd9660_root __P((struct mount *, struct vnode **));
14665855Smckusick int cd9660_quotactl __P((struct mount *, int, uid_t, caddr_t, struct proc *));
14765855Smckusick int cd9660_statfs __P((struct mount *, struct statfs *, struct proc *));
14865855Smckusick int cd9660_sync __P((struct mount *, int, struct ucred *, struct proc *));
14965855Smckusick int cd9660_vget __P((struct mount *, ino_t, struct vnode **));
15065855Smckusick int cd9660_fhtovp __P((struct mount *, struct fid *, struct mbuf *,
15165789Smckusick struct vnode **, int *, struct ucred **));
15265855Smckusick int cd9660_vptofh __P((struct vnode *, struct fid *));
15368682Smckusick int cd9660_init __P((struct vfsconf *));
15468682Smckusick #define cd9660_sysctl ((int (*) __P((int *, u_int, void *, size_t *, void *, \
15568682Smckusick size_t, struct proc *)))eopnotsupp)
15665789Smckusick
15765855Smckusick int cd9660_mountroot __P((void));
15865789Smckusick
15965855Smckusick extern int (**cd9660_vnodeop_p)();
16067521Smckusick extern int (**cd9660_specop_p)();
16167521Smckusick #ifdef FIFO
16267521Smckusick extern int (**cd9660_fifoop_p)();
16367521Smckusick #endif
16465789Smckusick
16568046Smckusick static __inline int
isonum_711(p)16665789Smckusick isonum_711(p)
16768046Smckusick u_char *p;
16865789Smckusick {
16965789Smckusick return *p;
17065789Smckusick }
17165789Smckusick
17268046Smckusick static __inline int
isonum_712(p)17365789Smckusick isonum_712(p)
17465789Smckusick char *p;
17565789Smckusick {
17665789Smckusick return *p;
17765789Smckusick }
17865789Smckusick
17968046Smckusick #ifndef UNALIGNED_ACCESS
18068046Smckusick
18168046Smckusick static __inline int
isonum_723(p)18268046Smckusick isonum_723(p)
18368046Smckusick u_char *p;
18465789Smckusick {
18568046Smckusick return *p|(p[1] << 8);
18665789Smckusick }
18765789Smckusick
18868046Smckusick static __inline int
isonum_733(p)18968046Smckusick isonum_733(p)
19068046Smckusick u_char *p;
19165789Smckusick {
19268046Smckusick return *p|(p[1] << 8)|(p[2] << 16)|(p[3] << 24);
19365789Smckusick }
19465789Smckusick
19568046Smckusick #else /* UNALIGNED_ACCESS */
19668046Smckusick
19768046Smckusick #if BYTE_ORDER == LITTLE_ENDIAN
19868046Smckusick
19968046Smckusick static __inline int
isonum_723(p)20065789Smckusick isonum_723(p)
20168046Smckusick u_char *p
20265789Smckusick {
20368046Smckusick return *(u_int16t *)p;
20465789Smckusick }
20565789Smckusick
20668046Smckusick static __inline int
isonum_733(p)20768046Smckusick isonum_733(p)
20868046Smckusick u_char *p;
20965789Smckusick {
21068046Smckusick return *(u_int32t *)p;
21165789Smckusick }
21265789Smckusick
21368046Smckusick #endif
21468046Smckusick
21568046Smckusick #if BYTE_ORDER == BIG_ENDIAN
21668046Smckusick
21768046Smckusick static __inline int
isonum_723(p)21868046Smckusick isonum_723(p)
21968046Smckusick u_char *p
22065789Smckusick {
22168046Smckusick return *(u_int16t *)(p + 2);
22265789Smckusick }
22365789Smckusick
22468046Smckusick static __inline int
isonum_733(p)22565789Smckusick isonum_733(p)
22668046Smckusick u_char *p;
22765789Smckusick {
22868046Smckusick return *(u_int32t *)(p + 4);
22965789Smckusick }
23065789Smckusick
23168046Smckusick #endif
23265789Smckusick
23368046Smckusick #endif /* UNALIGNED_ACCESS */
23468046Smckusick
23568046Smckusick int isofncmp __P((u_char *, int, u_char *, int));
23668046Smckusick void isofntrans __P((u_char *, int, u_char *, u_short *, int, int));
23768046Smckusick ino_t isodirino __P((struct iso_directory_record *, struct iso_mnt *));
23868046Smckusick
23965789Smckusick /*
24065789Smckusick * Associated files have a leading '='.
24165789Smckusick */
24265789Smckusick #define ASSOCCHAR '='
243