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