• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt/router/busybox/e2fsprogs/old_e2fsprogs/ext2fs/
1/* vi: set sw=4 ts=4: */
2/*
3 * ext2fs.h --- ext2fs
4 *
5 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
6 *
7 * %Begin-Header%
8 * This file may be redistributed under the terms of the GNU Public
9 * License.
10 * %End-Header%
11 */
12#ifndef EXT2FS_EXT2FS_H
13#define EXT2FS_EXT2FS_H 1
14
15
16#ifdef __GNUC__
17# define EXT2FS_ATTR(x) __attribute__(x)
18#else
19# define EXT2FS_ATTR(x)
20#endif
21
22#ifdef __cplusplus
23extern "C" {
24#endif
25
26/*
27 * Where the master copy of the superblock is located, and how big
28 * superblocks are supposed to be.  We define SUPERBLOCK_SIZE because
29 * the size of the superblock structure is not necessarily trustworthy
30 * (some versions have the padding set up so that the superblock is
31 * 1032 bytes long).
32 */
33#define SUPERBLOCK_OFFSET	1024
34#define SUPERBLOCK_SIZE		1024
35
36/*
37 * The last ext2fs revision level that this version of the library is
38 * able to support.
39 */
40#define EXT2_LIB_CURRENT_REV	EXT2_DYNAMIC_REV
41
42#ifdef HAVE_SYS_TYPES_H
43#include <sys/types.h>
44#endif
45
46#include <stdio.h>
47#include <stdlib.h>
48
49#include "../e2fsbb.h"
50#include "ext2_types.h"
51#include "ext2_fs.h"
52
53typedef __u32		ext2_ino_t;
54typedef __u32		blk_t;
55typedef __u32		dgrp_t;
56typedef __u32		ext2_off_t;
57typedef __s64		e2_blkcnt_t;
58typedef __u32		ext2_dirhash_t;
59
60#include "ext2_io.h"
61#include "ext2_err.h"
62
63typedef struct struct_ext2_filsys *ext2_filsys;
64
65struct ext2fs_struct_generic_bitmap {
66	errcode_t	magic;
67	ext2_filsys	fs;
68	__u32		start, end;
69	__u32		real_end;
70	char	*	description;
71	char	*	bitmap;
72	errcode_t	base_error_code;
73	__u32		reserved[7];
74};
75
76#define EXT2FS_MARK_ERROR	0
77#define EXT2FS_UNMARK_ERROR	1
78#define EXT2FS_TEST_ERROR	2
79
80typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap;
81typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap;
82typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
83
84#define EXT2_FIRST_INODE(s)	EXT2_FIRST_INO(s)
85
86/*
87 * badblocks list definitions
88 */
89
90typedef struct ext2_struct_u32_list *ext2_badblocks_list;
91typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate;
92
93typedef struct ext2_struct_u32_list *ext2_u32_list;
94typedef struct ext2_struct_u32_iterate *ext2_u32_iterate;
95
96/* old */
97typedef struct ext2_struct_u32_list *badblocks_list;
98typedef struct ext2_struct_u32_iterate *badblocks_iterate;
99
100#define BADBLOCKS_FLAG_DIRTY	1
101
102/*
103 * ext2_dblist structure and abstractions (see dblist.c)
104 */
105struct ext2_db_entry {
106	ext2_ino_t	ino;
107	blk_t	blk;
108	int	blockcnt;
109};
110
111typedef struct ext2_struct_dblist *ext2_dblist;
112
113#define DBLIST_ABORT	1
114
115/*
116 * ext2_fileio definitions
117 */
118
119#define EXT2_FILE_WRITE		0x0001
120#define EXT2_FILE_CREATE	0x0002
121
122#define EXT2_FILE_MASK		0x00FF
123
124#define EXT2_FILE_BUF_DIRTY	0x4000
125#define EXT2_FILE_BUF_VALID	0x2000
126
127typedef struct ext2_file *ext2_file_t;
128
129#define EXT2_SEEK_SET	0
130#define EXT2_SEEK_CUR	1
131#define EXT2_SEEK_END	2
132
133/*
134 * Flags for the ext2_filsys structure and for ext2fs_open()
135 */
136#define EXT2_FLAG_RW			0x01
137#define EXT2_FLAG_CHANGED		0x02
138#define EXT2_FLAG_DIRTY			0x04
139#define EXT2_FLAG_VALID			0x08
140#define EXT2_FLAG_IB_DIRTY		0x10
141#define EXT2_FLAG_BB_DIRTY		0x20
142#define EXT2_FLAG_SWAP_BYTES		0x40
143#define EXT2_FLAG_SWAP_BYTES_READ	0x80
144#define EXT2_FLAG_SWAP_BYTES_WRITE	0x100
145#define EXT2_FLAG_MASTER_SB_ONLY	0x200
146#define EXT2_FLAG_FORCE			0x400
147#define EXT2_FLAG_SUPER_ONLY		0x800
148#define EXT2_FLAG_JOURNAL_DEV_OK	0x1000
149#define EXT2_FLAG_IMAGE_FILE		0x2000
150
151/*
152 * Special flag in the ext2 inode i_flag field that means that this is
153 * a new inode.  (So that ext2_write_inode() can clear extra fields.)
154 */
155#define EXT2_NEW_INODE_FL	0x80000000
156
157/*
158 * Flags for mkjournal
159 *
160 * EXT2_MKJOURNAL_V1_SUPER	Make a (deprecated) V1 journal superblock
161 */
162#define EXT2_MKJOURNAL_V1_SUPER	0x0000001
163
164struct struct_ext2_filsys {
165	errcode_t			magic;
166	io_channel			io;
167	int				flags;
168	char *				device_name;
169	struct ext2_super_block	*	super;
170	unsigned int			blocksize;
171	int				fragsize;
172	dgrp_t				group_desc_count;
173	unsigned long			desc_blocks;
174	struct ext2_group_desc *	group_desc;
175	int				inode_blocks_per_group;
176	ext2fs_inode_bitmap		inode_map;
177	ext2fs_block_bitmap		block_map;
178	errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
179	errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
180	errcode_t (*write_bitmaps)(ext2_filsys fs);
181	errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino,
182				struct ext2_inode *inode);
183	errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
184				struct ext2_inode *inode);
185	ext2_badblocks_list		badblocks;
186	ext2_dblist			dblist;
187	__u32				stride;	/* for mke2fs */
188	struct ext2_super_block *	orig_super;
189	struct ext2_image_hdr *		image_header;
190	__u32				umask;
191	/*
192	 * Reserved for future expansion
193	 */
194	__u32				reserved[8];
195
196	/*
197	 * Reserved for the use of the calling application.
198	 */
199	void *				priv_data;
200
201	/*
202	 * Inode cache
203	 */
204	struct ext2_inode_cache		*icache;
205	io_channel			image_io;
206};
207
208#include "bitops.h"
209
210/*
211 * Return flags for the block iterator functions
212 */
213#define BLOCK_CHANGED	1
214#define BLOCK_ABORT	2
215#define BLOCK_ERROR	4
216
217/*
218 * Block interate flags
219 *
220 * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
221 * function should be called on blocks where the block number is zero.
222 * This is used by ext2fs_expand_dir() to be able to add a new block
223 * to an inode.  It can also be used for programs that want to be able
224 * to deal with files that contain "holes".
225 *
226 * BLOCK_FLAG_TRAVERSE indicates that the iterator function for the
227 * indirect, doubly indirect, etc. blocks should be called after all
228 * of the blocks containined in the indirect blocks are processed.
229 * This is useful if you are going to be deallocating blocks from an
230 * inode.
231 *
232 * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
233 * called for data blocks only.
234 *
235 * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
236 * ext2fs_block_iterate2 that large files won't be accepted.
237 */
238#define BLOCK_FLAG_APPEND	1
239#define BLOCK_FLAG_HOLE		1
240#define BLOCK_FLAG_DEPTH_TRAVERSE	2
241#define BLOCK_FLAG_DATA_ONLY	4
242
243#define BLOCK_FLAG_NO_LARGE	0x1000
244
245/*
246 * Magic "block count" return values for the block iterator function.
247 */
248#define BLOCK_COUNT_IND		(-1)
249#define BLOCK_COUNT_DIND	(-2)
250#define BLOCK_COUNT_TIND	(-3)
251#define BLOCK_COUNT_TRANSLATOR	(-4)
252
253#if 0
254/*
255 * Flags for ext2fs_move_blocks
256 */
257#define EXT2_BMOVE_GET_DBLIST	0x0001
258#define EXT2_BMOVE_DEBUG	0x0002
259#endif
260
261/*
262 * Flags for directory block reading and writing functions
263 */
264#define EXT2_DIRBLOCK_V2_STRUCT	0x0001
265
266/*
267 * Return flags for the directory iterator functions
268 */
269#define DIRENT_CHANGED	1
270#define DIRENT_ABORT	2
271#define DIRENT_ERROR	3
272
273/*
274 * Directory iterator flags
275 */
276
277#define DIRENT_FLAG_INCLUDE_EMPTY	1
278#define DIRENT_FLAG_INCLUDE_REMOVED	2
279
280#define DIRENT_DOT_FILE		1
281#define DIRENT_DOT_DOT_FILE	2
282#define DIRENT_OTHER_FILE	3
283#define DIRENT_DELETED_FILE	4
284
285/*
286 * Inode scan definitions
287 */
288typedef struct ext2_struct_inode_scan *ext2_inode_scan;
289
290/*
291 * ext2fs_scan flags
292 */
293#define EXT2_SF_CHK_BADBLOCKS	0x0001
294#define EXT2_SF_BAD_INODE_BLK	0x0002
295#define EXT2_SF_BAD_EXTRA_BYTES	0x0004
296#define EXT2_SF_SKIP_MISSING_ITABLE	0x0008
297
298/*
299 * ext2fs_check_if_mounted flags
300 */
301#define EXT2_MF_MOUNTED		1
302#define EXT2_MF_ISROOT		2
303#define EXT2_MF_READONLY	4
304#define EXT2_MF_SWAP		8
305#define EXT2_MF_BUSY		16
306
307/*
308 * Ext2/linux mode flags.  We define them here so that we don't need
309 * to depend on the OS's sys/stat.h, since we may be compiling on a
310 * non-Linux system.
311 */
312#define LINUX_S_IFMT  00170000
313#define LINUX_S_IFSOCK 0140000
314#define LINUX_S_IFLNK	 0120000
315#define LINUX_S_IFREG  0100000
316#define LINUX_S_IFBLK  0060000
317#define LINUX_S_IFDIR  0040000
318#define LINUX_S_IFCHR  0020000
319#define LINUX_S_IFIFO  0010000
320#define LINUX_S_ISUID  0004000
321#define LINUX_S_ISGID  0002000
322#define LINUX_S_ISVTX  0001000
323
324#define LINUX_S_IRWXU 00700
325#define LINUX_S_IRUSR 00400
326#define LINUX_S_IWUSR 00200
327#define LINUX_S_IXUSR 00100
328
329#define LINUX_S_IRWXG 00070
330#define LINUX_S_IRGRP 00040
331#define LINUX_S_IWGRP 00020
332#define LINUX_S_IXGRP 00010
333
334#define LINUX_S_IRWXO 00007
335#define LINUX_S_IROTH 00004
336#define LINUX_S_IWOTH 00002
337#define LINUX_S_IXOTH 00001
338
339#define LINUX_S_ISLNK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
340#define LINUX_S_ISREG(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
341#define LINUX_S_ISDIR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
342#define LINUX_S_ISCHR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
343#define LINUX_S_ISBLK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
344#define LINUX_S_ISFIFO(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
345#define LINUX_S_ISSOCK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
346
347/*
348 * ext2 size of an inode
349 */
350#define EXT2_I_SIZE(i)	((i)->i_size | ((__u64) (i)->i_size_high << 32))
351
352/*
353 * ext2_icount_t abstraction
354 */
355#define EXT2_ICOUNT_OPT_INCREMENT	0x01
356
357typedef struct ext2_icount *ext2_icount_t;
358
359/*
360 * Flags for ext2fs_bmap
361 */
362#define BMAP_ALLOC	0x0001
363#define BMAP_SET	0x0002
364
365/*
366 * Flags for imager.c functions
367 */
368#define IMAGER_FLAG_INODEMAP	1
369#define IMAGER_FLAG_SPARSEWRITE	2
370
371/*
372 * For checking structure magic numbers...
373 */
374
375#define EXT2_CHECK_MAGIC(struct, code) \
376	  if ((struct)->magic != (code)) return (code)
377
378
379/*
380 * For ext2 compression support
381 */
382#define EXT2FS_COMPRESSED_BLKADDR ((blk_t) 0xffffffff)
383#define HOLE_BLKADDR(_b) ((_b) == 0 || (_b) == EXT2FS_COMPRESSED_BLKADDR)
384
385/*
386 * Features supported by this version of the library
387 */
388#define EXT2_LIB_FEATURE_COMPAT_SUPP	(EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
389					 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
390					 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
391					 EXT2_FEATURE_COMPAT_RESIZE_INODE|\
392					 EXT2_FEATURE_COMPAT_DIR_INDEX|\
393					 EXT2_FEATURE_COMPAT_EXT_ATTR)
394
395/* This #ifdef is temporary until compression is fully supported */
396#ifdef ENABLE_COMPRESSION
397#ifndef I_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL
398/* If the below warning bugs you, then have
399   `CPPFLAGS=-DI_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL' in your
400   environment at configure time. */
401 #warning "Compression support is experimental"
402#endif
403#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
404					 EXT2_FEATURE_INCOMPAT_COMPRESSION|\
405					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
406					 EXT2_FEATURE_INCOMPAT_META_BG|\
407					 EXT3_FEATURE_INCOMPAT_RECOVER)
408#else
409#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
410					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
411					 EXT2_FEATURE_INCOMPAT_META_BG|\
412					 EXT3_FEATURE_INCOMPAT_RECOVER)
413#endif
414#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP	(EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
415					 EXT2_FEATURE_RO_COMPAT_LARGE_FILE)
416/*
417 * function prototypes
418 */
419
420/* alloc.c */
421extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
422				  ext2fs_inode_bitmap map, ext2_ino_t *ret);
423extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
424				  ext2fs_block_bitmap map, blk_t *ret);
425extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
426					blk_t finish, int num,
427					ext2fs_block_bitmap map,
428					blk_t *ret);
429extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
430				    char *block_buf, blk_t *ret);
431
432/* alloc_sb.c */
433extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
434					dgrp_t group,
435					ext2fs_block_bitmap bmap);
436
437/* alloc_stats.c */
438void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
439void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
440			       int inuse, int isdir);
441void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);
442
443/* alloc_tables.c */
444extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
445extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
446					     ext2fs_block_bitmap bmap);
447
448/* badblocks.c */
449extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
450extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
451extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
452extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
453extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
454					       ext2_u32_iterate *ret);
455extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
456extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
457extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
458extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
459
460extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
461					    int size);
462extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
463					   blk_t blk);
464extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
465				    blk_t blk);
466extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
467extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
468extern errcode_t
469	ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
470					    ext2_badblocks_iterate *ret);
471extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
472					 blk_t *blk);
473extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
474extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
475				       ext2_badblocks_list *dest);
476extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
477				  ext2_badblocks_list bb2);
478extern int ext2fs_u32_list_count(ext2_u32_list bb);
479
480/* bb_compat */
481extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
482extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
483extern int badblocks_list_test(badblocks_list bb, blk_t blk);
484extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
485					      badblocks_iterate *ret);
486extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
487extern void badblocks_list_iterate_end(badblocks_iterate iter);
488extern void badblocks_list_free(badblocks_list bb);
489
490/* bb_inode.c */
491extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
492					ext2_badblocks_list bb_list);
493
494/* bitmaps.c */
495extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
496extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
497extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
498extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
499extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
500						__u32 end,
501						__u32 real_end,
502						const char *descr,
503						ext2fs_generic_bitmap *ret);
504extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
505					      const char *descr,
506					      ext2fs_block_bitmap *ret);
507extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
508					      const char *descr,
509					      ext2fs_inode_bitmap *ret);
510extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
511					       ext2_ino_t end, ext2_ino_t *oend);
512extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
513					       blk_t end, blk_t *oend);
514extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
515extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
516extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
517extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
518
519/* block.c */
520extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
521				      ext2_ino_t	ino,
522				      int	flags,
523				      char *block_buf,
524				      int (*func)(ext2_filsys fs,
525						  blk_t	*blocknr,
526						  int	blockcnt,
527						  void	*priv_data),
528				      void *priv_data);
529errcode_t ext2fs_block_iterate2(ext2_filsys fs,
530				ext2_ino_t	ino,
531				int	flags,
532				char *block_buf,
533				int (*func)(ext2_filsys fs,
534					    blk_t	*blocknr,
535					    e2_blkcnt_t	blockcnt,
536					    blk_t	ref_blk,
537					    int		ref_offset,
538					    void	*priv_data),
539				void *priv_data);
540
541/* bmap.c */
542extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
543			     struct ext2_inode *inode,
544			     char *block_buf, int bmap_flags,
545			     blk_t block, blk_t *phys_blk);
546
547
548#if 0
549/* bmove.c */
550extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
551				    ext2fs_block_bitmap reserve,
552				    ext2fs_block_bitmap alloc_map,
553				    int flags);
554#endif
555
556/* check_desc.c */
557extern errcode_t ext2fs_check_desc(ext2_filsys fs);
558
559/* closefs.c */
560extern errcode_t ext2fs_close(ext2_filsys fs);
561extern errcode_t ext2fs_flush(ext2_filsys fs);
562extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
563extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
564				    dgrp_t group,
565				    blk_t *ret_super_blk,
566				    blk_t *ret_old_desc_blk,
567				    blk_t *ret_new_desc_blk,
568				    int *ret_meta_bg);
569extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
570
571/* cmp_bitmaps.c */
572extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
573					     ext2fs_block_bitmap bm2);
574extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
575					     ext2fs_inode_bitmap bm2);
576
577/* dblist.c */
578
579extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
580extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
581extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
582				      blk_t blk, int blockcnt);
583extern void ext2fs_dblist_sort(ext2_dblist dblist,
584			       int (*sortfunc)(const void *,
585							   const void *));
586extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
587	int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
588		    void	*priv_data),
589       void *priv_data);
590extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
591				      blk_t blk, int blockcnt);
592extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
593				    ext2_dblist *dest);
594extern int ext2fs_dblist_count(ext2_dblist dblist);
595
596/* dblist_dir.c */
597extern errcode_t
598	ext2fs_dblist_dir_iterate(ext2_dblist dblist,
599				  int	flags,
600				  char	*block_buf,
601				  int (*func)(ext2_ino_t	dir,
602					      int		entry,
603					      struct ext2_dir_entry *dirent,
604					      int	offset,
605					      int	blocksize,
606					      char	*buf,
607					      void	*priv_data),
608				  void *priv_data);
609
610/* dirblock.c */
611extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
612				       void *buf);
613extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
614					void *buf, int flags);
615extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
616					void *buf);
617extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
618					 void *buf, int flags);
619
620/* dirhash.c */
621extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
622				const __u32 *seed,
623				ext2_dirhash_t *ret_hash,
624				ext2_dirhash_t *ret_minor_hash);
625
626
627/* dir_iterate.c */
628extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
629			      ext2_ino_t dir,
630			      int flags,
631			      char *block_buf,
632			      int (*func)(struct ext2_dir_entry *dirent,
633					  int	offset,
634					  int	blocksize,
635					  char	*buf,
636					  void	*priv_data),
637			      void *priv_data);
638extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
639			      ext2_ino_t dir,
640			      int flags,
641			      char *block_buf,
642			      int (*func)(ext2_ino_t	dir,
643					  int	entry,
644					  struct ext2_dir_entry *dirent,
645					  int	offset,
646					  int	blocksize,
647					  char	*buf,
648					  void	*priv_data),
649			      void *priv_data);
650
651/* dupfs.c */
652extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
653
654/* expanddir.c */
655extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
656
657/* ext_attr.c */
658extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
659extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
660				       void *buf);
661extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
662					   char *block_buf,
663					   int adjust, __u32 *newcount);
664
665/* fileio.c */
666extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
667				   struct ext2_inode *inode,
668				   int flags, ext2_file_t *ret);
669extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
670				  int flags, ext2_file_t *ret);
671extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
672extern errcode_t ext2fs_file_close(ext2_file_t file);
673extern errcode_t ext2fs_file_flush(ext2_file_t file);
674extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
675				  unsigned int wanted, unsigned int *got);
676extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
677				   unsigned int nbytes, unsigned int *written);
678extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
679				   int whence, __u64 *ret_pos);
680extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
681				   int whence, ext2_off_t *ret_pos);
682errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
683extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
684extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
685
686/* finddev.c */
687extern char *ext2fs_find_block_device(dev_t device);
688
689/* flushb.c */
690extern errcode_t ext2fs_sync_device(int fd, int flushb);
691
692/* freefs.c */
693extern void ext2fs_free(ext2_filsys fs);
694extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
695extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
696extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
697extern void ext2fs_free_dblist(ext2_dblist dblist);
698extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
699extern void ext2fs_u32_list_free(ext2_u32_list bb);
700
701/* getsize.c */
702extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
703					blk_t *retblocks);
704
705/* getsectsize.c */
706errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
707
708/* imager.c */
709extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
710extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
711extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
712extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
713extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
714extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
715
716/* ind_block.c */
717errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
718errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);
719
720/* initialize.c */
721extern errcode_t ext2fs_initialize(const char *name, int flags,
722				   struct ext2_super_block *param,
723				   io_manager manager, ext2_filsys *ret_fs);
724
725/* icount.c */
726extern void ext2fs_free_icount(ext2_icount_t icount);
727extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
728				       unsigned int size,
729				       ext2_icount_t hint, ext2_icount_t *ret);
730extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
731				      unsigned int size,
732				      ext2_icount_t *ret);
733extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
734				     __u16 *ret);
735extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
736					 __u16 *ret);
737extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
738					 __u16 *ret);
739extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
740				     __u16 count);
741extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
742errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
743
744/* inode.c */
745extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
746extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
747					    ext2_ino_t *ino,
748					    struct ext2_inode *inode,
749					    int bufsize);
750extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
751				  ext2_inode_scan *ret_scan);
752extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
753extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
754			       struct ext2_inode *inode);
755extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
756						   int	group);
757extern void ext2fs_set_inode_callback
758	(ext2_inode_scan scan,
759	 errcode_t (*done_group)(ext2_filsys fs,
760				 dgrp_t group,
761				 void * priv_data),
762	 void *done_group_data);
763extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
764				   int clear_flags);
765extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
766					struct ext2_inode * inode,
767					int bufsize);
768extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
769			    struct ext2_inode * inode);
770extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
771					 struct ext2_inode * inode,
772					 int bufsize);
773extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
774			    struct ext2_inode * inode);
775extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
776			    struct ext2_inode * inode);
777extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
778extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
779
780/* inode_io.c */
781extern io_manager inode_io_manager;
782extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
783					char **name);
784extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
785					 struct ext2_inode *inode,
786					 char **name);
787
788/* ismounted.c */
789extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
790extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
791					  char *mtpt, int mtlen);
792
793/* namei.c */
794extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
795			 int namelen, char *buf, ext2_ino_t *inode);
796extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
797			const char *name, ext2_ino_t *inode);
798errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
799			      const char *name, ext2_ino_t *inode);
800extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
801			ext2_ino_t inode, ext2_ino_t *res_inode);
802
803/* native.c */
804int ext2fs_native_flag(void);
805
806/* newdir.c */
807extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
808				ext2_ino_t parent_ino, char **block);
809
810/* mkdir.c */
811extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
812			      const char *name);
813
814/* mkjournal.c */
815extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
816						  __u32 size, int flags,
817						  char  **ret_jsb);
818extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
819					   ext2_filsys journal_dev);
820extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t size,
821					  int flags);
822
823/* openfs.c */
824extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
825			     unsigned int block_size, io_manager manager,
826			     ext2_filsys *ret_fs);
827extern errcode_t ext2fs_open2(const char *name, const char *io_options,
828			      int flags, int superblock,
829			      unsigned int block_size, io_manager manager,
830			      ext2_filsys *ret_fs);
831extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
832					 dgrp_t i);
833errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
834errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
835errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
836
837/* get_pathname.c */
838extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
839			       char **name);
840
841/* link.c */
842errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
843		      ext2_ino_t ino, int flags);
844errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
845			ext2_ino_t ino, int flags);
846
847/* read_bb.c */
848extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
849				      ext2_badblocks_list *bb_list);
850
851/* read_bb_file.c */
852extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
853				      ext2_badblocks_list *bb_list,
854				      void *priv_data,
855				      void (*invalid)(ext2_filsys fs,
856						      blk_t blk,
857						      char *badstr,
858						      void *priv_data));
859extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
860				     ext2_badblocks_list *bb_list,
861				     void (*invalid)(ext2_filsys fs,
862						     blk_t blk));
863
864/* res_gdt.c */
865extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
866
867/* rs_bitmap.c */
868extern errcode_t ext2fs_resize_generic_bitmap(__u32 new_end,
869					      __u32 new_real_end,
870					      ext2fs_generic_bitmap bmap);
871extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
872					    ext2fs_inode_bitmap bmap);
873extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
874					    ext2fs_block_bitmap bmap);
875extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
876				    ext2fs_generic_bitmap *dest);
877
878/* swapfs.c */
879extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
880				 int has_header);
881extern void ext2fs_swap_super(struct ext2_super_block * super);
882extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
883extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
884				   struct ext2_inode_large *f, int hostorder,
885				   int bufsize);
886extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
887			      struct ext2_inode *f, int hostorder);
888
889/* valid_blk.c */
890extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
891
892/* version.c */
893extern int ext2fs_parse_version_string(const char *ver_string);
894extern int ext2fs_get_library_version(const char **ver_string,
895				      const char **date_string);
896
897/* write_bb_file.c */
898extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
899				      unsigned int flags,
900				      FILE *f);
901
902
903/* inline functions */
904extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
905extern errcode_t ext2fs_free_mem(void *ptr);
906extern errcode_t ext2fs_resize_mem(unsigned long old_size,
907				   unsigned long size, void *ptr);
908extern void ext2fs_mark_super_dirty(ext2_filsys fs);
909extern void ext2fs_mark_changed(ext2_filsys fs);
910extern int ext2fs_test_changed(ext2_filsys fs);
911extern void ext2fs_mark_valid(ext2_filsys fs);
912extern void ext2fs_unmark_valid(ext2_filsys fs);
913extern int ext2fs_test_valid(ext2_filsys fs);
914extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
915extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
916extern int ext2fs_test_ib_dirty(ext2_filsys fs);
917extern int ext2fs_test_bb_dirty(ext2_filsys fs);
918extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
919extern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
920extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
921				      struct ext2_inode *inode);
922
923#ifdef __cplusplus
924}
925#endif
926
927#endif
928