From a418d3ad819323f871005d253f7f9ac378e78ba5 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sat, 26 Apr 1997 14:00:26 +0000 Subject: [PATCH] Many files: Checked in e2fsprogs 0.5c --- lib/ss/{jump => dll}/jump.funcs | 0 lib/ss/dll/jump.ignore | 0 lib/ss/{jump => dll}/jump.import | 0 lib/ss/{jump => dll}/jump.params | 0 lib/ss/dll/jump.undefs | 2 + lib/ss/{jump => dll}/jump.vars | 0 lib/ss/jump/jump.undefs | 2 - lib/ss/ss_err.h | 29 -- lib/ss/ss_internal.h | 5 +- lib/ss/std_rqs.c | 2 +- lib/ss/test_ss.c | 4 +- misc/.depend | 149 +++++----- misc/ChangeLog | 129 +++++++++ misc/Makefile | 90 ------ misc/Makefile.in | 148 ++++++++++ misc/badblocks.8 | 2 +- misc/badblocks.c | 48 ++-- misc/chattr.1 | 2 +- misc/chattr.c | 15 +- misc/dumpe2fs.8 | 7 +- misc/dumpe2fs.c | 12 +- misc/fsck.8 | 5 +- misc/fsck.c | 80 ++++-- misc/lsattr.1 | 4 +- misc/lsattr.c | 27 +- misc/mke2fs.8 | 7 +- misc/mke2fs.c | 151 +++++----- misc/mklost+found.8 | 5 +- misc/mklost+found.c | 2 +- misc/tune2fs.8 | 4 +- misc/tune2fs.c | 10 +- tests/ChangeLog | 16 ++ tests/Makefile.in | 23 ++ tests/README | 67 +++++ tests/defaults/f_script | 1 + tests/f_badbblocks/expect.1 | 20 ++ tests/f_badbblocks/expect.2 | 7 + tests/f_badbblocks/image.gz | Bin 0 -> 376 bytes tests/f_badbblocks/name | 1 + tests/f_baddir/expect.1 | 39 +++ tests/f_baddir/expect.2 | 7 + tests/f_baddir/image.gz | Bin 0 -> 14360 bytes tests/f_baddir/name | 1 + tests/f_baddotdir/expect.1 | 48 ++++ tests/f_baddotdir/expect.2 | 7 + tests/f_baddotdir/image.gz | Bin 0 -> 499 bytes tests/f_baddotdir/name | 1 + tests/f_badinode/expect.1 | 25 ++ tests/f_badinode/expect.2 | 7 + tests/f_badinode/image.gz | Bin 0 -> 1037 bytes tests/f_badinode/name | 1 + tests/f_badlkcnt/expect.1 | 17 ++ tests/f_badlkcnt/expect.2 | 7 + tests/f_badlkcnt/image.gz | Bin 0 -> 3826 bytes tests/f_badlkcnt/name | 1 + tests/f_badprimary/expect.1 | 25 ++ tests/f_badprimary/expect.2 | 7 + tests/f_badprimary/image.gz | Bin 0 -> 374 bytes tests/f_badprimary/name | 1 + tests/f_badroot/expect.1 | 37 +++ tests/f_badroot/expect.2 | 7 + tests/f_badroot/image.gz | Bin 0 -> 479 bytes tests/f_badroot/name | 1 + tests/f_badtable/expect.1 | 29 ++ tests/f_badtable/expect.2 | 7 + tests/f_badtable/image.gz | Bin 0 -> 987 bytes tests/f_badtable/name | 1 + tests/f_bbfile/expect.1 | 44 +++ tests/f_bbfile/expect.2 | 7 + tests/f_bbfile/image.gz | Bin 0 -> 5195 bytes tests/f_bbfile/name | 1 + tests/f_bitmaps/expect.1 | 13 + tests/f_bitmaps/expect.2 | 7 + tests/f_bitmaps/image.gz | Bin 0 -> 687 bytes tests/f_bitmaps/name | 1 + tests/f_dirlink/expect.1 | 12 + tests/f_dirlink/expect.2 | 7 + tests/f_dirlink/image.gz | Bin 0 -> 490 bytes tests/f_dirlink/name | 1 + tests/f_dup/expect.1 | 34 +++ tests/f_dup/expect.2 | 7 + tests/f_dup/image.gz | Bin 0 -> 3744 bytes tests/f_dup/name | 1 + tests/f_dup2/expect.1 | 42 +++ tests/f_dup2/expect.2 | 7 + tests/f_dup2/image.gz | Bin 0 -> 14589 bytes tests/f_dup2/name | 1 + tests/f_dupfsblks/expect.1 | 31 +++ tests/f_dupfsblks/expect.2 | 7 + tests/f_dupfsblks/image.gz | Bin 0 -> 389 bytes tests/f_dupfsblks/name | 1 + tests/f_dupsuper/expect.1 | 21 ++ tests/f_dupsuper/expect.2 | 7 + tests/f_dupsuper/image.gz | Bin 0 -> 5158 bytes tests/f_dupsuper/name | 1 + tests/f_end-bitmap/expect.1 | 14 + tests/f_end-bitmap/expect.2 | 7 + tests/f_end-bitmap/image.gz | Bin 0 -> 3756 bytes tests/f_end-bitmap/name | 2 + tests/f_expand/expect.1 | 587 +++++++++++++++++++++++++++++++++++++++ tests/f_expand/expect.2 | 7 + tests/f_expand/image.gz | Bin 0 -> 13125 bytes tests/f_expand/name | 1 + tests/f_holedir/expect.1 | 31 +++ tests/f_holedir/expect.2 | 7 + tests/f_holedir/image.gz | Bin 0 -> 345 bytes tests/f_holedir/name | 1 + tests/f_illbbitmap/expect.1 | 19 ++ tests/f_illbbitmap/expect.2 | 7 + tests/f_illbbitmap/image.gz | Bin 0 -> 357 bytes tests/f_illbbitmap/name | 1 + tests/f_illibitmap/expect.1 | 16 ++ tests/f_illibitmap/expect.2 | 7 + tests/f_illibitmap/image.gz | Bin 0 -> 360 bytes tests/f_illibitmap/name | 1 + tests/f_lotsbad/expect.1 | 46 +++ tests/f_lotsbad/expect.2 | 7 + tests/f_lotsbad/image.gz | Bin 0 -> 3552 bytes tests/f_lotsbad/name | 1 + tests/f_lpf/expect.1 | 39 +++ tests/f_lpf/expect.2 | 7 + tests/f_lpf/image.gz | Bin 0 -> 15342 bytes tests/f_lpf/name | 1 + tests/f_messy_inode/expect.1 | 33 +++ tests/f_messy_inode/expect.2 | 7 + tests/f_messy_inode/image.gz | Bin 0 -> 3823 bytes tests/f_messy_inode/name | 1 + tests/f_mke2fs2b/expect.1 | 36 +++ tests/f_mke2fs2b/expect.2 | 7 + tests/f_mke2fs2b/image.gz | Bin 0 -> 556 bytes tests/f_mke2fs2b/name | 1 + tests/f_noroot/expect.1 | 44 +++ tests/f_noroot/expect.2 | 7 + tests/f_noroot/image.gz | Bin 0 -> 550 bytes tests/f_noroot/name | 1 + tests/f_okgroup/expect.1 | 7 + tests/f_okgroup/expect.2 | 7 + tests/f_okgroup/image.gz | Bin 0 -> 8387 bytes tests/f_okgroup/name | 1 + tests/f_overfsblks/expect.1 | 16 ++ tests/f_overfsblks/expect.2 | 7 + tests/f_overfsblks/image.gz | Bin 0 -> 351 bytes tests/f_overfsblks/name | 1 + tests/run_e2fsck | 72 +++++ tests/test_config | 9 + tests/test_script | 43 +++ 146 files changed, 2361 insertions(+), 353 deletions(-) rename lib/ss/{jump => dll}/jump.funcs (100%) create mode 100644 lib/ss/dll/jump.ignore rename lib/ss/{jump => dll}/jump.import (100%) rename lib/ss/{jump => dll}/jump.params (100%) create mode 100644 lib/ss/dll/jump.undefs rename lib/ss/{jump => dll}/jump.vars (100%) delete mode 100644 lib/ss/jump/jump.undefs delete mode 100644 lib/ss/ss_err.h delete mode 100644 misc/Makefile create mode 100644 misc/Makefile.in create mode 100644 tests/ChangeLog create mode 100644 tests/Makefile.in create mode 100644 tests/README create mode 100644 tests/defaults/f_script create mode 100644 tests/f_badbblocks/expect.1 create mode 100644 tests/f_badbblocks/expect.2 create mode 100644 tests/f_badbblocks/image.gz create mode 100644 tests/f_badbblocks/name create mode 100644 tests/f_baddir/expect.1 create mode 100644 tests/f_baddir/expect.2 create mode 100644 tests/f_baddir/image.gz create mode 100644 tests/f_baddir/name create mode 100644 tests/f_baddotdir/expect.1 create mode 100644 tests/f_baddotdir/expect.2 create mode 100644 tests/f_baddotdir/image.gz create mode 100644 tests/f_baddotdir/name create mode 100644 tests/f_badinode/expect.1 create mode 100644 tests/f_badinode/expect.2 create mode 100644 tests/f_badinode/image.gz create mode 100644 tests/f_badinode/name create mode 100644 tests/f_badlkcnt/expect.1 create mode 100644 tests/f_badlkcnt/expect.2 create mode 100644 tests/f_badlkcnt/image.gz create mode 100644 tests/f_badlkcnt/name create mode 100644 tests/f_badprimary/expect.1 create mode 100644 tests/f_badprimary/expect.2 create mode 100644 tests/f_badprimary/image.gz create mode 100644 tests/f_badprimary/name create mode 100644 tests/f_badroot/expect.1 create mode 100644 tests/f_badroot/expect.2 create mode 100644 tests/f_badroot/image.gz create mode 100644 tests/f_badroot/name create mode 100644 tests/f_badtable/expect.1 create mode 100644 tests/f_badtable/expect.2 create mode 100644 tests/f_badtable/image.gz create mode 100644 tests/f_badtable/name create mode 100644 tests/f_bbfile/expect.1 create mode 100644 tests/f_bbfile/expect.2 create mode 100644 tests/f_bbfile/image.gz create mode 100644 tests/f_bbfile/name create mode 100644 tests/f_bitmaps/expect.1 create mode 100644 tests/f_bitmaps/expect.2 create mode 100644 tests/f_bitmaps/image.gz create mode 100644 tests/f_bitmaps/name create mode 100644 tests/f_dirlink/expect.1 create mode 100644 tests/f_dirlink/expect.2 create mode 100644 tests/f_dirlink/image.gz create mode 100644 tests/f_dirlink/name create mode 100644 tests/f_dup/expect.1 create mode 100644 tests/f_dup/expect.2 create mode 100644 tests/f_dup/image.gz create mode 100644 tests/f_dup/name create mode 100644 tests/f_dup2/expect.1 create mode 100644 tests/f_dup2/expect.2 create mode 100644 tests/f_dup2/image.gz create mode 100644 tests/f_dup2/name create mode 100644 tests/f_dupfsblks/expect.1 create mode 100644 tests/f_dupfsblks/expect.2 create mode 100644 tests/f_dupfsblks/image.gz create mode 100644 tests/f_dupfsblks/name create mode 100644 tests/f_dupsuper/expect.1 create mode 100644 tests/f_dupsuper/expect.2 create mode 100644 tests/f_dupsuper/image.gz create mode 100644 tests/f_dupsuper/name create mode 100644 tests/f_end-bitmap/expect.1 create mode 100644 tests/f_end-bitmap/expect.2 create mode 100644 tests/f_end-bitmap/image.gz create mode 100644 tests/f_end-bitmap/name create mode 100644 tests/f_expand/expect.1 create mode 100644 tests/f_expand/expect.2 create mode 100644 tests/f_expand/image.gz create mode 100644 tests/f_expand/name create mode 100644 tests/f_holedir/expect.1 create mode 100644 tests/f_holedir/expect.2 create mode 100644 tests/f_holedir/image.gz create mode 100644 tests/f_holedir/name create mode 100644 tests/f_illbbitmap/expect.1 create mode 100644 tests/f_illbbitmap/expect.2 create mode 100644 tests/f_illbbitmap/image.gz create mode 100644 tests/f_illbbitmap/name create mode 100644 tests/f_illibitmap/expect.1 create mode 100644 tests/f_illibitmap/expect.2 create mode 100644 tests/f_illibitmap/image.gz create mode 100644 tests/f_illibitmap/name create mode 100644 tests/f_lotsbad/expect.1 create mode 100644 tests/f_lotsbad/expect.2 create mode 100644 tests/f_lotsbad/image.gz create mode 100644 tests/f_lotsbad/name create mode 100644 tests/f_lpf/expect.1 create mode 100644 tests/f_lpf/expect.2 create mode 100644 tests/f_lpf/image.gz create mode 100644 tests/f_lpf/name create mode 100644 tests/f_messy_inode/expect.1 create mode 100644 tests/f_messy_inode/expect.2 create mode 100644 tests/f_messy_inode/image.gz create mode 100644 tests/f_messy_inode/name create mode 100644 tests/f_mke2fs2b/expect.1 create mode 100644 tests/f_mke2fs2b/expect.2 create mode 100644 tests/f_mke2fs2b/image.gz create mode 100644 tests/f_mke2fs2b/name create mode 100644 tests/f_noroot/expect.1 create mode 100644 tests/f_noroot/expect.2 create mode 100644 tests/f_noroot/image.gz create mode 100644 tests/f_noroot/name create mode 100644 tests/f_okgroup/expect.1 create mode 100644 tests/f_okgroup/expect.2 create mode 100644 tests/f_okgroup/image.gz create mode 100644 tests/f_okgroup/name create mode 100644 tests/f_overfsblks/expect.1 create mode 100644 tests/f_overfsblks/expect.2 create mode 100644 tests/f_overfsblks/image.gz create mode 100644 tests/f_overfsblks/name create mode 100644 tests/run_e2fsck create mode 100644 tests/test_config create mode 100644 tests/test_script diff --git a/lib/ss/jump/jump.funcs b/lib/ss/dll/jump.funcs similarity index 100% rename from lib/ss/jump/jump.funcs rename to lib/ss/dll/jump.funcs diff --git a/lib/ss/dll/jump.ignore b/lib/ss/dll/jump.ignore new file mode 100644 index 0000000..e69de29 diff --git a/lib/ss/jump/jump.import b/lib/ss/dll/jump.import similarity index 100% rename from lib/ss/jump/jump.import rename to lib/ss/dll/jump.import diff --git a/lib/ss/jump/jump.params b/lib/ss/dll/jump.params similarity index 100% rename from lib/ss/jump/jump.params rename to lib/ss/dll/jump.params diff --git a/lib/ss/dll/jump.undefs b/lib/ss/dll/jump.undefs new file mode 100644 index 0000000..56d1fda --- /dev/null +++ b/lib/ss/dll/jump.undefs @@ -0,0 +1,2 @@ +66885010 D __NEEDS_SHRLIB_libc_4 +66885028 D __NEEDS_SHRLIB_libet_1 diff --git a/lib/ss/jump/jump.vars b/lib/ss/dll/jump.vars similarity index 100% rename from lib/ss/jump/jump.vars rename to lib/ss/dll/jump.vars diff --git a/lib/ss/jump/jump.undefs b/lib/ss/jump/jump.undefs deleted file mode 100644 index 1a2f89a..0000000 --- a/lib/ss/jump/jump.undefs +++ /dev/null @@ -1,2 +0,0 @@ -66885010 D __NEEDS_SHRLIB_libc_4 -66885024 D __NEEDS_SHRLIB_libet_1 diff --git a/lib/ss/ss_err.h b/lib/ss/ss_err.h deleted file mode 100644 index 02ab507..0000000 --- a/lib/ss/ss_err.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * ss_err.h: - * This file is automatically generated; please do not edit it. - */ -#ifdef __STDC__ -#define NOARGS void -#else -#define NOARGS -#define const -#endif - -#define SS_ET_SUBSYSTEM_ABORTED (748800L) -#define SS_ET_VERSION_MISMATCH (748801L) -#define SS_ET_NULL_INV (748802L) -#define SS_ET_NO_INFO_DIR (748803L) -#define SS_ET_COMMAND_NOT_FOUND (748804L) -#define SS_ET_LINE_ABORTED (748805L) -#define SS_ET_EOF (748806L) -#define SS_ET_PERMISSION_DENIED (748807L) -#define SS_ET_TABLE_NOT_FOUND (748808L) -#define SS_ET_NO_HELP_FILE (748809L) -#define SS_ET_ESCAPE_DISABLED (748810L) -#define SS_ET_UNIMPLEMENTED (748811L) -extern void initialize_ss_error_table (NOARGS); -#define ERROR_TABLE_BASE_ss (748800L) - -/* for compatibility with older versions... */ -#define init_ss_err_tbl initialize_ss_error_table -#define ss_err_base ERROR_TABLE_BASE_ss diff --git a/lib/ss/ss_internal.h b/lib/ss/ss_internal.h index fc4a2ad..388a376 100644 --- a/lib/ss/ss_internal.h +++ b/lib/ss/ss_internal.h @@ -8,6 +8,7 @@ #define _ss_ss_internal_h __FILE__ #include #include +#include #ifdef __STDC__ @@ -107,10 +108,6 @@ void ss_page_stdin(NOARGS); extern ss_data **_ss_table; extern char *ss_et_msgs[]; -extern pointer malloc PROTOTYPE((unsigned)); -extern pointer realloc PROTOTYPE((pointer, unsigned)); -extern pointer calloc PROTOTYPE((unsigned, unsigned)); - #ifdef USE_SIGPROCMASK /* fake sigmask, sigblock, sigsetmask */ #include diff --git a/lib/ss/std_rqs.c b/lib/ss/std_rqs.c index d0f0ccb..704766d 100644 --- a/lib/ss/std_rqs.c +++ b/lib/ss/std_rqs.c @@ -1,4 +1,4 @@ -/* std_rqs.c - automatically generated from std_rqs.ct */ +/* ./std_rqs.c - automatically generated from ./std_rqs.ct */ #include #ifndef __STDC__ diff --git a/lib/ss/test_ss.c b/lib/ss/test_ss.c index ee9c087..7b37ec4 100644 --- a/lib/ss/test_ss.c +++ b/lib/ss/test_ss.c @@ -9,8 +9,8 @@ * $Locker$ * * $Log$ - * Revision 1.2 1997/04/26 13:34:09 tytso - * Checkin of e2fsprogs 0.5b + * Revision 1.3 1997/04/26 13:58:24 tytso + * Checked in e2fsprogs 0.5c * * Revision 1.1 1993/06/03 12:31:25 tytso * Initial revision diff --git a/misc/.depend b/misc/.depend index 9466333..77a8bb7 100644 --- a/misc/.depend +++ b/misc/.depend @@ -1,104 +1,107 @@ -badblocks.o : badblocks.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \ +badblocks.o : ./badblocks.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/linux/errno.h /usr/include/fcntl.h /usr/include/sys/types.h /usr/include/linux/types.h \ - /usr/include/asm/types.h /usr/include/linux/fcntl.h /usr/include/getopt.h /usr/include/signal.h \ - /usr/include/linux/signal.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ - /usr/include/stdlib.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h \ - /usr/include/alloca.h /usr/include/string.h /usr/include/unistd.h /usr/include/posix_opt.h \ - /usr/include/gnu/types.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \ - /usr/include/termios.h /usr/include/linux/termios.h /usr/include/linux/fd.h \ - /usr/include/linux/fs.h /usr/include/linux/linkage.h /usr/include/linux/limits.h \ - /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ - /usr/include/linux/net.h /usr/include/linux/socket.h /usr/include/linux/sockios.h \ - /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ - /usr/include/linux/ext2_fs_i.h /usr/include/linux/hpfs_fs_i.h /usr/include/linux/msdos_fs_i.h \ - /usr/include/linux/umsdos_fs_i.h /usr/include/linux/iso_fs_i.h /usr/include/linux/nfs_fs_i.h \ - /usr/include/linux/nfs.h /usr/include/linux/xia_fs_i.h /usr/include/linux/sysv_fs_i.h \ - ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../lib/ext2fs/io.h -chattr.o : chattr.c /usr/include/dirent.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/include/asm/types.h /usr/include/gnu/types.h /usr/include/linux/fcntl.h \ + /usr/include/getopt.h /usr/include/signal.h /usr/include/linux/signal.h /usr/include/stdio.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/stdlib.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \ + /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h /usr/include/alloca.h /usr/include/string.h \ + /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/confname.h /usr/include/sys/ioctl.h \ + /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \ + /usr/include/linux/fd.h /usr/include/linux/fs.h /usr/include/linux/linkage.h \ + /usr/include/linux/limits.h /usr/include/linux/wait.h /usr/include/linux/dirent.h \ + /usr/include/linux/vfs.h /usr/include/linux/net.h /usr/include/linux/socket.h \ + /usr/include/linux/sockios.h /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h \ + /usr/include/linux/ext_fs_i.h /usr/include/linux/ext2_fs_i.h /usr/include/linux/hpfs_fs_i.h \ + /usr/include/linux/msdos_fs_i.h /usr/include/linux/umsdos_fs_i.h /usr/include/linux/iso_fs_i.h \ + /usr/include/linux/nfs_fs_i.h /usr/include/linux/nfs.h /usr/include/linux/xia_fs_i.h \ + /usr/include/linux/sysv_fs_i.h ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \ + ../lib/ext2fs/io.h +chattr.o : ./chattr.c /usr/include/dirent.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \ /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \ /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \ /usr/include/fcntl.h /usr/include/linux/fcntl.h /usr/include/getopt.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/stdlib.h /usr/include/errno.h \ /usr/include/linux/errno.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h \ - /usr/include/alloca.h /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/sys/param.h \ - /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/syslimits.h \ - /usr/include/limits.h /usr/include/posix2_lim.h /usr/include/linux/param.h /usr/include/asm/param.h \ + /usr/include/alloca.h /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/confname.h \ + /usr/include/sys/param.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \ + /usr/lib/gcc-lib/i486-linux/2.5.8/include/syslimits.h /usr/include/limits.h \ + /usr/include/posix2_lim.h /usr/include/linux/param.h /usr/include/asm/param.h \ /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \ ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../lib/e2p/e2p.h \ - ../version.h -dumpe2fs.o : dumpe2fs.c /usr/include/getopt.h /usr/include/fcntl.h /usr/include/features.h \ + ./../version.h +dumpe2fs.o : ./dumpe2fs.c /usr/include/getopt.h /usr/include/fcntl.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/sys/types.h /usr/include/linux/types.h \ - /usr/include/asm/types.h /usr/include/linux/fcntl.h /usr/include/stdio.h /usr/include/libio.h \ - /usr/include/_G_config.h /usr/include/stdlib.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \ - /usr/include/errno.h /usr/include/linux/errno.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h \ - /usr/include/alloca.h /usr/include/string.h /usr/include/unistd.h /usr/include/posix_opt.h \ - /usr/include/gnu/types.h /usr/include/linux/ext2_fs.h ../lib/ext2fs/ext2fs.h \ - ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../lib/ext2fs/io.h \ - ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h ../lib/e2p/e2p.h /usr/include/dirent.h \ - /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \ - ../version.h -fsck.o : fsck.c /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \ + /usr/include/asm/types.h /usr/include/gnu/types.h /usr/include/linux/fcntl.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/stdlib.h \ + /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/include/errno.h /usr/include/linux/errno.h \ + /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h /usr/include/alloca.h /usr/include/string.h \ + /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/confname.h /usr/include/linux/ext2_fs.h \ + ../lib/ext2fs/ext2fs.h ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \ + ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h ../lib/e2p/e2p.h \ + /usr/include/dirent.h /usr/include/linux/limits.h /usr/include/linux/dirent.h \ + /usr/include/posix1_lim.h ./../version.h +fsck.o : ./fsck.c /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \ /usr/include/sys/wait.h /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/gnu/types.h \ /usr/include/waitflags.h /usr/include/linux/wait.h /usr/include/waitstatus.h \ /usr/include/endian.h /usr/include/bytesex.h /usr/include/sys/signal.h /usr/include/signal.h \ /usr/include/linux/signal.h /usr/include/sys/stat.h /usr/include/linux/stat.h \ - /usr/include/errno.h /usr/include/linux/errno.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \ - /usr/lib/gcc-lib/i486-linux/2.5.8/include/syslimits.h /usr/include/limits.h \ - /usr/include/posix1_lim.h /usr/include/linux/limits.h /usr/include/posix2_lim.h \ - /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/stdlib.h \ - /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h \ - /usr/include/alloca.h /usr/include/string.h /usr/include/mntent.h /usr/include/unistd.h \ - /usr/include/posix_opt.h /usr/include/getopt.h ../version.h fsck.h -lsattr.o : lsattr.c /usr/include/dirent.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/syslimits.h \ + /usr/include/limits.h /usr/include/posix1_lim.h /usr/include/linux/limits.h \ + /usr/include/posix2_lim.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/string.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/include/stdlib.h \ + /usr/include/errno.h /usr/include/linux/errno.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h \ + /usr/include/alloca.h /usr/include/mntent.h /usr/include/unistd.h /usr/include/posix_opt.h \ + /usr/include/confname.h /usr/include/malloc.h /usr/include/getopt.h ./../version.h \ + ./fsck.h +lsattr.o : ./lsattr.c /usr/include/dirent.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \ /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \ /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \ /usr/include/errno.h /usr/include/linux/errno.h /usr/include/fcntl.h /usr/include/linux/fcntl.h \ /usr/include/getopt.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ - /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/sys/param.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \ - /usr/lib/gcc-lib/i486-linux/2.5.8/include/syslimits.h /usr/include/limits.h \ - /usr/include/posix2_lim.h /usr/include/linux/param.h /usr/include/asm/param.h \ + /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/confname.h /usr/include/sys/param.h \ + /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/syslimits.h \ + /usr/include/limits.h /usr/include/posix2_lim.h /usr/include/linux/param.h /usr/include/asm/param.h \ /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \ ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../lib/e2p/e2p.h \ - ../version.h -mke2fs.o : mke2fs.c /usr/include/string.h /usr/include/features.h /usr/include/sys/cdefs.h \ + ./../version.h +mke2fs.o : ./mke2fs.c /usr/include/string.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/include/fcntl.h /usr/include/sys/types.h \ - /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/linux/fcntl.h \ - /usr/include/ctype.h /usr/include/termios.h /usr/include/linux/termios.h /usr/include/time.h \ - /usr/include/getopt.h /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h \ - /usr/include/stdlib.h /usr/include/errno.h /usr/include/linux/errno.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h \ - /usr/include/alloca.h /usr/include/mntent.h /usr/include/stdio.h /usr/include/libio.h \ - /usr/include/_G_config.h /usr/include/malloc.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \ - /usr/include/linux/fs.h /usr/include/linux/linkage.h /usr/include/linux/limits.h \ - /usr/include/linux/wait.h /usr/include/linux/dirent.h /usr/include/linux/vfs.h \ - /usr/include/linux/net.h /usr/include/linux/socket.h /usr/include/linux/sockios.h \ - /usr/include/linux/pipe_fs_i.h /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h \ - /usr/include/linux/ext2_fs_i.h /usr/include/linux/hpfs_fs_i.h /usr/include/linux/msdos_fs_i.h \ - /usr/include/linux/umsdos_fs_i.h /usr/include/linux/iso_fs_i.h /usr/include/linux/nfs_fs_i.h \ - /usr/include/linux/nfs.h /usr/include/linux/xia_fs_i.h /usr/include/linux/sysv_fs_i.h \ - /usr/include/linux/ext2_fs.h ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \ - ../lib/ext2fs/ext2fs.h ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h \ - ../version.h -mklost+found.o : mklost+found.c /usr/include/errno.h /usr/include/features.h \ + /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/gnu/types.h \ + /usr/include/linux/fcntl.h /usr/include/ctype.h /usr/include/termios.h /usr/include/linux/termios.h \ + /usr/include/time.h /usr/include/getopt.h /usr/include/unistd.h /usr/include/posix_opt.h \ + /usr/include/confname.h /usr/include/stdlib.h /usr/include/errno.h /usr/include/linux/errno.h \ + /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h /usr/include/alloca.h /usr/include/mntent.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/malloc.h \ + /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h /usr/include/linux/fs.h \ + /usr/include/linux/linkage.h /usr/include/linux/limits.h /usr/include/linux/wait.h \ + /usr/include/linux/dirent.h /usr/include/linux/vfs.h /usr/include/linux/net.h \ + /usr/include/linux/socket.h /usr/include/linux/sockios.h /usr/include/linux/pipe_fs_i.h \ + /usr/include/linux/minix_fs_i.h /usr/include/linux/ext_fs_i.h /usr/include/linux/ext2_fs_i.h \ + /usr/include/linux/hpfs_fs_i.h /usr/include/linux/msdos_fs_i.h /usr/include/linux/umsdos_fs_i.h \ + /usr/include/linux/iso_fs_i.h /usr/include/linux/nfs_fs_i.h /usr/include/linux/nfs.h \ + /usr/include/linux/xia_fs_i.h /usr/include/linux/sysv_fs_i.h /usr/include/linux/ext2_fs.h \ + ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../lib/ext2fs/ext2fs.h \ + ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h ./../version.h +mklost+found.o : ./mklost+found.c /usr/include/errno.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/linux/errno.h /usr/include/fcntl.h /usr/include/sys/types.h \ - /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/linux/fcntl.h \ - /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/string.h \ - /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/include/unistd.h /usr/include/posix_opt.h \ - /usr/include/gnu/types.h /usr/include/sys/param.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \ + /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/gnu/types.h \ + /usr/include/linux/fcntl.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/string.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/include/unistd.h \ + /usr/include/posix_opt.h /usr/include/confname.h /usr/include/sys/param.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \ /usr/lib/gcc-lib/i486-linux/2.5.8/include/syslimits.h /usr/include/limits.h \ /usr/include/posix1_lim.h /usr/include/linux/limits.h /usr/include/posix2_lim.h \ /usr/include/linux/param.h /usr/include/asm/param.h /usr/include/sys/stat.h \ - /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h ../version.h -tune2fs.o : tune2fs.c /usr/include/fcntl.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h ./../version.h +tune2fs.o : ./tune2fs.c /usr/include/fcntl.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \ - /usr/include/linux/fcntl.h /usr/include/grp.h /usr/include/gnu/types.h /usr/include/stdio.h \ + /usr/include/gnu/types.h /usr/include/linux/fcntl.h /usr/include/grp.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \ /usr/include/getopt.h /usr/include/pwd.h /usr/include/stdlib.h /usr/include/errno.h \ /usr/include/linux/errno.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/float.h \ /usr/include/alloca.h /usr/include/string.h /usr/include/time.h /usr/include/unistd.h \ - /usr/include/posix_opt.h /usr/include/linux/ext2_fs.h ../lib/ext2fs/ext2fs.h \ - ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../lib/ext2fs/io.h \ - ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h ../lib/e2p/e2p.h /usr/include/dirent.h \ - /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \ - ../version.h + /usr/include/posix_opt.h /usr/include/confname.h /usr/include/linux/ext2_fs.h \ + ../lib/ext2fs/ext2fs.h ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \ + ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h ../lib/e2p/e2p.h \ + /usr/include/dirent.h /usr/include/linux/limits.h /usr/include/linux/dirent.h \ + /usr/include/posix1_lim.h ./../version.h diff --git a/misc/ChangeLog b/misc/ChangeLog index 9550ab8..e815ed5 100644 --- a/misc/ChangeLog +++ b/misc/ChangeLog @@ -1,3 +1,132 @@ +Thu Oct 26 12:05:18 1995 + + * Makefile.in (install): Strip programs when they are installed. + +Fri Aug 18 15:10:40 1995 Theodore Y. Ts'o + + * mke2fs.c (PRS): Move call of check_mount() from main() to PRS(), + so we do the check to see if the filesystem is mounted + *before* we try to determine the size of the device. + +Wed Sep 6 23:34:07 1995 Remy Card + + * fsck.c (load_fs_info): Load the informations from /etc/fstab in + the same order. + +Thu Aug 17 22:33:09 1995 + + * mke2fs.c (check_mount): Use the new ext2fs_check_if_mounted() + function to determine if the device is mounted. + + * mke2fs.c (PRS): Change call to use the new + ext2fs_get_device_size() function in order to determine + the size of the filesystem. Remove get_size() and + is_valid_offset(), which are no longer called. + +Fri Aug 11 08:26:24 1995 Theodore Y. Ts'o + + * fsck.c (fsck_device): Make sure fstype has been set by the user + and that it does not begin with "no" and the user has + specified exactly one type before using it as the type to + check. + +Fri Aug 11 14:17:18 1995 Remy Card + + * badblocks.8: + * chattr.1: + * dumpe2fs.8: + * fsck.8: + * lsattr.1: + * mke2fs.8: + * mklost+found.8: + * tune2fs.8: Updated date and version number. + +Thu Aug 10 14:18:36 1995 Remy Card + + * tune2fs.c: Fixed a bug which prevented the use of user and group + names with the -g and -u options. Thanks to Jean Christophe + ANDRE . + + * mke2fs.8: + * tune2fs.8: Fixed a spelling error in Ted's name :-) + +Wed Aug 9 20:41:54 1995 Theodore Y. Ts'o + + * mke2fs.c (count_blocks): Divide the size by + EXT2_BLOCK_SIZE(¶m), instead of assuming that the + blocksize is always 1024 bytes. + +Sat Aug 5 12:00:51 1995 Theodore Y. Ts'o + + * mke2fs.c (PRS): Use malloc() instead of alloca() --- alloca() is + not portable!! In any case putenv() in some systems must + take a static character array or malloc()'ed memory; + passing memory allocated using alloca() to putenv() is not + advisable. + + * chattr.c (chattr_dir_proc): + * lsattr.c (lsattr_dir_proc): Use malloc() instead of alloca() --- + alloca is not portable! + + * fsck.c (fsck_device): If the filesystem type is specified by the + user using the -t option, let it override the type in + /etc/fstab. + + * fsck.c (strdup): Don't build strdup() if the system defines it. + +Mon Jun 12 19:15:10 1995 Theodore Y. Ts'o (tytso@dcl) + + * chattr.c, lsattr.c: Include for 's + benefit. + + * The $(UPROGS) go in bin, not sbin. + + * badblocks.c, chattr.c, dumpe2fs.c, fsck.c, lsattr.c, mke2fs.c, + tune2fs.c: Don't include if it doesn't exist. + +Mon Jun 12 16:36:04 1995 Theodore Y. Ts'o + + * badblocks.c, chattr.c, dumpe2fs.c, fsck.c, lsattr.c, mke2fs.c, + tune2fs.c: Only include getopt.h if HAVE_GETOPT_H is defined. + +Sat Jun 10 23:37:09 1995 Theodore Y. Ts'o + + * chattr.c: Include errno.h, since we use errno + + * fsck.c (load_fs_info): If HAVE_MNTENT_H is not defined, + explicitly initialize filesys_info to be NULL. + + * mke2fs.c: Include the stdio.h and errno.h header files + +Thu Jun 8 13:25:23 1995 Miles Bader + + * mke2fs.c: Only include if we can. + (get_size): Don't try to use the BLKGETSIZE ioctl unless it's defined. + (check_mount): Only check to see if the device is mounted if + HAVE_MNTENT_H is defined (by configure). + + * fsck.c (load_fs_info): Only try to get info about filesystems if + HAVE_MNTENT_H is defined (by configure). + (main): Allocate space for a new fsck_path instead of append to a + statically sized buffer. + (PRS): Use alloca to allocate the new path string, instead of + having a fixed size buffer (which was the wrong size anyway). + + * chattr.c (chattr_dir_proc): Use alloca to allocate space for a + filename instead of using a fixed-size buffer. + * lsattr.c (lsattr_dir_proc): Ditto. + * mklost+fond.c (main): Calculate the actual needed size for the + path buffer instead of using MAXPATHLEN (which not all systems have). + + * badblocks.c: Only include linux include files if we have them. + (flush_bufs): New function to flush a block device, optionally + syncing it first. This replaces other copies of this code. + (test_ro): Replace calls to ioctl with flush_bufs(). + (test_rw): Ditto. + + * Makefile.in: Rewritten to conform to GNU coding standards and + support separate compilation directories. + Sat Mar 11 10:59:58 1995 Theodore Y. Ts'o * mke2fs.c (main, zap_bootblock): Added new function diff --git a/misc/Makefile b/misc/Makefile deleted file mode 100644 index 4cb15b2..0000000 --- a/misc/Makefile +++ /dev/null @@ -1,90 +0,0 @@ -include ../MCONFIG - -CFLAGS= $(OPT) $(WFLAGS) -I../lib -LDFLAGS= $(OPT) -SPROGS= mke2fs badblocks tune2fs dumpe2fs fsck -USPROGS= mklost+found -SMANPAGES= tune2fs.8 mklost+found.8 mke2fs.8 dumpe2fs.8 badblocks.8 \ - fsck.8 - -UPROGS= chattr lsattr -UMANPAGES= chattr.1 lsattr.1 - -TUNE2FS_OBJS= tune2fs.o -MKLPF_OBJS= mklost+found.o -MKE2FS_OBJS= mke2fs.o -CHATTR_OBJS= chattr.o -LSATTR_OBJS= lsattr.o -DUMPE2FS_OBJS= dumpe2fs.o -BADBLOCKS_OBJS= badblocks.o -FSCK_OBJS= fsck.o - -LIBS= -L../lib -lext2fs -le2p -lcom_err -DEPLIBS= ../lib/libext2fs.a ../lib/libe2p.a ../lib/libcom_err.a - -all: $(SPROGS) $(UPROGS) $(USPROGS) - -tune2fs: $(TUNE2FS_OBJS) $(DEPLIBS) - $(CC) $(LDFLAGS) -o tune2fs $(TUNE2FS_OBJS) $(LIBS) - -mklost+found: $(MKLPF_OBJS) - $(CC) $(LDFLAGS) -o mklost+found $(MKLPF_OBJS) - -mke2fs: $(MKE2FS_OBJS) $(DEPLIBS) - $(CC) $(LDFLAGS) -o mke2fs $(MKE2FS_OBJS) $(LIBS) - -mke2fs.static: $(MKE2FS_OBJS) $(DEPLIBS) - $(CC) $(LDFLAGS) -static -o mke2fs.static $(MKE2FS_OBJS) $(LIBS) - -chattr: $(CHATTR_OBJS) $(DEPLIBS) - $(CC) $(LDFLAGS) -o chattr $(CHATTR_OBJS) $(LIBS) - -lsattr: $(LSATTR_OBJS) $(DEPLIBS) - $(CC) $(LDFLAGS) -o lsattr $(LSATTR_OBJS) $(LIBS) - -dumpe2fs: $(DUMPE2FS_OBJS) $(DEPLIBS) - $(CC) $(LDFLAGS) -o dumpe2fs $(DUMPE2FS_OBJS) $(LIBS) - -badblocks: $(BADBLOCKS_OBJS) $(DEPLIBS) - $(CC) $(LDFLAGS) -o badblocks $(BADBLOCKS_OBJS) $(LIBS) - -install:: $(SPROGS) $(UPROGS) - for i in $(SPROGS); do \ - $(INSTALLBIN) $$i $(SBINDIR)/$$i; \ - done - for i in $(USPROGS); do \ - $(INSTALLBIN) $$i $(USRSBINDIR)/$$i; \ - done - ln -sf mke2fs $(SBINDIR)/mkfs.ext2 - for i in $(UPROGS); do \ - $(INSTALLBIN) $$i $(USRBINDIR)/$$i; \ - done - -install:: $(SMANPAGES) $(UMANPAGES) - for i in $(SMANPAGES); do \ - $(INSTALLMAN) $$i $(SMANDIR)/$$i; \ - done - for i in $(UMANPAGES); do \ - $(INSTALLMAN) $$i $(UMANDIR)/$$i; \ - done - -install-tree:: $(SPROGS) $(UPROGS) - for i in $(SPROGS) $(UPROGS); do \ - rm -f ../bin/$$i; \ - cp $$i ../bin; \ - strip ../bin/$$i; \ - chmod 555 ../bin/$$i; \ - done - ln -sf mke2fs ../bin/mkfs.ext2 - -clean: - rm -f $(SPROGS) $(USPROGS) $(UPROGS) mke2fs.static \ - \#* *.s *.o *.a *~ core - -really-clean: clean - rm -f .depend - -dep depend .depend: - $(CPP) $(CFLAGS) -M *.c >.depend - -include .depend diff --git a/misc/Makefile.in b/misc/Makefile.in new file mode 100644 index 0000000..ee03156 --- /dev/null +++ b/misc/Makefile.in @@ -0,0 +1,148 @@ +# +# Standard e2fsprogs prologue.... +# + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +top_builddir = .. +INSTALL = @INSTALL@ + +@MCONFIG@ + +SPROGS= mke2fs badblocks tune2fs dumpe2fs fsck +USPROGS= mklost+found +SMANPAGES= tune2fs.8 mklost+found.8 mke2fs.8 dumpe2fs.8 badblocks.8 fsck.8 + +UPROGS= chattr lsattr +UMANPAGES= chattr.1 lsattr.1 + +TUNE2FS_OBJS= tune2fs.o +MKLPF_OBJS= mklost+found.o +MKE2FS_OBJS= mke2fs.o +CHATTR_OBJS= chattr.o +LSATTR_OBJS= lsattr.o +DUMPE2FS_OBJS= dumpe2fs.o +BADBLOCKS_OBJS= badblocks.o +FSCK_OBJS= fsck.o + +SRCS= $(srcdir)/tune2fs.c $(srcdir)/mklost+found.c $(srcdir)/mke2fs.c \ + $(srcdir)/chattr.c $(srcdir)/lsattr.c $(srcdir)/dumpe2fs.c \ + $(srcdir)/badblocks.c $(srcdir)/fsck.c + +LIBS= -L../lib -lext2fs -le2p -lcom_err +DEPLIBS= ../lib/libext2fs.a ../lib/libe2p.a ../lib/libcom_err.a + +.c.o: + $(CC) -c $(CFLAGS) $< -o $@ + +all:: $(SPROGS) $(UPROGS) $(USPROGS) + +tune2fs: $(TUNE2FS_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -o tune2fs $(TUNE2FS_OBJS) $(LIBS) + +mklost+found: $(MKLPF_OBJS) + $(CC) $(LDFLAGS) -o mklost+found $(MKLPF_OBJS) + +mke2fs: $(MKE2FS_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -o mke2fs $(MKE2FS_OBJS) $(LIBS) + +mke2fs.static: $(MKE2FS_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -static -o mke2fs.static $(MKE2FS_OBJS) $(LIBS) + +chattr: $(CHATTR_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -o chattr $(CHATTR_OBJS) $(LIBS) + +lsattr: $(LSATTR_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -o lsattr $(LSATTR_OBJS) $(LIBS) + +dumpe2fs: $(DUMPE2FS_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -o dumpe2fs $(DUMPE2FS_OBJS) $(LIBS) + +fsck: $(FSCK_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -o fsck $(FSCK_OBJS) $(LIBS) + +badblocks: $(BADBLOCKS_OBJS) $(DEPLIBS) + $(CC) $(LDFLAGS) -o badblocks $(BADBLOCKS_OBJS) $(LIBS) + +installdirs: + $(top_srcdir)/mkinstalldirs $(DESTDIR)$(bindir) $(DESTDIR)$(sbindir) \ + $(DESTDIR)$(ubindir) $(DESTDIR)$(man1dir) \ + $(DESTDIR)$(cat1dir) $(DESTDIR)$(man8dir) $(DESTDIR)$(cat8dir) + +install: all $(SMANPAGES) $(UMANPAGES) installdirs + for i in $(SPROGS); do \ + $(INSTALL_PROGRAM) $$i $(DESTDIR)$(sbindir)/$$i; \ + $(STRIP) $(DESTDIR)$(sbindir)/$$i; \ + done + for i in $(USPROGS); do \ + $(INSTALL_PROGRAM) $$i $(DESTDIR)$(usbindir)/$$i; \ + $(STRIP) $(DESTDIR)$(usbindir)/$$i; \ + done + $(LN) -f $(DESTDIR)$(sbindir)/mke2fs $(DESTDIR)$(sbindir)/mkfs.ext2 + for i in $(UPROGS); do \ + $(INSTALL_PROGRAM) $$i $(DESTDIR)$(ubindir)/$$i; \ + $(STRIP) $(DESTDIR)$(ubindir)/$$i; \ + done + for i in $(SMANPAGES); do \ + $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(man8dir)/$$i; \ + done + for i in $(UMANPAGES); do \ + $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(man1dir)/$$i; \ + done + +uninstall: + for i in $(SPROGS); do \ + $(RM) -f $(sbindir)/$$i; \ + done + for i in $(USPROGS); do \ + $(RM) -f $(usbindir)/$$i; \ + done + $(RM) -f $(sbindir)/mkfs.ext2 + for i in $(UPROGS); do \ + $(RM) -f $(ubindir)/$$i; \ + done + for i in $(SMANPAGES); do \ + $(RM) -f $(man8dir)/$$i; \ + done + for i in $(UMANPAGES); do \ + $(RM) -f $(man1dir)/$$i; \ + done + +clean: + $(RM) -f $(SPROGS) $(USPROGS) $(UPROGS) mke2fs.static \ + \#* *.s *.o *.a *~ core +mostlyclean: clean +distclean: clean + $(RM) -f .depend Makefile + +# +++ Dependency line eater +++ +# +# Makefile dependencies follow. This must be the last section in +# the Makefile.in file +# +tune2fs.o : $(srcdir)/tune2fs.c \ + $(top_srcdir)/lib/ext2fs/ext2fs.h $(top_srcdir)/lib/et/com_err.h \ + $(top_srcdir)/lib/ext2fs/io.h $(top_builddir)/lib/ext2fs/ext2_err.h $(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/e2p/e2p.h \ + $(srcdir)/../version.h +mklost+found.o : $(srcdir)/mklost+found.c \ + $(srcdir)/../version.h +mke2fs.o : $(srcdir)/mke2fs.c \ + $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/ext2fs/ext2fs.h \ + $(top_srcdir)/lib/ext2fs/io.h $(top_builddir)/lib/ext2fs/ext2_err.h $(top_srcdir)/lib/ext2fs/bitops.h $(srcdir)/../version.h +chattr.o : $(srcdir)/chattr.c \ + $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/e2p/e2p.h \ + $(srcdir)/../version.h +lsattr.o : $(srcdir)/lsattr.c \ + $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/e2p/e2p.h \ + $(srcdir)/../version.h +dumpe2fs.o : $(srcdir)/dumpe2fs.c \ + $(top_srcdir)/lib/ext2fs/ext2fs.h $(top_srcdir)/lib/et/com_err.h \ + $(top_srcdir)/lib/ext2fs/io.h $(top_builddir)/lib/ext2fs/ext2_err.h $(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/e2p/e2p.h \ + $(srcdir)/../version.h +badblocks.o : $(srcdir)/badblocks.c \ + $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/ext2fs/io.h +fsck.o : $(srcdir)/fsck.c \ + $(srcdir)/../version.h \ + $(srcdir)/fsck.h + diff --git a/misc/badblocks.8 b/misc/badblocks.8 index 79a95c7..57e1db5 100644 --- a/misc/badblocks.8 +++ b/misc/badblocks.8 @@ -1,5 +1,5 @@ .\" -*- nroff -*- -.TH BADBLOCKS 8 "November 1994" "Version 0.5b" +.TH BADBLOCKS 8 "August 1995" "Version 0.5c" .SH NAME badblocks \- search a device for bad blocks .SH SYNOPSIS diff --git a/misc/badblocks.c b/misc/badblocks.c index b9bcaca..dd9968b 100644 --- a/misc/badblocks.c +++ b/misc/badblocks.c @@ -20,7 +20,9 @@ #include #include +#ifdef HAVE_GETOPT_H #include +#endif #include #include #include @@ -30,8 +32,10 @@ #include #include +#if HAVE_LINUX_FS_H #include #include +#endif #include "et/com_err.h" #include "ext2fs/io.h" @@ -88,6 +92,26 @@ static void alarm_intr (int alnum) fflush (stderr); } +static void flush_bufs (int dev, int sync) +{ + if (v_flag +#if !defined (BLKFLSBUF) && !defined (FDFLUSH) + && sync +#endif + ) + fprintf (stderr, "Flushing buffers\n"); + + if (sync && fsync (dev) == -1) + com_err (program_name, errno, "during fsync"); + +#ifdef BLKLSBUF + ioctl (dev, BLKFLSBUF, 0); /* In case this is a HD */ +#endif +#ifdef FDFLUSH + ioctl (dev, FDFLUSH, 0); /* In case this is floppy */ +#endif +} + static void test_ro (int dev, unsigned long blocks_count, unsigned long block_size, FILE * out, unsigned long from_count) @@ -103,11 +127,7 @@ static void test_ro (int dev, unsigned long blocks_count, com_err (program_name, ENOMEM, "while allocating buffers"); exit (1); } - - if (v_flag) - fprintf (stderr, "Flushing buffers\n"); - ioctl (dev, BLKFLSBUF, 0); /* In case this is a HD */ - ioctl (dev, FDFLUSH, 0); /* In case this is floppy */ + flush_bufs (dev, 0); if (v_flag) { fprintf (stderr, "Checking for bad blocks in read-only mode\n"); @@ -158,10 +178,8 @@ static void test_rw (int dev, unsigned long blocks_count, exit (1); } - if (v_flag) - fprintf (stderr, "Flushing buffers\n"); - ioctl (dev, BLKFLSBUF, 0); /* In case this is a HD */ - ioctl (dev, FDFLUSH, 0); /* In case this is floppy */ + flush_bufs (dev, 0); + if (v_flag) fprintf (stderr, "Checking for bad blocks in read-write mode\n"); for (i = 0; i < sizeof (pattern); i++) @@ -190,12 +208,7 @@ static void test_rw (int dev, unsigned long blocks_count, alarm (0); if (s_flag | v_flag) fprintf(stderr, "done \n"); - if (v_flag) - fprintf (stderr, "Flushing buffers\n"); - if (fsync (dev) == -1) - com_err (program_name, errno, "during fsync"); - ioctl (dev, BLKFLSBUF, 0); /* In case this is a HD */ - ioctl (dev, FDFLUSH, 0); /* In case this is floppy */ + flush_bufs (dev, 1); if (s_flag | v_flag) fprintf (stderr, "Reading and comparing: "); num_blocks = blocks_count; @@ -221,10 +234,7 @@ static void test_rw (int dev, unsigned long blocks_count, alarm (0); if (s_flag | v_flag) fprintf(stderr, "done \n"); - if (v_flag) - fprintf (stderr, "Flushing buffers\n"); - ioctl (dev, BLKFLSBUF, 0); /* In case this is a HD */ - ioctl (dev, FDFLUSH, 0); /* In case this is floppy */ + flush_bufs (dev, 0); } } diff --git a/misc/chattr.1 b/misc/chattr.1 index 2a45667..09a9bfb 100644 --- a/misc/chattr.1 +++ b/misc/chattr.1 @@ -1,5 +1,5 @@ .\" -*- nroff -*- -.TH CHATTR 1 "November 1994" "Version 0.5b" +.TH CHATTR 1 "October 1995" "Version 0.5c" .SH NAME chattr \- change file attributes on a Linux second extended file system .SH SYNOPSIS diff --git a/misc/chattr.c b/misc/chattr.c index 8df57e9..a90bdf4 100644 --- a/misc/chattr.c +++ b/misc/chattr.c @@ -16,12 +16,18 @@ * 94/02/27 - Integrated in Ted's distribution */ +#include #include #include +#ifdef HAVE_GETOPT_H #include +#endif #include #include #include +#ifdef HAVE_ERRNO_H +#include +#endif #include #include #include @@ -264,12 +270,17 @@ static void change_attributes (const char * name) static int chattr_dir_proc (const char * dir_name, struct dirent * de, void * private) { - char path[MAXPATHLEN]; - if (strcmp (de->d_name, ".") && strcmp (de->d_name, "..")) { + char *path; + + path = malloc(strlen (dir_name) + 1 + strlen (de->d_name) + 1); + if (!path) + fatal_error("Couldn't allocate path variable " + "in chattr_dir_proc", 1); sprintf (path, "%s/%s", dir_name, de->d_name); change_attributes (path); + free(path); } return 0; } diff --git a/misc/dumpe2fs.8 b/misc/dumpe2fs.8 index 8cb25cc..f54928d 100644 --- a/misc/dumpe2fs.8 +++ b/misc/dumpe2fs.8 @@ -1,5 +1,8 @@ -.TH DUMPE2FS 8 "November 1994" "Version 0.5b" - +.\" -*- nroff -*- +.\" Copyright 1993, 1994, 1995 by Theodore Ts'o. All Rights Reserved. +.\" This file may be copied under the terms of the GNU Public License. +.\" +.TH DUMPE2FS 8 "October 1995" "Version 0.5c" .SH NAME dumpe2fs \- dump filesystem information .SH SYNOPSIS diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c index d820613..b7a50b3 100644 --- a/misc/dumpe2fs.c +++ b/misc/dumpe2fs.c @@ -16,7 +16,9 @@ * 94/02/27 - Ported to use the ext2fs library */ +#ifdef HAVE_GETOPT_H #include +#endif #include #include #include @@ -78,8 +80,8 @@ static void list_desc (ext2_filsys fs) for (i = 0; i < fs->group_desc_count; i++) { printf ("Group %lu:\n", i); - printf (" Block bitmap at %lu, Inode bitmap at %lu, " - "Inode table at %lu\n", + printf (" Block bitmap at %u, Inode bitmap at %u, " + "Inode table at %u\n", fs->group_desc[i].bg_block_bitmap, fs->group_desc[i].bg_inode_bitmap, fs->group_desc[i].bg_inode_table); @@ -118,9 +120,9 @@ static void list_bad_blocks(ext2_filsys fs) exit(1); } if (badblocks_list_iterate(bb_iter, &blk)) - printf("Bad blocks: %ld", blk); + printf("Bad blocks: %d", blk); while (badblocks_list_iterate(bb_iter, &blk)) - printf(", %ld", blk); + printf(", %d", blk); badblocks_list_iterate_end(bb_iter); printf("\n"); } @@ -144,7 +146,7 @@ static void dump_bad_blocks(ext2_filsys fs) exit(1); } while (badblocks_list_iterate(bb_iter, &blk)) - printf("%ld\n", blk); + printf("%d\n", blk); badblocks_list_iterate_end(bb_iter); } diff --git a/misc/fsck.8 b/misc/fsck.8 index cfc8832..7b78a68 100644 --- a/misc/fsck.8 +++ b/misc/fsck.8 @@ -1,5 +1,8 @@ .\" -*- nroff -*- -.TH FSCK 8 "November 1994" "Version 0.5b" +.\" Copyright 1993, 1994, 1995 by Theodore Ts'o. All Rights Reserved. +.\" This file may be copied under the terms of the GNU Public License. +.\" +.TH FSCK 8 "October 1995" "Version 0.5c" .SH NAME fsck \- check and repair a Linux file system .SH SYNOPSIS diff --git a/misc/fsck.c b/misc/fsck.c index 40f715f..ef21024 100644 --- a/misc/fsck.c +++ b/misc/fsck.c @@ -26,15 +26,28 @@ #include #include #include -#include #include #include -#include #include +#if HAVE_STDLIB_H +#include +#endif +#if HAVE_ERRNO_H #include +#endif +#if HAVE_MNTENT_H #include +#endif +#if HAVE_UNISTD_H #include +#endif +#if HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_GETOPT_H #include +#endif #include "../version.h" #include "fsck.h" @@ -114,9 +127,15 @@ char *progname; char *fstype = NULL; struct fs_info *filesys_info; struct fsck_instance *instance_list; -static char fsck_path[PATH_MAX + 32]; +const char *fsck_prefix_path = "/sbin:/sbin/fs.d:/sbin/fs:/etc/fs:/etc"; +char *fsck_path = 0; static int ignore(struct fs_info *); +#ifdef HAVE_STRDUP +#ifdef _POSIX_SOURCE +extern char *strdup(const char *s); +#endif +#else static char *strdup(const char *s) { char *ret; @@ -126,6 +145,7 @@ static char *strdup(const char *s) strcpy(ret, s); return ret; } +#endif static void free_instance(struct fsck_instance *i) { @@ -142,9 +162,11 @@ static void free_instance(struct fsck_instance *i) */ static void load_fs_info(NOARGS) { +#if HAVE_MNTENT_H FILE *mntfile; struct mntent *mp; struct fs_info *fs; + struct fs_info *fs_last = NULL; int old_fstab = 1; filesys_info = NULL; @@ -164,8 +186,12 @@ static void load_fs_info(NOARGS) fs->opts = strdup(mp->mnt_opts); fs->freq = mp->mnt_freq; fs->passno = mp->mnt_passno; - fs->next = filesys_info; - filesys_info = fs; + fs->next = NULL; + if (!filesys_info) + filesys_info = fs; + else + fs_last->next = fs; + fs_last = fs; if (fs->passno) old_fstab = 0; } @@ -184,6 +210,9 @@ static void load_fs_info(NOARGS) fs->passno = 1; } } +#else + filesys_info = NULL; +#endif /* HAVE_MNTENT_H */ } /* Lookup filesys in /etc/fstab and return the corresponding entry. */ @@ -366,21 +395,30 @@ static int wait_all(NOARGS) /* * Run the fsck program on a particular device + * + * If the type is specified using -t, and it isn't prefixed with "no" + * (as in "noext2") and only one filesystem type is specified, then + * use that type regardless of what is specified in /etc/fstab. + * + * If the type isn't specified by the user, then use either the type + * specified in /etc/fstab, or DEFAULT_FSTYPE. */ static void fsck_device(char *device) { - const char *type; + const char *type = 0; struct fs_info *fsent; int retval; char prog[80]; + if (fstype && strncmp(type, "no", 2) && !strchr(type, ',')) + type = fstype; + if ((fsent = lookup(device))) { device = fsent->device; - type = fsent->type; - } else if (fstype && strncmp(fstype, "no", 2) && - !strchr(fstype, ',')) - type = fstype; - else + if (!type) + type = fsent->type; + } + if (!type) type = DEFAULT_FSTYPE; sprintf(prog, "fsck.%s", type); @@ -699,9 +737,9 @@ static void PRS(int argc, char *argv[]) int main(int argc, char *argv[]) { - char *oldpath; - int status = 0; int i; + int status = 0; + char *oldpath = getenv("PATH"); PRS(argc, argv); @@ -710,10 +748,16 @@ int main(int argc, char *argv[]) E2FSPROGS_VERSION, E2FSPROGS_DATE); /* Update our search path to include uncommon directories. */ - strcpy(fsck_path, "/sbin:/sbin/fs.d:/sbin/fs:/etc/fs:/etc:"); - if ((oldpath = getenv("PATH")) != NULL) - strcat(fsck_path, oldpath); - + if (oldpath) { + fsck_path = malloc (strlen (fsck_prefix_path) + 1 + + strlen (oldpath) + 1); + strcpy (fsck_path, fsck_prefix_path); + strcat (fsck_path, ":"); + strcat (fsck_path, oldpath); + } else { + fsck_path = strdup(oldpath); + } + /* If -A was specified ("check all"), do that! */ if (doall) return check_all(); @@ -730,7 +774,7 @@ int main(int argc, char *argv[]) } } } - status |= wait_all(); + free(fsck_path); return status; } diff --git a/misc/lsattr.1 b/misc/lsattr.1 index ea61acd..5b63431 100644 --- a/misc/lsattr.1 +++ b/misc/lsattr.1 @@ -1,5 +1,5 @@ .\" -*- nroff -*- -.TH LSATTR 1 "November 1994" "Version 0.5b" +.TH LSATTR 1 "October 1995" "Version 0.5c" .SH NAME lsattr \- list file attributes on a Linux second extended file system .SH SYNOPSIS @@ -12,7 +12,7 @@ files... ] .SH DESCRIPTION .B lsattr -lists the files attributes on an second extended file system. +lists the file attributes on a second extended file system. .SH OPTIONS .TP .I -R diff --git a/misc/lsattr.c b/misc/lsattr.c index 6ce190c..3fe4b9a 100644 --- a/misc/lsattr.c +++ b/misc/lsattr.c @@ -16,12 +16,21 @@ * 94/02/27 - Integrated in Ted's distribution */ +#include #include +#ifdef HAVE_ERRNO_H #include +#endif #include +#ifdef HAVE_GETOPT_H #include +#else +extern int optind; +extern char *optarg; +#endif #include #include +#include #include #include #include @@ -84,26 +93,28 @@ static void lsattr_args (const char * name) static int lsattr_dir_proc (const char * dir_name, struct dirent * de, void * private) { - char path [MAXPATHLEN]; struct stat st; + char *path; + + path = malloc(strlen (dir_name) + 1 + strlen (de->d_name) + 1); sprintf (path, "%s/%s", dir_name, de->d_name); if (lstat (path, &st) == -1) perror (path); - else - { - if (de->d_name[0] != '.' || all) - { + else { + if (de->d_name[0] != '.' || all) { list_attributes (path); if (S_ISDIR(st.st_mode) && recursive && - strcmp (de->d_name, ".") && strcmp (de->d_name, "..")) - { + strcmp(de->d_name, ".") && + strcmp(de->d_name, "..")) { printf ("\n%s:\n", path); - iterate_on_dir (path, lsattr_dir_proc, (void *) NULL); + iterate_on_dir (path, lsattr_dir_proc, + (void *) NULL); printf ("\n"); } } } + free(path); return 0; } diff --git a/misc/mke2fs.8 b/misc/mke2fs.8 index c398986..1697685 100644 --- a/misc/mke2fs.8 +++ b/misc/mke2fs.8 @@ -1,5 +1,8 @@ .\" -*- nroff -*- -.TH MKE2FS 8 "November 1994" "Version 0.5b" +.\" Copyright 1993, 1994, 1995 by Theodore Ts'o. All Rights Reserved. +.\" This file may be copied under the terms of the GNU Public License. +.\" +.TH MKE2FS 8 "October 1995" "Version 0.5c" .SH NAME mke2fs \- create a Linux second extended file system .SH SYNOPSIS @@ -106,7 +109,7 @@ is no gaurantee that any data will be salvageable. .SH AUTHOR This version of .B mke2fs -has been written by Theodore T'so . +has been written by Theodore Ts'o . .SH BUGS .B mke2fs accepts the -f option but currently ignores it because the second diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 13f536a..687deba 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -11,20 +11,35 @@ * enforced (but it's not much fun on a character device :-). */ +#include #include #include #include #include #include +#ifdef HAVE_GETOPT_H #include +#endif +#ifdef HAVE_UNISTD_H #include +#endif +#ifdef HAVE_STDLIB_H #include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_MNTENT_H #include +#endif #include #include #include +#include +#ifdef HAVE_LINUX_FS_H #include +#endif #include #include "et/com_err.h" @@ -71,72 +86,21 @@ static int log2(int arg) return l; } -static long valid_offset (int fd, ext2_loff_t offset) -{ - char ch; - - if (ext2_llseek (fd, offset, 0) < 0) - return 0; - if (read (fd, &ch, 1) < 1) - return 0; - return 1; -} - -static int count_blocks (int fd) -{ - ext2_loff_t high, low; - - low = 0; - for (high = 1; valid_offset (fd, high); high *= 2) - low = high; - while (low < high - 1) - { - const ext2_loff_t mid = (low + high) / 2; - - if (valid_offset (fd, mid)) - low = mid; - else - high = mid; - } - valid_offset (fd, 0); - return (low + 1) / 1024; -} - -static int get_size(const char *file) -{ - int fd; - int size; - - fd = open(file, O_RDWR); - if (fd < 0) { - com_err("open", errno, "while trying to determine size of %s", - file); - exit(1); - } - if (ioctl(fd, BLKGETSIZE, &size) >= 0) { - close(fd); - return size / (EXT2_BLOCK_SIZE(¶m) / 512); - } - - size = count_blocks(fd); - close(fd); - return size; -} - static void check_mount(NOARGS) { - FILE * f; - struct mntent * mnt; + errcode_t retval; + int mount_flags; - if ((f = setmntent (MOUNTED, "r")) == NULL) + retval = ext2fs_check_if_mounted(device_name, &mount_flags); + if (retval) { + com_err("ext2fs_check_if_mount", retval, + "while determining whether %s is mounted.", + device_name); return; - while ((mnt = getmntent (f)) != NULL) - if (strcmp (device_name, mnt->mnt_fsname) == 0) - break; - endmntent (f); - if (!mnt) + } + if (!(mount_flags & EXT2_MF_MOUNTED)) return; - + fprintf(stderr, "%s is mounted; will not make a filesystem here!\n", device_name); exit(1); @@ -147,7 +111,7 @@ static void check_mount(NOARGS) */ static void invalid_block(ext2_filsys fs, blk_t blk) { - printf("Bad block %lu out of range; ignored.\n", blk); + printf("Bad block %u out of range; ignored.\n", blk); return; } @@ -184,7 +148,7 @@ static void test_disk(ext2_filsys fs, badblocks_list *bb_list) errcode_t retval; char buf[1024]; - sprintf(buf, "badblocks %s%s %ld", quiet ? "" : "-s ", + sprintf(buf, "badblocks %s%s %d", quiet ? "" : "-s ", fs->device_name, fs->super->s_blocks_count); if (verbose) @@ -227,7 +191,7 @@ static void handle_bad_blocks(ext2_filsys fs, badblocks_list bb_list) if (badblocks_list_test(bb_list, i)) { fprintf(stderr, "Block %d in primary superblock/group " "descriptor area bad.\n", i); - fprintf(stderr, "Blocks %ld through %d must be good " + fprintf(stderr, "Blocks %d through %d must be good " "in order to build a filesystem.\n", fs->super->s_first_data_block, must_be_good); fprintf(stderr, "Aborting....\n"); @@ -250,7 +214,7 @@ static void handle_bad_blocks(ext2_filsys fs, badblocks_list bb_list) j)) { if (!group_bad) fprintf(stderr, -"Warning: the backup superblock/group descriptors at block %ld contain\n" +"Warning: the backup superblock/group descriptors at block %d contain\n" " bad blocks.\n\n", group_block); group_bad++; @@ -304,7 +268,7 @@ static void new_table_block(ext2_filsys fs, blk_t first_block, retval = io_channel_write_blk(fs->io, blk, count, buf); if (retval) printf("Warning: could not write %d blocks " - "starting at %ld for %s: %s\n", + "starting at %d for %s: %s\n", count, blk, name, error_message(retval)); } @@ -457,24 +421,24 @@ static void show_stats(ext2_filsys fs) int i, col_left; if (param.s_blocks_count != s->s_blocks_count) - printf("warning: %ld blocks unused.\n\n", + printf("warning: %d blocks unused.\n\n", param.s_blocks_count - s->s_blocks_count); - printf("%lu inodes, %lu blocks\n", s->s_inodes_count, + printf("%u inodes, %u blocks\n", s->s_inodes_count, s->s_blocks_count); - printf("%lu blocks (%2.2f%%) reserved for the super user\n", + printf("%u blocks (%2.2f%%) reserved for the super user\n", s->s_r_blocks_count, 100.0 * s->s_r_blocks_count / s->s_blocks_count); - printf("First data block=%lu\n", s->s_first_data_block); - printf("Block size=%u (log=%lu)\n", fs->blocksize, + printf("First data block=%u\n", s->s_first_data_block); + printf("Block size=%u (log=%u)\n", fs->blocksize, s->s_log_block_size); - printf("Fragment size=%u (log=%lu)\n", fs->fragsize, + printf("Fragment size=%u (log=%u)\n", fs->fragsize, s->s_log_frag_size); printf("%lu block group%s\n", fs->group_desc_count, (fs->group_desc_count > 1) ? "s" : ""); - printf("%lu blocks per group, %lu fragments per group\n", + printf("%u blocks per group, %u fragments per group\n", s->s_blocks_per_group, s->s_frags_per_group); - printf("%lu inodes per group\n", s->s_inodes_per_group); + printf("%u inodes per group\n", s->s_inodes_per_group); if (fs->group_desc_count == 1) { printf("\n"); @@ -490,28 +454,36 @@ static void show_stats(ext2_filsys fs) printf("\n\t"); col_left = 8; } - printf("%lu", group_block); + printf("%u", group_block); if (i != fs->group_desc_count - 1) printf(", "); } printf("\n\n"); } +#define PATH_SET "PATH=/sbin" + static void PRS(int argc, char *argv[]) { char c; int size; char * tmp; - char *oldpath; - static char newpath[PATH_MAX]; int inode_ratio = 4096; int reserved_ratio = 5; + errcode_t retval; + char *oldpath = getenv("PATH"); /* Update our PATH to include /sbin */ - strcpy(newpath, "PATH=/sbin:"); - if ((oldpath = getenv("PATH")) != NULL) - strcat(newpath, oldpath); - putenv(newpath); + if (oldpath) { + char *newpath; + + newpath = malloc(sizeof (PATH_SET) + 1 + strlen (oldpath)); + strcpy (newpath, PATH_SET); + strcat (newpath, ":"); + strcat (newpath, oldpath); + putenv (newpath); + } else + putenv (PATH_SET); setbuf(stdout, NULL); setbuf(stderr, NULL); @@ -623,10 +595,21 @@ static void PRS(int argc, char *argv[]) } if (optind < argc) usage(); + + check_mount(); + param.s_log_frag_size = param.s_log_block_size; - if (!param.s_blocks_count) - param.s_blocks_count = get_size(device_name); + if (!param.s_blocks_count) { + retval = ext2fs_get_device_size(device_name, + EXT2_BLOCK_SIZE(¶m), + ¶m.s_blocks_count); + if (retval) { + com_err(program_name, 0, + "while trying to determine filesystem size"); + exit(1); + } + } /* * Calculate number of inodes based on the inode ratio @@ -649,8 +632,6 @@ int main (int argc, char *argv[]) PRS(argc, argv); - check_mount(); - /* * Initialize the superblock.... */ diff --git a/misc/mklost+found.8 b/misc/mklost+found.8 index e757ff8..a7fabd1 100644 --- a/misc/mklost+found.8 +++ b/misc/mklost+found.8 @@ -1,5 +1,8 @@ .\" -*- nroff -*- -.TH MKLOST+FOUND 8 "November 1994" "Version 0.5b" +.\" Copyright 1993, 1994, 1995 by Theodore Ts'o. All Rights Reserved. +.\" This file may be copied under the terms of the GNU Public License. +.\" +.TH MKLOST+FOUND 8 "October 1995" "Version 0.5c" .SH NAME mklost+found \- create a lost+found directory on a mounted Linux second extended file system diff --git a/misc/mklost+found.c b/misc/mklost+found.c index 299e47c..2a960c4 100644 --- a/misc/mklost+found.c +++ b/misc/mklost+found.c @@ -30,7 +30,7 @@ void main (int argc, char ** argv) { char name [EXT2_NAME_LEN]; - char path [MAXPATHLEN]; + char path [sizeof (LPF) + 1 + 256]; struct stat st; int i, j; int d; diff --git a/misc/tune2fs.8 b/misc/tune2fs.8 index a3cbf35..a4cc075 100644 --- a/misc/tune2fs.8 +++ b/misc/tune2fs.8 @@ -2,7 +2,7 @@ .\" Initial revision .\" .\" -.TH TUNE2FS 8 "November 1994" "Version 0.5b" +.TH TUNE2FS 8 "October 1995" "Version 0.5c" .SH NAME tune2fs \- adjust tunable filesystem parameters on second extended filesystems @@ -98,7 +98,7 @@ has been written by Remy Card , the developer and maintainer of the ext2 fs. .br .B tune2fs -uses the ext2fs library written by Theodore T'so . +uses the ext2fs library written by Theodore Ts'o . .br This manual page was written by Christian Kuhtz . .br diff --git a/misc/tune2fs.c b/misc/tune2fs.c index cd2d622..1576ce4 100644 --- a/misc/tune2fs.c +++ b/misc/tune2fs.c @@ -24,7 +24,9 @@ #include #include +#ifdef HAVE_GETOPT_H #include +#endif #include #include #include @@ -120,8 +122,10 @@ void main (int argc, char ** argv) gr = getgrnam (optarg); if (gr == NULL) tmp = optarg; - else + else { resgid = gr->gr_gid; + *tmp =0; + } } if (*tmp) { @@ -194,8 +198,10 @@ void main (int argc, char ** argv) pw = getpwnam (optarg); if (pw == NULL) tmp = optarg; - else + else { resuid = pw->pw_uid; + *tmp = 0; + } } if (*tmp) { diff --git a/tests/ChangeLog b/tests/ChangeLog new file mode 100644 index 0000000..f50ef6c --- /dev/null +++ b/tests/ChangeLog @@ -0,0 +1,16 @@ +Mon Sep 4 23:06:06 1995 Remy Card + + * Makefile.in (clean, distclean): Use the -f option when removing + files. + +Fri Aug 11 10:10:30 1995 Theodore Y. Ts'o + + * test_script: Count up the number of passed and failed tests by + tallying the *.ok and *.failed files. + + * run_e2fsck: Create foo.ok and foo.failed files when tests + succeed or fail, respectively. + + * test_config (TZ): Set the timezone to be GMT, so that test + results are consistent. + diff --git a/tests/Makefile.in b/tests/Makefile.in new file mode 100644 index 0000000..4c77666 --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,23 @@ +# +# Makefile for the tests directory +# + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +top_builddir = .. +INSTALL = @INSTALL@ + +all:: @DO_TEST_SUITE@ + +check:: + @echo "Running e2fsprogs test suite..." + @echo " " + @$(srcdir)/test_script $(srcdir) + +clean:: + $(RM) -f *.log *.new *.failed *.ok test.img + +distclean:: clean + $(RM) -f Makefile + diff --git a/tests/README b/tests/README new file mode 100644 index 0000000..73e2681 --- /dev/null +++ b/tests/README @@ -0,0 +1,67 @@ +These images contain various forms of corrupted filesystem which +e2fsck will correct. They are used as a regression test for e2fsck. + +The test_script program will automatically run e2fsck against the +filesystem images. It will run them two times, and display the exit +status for each run. The meaning of the exit status codes are as +follows: + + 0 No filesystem errors were detected + 1 Filesystem errors detected, but corrected + 2 System should be rebooted + 4 Filesystem errors left uncorrected + 8 Operational error (generally means internal error, + or filesystem error that the e2fsck was not + prepared to deal with) + 16 Usage or syntax error + +During the regression test, the first exit code should be 1, and the +second exit code should be 0. In other words, all (with one +exception) of the test filesystems in this directory have some sort of +filesystem corruption, which e2fsck should fix on the first pass. +After the first pass, e2fsck should leave a fully consistent +filesystem with no detectable errors found in the second pass. The +exception is the okgroup.img filesystem, which contains no errors, and +so both exit codes should be 0. + +NOTE: It appears that at least some versions of the original e2fsck do +not exit with an exit status code of 1 after correcting filesystem +errors. So if you modify the test_script to try running these +filesystems against the original e2fsck, you will have to inspect the +test_script.log file manually. + +-------------------------------------------------------------- +Here's a one-line descriptons of the various test images in this +directory: + +baddir.img Filesystem with a corrupted directory +badbblocks.img Filesystem with illegal blocks in the bad block inode. +badinode.img Filesystem with various different corrupted inode + entries. +badlkcnt.img Filesystem with deleted files with non-zero link count +badroot.img Filesystem with a file for a root directory +badtable.img Filesystem with blocks shared between the bitmaps and + inode table blocks and the bad block inode +bbfile.img Filesystem with files containing bad blocks +bitmaps.img Filesystem with corrupted inode and block bitmaps +dirlink.img Filesystem with a hard link to a directory +dup.img Filesystem with blocks claimed by two different files +dup2.img Filesystem with blocks claimed by three different files +dupfsblks.img Filesystem with blocks claimed by a file and + inode/block bitmaps and inode tables +dupsuper.img Filesystem with blocks claimed by a file and + the superblock / group descriptors +end-bitmap.img Filesystem with corruption at the end of the block + bitmap +expand.img Tests e2fsck's ability to expand lost+found if + necessary +lpf.img Filesystem with disconnected files and no /lost+found + directory +mke2fs2b.img Filesystem with corruption similar to that + created by mke2fs version 0.2b +noroot.img Filesystem with a deleted root directory +okgroup.img Filesystem that's exactly 8193 blocks long + (otherwise OK) +overfsblks.img Filesystem with overlapping inode and block bitmaps + + diff --git a/tests/defaults/f_script b/tests/defaults/f_script new file mode 100644 index 0000000..7a3b34f --- /dev/null +++ b/tests/defaults/f_script @@ -0,0 +1 @@ +. $cmd_dir/run_e2fsck diff --git a/tests/f_badbblocks/expect.1 b/tests/f_badbblocks/expect.1 new file mode 100644 index 0000000..d819f65 --- /dev/null +++ b/tests/f_badbblocks/expect.1 @@ -0,0 +1,20 @@ +Pass 1: Checking inodes, blocks, and sizes +Remove illegal block(s) in bad block inode? yes + +Illegal block 101 in bad block inode. CLEARED +Illegal block 103 in bad block inode. CLEARED +Illegal block 234523 in bad block inode. CLEARED +Illegal block 200 in bad block inode. CLEARED +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: +50. FIXED +Free blocks count wrong for group 0 (78, counted=77). FIXED +Free blocks count wrong (78, counted=77). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/32 files, 23/100 blocks +Exit status is 1 diff --git a/tests/f_badbblocks/expect.2 b/tests/f_badbblocks/expect.2 new file mode 100644 index 0000000..f18e308 --- /dev/null +++ b/tests/f_badbblocks/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/32 files, 23/100 blocks +Exit status is 0 diff --git a/tests/f_badbblocks/image.gz b/tests/f_badbblocks/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..fe39b7fe28ee8a3ec27471a6eac468fb846d171c GIT binary patch literal 376 zcmb2|=HPhkrES2(oSB=Lp33m{#$K<(0TOHvE-zEs_AlG9V8d>KBX<|>-ci9FD!#F~ zNTjjX? zkEV>>z2};_%N{Skl@a@s=Z|aT62o`()>m^mLyi^fFy2=$$u!j{eh+hlmY4AJU)#^j z68@&FK5_GjZ@%AN#uR=(`ZM{$URw=51^NH>)#YN52CEqDb1w9rzPIMPziqDXnryeI ziAPTarC4qfitJtEdQDk+(&3_uy67!I@)v@{<43OzfkY+pAm(@KvmH2zKS(GsqG@e6h;OB6#0*k literal 0 HcmV?d00001 diff --git a/tests/f_badbblocks/name b/tests/f_badbblocks/name new file mode 100644 index 0000000..ab20f38 --- /dev/null +++ b/tests/f_badbblocks/name @@ -0,0 +1 @@ +illegal blocks in bad block inode diff --git a/tests/f_baddir/expect.1 b/tests/f_baddir/expect.1 new file mode 100644 index 0000000..8ac16b8 --- /dev/null +++ b/tests/f_baddir/expect.1 @@ -0,0 +1,39 @@ +Pass 1: Checking inodes, blocks, and sizes +Directory 12, incorrect size, 182 (counted = 1024). Set size to counted? yes + +Inode 13 is a zero length directory. Clear? yes + +Pass 2: Checking directory structure +Entry 'zero' in / (2) has deleted/unused inode 13. +Clear? yes + +Directory inode 12, block 0, offset 0: directory corrupted +Salvage? yes + +Missing '.' in directory inode 12. +Fix? yes + +Missing '..' in directory inode 12. +Fix? yes + +Pass 3: Checking directory connectivity +'..' in /block.h (12) is . (0), should be / (2). +Fix? yes + +Pass 4: Checking reference counts +Inode 12 has ref count 1, expecting 2. +Set i_nlinks to count? yes + +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: -22. FIXED +Free blocks count wrong (76, counted=77). FIXED +Inode bitmap differences: -13. FIXED +Free inodes count wrong for group #0 (19, counted=20). FIXED +Directories count wrong for group #0 (4, counted=3). FIXED +Free inodes count wrong (19, counted=20). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 12/32 files, 23/100 blocks +Exit status is 1 diff --git a/tests/f_baddir/expect.2 b/tests/f_baddir/expect.2 new file mode 100644 index 0000000..c21acaf --- /dev/null +++ b/tests/f_baddir/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 12/32 files, 23/100 blocks +Exit status is 0 diff --git a/tests/f_baddir/image.gz b/tests/f_baddir/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f6a78276cafd7a92a86316dd6977cb44497095e GIT binary patch literal 14360 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 HpdkMXuzp-9 literal 0 HcmV?d00001 diff --git a/tests/f_baddir/name b/tests/f_baddir/name new file mode 100644 index 0000000..ee1947a --- /dev/null +++ b/tests/f_baddir/name @@ -0,0 +1 @@ +corrupted directory diff --git a/tests/f_baddotdir/expect.1 b/tests/f_baddotdir/expect.1 new file mode 100644 index 0000000..657ccb4 --- /dev/null +++ b/tests/f_baddotdir/expect.1 @@ -0,0 +1,48 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Missing '.' in directory inode 12. +Fix? yes + +Missing '..' in directory inode 12. +Fix? yes + +First entry in directory inode 13 contains 'X' (inode=11) +instead of '.'. +Change to be '.'? yes + +Missing '..' in directory inode 14. +Fix? yes + +Second entry in directory inode 15 contains 'XX' (inode=11) +instead of '..'. +Change to be '..'? yes + +Missing '.' in directory inode 16. +Fix? yes + +Missing '..' in directory inode 16. +Fix? yes + +Pass 3: Checking directory connectivity +'..' in /a (12) is . (0), should be / (2). +Fix? yes + +'..' in /c (14) is . (0), should be / (2). +Fix? yes + +'..' in /d (15) is . (0), should be / (2). +Fix? yes + +'..' in /e (16) is . (0), should be / (2). +Fix? yes + +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Free blocks count wrong for group 0 (72, counted=73). FIXED +Free blocks count wrong (72, counted=73). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 16/32 files, 27/100 blocks +Exit status is 1 diff --git a/tests/f_baddotdir/expect.2 b/tests/f_baddotdir/expect.2 new file mode 100644 index 0000000..862f94f --- /dev/null +++ b/tests/f_baddotdir/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 16/32 files, 27/100 blocks +Exit status is 0 diff --git a/tests/f_baddotdir/image.gz b/tests/f_baddotdir/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..a52bfb1f6bd4bcda6c22e85be9fcdcae6e56e0b2 GIT binary patch literal 499 zcmb2|=HQqap>4p#oSB=Lp33m{wqc&IqX^rBjdMF1Jd+e01bnN!r$u*(lzb7nDP~}z z5X2y){y^nU!@S}GP8Vm#^m`TMO4>QiBFbxi+P&;ozvST`_p*0>_`N9&QFC3yCf+?U z`Gktmjy(^T)Sk36yIkqz{_MH~+5vW4rH3{5kpi^7Xc7;~oC3*+0E4`}aEOs}0)r^^eZ)dH+Xp+2gIX=1PxG zoIO$ZM4{-$UH!eHJ7srH{xtXElz0Df|62UFbGY z%|Ca4@BDpM|38#nJh!j%{pLKjbFZJ@)tPf$f7eWl_2PGP{#2TH=*Oo0(C^j%`u}|3 z?f(v{Wid<_{x|$%|6;%3KjUBi7xfPRnSaTHg|@l={9FI*`~QIcPk;O;+x%zVYWd>l spM0t7tXTy+uKiE`%O5&Z<@|r=t9SmhGf)TIh}zF6s8JHYFoBT)0NK9f&Hw-a literal 0 HcmV?d00001 diff --git a/tests/f_baddotdir/name b/tests/f_baddotdir/name new file mode 100644 index 0000000..c13ba75 --- /dev/null +++ b/tests/f_baddotdir/name @@ -0,0 +1 @@ +bad '.' and '..' entries diff --git a/tests/f_badinode/expect.1 b/tests/f_badinode/expect.1 new file mode 100644 index 0000000..7ed7b54 --- /dev/null +++ b/tests/f_badinode/expect.1 @@ -0,0 +1,25 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Inode 12 (/motd) has a bad mode (0110444). +Clear? yes + +i_fsize for inode 13 (/timings) is 4, should be zero. +Clear i_fsize? yes + +i_file_acl for inode 13 (/timings) is 39, should be zero. +Clear i_file_acl? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: -25. FIXED +Free blocks count wrong for group 0 (76, counted=77). FIXED +Free blocks count wrong (76, counted=77). FIXED +Free inodes count wrong for group #0 (19, counted=20). FIXED +Free inodes count wrong (19, counted=20). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 12/32 files, 23/100 blocks +Exit status is 1 diff --git a/tests/f_badinode/expect.2 b/tests/f_badinode/expect.2 new file mode 100644 index 0000000..c21acaf --- /dev/null +++ b/tests/f_badinode/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 12/32 files, 23/100 blocks +Exit status is 0 diff --git a/tests/f_badinode/image.gz b/tests/f_badinode/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b3ccd2a77f09f8123aecfe86dedf64ecbdc64d5 GIT binary patch literal 1037 zcmb2|=HPhkrES2(oSB=Lp33m{_Sw8UAtDDp&h`=9#5rGAXie412@wJ}zsJSbyCw;S zh8Dk-{0tj9cRg>2|6YIN?W6xS|9<4| zuVwyp{?A_S_pbM9+hl5j7$02v-Cud@Z+i6J?bq}saHz&jzA>>P_7QKVx$3=171598 zUVXm&`oE)ppC4}bx;y2o{G{#OdF$V9t-b%h|6Tok`+!%I=LOl{uiJ9_=;crKA9{Y; zN8K-Iea*+f@Srkte){&1D>fgszNY6#y9$;vnzikbPyWYzrv91zfj{iH(1%B>pa1#w z{eO9g_5auRS!041O8GwT?)P7|e6r*3-PdJzM)oZ4cKrMM`uwW(tBw}f%(*i+*n_J*!W?D#Cof z6l_|NrvCS_7SBp0umKR_e7Hp0!Rvo_U$yzMNQ&M4vTMD_>-=X|eUAV7P_u7B@2Beu z_v~NuyJzbkesFS{f`wGy(sqZ}{_d9_=Rg1S=<~^vfU}1UA+~>9O_pcoDuB1;@GTvmF9kgRvVBtoa)%zwbvOb=9Z;HC_wbPe- zue(NC-&>S(E-lO}{qE7?W!?UJIJ9-n+0R#6SFhHb k7*cfXR!gJ)lPA{uelQ_LA&r;~)6d>_n|IfkVG1Jy09g*}DF6Tf literal 0 HcmV?d00001 diff --git a/tests/f_badinode/name b/tests/f_badinode/name new file mode 100644 index 0000000..38ee2d9 --- /dev/null +++ b/tests/f_badinode/name @@ -0,0 +1 @@ +corrupted inode entries diff --git a/tests/f_badlkcnt/expect.1 b/tests/f_badlkcnt/expect.1 new file mode 100644 index 0000000..d3ad6a7 --- /dev/null +++ b/tests/f_badlkcnt/expect.1 @@ -0,0 +1,17 @@ +Pass 1: Checking inodes, blocks, and sizes + +Deleted inode detected with non-zero link count. +This is probably due to old ext2fs kernel code. +Fix inode(s)? yes + +Inode 13 is deleted w/ non-zero link_count. CLEARED +Inode 15 is deleted w/ non-zero link_count. CLEARED +Inode 16 is deleted w/ non-zero link_count. CLEARED +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 29/32 files, 32/100 blocks +Exit status is 1 diff --git a/tests/f_badlkcnt/expect.2 b/tests/f_badlkcnt/expect.2 new file mode 100644 index 0000000..6b2ea70 --- /dev/null +++ b/tests/f_badlkcnt/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 29/32 files, 32/100 blocks +Exit status is 0 diff --git a/tests/f_badlkcnt/image.gz b/tests/f_badlkcnt/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ba07cc2f2f1311cf33db1a9031c023aaffa96bf GIT binary patch literal 3826 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 V|N7tNOttNBwqi1wE#(B;zW`dBv?u@o literal 0 HcmV?d00001 diff --git a/tests/f_badlkcnt/name b/tests/f_badlkcnt/name new file mode 100644 index 0000000..d57851d --- /dev/null +++ b/tests/f_badlkcnt/name @@ -0,0 +1 @@ +deleted files with non-zero link count diff --git a/tests/f_badprimary/expect.1 b/tests/f_badprimary/expect.1 new file mode 100644 index 0000000..5410673 --- /dev/null +++ b/tests/f_badprimary/expect.1 @@ -0,0 +1,25 @@ +Pass 1: Checking inodes, blocks, and sizes +The primary superblock (1) is on the bad block list. + +If the block is really bad, the filesystem can not be fixed. +You can clear the this block from the bad block list +and hope that block is really OK, but there are no guarantees. + +Clear (and hope for the best)? yes + +Block 2 in the primary group descriptors is on the bad block list + +If the block is really bad, the filesystem can not be fixed. +You can clear the this block from the bad block list +and hope that block is really OK, but there are no guarantees. + +Clear (and hope for the best)? yes + +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/32 files, 22/100 blocks +Exit status is 1 diff --git a/tests/f_badprimary/expect.2 b/tests/f_badprimary/expect.2 new file mode 100644 index 0000000..b8b19f8 --- /dev/null +++ b/tests/f_badprimary/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/32 files, 22/100 blocks +Exit status is 0 diff --git a/tests/f_badprimary/image.gz b/tests/f_badprimary/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..7aeb6110f3530c018c66ed4a5619e84724892235 GIT binary patch literal 374 zcmb2|=HQTw*EV2c&dg0rPi1&}!`6%0QG)Hk$+X^CKh`s@^^xbOX5`kNa4c?ig6gt> z_0J`3+Inw9+&G%QSw-idm&lb`xr)iWJUl#mCeQTc%vj}^A{5!(qx{z+yY#?!H6% z^k&~1monw*iGNQxJ~5b@@3y*p1p~te>D150x!S$c&PPi1uG;*rc=znQW#!)wzkYf6 y?UAU1^_Qbx{*T`M%Kn1DPF04#>|f+B)I0oVL}4&c6Ev*<#qc`d65<)XahK{Z)cFw@^|I}=-KcRnrzuxD2Th@qGSH_(GRG4?~`Nf=1+tz$qGHd$gj~_iFMcf2|+NlH{ Q-2ct@p`>6s!xTma0P3>dQUCw| literal 0 HcmV?d00001 diff --git a/tests/f_badroot/name b/tests/f_badroot/name new file mode 100644 index 0000000..399e4f2 --- /dev/null +++ b/tests/f_badroot/name @@ -0,0 +1 @@ +file in root directory inode diff --git a/tests/f_badtable/expect.1 b/tests/f_badtable/expect.1 new file mode 100644 index 0000000..f1c00e1 --- /dev/null +++ b/tests/f_badtable/expect.1 @@ -0,0 +1,29 @@ +Pass 1: Checking inodes, blocks, and sizes +Group 0's block bitmap (3) is bad. Relocate? yes + +Group 0's inode bitmap (4) is bad. Relocate? yes + +WARNING: Severe data loss possible!!!! +Bad block 6 in group 0's inode table. Relocate? yes + +WARNING: Severe data loss possible!!!! +Bad block 8 in group 0's inode table. Relocate? yes + +Relocating group 0's block bitmap from 3 to 22... +Relocating group 0's inode bitmap from 4 to 23... +Relocating group 0's inode table from 5 to 24... +Restarting e2fsck from the beginning... +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: -5 -7 +22 +23 +24 +25 +26 +27. FIXED +Free blocks count wrong for group 0 (78, counted=74). FIXED +Free blocks count wrong (78, counted=74). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/32 files, 26/100 blocks +Exit status is 1 diff --git a/tests/f_badtable/expect.2 b/tests/f_badtable/expect.2 new file mode 100644 index 0000000..d6a69dd --- /dev/null +++ b/tests/f_badtable/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/32 files, 26/100 blocks +Exit status is 0 diff --git a/tests/f_badtable/image.gz b/tests/f_badtable/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..48dbac156dec831ccd31f08fb832c43ad2a2ab71 GIT binary patch literal 987 zcmZvUeNfVO0LFjn2{zZz=37%^tR(MnzBJdBoSJ&OPSee61x!Uv)a48FWwKxG5^~Er z56vq{56GBv#ThUM+(c`NYjcK?EMIWWQ|t_t5sIL^=uf_5{kPkmyXSMCf1U@+_VF=h z5Mn*O%IN1lErCq)S?9w_LeOSdR>oiMPOtFnbND0oG*b=1$O{AN(8h3X~M~lbrI+J^bEJhH`>2B&JzuJw@JnCsFj+obH`% zcf3b2Iwk`?)6f;~lPbi06q7Weh|ZqgFCu7d6k^eQkZ5iL4PEA+(eGC7Lj^5tT&*6M z3P7QneJewr{*0ilI(M5sRqdl96fMt_wbyU01hi|nH4HSdW|o^nx~bO zAwwn^7Hm{C0#~UlhjR)RKSFY6d;x{EhL49EE`pQB~ zkRg2u8gQav2h@Gu4o-D$=yD5Pvw5y6h6U}b7G%i~tNS-PHu*{vNR4Jm;%~C>_U(uM z&g6wf#6Cp)aoGtNA1*mDgcb8eVrdLXf;=+}>Nl1&nMrWn=C4f+w7vRdStir?nnieT z0_o{Nb$5iT;#s2^HZWqSr}?&a)k6O4(D_jR&5Og{BH2L>e;=;NIuN2y5x%C9VxVZ{E+}ure;~VhL z=O*~K4rjeFfcW(36LixA3A?Y)Bv4NFud=!>&tj>|`6Yi_X zee|5BxqiK+T@eB@8^Qwrxy vRZNsoGBxnmgW%GY?a3zxJN9XCVwgHxgIB88BOs{Igm`^hG4>4NctC#xA3Fe% literal 0 HcmV?d00001 diff --git a/tests/f_badtable/name b/tests/f_badtable/name new file mode 100644 index 0000000..e4a8bae --- /dev/null +++ b/tests/f_badtable/name @@ -0,0 +1 @@ +bad blocks in bitmaps and inode table diff --git a/tests/f_bbfile/expect.1 b/tests/f_bbfile/expect.1 new file mode 100644 index 0000000..7b6088b --- /dev/null +++ b/tests/f_bbfile/expect.1 @@ -0,0 +1,44 @@ +Pass 1: Checking inodes, blocks, and sizes +Group 0's inode bitmap (4) is bad. Relocate? yes + +Relocating group 0's inode bitmap from 4 to 43... +Duplicate blocks found... invoking duplicate block passes. +Pass 1B: Rescan for duplicate/bad blocks +Duplicate/bad block(s) in inode 2: 21 +Duplicate/bad block(s) in inode 11: 9 10 11 12 13 14 15 16 17 18 19 20 +Duplicate/bad block(s) in inode 12: 25 26 +Pass 1C: Scan directories for inodes with dup blocks. +Pass 1D: Reconciling duplicate blocks +(There are 3 inodes containing duplicate/bad blocks.) + +File /termcap (inode #12, mod time Sun Jan 2 08:29:13 1994) + has 2 duplicate blocks, shared with 1 file: + (inode #1, mod time Sun Jul 17 00:47:58 1994) +Clone duplicate/bad blocks? yes + + +File /lost+found (inode #11, mod time Sun Jan 2 08:28:40 1994) + has 12 duplicate blocks, shared with 1 file: + (inode #1, mod time Sun Jul 17 00:47:58 1994) +Clone duplicate/bad blocks? yes + + +File / (inode #2, mod time Sun Jan 2 08:29:13 1994) + has 1 duplicate blocks, shared with 1 file: + (inode #1, mod time Sun Jul 17 00:47:58 1994) +Clone duplicate/bad blocks? yes + + +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: +43. FIXED +Free blocks count wrong for group 0 (57, counted=41). FIXED +Free blocks count wrong (57, counted=41). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 12/32 files, 59/100 blocks +Exit status is 1 diff --git a/tests/f_bbfile/expect.2 b/tests/f_bbfile/expect.2 new file mode 100644 index 0000000..3ddc85d --- /dev/null +++ b/tests/f_bbfile/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 12/32 files, 59/100 blocks +Exit status is 0 diff --git a/tests/f_bbfile/image.gz b/tests/f_bbfile/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..3b0138166fa95827901317a86aa021f8f31657d2 GIT binary patch literal 5195 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 literal 0 HcmV?d00001 diff --git a/tests/f_dup/name b/tests/f_dup/name new file mode 100644 index 0000000..6296b83 --- /dev/null +++ b/tests/f_dup/name @@ -0,0 +1 @@ +blocks claimed by two different files diff --git a/tests/f_dup2/expect.1 b/tests/f_dup2/expect.1 new file mode 100644 index 0000000..6625f2f --- /dev/null +++ b/tests/f_dup2/expect.1 @@ -0,0 +1,42 @@ +Pass 1: Checking inodes, blocks, and sizes +Duplicate blocks found... invoking duplicate block passes. +Pass 1B: Rescan for duplicate/bad blocks +Duplicate/bad block(s) in inode 12: 25 26 +Duplicate/bad block(s) in inode 13: 25 26 57 58 +Duplicate/bad block(s) in inode 14: 57 58 +Pass 1C: Scan directories for inodes with dup blocks. +Pass 1D: Reconciling duplicate blocks +(There are 3 inodes containing duplicate/bad blocks.) + +File /pass1.c (inode #14, mod time Tue Sep 21 04:28:37 1993) + has 2 duplicate blocks, shared with 1 file: + /motd (inode #13, mod time Tue Sep 21 03:19:20 1993) +Clone duplicate/bad blocks? yes + + +File /motd (inode #13, mod time Tue Sep 21 03:19:20 1993) + has 4 duplicate blocks, shared with 2 files: + /pass1.c (inode #14, mod time Tue Sep 21 04:28:37 1993) + /termcap (inode #12, mod time Tue Sep 21 03:19:14 1993) +Clone duplicate/bad blocks? yes + + +File /termcap (inode #12, mod time Tue Sep 21 03:19:14 1993) + has 2 duplicate blocks, shared with 1 file: + /motd (inode #13, mod time Tue Sep 21 03:19:20 1993) +Duplicated blocks already reassigned or cloned. + +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Free blocks count wrong for group 0 (8, counted=22). FIXED +Free blocks count wrong (26, counted=22). FIXED +Padding at end of block bitmap is not set. Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 16/16 files, 78/100 blocks +Exit status is 1 diff --git a/tests/f_dup2/expect.2 b/tests/f_dup2/expect.2 new file mode 100644 index 0000000..0700500 --- /dev/null +++ b/tests/f_dup2/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 16/16 files, 78/100 blocks +Exit status is 0 diff --git a/tests/f_dup2/image.gz b/tests/f_dup2/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..e9b853d6f458c0b7e459b49c04b49dd2feecf7c4 GIT binary patch literal 14589 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%0DfpF^9( ziec9j4*L!uSIf7HURHY}Vn4q69j(et6&<*6f0P=AQI&K(QZfx-f5<4U~u%L!*F=EP*#{iVtxIuX#EIos37wW3_>FcXHy^H z2E+nHcV79Es*W9#a@eHq|N2MkE-Ql7=Mz178J?hD#Lb+0Zv7-9Y@sWUm`JHx&R!9& zZ)nF;9%xN17oez09w?)Q47FQcw+g#jllH}3rSZ|0EHeuM$0Jnguo(bQPoiF!NfXX*1xBq_P0 zzJIZDYg6D;P;D$(jKk`k7_LlyttZEc*_}L@e7zed=vQN<%xjAr+>efw>54t7<7tHp zRZ+Fa#N%3gX?uw$chhieh7oP|y7@T)YfNKh8{A4CAih1RPGFct5QAnJ)L-G#c7@);XAy&x-ziaa#3IpFFho?qUcX!{qkD}=W5GEafxJ4b!1w_RzD$`IIF3L@*uK zP%D?Ru4Z-$zf8K|6>X6%yQhwsF)Z6a@Z04Kr~F(BKLL04h69KB$=^B}a!3#J&Gc(k ze5+I|c`Z1@$>kZw=ep2boew=VT0L$8m~!?Lf)`l8bL21hTU)jxp9S_ao_U>$#gFZ# z)q?UXDMEO4QqYJPy2};k<9I*#ACI-&@4ecaK4eoapTydtV^-d{fRdKfl-dZ*z;mhm zm9WGmH6ts~sjLpskF=Fv@;*>~>)x{MwtBzm2#toP*q$U+`x@(8ncW}9 zJDMTg7d_ip(;w{A_&eTM3coAk)n5d;0G!ILRgENje8H7l=pAi_%Fh^*bf@3^9%*^| zYZbdXN?1#KNmm*rM3nz zy!(n@W{|laK7~s+q({OChQ?V<$jdH1xHJY_*CBSb^@_eGsvmtAzkFn2q&ihuZ0%+!hE^Zd7wzS^SLo?XI|mE75m*2EcP90zLj zdlde*#7Mxc7cTrqsaoPCw;G1W%J<`8!@_7)!l7q3I7jbv|M5ox4OWF)IOzJ{WIpw( zgp(0%4-RS&9a7NkV!O=(I9p{S@}C;>t<^xmYz&=HWWfWQU}RUn}kDF%>U z186{c6M+PRQl$412_$*ttoN+*6V80NpP6~CYrf5_0mfduxB-=tJ2AN1YV?g_p@i<6Rd+c~<^VTEhFs(a z!-m6hKC-v&6X6Nq!*Ax!LH%-3enBg@ikr4J{t*^`P&19d@r0=>XiFbndsXk{KWkTY zLiy~Rb{6nM|40#>IUTz&_%1kn8vXoiE`RZ{#=g1zWBP$Hn-xRM;X->kO4?&@n$Eh* zAE5;Z@C^99T^Pkac7~z-;!^a#Cw1ezUHI+g6RxF8b$rr39%XeyN3l~6`!tygG4ew( zLdRAx{b{Vk4u(Qc4j4SPfvPOgo}b1`XiM)gmA->9)rnqeaW4LXB17PF;4RuI+i}WH zoyJjeKnmqc@=|etoJiJQ7M61;aO+f{oC+6C1?SUPg3lR~8zqKdJ9d8#SB3mx$?2yo z><`N>zr$_~MkpN^B+W8L_Xs%`g;HXC*7g?;vAVB0S3^DOM7>v~hMYuJgsalL=r zW_I4JBnXr4up~H31LBb9oCE+iczQ8rg28|LrFv5Q$M+RU5IvmMChvlkC`I?htRMyY z053#iYcvJsGmdD*5uMg#32wR;jXcbX!hS6{KGO(HJmzQwCI!b$!@kmLa;!(%1~r7( z*%!z+{pFMVi4ZJEZJb?xJ$UNgn173PUqP9}=1*h?q|o`=$8JsLJy%uQ+T=**iORy+ zb`;aptP2B>L(8Wzy*gwE+&{kXXTby*rk?@)*$32w0RTjG0AK?MIBf?U{#4AS(HV>X zcrsdKegsF@bzGWXaK=^wCzWY^-=6)pwc8`7sRM&cD%~Nn0KmLDz^1F4ArrsB&o~44 z?~o0iti?VsluA3QN06%=%|DkecK}=nlb)&G~T$Wl0Y2n0jJo%l&m%#1ovU@vik#VV`SgSKvgcqQ#w~D`O_z zWs>#~C&tsIf)Hu}e>yTsZ=zo*@3XOjXUS`*7c4zVzdpe zo}HgB?G=bx_o6zL_m(79RNySc64(TR#rwvaFo7^RJ1mln}aSOfGo)prx0h8wl`hzc^#8Al{%eiTxex_K%XgL@Zn-USq zcl(Q_RN|$qF@#pRiF8uL&X|DKJDem#Ct}c4$8?nox*IRqxdCrKFdkdvZKdN@c0;Vx zotvcV*4&Fob`r>5T+ol$BJ-c`d5g>!=Vf&2ySmwR>Ib`htJ7F~{onPE_ix;H2ZG)d z@$A^T*7sgpia`nbup$Y6Q%QO5gbwrQ1~D$%XuoBOO1hS1Pvl#TDv^>MLiBRCp|GWd z@+g#w{<`@JCyemb#GrFL(Qp%+SZ$+7 zJ**G5eUX&H#50`q!8}(ut0~!wr5YR_6z?--@P_YUgtr-lW$xW539ayMgakG8fF&<$ zA~-1OK0@4A{l#@CPx82)n437DT<)^PEsN&82g-WJX_%Xk3U4+&j1E=)yKh(wKMw00 zHF@NZDxH7kztU+3$?;zDy!^!QTvjFLtrb_eL0nSp;_{|eP`WUmbHd!ZckEX4z%_SD z{(Au;`voW+BmRyQT{-j?jz-mIdN-E-@;J+sx%zo&h5gNGn*gSo#NFP%%(yt1^- zFD%dNqRn=-cyJrV($F5xMUlu8QEdx~?OV)v8*Gv(LtG5rh*UdP#d*j~CmOh#J>avO zI@B*!bgnOS6Pbckw;~(#py6wOOWbsg@)oI$92Ol<`5 zk9L_6s!C%KK`L+S4nG*z?up6sj#a3Qzhw7b?O58=F_dhnIK3-gH^xqU3HH6jZ7u=- z)VJWO!~L*IdM&g}v$k@_hUlMdkUOvy%bwj9PXB^P zHIa%Ae{Idd8ad>J0$ofFx7e*UZ1AA>5bq{+Q_xq4@9Onbhh;}tgY}CE7E14fnni_SjK^blA z33;k`ueiaf0VK+a%$GhWZysGXU_y3=mJcdz1V8@BW@!xO5Dsnor`jo@y6)XE8!N5DEQGzhj8P>q>lW?ISk%NV7 zm!wx0e(Sb*8wZldHBLmWn{X;V8$o4RB85oK*F=TRxUlmB96L*eG8wOaSU*Fh^aXA&~~R8}EcXDF*2l!qPUr}s-s z+;;PVlPD>+Z|Z^Wx)96u)$t+@OBQ#%;E&S@545i#>@G>(wjRhj!gQBCLiFC}d*+UiMj~Y9 z6Mtoi_i`gp%KSV#0ff3Qt?yZ#tLQ%?jPIT85@gY-YC`s0F0*XX*1!a#UWa1DSGyyX zVCVCu6~Fw&^Cr~*1JS!kV7)QoA(k3B`Iav;MwC4+#-DZP7B*71Y4`lI!7jqg^ACxguPF!x9T--c zWOIB3vIeYZ6-(t>^_89bqe4GSG;prgP7O1j55b3w8Pxs{VU{Ift!li9*18y@&A91~ zIyr^c9vZB5an9bA#;ATp*nUyE8c}?9i2mKT=DoRQtO8s!wlw}~pTel(KDQ(ZeEZHX zllHlOqxQVgR|KAtSFd#)fU3cTy=C7@|J+B14TDL#jC*#^(;1w9jlxLiZke3~UNY6G zNHW#PSbE@nc%cIxBNN<0QsSQ4+N_b^Qfg52!!KyLGkJm8szlzRx66(?yMyC3I6?>S ztAeH1v;2w=!UHLA*~(oHse3^QrNvp+s_!wt!LK{Ny7YJBP7KbD?P>6d9I}kZ9;LiG zqS)fER3!J2#(&-UnRXCkfpRMUUi1l(S?y5E7Gd3YE!4y5jWxWpLbbUwtXf~Z*;h+3J@G z+?}jKzm4}L1o>Vam{Rpp?)}~Q<8nlH;D8aiIX;6K$kq6n*5s8(aaDY=mIGFZMe5dG zpTHCnlthjRt+PS;*U6%)DOuTX@Mcll>?rtVJ4c%@?0E!Q3L*d0p+J2W7J%}gK4^R( z=Mf8n`jKpj%fV zE#VQ8sxwR#YPj^eByrdTihkDy7{ZWIq%Yh>>x4HmL~XbH3T-3U#X!x9_HlJKaUiQW zkc%UT%)(2{&zQFNFuCDDG-zaNKt_$lgQDW<{#5djCJw9|k8E>Zi

n+qP}nwr$(){@S)}Yx>{W*{Yq{P1Q}#Jvlco?^UXj zx_Nk!5D-_ARP;c==GOYA#sHT*8!j8-4jI`J4Tm-jnMQ0cQkoGwNy6jAA`+}d7NQM@ zlj=QHMQe8>Ir{hje;7aj!2n1sN1r*~!Y|ZINDet%t@&-y+% zqa?ogeBeUI`tJn{e%N`_pa0y*eEEqC^xe(?w5{QtrGNVRj`sE4)(qHcfWW}q{4wL( z{_VGsP>q{{q%Z)ky@aRi>w>m&W$B5INX^FZrfS zzM0*9cWm~uqMdqJvHOD6@`Ya6>3@2urT_jM?H%9Y3$mBf-FYq>eoX(? zc>IAlJ&!zN@-CTuOy^xNeV5Mt&-pPq`$70WJHB>Y-%0W+>Hgp1*~cB`FUEgMX#Y?6 z?^xfRqI_R)V3R*r|9%kvEv;-6{SdYJz;K|JmYi<={J8&sD@8^s!Ti21lo$Q*SFXSR z2j7b?7})jCFSq%FfsWqx!$ePS_hYK3xBETY*Vp%-=2rv^4E&$&e+tn6>Sjx4e}3E~ zpMAaPc1@LzDColW-(=|@t-VNdS1gp2e5-CbcYOCL@hiaD&*`5)5brN^h$vT|hro9U^Q+KxigRnmT!TtZB%>Mfx%)ue9QfcFxxl|Ce5I0<<;j@S`*D@MC7t=1*bK?o(s_ zwcob(m(%_2XZ!V6e(gV9>wlO<8~;82cks~++Fh()%ltJqmM!DApA{tSzSiGR+uzWg z<=+Pto(TfqSakUL7W__5ZUNLw?014azp=o-lMMZhi~SwYH~$Q%r}8X-{^i$s`3>j$ zo$OEXugdg4#V_God)kwKK(8Af~$Rz7K_Q`q?Uo&I**k6AoTtsq%@O$Lwu1cn|tpv6-}r%fG-x<_O62 zx6-_kO7yrh5ceW>N?uPk6SfPTgT{Y2z#jEzeSDAe3~5fDK0&k8c^?MNG*(;!tJLFl zv>c533CH-Vqx1%C=&78U70ZiJp^1u76%{70gPvh&k2Y1N_nR9R%LD$>fK)|($cV~CNJ61Sw4fWhI zizK39*$W0sd{RN=zS?1Xvroh&8Hik(Q_W9RhtYZx#~nv+!hq4GbtVJigTK#IS$ zY&MNv%DT1u<0*6xis)mA61=0{jc*7q1OE3_YIs1mgML7laF5R0H#pW)sf{eyQ=t(X zj)A^QDGtL6xfE+;+oam=(i+tRXAUr$cSmX`Gb{FZ?CrMe&M9%;1qLg0f-Dv$^ZKUu zJPxPR4Q)Oy8>0sg(UvZH8(3HspgnM`HcChBXmwzR#LW&Zeng5=ZtxqKcmv-^3GP!a z&MpxluSL&bCHi*FQks%y zamF00+DJXxV6cNe5>Mvurx`140T)-xe16a@6^^a&Yq@dB`YUe*5-+%e?fiY^+MKC# zyF7U1B$~)?RTj8(1l^P_)1ZsNcL8YLmGP)5>VxntnHc<262u2Q&+8zv!;Ls9u!;;W zi_MkK?s8BQ)@eh$TVtCZNXcD4rGLn8Lv8>rd+3V}Ep7KT25C44Zzc8^s@m#x$m<(2 zjH)F?z$vm^38k*h#7t8J2Fc*Wis&?-ETQnE8FJ7P)$>ummk|3=kElsg0V_@B;xW5t zv3x##@(6CTPk*~*3S=9+fahUy3C6qp<+iu_bhXPKkP!@ItWs1?hs(RwlYeXmFDzK})b-|evnr4>+i%o?qAtlu2`k=YOxPhW>9ZF(~#XW}mC@wZ<%akN^y9`{(4#_kUH%aQ_Sa$C>W^=v@D# z@;P!-opQA$_8hzqni|-e$}OTI4h2e8}BMrLyy+_a9}ym z8mI2N?)~)_cu-{!d>{xAqfH$Rs6q;~G-2LjQl(^^H3w@Nq#uLisNgZTSwah%(kNk@ zx?I9{eb9coROs*ZRrnLjdLeM!utK8|zdNvgW_`IN5-1-&h5UCh1hMgL>CebPMiG>wjM79i3%JG6e+~KTX0p`@+jNK1aL-o+J|pE1}3KWjSQkm3ogzL1osiHY|L#IR6Se?@#Fv=ytCQ;TBS` zeohybN!%RgiHBm#JbMBFk6Aqs^+g~L1i$0*cIJ^qw&8kcq5;5`eezQQ720yfr0(fQ zIVhTtZze(IwIv64u(qcV{wvYT=j`EY56qL$gQl3`f>lr?%oS{OqFwi*&sV$Dmw-B@DD0~8yu~74ciQh$HI7|_8 z-q$Vx0f+2iGPPmW3n}+B`#|&A><>lKc*^xd3cCaH)*Iy1r>rQ{fD^R=bD=_1s56ai zb1BR8VtkF39polBLHn(3({n<6RVh-%NGX&G0l~GmL~rw( z_)f8X{G`g(>!m7mMo-q-d_btP^9Tpb~n9mnwtV2-M9B;67Y z74zl1(_8&@iG`bNLc6$R+XnX>`n!kQDVs4<9*lz`!SLCy*swB_f85C{pN;=)sfOz& zODX^PsUg5k{nXc0P=E~YQVs}pk)yCYLbF`;wHIzf2^x+rO6S=LXt+EYV}YHC*&;=S zN{aWe;o^@8l6yJ=)tO;2?P63B3-{SL6-&N_FUqTt3a?R75+dVeasHy^6tbzph&NrvziwPa0iK3xsK7;NbS(P^aOudo@cwXVl~R@N zFhwx{hTI&zI>7&+6&X=2DR`jTNXV7X9u$vAj{Zd1h^Emjk%Yxqxz7wuNf>`gsc+-uSC{K{UJ{FokZ9gAP&I{n1q5M(`;*~4Gb3=1zLLZ<89TR)IoBZF%^%_xkr>t%WwI>%R2doNLZ<)% z*zovxbvf1O{mJbtn7#|25!?eBWB6k6g>HQISOowU zgdZ?N4)KKf}#g4A=eu4TOO9 zi>3Cg*o|FPy;{D;AILFi91ZfK$!BDV?;Gl&n2G5T(;~xUyqc+3Yn0(rHi>2UVV&6i zIi<+9EM$4g9~G!6s5C)M1ooMab``?jnx?>)eGw49gC8pY3f)b0#%v zQ|vugE)$@I8xQ+?G%|v;!2sb3Kp}Y?34=B-yZ{2QB9AXUym*^yV#g zr_&6fi3`;@`*QVdD?Od9&aSNq=AGBZri)-l;w|aoRAeuAVa`4|m$8?MW~eT$wvpKI z6;7lj$;M11w%cpj@{GuWb}#(klVPDzTo zH?&@Fd$9W-5!cb`x!&we7nGdG799tk6@@&kFM78PGp3I*orS)kD`|*N_@{dt@4$8z zE6{f5pm80K9q4V(wX zD2mO{bQh%xu3hm58|JG8fO!5g%|zkldCp8*fjoY0m&REb?o4eOr^m5 z^v>80S=c;RxwEzp0@iEFd6%B1N_nVgqO7I9LJRtep1Nqp@?9qVb(VmM>o99tTns0q zd&bQbVI&@<*hDIzU-&KtZ*Cz!vl;k&4Ci#m^AChHP=``Tm*&aC-#3jwR~85rgQ;6K z>3*F-l2&kBm~3tJa0)jaUKWbIf0x+WZXrXuWLn(X#*3s-_Bk$jL`&*01+^yP$OE`S zC8zQ^TkD9+AHS&LuTvsokr!p9#h#4lWvca=LrlBU-;bp#lM44ii3yW+`b>5vPAzeb zMb2^3;bZPsy|%V&n@8$)N_9sP+t{`F1Ck>0z zQc|fLaQVKa!ND`_>eNWdIbILT^tg>>9kX%LcYb#j4sHq=%*Yz~LYhrYS1Yq#`dd>s z6*Lo2Syrkztwyb#^B-CcY*(xKICxcoE-~DBSc2R_Sbi;r1|sY~b08s}lI+`uFHgc= zmw!Q#x2dj#icF{nE1boXZ;1zIKe_K^F#+Mv zwYWHm#5(m%#iDL5qZAvtxSL{PYsSmG7)uwTxG{-aTG;ryt;0S{#3L{0nbVrEXkiH{ zdRQG~&Aqj!7n)|Nw`9x^py)J>yp&=Jf)^|cK-O_-${5UrbPAA*)3*b#BpkFN4v@H~ zF|x46bV%X!0p{7GpxhXV4nF>U7h;LluitP;F|d1PNxG?$^`0~2jrC;EX+nY~5@h-AS93)c={aw~N#8s2vJE*Z1x|dnp6TEk%Zd!baV(Upo zt1z8^N0?`o?0yrC$H!A&k0GWr>tho-oo5ZY#<)e{Y9&XZo=JxOm0cE9<8LvYyRz66 znG#%46vbp*TI`&PVrDyCjd!~(T1+yil}ZOE&@6ow6kxOK*_I6xE&57$;6#A$h0jJF zdL`QB#&qdgZTHRXj&zp1rHvf!q{^4HRb&ihe?z%EErtmXkSh(&D<75^%sqVKa}yS^ zNlB$8nCAH%=PGlu5`d}A3D^0iIe^RS_(wrj1Hw>qoj!%&xN#>XQFHAEVc+A85Gv!o zfVd1!;rjBIJZ~%(<;CFU1GSm2M|0gX_8F(8R4 z4J2{Vm#O1%dy+g}70>eBib75phupJGvew~vq`Wj1|D2*IUkYs&;$)p3l!Tx4<~WJ$ zLu6-~RG4N{@-^r+OW#fhm8_KX6g^QGsTMcQI1%dh{ZpjWamZ_|em&!4YYMT!E`Is* z7_ONcLw;fWwb_oRCDAw7hM&Ycl-hHo7jd?i(GPi*MD`rAGzOuE&Z*+QzYLiTZ%_0W z2B=*XpPMY^X+3i}uOi(^1*?^?HaW}N&!c?@z)SPip>3^f6&_*gb0~7o1hN6*H*;BYUVfZ`ajEw&rh$w%@19fD`kQZWZ`h)qvuR? zLF(s$jkqoQK}S6#@5S7!=9)@(1Cz%fU)pPcuVTuKaM{bw64q|c0p7^gU25-9coNiR z3&CWSPvmGf<5B3cP!U6$QHSMUk1bi7fp5T;DbUl&RRm9wtH`AlnmkCM5AS+GeXb81?*!Q!}28f%_?$@i;O^qFzDqgZZ1r6W`))^0*PNvLJ)?_B0uP& z`w$>)v9NGU1yZ2F{qE<+46CWb@|YC!(?y^a5uXavZE3k#lz*k*OX}hEhaxgy&@2e6 z*QkGYIgOHy84da6Ny`-rvGxH(lFDKSn}N`-5}_T^$wSnBMvh6NL92w`qAUB5Gkg1Z z^#fpN*W0FCA-oFj@3)}K>ZdP)IG1r?9j`l{C-wIK+DE{Zs zVdsuY<8E;Y3DW?b#`$2YH0fZg&}BGZyVur_V&kT3te6I&6cRkfd$$DDzbP{H^tWvF zusK>jmh>fu6*p=ftXDVYZLZ#as6+ylbkUVj?tBD8gDdGU7Z*pL%4F(g5_BTgkyJ(w zjVcg934X(=OCe%E@Yuv7@!CWl>j#tTOg2Z|OgrrSmK0RAQMo$Sr+{@KqK}|4&b`$E zpXpmQhBHD8Ns3iH$UWjMixAX7-bAd}olAJp!m&tsxvE}?&^||z0sA9DAGkEV z1CL|W_V(hLsU{UJ|M5XL+=oBMF#%ezxX|zaKGB~H3-CO;)v22ofK*1&pxnTc{@&dx zS}$GiQrwLtm#fU_hW@oeupanCwiMz|LPiJ}StUZz-25Sz2LQG{m_tPUO`W66fT;?-MSxhSaVr zl&Ip3do+x(3&TQrKQnZs2~bXg&#A|$cQV-m94Et&FNPu4@238+y7UczSAy8G7kR3# z#(56Wnf*iCa_U3-iU<2xVOdAx*c_)wB|L_-V!~bXd#+V@1jZ7=EsBZv*KMM<0!#_q2-Yz!0Xyk*QV>>?b8&MH7- z7cPHt$B$j}yIh}7kbzIYDmF?41+ z+Q81a_3w|+6e)M6&-CUH1bC-@i*PHPlTb|w=U<^F#fit&h<|7*e>72~v4Q!^^!@bU zt`|a-l<1&Uh%-9N*R$Bd=r8YKVe=l1g7q=nVo;q+JY3phkgA>0Y%8O-mx`bcs!jS| zLg*m}`8u%G7i&UW#_Q|0;Ax&qO!(h-0|@q)*x*k?u-073|6-vaHLVhwWTkq`FBs{H zZ{+te*)jYGJ#Kb--UQC*5Ck(9FoauW{y_=;`YzKiL#=mqU&VR^5BIK$GiWegxpZ%l z_r%qH&2O4A$Rv)y>}L$efIkm}m7>Ri-NBl;6e%oD@X^^ci%v1GETT)B1|KSSf(V)G z7b8E!azlp~6x5HUKLbdIF_Cv*dVjs6TlY-YGt4o67`IeOw%5{eR37QDj$Cueu;G$F zpc){5%;Gaf$rqYZ62@^dnWC#rq%e>v+ykvnl#x`D}*R&@uEyP;ax~%Jv9XgnrI6R?ssSRiPofRW(+H(SmgW0&V|SRU<+T??y?2bhfetEYAu&IG4^JZ+$Pq6Cyhs~TgkLuO0| z1G_b>WlDwdY^f@wZtV8%-I>G*v0gi{((W zKCzRPS=!mA!Ctxw=@WipC`YjLSe~`{3`J9nJyLi;g;4i4tl-6DL6MD>Q4Jc%G?&z5 zCRWjQnd?e8Z&MxyNOIa)4}B~BaB&U0B@+_w)TZBHN#%Rhp6g*&KBh*Q3nB>-ZaXIPJ-V9$-D@@B6*U>o*3cO9l!zB z##lU}@@+on0I7Bc7<|x?Cg^c4#PD|a5}zFKSMkbH!2@-)bOm4%wb5z3WQeE4SxrDZ z0lxK79G>QbV|%oa7tCs+tki{Pyol>%bTjddH6iMo$o%!R-1#3lk=lELU)UtfQyB&g zW5=n5^};03s-kci+!c?FfvRL<)A6PMJXnv%N3&p?%WshpSgT`lBy3o``ffJN{${HV zNMT@eG$auiw$!I=UFm%vbh7fdKWze6@3+SKoC9XF>C8t>?JgSGm6B5Ej5~?e_fMmr zi=*tKY-pHFRSm7DRN34sQ$7=Y@8!P7`QFHW4s-v%9n-m4#z?gU(%oT!!TZb8l z=V2t$IQYC05Tu*A`H12?I!ah2;Y&eb17-jT^x+xr2Gr2QaX0OJ4u3^yI>ewV*h76c3Ba>G;j_0SEp-DxlBiE<9eE>Msh-e7dC!c?f-g-kXz?aRWXDYBB z6!43$Nk&))kHKg4UacP23A)k&00pC3rw$I1TKN7XiGwk{0uL=={vt}5Yv%bSYKDs;Zz0BWhx6f-c zcXO$Eu*vKU&Zla+y;q|q^n{k&OeW(Y!+}fyuyd$}ea-P)cfS8~wSQ%0v0*1|W@fXB zePU~}iOayuEP^``xYjS@{2OZkA}6z}0qNeVDQbdu9~45w#p?Mrhm6!N4>hun&jBfV zVvO%-1K3 z59E9zx;^wDb#kAGRYIej^Xg6}p#kQ*vPBpYYNihhpyImKwc^7%dz>;HVrFQlecX{p zH_C@s&EuIb?=08vWxQ2#C*yPU!>?(1e4bArTCO=JnI^fYJvQ#AyH$MtsP@d(r2N|_ z<;(Y+)O|wQy>ssdl;F#F&ztB|1|@|cQu0-GX1ip^508|u1nMfp$*Uw6WdR4{O{vuR zEinS~M7Y@qO}Zd^Tqf7>M}tn4KW7ox<6T*wXLMe2P=;GeY_OU8QwB4|J#DP=@S@St zae?ido^5o(as9ao_1d2?dEii2a2?c3PC7<2cch|>$7M+;j=UZ)!Huh2?@TGN_=o;X zQ9{df-WyuBp~a1>CGn3Z{!Vw~egT9?G~zWqoianW9VMx6!R8QMgUvW1UZC=ViDs z_aIU)yJFXuprD+L{+1GQ?D8WuO#u4|V$A~4DzSpe-z}wJ;8e3A`HXO6j%WiYm`%&si(LY_<+|Rb^m!wg!_p5xS^_uk0o@)?p zNdi_vKpv*`V#MW~9U99?oXe!-A5{Krv^7+Gol$b|wbT0mPS~v^wYsH3h;_*K}!fy#_|N5r+m;ikXt z+7H;fpukT&d>xxSsHZwx(Q}i`{Z`pzyX&++nWRlZ9uEW=z{RWAG-#FO(8X*B3`=Uh zC(wyN5$ZA^%Yf|4ZYZpC3!h5!UqBEqAwP1;=(+Qpj~n;QH@CMMcn$aEMbqT;1~UbA z_U&N8ATe$*;ll3po-ij%Xoo-chdbZ~0KlnV0`N~@s2 zugEHudzrOItX&e*z;VMK-xeQhIqxGEQ<2t?Q8FVEBx?R=1JX^!HR8FZcw-x zDSqKSQU4SeQ7XrI8lFd1+G(WB8mQnN7ttze1;Ic)IbT!9jU6+GMIU;Uh>H+@h`ADn z1T*Y~^d!80M#S5X8SSCRPZ^A;3BWflXCi)uVH)j?K$Tw8d}=NFT6y(i^;aZKBMtSh z{$BCA*)XRKJqZ0tjrf+iMem{}DG$gU&pkyy8eV#`!DOi}a%b2*vbh{r!poc~$j74+ zOjuD>f0C;il-kPi;g-5Jo$c!SB;^lQ8U=TKO zShb%UaPfjX9&)du>K65j6FYo+7FTC>=V3Pv7v8De4XAdv;mICrdu6E*DOK3l2A4<6 z&4z1R{VK6;T7;oYGyj+BT9|mYon8DnneeJWQP1rLjKho)g>~PFs;6~0l_A~;6r@yV z0+xm+{zY=eJNPkJK)~yuCF9s@rM^>0;4vBfV_INmT>l`B=E|;x=%g%mVm(OO z7?I@ipDR^cEi-#t3xY3I+jBz2bEr_1t#KkI@j!ci>ItJ-Br+{u(jaLu|5VjFinab1kd6c{zQRxD5&+gTsnV9E z-0sM!3Z;#VE){m;?13%9W+WABw*D17VXx<*RfHK$+x^-iW$$)RU`w$WwYNzy6d^Qnz61_k$LB!&5+ z`9`%A1Z@HZcQ|KW(+s*x1){sk?%7vl6i@(j3Y-rn<&cpWexC*)4Cp%4Y)r0-Zuhkf zc7I3E4qLH~y5`N%a7n?8!yLp40W3;;&)vo;$xTrzdq9>ll9@-Y1mpK7AQ^|e3=GTY z*sRnf*ijmPmR7|zhEd`~htZ@5?&6T9Le(Bd@j3$+V+>hOGU(FovO?gJRSVxw8IV+i z2KP-l-_Abzdb@^2mBV7Puc7m~7n+la1EN{U`ij>v6$(`bP6wHYEmqEZEQ;f>*iW)k zz`J-oG8kwy7<{J&7oFyISq?^@kn>qHANO zZeoV6I;*4pcgF9yk@nln1Cszd(|dQu9-#UnV!zIi*f&r~ z1hkktc8_!{6noSgj(kq);J(y(p2RiA9vOg7*x-Rw#Ry1l^BT^{1cundo`g~4jP@)- zbuaa(`UGQ%=cmTVV@Tgus|ie~Cg)ok+)P@s-r;OVlYra-XxC+-R5M#Rg0d>(J7n`m z3Sx`??+wgPK|&M;BQHC?DINrGLo_o+I2fF&>1GHWs zQ?ArT(uXudp=2|~vAglnW2|%`@C#QIe?1pIsZWJqL^UDZa!ca#839k`x~1Hsj-jPd zNsu&$X?U1}jw2|oS{^kmS;4$)=SgFtRpTCI1adL=?Fbvfam5G{6OMGsw4`MGxs!DK z7Y3(&xpqu_c>I9ipVd^8NF>|To>i{I(`>+fz4|8L#fo_}E}UxGi*Xg=39yL2XOS;l ze_zyzq!e==+FU|c=h0l*wIJ-q&P4}+asgn+TP&THOd*w1gy`uDC$})W{f1^Gb-6Fa zu>;zhr>d9E7kmVn0W-~=RmgEHZlW^(C*dP}lK=@B!>OPn{KOGl z%a~l!$V2~|a?ZK(#cNZ zT9nc9-9X*XNAd|oZ(5k{7Dk`!wR@+7=T2t;)Dl1R@ry9(GB{t~G?Nh?=$2)Zh(`US zOSIKLgRkwoEX&Ur%_+37`D8sDtobDaOX%pjuXDA!R?Apw7GofUX+d+?IV;hYOrm^zKs9DxEsW4W^bR!FK;!$XG5kwy=}V37%QJsn1+cAZxIUU5j2#tnNVQ=*>Ih|= zn$~fDL&Yk3iw3_+EC{b83PS1Y;jlG(Gm{5VRis;O>DmBmY>LFDeF-r+H~>yx08vT6 zNNpvu8yF#$D2Pf#Ejy);2_5@QI92G$&pd)2Si@DumvouaIkf(}4}%YFfda+i2-Uit z-aVuOD9nS4#6R8xQ7Y#>Enz*eq(TDFK?TyC#%DjX@MiL4V%Qb{`$rVkH`lLMLr)q@ zUm9z+PGa&Oha_VWW#fS*#*v~vzPaQJ&L)s=X*&OKS0Kddk0?OhK)sqO!?!yw6UuNCyIF`SSj(jU3I{EIzY!DK9gkH50hpG~VU)|r6Y zj5)!$3k576FD_yJ1K(?8ySANFGI}A@)oR~8aC=KOy0J3;u#f89Yg4}tyhEq3?7m|p zu|8UvlVG_zZ+pNoav-=wG{aFDgYJ8M^<>fEqII(`vye_ zNziC7KT}rvnreL0vXDqXeHdYM^v5?53YZ~hfWG>aAX6_eUQs4s=FWjy7?{OUxqgB4 zJ=pzCKRdlZ$}Yy+YsO^14;E64V1DhbZhTxX)awYQs!5|~Y^hXpAP3(n zG$Xm)$ih_^wb|1F<}PfT*J;x_hLqH3@P0$;t}uoaIC;dAk5c3;5B@+3l7zY%<5d1Z zqLKf8^{QRV^KO$XdmKb4^3?!n)49F=M zy_=lyCHFRT`r_rUu?b2)%fkbe;sz_zj@Zx1DhTug*M~;z!7iI!_Js?BC<3%%skk+|YvxwxX}w zLFBi!PFH&)FnZYIH*zl^>U|ai#A*x5Pif!_fU(O#7zeXDra%uR+8+iAU==a`4 BLOCKS (100). CLEARED +Hole found in directory inode 11! (blkcnt=11) +Directory 11, incorrect size, 12288 (counted = 11264). Set size to counted? yes + +Inode 11, i_blocks wrong 24 (counted=16). Set i_blocks to counted? yes + +Pass 2: Checking directory structure +Directory inode 11 has a hole at block #0 +Allocate block? yes + +Directory inode 11 has a hole at block #3 +Allocate block? yes + +Directory inode 11 has a hole at block #6 +Allocate block? yes + +Directory inode 11 has a hole at block #11 +Allocate block? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/32 files, 22/100 blocks +Exit status is 1 diff --git a/tests/f_holedir/expect.2 b/tests/f_holedir/expect.2 new file mode 100644 index 0000000..b8b19f8 --- /dev/null +++ b/tests/f_holedir/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/32 files, 22/100 blocks +Exit status is 0 diff --git a/tests/f_holedir/image.gz b/tests/f_holedir/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..ee26ab8d75453423cda84acb6a2ae26671efa513 GIT binary patch literal 345 zcmb2|=HPhirES2(oSB=Lp33m{hOHN~qXgT7{Bq?*g3b1f)|VqV6~jL;nZ+qacm}N~ z|Ds`*lsr+dZuV8z#l5YI-hDoB`rM%dhYnbu$ziz=y7-LA=82Z)d5n+#Y6<+jLYGZ_ za>wBv6*^&`XO%zDUuCp++yBEFx|}7)iYo8)iF+>yHhXQ$@M2L#@%s9+{`2hR&duUJ zar}Mw`*%vweOU*}-`Gz+|82fe-?eAojIH$_-#w#HJpJbBH|czf{uy&IFzgTCX?0o5 zFzTmAFv*_TiMl$mV}`*8ou^XOB4&ob literal 0 HcmV?d00001 diff --git a/tests/f_holedir/name b/tests/f_holedir/name new file mode 100644 index 0000000..411f656 --- /dev/null +++ b/tests/f_holedir/name @@ -0,0 +1 @@ +directory with holes and illegal blocks diff --git a/tests/f_illbbitmap/expect.1 b/tests/f_illbbitmap/expect.1 new file mode 100644 index 0000000..4b3b6c3 --- /dev/null +++ b/tests/f_illbbitmap/expect.1 @@ -0,0 +1,19 @@ +Block bitmap for group 0 is not in group. (block 4096) +Relocate? yes + +Pass 1: Checking inodes, blocks, and sizes +Relocating group 0's block bitmap to 4... +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21. FIXED +Inode bitmap differences: -12 -13 -14 -15 -16 -17 -18 -19 -20 -21. FIXED +Padding at end of block bitmap is not set. Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/32 files, 22/100 blocks +Exit status is 1 diff --git a/tests/f_illbbitmap/expect.2 b/tests/f_illbbitmap/expect.2 new file mode 100644 index 0000000..b8b19f8 --- /dev/null +++ b/tests/f_illbbitmap/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/32 files, 22/100 blocks +Exit status is 0 diff --git a/tests/f_illbbitmap/image.gz b/tests/f_illbbitmap/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..fb16ebc4797a1dd2f613d8ea3c70dbc19609ef16 GIT binary patch literal 357 zcmb2|=HPhirES2(oSB=Lp33m{hOHN~qXgRn{oR6wALE(Jmhp4O9pt`I!Maf>IOE)N zS)1108!K)c&EKq&;gP&>#c!Jr@A3>c7<@Q)&X46n$lo)rX}ZPJUZzH!X8!ec?I)|9 z@@_K6egiS(a&5ilT%e&*%*9H{(lSq|MBym zC;uLQG|_(>`d;7uZ+Fg(RgCvH{+qKVs=mwOm%+NpFVoD7qi4Q7<5ycFR6XXYdW#|NHd& zA6EM-|5e!adS~DK+^v6KNxCoVfd3nN_0!+x+sM| BLOCKS (100). CLEARED +Block #13 (1768444960) > BLOCKS (100). CLEARED +Block #14 (1752375411) > BLOCKS (100). CLEARED +Block #15 (1684829551) > BLOCKS (100). CLEARED +Block #16 (1886349344) > BLOCKS (100). CLEARED +Block #17 (1819633253) > BLOCKS (100). CLEARED +Block #18 (1663072620) > BLOCKS (100). CLEARED +Block #19 (1735287144) > BLOCKS (100). CLEARED +Block #20 (1310731877) > BLOCKS (100). CLEARED +Block #21 (560297071) > BLOCKS (100). CLEARED +Block #22 (543512352) > BLOCKS (100). CLEARED +Block #23 (1869835361) > BLOCKS (100). CLEARED +Block #24 (1634231072) > BLOCKS (100). CLEARED +Block #25 (543516526) > BLOCKS (100). CLEARED +Block #26 (174418036) > BLOCKS (100). CLEARED +Block #27 (1919819811) > BLOCKS (100). CLEARED +Block #28 (543584032) > BLOCKS (100). CLEARED +Block #29 (1701734764) > BLOCKS (100). CLEARED +Block #30 (1869881459) > BLOCKS (100). CLEARED +Too many illegal blocks in inode 12. +Clear inode? yes + +Restarting e2fsck from the beginning... +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Entry 'termcap' in / (2) has deleted/unused inode 12. +Clear? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -44 -45. FIXED +Free blocks count wrong for group 0 (41, counted=58). FIXED +Free blocks count wrong (41, counted=58). FIXED +Inode bitmap differences: -12. FIXED +Free inodes count wrong for group #0 (20, counted=21). FIXED +Free inodes count wrong (20, counted=21). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/32 files, 42/100 blocks +Exit status is 1 diff --git a/tests/f_lotsbad/expect.2 b/tests/f_lotsbad/expect.2 new file mode 100644 index 0000000..3257a84 --- /dev/null +++ b/tests/f_lotsbad/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/32 files, 42/100 blocks +Exit status is 0 diff --git a/tests/f_lotsbad/image.gz b/tests/f_lotsbad/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..9386a9e9be8b64aa0dcd8b572f15a52224d67b0a GIT binary patch literal 3552 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 BLOCKS (100). CLEARED +Block #3 (4294901760) > BLOCKS (100). CLEARED +Block #4 (4294901760) > BLOCKS (100). CLEARED +Block #5 (4294901760) > BLOCKS (100). CLEARED +Block #6 (4294901760) > BLOCKS (100). CLEARED +Block #7 (4294901760) > BLOCKS (100). CLEARED +Block #8 (4294901760) > BLOCKS (100). CLEARED +Block #9 (4294901760) > BLOCKS (100). CLEARED +Block #10 (4294901760) > BLOCKS (100). CLEARED +Inode 14, i_blocks wrong 18 (counted=4). Set i_blocks to counted? yes + +Pass 2: Checking directory structure +i_file_acl for inode 14 (/MAKEDEV) is 4294901760, should be zero. +Clear i_file_acl? yes + +i_dir_acl for inode 14 (/MAKEDEV) is 4294901760, should be zero. +Clear i_dir_acl? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: -43 -44 -45 -46 -47 -48 -49. FIXED +Free blocks count wrong for group 0 (68, counted=75). FIXED +Free blocks count wrong (68, counted=75). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 29/32 files, 25/100 blocks +Exit status is 1 diff --git a/tests/f_messy_inode/expect.2 b/tests/f_messy_inode/expect.2 new file mode 100644 index 0000000..e9c7880 --- /dev/null +++ b/tests/f_messy_inode/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 29/32 files, 25/100 blocks +Exit status is 0 diff --git a/tests/f_messy_inode/image.gz b/tests/f_messy_inode/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..630a68985f92f818ca75280e338ccc53f3b67d58 GIT binary patch literal 3823 zcmcImXFMB>_D<`qzUo!C6t5AgMpf*Qph&AVsx?aO)i$+P?HyHBTiz;SD{Ai*ViqN4 zloYl1CP7F9k=ys)`{Dk7_w)aJIOjRfd4A8Q^EWjaUKm-e=Ry{r)g z&*NmwAgMg16lltPZ})mjb!&}9ZP}bvW%uphe1AIm*DEkR~7zMsM zv>oMt0RL7MH-wd-Z7oG2*#V0sYQgV=&zbmIf-{#^o*Ta1#rPdjj%_YZ5IYqUu@!9# z=65sb0p~)uiBvS@9Ewwl7rwM8(A^!Gb8kG*p=vGE|98NNmItQ};HzfxE53d4_D0DB zdo=B27(}99MIO3z0(-I^A6u^)@_p^S>p}zoFcna$?asp1#1l3&m=CCWk$~8soG9?+ zEUpkJ3WFHN;NV0=s6#()6k`)=+&=C!w>(0qnOhcdGMenrgBBcDnTCdb^Nn4(gN-bu zB6Ctg5@<6&oTzVI+XpdKEwqr5;^Y1pOC-X`4|BQ+OQWvY5?WtC8P66}lo~JUXdBLp zK|Qqnj$LA-Ul!HRdGc$bGISftbVfKiKIx#f&@8RYcaCt;9geingc{m8!wfX2iv$fP zg$k2sEBl&r%rF|19JdQ4;~)~^WydwF3A7$o6m3klmeyTGEe%Q}AuMQmDgtM;pg1Zb zr<%&4`}4v+Co!ZYM`e5){p6f5lIeCF*dz&96rfvp`{IJ`Ed@bg2CPE?03sjY?JxNC z{3_rV50Ii=0;JLafT2*p-{Zw@#1Lisj5gA^dyed2^sgCr>?y%Y#*dk?Om_r@M03PG zP9HR(_dI9AGgViCczlX#L{HJ4o53wsX*G%Llu%Ke4f5!Tt-$)WXoUKohjE0l>x4|zZr3J67(L+MvG{1~ zyd@@b>(R69F_XO4q_?E@T21RJ!tv&Deo3AeYw{3wRAjjC4kfKithtIMCehMXAhcKs zC@1hAga0aT^7?2npII_3$F&tli2 zElH9KgsLyy2JL?{s&1RyknIkuFR|paL7A$h76_TT5l=q5^k4q}hHshaHf#z9A0$~$ zz|0Amgv=r;3#NDvEbxn+-r*sem*$MshL)8NzuKH z84snS6_S*W#^{9@ktm|0r8h3crQWR;C!xWB_G1hzR6{!B%O2T|R-cIZ)XGoCABCB^ zA-cv%BDzJm{FqT``-FJD!@b{!;fZ+Or^*2&W3Wm*yNf>zb|=p4ysn z2R@ZD%k)CPGoGFw0~-;o01k_uR5O6Hyd$10Y>;?6UN2?P+YS}s#`h>A?* zH;+IE~Lh2RWIF3>jGeBcC)z2}BpMWn)s|rke)taMvnn zD>HFQaPfLvIl@=Fr8PEWd4kyNT6u{HHsE zpOf_Zc(|p|7(=V}+Q;%H57~ z^C;kkl-J~RLcnXGl5$3dMlM94q4G%H{SUaloSuLx#S_zmtc%lLE6%5*Z-$&7^=3)y z6yzJk6cv8gkxQxgTa5d|qVsYGtQw`Ulx z@2D#GYZY;ZrChg7?n~<9_Ir(9PjvN|)a}mCGt^n#EDHZR(Q zRP5h?n7tRVIxi$h#@<5vT`BP|sxBS#5^eK1a1?4&E7*7*sQY(njP=evY_-U|$-Lbv zlN5bsMN!@yplWV)Djcotugd*}`;ZA=3dZF57nAi(g+21(m5v@dvCig}xaIUpbm7$hA=v-cY*hBEj#Wkx zpS&!IuPYVL;44kVgw_Ozl2wS;lzoQ!KjH4{a(hlE;ZibDYu@U*_dJ`O-n+6HVz?E; zx5V7t2NE zqhnla26+3ZNHsVvbAd_RBu$&;Gbw`ee*md75 zeSK08$=sh&tsk0Ebh&8I>8g5Lr&?RMdCzcrzlgK2tlNzebdA1YjHqy1r{4CBXEh;DD>)g#QK*;(Por50kIq=@?s!tzRK55> z^x}5L96A$yIKSDFv={yg#Ko3?>UKN$#9FfrV%Y=Rgfx@X@a1k}LfmI6liVN1CB~P* zK{Ekg3qFrsyvY_heaG3sXL9ncX^5j;AH14!CT23*yofc7b|q84tuygTg5A#^2g5Cq z?m2G)NY_STcTYvRn0N%v%~4LGMZHO!Ik!2hAXbV%h+%u~`~DK42x)2FRJ>jm)jYA( zW?gbi>KY1ybo`x*>mB9V(6oZg6a#po&f}*k)~TZ90m#69bYiTq;^gci&TPxI?w!_g zklu@?y5Od?nJ>0L6MTF^i~n}*Lj6`_mMyiAn_4&s$Jur`;@s~k1OMeZ0LNjDGvFhI zvjH~LLc~s^CTE$1{7B`3=Zt${p7NbH5Y=Fe*Ox;BtV<54Wx*w}4rhXNBM2V@3!;pD zYt(hztLsc5j>ft%)7ZJ8W{?Cp15$>n1V-Ae?9ea&x?YR;U_o0{oL_M^TiMz2V0;k2 z5uZtA;m)32#=>lYd+>1s#wjpB1a2v1N&0QH`Y2{*#hs5&hu>%ce?|c6?alABtwa}L zKCtTL+)DR9{j*ac*IZ0}{%XQ|_fj3fT&@9G9&?1LYU_Moq77J%IOGm|T9`DyDD8$9 z79xM}8=rL=fborL8U|*ZT%T5@d<6Nj{92EhD*-1V-#BkiA~V#jCn1y+yNt?xZI9&F z{6GV(7!Bg-o{QR!K)~&4mWtHr$>>?YUE)yu_`obV&$#`I@qD?F#>TR2phN%|qv044 zqa5uRp(i2E%szIrMG`3E=M^e%4wx~nS(>`Son%K9CX=1DD^Lv~Mk zMn!J&rp`01;djGVMk^vR_aZVuWGCjxQtWu*vV{ul`;drA*@ip#N@F_b%scxo5KVR?r>HbbjrGLX_YPb3NIPfW zR0%|XTJYj!W#v$LtR;rOJss%%NVkbyKX;Mt8!V`wUeL=S_Y*tas~YY5_lTg6VhRR! z>`>Vnj(Y`tIg-Ze1u!)SWizus?w5MA^A4m^zco$bk}d)M34IT(C;$Ke literal 0 HcmV?d00001 diff --git a/tests/f_messy_inode/name b/tests/f_messy_inode/name new file mode 100644 index 0000000..f1485ea --- /dev/null +++ b/tests/f_messy_inode/name @@ -0,0 +1 @@ +bad file and directory acl pointers diff --git a/tests/f_mke2fs2b/expect.1 b/tests/f_mke2fs2b/expect.1 new file mode 100644 index 0000000..e60580c --- /dev/null +++ b/tests/f_mke2fs2b/expect.1 @@ -0,0 +1,36 @@ +Pass 1: Checking inodes, blocks, and sizes +Root inode has dtime set (probably due to old mke2fs). Fix? yes + +Note: /lost+found will probably be deleted as well, due to the mke2fs bug. +Be sure to run mklost+found to recreate it after e2fsck finishes. + + +Deleted inode detected with non-zero link count. +This is probably due to old ext2fs kernel code. +Fix inode(s)? yes + +Inode 11 is deleted w/ non-zero link_count. CLEARED +Inode 15 is deleted w/ non-zero link_count. CLEARED +Pass 2: Checking directory structure +Entry 'lost+found' in / (2) has deleted/unused inode 11. +Clear? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Inode 2 has ref count 4, expecting 3. +Set i_nlinks to count? yes + +Pass 5: Checking group summary information +Fix summary information? yes + +Block bitmap differences: -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20. FIXED +Free blocks count wrong for group 0 (75, counted=87). FIXED +Free blocks count wrong (75, counted=87). FIXED +Inode bitmap differences: -11. FIXED +Free inodes count wrong for group #0 (17, counted=18). FIXED +Directories count wrong for group #0 (4, counted=3). FIXED +Free inodes count wrong (17, counted=18). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 14/32 files, 13/100 blocks +Exit status is 1 diff --git a/tests/f_mke2fs2b/expect.2 b/tests/f_mke2fs2b/expect.2 new file mode 100644 index 0000000..447fcb5 --- /dev/null +++ b/tests/f_mke2fs2b/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 14/32 files, 13/100 blocks +Exit status is 0 diff --git a/tests/f_mke2fs2b/image.gz b/tests/f_mke2fs2b/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..6b7412cdf3e53a9970c0749547069182d8b6ba21 GIT binary patch literal 556 zcmb2|=HPherES2(oSB=Lp33m{&iO3iKoRx_vwdP_9Lw736eBr(5lj5Rt=@NcPM9JT z70B$%vVC6@_xuA>^&e_$>?nE2-61Xh?$OSfk~6s&kGe%a`+cI{?=q*lk7fD4J1Id- zx3WZT_Rs0Q)BVQ9YX3R|t$H83`W=7GCe7dX|LV5p&Feb8)P4JZE=w|_{pqKw<-u=1 z?ALD$tDJtEVL|V!#|`a;aq-XNmtLVmAmq)EQ?e({bqmcZ~O0Q;rr65zfSoS|Jl85 z;m7ss{#(4#TQ#NrrQGWJWaqE<_vmbYetCuU>Y)9rBL6>Qd!4SoC~xkk`hueB-uo;6 zYh_)te7SepUwMWLA#&%-E>)BsnSN>eqS?oiZ?i@zpZovC{zd&?{$KJJ{x|$%|6;%3 zKjUBi7xfPRnSaS!{4F|fZvWrjBlZ9D_pEQ0)m0hI*3a`zKR^HN^!u0pM2KWs&AwT{ zz`#(@#&d1X|L4D>d4nf@Q*&Qk9m5->ugk~x{AXPF`|h<@KP|4 H6h;OBJ@o@; literal 0 HcmV?d00001 diff --git a/tests/f_mke2fs2b/name b/tests/f_mke2fs2b/name new file mode 100644 index 0000000..bf2202a --- /dev/null +++ b/tests/f_mke2fs2b/name @@ -0,0 +1 @@ +mke2fs version 0.2b created filesystem diff --git a/tests/f_noroot/expect.1 b/tests/f_noroot/expect.1 new file mode 100644 index 0000000..df77568 --- /dev/null +++ b/tests/f_noroot/expect.1 @@ -0,0 +1,44 @@ +Pass 1: Checking inodes, blocks, and sizes + +Deleted inode detected with non-zero link count. +This is probably due to old ext2fs kernel code. +Fix inode(s)? yes + +Inode 15 is deleted w/ non-zero link_count. CLEARED +Pass 2: Checking directory structure +Entry '..' in /lost+found (11) has deleted/unused inode 2. +Clear? yes + +Entry '..' in /foo (12) has deleted/unused inode 2. +Clear? yes + +Pass 3: Checking directory connectivity +Root inode not allocated. Rellocate? yes + +Unconnected directory inode 11 (...) +Connect to /lost+found? yes + +/lost+found not found. Create? yes + +Unconnected directory inode 12 (...) +Connect to /lost+found? yes + +Pass 4: Checking reference counts +Inode 11 has ref count 3, expecting 2. +Set i_nlinks to count? yes + +Inode 12 has ref count 4, expecting 3. +Set i_nlinks to count? yes + +Pass 5: Checking group summary information +Fix summary information? yes + +Free blocks count wrong for group 0 (75, counted=74). FIXED +Free blocks count wrong (75, counted=74). FIXED +Free inodes count wrong for group #0 (17, counted=16). FIXED +Directories count wrong for group #0 (4, counted=5). FIXED +Free inodes count wrong (17, counted=16). FIXED + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 16/32 files, 26/100 blocks +Exit status is 1 diff --git a/tests/f_noroot/expect.2 b/tests/f_noroot/expect.2 new file mode 100644 index 0000000..8cf7758 --- /dev/null +++ b/tests/f_noroot/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 16/32 files, 26/100 blocks +Exit status is 0 diff --git a/tests/f_noroot/image.gz b/tests/f_noroot/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..0a87e9963b2189214085f04817063e766bddbede GIT binary patch literal 550 zcmb2|=HPherES2(oSB=Lp33m{&iO3iKoRx_)-!h*^j^KjRhSynB~-(DU9a@HQ;=7N zE3b**onKsfHB90ATGlUkaH&;a;qH!t>GNjKoao4-VRmcMdu4koUv(Lyr+0o9Pxj=D z2yZ@7_r&Q*U5a(kpFM{b{4)IY>EpTG9(BJCZp>wW9xHkC$Ho7*yHgWv&pbEpT6FJW z{e0%^r?qm-4W(CP*loH#|5E$^>Br;Odtb4rT$kNG>HoFNwdHU1vqbnlH>5s3e>c9j ze(sh0wdIDFdUM>WCVEd?d*bPdslRr;^m~$(@}2+K{Iox(lkd&8Iy-gdw;$!Tu8-q` z|9f7Udo}Z3{qBEfMX%QXUUh5U`9<%R_wn3A+5eCIFaL{rhyTpK#8!9&+_pt{}~r9f9mYfPme2hhym4s!T+7HY*B*V(`e(0SpLh1>^XE_%4Vxc7JovCgpnvbh!0Xqbg5*#MGlh>X3$bUI!pHys Dq=E|a literal 0 HcmV?d00001 diff --git a/tests/f_noroot/name b/tests/f_noroot/name new file mode 100644 index 0000000..a70ebc2 --- /dev/null +++ b/tests/f_noroot/name @@ -0,0 +1 @@ +missing root directory diff --git a/tests/f_okgroup/expect.1 b/tests/f_okgroup/expect.1 new file mode 100644 index 0000000..8ee1a4b --- /dev/null +++ b/tests/f_okgroup/expect.1 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/2048 files, 274/8193 blocks +Exit status is 0 diff --git a/tests/f_okgroup/expect.2 b/tests/f_okgroup/expect.2 new file mode 100644 index 0000000..8ee1a4b --- /dev/null +++ b/tests/f_okgroup/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/2048 files, 274/8193 blocks +Exit status is 0 diff --git a/tests/f_okgroup/image.gz b/tests/f_okgroup/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..06b67c7a73a58026211b6ce0eb918f4999436919 GIT binary patch literal 8387 zcmb2|=HSrx);3^b&dg0rPi1&}-PVgaP=xJ*wQ;BLOCay59v~!L8&kXt5d1%DS>>EHWin*G3jmC;-u^SIypS9rTKt^N3C@gc>7yT0u=`@dlAG}{?>@B2>s zdHSENoVoaf_4n5&ebu}4RhsF~u|G5G%R?UyNqYtV^39nYPX7_RP6w z^3u+)VPY7$Ai;Oa%tR5xpA~w^le!)4>_h(Um=PP>e?HxOdipu8YiAz>|DV5V*?$M` z5*fx9_6zQm!iK(-m*i+tuN?r`j)@#Tnr5R z1Mj`b+#I5}{&UE*w{hihUoL-r^DWP2?%n%7XGH&)H&6X%FP{6qvG2u9rVI5B{~7{|^OhdN6h;OBc0h$^ literal 0 HcmV?d00001 diff --git a/tests/f_overfsblks/name b/tests/f_overfsblks/name new file mode 100644 index 0000000..8ab6040 --- /dev/null +++ b/tests/f_overfsblks/name @@ -0,0 +1 @@ +overlapping inode and block bitmaps diff --git a/tests/run_e2fsck b/tests/run_e2fsck new file mode 100644 index 0000000..4923c66 --- /dev/null +++ b/tests/run_e2fsck @@ -0,0 +1,72 @@ +if [ "$IMAGE"x = x ]; then + IMAGE=$test_dir/image.gz +fi + +if [ "$FSCK_OPT"x = x ]; then + FSCK_OPT=-yf +fi + +if [ "$SECOND_FSCK_OPT"x = x ]; then + SECOND_FSCK_OPT=-yf +fi + +if [ "$OUT1"x = x ]; then + OUT1=$test_name.1.log +fi + +if [ "$OUT2"x = x ]; then + OUT2=$test_name.2.log +fi + +if [ "$EXP1"x = x ]; then + EXP1=$test_dir/expect.1 +fi + +if [ "$EXP2"x = x ]; then + EXP2=$test_dir/expect.2 +fi + +gunzip < $IMAGE > $TMPFILE + +$FSCK $FSCK_OPT -N test_filesys $TMPFILE > $OUT1.new 2>&1 +status=$? +echo Exit status is $status >> $OUT1.new +sed -e '1d' $OUT1.new > $OUT1 +rm -f $OUT1.new + +if [ "$ONE_PASS_ONLY" != "true" ]; then + $FSCK $SECOND_FSCK_OPT -N test_filesys $TMPFILE > $OUT2.new 2>&1 + status=$? + echo Exit status is $status >> $OUT2.new + sed -e '1d' $OUT2.new > $OUT2 + rm -f $OUT2.new +fi + +rm $TMPFILE + +if [ "$SKIP_VERIFY" != "true" ] ; then + rm -f $test_name.ok $test_name.failed + cmp -s $OUT1 $EXP1 + status1=$? + if [ "$ONE_PASS_ONLY" != "true" ]; then + cmp -s $OUT2 $EXP2 + status2=$? + else + status2=0 + fi + + if [ "$status1" = 0 -a "$status2" = 0 ] ; then + echo "ok" + touch $test_name.ok + else + echo "failed" + diff -c $EXP1 $OUT1 > $test_name.failed + if [ "$ONE_PASS_ONLY" != "true" ]; then + diff -c $EXP2 $OUT2 >> $test_name.failed + fi + fi +fi + +if [ "$SKIP_CLEANUP" != "true" ] ; then + unset IMAGE FSCK_OPT SECOND_FSCK_OPT OUT1 OUT2 EXP1 EXP2 +fi diff --git a/tests/test_config b/tests/test_config new file mode 100644 index 0000000..86a5bde --- /dev/null +++ b/tests/test_config @@ -0,0 +1,9 @@ +# +# Test configuration +# + +FSCK=../e2fsck/e2fsck +LD_LIBRARY_PATH=../lib:../lib/ext2fs:../lib/e2p:../lib/et:../lib/ss +export LD_LIBRARY_PATH +TZ=GMT +export TZ diff --git a/tests/test_script b/tests/test_script new file mode 100644 index 0000000..dc104f4 --- /dev/null +++ b/tests/test_script @@ -0,0 +1,43 @@ +#!/bin/sh +# +# Test script for e2fsck +# + +if test "$1"x = x ; then +SRCDIR=. +else +SRCDIR=$1 +fi + +cmd_dir=$SRCDIR +TMPFILE=./test.img + +. $SRCDIR/test_config + +for test_dir in $SRCDIR/[a-zA-Z]_* +do + test_name=`echo $test_dir | sed -e 's;.*/;;'` + if [ -f $test_dir/name ]; then + test_description=`cat $test_dir/name` + echo -n "$test_name: $test_description: " + else + echo -n "$test_name: " + fi + if [ -f $test_dir/script ]; then + . $test_dir/script + else + test_base=`echo $test_name | sed -e 's/_.*//'` + default_script=$SRCDIR/defaults/${test_base}_script + if [ -f $default_script ]; then + . $SRCDIR/defaults/${test_base}_script + else + echo "Missing test script!" + fi + fi +done + +num_ok=`ls *.ok | wc -l` +num_failed=`ls *.failed 2>/dev/null | wc -l` + +echo "$num_ok tests succeeded $num_failed tests failed" + -- 1.8.3.1