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