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 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