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