1#ifndef MKSQUASHFS_H
2#define MKSQUASHFS_H
3/*
4 * Squashfs
5 *
6 * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
7 * 2012, 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 * mksquashfs.h
25 *
26 */
27
28struct dir_info {
29	char			*pathname;
30	char			*subpath;
31	unsigned int		count;
32	unsigned int		directory_count;
33	int			depth;
34	unsigned int		excluded;
35	char			dir_is_ldir;
36	struct dir_ent		*dir_ent;
37	struct dir_ent		*list;
38	DIR			*linuxdir;
39};
40
41struct dir_ent {
42	char			*name;
43	char			*source_name;
44	char			*nonstandard_pathname;
45	struct inode_info	*inode;
46	struct dir_info		*dir;
47	struct dir_info		*our_dir;
48	struct dir_ent		*next;
49};
50
51struct inode_info {
52	struct stat		buf;
53	struct inode_info	*next;
54	squashfs_inode		inode;
55	unsigned int		inode_number;
56	unsigned int		nlink;
57	int			pseudo_id;
58	char			type;
59	char			read;
60	char			root_entry;
61	char			pseudo_file;
62	char			no_fragments;
63	char			always_use_fragments;
64	char			noD;
65	char			noF;
66	char			symlink[0];
67};
68
69/* in memory file info */
70struct file_info {
71	long long		file_size;
72	long long		bytes;
73	long long		start;
74	unsigned int		*block_list;
75	struct file_info	*next;
76	struct fragment		*fragment;
77	unsigned short		checksum;
78	unsigned short		fragment_checksum;
79	char			have_frag_checksum;
80	char			have_checksum;
81};
82
83/* fragment block data structures */
84struct fragment {
85	unsigned int		index;
86	int			offset;
87	int			size;
88};
89
90/* in memory uid tables */
91#define ID_ENTRIES 256
92#define ID_HASH(id) (id & (ID_ENTRIES - 1))
93#define ISA_UID 1
94#define ISA_GID 2
95
96struct id {
97	unsigned int id;
98	int	index;
99	char	flags;
100	struct id *next;
101};
102
103/* fragment to file mapping used when appending */
104struct append_file {
105	struct file_info *file;
106	struct append_file *next;
107};
108
109#define PSEUDO_FILE_OTHER	1
110#define PSEUDO_FILE_PROCESS	2
111
112#define IS_PSEUDO(a)		((a)->pseudo_file)
113#define IS_PSEUDO_PROCESS(a)	((a)->pseudo_file & PSEUDO_FILE_PROCESS)
114#define IS_PSEUDO_OTHER(a)	((a)->pseudo_file & PSEUDO_FILE_OTHER)
115
116/*
117 * Amount of physical memory to use by default, and the default queue
118 * ratios
119 */
120#define SQUASHFS_TAKE 4
121#define SQUASHFS_READQ_MEM 4
122#define SQUASHFS_BWRITEQ_MEM 4
123#define SQUASHFS_FWRITEQ_MEM 4
124
125/*
126 * Lowest amount of physical memory considered viable for Mksquashfs
127 * to run in Mbytes
128 */
129#define SQUASHFS_LOWMEM 64
130
131/* offset of data in compressed metadata blocks (allowing room for
132 * compressed size */
133#define BLOCK_OFFSET 2
134
135extern struct cache *reader_buffer, *fragment_buffer, *reserve_cache;
136struct cache *bwriter_buffer, *fwriter_buffer;
137extern struct queue *to_reader, *to_deflate, *to_writer, *from_writer,
138	*to_frag, *locked_fragment, *to_process_frag;
139extern struct append_file **file_mapping;
140extern struct seq_queue *to_main;
141extern pthread_mutex_t fragment_mutex, dup_mutex;
142extern struct squashfs_fragment_entry *fragment_table;
143extern struct compressor *comp;
144extern int block_size;
145extern struct file_info *dupl[];
146extern int read_fs_bytes(int, long long, int, void *);
147extern void add_file(long long, long long, long long, unsigned int *, int,
148	unsigned int, int, int);
149extern struct id *create_id(unsigned int);
150extern unsigned int get_uid(unsigned int);
151extern unsigned int get_guid(unsigned int);
152extern int read_bytes(int, void *, int);
153extern unsigned short get_checksum_mem(char *, int);
154#endif
155