1dccad8223cefc2dea179b7995e5a00a38e45ac79Phillip Lougher#ifndef UNSQUASHFS_H 2dccad8223cefc2dea179b7995e5a00a38e45ac79Phillip Lougher#define UNSQUASHFS_H 395fd9206a4e680bde995694cd8fb24c5685c6566plougher/* 41ebb6e9932d448097d769f1366d8adaae797ea64plougher * Unsquash a squashfs filesystem. This is a highly compressed read only 51ebb6e9932d448097d769f1366d8adaae797ea64plougher * filesystem. 695fd9206a4e680bde995694cd8fb24c5685c6566plougher * 7dccad8223cefc2dea179b7995e5a00a38e45ac79Phillip Lougher * Copyright (c) 2009, 2010, 2013, 2014 883d42a3fc898962aa1f1e8387f2ccb1114e0d294Phillip Lougher * Phillip Lougher <phillip@squashfs.org.uk> 995fd9206a4e680bde995694cd8fb24c5685c6566plougher * 1095fd9206a4e680bde995694cd8fb24c5685c6566plougher * This program is free software; you can redistribute it and/or 1195fd9206a4e680bde995694cd8fb24c5685c6566plougher * modify it under the terms of the GNU General Public License 1295fd9206a4e680bde995694cd8fb24c5685c6566plougher * as published by the Free Software Foundation; either version 2, 1395fd9206a4e680bde995694cd8fb24c5685c6566plougher * or (at your option) any later version. 1495fd9206a4e680bde995694cd8fb24c5685c6566plougher * 1595fd9206a4e680bde995694cd8fb24c5685c6566plougher * This program is distributed in the hope that it will be useful, 1695fd9206a4e680bde995694cd8fb24c5685c6566plougher * but WITHOUT ANY WARRANTY; without even the implied warranty of 1795fd9206a4e680bde995694cd8fb24c5685c6566plougher * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1895fd9206a4e680bde995694cd8fb24c5685c6566plougher * GNU General Public License for more details. 1995fd9206a4e680bde995694cd8fb24c5685c6566plougher * 2095fd9206a4e680bde995694cd8fb24c5685c6566plougher * You should have received a copy of the GNU General Public License 2195fd9206a4e680bde995694cd8fb24c5685c6566plougher * along with this program; if not, write to the Free Software 2295fd9206a4e680bde995694cd8fb24c5685c6566plougher * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 2395fd9206a4e680bde995694cd8fb24c5685c6566plougher * 2495fd9206a4e680bde995694cd8fb24c5685c6566plougher * unsquashfs.h 2595fd9206a4e680bde995694cd8fb24c5685c6566plougher */ 2695fd9206a4e680bde995694cd8fb24c5685c6566plougher 2795fd9206a4e680bde995694cd8fb24c5685c6566plougher#define TRUE 1 2895fd9206a4e680bde995694cd8fb24c5685c6566plougher#define FALSE 0 2995fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <stdio.h> 3095fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/types.h> 3195fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <unistd.h> 3295fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <stdlib.h> 3395fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/stat.h> 3495fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <fcntl.h> 3595fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <errno.h> 3695fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <string.h> 3795fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/mman.h> 3895fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <utime.h> 3995fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <pwd.h> 4095fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <grp.h> 4195fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <time.h> 4295fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <regex.h> 4395fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <fnmatch.h> 4495fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <signal.h> 4595fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <pthread.h> 4695fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <math.h> 4795fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/ioctl.h> 4895fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/time.h> 4995fd9206a4e680bde995694cd8fb24c5685c6566plougher 5095fd9206a4e680bde995694cd8fb24c5685c6566plougher#ifndef linux 5195fd9206a4e680bde995694cd8fb24c5685c6566plougher#define __BYTE_ORDER BYTE_ORDER 5295fd9206a4e680bde995694cd8fb24c5685c6566plougher#define __BIG_ENDIAN BIG_ENDIAN 5395fd9206a4e680bde995694cd8fb24c5685c6566plougher#define __LITTLE_ENDIAN LITTLE_ENDIAN 5495fd9206a4e680bde995694cd8fb24c5685c6566plougher#else 5595fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <endian.h> 5695fd9206a4e680bde995694cd8fb24c5685c6566plougher#endif 5795fd9206a4e680bde995694cd8fb24c5685c6566plougher 5895fd9206a4e680bde995694cd8fb24c5685c6566plougher#include "squashfs_fs.h" 590100fed4ec712daba9a0009c47f6e8390da5bd93Phillip Lougher#include "error.h" 6095fd9206a4e680bde995694cd8fb24c5685c6566plougher 6195fd9206a4e680bde995694cd8fb24c5685c6566plougher#define CALCULATE_HASH(start) (start & 0xffff) 6295fd9206a4e680bde995694cd8fb24c5685c6566plougher 635fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher/* 645fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher * Unified superblock containing fields for all superblocks 655fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher */ 665fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougherstruct super_block { 6727c4b6f7f6a33bf7711c0ee8cd563e4604dc5861plougher struct squashfs_super_block s; 685fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher /* fields only used by squashfs 3 and earlier layouts */ 695fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher unsigned int no_uids; 705fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher unsigned int no_guids; 715fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher long long uid_start; 725fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher long long guid_start; 735fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher}; 745fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher 7595fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct hash_table_entry { 76f404f4914fdb272a70e18664e8963d793cc90f44plougher long long start; 77f404f4914fdb272a70e18664e8963d793cc90f44plougher int bytes; 7895fd9206a4e680bde995694cd8fb24c5685c6566plougher struct hash_table_entry *next; 7995fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 8095fd9206a4e680bde995694cd8fb24c5685c6566plougher 8195fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct inode { 8295fd9206a4e680bde995694cd8fb24c5685c6566plougher int blocks; 8395fd9206a4e680bde995694cd8fb24c5685c6566plougher char *block_ptr; 8495fd9206a4e680bde995694cd8fb24c5685c6566plougher long long data; 8595fd9206a4e680bde995694cd8fb24c5685c6566plougher int fragment; 8695fd9206a4e680bde995694cd8fb24c5685c6566plougher int frag_bytes; 8795fd9206a4e680bde995694cd8fb24c5685c6566plougher gid_t gid; 8895fd9206a4e680bde995694cd8fb24c5685c6566plougher int inode_number; 8995fd9206a4e680bde995694cd8fb24c5685c6566plougher int mode; 9095fd9206a4e680bde995694cd8fb24c5685c6566plougher int offset; 9195fd9206a4e680bde995694cd8fb24c5685c6566plougher long long start; 92d9fbc90f4e23094ae418f9e5917b868b2ea5fd50plougher char *symlink; 9395fd9206a4e680bde995694cd8fb24c5685c6566plougher time_t time; 9495fd9206a4e680bde995694cd8fb24c5685c6566plougher int type; 9595fd9206a4e680bde995694cd8fb24c5685c6566plougher uid_t uid; 9649b8a5ae3503d6fa6f645c6b3dc97f3015a45bdeplougher char sparse; 9712c899489159bbf0b30054b970a96c45fa2a1035plougher unsigned int xattr; 9895fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 9995fd9206a4e680bde995694cd8fb24c5685c6566plougher 10095fd9206a4e680bde995694cd8fb24c5685c6566ploughertypedef struct squashfs_operations { 101da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher struct dir *(*squashfs_opendir)(unsigned int block_start, 102da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher unsigned int offset, struct inode **i); 103da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher void (*read_fragment)(unsigned int fragment, long long *start_block, 104da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher int *size); 105e1542da6a3f99db8dc60b5cad891547e047861b7Phillip Lougher int (*read_fragment_table)(long long *); 106da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher void (*read_block_list)(unsigned int *block_list, char *block_ptr, 107da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher int blocks); 108da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher struct inode *(*read_inode)(unsigned int start_block, 109da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher unsigned int offset); 1103800aa66e882445b8c41c06e378dea8bd728fa3fplougher int (*read_uids_guids)(); 11195fd9206a4e680bde995694cd8fb24c5685c6566plougher} squashfs_operations; 11295fd9206a4e680bde995694cd8fb24c5685c6566plougher 11395fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct test { 11495fd9206a4e680bde995694cd8fb24c5685c6566plougher int mask; 11595fd9206a4e680bde995694cd8fb24c5685c6566plougher int value; 11695fd9206a4e680bde995694cd8fb24c5685c6566plougher int position; 11795fd9206a4e680bde995694cd8fb24c5685c6566plougher char mode; 11895fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 11995fd9206a4e680bde995694cd8fb24c5685c6566plougher 12095fd9206a4e680bde995694cd8fb24c5685c6566plougher 12195fd9206a4e680bde995694cd8fb24c5685c6566plougher/* Cache status struct. Caches are used to keep 12295fd9206a4e680bde995694cd8fb24c5685c6566plougher track of memory buffers passed between different threads */ 12395fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct cache { 12495fd9206a4e680bde995694cd8fb24c5685c6566plougher int max_buffers; 12595fd9206a4e680bde995694cd8fb24c5685c6566plougher int count; 1266b336d83d3546674593f7de3be86d174f32fd753Phillip Lougher int used; 12795fd9206a4e680bde995694cd8fb24c5685c6566plougher int buffer_size; 12895fd9206a4e680bde995694cd8fb24c5685c6566plougher int wait_free; 12995fd9206a4e680bde995694cd8fb24c5685c6566plougher int wait_pending; 13095fd9206a4e680bde995694cd8fb24c5685c6566plougher pthread_mutex_t mutex; 13195fd9206a4e680bde995694cd8fb24c5685c6566plougher pthread_cond_t wait_for_free; 13295fd9206a4e680bde995694cd8fb24c5685c6566plougher pthread_cond_t wait_for_pending; 13395fd9206a4e680bde995694cd8fb24c5685c6566plougher struct cache_entry *free_list; 13495fd9206a4e680bde995694cd8fb24c5685c6566plougher struct cache_entry *hash_table[65536]; 13595fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 13695fd9206a4e680bde995694cd8fb24c5685c6566plougher 13795fd9206a4e680bde995694cd8fb24c5685c6566plougher/* struct describing a cache entry passed between threads */ 13895fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct cache_entry { 13995fd9206a4e680bde995694cd8fb24c5685c6566plougher struct cache *cache; 14095fd9206a4e680bde995694cd8fb24c5685c6566plougher long long block; 14195fd9206a4e680bde995694cd8fb24c5685c6566plougher int size; 14295fd9206a4e680bde995694cd8fb24c5685c6566plougher int used; 14395fd9206a4e680bde995694cd8fb24c5685c6566plougher int error; 14495fd9206a4e680bde995694cd8fb24c5685c6566plougher int pending; 14595fd9206a4e680bde995694cd8fb24c5685c6566plougher struct cache_entry *hash_next; 14695fd9206a4e680bde995694cd8fb24c5685c6566plougher struct cache_entry *hash_prev; 14795fd9206a4e680bde995694cd8fb24c5685c6566plougher struct cache_entry *free_next; 14895fd9206a4e680bde995694cd8fb24c5685c6566plougher struct cache_entry *free_prev; 14995fd9206a4e680bde995694cd8fb24c5685c6566plougher char *data; 15095fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 15195fd9206a4e680bde995694cd8fb24c5685c6566plougher 15295fd9206a4e680bde995694cd8fb24c5685c6566plougher/* struct describing queues used to pass data between threads */ 15395fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct queue { 15495fd9206a4e680bde995694cd8fb24c5685c6566plougher int size; 15595fd9206a4e680bde995694cd8fb24c5685c6566plougher int readp; 15695fd9206a4e680bde995694cd8fb24c5685c6566plougher int writep; 15795fd9206a4e680bde995694cd8fb24c5685c6566plougher pthread_mutex_t mutex; 15895fd9206a4e680bde995694cd8fb24c5685c6566plougher pthread_cond_t empty; 15995fd9206a4e680bde995694cd8fb24c5685c6566plougher pthread_cond_t full; 16095fd9206a4e680bde995694cd8fb24c5685c6566plougher void **data; 16195fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 16295fd9206a4e680bde995694cd8fb24c5685c6566plougher 16395fd9206a4e680bde995694cd8fb24c5685c6566plougher/* default size of fragment buffer in Mbytes */ 16495fd9206a4e680bde995694cd8fb24c5685c6566plougher#define FRAGMENT_BUFFER_DEFAULT 256 16595fd9206a4e680bde995694cd8fb24c5685c6566plougher/* default size of data buffer in Mbytes */ 16695fd9206a4e680bde995694cd8fb24c5685c6566plougher#define DATA_BUFFER_DEFAULT 256 16795fd9206a4e680bde995694cd8fb24c5685c6566plougher 16895fd9206a4e680bde995694cd8fb24c5685c6566plougher#define DIR_ENT_SIZE 16 16995fd9206a4e680bde995694cd8fb24c5685c6566plougher 17095fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct dir_ent { 17195fd9206a4e680bde995694cd8fb24c5685c6566plougher char name[SQUASHFS_NAME_LEN + 1]; 17295fd9206a4e680bde995694cd8fb24c5685c6566plougher unsigned int start_block; 17395fd9206a4e680bde995694cd8fb24c5685c6566plougher unsigned int offset; 17495fd9206a4e680bde995694cd8fb24c5685c6566plougher unsigned int type; 17595fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 17695fd9206a4e680bde995694cd8fb24c5685c6566plougher 17795fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct dir { 17895fd9206a4e680bde995694cd8fb24c5685c6566plougher int dir_count; 17995fd9206a4e680bde995694cd8fb24c5685c6566plougher int cur_entry; 18095fd9206a4e680bde995694cd8fb24c5685c6566plougher unsigned int mode; 18195fd9206a4e680bde995694cd8fb24c5685c6566plougher uid_t uid; 18295fd9206a4e680bde995694cd8fb24c5685c6566plougher gid_t guid; 18395fd9206a4e680bde995694cd8fb24c5685c6566plougher unsigned int mtime; 184fdbbd7d7e595a227e0c259fa4afc872098c9e471plougher unsigned int xattr; 18595fd9206a4e680bde995694cd8fb24c5685c6566plougher struct dir_ent *dirs; 18695fd9206a4e680bde995694cd8fb24c5685c6566plougher}; 18795fd9206a4e680bde995694cd8fb24c5685c6566plougher 1886925e4e11525496401c9c7115f3077f26302739dplougherstruct file_entry { 1896925e4e11525496401c9c7115f3077f26302739dplougher int offset; 1906925e4e11525496401c9c7115f3077f26302739dplougher int size; 1916925e4e11525496401c9c7115f3077f26302739dplougher struct cache_entry *buffer; 1926925e4e11525496401c9c7115f3077f26302739dplougher}; 1936925e4e11525496401c9c7115f3077f26302739dplougher 1946925e4e11525496401c9c7115f3077f26302739dplougher 1956925e4e11525496401c9c7115f3077f26302739dplougherstruct squashfs_file { 1966925e4e11525496401c9c7115f3077f26302739dplougher int fd; 1976925e4e11525496401c9c7115f3077f26302739dplougher int blocks; 1986925e4e11525496401c9c7115f3077f26302739dplougher long long file_size; 1996925e4e11525496401c9c7115f3077f26302739dplougher int mode; 2006925e4e11525496401c9c7115f3077f26302739dplougher uid_t uid; 2016925e4e11525496401c9c7115f3077f26302739dplougher gid_t gid; 2026925e4e11525496401c9c7115f3077f26302739dplougher time_t time; 2036925e4e11525496401c9c7115f3077f26302739dplougher char *pathname; 2047f6692575a1b1c8d7d55afac647b72b84b79e378plougher char sparse; 205fdbbd7d7e595a227e0c259fa4afc872098c9e471plougher unsigned int xattr; 2066925e4e11525496401c9c7115f3077f26302739dplougher}; 2076925e4e11525496401c9c7115f3077f26302739dplougher 208a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougherstruct path_entry { 209a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher char *name; 210a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher regex_t *preg; 211a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher struct pathname *paths; 212a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher}; 213a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher 214a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougherstruct pathname { 215a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher int names; 216a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher struct path_entry *name; 217a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher}; 218a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher 219a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougherstruct pathnames { 220a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher int count; 221a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher struct pathname *path[0]; 222a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher}; 223a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher#define PATHS_ALLOC_SIZE 10 224a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher 22595fd9206a4e680bde995694cd8fb24c5685c6566plougher/* globals */ 22684c327d76812010835b264430e47523f185dd7d6plougherextern struct super_block sBlk; 22795fd9206a4e680bde995694cd8fb24c5685c6566plougherextern squashfs_operations s_ops; 22895fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int swap; 22995fd9206a4e680bde995694cd8fb24c5685c6566plougherextern char *inode_table, *directory_table; 230da4e9ba3c8d7407b76e11461d1979788b56fdd68plougherextern struct hash_table_entry *inode_table_hash[65536], 231da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher *directory_table_hash[65536]; 23295fd9206a4e680bde995694cd8fb24c5685c6566plougherextern unsigned int *uid_table, *guid_table; 23395fd9206a4e680bde995694cd8fb24c5685c6566plougherextern pthread_mutex_t screen_mutex; 23495fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int progress_enabled; 23595fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int inode_number; 23695fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int lookup_type[]; 23786561909d9ca51a4e4ce4efcfea30b41d1d08275plougherextern int fd; 238c8fa8a106fc680f34f14b1c17a53f584bc38c9ccPhillip Lougherextern struct queue *to_reader, *to_inflate, *to_writer; 239c8fa8a106fc680f34f14b1c17a53f584bc38c9ccPhillip Lougherextern struct cache *fragment_cache, *data_cache; 24095fd9206a4e680bde995694cd8fb24c5685c6566plougher 241c880d023e8b15ce1f66ec62363dd59a921f4d0c6plougher/* unsquashfs.c */ 242413527e21393700a4c77b4e75d497ee3f7dc506dplougherextern int lookup_entry(struct hash_table_entry **, long long); 2433306cb2b54a60a32664617118336ac141e1471b6plougherextern int read_fs_bytes(int fd, long long, int, void *); 244cf5c8b43f14bad020372fe55fb237eb2ae2b28d4Phillip Lougherextern int read_block(int, long long, long long *, int, void *); 24556d5ca80fbe08b5d523c382afa23f71ca270cee6Phillip Lougherextern void enable_progress_bar(); 24656d5ca80fbe08b5d523c382afa23f71ca270cee6Phillip Lougherextern void disable_progress_bar(); 24756d5ca80fbe08b5d523c382afa23f71ca270cee6Phillip Lougherextern void dump_queue(struct queue *); 248c8fa8a106fc680f34f14b1c17a53f584bc38c9ccPhillip Lougherextern void dump_cache(struct cache *); 249c880d023e8b15ce1f66ec62363dd59a921f4d0c6plougher 25095fd9206a4e680bde995694cd8fb24c5685c6566plougher/* unsquash-1.c */ 25195fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_block_list_1(unsigned int *, char *, int); 252e1542da6a3f99db8dc60b5cad891547e047861b7Phillip Lougherextern int read_fragment_table_1(long long *); 25395fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct inode *read_inode_1(unsigned int, unsigned int); 254da4e9ba3c8d7407b76e11461d1979788b56fdd68plougherextern struct dir *squashfs_opendir_1(unsigned int, unsigned int, 255da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher struct inode **); 2563800aa66e882445b8c41c06e378dea8bd728fa3fplougherextern int read_uids_guids_1(); 25795fd9206a4e680bde995694cd8fb24c5685c6566plougher 25895fd9206a4e680bde995694cd8fb24c5685c6566plougher/* unsquash-2.c */ 25995fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_block_list_2(unsigned int *, char *, int); 260e1542da6a3f99db8dc60b5cad891547e047861b7Phillip Lougherextern int read_fragment_table_2(long long *); 26195fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_fragment_2(unsigned int, long long *, int *); 26295fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct inode *read_inode_2(unsigned int, unsigned int); 26395fd9206a4e680bde995694cd8fb24c5685c6566plougher 26495fd9206a4e680bde995694cd8fb24c5685c6566plougher/* unsquash-3.c */ 265e1542da6a3f99db8dc60b5cad891547e047861b7Phillip Lougherextern int read_fragment_table_3(long long *); 26695fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_fragment_3(unsigned int, long long *, int *); 26795fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct inode *read_inode_3(unsigned int, unsigned int); 268da4e9ba3c8d7407b76e11461d1979788b56fdd68plougherextern struct dir *squashfs_opendir_3(unsigned int, unsigned int, 269da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher struct inode **); 2701e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougher 2711e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougher/* unsquash-4.c */ 272e1542da6a3f99db8dc60b5cad891547e047861b7Phillip Lougherextern int read_fragment_table_4(long long *); 2731e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougherextern void read_fragment_4(unsigned int, long long *, int *); 2741e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougherextern struct inode *read_inode_4(unsigned int, unsigned int); 275da4e9ba3c8d7407b76e11461d1979788b56fdd68plougherextern struct dir *squashfs_opendir_4(unsigned int, unsigned int, 276da4e9ba3c8d7407b76e11461d1979788b56fdd68plougher struct inode **); 2773800aa66e882445b8c41c06e378dea8bd728fa3fplougherextern int read_uids_guids_4(); 278dccad8223cefc2dea179b7995e5a00a38e45ac79Phillip Lougher#endif 279