xref: /illumos-gate/usr/src/uts/common/sys/fs/hsfs_rrip.h (revision 4e93fb0f6383eaac21897dcdae56b87118131e4d)
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 2006 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 
52 /*
53  * XXX: The following flag was used in the past to instruct the kernel to
54  *	ignore Rock Ridge extensions on a CD. Unfortunately, this was
55  *	implemented as part of the generic mount flags, a bad idea.
56  *	This flag should not be used anymore. The HSFSMNT_NORRIP
57  *	flag should be used in its place. The hsfs_mount code currently
58  *	understands this flag, but this functionality should go
59  *	away in the future.
60  */
61 #define	MS_NO_RRIP		0x800000  /* if set, don't use Rock Ridge */
62 
63 
64 #define	MIN(a, b)   ((a) < (b) ? (a) : (b))
65 
66 /*
67  * Make sure we have this first
68  */
69 
70 #define	RRIP_VERSION		1
71 #define	RRIP_SUF_VERSION	1
72 #define	RRIP_EXT_VERSION	1
73 
74 #define	RRIP_BIT	1	/* loc. in extension_name_table in susp.c */
75 
76 #define	IS_RRIP_IMPLEMENTED(fsp) (IS_IMPL_BIT_SET(fsp, RRIP_BIT) ? 1 : 0)
77 
78 
79 
80 /*
81  * RRIP signature macros
82  */
83 #define	RRIP_CL		"CL"
84 #define	RRIP_NM		"NM"
85 #define	RRIP_PL		"PL"
86 #define	RRIP_PN		"PN"
87 #define	RRIP_PX		"PX"
88 #define	RRIP_RE		"RE"
89 #define	RRIP_RR		"RR"
90 #define	RRIP_SL		"SL"
91 #define	RRIP_TF		"TF"
92 
93 /*
94  * RRIP ER extension fields
95  */
96 #define	RRIP_ER_EXT_ID		"RRIP_1991A"
97 
98 #define	RRIP_ER_EXT_DES		"THE ROCK RIDGE INTERCHANGE PROTOCOL PROVIDES \
99 SUPPORT FOR POSIX FILE SYSTEM SEMANTICS."
100 
101 #define	RRIP_ER_EXT_SRC		"PLEASE CONTACT DISC PUBLISHER FOR \
102 SPECIFICATION SOURCE.  SEE PUBLISHER IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR \
103 FOR CONTACT INFORMATION."
104 
105 /*
106  * "TF" time macros
107  */
108 #define	RRIP_TF_FLAGS(x)	*(RRIP_tf_flags(x))
109 #define	RRIP_tf_flags(x)	(&((uchar_t *)(x))[4])
110 
111 #define	RRIP_TIME_START_BP	5
112 
113 #define	RRIP_TF_TIME_LENGTH(x)	(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
114 					RRIP_TF_LONG_BIT) ? \
115 					ISO_DATE_LEN : ISO_SHORT_DATE_LEN)
116 
117 /*
118  * Time location bits
119  */
120 #define	RRIP_TF_CREATION_BIT	0x01
121 #define	RRIP_TF_MODIFY_BIT	0x02
122 #define	RRIP_TF_ACCESS_BIT	0x04
123 #define	RRIP_TF_ATTRIBUTES_BIT	0x08
124 #define	RRIP_TF_BACKUP_BIT	0x10
125 #define	RRIP_TF_EXPIRATION_BIT	0x20
126 #define	RRIP_TF_EFFECTIVE_BIT	0x40
127 #define	RRIP_TF_LONG_BIT	0x80
128 
129 
130 
131 #define	RRIP_tf_creation(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP])
132 #define	RRIP_tf_modify(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP + \
133 			(RRIP_TF_TIME_LENGTH(x) * \
134 				(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
135 				RRIP_TF_CREATION_BIT)))])
136 
137 #define	RRIP_tf_access(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP + \
138 			(RRIP_TF_TIME_LENGTH(x) * \
139 			(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
140 					RRIP_TF_CREATION_BIT) + \
141 			IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
142 					RRIP_TF_MODIFY_BIT)))])
143 
144 #define	RRIP_tf_attributes(x)	(&((uchar_t *)x)[RRIP_TIME_START_BP + \
145 			(RRIP_TF_TIME_LENGTH(x) * \
146 				(IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
147 						RRIP_TF_CREATION_BIT) + \
148 				IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
149 						RRIP_TF_MODIFY_BIT) + \
150 				IS_TIME_BIT_SET(RRIP_TF_FLAGS(x), \
151 						RRIP_TF_ACCESS_BIT)))])
152 
153 
154 
155 /*
156  * Check if TF Bits are set.
157  *
158  * Note : IS_TIME_BIT_SET(x, y)  must be kept returning 1 and 0.
159  * 	see RRIP_tf_*(x) Macros
160  */
161 #define	IS_TIME_BIT_SET(x, y)	(((x) & (y))  ? 1 : 0)
162 #define	SET_TIME_BIT(x, y)	((x) |= (y))
163 
164 
165 /*
166  * "PX" Posix attibutes
167  */
168 #define	RRIP_mode(x)		(&((uchar_t *)x)[4])
169 #define	RRIP_MODE(x)		(mode_t)BOTH_INT(RRIP_mode(x))
170 
171 #define	RRIP_nlink(x)		(&((uchar_t *)x)[12])
172 #define	RRIP_NLINK(x)		(short)BOTH_INT(RRIP_nlink(x))
173 
174 #define	RRIP_uid(x)		(&((uchar_t *)x)[20])
175 #define	RRIP_UID(x)		(uid_t)BOTH_INT(RRIP_uid(x))
176 
177 #define	RRIP_gid(x)		(&((uchar_t *)x)[28])
178 #define	RRIP_GID(x)		(gid_t)BOTH_INT(RRIP_gid(x))
179 
180 /*
181  * "PN" Posix major/minor numbers
182  */
183 
184 #define	RRIP_major(x)		(&((uchar_t *)x)[4])
185 #define	RRIP_MAJOR(x)		BOTH_INT(RRIP_major(x))
186 
187 #define	RRIP_minor(x)		(&((uchar_t *)x)[12])
188 #define	RRIP_MINOR(x)		BOTH_INT(RRIP_minor(x))
189 
190 
191 /*
192  *  "NM" alternate name and "SL" symbolic link macros...
193  */
194 
195 #define	SYM_LINK_LEN(x)		(strlen(x) + 1)
196 #define	RRIP_NAME_LEN_BASE	5
197 #define	RRIP_NAME_LEN(x)	(SUF_LEN(x) - RRIP_NAME_LEN_BASE)
198 
199 #define	RRIP_NAME_FLAGS(x)	(((uchar_t *)x)[4])
200 
201 /*
202  * These are for the flag bits in the NM and SL and must remain <= 8 bits
203  */
204 #define	RRIP_NAME_CONTINUE	0x01
205 #define	RRIP_NAME_CURRENT	0x02
206 #define	RRIP_NAME_PARENT	0x04
207 #define	RRIP_NAME_ROOT		0x08
208 #define	RRIP_NAME_VOLROOT	0x10
209 #define	RRIP_NAME_HOST		0x20
210 
211 
212 /*
213  * These are unique to use in the > 8 bits of sig_args.name_flags
214  * They are > 8 so that we can share bits from above.
215  * This can grow to 32 bits.
216  */
217 #define	RRIP_NAME_CHANGE	0x40
218 #define	RRIP_SYM_LINK_COMPLETE	0x80	/* set if sym link already read */
219 					/* from SUA (no longer than a short) */
220 
221 /*
222  * Bit handling....
223  */
224 #define	SET_NAME_BIT(x, y)	((x) |= (y))
225 #define	UNSET_NAME_BIT(x, y)	((x) &= ~(y))
226 #define	IS_NAME_BIT_SET(x, y)	((x) & (y))
227 #define	NAME_HAS_CHANGED(flag)	\
228 			(IS_NAME_BIT_SET(flag, RRIP_NAME_CHANGE) ? 1 : 0)
229 
230 #define	RRIP_name(x)		(&((uchar_t *)x)[5])
231 #define	RRIP_NAME(x)		RRIP_name(x)
232 
233 /*
234  * This is the maximum filename length that we support
235  */
236 #define	RRIP_FILE_NAMELEN	255
237 
238 
239 /*
240  * SL Symbolic link macros (in addition to common name flag macos
241  */
242 /* these two macros are from the SL SUF pointer */
243 #define	RRIP_sl_comp(x)		(&((uchar_t *)x)[5])
244 #define	RRIP_SL_COMP(x)		RRIP_sl_comp(x)
245 #define	RRIP_SL_FLAGS(x)	(((uchar_t *)x)[4])
246 
247 
248 /* these macros are from the component pointer within the SL SUF */
249 #define	RRIP_comp(x)		(&((uchar_t *)x)[2])
250 #define	RRIP_COMP(x)		RRIP_comp(x)
251 #define	RRIP_COMP_FLAGS(x)	(((uchar_t *)x)[0])
252 #define	RRIP_COMP_LEN(x)	(RRIP_COMP_NAME_LEN(x) + 2)
253 #define	RRIP_COMP_NAME_LEN(x)	(((uchar_t *)x)[1])
254 
255 
256 /*
257  * Directory hierarchy macros
258  */
259 
260 /*
261  * Macros for checking relocation bits in flags member of dlist
262  * structure defined in iso_impl.h
263  */
264 #define	IS_RELOC_BIT_SET(x, y)	(((x) & (y))  ? 1 : 0)
265 #define	SET_RELOC_BIT(x, y)	((x) |= (y))
266 
267 #define	CHILD_LINK		0x01
268 #define	PARENT_LINK		0x02
269 #define	RELOCATED_DIR		0x04
270 
271 #define	RRIP_child_lbn(x)	(&((uchar_t *)x)[4])
272 #define	RRIP_CHILD_LBN(x)	(uint_t)BOTH_INT(RRIP_child_lbn(x))
273 
274 #define	RRIP_parent_lbn(x)	(&((uchar_t *)x)[4])
275 #define	RRIP_PARENT_LBN(x)	(uint_t)BOTH_INT(RRIP_parent_lbn(x))
276 
277 
278 #ifdef _KERNEL
279 
280 /*
281  * Forward declarations
282  */
283 extern uchar_t *rrip_name(sig_args_t *);
284 extern uchar_t *rrip_file_attr(sig_args_t *);
285 extern uchar_t *rrip_dev_nodes(sig_args_t *);
286 extern uchar_t *rrip_file_time(sig_args_t *);
287 extern uchar_t *rrip_sym_link(sig_args_t *);
288 extern uchar_t *rrip_parent_link(sig_args_t *);
289 extern uchar_t *rrip_child_link(sig_args_t *);
290 extern uchar_t *rrip_reloc_dir(sig_args_t *);
291 extern uchar_t *rrip_rock_ridge(sig_args_t *);
292 extern void hs_check_root_dirent(struct vnode *vp, struct hs_direntry *hdp);
293 extern int rrip_namecopy(char *from, char *to, char *tmp_name, uchar_t *dirp,
294 				struct hsfs *fsp, struct hs_direntry *hdp);
295 #endif	/* _KERNEL */
296 
297 #ifdef	__cplusplus
298 }
299 #endif
300 
301 #endif	/* _SYS_FS_HSFS_RRIP_H */
302