xref: /aosp_15_r20/external/squashfs-tools/squashfs-tools/squashfs_fs.h (revision 79398b2563bcbbbab54656397863972d8fa68df1)
1 #ifndef SQUASHFS_FS
2 #define SQUASHFS_FS
3 /*
4  * Squashfs
5  *
6  * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012,
7  * 2013, 2014
8  * Phillip Lougher <[email protected]>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2,
13  * or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23  *
24  * squashfs_fs.h
25  */
26 
27 #define SQUASHFS_CACHED_FRAGMENTS	CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE
28 #define SQUASHFS_MAJOR			4
29 #define SQUASHFS_MINOR			0
30 #define SQUASHFS_MAGIC			0x73717368
31 #define SQUASHFS_MAGIC_SWAP		0x68737173
32 #define SQUASHFS_START			0
33 
34 /* size of metadata (inode and directory) blocks */
35 #define SQUASHFS_METADATA_SIZE		8192
36 #define SQUASHFS_METADATA_LOG		13
37 
38 /* default size of data blocks */
39 #define SQUASHFS_FILE_SIZE		131072
40 
41 #define SQUASHFS_FILE_MAX_SIZE		1048576
42 #define SQUASHFS_FILE_MAX_LOG		20
43 
44 /* Max number of uids and gids */
45 #define SQUASHFS_IDS			65536
46 
47 /* Max length of filename (not 255) */
48 #define SQUASHFS_NAME_LEN		256
49 
50 #define SQUASHFS_INVALID		((long long) 0xffffffffffff)
51 #define SQUASHFS_INVALID_FRAG		((unsigned int) 0xffffffff)
52 #define SQUASHFS_INVALID_XATTR		((unsigned int) 0xffffffff)
53 #define SQUASHFS_INVALID_BLK		((long long) -1)
54 #define SQUASHFS_USED_BLK		((long long) -2)
55 
56 /* Filesystem flags */
57 #define SQUASHFS_NOI			0
58 #define SQUASHFS_NOD			1
59 #define SQUASHFS_CHECK			2
60 #define SQUASHFS_NOF			3
61 #define SQUASHFS_NO_FRAG		4
62 #define SQUASHFS_ALWAYS_FRAG		5
63 #define SQUASHFS_DUPLICATE		6
64 #define SQUASHFS_EXPORT			7
65 #define SQUASHFS_NOX			8
66 #define SQUASHFS_NO_XATTR		9
67 #define SQUASHFS_COMP_OPT		10
68 
69 #define SQUASHFS_BIT(flag, bit)		((flag >> bit) & 1)
70 
71 #define SQUASHFS_UNCOMPRESSED_INODES(flags)	SQUASHFS_BIT(flags, \
72 						SQUASHFS_NOI)
73 
74 #define SQUASHFS_UNCOMPRESSED_DATA(flags)	SQUASHFS_BIT(flags, \
75 						SQUASHFS_NOD)
76 
77 #define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags)	SQUASHFS_BIT(flags, \
78 						SQUASHFS_NOF)
79 
80 #define SQUASHFS_NO_FRAGMENTS(flags)		SQUASHFS_BIT(flags, \
81 						SQUASHFS_NO_FRAG)
82 
83 #define SQUASHFS_ALWAYS_FRAGMENTS(flags)	SQUASHFS_BIT(flags, \
84 						SQUASHFS_ALWAYS_FRAG)
85 
86 #define SQUASHFS_DUPLICATES(flags)		SQUASHFS_BIT(flags, \
87 						SQUASHFS_DUPLICATE)
88 
89 #define SQUASHFS_EXPORTABLE(flags)		SQUASHFS_BIT(flags, \
90 						SQUASHFS_EXPORT)
91 
92 #define SQUASHFS_UNCOMPRESSED_XATTRS(flags)	SQUASHFS_BIT(flags, \
93 						SQUASHFS_NOX)
94 
95 #define SQUASHFS_NO_XATTRS(flags)		SQUASHFS_BIT(flags, \
96 						SQUASHFS_NO_XATTR)
97 
98 #define SQUASHFS_COMP_OPTS(flags)		SQUASHFS_BIT(flags, \
99 						SQUASHFS_COMP_OPT)
100 
101 #define SQUASHFS_MKFLAGS(noi, nod, nof, nox, no_frag, always_frag, \
102 		duplicate_checking, exportable, no_xattr, comp_opt) (noi | \
103 		(nod << 1) | (nof << 3) | (no_frag << 4) | \
104 		(always_frag << 5) | (duplicate_checking << 6) | \
105 		(exportable << 7) | (nox << 8) | (no_xattr << 9) | \
106 		(comp_opt << 10))
107 
108 /* Max number of types and file types */
109 #define SQUASHFS_DIR_TYPE		1
110 #define SQUASHFS_FILE_TYPE		2
111 #define SQUASHFS_SYMLINK_TYPE		3
112 #define SQUASHFS_BLKDEV_TYPE		4
113 #define SQUASHFS_CHRDEV_TYPE		5
114 #define SQUASHFS_FIFO_TYPE		6
115 #define SQUASHFS_SOCKET_TYPE		7
116 #define SQUASHFS_LDIR_TYPE		8
117 #define SQUASHFS_LREG_TYPE		9
118 #define SQUASHFS_LSYMLINK_TYPE		10
119 #define SQUASHFS_LBLKDEV_TYPE		11
120 #define SQUASHFS_LCHRDEV_TYPE		12
121 #define SQUASHFS_LFIFO_TYPE		13
122 #define SQUASHFS_LSOCKET_TYPE		14
123 
124 /* Xattr types */
125 #define SQUASHFS_XATTR_USER		0
126 #define SQUASHFS_XATTR_TRUSTED		1
127 #define SQUASHFS_XATTR_SECURITY		2
128 #define SQUASHFS_XATTR_VALUE_OOL	256
129 #define SQUASHFS_XATTR_PREFIX_MASK	0xff
130 
131 /* Flag whether block is compressed or uncompressed, bit is set if block is
132  * uncompressed */
133 #define SQUASHFS_COMPRESSED_BIT		(1 << 15)
134 
135 #define SQUASHFS_COMPRESSED_SIZE(B)	(((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
136 		(B) & ~SQUASHFS_COMPRESSED_BIT :  SQUASHFS_COMPRESSED_BIT)
137 
138 #define SQUASHFS_COMPRESSED(B)		(!((B) & SQUASHFS_COMPRESSED_BIT))
139 
140 #define SQUASHFS_COMPRESSED_BIT_BLOCK		(1 << 24)
141 
142 #define SQUASHFS_COMPRESSED_SIZE_BLOCK(B)	((B) & \
143 	~SQUASHFS_COMPRESSED_BIT_BLOCK)
144 
145 #define SQUASHFS_COMPRESSED_BLOCK(B)	(!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
146 
147 /*
148  * Inode number ops.  Inodes consist of a compressed block number, and an
149  * uncompressed  offset within that block
150  */
151 #define SQUASHFS_INODE_BLK(a)		((unsigned int) ((a) >> 16))
152 
153 #define SQUASHFS_INODE_OFFSET(a)	((unsigned int) ((a) & 0xffff))
154 
155 #define SQUASHFS_MKINODE(A, B)		((squashfs_inode)(((squashfs_inode) (A)\
156 					<< 16) + (B)))
157 
158 /* Compute 32 bit VFS inode number from squashfs inode number */
159 #define SQUASHFS_MK_VFS_INODE(a, b)	((unsigned int) (((a) << 8) + \
160 					((b) >> 2) + 1))
161 
162 /* Translate between VFS mode and squashfs mode */
163 #define SQUASHFS_MODE(a)		((a) & 0xfff)
164 
165 /* fragment and fragment table defines */
166 #define SQUASHFS_FRAGMENT_BYTES(A)	((A) * \
167 					sizeof(struct squashfs_fragment_entry))
168 
169 #define SQUASHFS_FRAGMENT_INDEX(A)	(SQUASHFS_FRAGMENT_BYTES(A) / \
170 					SQUASHFS_METADATA_SIZE)
171 
172 #define SQUASHFS_FRAGMENT_INDEX_OFFSET(A)	(SQUASHFS_FRAGMENT_BYTES(A) % \
173 						SQUASHFS_METADATA_SIZE)
174 
175 #define SQUASHFS_FRAGMENT_INDEXES(A)	((SQUASHFS_FRAGMENT_BYTES(A) + \
176 					SQUASHFS_METADATA_SIZE - 1) / \
177 					SQUASHFS_METADATA_SIZE)
178 
179 #define SQUASHFS_FRAGMENT_INDEX_BYTES(A)	(SQUASHFS_FRAGMENT_INDEXES(A) *\
180 						sizeof(long long))
181 
182 /* inode lookup table defines */
183 #define SQUASHFS_LOOKUP_BYTES(A)	((A) * sizeof(squashfs_inode))
184 
185 #define SQUASHFS_LOOKUP_BLOCK(A)		(SQUASHFS_LOOKUP_BYTES(A) / \
186 						SQUASHFS_METADATA_SIZE)
187 
188 #define SQUASHFS_LOOKUP_BLOCK_OFFSET(A)		(SQUASHFS_LOOKUP_BYTES(A) % \
189 						SQUASHFS_METADATA_SIZE)
190 
191 #define SQUASHFS_LOOKUP_BLOCKS(A)	((SQUASHFS_LOOKUP_BYTES(A) + \
192 					SQUASHFS_METADATA_SIZE - 1) / \
193 					SQUASHFS_METADATA_SIZE)
194 
195 #define SQUASHFS_LOOKUP_BLOCK_BYTES(A)	(SQUASHFS_LOOKUP_BLOCKS(A) *\
196 					sizeof(long long))
197 
198 /* uid lookup table defines */
199 #define SQUASHFS_ID_BYTES(A)	((A) * sizeof(unsigned int))
200 
201 #define SQUASHFS_ID_BLOCK(A)		(SQUASHFS_ID_BYTES(A) / \
202 						SQUASHFS_METADATA_SIZE)
203 
204 #define SQUASHFS_ID_BLOCK_OFFSET(A)		(SQUASHFS_ID_BYTES(A) % \
205 						SQUASHFS_METADATA_SIZE)
206 
207 #define SQUASHFS_ID_BLOCKS(A)	((SQUASHFS_ID_BYTES(A) + \
208 					SQUASHFS_METADATA_SIZE - 1) / \
209 					SQUASHFS_METADATA_SIZE)
210 
211 #define SQUASHFS_ID_BLOCK_BYTES(A)	(SQUASHFS_ID_BLOCKS(A) *\
212 					sizeof(long long))
213 
214 /* xattr id lookup table defines */
215 #define SQUASHFS_XATTR_BYTES(A)		((A) * sizeof(struct squashfs_xattr_id))
216 
217 #define SQUASHFS_XATTR_BLOCK(A)		(SQUASHFS_XATTR_BYTES(A) / \
218 					SQUASHFS_METADATA_SIZE)
219 
220 #define SQUASHFS_XATTR_BLOCK_OFFSET(A)	(SQUASHFS_XATTR_BYTES(A) % \
221 					SQUASHFS_METADATA_SIZE)
222 
223 #define SQUASHFS_XATTR_BLOCKS(A)	((SQUASHFS_XATTR_BYTES(A) + \
224 					SQUASHFS_METADATA_SIZE - 1) / \
225 					SQUASHFS_METADATA_SIZE)
226 
227 #define SQUASHFS_XATTR_BLOCK_BYTES(A)	(SQUASHFS_XATTR_BLOCKS(A) *\
228 					sizeof(long long))
229 
230 #define SQUASHFS_XATTR_BLK(A)		((unsigned int) ((A) >> 16))
231 
232 #define SQUASHFS_XATTR_OFFSET(A)	((unsigned int) ((A) & 0xffff))
233 
234 /* cached data constants for filesystem */
235 #define SQUASHFS_CACHED_BLKS		8
236 
237 #define SQUASHFS_MAX_FILE_SIZE_LOG	64
238 
239 #define SQUASHFS_MAX_FILE_SIZE		((long long) 1 << \
240 					(SQUASHFS_MAX_FILE_SIZE_LOG - 2))
241 
242 #define SQUASHFS_MARKER_BYTE		0xff
243 
244 /* meta index cache */
245 #define SQUASHFS_META_INDEXES	(SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
246 #define SQUASHFS_META_ENTRIES	31
247 #define SQUASHFS_META_NUMBER	8
248 #define SQUASHFS_SLOTS		4
249 
250 struct meta_entry {
251 	long long		data_block;
252 	unsigned int		index_block;
253 	unsigned short		offset;
254 	unsigned short		pad;
255 };
256 
257 struct meta_index {
258 	unsigned int		inode_number;
259 	unsigned int		offset;
260 	unsigned short		entries;
261 	unsigned short		skip;
262 	unsigned short		locked;
263 	unsigned short		pad;
264 	struct meta_entry	meta_entry[SQUASHFS_META_ENTRIES];
265 };
266 
267 
268 /*
269  * definitions for structures on disk
270  */
271 
272 typedef long long		squashfs_block;
273 typedef long long		squashfs_inode;
274 
275 #define ZLIB_COMPRESSION	1
276 #define LZMA_COMPRESSION	2
277 #define LZO_COMPRESSION		3
278 #define XZ_COMPRESSION		4
279 #define LZ4_COMPRESSION		5
280 #define ZSTD_COMPRESSION	6
281 
282 struct squashfs_super_block {
283 	unsigned int		s_magic;
284 	unsigned int		inodes;
285 	int			mkfs_time /* time of filesystem creation */;
286 	unsigned int		block_size;
287 	unsigned int		fragments;
288 	unsigned short		compression;
289 	unsigned short		block_log;
290 	unsigned short		flags;
291 	unsigned short		no_ids;
292 	unsigned short		s_major;
293 	unsigned short		s_minor;
294 	squashfs_inode		root_inode;
295 	long long		bytes_used;
296 	long long		id_table_start;
297 	long long		xattr_id_table_start;
298 	long long		inode_table_start;
299 	long long		directory_table_start;
300 	long long		fragment_table_start;
301 	long long		lookup_table_start;
302 };
303 
304 struct squashfs_dir_index {
305 	unsigned int		index;
306 	unsigned int		start_block;
307 	unsigned int		size;
308 	unsigned char		name[0];
309 };
310 
311 struct squashfs_base_inode_header {
312 	unsigned short		inode_type;
313 	unsigned short		mode;
314 	unsigned short		uid;
315 	unsigned short		guid;
316 	int			mtime;
317 	unsigned int 		inode_number;
318 };
319 
320 struct squashfs_ipc_inode_header {
321 	unsigned short		inode_type;
322 	unsigned short		mode;
323 	unsigned short		uid;
324 	unsigned short		guid;
325 	int			mtime;
326 	unsigned int 		inode_number;
327 	unsigned int		nlink;
328 };
329 
330 struct squashfs_lipc_inode_header {
331 	unsigned short		inode_type;
332 	unsigned short		mode;
333 	unsigned short		uid;
334 	unsigned short		guid;
335 	int			mtime;
336 	unsigned int 		inode_number;
337 	unsigned int		nlink;
338 	unsigned int		xattr;
339 };
340 
341 struct squashfs_dev_inode_header {
342 	unsigned short		inode_type;
343 	unsigned short		mode;
344 	unsigned short		uid;
345 	unsigned short		guid;
346 	int			mtime;
347 	unsigned int 		inode_number;
348 	unsigned int		nlink;
349 	unsigned int		rdev;
350 };
351 
352 struct squashfs_ldev_inode_header {
353 	unsigned short		inode_type;
354 	unsigned short		mode;
355 	unsigned short		uid;
356 	unsigned short		guid;
357 	int			mtime;
358 	unsigned int 		inode_number;
359 	unsigned int		nlink;
360 	unsigned int		rdev;
361 	unsigned int		xattr;
362 };
363 
364 struct squashfs_symlink_inode_header {
365 	unsigned short		inode_type;
366 	unsigned short		mode;
367 	unsigned short		uid;
368 	unsigned short		guid;
369 	int			mtime;
370 	unsigned int 		inode_number;
371 	unsigned int		nlink;
372 	unsigned int		symlink_size;
373 	char			symlink[0];
374 };
375 
376 struct squashfs_reg_inode_header {
377 	unsigned short		inode_type;
378 	unsigned short		mode;
379 	unsigned short		uid;
380 	unsigned short		guid;
381 	int			mtime;
382 	unsigned int 		inode_number;
383 	unsigned int		start_block;
384 	unsigned int		fragment;
385 	unsigned int		offset;
386 	unsigned int		file_size;
387 	unsigned int		block_list[0];
388 };
389 
390 struct squashfs_lreg_inode_header {
391 	unsigned short		inode_type;
392 	unsigned short		mode;
393 	unsigned short		uid;
394 	unsigned short		guid;
395 	int			mtime;
396 	unsigned int 		inode_number;
397 	squashfs_block		start_block;
398 	long long		file_size;
399 	long long		sparse;
400 	unsigned int		nlink;
401 	unsigned int		fragment;
402 	unsigned int		offset;
403 	unsigned int		xattr;
404 	unsigned int		block_list[0];
405 };
406 
407 struct squashfs_dir_inode_header {
408 	unsigned short		inode_type;
409 	unsigned short		mode;
410 	unsigned short		uid;
411 	unsigned short		guid;
412 	int			mtime;
413 	unsigned int 		inode_number;
414 	unsigned int		start_block;
415 	unsigned int		nlink;
416 	unsigned short		file_size;
417 	unsigned short		offset;
418 	unsigned int		parent_inode;
419 };
420 
421 struct squashfs_ldir_inode_header {
422 	unsigned short		inode_type;
423 	unsigned short		mode;
424 	unsigned short		uid;
425 	unsigned short		guid;
426 	int			mtime;
427 	unsigned int 		inode_number;
428 	unsigned int		nlink;
429 	unsigned int		file_size;
430 	unsigned int		start_block;
431 	unsigned int		parent_inode;
432 	unsigned short		i_count;
433 	unsigned short		offset;
434 	unsigned int		xattr;
435 	struct squashfs_dir_index	index[0];
436 };
437 
438 union squashfs_inode_header {
439 	struct squashfs_base_inode_header	base;
440 	struct squashfs_dev_inode_header	dev;
441 	struct squashfs_ldev_inode_header	ldev;
442 	struct squashfs_symlink_inode_header	symlink;
443 	struct squashfs_reg_inode_header	reg;
444 	struct squashfs_lreg_inode_header	lreg;
445 	struct squashfs_dir_inode_header	dir;
446 	struct squashfs_ldir_inode_header	ldir;
447 	struct squashfs_ipc_inode_header	ipc;
448 	struct squashfs_lipc_inode_header	lipc;
449 };
450 
451 struct squashfs_dir_entry {
452 	unsigned short		offset;
453 	short			inode_number;
454 	unsigned short		type;
455 	unsigned short		size;
456 	char			name[0];
457 };
458 
459 struct squashfs_dir_header {
460 	unsigned int		count;
461 	unsigned int		start_block;
462 	unsigned int		inode_number;
463 };
464 
465 struct squashfs_fragment_entry {
466 	long long		start_block;
467 	unsigned int		size;
468 	unsigned int		unused;
469 };
470 
471 struct squashfs_xattr_entry {
472 	unsigned short		type;
473 	unsigned short		size;
474 };
475 
476 struct squashfs_xattr_val {
477 	unsigned int		vsize;
478 };
479 
480 struct squashfs_xattr_id {
481 	long long		xattr;
482 	unsigned int		count;
483 	unsigned int		size;
484 };
485 
486 struct squashfs_xattr_table {
487 	long long		xattr_table_start;
488 	unsigned int		xattr_ids;
489 	unsigned int		unused;
490 };
491 
492 #endif
493