unsquashfs.h revision 3800aa66e882445b8c41c06e378dea8bd728fa3f
195fd9206a4e680bde995694cd8fb24c5685c6566plougher/*
295fd9206a4e680bde995694cd8fb24c5685c6566plougher * Unsquash a squashfs filesystem.  This is a highly compressed read only filesystem.
395fd9206a4e680bde995694cd8fb24c5685c6566plougher *
495fd9206a4e680bde995694cd8fb24c5685c6566plougher * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
595fd9206a4e680bde995694cd8fb24c5685c6566plougher * Phillip Lougher <phillip@lougher.demon.co.uk>
695fd9206a4e680bde995694cd8fb24c5685c6566plougher *
795fd9206a4e680bde995694cd8fb24c5685c6566plougher * This program is free software; you can redistribute it and/or
895fd9206a4e680bde995694cd8fb24c5685c6566plougher * modify it under the terms of the GNU General Public License
995fd9206a4e680bde995694cd8fb24c5685c6566plougher * as published by the Free Software Foundation; either version 2,
1095fd9206a4e680bde995694cd8fb24c5685c6566plougher * or (at your option) any later version.
1195fd9206a4e680bde995694cd8fb24c5685c6566plougher *
1295fd9206a4e680bde995694cd8fb24c5685c6566plougher * This program is distributed in the hope that it will be useful,
1395fd9206a4e680bde995694cd8fb24c5685c6566plougher * but WITHOUT ANY WARRANTY; without even the implied warranty of
1495fd9206a4e680bde995694cd8fb24c5685c6566plougher * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1595fd9206a4e680bde995694cd8fb24c5685c6566plougher * GNU General Public License for more details.
1695fd9206a4e680bde995694cd8fb24c5685c6566plougher *
1795fd9206a4e680bde995694cd8fb24c5685c6566plougher * You should have received a copy of the GNU General Public License
1895fd9206a4e680bde995694cd8fb24c5685c6566plougher * along with this program; if not, write to the Free Software
1995fd9206a4e680bde995694cd8fb24c5685c6566plougher * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2095fd9206a4e680bde995694cd8fb24c5685c6566plougher *
2195fd9206a4e680bde995694cd8fb24c5685c6566plougher * unsquashfs.h
2295fd9206a4e680bde995694cd8fb24c5685c6566plougher */
2395fd9206a4e680bde995694cd8fb24c5685c6566plougher
2495fd9206a4e680bde995694cd8fb24c5685c6566plougher#define TRUE 1
2595fd9206a4e680bde995694cd8fb24c5685c6566plougher#define FALSE 0
2695fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <stdio.h>
2795fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/types.h>
2895fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <unistd.h>
2995fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <stdlib.h>
3095fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/stat.h>
3195fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <fcntl.h>
3295fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <errno.h>
3395fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <string.h>
3495fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <zlib.h>
3595fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/mman.h>
3695fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <utime.h>
3795fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <pwd.h>
3895fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <grp.h>
3995fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <time.h>
4095fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <regex.h>
4195fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <fnmatch.h>
4295fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <signal.h>
4395fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <pthread.h>
4495fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <math.h>
4595fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/ioctl.h>
4695fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <sys/time.h>
4795fd9206a4e680bde995694cd8fb24c5685c6566plougher
4895fd9206a4e680bde995694cd8fb24c5685c6566plougher#ifndef linux
4995fd9206a4e680bde995694cd8fb24c5685c6566plougher#define __BYTE_ORDER BYTE_ORDER
5095fd9206a4e680bde995694cd8fb24c5685c6566plougher#define __BIG_ENDIAN BIG_ENDIAN
5195fd9206a4e680bde995694cd8fb24c5685c6566plougher#define __LITTLE_ENDIAN LITTLE_ENDIAN
5295fd9206a4e680bde995694cd8fb24c5685c6566plougher#else
5395fd9206a4e680bde995694cd8fb24c5685c6566plougher#include <endian.h>
5495fd9206a4e680bde995694cd8fb24c5685c6566plougher#endif
5595fd9206a4e680bde995694cd8fb24c5685c6566plougher
5695fd9206a4e680bde995694cd8fb24c5685c6566plougher#include "squashfs_fs.h"
5795fd9206a4e680bde995694cd8fb24c5685c6566plougher#include "global.h"
5895fd9206a4e680bde995694cd8fb24c5685c6566plougher
5995fd9206a4e680bde995694cd8fb24c5685c6566plougher#ifdef SQUASHFS_TRACE
6095fd9206a4e680bde995694cd8fb24c5685c6566plougher#define TRACE(s, args...)		do { \
6195fd9206a4e680bde995694cd8fb24c5685c6566plougher						pthread_mutex_lock(&screen_mutex); \
6295fd9206a4e680bde995694cd8fb24c5685c6566plougher						if(progress_enabled) \
6395fd9206a4e680bde995694cd8fb24c5685c6566plougher							printf("\n"); \
6495fd9206a4e680bde995694cd8fb24c5685c6566plougher						printf("unsquashfs: "s, ## args); \
6595fd9206a4e680bde995694cd8fb24c5685c6566plougher						pthread_mutex_unlock(&screen_mutex);\
6695fd9206a4e680bde995694cd8fb24c5685c6566plougher					} while(0)
6795fd9206a4e680bde995694cd8fb24c5685c6566plougher#else
6895fd9206a4e680bde995694cd8fb24c5685c6566plougher#define TRACE(s, args...)
6995fd9206a4e680bde995694cd8fb24c5685c6566plougher#endif
7095fd9206a4e680bde995694cd8fb24c5685c6566plougher
7195fd9206a4e680bde995694cd8fb24c5685c6566plougher#define ERROR(s, args...)		do { \
7295fd9206a4e680bde995694cd8fb24c5685c6566plougher						pthread_mutex_lock(&screen_mutex); \
7395fd9206a4e680bde995694cd8fb24c5685c6566plougher						if(progress_enabled) \
7495fd9206a4e680bde995694cd8fb24c5685c6566plougher							fprintf(stderr, "\n"); \
7595fd9206a4e680bde995694cd8fb24c5685c6566plougher						fprintf(stderr, s, ## args); \
7695fd9206a4e680bde995694cd8fb24c5685c6566plougher						pthread_mutex_unlock(&screen_mutex);\
7795fd9206a4e680bde995694cd8fb24c5685c6566plougher					} while(0)
7895fd9206a4e680bde995694cd8fb24c5685c6566plougher
7995fd9206a4e680bde995694cd8fb24c5685c6566plougher#define EXIT_UNSQUASH(s, args...)	do { \
8095fd9206a4e680bde995694cd8fb24c5685c6566plougher						pthread_mutex_lock(&screen_mutex); \
8195fd9206a4e680bde995694cd8fb24c5685c6566plougher						fprintf(stderr, "FATAL ERROR aborting: "s, ## args); \
8295fd9206a4e680bde995694cd8fb24c5685c6566plougher						pthread_mutex_unlock(&screen_mutex);\
8395fd9206a4e680bde995694cd8fb24c5685c6566plougher						exit(1); \
8495fd9206a4e680bde995694cd8fb24c5685c6566plougher					} while(0)
8595fd9206a4e680bde995694cd8fb24c5685c6566plougher
8695fd9206a4e680bde995694cd8fb24c5685c6566plougher#define CALCULATE_HASH(start)	(start & 0xffff)
8795fd9206a4e680bde995694cd8fb24c5685c6566plougher
885fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher/*
895fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher * Unified superblock containing fields for all superblocks
905fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher */
915fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougherstruct super_block {
925fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned int		s_magic;
935fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned int		inodes;
945fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned int		mkfs_time;
955fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned int		block_size;
965fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned int		fragments;
975fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned short		compression;
985fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned short		block_log;
995fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned short		flags;
1005fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned short		no_ids;
1015fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned short		s_major;
1025fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned short		s_minor;
1035fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	squashfs_inode_t	root_inode;
1045fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		bytes_used;
1055fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		id_table_start;
1065fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		xattr_table_start;
1075fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		inode_table_start;
1085fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		directory_table_start;
1095fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		fragment_table_start;
1105fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		lookup_table_start;
1115fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	/* fields only used by squashfs 3 and earlier layouts */
1125fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned int		no_uids;
1135fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	unsigned int		no_guids;
1145fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		uid_start;
1155fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher	long long		guid_start;
1165fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher};
1175fab0afb7a53f127fc4ef3727007d72dcb25fdbcplougher
11895fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct hash_table_entry {
119f404f4914fdb272a70e18664e8963d793cc90f44plougher	long long	start;
120f404f4914fdb272a70e18664e8963d793cc90f44plougher	int		bytes;
12195fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct hash_table_entry *next;
12295fd9206a4e680bde995694cd8fb24c5685c6566plougher};
12395fd9206a4e680bde995694cd8fb24c5685c6566plougher
12495fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct inode {
12595fd9206a4e680bde995694cd8fb24c5685c6566plougher	int blocks;
12695fd9206a4e680bde995694cd8fb24c5685c6566plougher	char *block_ptr;
12795fd9206a4e680bde995694cd8fb24c5685c6566plougher	long long data;
12895fd9206a4e680bde995694cd8fb24c5685c6566plougher	int fragment;
12995fd9206a4e680bde995694cd8fb24c5685c6566plougher	int frag_bytes;
13095fd9206a4e680bde995694cd8fb24c5685c6566plougher	gid_t gid;
13195fd9206a4e680bde995694cd8fb24c5685c6566plougher	int inode_number;
13295fd9206a4e680bde995694cd8fb24c5685c6566plougher	int mode;
13395fd9206a4e680bde995694cd8fb24c5685c6566plougher	int offset;
13495fd9206a4e680bde995694cd8fb24c5685c6566plougher	long long start;
135d9fbc90f4e23094ae418f9e5917b868b2ea5fd50plougher	char *symlink;
13695fd9206a4e680bde995694cd8fb24c5685c6566plougher	time_t time;
13795fd9206a4e680bde995694cd8fb24c5685c6566plougher	int type;
13895fd9206a4e680bde995694cd8fb24c5685c6566plougher	uid_t uid;
13949b8a5ae3503d6fa6f645c6b3dc97f3015a45bdeplougher	char sparse;
14095fd9206a4e680bde995694cd8fb24c5685c6566plougher};
14195fd9206a4e680bde995694cd8fb24c5685c6566plougher
14295fd9206a4e680bde995694cd8fb24c5685c6566ploughertypedef struct squashfs_operations {
14395fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct dir *(*squashfs_opendir)(unsigned int block_start, unsigned int offset, struct inode **i);
14495fd9206a4e680bde995694cd8fb24c5685c6566plougher	void (*read_fragment)(unsigned int fragment, long long *start_block, int *size);
145ff61105632d8c1b2c29eb3dfa2cdc861c1039fb7plougher	int (*read_fragment_table)();
14695fd9206a4e680bde995694cd8fb24c5685c6566plougher	void (*read_block_list)(unsigned int *block_list, char *block_ptr, int blocks);
14795fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct inode *(*read_inode)(unsigned int start_block, unsigned int offset);
1483800aa66e882445b8c41c06e378dea8bd728fa3fplougher	int (*read_uids_guids)();
14995fd9206a4e680bde995694cd8fb24c5685c6566plougher} squashfs_operations;
15095fd9206a4e680bde995694cd8fb24c5685c6566plougher
15195fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct test {
15295fd9206a4e680bde995694cd8fb24c5685c6566plougher	int mask;
15395fd9206a4e680bde995694cd8fb24c5685c6566plougher	int value;
15495fd9206a4e680bde995694cd8fb24c5685c6566plougher	int position;
15595fd9206a4e680bde995694cd8fb24c5685c6566plougher	char mode;
15695fd9206a4e680bde995694cd8fb24c5685c6566plougher};
15795fd9206a4e680bde995694cd8fb24c5685c6566plougher
15895fd9206a4e680bde995694cd8fb24c5685c6566plougher
15995fd9206a4e680bde995694cd8fb24c5685c6566plougher/* Cache status struct.  Caches are used to keep
16095fd9206a4e680bde995694cd8fb24c5685c6566plougher  track of memory buffers passed between different threads */
16195fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct cache {
16295fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	max_buffers;
16395fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	count;
16495fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	buffer_size;
16595fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	wait_free;
16695fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	wait_pending;
16795fd9206a4e680bde995694cd8fb24c5685c6566plougher	pthread_mutex_t	mutex;
16895fd9206a4e680bde995694cd8fb24c5685c6566plougher	pthread_cond_t wait_for_free;
16995fd9206a4e680bde995694cd8fb24c5685c6566plougher	pthread_cond_t wait_for_pending;
17095fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct cache_entry *free_list;
17195fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct cache_entry *hash_table[65536];
17295fd9206a4e680bde995694cd8fb24c5685c6566plougher};
17395fd9206a4e680bde995694cd8fb24c5685c6566plougher
17495fd9206a4e680bde995694cd8fb24c5685c6566plougher/* struct describing a cache entry passed between threads */
17595fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct cache_entry {
17695fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct cache *cache;
17795fd9206a4e680bde995694cd8fb24c5685c6566plougher	long long block;
17895fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	size;
17995fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	used;
18095fd9206a4e680bde995694cd8fb24c5685c6566plougher	int error;
18195fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	pending;
18295fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct cache_entry *hash_next;
18395fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct cache_entry *hash_prev;
18495fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct cache_entry *free_next;
18595fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct cache_entry *free_prev;
18695fd9206a4e680bde995694cd8fb24c5685c6566plougher	char *data;
18795fd9206a4e680bde995694cd8fb24c5685c6566plougher};
18895fd9206a4e680bde995694cd8fb24c5685c6566plougher
18995fd9206a4e680bde995694cd8fb24c5685c6566plougher/* struct describing queues used to pass data between threads */
19095fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct queue {
19195fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	size;
19295fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	readp;
19395fd9206a4e680bde995694cd8fb24c5685c6566plougher	int	writep;
19495fd9206a4e680bde995694cd8fb24c5685c6566plougher	pthread_mutex_t	mutex;
19595fd9206a4e680bde995694cd8fb24c5685c6566plougher	pthread_cond_t empty;
19695fd9206a4e680bde995694cd8fb24c5685c6566plougher	pthread_cond_t full;
19795fd9206a4e680bde995694cd8fb24c5685c6566plougher	void **data;
19895fd9206a4e680bde995694cd8fb24c5685c6566plougher};
19995fd9206a4e680bde995694cd8fb24c5685c6566plougher
20095fd9206a4e680bde995694cd8fb24c5685c6566plougher/* default size of fragment buffer in Mbytes */
20195fd9206a4e680bde995694cd8fb24c5685c6566plougher#define FRAGMENT_BUFFER_DEFAULT 256
20295fd9206a4e680bde995694cd8fb24c5685c6566plougher/* default size of data buffer in Mbytes */
20395fd9206a4e680bde995694cd8fb24c5685c6566plougher#define DATA_BUFFER_DEFAULT 256
20495fd9206a4e680bde995694cd8fb24c5685c6566plougher
20595fd9206a4e680bde995694cd8fb24c5685c6566plougher#define DIR_ENT_SIZE	16
20695fd9206a4e680bde995694cd8fb24c5685c6566plougher
20795fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct dir_ent	{
20895fd9206a4e680bde995694cd8fb24c5685c6566plougher	char		name[SQUASHFS_NAME_LEN + 1];
20995fd9206a4e680bde995694cd8fb24c5685c6566plougher	unsigned int	start_block;
21095fd9206a4e680bde995694cd8fb24c5685c6566plougher	unsigned int	offset;
21195fd9206a4e680bde995694cd8fb24c5685c6566plougher	unsigned int	type;
21295fd9206a4e680bde995694cd8fb24c5685c6566plougher};
21395fd9206a4e680bde995694cd8fb24c5685c6566plougher
21495fd9206a4e680bde995694cd8fb24c5685c6566plougherstruct dir {
21595fd9206a4e680bde995694cd8fb24c5685c6566plougher	int		dir_count;
21695fd9206a4e680bde995694cd8fb24c5685c6566plougher	int 		cur_entry;
21795fd9206a4e680bde995694cd8fb24c5685c6566plougher	unsigned int	mode;
21895fd9206a4e680bde995694cd8fb24c5685c6566plougher	uid_t		uid;
21995fd9206a4e680bde995694cd8fb24c5685c6566plougher	gid_t		guid;
22095fd9206a4e680bde995694cd8fb24c5685c6566plougher	unsigned int	mtime;
22195fd9206a4e680bde995694cd8fb24c5685c6566plougher	struct dir_ent	*dirs;
22295fd9206a4e680bde995694cd8fb24c5685c6566plougher};
22395fd9206a4e680bde995694cd8fb24c5685c6566plougher
2246925e4e11525496401c9c7115f3077f26302739dplougherstruct file_entry {
2256925e4e11525496401c9c7115f3077f26302739dplougher	int offset;
2266925e4e11525496401c9c7115f3077f26302739dplougher	int size;
2276925e4e11525496401c9c7115f3077f26302739dplougher	struct cache_entry *buffer;
2286925e4e11525496401c9c7115f3077f26302739dplougher};
2296925e4e11525496401c9c7115f3077f26302739dplougher
2306925e4e11525496401c9c7115f3077f26302739dplougher
2316925e4e11525496401c9c7115f3077f26302739dplougherstruct squashfs_file {
2326925e4e11525496401c9c7115f3077f26302739dplougher	int fd;
2336925e4e11525496401c9c7115f3077f26302739dplougher	int blocks;
2346925e4e11525496401c9c7115f3077f26302739dplougher	long long file_size;
2356925e4e11525496401c9c7115f3077f26302739dplougher	int mode;
2366925e4e11525496401c9c7115f3077f26302739dplougher	uid_t uid;
2376925e4e11525496401c9c7115f3077f26302739dplougher	gid_t gid;
2386925e4e11525496401c9c7115f3077f26302739dplougher	time_t time;
2396925e4e11525496401c9c7115f3077f26302739dplougher	char *pathname;
2407f6692575a1b1c8d7d55afac647b72b84b79e378plougher	char sparse;
2416925e4e11525496401c9c7115f3077f26302739dplougher};
2426925e4e11525496401c9c7115f3077f26302739dplougher
243a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougherstruct path_entry {
244a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher	char *name;
245a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher	regex_t *preg;
246a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher	struct pathname *paths;
247a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher};
248a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher
249a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougherstruct pathname {
250a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher	int names;
251a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher	struct path_entry *name;
252a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher};
253a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher
254a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougherstruct pathnames {
255a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher	int count;
256a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher	struct pathname *path[0];
257a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher};
258a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher#define PATHS_ALLOC_SIZE 10
259a05c8638a9e2a2f84130980be899b5f1d16fbd1bplougher
26095fd9206a4e680bde995694cd8fb24c5685c6566plougher/* globals */
26184c327d76812010835b264430e47523f185dd7d6plougherextern struct super_block sBlk;
26295fd9206a4e680bde995694cd8fb24c5685c6566plougherextern squashfs_operations s_ops;
26395fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int swap;
26495fd9206a4e680bde995694cd8fb24c5685c6566plougherextern char *inode_table, *directory_table;
26595fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct hash_table_entry *inode_table_hash[65536], *directory_table_hash[65536];
26695fd9206a4e680bde995694cd8fb24c5685c6566plougherextern unsigned int *uid_table, *guid_table;
26795fd9206a4e680bde995694cd8fb24c5685c6566plougherextern pthread_mutex_t screen_mutex;
26895fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int progress_enabled;
26995fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int inode_number;
27095fd9206a4e680bde995694cd8fb24c5685c6566plougherextern int lookup_type[];
27195fd9206a4e680bde995694cd8fb24c5685c6566plougher
272c880d023e8b15ce1f66ec62363dd59a921f4d0c6plougher/* unsquashfs.c */
273413527e21393700a4c77b4e75d497ee3f7dc506dplougherextern int lookup_entry(struct hash_table_entry **, long long);
274c880d023e8b15ce1f66ec62363dd59a921f4d0c6plougher
27595fd9206a4e680bde995694cd8fb24c5685c6566plougher/* unsquash-1.c */
27695fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_block_list_1(unsigned int *, char *, int);
277ff61105632d8c1b2c29eb3dfa2cdc861c1039fb7plougherextern int read_fragment_table_1();
27895fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct inode *read_inode_1(unsigned int, unsigned int);
27995fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct dir *squashfs_opendir_1(unsigned int, unsigned int, struct inode **);
2803800aa66e882445b8c41c06e378dea8bd728fa3fplougherextern int read_uids_guids_1();
28195fd9206a4e680bde995694cd8fb24c5685c6566plougher
28295fd9206a4e680bde995694cd8fb24c5685c6566plougher/* unsquash-2.c */
28395fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_block_list_2(unsigned int *, char *, int);
284ff61105632d8c1b2c29eb3dfa2cdc861c1039fb7plougherextern int read_fragment_table_2();
28595fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_fragment_2(unsigned int, long long *, int *);
28695fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct inode *read_inode_2(unsigned int, unsigned int);
28795fd9206a4e680bde995694cd8fb24c5685c6566plougher
28895fd9206a4e680bde995694cd8fb24c5685c6566plougher/* unsquash-3.c */
289ff61105632d8c1b2c29eb3dfa2cdc861c1039fb7plougherextern int read_fragment_table_3();
29095fd9206a4e680bde995694cd8fb24c5685c6566plougherextern void read_fragment_3(unsigned int, long long *, int *);
29195fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct inode *read_inode_3(unsigned int, unsigned int);
29295fd9206a4e680bde995694cd8fb24c5685c6566plougherextern struct dir *squashfs_opendir_3(unsigned int, unsigned int, struct inode **);
2931e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougher
2941e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougher/* unsquash-4.c */
295ff61105632d8c1b2c29eb3dfa2cdc861c1039fb7plougherextern int read_fragment_table_4();
2961e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougherextern void read_fragment_4(unsigned int, long long *, int *);
2971e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougherextern struct inode *read_inode_4(unsigned int, unsigned int);
2981e6ec3a26c4fadffb8cd8bf611e49af3b359499cplougherextern struct dir *squashfs_opendir_4(unsigned int, unsigned int, struct inode **);
2993800aa66e882445b8c41c06e378dea8bd728fa3fplougherextern int read_uids_guids_4();
300