Home | History | Annotate | Download | only in fs
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * ISO 9660 RRIP extension filesystem specifications
     23  */
     24 /*
     25  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
     26  * Use is subject to license terms.
     27  */
     28 
     29 #ifndef	_SYS_FS_HSFS_RRIP_H
     30 #define	_SYS_FS_HSFS_RRIP_H
     31 
     32 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     33 
     34 #ifdef	__cplusplus
     35 extern "C" {
     36 #endif
     37 
     38 /*
     39  * Mount options specific to HSFS.
     40  * This is not a good place for them; we should probably have a file
     41  * named hsfs_mount.h for such stuff.
     42  */
     43 #define	HSFSMNT_NORRIP		0x1	/* -nrr option found		 */
     44 #define	HSFSMNT_NOTRAILDOT	0x2	/* ignore trailing '.'		 */
     45 #define	HSFSMNT_NOMAPLCASE	0x4	/* do not map filenames to lcase */
     46 #define	HSFSMNT_NOTRAILSPACE	0x8	/* no trailing space in iso 9660 */
     47 #define	HSFSMNT_NOVERSION	0x10	/* no version info in iso 9660 */
     48 #define	HSFSMNT_NOJOLIET	0x20	/* ignore Joliet even if present */
     49 #define	HSFSMNT_JOLIETLONG	0x40	/* do not truncate Joliet filenames */
     50 #define	HSFSMNT_NOVERS2		0x80	/* ignore ISO-9660:1999		 */
     51 #define	HSFSMNT_INODE		0x1000	/* May use ext_lbn as inode #, */
     52 					/* FS is from a recent mkisofs */
     53 
     54 /*
     55  * XXX: The following flag was used in the past to instruct the kernel to
     56  *	ignore Rock Ridge extensions on a CD. Unfortunately, this was
     57  *	implemented as part of the generic mount flags, a bad idea.
     58  *	This flag should not be used anymore. The HSFSMNT_NORRIP
     59  *	flag should be used in its place. The hsfs_mount code currently
     60  *	understands this flag, but this functionality should go
     61  *	away in the future.
     62  */
     63 #define	MS_NO_RRIP		0x800000  /* if set, don't use Rock Ridge */
     64 
     65 
     66 #define	MIN(a, b)   ((a) < (b) ? (a) : (b))
     67 
     68 /*
     69  * Make sure we have this first
     70  */
     71 
     72 #define	RRIP_VERSION		1
     73 #define	RRIP_SUF_VERSION	1
     74 #define	RRIP_EXT_VERSION	1
     75 
     76 #define	RRIP_BIT	1	/* loc. in extension_name_table in susp.c */
     77 
     78 #define	IS_RRIP_IMPLEMENTED(fsp) (IS_IMPL_BIT_SET(fsp, RRIP_BIT) ? 1 : 0)
     79 
     80 
     81 
     82 /*
     83  * RRIP signature macros
     84  */
     85 #define	RRIP_CL		"CL"
     86 #define	RRIP_NM		"NM"
     87 #define	RRIP_PL		"PL"
     88 #define	RRIP_PN		"PN"
     89 #define	RRIP_PX		"PX"
     90 #define	RRIP_RE		"RE"
     91 #define	RRIP_RR		"RR"
     92 #define	RRIP_SL		"SL"
     93 #define	RRIP_TF		"TF"
     94 
     95 /*
     96  * RRIP ER extension fields
     97  */
     98 #define	RRIP_ER_EXT_ID		"RRIP_1991A"
     99 
    100 #define	RRIP_ER_EXT_DES		"THE ROCK RIDGE INTERCHANGE PROTOCOL PROVIDES \
    101 SUPPORT FOR POSIX FILE SYSTEM SEMANTICS."
    102 
    103 #define	RRIP_ER_EXT_SRC		"PLEASE CONTACT DISC PUBLISHER FOR \
    104 SPECIFICATION SOURCE.  SEE PUBLISHER IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR \
    105 FOR CONTACT INFORMATION."
    106 
    107 /*
    108  * "TF" time macros
    109  */
    110 #define	RRIP_TF_FLAGS(x)	*(RRIP_tf_flags(x))
    111 #define	RRIP_tf_flags(x)	(&((uchar_t *)(x))[4])
    112 
    113 #define	RRIP_TIME_START_BP	5
    114 
    115 #define	RRIP_TF_TIME_LENGTH(x)	(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
    116 					RRIP_TF_LONG_BIT) ? \
    117 					ISO_DATE_LEN : ISO_SHORT_DATE_LEN)
    118 
    119 /*
    120  * Time location bits
    121  */
    122 #define	RRIP_TF_CREATION_BIT	0x01
    123 #define	RRIP_TF_MODIFY_BIT	0x02
    124 #define	RRIP_TF_ACCESS_BIT	0x04
    125 #define	RRIP_TF_ATTRIBUTES_BIT	0x08
    126 #define	RRIP_TF_BACKUP_BIT	0x10
    127 #define	RRIP_TF_EXPIRATION_BIT	0x20
    128 #define	RRIP_TF_EFFECTIVE_BIT	0x40
    129 #define	RRIP_TF_LONG_BIT	0x80
    130 
    131 
    132 
    133 #define	RRIP_tf_creation(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP])
    134 #define	RRIP_tf_modify(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP + \
    135 			(RRIP_TF_TIME_LENGTH(x) * \
    136 				(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
    137 				RRIP_TF_CREATION_BIT)))])
    138 
    139 #define	RRIP_tf_access(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP + \
    140 			(RRIP_TF_TIME_LENGTH(x) * \
    141 			(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
    142 					RRIP_TF_CREATION_BIT) + \
    143 			IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
    144 					RRIP_TF_MODIFY_BIT)))])
    145 
    146 #define	RRIP_tf_attributes(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP + \
    147 			(RRIP_TF_TIME_LENGTH(x) * \
    148 				(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
    149 						RRIP_TF_CREATION_BIT) + \
    150 				IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
    151 						RRIP_TF_MODIFY_BIT) + \
    152 				IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
    153 						RRIP_TF_ACCESS_BIT)))])
    154 
    155 
    156 
    157 /*
    158  * Check if TF Bits are set.
    159  *
    160  * Note : IS_TIME_BIT_SET(x, y)  must be kept returning 1 and 0.
    161  * 	see RRIP_tf_*(x) Macros
    162  */
    163 #define	IS_TIME_BIT_SET(x, y)	(((x) & (y))  ? 1 : 0)
    164 #define	SET_TIME_BIT(x, y)	((x) |= (y))
    165 
    166 
    167 /*
    168  * "PX" Posix attibutes
    169  */
    170 #define	RRIP_mode(x)		(&((uchar_t *)x)[4])
    171 #define	RRIP_MODE(x)		(mode_t)BOTH_INT(RRIP_mode(x))
    172 
    173 #define	RRIP_nlink(x)		(&((uchar_t *)x)[12])
    174 #define	RRIP_NLINK(x)		(short)BOTH_INT(RRIP_nlink(x))
    175 
    176 #define	RRIP_uid(x)		(&((uchar_t *)x)[20])
    177 #define	RRIP_UID(x)		(uid_t)BOTH_INT(RRIP_uid(x))
    178 
    179 #define	RRIP_gid(x)		(&((uchar_t *)x)[28])
    180 #define	RRIP_GID(x)		(gid_t)BOTH_INT(RRIP_gid(x))
    181 
    182 #define	RRIP_ino(x)		(&((uchar_t *)x)[36])
    183 #define	RRIP_INO(x)		(uint32_t)BOTH_INT(RRIP_ino(x))
    184 
    185 #define	RRIP_PX_OLD_SIZE	36
    186 #define	RRIP_PX_SIZE		44
    187 
    188 /*
    189  * "PN" Posix major/minor numbers
    190  */
    191 
    192 #define	RRIP_major(x)		(&((uchar_t *)x)[4])
    193 #define	RRIP_MAJOR(x)		BOTH_INT(RRIP_major(x))
    194 
    195 #define	RRIP_minor(x)		(&((uchar_t *)x)[12])
    196 #define	RRIP_MINOR(x)		BOTH_INT(RRIP_minor(x))
    197 
    198 
    199 /*
    200  *  "NM" alternate name and "SL" symbolic link macros...
    201  */
    202 
    203 #define	SYM_LINK_LEN(x)		(strlen(x) + 1)
    204 #define	RRIP_NAME_LEN_BASE	5
    205 #define	RRIP_NAME_LEN(x)	(SUF_LEN(x) - RRIP_NAME_LEN_BASE)
    206 
    207 #define	RRIP_NAME_FLAGS(x)	(((uchar_t *)x)[4])
    208 
    209 /*
    210  * These are for the flag bits in the NM and SL and must remain <= 8 bits
    211  */
    212 #define	RRIP_NAME_CONTINUE	0x01
    213 #define	RRIP_NAME_CURRENT	0x02
    214 #define	RRIP_NAME_PARENT	0x04
    215 #define	RRIP_NAME_ROOT		0x08
    216 #define	RRIP_NAME_VOLROOT	0x10
    217 #define	RRIP_NAME_HOST		0x20
    218 
    219 
    220 /*
    221  * These are unique to use in the > 8 bits of sig_args.name_flags
    222  * They are > 8 so that we can share bits from above.
    223  * This can grow to 32 bits.
    224  */
    225 #define	RRIP_NAME_CHANGE	0x40
    226 #define	RRIP_SYM_LINK_COMPLETE	0x80	/* set if sym link already read */
    227 					/* from SUA (no longer than a short) */
    228 
    229 /*
    230  * Bit handling....
    231  */
    232 #define	SET_NAME_BIT(x, y)	((x) |= (y))
    233 #define	UNSET_NAME_BIT(x, y)	((x) &= ~(y))
    234 #define	IS_NAME_BIT_SET(x, y)	((x) & (y))
    235 #define	NAME_HAS_CHANGED(flag)	\
    236 			(IS_NAME_BIT_SET(flag, RRIP_NAME_CHANGE) ? 1 : 0)
    237 
    238 #define	RRIP_name(x)		(&((uchar_t *)x)[5])
    239 #define	RRIP_NAME(x)		RRIP_name(x)
    240 
    241 /*
    242  * This is the maximum filename length that we support
    243  */
    244 #define	RRIP_FILE_NAMELEN	255
    245 
    246 
    247 /*
    248  * SL Symbolic link macros (in addition to common name flag macos
    249  */
    250 /* these two macros are from the SL SUF pointer */
    251 #define	RRIP_sl_comp(x)		(&((uchar_t *)x)[5])
    252 #define	RRIP_SL_COMP(x)		RRIP_sl_comp(x)
    253 #define	RRIP_SL_FLAGS(x)	(((uchar_t *)x)[4])
    254 
    255 
    256 /* these macros are from the component pointer within the SL SUF */
    257 #define	RRIP_comp(x)		(&((uchar_t *)x)[2])
    258 #define	RRIP_COMP(x)		RRIP_comp(x)
    259 #define	RRIP_COMP_FLAGS(x)	(((uchar_t *)x)[0])
    260 #define	RRIP_COMP_LEN(x)	(RRIP_COMP_NAME_LEN(x) + 2)
    261 #define	RRIP_COMP_NAME_LEN(x)	(((uchar_t *)x)[1])
    262 
    263 
    264 /*
    265  * Directory hierarchy macros
    266  */
    267 
    268 /*
    269  * Macros for checking relocation bits in flags member of dlist
    270  * structure defined in iso_impl.h
    271  */
    272 #define	IS_RELOC_BIT_SET(x, y)	(((x) & (y))  ? 1 : 0)
    273 #define	SET_RELOC_BIT(x, y)	((x) |= (y))
    274 
    275 #define	CHILD_LINK		0x01
    276 #define	PARENT_LINK		0x02
    277 #define	RELOCATED_DIR		0x04
    278 
    279 #define	RRIP_child_lbn(x)	(&((uchar_t *)x)[4])
    280 #define	RRIP_CHILD_LBN(x)	(uint_t)BOTH_INT(RRIP_child_lbn(x))
    281 
    282 #define	RRIP_parent_lbn(x)	(&((uchar_t *)x)[4])
    283 #define	RRIP_PARENT_LBN(x)	(uint_t)BOTH_INT(RRIP_parent_lbn(x))
    284 
    285 
    286 #ifdef _KERNEL
    287 
    288 /*
    289  * Forward declarations
    290  */
    291 extern uchar_t *rrip_name(sig_args_t *);
    292 extern uchar_t *rrip_file_attr(sig_args_t *);
    293 extern uchar_t *rrip_dev_nodes(sig_args_t *);
    294 extern uchar_t *rrip_file_time(sig_args_t *);
    295 extern uchar_t *rrip_sym_link(sig_args_t *);
    296 extern uchar_t *rrip_parent_link(sig_args_t *);
    297 extern uchar_t *rrip_child_link(sig_args_t *);
    298 extern uchar_t *rrip_reloc_dir(sig_args_t *);
    299 extern uchar_t *rrip_rock_ridge(sig_args_t *);
    300 extern void hs_check_root_dirent(struct vnode *vp, struct hs_direntry *hdp);
    301 extern int rrip_namecopy(char *from, char *to, char *tmp_name,
    302 				uchar_t *dirp, uint_t last_offset,
    303 				struct hsfs *fsp, struct hs_direntry *hdp);
    304 #endif	/* _KERNEL */
    305 
    306 #ifdef	__cplusplus
    307 }
    308 #endif
    309 
    310 #endif	/* _SYS_FS_HSFS_RRIP_H */
    311