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