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 <phillip@squashfs.org.uk>
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
250struct meta_entry {
251	long long		data_block;
252	unsigned int		index_block;
253	unsigned short		offset;
254	unsigned short		pad;
255};
256
257struct 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
272typedef long long		squashfs_block;
273typedef 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
281struct squashfs_super_block {
282	unsigned int		s_magic;
283	unsigned int		inodes;
284	int			mkfs_time /* time of filesystem creation */;
285	unsigned int		block_size;
286	unsigned int		fragments;
287	unsigned short		compression;
288	unsigned short		block_log;
289	unsigned short		flags;
290	unsigned short		no_ids;
291	unsigned short		s_major;
292	unsigned short		s_minor;
293	squashfs_inode		root_inode;
294	long long		bytes_used;
295	long long		id_table_start;
296	long long		xattr_id_table_start;
297	long long		inode_table_start;
298	long long		directory_table_start;
299	long long		fragment_table_start;
300	long long		lookup_table_start;
301};
302
303struct squashfs_dir_index {
304	unsigned int		index;
305	unsigned int		start_block;
306	unsigned int		size;
307	unsigned char		name[0];
308};
309
310struct squashfs_base_inode_header {
311	unsigned short		inode_type;
312	unsigned short		mode;
313	unsigned short		uid;
314	unsigned short		guid;
315	int			mtime;
316	unsigned int 		inode_number;
317};
318
319struct squashfs_ipc_inode_header {
320	unsigned short		inode_type;
321	unsigned short		mode;
322	unsigned short		uid;
323	unsigned short		guid;
324	int			mtime;
325	unsigned int 		inode_number;
326	unsigned int		nlink;
327};
328
329struct squashfs_lipc_inode_header {
330	unsigned short		inode_type;
331	unsigned short		mode;
332	unsigned short		uid;
333	unsigned short		guid;
334	int			mtime;
335	unsigned int 		inode_number;
336	unsigned int		nlink;
337	unsigned int		xattr;
338};
339
340struct squashfs_dev_inode_header {
341	unsigned short		inode_type;
342	unsigned short		mode;
343	unsigned short		uid;
344	unsigned short		guid;
345	int			mtime;
346	unsigned int 		inode_number;
347	unsigned int		nlink;
348	unsigned int		rdev;
349};
350
351struct squashfs_ldev_inode_header {
352	unsigned short		inode_type;
353	unsigned short		mode;
354	unsigned short		uid;
355	unsigned short		guid;
356	int			mtime;
357	unsigned int 		inode_number;
358	unsigned int		nlink;
359	unsigned int		rdev;
360	unsigned int		xattr;
361};
362
363struct squashfs_symlink_inode_header {
364	unsigned short		inode_type;
365	unsigned short		mode;
366	unsigned short		uid;
367	unsigned short		guid;
368	int			mtime;
369	unsigned int 		inode_number;
370	unsigned int		nlink;
371	unsigned int		symlink_size;
372	char			symlink[0];
373};
374
375struct squashfs_reg_inode_header {
376	unsigned short		inode_type;
377	unsigned short		mode;
378	unsigned short		uid;
379	unsigned short		guid;
380	int			mtime;
381	unsigned int 		inode_number;
382	unsigned int		start_block;
383	unsigned int		fragment;
384	unsigned int		offset;
385	unsigned int		file_size;
386	unsigned int		block_list[0];
387};
388
389struct squashfs_lreg_inode_header {
390	unsigned short		inode_type;
391	unsigned short		mode;
392	unsigned short		uid;
393	unsigned short		guid;
394	int			mtime;
395	unsigned int 		inode_number;
396	squashfs_block		start_block;
397	long long		file_size;
398	long long		sparse;
399	unsigned int		nlink;
400	unsigned int		fragment;
401	unsigned int		offset;
402	unsigned int		xattr;
403	unsigned int		block_list[0];
404};
405
406struct squashfs_dir_inode_header {
407	unsigned short		inode_type;
408	unsigned short		mode;
409	unsigned short		uid;
410	unsigned short		guid;
411	int			mtime;
412	unsigned int 		inode_number;
413	unsigned int		start_block;
414	unsigned int		nlink;
415	unsigned short		file_size;
416	unsigned short		offset;
417	unsigned int		parent_inode;
418};
419
420struct squashfs_ldir_inode_header {
421	unsigned short		inode_type;
422	unsigned short		mode;
423	unsigned short		uid;
424	unsigned short		guid;
425	int			mtime;
426	unsigned int 		inode_number;
427	unsigned int		nlink;
428	unsigned int		file_size;
429	unsigned int		start_block;
430	unsigned int		parent_inode;
431	unsigned short		i_count;
432	unsigned short		offset;
433	unsigned int		xattr;
434	struct squashfs_dir_index	index[0];
435};
436
437union squashfs_inode_header {
438	struct squashfs_base_inode_header	base;
439	struct squashfs_dev_inode_header	dev;
440	struct squashfs_ldev_inode_header	ldev;
441	struct squashfs_symlink_inode_header	symlink;
442	struct squashfs_reg_inode_header	reg;
443	struct squashfs_lreg_inode_header	lreg;
444	struct squashfs_dir_inode_header	dir;
445	struct squashfs_ldir_inode_header	ldir;
446	struct squashfs_ipc_inode_header	ipc;
447	struct squashfs_lipc_inode_header	lipc;
448};
449
450struct squashfs_dir_entry {
451	unsigned short		offset;
452	short			inode_number;
453	unsigned short		type;
454	unsigned short		size;
455	char			name[0];
456};
457
458struct squashfs_dir_header {
459	unsigned int		count;
460	unsigned int		start_block;
461	unsigned int		inode_number;
462};
463
464struct squashfs_fragment_entry {
465	long long		start_block;
466	unsigned int		size;
467	unsigned int		unused;
468};
469
470struct squashfs_xattr_entry {
471	unsigned short		type;
472	unsigned short		size;
473};
474
475struct squashfs_xattr_val {
476	unsigned int		vsize;
477};
478
479struct squashfs_xattr_id {
480	long long		xattr;
481	unsigned int		count;
482	unsigned int		size;
483};
484
485struct squashfs_xattr_table {
486	long long		xattr_table_start;
487	unsigned int		xattr_ids;
488	unsigned int		unused;
489};
490
491#endif
492