home *** CD-ROM | disk | FTP | other *** search
- /*
- * ext2fs.h --- ext2fs
- *
- * Copyright (C) 1993 Theodore Ts'o. This file may be redistributed
- * under the terms of the GNU Public License.
- */
-
- /*
- * Where the master copy of the superblock is located, and how big
- * superblocks are supposed to be. We define SUPERBLOCK_SIZE because
- * the size of the superblock structure is not necessarily trustworthy
- * (some versions have the padding set up so that the superblock is
- * 1032 bytes long).
- */
- #define SUPERBLOCK_OFFSET 1024
- #define SUPERBLOCK_SIZE 1024
-
- /*
- * The last ext2fs revision level that this version of the library is
- * able to support.
- */
- #define EXT2_LIB_CURRENT_REV 0
-
- typedef unsigned long blk_t;
- typedef unsigned int dgrp_t;
-
- #include "com_err.h"
- #include "ext2fs/io.h"
- #include "ext2fs/ext2_err.h"
-
- typedef struct struct_ext2_filsys *ext2_filsys;
-
- struct ext2fs_struct_inode_bitmap {
- int magic;
- ext2_filsys fs;
- ino_t start, end;
- ino_t real_end;
- char *description;
- char *bitmap;
- int reserved[8];
- };
-
- typedef struct ext2fs_struct_inode_bitmap *ext2fs_inode_bitmap;
-
- struct ext2fs_struct_block_bitmap {
- int magic;
- ext2_filsys fs;
- blk_t start, end;
- ino_t real_end;
- char *description;
- char *bitmap;
- int reserved[8];
- };
-
- typedef struct ext2fs_struct_block_bitmap *ext2fs_block_bitmap;
-
- /*
- * Flags for the ext2_filsys structure
- */
-
- #define EXT2_FLAG_RW 0x01
- #define EXT2_FLAG_CHANGED 0x02
- #define EXT2_FLAG_DIRTY 0x04
- #define EXT2_FLAG_VALID 0x08
- #define EXT2_FLAG_IB_DIRTY 0x10
- #define EXT2_FLAG_BB_DIRTY 0x20
-
- struct struct_ext2_filsys {
- int magic;
- io_channel io;
- int flags;
- char * device_name;
- struct ext2_super_block * super;
- int blocksize;
- int fragsize;
- unsigned long group_desc_count;
- unsigned long desc_blocks;
- struct ext2_group_desc * group_desc;
- int inode_blocks_per_group;
- ext2fs_inode_bitmap inode_map;
- ext2fs_block_bitmap block_map;
- errcode_t (*get_blocks)(ext2_filsys fs, ino_t ino, blk_t *blocks);
- errcode_t (*check_directory)(ext2_filsys fs, ino_t ino);
- errcode_t (*write_bitmaps)(ext2_filsys fs);
- int reserved[16];
-
- /*
- * Not used by ext2fs library; reserved for the use of the
- * calling application.
- */
- void * private;
- };
-
- /*
- * badblocks list definitions
- */
-
- typedef struct struct_badblocks_list *badblocks_list;
-
- struct struct_badblocks_list {
- int magic;
- int num;
- int size;
- blk_t *list;
- int badblocks_flags;
- int reserved[8];
- };
-
- #define BADBLOCKS_FLAG_DIRTY 1
-
- typedef struct struct_badblocks_iterate *badblocks_iterate;
-
- struct struct_badblocks_iterate {
- int magic;
- badblocks_list bb;
- int ptr;
- int reserved[8];
- };
-
- #include "ext2fs/bitops.h"
-
- /*
- * Return flags for the block iterator functions
- */
- #define BLOCK_CHANGED 1
- #define BLOCK_ABORT 2
- #define BLOCK_ERROR 4
-
- /*
- * Block interate flags
- */
- #define BLOCK_FLAG_APPEND 1
- #define BLOCK_FLAG_DEPTH_TRAVERSE 2
-
- /*
- * Return flags for the directory iterator functions
- */
- #define DIRENT_CHANGED 1
- #define DIRENT_ABORT 2
- #define DIRENT_ERROR 3
-
- /*
- * Directory iterator flags
- */
-
- #define DIRENT_FLAG_INCLUDE_EMPTY 1
-
- /*
- * Inode scan definitions
- */
- struct ext2_struct_inode_scan {
- int magic;
- ext2_filsys fs;
- ino_t current_inode;
- blk_t current_block;
- dgrp_t current_group;
- int inodes_left, blocks_left, groups_left;
- int inode_buffer_blocks;
- char * inode_buffer;
- struct ext2_inode * inode_scan_ptr;
- int reserved[8];
- };
-
- typedef struct ext2_struct_inode_scan *ext2_inode_scan;
-
- /*
- * For checking structure magic numbers...
- */
-
- #define EXT2_CHECK_MAGIC(struct, code) \
- if ((struct)->magic != (code)) return (code)
-
- /*
- * function prototypes
- */
-
- /* alloc.c */
- extern errcode_t ext2fs_new_inode(ext2_filsys fs, ino_t dir, int mode,
- ext2fs_inode_bitmap map, ino_t *ret);
- extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
- ext2fs_block_bitmap map, blk_t *ret);
- extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
- blk_t finish, int num,
- ext2fs_block_bitmap map,
- blk_t *ret);
-
- /* badblocks.c */
- extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
- extern void badblocks_list_free(badblocks_list bb);
- extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
- extern int badblocks_list_test(badblocks_list bb, blk_t blk);
- extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
- badblocks_iterate *ret);
- extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
- extern void badblocks_list_iterate_end(badblocks_iterate iter);
-
- /* bb_inode.c */
- extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
- badblocks_list bb_list);
-
- /* bitmaps.c */
- extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
- extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
- extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
- extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
- errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
- const char *descr,
- ext2fs_block_bitmap *ret);
- errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
- const char *descr,
- ext2fs_inode_bitmap *ret);
- errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
- ino_t end, ino_t *oend);
- errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
- blk_t end, blk_t *oend);
- void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
- void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
- void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
- void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
- extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
- extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
-
- /* block.c */
- extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
- ino_t ino,
- int flags,
- char *block_buf,
- int (*func)(ext2_filsys fs,
- blk_t *blocknr,
- int blockcnt,
- void *private),
- void *private);
-
- /* check_desc.c */
- extern errcode_t ext2fs_check_desc(ext2_filsys fs);
-
- /* closefs.c */
- extern errcode_t ext2fs_close(ext2_filsys fs);
- extern errcode_t ext2fs_flush(ext2_filsys fs);
-
- /* expanddir.c */
- extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ino_t dir);
-
- /* freefs.c */
- extern void ext2fs_free(ext2_filsys fs);
-
- /* initialize.c */
- extern errcode_t ext2fs_initialize(const char *name, int flags,
- struct ext2_super_block *param,
- io_manager manager, ext2_filsys *ret_fs);
-
- /* inode.c */
- extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
- ext2_inode_scan *ret_scan);
- extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
- extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ino_t *ino,
- struct ext2_inode *inode);
- extern errcode_t ext2fs_read_inode (ext2_filsys fs, unsigned long ino,
- struct ext2_inode * inode);
- extern errcode_t ext2fs_write_inode(ext2_filsys fs, unsigned long ino,
- struct ext2_inode * inode);
- extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ino_t ino, blk_t *blocks);
- extern errcode_t ext2fs_check_directory(ext2_filsys fs, ino_t ino);
-
- /* namei.c */
- extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
- ino_t dir,
- int flags,
- char *block_buf,
- int (*func)(struct ext2_dir_entry *dirent,
- int offset,
- int blocksize,
- char *buf,
- void *private),
- void *private);
- extern errcode_t ext2fs_lookup(ext2_filsys fs, ino_t dir, const char *name,
- int namelen, char *buf, ino_t *inode);
- extern errcode_t ext2fs_namei(ext2_filsys fs, ino_t root, ino_t cwd,
- const char *name, ino_t *inode);
-
- /* newdir.c */
- extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ino_t dir_ino,
- ino_t parent_ino, char **block);
-
- /* mkdir.c */
- extern errcode_t ext2fs_mkdir(ext2_filsys fs, ino_t parent, ino_t inum,
- const char *name);
-
- /* openfs.c */
- extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
- int block_size, io_manager manager,
- ext2_filsys *ret_fs);
-
- /* get_pathname.c */
- extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ino_t dir, ino_t ino,
- char **name);
-
- /* link.c */
- errcode_t ext2fs_link(ext2_filsys fs, ino_t dir, const char *name,
- ino_t ino, int flags);
- errcode_t ext2fs_unlink(ext2_filsys fs, ino_t dir, const char *name,
- ino_t ino, int flags);
-
- /* read_bb.c */
- extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs, badblocks_list *bb_list);
-
- /* read_bb_file.c */
- extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
- badblocks_list *bb_list,
- void (*invalid)(ext2_filsys fs,
- blk_t blk));
-
- /* inline functions */
- extern void ext2fs_mark_super_dirty(ext2_filsys fs);
- extern void ext2fs_mark_changed(ext2_filsys fs);
- extern int ext2fs_test_changed(ext2_filsys fs);
- extern void ext2fs_mark_valid(ext2_filsys fs);
- extern void ext2fs_unmark_valid(ext2_filsys fs);
- extern int ext2fs_test_valid(ext2_filsys fs);
- extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
- extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
- extern int ext2fs_test_ib_dirty(ext2_filsys fs);
- extern int ext2fs_test_bb_dirty(ext2_filsys fs);
- extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
- extern int ext2fs_group_of_ino(ext2_filsys fs, ino_t ino);
-
- /*
- * The actual inlined functions definitions themselves...
- *
- * If NO_INLINE_FUNCS is defined, then we won't try to do inline
- * functions at all!
- */
- #if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
- #ifdef INCLUDE_INLINE_FUNCS
- #define _INLINE_ extern
- #else
- #define _INLINE_ extern __inline__
- #endif
-
- /*
- * Mark a filesystem superblock as dirty
- */
- _INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
- {
- fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
- }
-
- /*
- * Mark a filesystem as changed
- */
- _INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
- {
- fs->flags |= EXT2_FLAG_CHANGED;
- }
-
- /*
- * Check to see if a filesystem has changed
- */
- _INLINE_ int ext2fs_test_changed(ext2_filsys fs)
- {
- return (fs->flags & EXT2_FLAG_CHANGED);
- }
-
- /*
- * Mark a filesystem as valid
- */
- _INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
- {
- fs->flags |= EXT2_FLAG_VALID;
- }
-
- /*
- * Mark a filesystem as NOT valid
- */
- _INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
- {
- fs->flags &= ~EXT2_FLAG_VALID;
- }
-
- /*
- * Check to see if a filesystem is valid
- */
- _INLINE_ int ext2fs_test_valid(ext2_filsys fs)
- {
- return (fs->flags & EXT2_FLAG_VALID);
- }
-
- /*
- * Mark the inode bitmap as dirty
- */
- _INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
- {
- fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
- }
-
- /*
- * Mark the block bitmap as dirty
- */
- _INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
- {
- fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
- }
-
- /*
- * Check to see if a filesystem's inode bitmap is dirty
- */
- _INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
- {
- return (fs->flags & EXT2_FLAG_IB_DIRTY);
- }
-
- /*
- * Check to see if a filesystem's block bitmap is dirty
- */
- _INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
- {
- return (fs->flags & EXT2_FLAG_BB_DIRTY);
- }
-
- /*
- * Return the group # of a block
- */
- _INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
- {
- return (blk - fs->super->s_first_data_block) /
- fs->super->s_blocks_per_group;
- }
-
- /*
- * Return the group # of an inode number
- */
- _INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ino_t ino)
- {
- return (ino - 1) / fs->super->s_inodes_per_group;
- }
- #undef _INLINE_
- #endif
-
-