Home | History | Annotate | Download | only in squashfs-tools
      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 (at) 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 
    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 
    281 struct 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 
    303 struct squashfs_dir_index {
    304 	unsigned int		index;
    305 	unsigned int		start_block;
    306 	unsigned int		size;
    307 	unsigned char		name[0];
    308 };
    309 
    310 struct 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 
    319 struct 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 
    329 struct 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 
    340 struct 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 
    351 struct 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 
    363 struct 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 
    375 struct 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 
    389 struct 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 
    406 struct 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 
    420 struct 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 
    437 union 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 
    450 struct 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 
    458 struct squashfs_dir_header {
    459 	unsigned int		count;
    460 	unsigned int		start_block;
    461 	unsigned int		inode_number;
    462 };
    463 
    464 struct squashfs_fragment_entry {
    465 	long long		start_block;
    466 	unsigned int		size;
    467 	unsigned int		unused;
    468 };
    469 
    470 struct squashfs_xattr_entry {
    471 	unsigned short		type;
    472 	unsigned short		size;
    473 };
    474 
    475 struct squashfs_xattr_val {
    476 	unsigned int		vsize;
    477 };
    478 
    479 struct squashfs_xattr_id {
    480 	long long		xattr;
    481 	unsigned int		count;
    482 	unsigned int		size;
    483 };
    484 
    485 struct squashfs_xattr_table {
    486 	long long		xattr_table_start;
    487 	unsigned int		xattr_ids;
    488 	unsigned int		unused;
    489 };
    490 
    491 #endif
    492