Many files:
  Checked in e2fsprogs 0.5c

diff --git a/.hgtags b/.hgtags
new file mode 100644
index 0000000..50a4554
--- /dev/null
+++ b/.hgtags
@@ -0,0 +1 @@
+eed1bd163c2bbe64492dfc2c30c91273f4eb8fde E2FSPROGS-0_5B
diff --git a/ChangeLog b/ChangeLog
index aed846c..18d4138 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,88 @@
+Thu Oct 26 11:59:44 1995    <tytso@rsts-11.mit.edu>
+
+	* configure.in (LDFALG_STATIC): Add temporary kludge for
+		determining how to link executables statically.  For now,
+		we assume that Linux systems only can link statically.
+
+Fri Sep 22 18:23:55 1995    <tytso@rsts-11.mit.edu>
+
+	* depfix.sed: Remove /usr/include lines which occur at the end of
+		the dependency listing.
+
+Mon Sep  4 21:40:22 1995  Remy Card  <card@bbj>
+
+	* configure.in: Added support for the --enable-bsd-shlibs option.
+
+Wed Aug  9 21:33:31 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+	* MCONFIG.in (LD): Add $(PURE) to the definition to make it easier
+		to link executables using programs like purify.
+
+Sat Aug  5 11:41:03 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* configure.in: Check to see if strdup() is present
+
+	* INSTALL: Updated building and installation instructions to
+		reflect the new configure system.
+
+	* Makefile.in (install): When doing a general install, install the
+		shared libraries as well by using the new target 
+		install-shlibs-libs-recursive.
+
+	* configure.in: If we are building on a Linux system, set $prefix
+		to be '/' by default.
+
+Sun Jul  9 13:38:20 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* configure.in (checking type sizes): provide some default for
+	type-sizes when cross-compiling, as we can't check them then.
+	(SS_DIR, ET_DIR): Make these correct even when ${srcdir} is absolute.
+
+Thu Jun 15 23:33:37 1995  Remy Card  <card@bbj>
+
+	* Makefile.in (distclean-local): Added config.cache and
+		include/linux/types.h.
+
+	* configure.in: Added support for the --enable-elf option.
+		Added a test to check for llseek() in the C library.
+
+	* lib/Makefile.dll-lib: Fixed incorrect RM and LN calls.
+
+	* lib/Makefile.elf-lib: New file, to create ELF shared libraries.
+
+Sat Jun 10 19:52:51 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* configure.in: Create ET_DIR and SS_DIR, which gives the absolute
+		pathname to the source directories of the lib/et and
+		lib/ss.  (Can't just use $srcdir since that may be a
+		relative path.)
+
+Thu Jun  8 12:25:57 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* lib/Makefile.library ($(LIBRARY).a): Changed to work with the
+	new makefiles.
+	* lib/Makefile.dll-lib: Ditto.
+	* lib/Makefile.profiled: Ditto.
+	* lib/Makefile.checker: Ditto.
+
+	* Add the include subdirectory to hold substitute include files
+	for systems that need them.
+
+	* Makefile.in: Rewritten to conform to GNU coding standards.
+	* MCONFIG: Moved to MCONFIG.in, and totally changed to support
+	GNU-style makefiles.
+	* mkinstalldirs: New file, copied from /gd/gnu/lib.
+	* config.guess: Ditto.
+	* config.sub: Ditto.
+	* install-sh: Ditto.
+
+	* configure.in: Many new tests added.  --with-cc and --with-ccopts
+	options removed as configure already supports a method to do this,
+	and they were interfering with normal usage.
+
 Sat Mar 11 18:23:45 1995  Theodore Y. Ts'o  <tytso@localhost>
 
-	* Makefile (bin-tree): Add Makefile target which automatically
+	* Makefile.in (bin-tree): Add Makefile target which automatically
 		generates the binary distribution for e2fsprogs.
 
 
diff --git a/INSTALL b/INSTALL
index 24d13ea..a6feeb3 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,31 +1,30 @@
-	To install the second extended file system management program,
+	To install the second extended file system management programs,
 just follow the steps:
 
-1) Edit the file MCONFIG
+1) Change directory into the top of the e2fsprogs source tree
 
-	This file contains definitions used in the various makefiles.  These
-definitions have reasonable default value but you may want to adjust them to 
-your system configuration.
+2) Create a build directory and cd into it:
 
-	In particular, if you don't have the tools to build shared
-libraries, you'll want to comment out the "BUILD_DLL_SHLIBS = YES"
-line.
+	mkdir build; cd build
 
-2) Compile the programs
+3)  Run the configure script
 
-	Run `make world' to (a) create the dependencies files, (b)
-compile the libraries and the programs, and (c) run a test suite on
-e2fsck.  The test suite runs a series of tests; for each one, e2fsck
-should return an exit status of 1 on the first pass, and an exit
-status of 0 on the second pass.  The one exception to this is the
-"okgroup.img" test, which should return an exit status of 0 for both
-passes.
+	../configure
 
-3) Install the programs
+	If you wish to turn on DLL shared libraries, add the option
+flag --enable-dll-shlibs.  If you wish to turn on ELF shared
+libraries, add the option --enable-elf-shlibs.  If you wish to build
+profiling libraries, add the option --enable-profile.
+
+4)  Compile the programs
+
+	make
+
+5) Install the programs
 
 	Run `make install'
 
-4) Install the include files and libraries
+6) Install the include files and libraries
 
 	You can run `make install-libs' to install the include files and
 libraries.  Please note that this installation is not needed for the
@@ -33,14 +32,15 @@
 programs using the libraries or if you want to compile other program
 using these libraries (like the 4.4BSD dump and restore port).
 
-5) Remove any pre-formatted man pages.  Some distributions will have
-pre-formatted manual pages which will always be displayed in
-preference to newer man pages in /usr/man.  If this is the case, you
-may need to manually remove them in order to see the correct manual
-pages.  The shell script in install-utils/remove_preformat_manpages
-may be helpful in doing so.
+7) Remove any pre-formatted man pages.  
 
-5) Make sure your /etc/fstab file is correct.
+	Some distributions will have pre-formatted manual pages which
+will always be displayed in preference to newer man pages in /usr/man.
+If this is the case, you may need to manually remove them in order to
+see the correct manual pages.  The shell script in
+install-utils/remove_preformat_manpages may be helpful in doing so.
+
+8) Make sure your /etc/fstab file is correct.
 
 	Some distributions install an /etc/fstab which is missing the
 fifth and sixth field of filesystem entry, which are the dump
@@ -56,6 +56,6 @@
 
 /dev/hda4       /        ext2        defaults	1	1
 
-	There is a script in insatll-utils/convfstab (donated by
+	There is a script in install-utils/convfstab (donated by
 Michael Weller) that may help you correct your /etc/fstab file.
 
diff --git a/INSTALL.binary b/INSTALL.binary
new file mode 100644
index 0000000..f62fb3b
--- /dev/null
+++ b/INSTALL.binary
@@ -0,0 +1,47 @@
+NOTE: This is the DLL version of the binary distribution.  If you have
+an ELF system, please either compile e2fsprogs from sources yourself,
+or get the ELF version of the binary distribution.  The ELF version
+will have a filename of e2fsprogs-0.5c-elfbin.tar.gz
+
+
+	To install the binary distribution of the second extended file
+system management programs, just follow the steps:
+
+1) Install this tar file using the following command:
+
+	gunzip < e2fsprogs-0.5c-dllbin.tar.gz | (cd /; tar xvf - )
+
+2) Run ldconfig to update the shared library pointers.
+
+3) Remove any pre-formatted man pages.  
+
+	Some distributions will have pre-formatted manual pages which
+will always be displayed in preference to newer man pages in /usr/man.
+If this is the case, you may need to manually remove them in order to
+see the correct manual pages.  The shell script in
+install-utils/remove_preformat_manpages may be helpful in doing so.
+
+4) Make sure your /etc/fstab file is correct.
+
+	Some distributions install an /etc/fstab which is missing the
+fifth and sixth field of filesystem entry, which are the dump
+frequency, and the fsck pass number, respectively.  The problem with
+this is that the getmntent() library routine interprets those missing
+fields as "0", and a pass number of 0 is documented as meaning that
+fsck should not check that particular filesystem.  If your entries in
+your /etc/fstab file look liks this:
+
+/dev/hda4       /        ext2        defaults
+
+you should add "1 1" at the end of each line, so that they look like this:
+
+/dev/hda4       /        ext2        defaults	1	1
+
+	There is a script in install-utils/convfstab (donated by
+Michael Weller) that may help you correct your /etc/fstab file.
+
+5) Cleanup files from the installation.
+
+	When you're done with the installation, you will probably want
+to remove /INSTALL (this file), /README, and /install-utils from your
+root directory
diff --git a/MCONFIG b/MCONFIG
deleted file mode 100644
index e206ba9..0000000
--- a/MCONFIG
+++ /dev/null
@@ -1,95 +0,0 @@
-#
-# C Compiler
-#
-CC=		gcc
-
-#
-# Uncomment this line if you want to build shared DLL libraries, or
-# comment this line out if you don't want to build shared DLL libraries.
-#
-BUILD_DLL_SHLIBS = YES
-
-ifdef BUILD_DLL_SHLIBS
-#
-# Use these definitions is you use tools 2.x, x < 16
-#
-DLL_BIN=/usr/dll/bin
-JUMP_PREFIX=/usr/dll/jump/
-
-#
-# Use these definitions if you use tools 2.16 or above
-#
-#DLL_BIN=/usr/bin
-#JUMP_PREFIX=/usr/bin/jump
-
-endif
-
-#
-# Uncomment this line if you want to build profiled libraries, or
-# comment this line out if you don't want to build profiled libraries
-#
-BUILD_PROFILE_LIBS = YES
-
-#
-# Optimization flags
-#
-#OPT=	-g -O -fno-inline
-OPT=	-O2 -fomit-frame-pointer
-
-#
-# Warning flags
-#
-# Uncomment WFLAGS if you want really anal GCC warning messages
-#
-#WFLAGS=		-ansi -D_POSIX_SOURCE -pedantic \
-#			-Wall -Wwrite-strings -Wpointer-arith \
-#			-Wcast-qual -Wenum-clash -Wcast-align -Wtraditional \
-#			-Wstrict-prototypes -Wmissing-prototypes \
-#			-Wnested-externs -Winline -Wshadow 
-
-#
-# Binaries tools
-#
-ARCHIVE=	ar r
-RANLIB=		ranlib
-
-#
-# Installation user and groups
-#
-BINGRP=		bin
-BINOWN=		bin
-BINMODE=	555
-INCGRP=		bin
-INCOWN=		bin
-INCMODE=	444
-LIBOWN=		bin
-LIBGRP=		bin
-LIBMODE=	444
-MANGRP=		bin
-MANOWN=		bin
-MANMODE=	444
-
-#
-# Installation programs
-#
-CHMOD=		chmod
-INSTALL=	install -c
-INSTALLBIN=	$(INSTALL) -o $(BINOWN) -g $(BINGRP) -m $(BINMODE) -s
-INSTALLINC=	$(INSTALL) -o $(INCOWN) -g $(INCGRP) -m $(INCMODE)
-INSTALLLIB=	$(INSTALL) -o $(LIBOWN) -g $(LIBGRP) -m $(LIBMODE)
-INSTALLMAN=	$(INSTALL) -o $(MANOWN) -g $(MANGRP) -m $(MANMODE)
-
-#
-# Destination directories
-#
-ETCDIR=		$(DESTDIR)/etc
-INCLDIR=	$(DESTDIR)/usr/include
-LIBDIR=		$(DESTDIR)/usr/lib
-SBINDIR=	$(DESTDIR)/sbin
-SHLIBDIR=	$(DESTDIR)/lib
-USRSHLIBDIR=	$(DESTDIR)/usr/lib
-SMANDIR=	$(DESTDIR)/usr/man/man8
-UMANDIR=	$(DESTDIR)/usr/man/man1
-FMANDIR=	$(DESTDIR)/usr/man/man5
-USRBINDIR=	$(DESTDIR)/usr/bin
-USRSBINDIR=	$(DESTDIR)/usr/sbin
diff --git a/MCONFIG.in b/MCONFIG.in
new file mode 100644
index 0000000..1d02cd2
--- /dev/null
+++ b/MCONFIG.in
@@ -0,0 +1,118 @@
+# Beginning of file MCONFIG
+
+SHELL = /bin/sh
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+usr_prefix = @usr_prefix@
+bindir = $(exec_prefix)/bin
+ubindir = $(usr_prefix)/bin
+sbindir = $(exec_prefix)/sbin
+usbindir = $(usr_prefix)/sbin
+libdir = $(exec_prefix)/lib
+ulibdir = $(usr_prefix)/lib
+includedir = $(usr_prefix)/include
+mandir = $(usr_prefix)/man
+man1dir = $(usr_prefix)/man/man1
+man8dir = $(usr_prefix)/man/man8
+cat1dir = $(usr_prefix)/man/cat1
+cat8dir = $(usr_prefix)/man/cat8
+
+@SET_MAKE@
+
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+CC = @CC@
+DEFS = @DEFS@
+LIBS = @LIBS@
+CFLAGS = $(CPPFLAGS) $(DEFS) $(WFLAGS) @CFLAGS@ $(XTRA_CFLAGS) \
+	-I$(top_builddir)/lib -I$(top_srcdir)/lib $(LINUX_INCLUDE) 
+LDFLAGS = @LDFLAGS@
+RM = @RM@
+LN = @LN@
+MV = @MV@
+CP = @CP@
+CHMOD = @CHMOD@
+AR = @AR@
+AWK = @AWK@
+SED = @SED@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+LD = $(PURE) @CC@
+ARUPD = $(AR) r
+
+#
+# Use these definitions is you use tools 2.x, x < 16
+#
+#DLL_BIN=/usr/dll/bin
+#JUMP_PREFIX=/usr/dll/jump/
+
+#
+# Use these definitions if you use tools 2.16 or above
+#
+DLL_BIN=/usr/bin
+JUMP_PREFIX=/usr/bin/jump
+
+# An include directive pointing to a directory holding enough linux-like
+# include files to satisfy some programs here
+LINUX_INCLUDE=@LINUX_INCLUDE@
+
+#
+# Warning flags
+#
+# Uncomment WFLAGS if you want really anal GCC warning messages
+#
+#
+@W@WFLAGS=		-ansi -D_POSIX_SOURCE -pedantic \
+@W@			-Wall -Wwrite-strings -Wpointer-arith \
+@W@			-Wcast-qual -Wenum-clash -Wcast-align -Wtraditional \
+@W@			-Wstrict-prototypes -Wmissing-prototypes \
+@W@			-Wnested-externs -Winline -DNO_INLINE_FUNCS -Wshadow 
+
+#
+# Installation user and groups
+#
+BINGRP=		bin
+BINOWN=		bin
+BINMODE=	555
+INCGRP=		bin
+INCOWN=		bin
+INCMODE=	444
+LIBOWN=		bin
+LIBGRP=		bin
+LIBMODE=	444
+MANGRP=		bin
+MANOWN=		bin
+MANMODE=	444
+
+all::
+
+#
+# Make depend magic...
+#
+
+.depend: Makefile $(SRCS) $(top_srcdir)/depfix.sed
+	if test -n "$(SRCS)" ; then \
+		$(CC) -M $(CFLAGS) $(SRCS) | \
+			sed -f $(top_srcdir)/depfix.sed | \
+			sed -e 's; $(srcdir)/; $$(srcdir)/;g' | \
+			sed -e 's; $(top_srcdir)/; $$(top_srcdir)/;g' | \
+			sed -e 's; $(top_builddir)/; $$(top_builddir)/;g' | \
+			sed -e 's; \./; ;g' | \
+		grep -v "  \\\\$$" > .depend; \
+	else :; fi
+
+depend:: .depend
+	if test -n "$(SRCS)" ; then \
+		sed -e '/^# +++ Dependency line eater +++/,$$d' \
+			< $(srcdir)/Makefile.in | cat - .depend \
+			> $(srcdir)/Makefile.in.new; \
+	$(MV) $(srcdir)/Makefile.in $(srcdir)/Makefile.in.old; \
+	$(MV) $(srcdir)/Makefile.in.new $(srcdir)/Makefile.in; \
+	else :; fi
+
+
+
+
+
+# End of file MCONFIG
diff --git a/Makefile b/Makefile
deleted file mode 100644
index f063866..0000000
--- a/Makefile
+++ /dev/null
@@ -1,100 +0,0 @@
-include ./MCONFIG
-
-all: libs 
-	(cd e2fsck; $(MAKE))
-	(cd debugfs ; $(MAKE))
-	(cd misc ; $(MAKE))
-
-libs:
-	(cd lib/et; $(MAKE))
-	(cd lib/ss; $(MAKE))
-	(cd lib/ext2fs; $(MAKE))
-	(cd lib/e2p; $(MAKE))
-
-install:
-	(cd lib/et; $(MAKE) install)
-	(cd lib/ss; $(MAKE) install)
-	(cd lib/ext2fs; $(MAKE) install)
-	(cd lib/e2p; $(MAKE) install)
-	(cd e2fsck; $(MAKE) install)
-	(cd debugfs; $(MAKE) install)
-	(cd misc ; $(MAKE) install)
-
-install-tree:
-	(cd lib/et; $(MAKE) install-tree)
-	(cd lib/ss; $(MAKE) install-tree)
-	(cd lib/ext2fs; $(MAKE) install-tree)
-	(cd lib/e2p; $(MAKE) install-tree)
-	(cd e2fsck; $(MAKE) install-tree)
-	(cd debugfs; $(MAKE) install-tree)
-	(cd misc ; $(MAKE) install-tree)
-
-install-libs:
-	(cd lib/et; $(MAKE) install-libs)
-	(cd lib/ss; $(MAKE) install-libs)
-	(cd lib/ext2fs; $(MAKE) install-libs)
-	(cd lib/e2p; $(MAKE) install-libs)
-
-install-dirs:
-	install -d $(ETCDIR)
-	install -d $(INCLDIR)
-	install -d $(LIBDIR)
-	install -d $(SBINDIR)
-	install -d $(SHLIBDIR)
-	install -d $(SMANDIR)
-	install -d $(UMANDIR)
-	install -d $(USRBINDIR)
-	install -d $(USRSBINDIR)
-
-bin-tree:
-	rm -rf dest
-	mkdir dest
-	$(MAKE) DESTDIR=`pwd`/dest install-dirs
-	$(MAKE) DESTDIR=`pwd`/dest install
-	mkdir dest/install-utils dest/usr/man/cat1 dest/usr/man/cat8
-	cp install-utils/convfstab dest/install-utils
-	cp install-utils/remove_preformat_manpages dest/install-utils
-	(cd dest; export MANPATH=`pwd`/usr/man; \
-		../install-utils/compile_manpages)
-
-clean:
-	rm -f $(PROGS) \#* *.s *.o *.a *~ core MAKELOG 
-	rm -rf dest
-	(cd lib/et; $(MAKE) clean)
-	(cd lib/ss; $(MAKE) clean)
-	(cd lib/ext2fs; $(MAKE) clean)
-	(cd lib/e2p; $(MAKE) clean)
-	(cd e2fsck; $(MAKE) clean)
-	(cd debugfs; $(MAKE) clean)
-	(cd misc ; $(MAKE) clean)
-
-really-clean:
-	rm -f $(PROGS) \#* *.s *.o *.a *~ core MAKELOG 
-	rm -f .depend bin/* shlibs/*.so.*
-	(cd lib/et; $(MAKE) really-clean)
-	(cd lib/ss; $(MAKE) really-clean)
-	(cd lib/ext2fs; $(MAKE) really-clean)
-	(cd lib/e2p; $(MAKE) really-clean)
-	(cd e2fsck; $(MAKE) really-clean)
-	(cd debugfs; $(MAKE) really-clean)
-	(cd misc ; $(MAKE) really-clean)
-
-dep depend:
-	(cd lib/et; cp /dev/null .depend; $(MAKE) depend)
-	(cd lib/ss; cp /dev/null .depend; $(MAKE) depend)
-	(cd lib/ext2fs; cp /dev/null .depend; $(MAKE) depend)
-	(cd lib/e2p; cp /dev/null .depend; $(MAKE) depend)
-	(cd debugfs; cp /dev/null .depend; $(MAKE) depend)
-	(cd e2fsck; cp /dev/null .depend; $(MAKE) depend)
-	(cd misc ; cp /dev/null .depend; $(MAKE) depend)
-
-world: 
-	@date
-	$(MAKE) depend 
-	@date
-	$(MAKE) all
-	@date
-	(cd e2fsck/images; ./test_script)
-	@date
-
-
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..7aaa85e
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,69 @@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+top_builddir = .
+INSTALL = @INSTALL@
+
+@MCONFIG@
+
+LIB_SUBDIRS=lib/et lib/ss lib/ext2fs lib/e2p
+PROG_SUBDIRS=e2fsck debugfs misc
+SUBDIRS=$(LIB_SUBDIRS) $(PROG_SUBDIRS) tests
+
+all:: libs progs check
+
+progs: all-progs-recursive
+libs: all-libs-recursive
+
+install: all-libs-recursive install-progs-recursive \
+	install-shlibs-libs-recursive
+	(export MANPATH=$(DESTDIR)$(mandir); $(srcdir)/install-utils/compile_manpages)
+
+install-libs: install-libs-recursive
+
+TAGS clean-recursive distclean-recursive \
+	    mostlyclean-recursive realclean-recursive install-recursive:
+	for subdir in $(SUBDIRS); do \
+	  target=`echo $@|$(SED) 's/-recursive//'`; \
+	  echo making $$target in $$subdir; \
+	  (cd $$subdir && $(MAKE) $$target) || exit 1; \
+	done
+
+all-progs-recursive install-progs-recursive:
+	for subdir in $(PROG_SUBDIRS); do \
+	  target=`echo $@|$(SED) 's/-progs-recursive//'`; \
+	  echo making $$target in $$subdir; \
+	  (cd $$subdir && $(MAKE) $$target) || exit 1; \
+	done
+
+all-libs-recursive install-libs-recursive install-shlibs-libs-recursive:
+	for subdir in $(LIB_SUBDIRS); do \
+	  target=`echo $@|$(SED) 's/-libs-recursive//'`; \
+	  echo making $$target in $$subdir; \
+	  (cd $$subdir && $(MAKE) $$target) || exit 1; \
+	done
+
+mostlyclean: mostlyclean-recursive mostlyclean-local
+clean: clean-recursive clean-local
+distclean: distclean-recursive distclean-local
+realclean: realclean-recursive realclean-local
+
+mostlyclean-local:
+	$(RM) -f \#* *~ core MAKELOG 
+clean-local: mostlyclean-local
+distclean-local: clean-local
+	$(RM) -f include/linux/types.h
+	$(RM) -f config.status config.log config.cache MCONFIG Makefile
+realclean-local: distclean-local
+	$(RM) -f configure
+
+check:
+	(cd tests; make check)
+
+Makefile: config.status $(srcdir)/Makefile.in
+	CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+
+config.status: $(srcdir)/configure
+	./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in
+	cd $(srcdir) && autoconf
diff --git a/README b/README
index 6219664..7e39091 100644
--- a/README
+++ b/README
@@ -1,7 +1,5 @@
-	This is the new version (0.5b) of the second extended file system
-management programs.  You need to run Linux 1.0 or above to use it since
-some programs used some ext2fs features that where not available in
-previous kernel versions.
+	This is the new version (0.5c) of the second extended file system
+management programs.  
 
 	See the file INSTALL for installation instructions.  This is
 important!  Note that your /etc/fstab file may need modifying before
diff --git a/config.guess b/config.guess
new file mode 100644
index 0000000..19066fb
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,539 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:V*:*)
+	# After 1.2, OSF1 uses "V1.3" for uname -r.
+	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	# 1.2 uses "1.2" for uname -r.
+	echo alpha-dec-osf${UNAME_RELEASE}
+        exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    Pyramid*:OSx*:*:*)
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    sun4*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:NetBSD:*:*)
+	echo m68k-atari-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sun3*:NetBSD:*:*)
+	echo m68k-sun-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:NetBSD:*:*)
+	echo m68k-apple-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:5*:RISCos)
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+	if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+	     -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+   ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i[34]86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+		rm -f dummy.c dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:4)
+	if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if grep bos410 /usr/include/stdio.h >/dev/null 2>&1; then
+		IBM_REV=4.1
+	elif grep bos411 /usr/include/stdio.h >/dev/null 2>&1; then
+		IBM_REV=4.1.1
+	else
+		IBM_REV=4.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to 
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[3478]??:HP-UX:*:*)
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/7?? | 9000/8?7 ) HP_ARCH=hppa1.1 ;;
+	    9000/8?? )            HP_ARCH=hppa1.0 ;;
+	esac
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+	rm -f dummy.c dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?7:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?7:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY*C90:*:*:*)
+	echo c90-cray-unicos${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+	echo m68k-hp-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i[34]86:BSD/386:*:* | *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:NetBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    *:Linux:*:*)
+	# Systems without a BFD linker
+	if test -d /usr/lib/ldscripts/. ; then
+	  :
+	else
+	  echo "${UNAME_MACHINE}-unknown-linuxoldld"
+	  exit 0
+	fi
+ 	# Determine whether the default compiler is a.out or elf
+	cat >dummy.c <<EOF
+main(argc, argv)
+int argc;
+char *argv[];
+{
+#ifdef __ELF__
+  printf ("%s-unknown-linux\n", argv[1]);
+#else
+  printf ("%s-unknown-linuxaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+	rm -f dummy.c dummy;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i[34]86:DYNIX/ptx:4*:*)
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i[34]86:*:4.*:* | i[34]86:SYSTEM_V:4.*:*)
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+	else
+		echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit 0 ;;
+    i[34]86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-unknown-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-unknown-sysv32
+	fi
+	exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-unknown-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M680[234]0:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
+        uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4.3 && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m680[234]0:LynxOS:2.2*:*)
+	echo m68k-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i[34]86:LynxOS:2.2*:*)
+	echo i386-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.2*:*)
+	echo sparc-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.2*:*)
+	echo rs6000-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  printf ("%s-next-nextstep%s\n", __ARCHITECTURE__,  version==2 ? "2" : "3");
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-unknown-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.sub b/config.sub
new file mode 100644
index 0000000..93371be
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,866 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can. 
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+	echo Configuration name missing. 1>&2
+	echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+	echo "or     $0 ALIAS" 1>&2
+	echo where ALIAS is a recognized configuration type. 1>&2
+	exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+	*local*)
+		echo $1
+		exit 0
+		;;
+	*)
+	;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS (if any).
+basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+if [ $basic_machine != $1 ]
+then os=`echo $1 | sed 's/.*-/-/'`
+else os=; fi
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp )
+		os=
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	tahoe | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
+		| arme[lb] | pyramid \
+		| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
+		| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
+		| powerpc | powerpcle | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
+		| pdp11 | mips64el | mips64orion | mips64orionel \
+		| sparc)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
+	      | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+	      | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+	      | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
+	      | mips64el-* | mips64orion-* | mips64orionel-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-cbm
+		;;
+	amigados)
+		basic_machine=m68k-cbm
+		os=-amigados
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-cbm
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	cray2)
+		basic_machine=cray2-cray
+		os=-unicos
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i[345]86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv32
+		;;
+	i[345]86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv4
+		;;
+	i[345]86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv
+		;;
+	i[345]86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-solaris2
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+        pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | p6)
+		# We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
+		basic_machine=i586-intel
+		;;
+	pentium-* | p5-* | p6-*)
+		# We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	k5)
+		# We don't have specific support for AMD's K5 yet, so just call it a Pentium
+		basic_machine=i586-amd
+		;;
+	nexen)
+		# We don't have specific support for Nexgen yet, so just call it a Pentium
+		basic_machine=i586-nexgen
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=rs6000-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+	        ;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+	        ;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	xmp)
+		basic_machine=xmp-cray
+		os=-unicos
+		;;
+        xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	mips)
+		basic_machine=mips-mips
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sparc)
+		basic_machine=sparc-sun
+		;;
+        cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-unixware* | svr4*)
+		os=-sysv4
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[345]* \
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigados* | -msdos* | -newsos* | -unicos* | -aos* \
+	      | -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
+	      | -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
+	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* )
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigados
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+        *-gould)
+		os=-sysv
+		;;
+        *-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+        *-sgi)
+		os=-irix
+		;;
+        *-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-lynxos*)
+				vendor=lynx
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-vxworks*)
+				vendor=wrs
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
diff --git a/configure b/configure
new file mode 100644
index 0000000..92b515d
--- /dev/null
+++ b/configure
@@ -0,0 +1,2033 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.4 
+# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --enable-dll-shlibs	select DLL libraries"
+ac_help="$ac_help
+  --enable-elf-shlibs	select ELF shared libraries"
+ac_help="$ac_help
+  --enable-bsd-shlibs	select BSD shared libraries"
+ac_help="$ac_help
+  --enable-profile	build profiling libraries"
+ac_help="$ac_help
+  --enable-checker	build checker libraries"
+ac_help="$ac_help
+  --enable-gcc-wall	enable GCC anal warnings"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Initialize some other variables.
+subdirs=
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -build | --build | --buil | --bui | --bu | --b)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=PREFIX    install architecture-dependent files in PREFIX
+                          [same as prefix]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+--enable and --with options recognized:$ac_help
+EOF
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.4"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *) 
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=version.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5'
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='	'
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+MCONFIG=./MCONFIG
+
+# Check whether --enable-dll-shlibs or --disable-dll-shlibs was given.
+enableval="$enable_dll_shlibs"
+if test -n "$enableval"; then
+  if test "$enableval" = "no"
+then
+	DLL_CMT=#
+	MAKEFILE_DLL=/dev/null
+	echo "Disabling DLL shared libraries"
+else
+	DLL_CMT=
+	MAKEFILE_DLL=$srcdir/lib/Makefile.dll-lib
+	echo "Enabling DLL shared libraries"
+fi
+
+else
+  MAKEFILE_DLL=/dev/null
+DLL_CMT=#
+echo "Disabling DLL shared libraries by default"
+
+fi
+
+
+
+# Check whether --enable-elf-shlibs or --disable-elf-shlibs was given.
+enableval="$enable_elf_shlibs"
+if test -n "$enableval"; then
+  if test "$enableval" = "no"
+then
+	ELF_CMT=#
+	MAKEFILE_ELF=/dev/null
+	echo "Disabling ELF shared libraries"
+else
+	ELF_CMT=
+	MAKEFILE_ELF=$srcdir/lib/Makefile.elf-lib
+	echo "Enabling ELF shared libraries"
+fi
+
+else
+  MAKEFILE_ELF=/dev/null
+ELF_CMT=#
+echo "Disabling ELF shared libraries by default"
+
+fi
+
+
+
+# Check whether --enable-bsd-shlibs or --disable-bsd-shlibs was given.
+enableval="$enable_bsd_shlibs"
+if test -n "$enableval"; then
+  if test "$enableval" = "no"
+then
+	BSDLIB_CMT=#
+	MAKEFILE_BSDLIB=/dev/null
+	echo "Disabling BSD shared libraries"
+else
+	BSDLIB_CMT=
+	MAKEFILE_BSDLIB=$srcdir/lib/Makefile.bsd-lib
+	echo "Enabling BSD shared libraries"
+fi
+
+else
+  MAKEFILE_BSDLIB=/dev/null
+BSDLIB_CMT=#
+echo "Disabling BSD shared libraries by default"
+
+fi
+
+
+
+# Check whether --enable-profile or --disable-profile was given.
+enableval="$enable_profile"
+if test -n "$enableval"; then
+  if test "$enableval" = "no"
+then
+	PROFILE_CMT=#
+	MAKEFILE_PROFILE=/dev/null
+	echo "Disabling profiling libraries"
+else
+	PROFILE_CMT=
+	MAKEFILE_PROFILE=$srcdir/lib/Makefile.profile
+	echo "Building profiling libraries"
+fi
+
+else
+  PROFILE_CMT=#
+MAKEFILE_PROFILE=/dev/null
+echo "Disabling profiling libraries by default"
+
+fi
+
+
+
+# Check whether --enable-checker or --disable-checker was given.
+enableval="$enable_checker"
+if test -n "$enableval"; then
+  if test "$enableval" = "no"
+then
+	CHECKER_CMT=#
+	MAKEFILE_CHECKER=/dev/null
+	echo "Disabling checker libraries"
+else
+	CHECKER_CMT=
+	MAKEFILE_CHECKER=$srcdir/lib/Makefile.checker
+	echo "Building checker libraries"
+fi
+
+else
+  CHECKER_CMT=#
+MAKEFILE_CHECKER=/dev/null
+echo "Disabling checker libraries by default"
+
+fi
+
+
+
+# Check whether --enable-gcc-wall or --disable-gcc-wall was given.
+enableval="$enable_gcc_wall"
+if test -n "$enableval"; then
+  if test "$enableval" = "no"
+then
+	W=#
+	echo "Disabling GCC warnings"
+else
+	W=
+	echo "Enabling GCC warnings"
+fi
+
+else
+  W=#
+echo "Disabling GCC warnings by default"
+
+fi
+
+
+MAKEFILE_LIBRARY=$srcdir/lib/Makefile.library
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+set dummy ${MAKE-make}; ac_make=$2
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Extract the first word of "ln", so it can be a program name with args.
+set dummy ln; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_path_LN'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$LN" in
+  /*)
+  ac_cv_path_LN="$LN" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_LN="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_LN" && ac_cv_path_LN="ln"
+  ;;
+esac
+fi
+LN="$ac_cv_path_LN"
+if test -n "$LN"; then
+  echo "$ac_t""$LN" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "mv", so it can be a program name with args.
+set dummy mv; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_path_MV'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$MV" in
+  /*)
+  ac_cv_path_MV="$MV" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_MV="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_MV" && ac_cv_path_MV="mv"
+  ;;
+esac
+fi
+MV="$ac_cv_path_MV"
+if test -n "$MV"; then
+  echo "$ac_t""$MV" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "cp", so it can be a program name with args.
+set dummy cp; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_path_CP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$CP" in
+  /*)
+  ac_cv_path_CP="$CP" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_CP="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_CP" && ac_cv_path_CP="cp"
+  ;;
+esac
+fi
+CP="$ac_cv_path_CP"
+if test -n "$CP"; then
+  echo "$ac_t""$CP" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$RM" in
+  /*)
+  ac_cv_path_RM="$RM" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_RM="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_RM" && ac_cv_path_RM="rm"
+  ;;
+esac
+fi
+RM="$ac_cv_path_RM"
+if test -n "$RM"; then
+  echo "$ac_t""$RM" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "chmod", so it can be a program name with args.
+set dummy chmod; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_path_CHMOD'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$CHMOD" in
+  /*)
+  ac_cv_path_CHMOD="$CHMOD" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_CHMOD="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_CHMOD" && ac_cv_path_CHMOD=":"
+  ;;
+esac
+fi
+CHMOD="$ac_cv_path_CHMOD"
+if test -n "$CHMOD"; then
+  echo "$ac_t""$CHMOD" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "awk", so it can be a program name with args.
+set dummy awk; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_path_AWK'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$AWK" in
+  /*)
+  ac_cv_path_AWK="$AWK" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_AWK="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_AWK" && ac_cv_path_AWK="awk"
+  ;;
+esac
+fi
+AWK="$ac_cv_path_AWK"
+if test -n "$AWK"; then
+  echo "$ac_t""$AWK" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "sed", so it can be a program name with args.
+set dummy sed; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_path_SED'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$SED" in
+  /*)
+  ac_cv_path_SED="$SED" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_SED="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_SED" && ac_cv_path_SED="sed"
+  ;;
+esac
+fi
+SED="$ac_cv_path_SED"
+if test -n "$SED"; then
+  echo "$ac_t""$SED" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Make sure we can run config.sub.
+if $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+  case $nonopt in
+  NONE)
+    if host_alias=`$ac_config_guess`; then :
+    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+    fi ;;
+  *) host_alias=$nonopt ;;
+  esac ;;
+esac
+
+host=`$ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+  case $nonopt in
+  NONE) build_alias=$host_alias ;;
+  *) build_alias=$nonopt ;;
+  esac ;;
+esac
+
+build=`$ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+if test $host != $build; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AR="${ac_tool_prefix}ar"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+  echo "$ac_t""$AR" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AR"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AR="ar"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+  echo "$ac_t""$AR" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  AR="ar"
+fi
+fi
+
+# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_RANLIB"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  RANLIB=":"
+fi
+fi
+
+# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+STRIP="$ac_cv_prog_STRIP"
+if test -n "$STRIP"; then
+  echo "$ac_t""$STRIP" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_STRIP"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_STRIP="strip"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_STRIP" && ac_cv_prog_STRIP=":"
+fi
+fi
+STRIP="$ac_cv_prog_STRIP"
+if test -n "$STRIP"; then
+  echo "$ac_t""$STRIP" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  STRIP=":"
+fi
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if ${CC-cc} -E conftest.c 2>&5 | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+  if test "${CFLAGS+set}" != set; then
+    echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_gcc_g=yes
+else
+  ac_cv_prog_gcc_g=no
+fi
+rm -f conftest*
+
+fi
+    echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6
+    if test $ac_cv_prog_gcc_g = yes; then
+      CFLAGS="-g -O"
+    else
+      CFLAGS="-O"
+    fi
+  fi
+else
+  GCC=
+  test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      for ac_prog in ginstall installbsd scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+	  if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    # OSF/1 installbsd also uses dspmsg, but is usable.
+	    :
+	  else
+	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+	    break 2
+	  fi
+	fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_ifs"
+  # As a last resort, use the slow shell script.
+  test -z "$ac_cv_path_install" && ac_cv_path_install="$ac_install_sh"
+fi
+  INSTALL="$ac_cv_path_install"
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+# If we cannot run a trivial program, we must be cross compiling.
+echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_c_cross=yes
+else
+cat > conftest.$ac_ext <<EOF
+#line 1186 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+eval $ac_link
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+  ac_cv_c_cross=no
+else
+  ac_cv_c_cross=yes
+fi
+fi
+rm -fr conftest*
+fi
+cross_compiling=$ac_cv_c_cross
+echo "$ac_t""$ac_cv_c_cross" 1>&6
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1217 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1231 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+for ac_hdr in stdlib.h unistd.h stdarg.h errno.h mntent.h dirent.h getopt.h linux/fd.h sys/disklabel.h
+do
+ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1264 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for vprintf""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1297 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char vprintf(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+char vprintf(); 
+
+int main() { return 0; }
+int t() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_vprintf) || defined (__stub___vprintf)
+choke me
+#else
+vprintf();
+#endif
+
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=no"
+fi
+rm -f conftest*
+
+fi
+if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_VPRINTF 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_func_vprintf" != yes; then
+echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1345 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char _doprnt(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+char _doprnt(); 
+
+int main() { return 0; }
+int t() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+_doprnt();
+#endif
+
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=no"
+fi
+rm -f conftest*
+
+fi
+if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_DOPRNT 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking whether struct dirent has a d_namlen field""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'e2fsprogs_cv_struct_d_namlen'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1394 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <dirent.h>
+int main() { return 0; }
+int t() {
+struct dirent de; de.d_namlen = 0;
+; return 0; }
+EOF
+if eval $ac_compile; then
+  rm -rf conftest*
+  e2fsprogs_cv_struct_d_namlen=yes
+else
+  rm -rf conftest*
+  e2fsprogs_cv_struct_d_namlen=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$e2fsprogs_cv_struct_d_namlen" 1>&6
+if test "$e2fsprogs_cv_struct_d_namlen" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_DIRENT_NAMLEN 1
+EOF
+
+fi
+if test "$cross_compiling" = yes -a "$ac_cv_sizeof_long" = ""; then
+  # if cross-compiling, with no cached values, just assume something common. 
+  ac_cv_sizeof_short=2
+  ac_cv_sizeof_int=4
+  ac_cv_sizeof_long=4
+  echo "configure: warning: Cross-compiling, so cannot check type sizes; assuming short=2, int=4, long=4" 1>&2
+fi
+echo $ac_n "checking size of short""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+cat > conftest.$ac_ext <<EOF
+#line 1436 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(short));
+  exit(0);
+}
+EOF
+eval $ac_link
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+  ac_cv_sizeof_short=`cat conftestval`
+else
+  ac_cv_sizeof_short=0
+fi
+fi
+rm -fr conftest*
+fi
+echo "$ac_t""$ac_cv_sizeof_short" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+EOF
+
+
+echo $ac_n "checking size of int""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+cat > conftest.$ac_ext <<EOF
+#line 1470 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(int));
+  exit(0);
+}
+EOF
+eval $ac_link
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+  ac_cv_sizeof_int=`cat conftestval`
+else
+  ac_cv_sizeof_int=0
+fi
+fi
+rm -fr conftest*
+fi
+echo "$ac_t""$ac_cv_sizeof_int" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+EOF
+
+
+echo $ac_n "checking size of long""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+cat > conftest.$ac_ext <<EOF
+#line 1504 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(long));
+  exit(0);
+}
+EOF
+eval $ac_link
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+  ac_cv_sizeof_long=`cat conftestval`
+else
+  ac_cv_sizeof_long=0
+fi
+fi
+rm -fr conftest*
+fi
+echo "$ac_t""$ac_cv_sizeof_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+EOF
+
+
+SIZEOF_SHORT=$ac_cv_sizeof_short
+SIZEOF_INT=$ac_cv_sizeof_int
+SIZEOF_LONG=$ac_cv_sizeof_long
+
+
+
+echo $ac_n "checking whether struct stat has a st_flags field""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'e2fsprogs_cv_struct_st_flags'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1541 "configure"
+#include "confdefs.h"
+#include <sys/stat.h>
+int main() { return 0; }
+int t() {
+struct stat stat; stat.st_flags = 0;
+; return 0; }
+EOF
+if eval $ac_compile; then
+  rm -rf conftest*
+  e2fsprogs_cv_struct_st_flags=yes
+else
+  rm -rf conftest*
+  e2fsprogs_cv_struct_st_flags=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$e2fsprogs_cv_struct_st_flags" 1>&6
+if test "$e2fsprogs_cv_struct_st_flags" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_STAT_FLAGS 1
+EOF
+
+fi
+for ac_func in chflags getrusage llseek strdup getmntinfo
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1574 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+char $ac_func(); 
+
+int main() { return 0; }
+int t() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+
+fi
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr '[a-z]' '[A-Z]'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+ac_safe=`echo "linux/fs.h" | tr './\055' '___'`
+echo $ac_n "checking for linux/fs.h""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1624 "configure"
+#include "confdefs.h"
+#include <linux/fs.h>
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  linux_headers=yes
+else
+  echo "$ac_t""no" 1>&6
+linux_headers=no
+fi
+
+
+if test "$linux_headers" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_LINUX_FS_H 1
+EOF
+
+  # These are some programs that depend on having linux headers around, and
+  # won't work otherwise.  So we only compile them if we can.
+  EXTRA_PROGS="$EXTRA_PROGS flushb"
+else
+  LINUX_INCLUDE='-I$(top_srcdir)/include -I$(top_builddir)/include'
+  # Use this include directory with test compiles in the configure script too.
+  CPPFLAGS="$CPPFLAGS -I$srcdir/include -I./include"
+fi
+
+echo $ac_n "checking for optreset""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_have_optreset'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1668 "configure"
+#include "confdefs.h"
+#include <unistd.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "optreset" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_have_optreset=yes
+else
+  rm -rf conftest*
+  ac_cv_have_optreset=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_have_optreset" 1>&6
+if test $ac_cv_have_optreset = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_OPTRESET 1
+EOF
+
+fi
+echo $ac_n "checking whether struct ext2_inode has frags fields""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'e2fsprogs_cv_struct_ext2_inode_frags'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1695 "configure"
+#include "confdefs.h"
+#include <linux/ext2_fs.h>
+int main() { return 0; }
+int t() {
+struct ext2_inode i; i.i_frag = i.i_fsize = 0;
+; return 0; }
+EOF
+if eval $ac_compile; then
+  rm -rf conftest*
+  e2fsprogs_cv_struct_ext2_inode_frags=yes
+else
+  rm -rf conftest*
+  e2fsprogs_cv_struct_ext2_inode_frags=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$e2fsprogs_cv_struct_ext2_inode_frags" 1>&6
+if test "$e2fsprogs_cv_struct_ext2_inode_frags" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_EXT2_FRAGS 1
+EOF
+
+fi
+echo $ac_n "checking whether the ext2 ioctls compile""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'e2fsprogs_cv_ioctl_ext2'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1726 "configure"
+#include "confdefs.h"
+#include <linux/ext2_fs.h>
+#include <sys/ioctl.h>
+int main() { return 0; }
+int t() {
+ioctl (0, EXT2_IOC_SETVERSION, 0);
+; return 0; }
+EOF
+if eval $ac_compile; then
+  rm -rf conftest*
+  e2fsprogs_cv_ioctl_ext2=yes
+else
+  rm -rf conftest*
+  e2fsprogs_cv_ioctl_ext2=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$e2fsprogs_cv_ioctl_ext2" 1>&6
+if test "$e2fsprogs_cv_ioctl_ext2" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_EXT2_IOCTLS 1
+EOF
+
+fi
+
+case "$host_os" in
+linux*)
+	if test "$prefix" = NONE ; then
+		prefix='/';
+		echo "On Linux systems, prefix defaults to '/'"
+	fi
+;;
+esac
+
+LDFALG_STATIC=
+case "$host_os" in
+linux*)
+	LDFLAG_STATIC=-static
+	echo "On Linux systems, assume -static works"
+;;
+esac
+
+if test "$prefix" = / ; then
+	usr_prefix=/usr
+else
+	usr_prefix="\${prefix}"
+fi
+
+SS_DIR=`cd ${srcdir}/lib/ss; pwd`
+ET_DIR=`cd ${srcdir}/lib/et; pwd`
+
+
+if test "$cross_compiling" = yes ; then
+  DO_TEST_SUITE=
+else
+  DO_TEST_SUITE=check
+fi
+
+test -d lib || mkdir lib
+test -d include || mkdir include
+test -d include/linux || mkdir include/linux
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \
+  >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%-D\1=\2%g
+s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.4"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "MCONFIG include/linux/types.h Makefile lib/et/Makefile 
+	lib/et/compile_et.sh lib/ss/Makefile lib/ss/mk_cmds.sh 
+	lib/ext2fs/Makefile lib/e2p/Makefile misc/Makefile 
+	e2fsck/Makefile debugfs/Makefile tests/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+
+# Protect against being on the right side of a sed subst in config.status. 
+sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; 
+ s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+/@MCONFIG@/r $MCONFIG
+s%@MCONFIG@%%g
+s%@DLL_CMT@%$DLL_CMT%g
+/@MAKEFILE_DLL@/r $MAKEFILE_DLL
+s%@MAKEFILE_DLL@%%g
+s%@ELF_CMT@%$ELF_CMT%g
+/@MAKEFILE_ELF@/r $MAKEFILE_ELF
+s%@MAKEFILE_ELF@%%g
+s%@BSDLIB_CMT@%$BSDLIB_CMT%g
+/@MAKEFILE_BSDLIB@/r $MAKEFILE_BSDLIB
+s%@MAKEFILE_BSDLIB@%%g
+s%@PROFILE_CMT@%$PROFILE_CMT%g
+/@MAKEFILE_PROFILE@/r $MAKEFILE_PROFILE
+s%@MAKEFILE_PROFILE@%%g
+s%@CHECKER_CMT@%$CHECKER_CMT%g
+/@MAKEFILE_CHECKER@/r $MAKEFILE_CHECKER
+s%@MAKEFILE_CHECKER@%%g
+s%@W@%$W%g
+/@MAKEFILE_LIBRARY@/r $MAKEFILE_LIBRARY
+s%@MAKEFILE_LIBRARY@%%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@LN@%$LN%g
+s%@MV@%$MV%g
+s%@CP@%$CP%g
+s%@RM@%$RM%g
+s%@CHMOD@%$CHMOD%g
+s%@AWK@%$AWK%g
+s%@SED@%$SED%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@AR@%$AR%g
+s%@RANLIB@%$RANLIB%g
+s%@STRIP@%$STRIP%g
+s%@CC@%$CC%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@CPP@%$CPP%g
+s%@SIZEOF_SHORT@%$SIZEOF_SHORT%g
+s%@SIZEOF_INT@%$SIZEOF_INT%g
+s%@SIZEOF_LONG@%$SIZEOF_LONG%g
+s%@EXTRA_PROGS@%$EXTRA_PROGS%g
+s%@LINUX_INCLUDE@%$LINUX_INCLUDE%g
+s%@LDFLAG_STATIC@%$LDFLAG_STATIC%g
+s%@usr_prefix@%$usr_prefix%g
+s%@SS_DIR@%$SS_DIR%g
+s%@ET_DIR@%$ET_DIR%g
+s%@DO_TEST_SUITE@%$DO_TEST_SUITE%g
+
+CEOF
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"MCONFIG include/linux/types.h Makefile lib/et/Makefile 
+	lib/et/compile_et.sh lib/ss/Makefile lib/ss/mk_cmds.sh 
+	lib/ext2fs/Makefile lib/e2p/Makefile misc/Makefile 
+	e2fsck/Makefile debugfs/Makefile tests/Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust relative srcdir, etc. for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file
+fi; done
+rm -f conftest.subs
+
+
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..5349abc
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,322 @@
+AC_INIT(version.h)
+MCONFIG=./MCONFIG
+AC_SUBST_FILE(MCONFIG)
+dnl
+dnl handle --enable-dll-shlibs
+dnl
+AC_ARG_ENABLE([dll-shlibs],
+[  --enable-dll-shlibs	select DLL libraries],
+if test "$enableval" = "no"
+then
+	DLL_CMT=#
+	MAKEFILE_DLL=/dev/null
+	echo "Disabling DLL shared libraries"
+else
+	DLL_CMT=
+	MAKEFILE_DLL=$srcdir/lib/Makefile.dll-lib
+	echo "Enabling DLL shared libraries"
+fi
+,
+MAKEFILE_DLL=/dev/null
+DLL_CMT=#
+echo "Disabling DLL shared libraries by default"
+)
+AC_SUBST(DLL_CMT)
+AC_SUBST_FILE(MAKEFILE_DLL)
+dnl
+dnl handle --enable-elf-shlibs
+dnl
+AC_ARG_ENABLE([elf-shlibs],
+[  --enable-elf-shlibs	select ELF shared libraries],
+if test "$enableval" = "no"
+then
+	ELF_CMT=#
+	MAKEFILE_ELF=/dev/null
+	echo "Disabling ELF shared libraries"
+else
+	ELF_CMT=
+	MAKEFILE_ELF=$srcdir/lib/Makefile.elf-lib
+	echo "Enabling ELF shared libraries"
+fi
+,
+MAKEFILE_ELF=/dev/null
+ELF_CMT=#
+echo "Disabling ELF shared libraries by default"
+)
+AC_SUBST(ELF_CMT)
+AC_SUBST_FILE(MAKEFILE_ELF)
+dnl
+dnl handle --enable-bsd-shlibs
+dnl
+AC_ARG_ENABLE([bsd-shlibs],
+[  --enable-bsd-shlibs	select BSD shared libraries],
+if test "$enableval" = "no"
+then
+	BSDLIB_CMT=#
+	MAKEFILE_BSDLIB=/dev/null
+	echo "Disabling BSD shared libraries"
+else
+	BSDLIB_CMT=
+	MAKEFILE_BSDLIB=$srcdir/lib/Makefile.bsd-lib
+	echo "Enabling BSD shared libraries"
+fi
+,
+MAKEFILE_BSDLIB=/dev/null
+BSDLIB_CMT=#
+echo "Disabling BSD shared libraries by default"
+)
+AC_SUBST(BSDLIB_CMT)
+AC_SUBST_FILE(MAKEFILE_BSDLIB)
+dnl
+dnl handle --enable-profile
+dnl
+AC_ARG_ENABLE([profile],
+[  --enable-profile	build profiling libraries],
+if test "$enableval" = "no"
+then
+	PROFILE_CMT=#
+	MAKEFILE_PROFILE=/dev/null
+	echo "Disabling profiling libraries"
+else
+	PROFILE_CMT=
+	MAKEFILE_PROFILE=$srcdir/lib/Makefile.profile
+	echo "Building profiling libraries"
+fi
+,
+PROFILE_CMT=#
+MAKEFILE_PROFILE=/dev/null
+echo "Disabling profiling libraries by default"
+)
+AC_SUBST(PROFILE_CMT)
+AC_SUBST_FILE(MAKEFILE_PROFILE)
+dnl
+dnl handle --enable-checker
+dnl
+AC_ARG_ENABLE([checker],
+[  --enable-checker	build checker libraries],
+if test "$enableval" = "no"
+then
+	CHECKER_CMT=#
+	MAKEFILE_CHECKER=/dev/null
+	echo "Disabling checker libraries"
+else
+	CHECKER_CMT=
+	MAKEFILE_CHECKER=$srcdir/lib/Makefile.checker
+	echo "Building checker libraries"
+fi
+,
+CHECKER_CMT=#
+MAKEFILE_CHECKER=/dev/null
+echo "Disabling checker libraries by default"
+)
+AC_SUBST(CHECKER_CMT)
+AC_SUBST_FILE(MAKEFILE_CHECKER)
+dnl
+dnl handle --enable-gcc-wall
+dnl
+AC_ARG_ENABLE([gcc-wall],
+[  --enable-gcc-wall	enable GCC anal warnings],
+if test "$enableval" = "no"
+then
+	W=#
+	echo "Disabling GCC warnings"
+else
+	W=
+	echo "Enabling GCC warnings"
+fi
+,
+W=#
+echo "Disabling GCC warnings by default"
+)
+AC_SUBST(W)
+dnl
+dnl
+MAKEFILE_LIBRARY=$srcdir/lib/Makefile.library
+AC_SUBST_FILE(MAKEFILE_LIBRARY)
+dnl
+dnl End of configuration options
+dnl
+AC_PROG_MAKE_SET
+AC_PATH_PROG(LN, ln, ln)
+AC_PATH_PROG(MV, mv, mv)
+AC_PATH_PROG(CP, cp, cp)
+AC_PATH_PROG(RM, rm, rm)
+AC_PATH_PROG(CHMOD, chmod, :)
+AC_PATH_PROG(AWK, awk, awk)
+AC_PATH_PROG(SED, sed, sed)
+AC_CHECK_TOOL(AR, ar, ar)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_C_CROSS
+AC_CHECK_HEADERS(stdlib.h unistd.h stdarg.h errno.h mntent.h dirent.h getopt.h linux/fd.h sys/disklabel.h)
+AC_FUNC_VPRINTF
+dnl
+dnl See if struct dirent has a d_namlen field (like bsd systems), implying
+dnl that the actual length of the structure may be grater than the declared
+dnl length. 
+dnl
+AC_MSG_CHECKING(whether struct dirent has a d_namlen field)
+AC_CACHE_VAL(e2fsprogs_cv_struct_d_namlen,
+	AC_TRY_COMPILE(
+[#include <sys/types.h>
+#include <dirent.h>],
+		[struct dirent de; de.d_namlen = 0;],
+		[e2fsprogs_cv_struct_d_namlen=yes],
+		[e2fsprogs_cv_struct_d_namlen=no]))
+AC_MSG_RESULT($e2fsprogs_cv_struct_d_namlen)
+if test "$e2fsprogs_cv_struct_d_namlen" = yes; then
+  AC_DEFINE(HAVE_DIRENT_NAMLEN)
+fi
+dnl
+dnl Word sizes...
+dnl
+if test "$cross_compiling" = yes -a "$ac_cv_sizeof_long" = ""; then
+  # if cross-compiling, with no cached values, just assume something common. 
+  ac_cv_sizeof_short=2
+  ac_cv_sizeof_int=4
+  ac_cv_sizeof_long=4
+  AC_MSG_WARN([Cross-compiling, so cannot check type sizes; assuming short=2, int=4, long=4])
+fi
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+SIZEOF_SHORT=$ac_cv_sizeof_short
+SIZEOF_INT=$ac_cv_sizeof_int
+SIZEOF_LONG=$ac_cv_sizeof_long
+AC_SUBST(SIZEOF_SHORT)
+AC_SUBST(SIZEOF_INT)
+AC_SUBST(SIZEOF_LONG)
+dnl
+dnl See if struct stat has a st_flags field, in which case we can get file
+dnl flags somewhat portably.  Also check for the analogous setter, chflags().
+dnl
+AC_MSG_CHECKING(whether struct stat has a st_flags field)
+AC_CACHE_VAL(e2fsprogs_cv_struct_st_flags,
+	AC_TRY_COMPILE([#include <sys/stat.h>],
+		[struct stat stat; stat.st_flags = 0;],
+		[e2fsprogs_cv_struct_st_flags=yes],
+		[e2fsprogs_cv_struct_st_flags=no]))
+AC_MSG_RESULT($e2fsprogs_cv_struct_st_flags)
+if test "$e2fsprogs_cv_struct_st_flags" = yes; then
+  AC_DEFINE(HAVE_STAT_FLAGS)
+fi
+AC_CHECK_FUNCS(chflags getrusage llseek strdup getmntinfo)
+dnl
+dnl On systems without linux header files, we add an extra include directory
+dnl that holds enough to fake it (hopefully).  Note that the $(top_srcdir) here
+dnl is quoted so that it gets expanded by make, not by configure.
+dnl
+AC_CHECK_HEADER(linux/fs.h, [linux_headers=yes], [linux_headers=no])
+AC_SUBST(EXTRA_PROGS)
+if test "$linux_headers" = yes; then
+  AC_DEFINE(HAVE_LINUX_FS_H)
+  # These are some programs that depend on having linux headers around, and
+  # won't work otherwise.  So we only compile them if we can.
+  EXTRA_PROGS="$EXTRA_PROGS flushb"
+else
+  LINUX_INCLUDE='-I$(top_srcdir)/include -I$(top_builddir)/include'
+  # Use this include directory with test compiles in the configure script too.
+  CPPFLAGS="$CPPFLAGS -I$srcdir/include -I./include"
+fi
+AC_SUBST(LINUX_INCLUDE)
+dnl
+dnl See if optreset exists
+dnl
+AC_MSG_CHECKING(for optreset)
+AC_CACHE_VAL(ac_cv_have_optreset,
+[AC_EGREP_HEADER(optreset, unistd.h,
+  ac_cv_have_optreset=yes, ac_cv_have_optreset=no)])dnl
+AC_MSG_RESULT($ac_cv_have_optreset)
+if test $ac_cv_have_optreset = yes; then
+  AC_DEFINE(HAVE_OPTRESET)
+fi
+dnl
+dnl See if our system has frags enabled (at least in the header file)
+dnl
+AC_MSG_CHECKING(whether struct ext2_inode has frags fields)
+AC_CACHE_VAL(e2fsprogs_cv_struct_ext2_inode_frags,
+	AC_TRY_COMPILE([#include <linux/ext2_fs.h>],
+		[struct ext2_inode i; i.i_frag = i.i_fsize = 0;],
+		[e2fsprogs_cv_struct_ext2_inode_frags=yes],
+		[e2fsprogs_cv_struct_ext2_inode_frags=no]))
+AC_MSG_RESULT($e2fsprogs_cv_struct_ext2_inode_frags)
+if test "$e2fsprogs_cv_struct_ext2_inode_frags" = yes; then
+  AC_DEFINE(HAVE_EXT2_FRAGS)
+fi
+dnl
+dnl See if using the EXT2 ioctls causes a compile-time barf (as on the hurd).
+dnl
+AC_MSG_CHECKING(whether the ext2 ioctls compile)
+AC_CACHE_VAL(e2fsprogs_cv_ioctl_ext2,
+	AC_TRY_COMPILE([#include <linux/ext2_fs.h>
+#include <sys/ioctl.h>],
+		[ioctl (0, EXT2_IOC_SETVERSION, 0);],
+		[e2fsprogs_cv_ioctl_ext2=yes],
+		[e2fsprogs_cv_ioctl_ext2=no]))
+AC_MSG_RESULT($e2fsprogs_cv_ioctl_ext2)
+if test "$e2fsprogs_cv_ioctl_ext2" = yes; then
+  AC_DEFINE(HAVE_EXT2_IOCTLS)
+fi
+dnl
+dnl On linux, force the prefix to be '/'
+dnl
+AC_REQUIRE([AC_CANONICAL_HOST])
+case "$host_os" in
+linux*)
+	if test "$prefix" = NONE ; then
+		prefix='/';
+		echo "On Linux systems, prefix defaults to '/'"
+	fi
+;;
+esac
+dnl
+dnl See if -static works.
+dnl XXX for now, assume that only Linux systems support -static
+dnl
+AC_REQUIRE([AC_CANONICAL_HOST])
+LDFALG_STATIC=
+case "$host_os" in
+linux*)
+	LDFLAG_STATIC=-static
+	echo "On Linux systems, assume -static works"
+;;
+esac
+AC_SUBST(LDFLAG_STATIC)
+dnl
+dnl Check to see if prefix is '/'
+dnl
+if test "$prefix" = / ; then
+	usr_prefix=/usr
+else
+	usr_prefix="\${prefix}"
+fi
+AC_SUBST(usr_prefix)
+dnl
+dnl Make the ss and et directories work correctly.
+dnl
+SS_DIR=`cd ${srcdir}/lib/ss; pwd`
+ET_DIR=`cd ${srcdir}/lib/et; pwd`
+AC_SUBST(SS_DIR)
+AC_SUBST(ET_DIR)
+dnl
+dnl Only try to run the test suite if we're not cross compiling.
+dnl
+if test "$cross_compiling" = yes ; then
+  DO_TEST_SUITE=
+else
+  DO_TEST_SUITE=check
+fi
+AC_SUBST(DO_TEST_SUITE)
+dnl
+dnl Make our output files, being sure that we create the some miscellaneous 
+dnl directories
+dnl
+test -d lib || mkdir lib
+test -d include || mkdir include
+test -d include/linux || mkdir include/linux
+AC_OUTPUT(MCONFIG include/linux/types.h Makefile lib/et/Makefile 
+	lib/et/compile_et.sh lib/ss/Makefile lib/ss/mk_cmds.sh 
+	lib/ext2fs/Makefile lib/e2p/Makefile misc/Makefile 
+	e2fsck/Makefile debugfs/Makefile tests/Makefile)
diff --git a/contrib/dconf b/contrib/dconf
new file mode 100644
index 0000000..cef4cc6
--- /dev/null
+++ b/contrib/dconf
@@ -0,0 +1,118 @@
+#!/bin/sh
+#$Id$
+# Create Adobe-PostScript file that graphically displays the output of
+# dumpe2fs(8). Use "dumpe2fs | dconf" to create a PostScript file on stdout.
+# Developed and tested for Linux 1.0.
+# Copyright (c) 1994
+# Ulrich Windl
+# ALte Regensburger Strasse 11a
+# D-93149 Nittenau, Germany
+# <Ulrich.Windl@rz.uni-regensburg.de>
+SELF=`basename $0`
+AWKFILE=/tmp/${SELF}.awk
+TEMPFILE=/tmp/${SELF}.tmp
+echo '
+BEGIN {
+	print "B"
+}
+/^Inode count:/ {
+	ic=$3; next
+}
+/^Block count:/ {
+	bc=$3; next
+}
+/^First block:/ {
+	fb=$3; next
+}
+/^Block size:/ {
+	bs=$3; next
+}
+/^Blocks per group:/ {
+	bpg=$4
+	printf("BC %d\n", bpg)
+	printf("GC %d\n", (bc + bpg - 1) / bpg)
+	next
+}
+/^Inodes per group:/ {
+	ipg=$4; next
+}
+/^Last write time:/ {
+	lwtime=$0; gsub("Last write time:[ ]+", "", lwtime)
+	printf("T %s\n", lwtime)
+	next
+}
+/^Group [0-9]+:/ {
+	group=$2; gsub(":", "", group)
+	block=""
+	group_start=group*bpg+fb
+	group_end=group_start+bpg
+	printf("G %d : %d - %d\n", group, group_start, group_end)
+	next
+}
+/^[ ]+Free blocks: / {
+	for ( i=3; i < NF; ++i ) {
+		block=$i; gsub(",", "", block)
+		if ( index(block, "-") == 0 ) block=block "-" block
+		pos=index(block, "-")
+		printf("FB %d-%d\n",
+		       substr(block, 0, pos) - group_start,
+		       substr(block, pos + 1) - group_start)
+	}
+	if ( block == "" ) printf("Group %d is full\n", group)
+	print "----"
+	next
+}
+END {
+	printf("E %s\n", lwtime)
+}' >$AWKFILE
+awk -f $AWKFILE $* >$TEMPFILE
+echo '
+BEGIN {
+        printf("%%!PS-Adobe\n")
+        printf("%%%%BoundingBox: 0 0 1 1\n")
+	printf("/rect {/y2 exch def /x2 exch def /y1 exch def /x1 exch def\n")
+	printf("       newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto\n")
+	printf("       x1 y2 lineto closepath} def\n")
+	printf("/fb {rect gsave 1.0 setgray fill grestore} def\n")
+	printf("/dg {rect gsave gsave 0.0 setgray fill grestore\n")
+	printf("     0.5 setgray stroke grestore} def\n")
+	printf("/textxy {moveto show} bind def\n")
+	printf("0.0001 setlinewidth\n")
+}
+$1 == "GC" && NF == 2 {
+	number_of_groups=$2
+	printf("/Times-Roman findfont %g scalefont setfont\n",
+	       1.0 / number_of_groups)
+	next
+}
+$1 == "BC" && NF == 2 {
+	blocks_per_group=$2; next
+}
+$1 == "T" && NF > 1 {
+	printf("(%s) %g %g textxy\n",
+	       substr($0, 2), 0, 1.02)
+	next
+}
+$1 == "G" && NF == 6 && $3 == ":" && $5 == "-" {
+	group_index=$2
+	gs=$4
+	ge=$6
+	height=1.0 / number_of_groups
+	vstart=group_index * height
+	printf("%% group %d of %d:\n0 %g 1 %g dg\n",
+	       group_index, number_of_groups, vstart, vstart + height)
+	printf("(Group %s) 1.02 %g textxy\n", group_index, vstart)
+	next
+}
+$1 == "FB" && NF == 2 {
+	pos = index($2, "-")
+	printf("%% hole %s\n%g %g %g %g fb\n",
+	       $2, substr($2, 0, pos) / blocks_per_group, vstart,
+	       (substr($2, pos + 1) + 1) / blocks_per_group, vstart + height)
+	next
+}
+END {
+    	printf("%%%%EOF\n")
+}
+' >$AWKFILE
+awk -f $AWKFILE $TEMPFILE
diff --git a/debugfs/.depend b/debugfs/.depend
index 65ffaa3..5655062 100644
--- a/debugfs/.depend
+++ b/debugfs/.depend
@@ -1,55 +1,60 @@
-debugfs.o : debugfs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+debugfs.o : ./debugfs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.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/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/ctype.h /usr/include/string.h /usr/include/time.h \
-  /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/linux/stat.h ../lib/et/com_err.h \
-  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../lib/ss/ss.h ../lib/ss/mit-sipb-copyright.h \
-  ../lib/ss/ss_err.h debugfs.h /usr/include/linux/ext2_fs.h ../lib/ext2fs/ext2fs.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/ctype.h \
+  /usr/include/string.h /usr/include/time.h /usr/include/getopt.h /usr/include/sys/stat.h \
+  /usr/include/linux/stat.h ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../lib/ss/ss.h ../lib/ss/mit-sipb-copyright.h ../lib/ss/ss_err.h ./debugfs.h \
+  /usr/include/linux/ext2_fs.h ../lib/ext2fs/ext2fs.h ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h \
+  ../lib/ext2fs/bitops.h 
+dump.o : ./dump.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.h \
+  /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/ctype.h \
+  /usr/include/string.h /usr/include/time.h /usr/include/getopt.h /usr/include/sys/stat.h \
+  /usr/include/linux/stat.h /usr/include/fcntl.h /usr/include/linux/fcntl.h ./debugfs.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 
-dump.o : dump.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+icheck.o : ./icheck.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.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/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/ctype.h /usr/include/string.h /usr/include/time.h \
-  /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/fcntl.h \
-  /usr/include/linux/fcntl.h debugfs.h /usr/include/linux/ext2_fs.h ../lib/ext2fs/ext2fs.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/ctype.h \
+  /usr/include/string.h /usr/include/time.h /usr/include/getopt.h /usr/include/sys/stat.h \
+  /usr/include/linux/stat.h ./debugfs.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 
-icheck.o : icheck.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+lsdel.o : ./lsdel.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.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/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/ctype.h /usr/include/string.h /usr/include/time.h \
-  /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/linux/stat.h debugfs.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 
-lsdel.o : lsdel.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/ctype.h \
+  /usr/include/string.h /usr/include/time.h /usr/include/getopt.h /usr/include/sys/stat.h \
+  /usr/include/linux/stat.h ./debugfs.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 
+ncheck.o : ./ncheck.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.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/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/ctype.h /usr/include/string.h /usr/include/time.h \
-  /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/linux/stat.h debugfs.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 
-ncheck.o : ncheck.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/ctype.h \
+  /usr/include/string.h /usr/include/time.h /usr/include/getopt.h /usr/include/sys/stat.h \
+  /usr/include/linux/stat.h ./debugfs.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 
+util.o : ./util.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.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/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/ctype.h /usr/include/string.h /usr/include/time.h \
-  /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/linux/stat.h debugfs.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 
-util.o : util.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.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/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/ctype.h /usr/include/string.h debugfs.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 
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/ctype.h \
+  /usr/include/string.h ./debugfs.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 
diff --git a/debugfs/ChangeLog b/debugfs/ChangeLog
index bff9420..74df53f 100644
--- a/debugfs/ChangeLog
+++ b/debugfs/ChangeLog
@@ -1,3 +1,58 @@
+Thu Oct 26 12:05:06 1995    <tytso@rsts-11.mit.edu>
+
+	* Makefile.in (install): Strip programs when they are installed.
+
+Fri Aug 18 15:09:08 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+	* debugfs.c (do_find_free_block): Fix typo in code which checked
+		to see if the usage message should be printed.
+
+Thu Aug 17 22:55:58 1995    <tytso@rsts-11.mit.edu>
+
+	* debugfs.c (do_open_filesys): Change to always set optreset to 1,
+		to make BSD getopt()'s happy.  Also set optind to 1, which
+		should make more getopt()'s happy.
+
+Fri Aug 11 08:45:01 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* debugfs.c (do_find_free_block, do_find_free_inode): Fix bug in
+		the usage handling where "ffi ?" or "ffb ?" would
+		dereference a NULL pointer.
+
+Fri Aug 11 14:21:07 1995  Remy Card  <card@bbj>
+
+	* debugfs.8: Updated date and version number.
+
+Thu Aug 10 14:28:50 1995  Remy Card  <card@bbj>
+
+	* debugfs.8: Fixed a spelling error in Ted's name :-)
+
+Mon Jun 12 19:08:25 1995  Theodore Y. Ts'o  (tytso@dcl)
+
+	* debugfs.c, ncheck.c, icheck.c, lsdel.c, dump.c: Include
+		<errno.h> (if it exists)
+
+	* debugfs.c, dump.c, icheck.c, lsdel.c, ncheck.c: Don't include
+		<getopt.h> if it doesn't exist.
+
+Sun Jun 11 15:21:07 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* ncheck.c (do_ncheck): Use LINUX_S_ISDIR instead of S_ISDIR
+
+	* debugfs.c: Implement the mknod and write commands (from Linus).
+
+		Change names of modify_char, modify_short, and modify_long
+		to be modify_u8, modify_u16, and modify_u32, respectively.
+
+Thu Jun  8 12:29:15 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* debugfs.c (dump_inode): Only print out inode frag fields if
+	HAVE_EXT2_FRAGS is defined (by configure).  Don't print out the
+	reserved field at all for  now.
+
+	* Makefile.in: Rewritten to conform to GNU coding standards and
+	support separate compilation directories.
+
 Thu Nov 24 17:46:23 1994  Theodore Y. Ts'o  (tytso@rt-11)
 
 	* dump.c: Added two new commands, "dump" and "cat", which allow
diff --git a/debugfs/Makefile b/debugfs/Makefile
deleted file mode 100644
index aef6ac6..0000000
--- a/debugfs/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-include ../MCONFIG
-
-CFLAGS=		$(OPT) -Wall -I../lib
-LDFLAGS=	$(OPT)
-PROGS=		debugfs
-BINDIR=		$(SBINDIR)
-MANPAGES=	debugfs.8
-MANDIR=		$(SMANDIR)
-
-MK_CMDS=	../lib/ss/mk_cmds
-
-DEBUG_OBJS= debug_cmds.o debugfs.o util.o ncheck.o icheck.o lsdel.o dump.o
-
-LIBS= -L../lib -lss -lcom_err -lext2fs
-DEPLIBS= ../lib/libss.a ../lib/libcom_err.a ../lib/libext2fs.a
-
-debugfs: $(DEBUG_OBJS) $(DEPLIBS)
-	$(CC) $(LDFLAGS) -o debugfs $(DEBUG_OBJS) $(LIBS)
-
-debug_cmds.c debug_cmds.h: debug_cmds.ct
-	$(MK_CMDS) debug_cmds.ct
-
-install:: $(PROGS)
-	for i in $(PROGS); do \
-		$(INSTALLBIN) $$i $(BINDIR)/$$i; \
-	done
-
-install:: $(MANPAGES)
-	for i in $(MANPAGES); do \
-		$(INSTALLMAN) $$i $(MANDIR)/$$i; \
-	done
-
-install-tree:: $(PROGS)
-	for i in $(PROGS); do \
-		rm -f ../bin/$$i; \
-		cp $$i ../bin; \
-		strip ../bin/$$i; \
-		chmod 555 ../bin/$$i; \
-	done
-
-clean:
-	rm -f debugfs \#* *.s *.o *.a *~ debug_cmds.c core
-
-really-clean: clean
-	rm -f debug_cmds.c .depend 
-
-dep depend .depend:
-	$(CPP) $(CFLAGS) -M *.c >.depend
-
-include .depend
diff --git a/debugfs/Makefile.in b/debugfs/Makefile.in
new file mode 100644
index 0000000..36c8ab7
--- /dev/null
+++ b/debugfs/Makefile.in
@@ -0,0 +1,103 @@
+#
+# Standard e2fsprogs prologue....
+#
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+top_builddir = ..
+INSTALL = @INSTALL@
+
+@MCONFIG@
+
+PROGS=		debugfs
+MANPAGES=	debugfs.8
+
+MK_CMDS=	../lib/ss/mk_cmds
+
+DEBUG_OBJS= debug_cmds.o debugfs.o util.o ncheck.o icheck.o lsdel.o dump.o
+
+SRCS= debug_cmds.c $(srcdir)/debugfs.c $(srcdir)/util.c \
+	$(srcdir)/ncheck.c $(srcdir)/icheck.c $(srcdir)/lsdel.c \
+	$(srcdir)/dump.c
+
+LIBS= -L../lib -lss -lcom_err -lext2fs
+DEPLIBS= ../lib/libss.a ../lib/libcom_err.a ../lib/libext2fs.a
+
+.c.o:
+	$(CC) -c $(CFLAGS) $< -o $@
+
+all:: $(PROGS)
+
+debugfs: $(DEBUG_OBJS) $(DEPLIBS)
+	$(CC) $(LDFLAGS) -o debugfs $(DEBUG_OBJS) $(LIBS)
+
+debug_cmds.c debug_cmds.h: debug_cmds.ct
+	$(MK_CMDS) $(srcdir)/debug_cmds.ct
+
+installdirs:
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(usbindir) \
+		$(DESTDIR)$(man8dir) $(DESTDIR)$(cat8dir)
+
+install: $(PROGS) $(MANPAGES) installdirs
+	for i in $(PROGS); do \
+		$(INSTALL_PROGRAM) $$i $(DESTDIR)$(usbindir)/$$i; \
+		$(STRIP) $(DESTDIR)$(usbindir)/$$i; \
+	done
+	for i in $(MANPAGES); do \
+		$(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(man8dir)/$$i; \
+	done
+
+uninstall:
+	for i in $(PROGS); do \
+		$(RM) -f $(usbindir)/$$i; \
+	done
+	for i in $(MANPAGES); do \
+		$(RM) -f $(man8dir)/$$i; \
+	done
+
+clean:
+	$(RM) -f debugfs \#* *.s *.o *.a *~ debug_cmds.c core
+mostlyclean: clean
+distclean: clean
+	$(RM) -f debug_cmds.c .depend Makefile
+
+# +++ Dependency line eater +++
+# 
+# Makefile dependencies follow.  This must be the last section in
+# the Makefile.in file
+#
+debug_cmds.o: debug_cmds.c $(top_srcdir)/lib/ss/ss.h \
+  $(top_srcdir)/lib/ss/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h
+debugfs.o: $(srcdir)/debugfs.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(top_srcdir)/lib/ss/ss.h $(top_srcdir)/lib/ss/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h \
+  $(srcdir)/debugfs.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
+util.o: $(srcdir)/util.c \
+  $(srcdir)/debugfs.h \
+  $(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
+ncheck.o: $(srcdir)/ncheck.c \
+  $(srcdir)/debugfs.h \
+  $(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
+icheck.o: $(srcdir)/icheck.c \
+  $(srcdir)/debugfs.h \
+  $(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
+lsdel.o: $(srcdir)/lsdel.c \
+  $(srcdir)/debugfs.h \
+  $(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
+dump.o: $(srcdir)/dump.c \
+  $(srcdir)/debugfs.h \
+  $(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
+
diff --git a/debugfs/debug_cmds.ct b/debugfs/debug_cmds.ct
index 2b80059..7e07045 100644
--- a/debugfs/debug_cmds.ct
+++ b/debugfs/debug_cmds.ct
@@ -91,9 +91,15 @@
 request	do_expand_dir, "Expand directory",
 	expand_dir, expand;
 
+request do_mknod, "Create a special file",
+	mknod;
+
 request do_lsdel, "List deleted inodes",
 	list_deleted_inodes, lsdel;
 
+request do_write, "Copy a file from your native filesystem",
+	write;
+
 request do_dump, "Dump an inode out to a file",
 	dump_inode, dump;
 
diff --git a/debugfs/debugfs.8 b/debugfs/debugfs.8
index 8bb0a74..9ff19d6 100644
--- a/debugfs/debugfs.8
+++ b/debugfs/debugfs.8
@@ -1,5 +1,8 @@
 .\" -*- nroff -*-
-.TH DEBUGFS 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 DEBUGFS 8 "October 1995" "Version 0.5c"
 .SH NAME
 debugfs \- ext2 file system debugger
 .SH SYNOPSIS
@@ -27,18 +30,26 @@
 .B debugfs
 is an interactive debugger. It understands a number of commands.
 .TP
-.I cd file
+.I cat <file>
+Dump the contents of an inode to stdout.
 .TP
-.I chroot file
+.I cd <directory>
+Change the current working directory to specified directory
+.TP
+.I chroot <directory>
+Change the root directory to be the specified inode.
 .TP
 .I close
 Close the currently open file system.
 .TP
-.I clri file
+.I clri <file>
 Clear the contents of the inode corresponding to
 .I file
 .TP
-.I expand_dir, file
+.I dump <file> <out_file>
+Dump the contents of an inode to a file.
+.TP
+.I expand_dir <file>
 Expand a directory.
 .TP
 .I find_free_block [goal]
@@ -49,28 +60,33 @@
 .I find_free_inode [dir [mode]]
 Find a free inode and allocates it.
 .TP
-.I freeb block
+.I freeb <block>
 Mark the block as not allocated.
 .TP
-.I freei file
+.I freei <file>
 Free the inode corresponding to
 .I file
 .TP
 .I help
+Print a list of commands understood by 
+.BR debugfs (8).
 .TP
-.I iname inode
+.I icheck <block>
+Do block->inode translation.
+.TP
+.I iname <inode>
 Print the file name corresponding to
 .I inode
-(currently not implemented).
+(currently not implemented - see ncheck).
 .TP
-.I initialize device blocksize
+.I initialize <device> <blocksize>
 Create an ext2 file system on
 .I device
 .TP
-.I kill_file file
+.I kill_file <file>
 Remove a file and deallocates its blocks.
 .TP
-.I ln source_file dest_file
+.I ln <source_file> <dest_file>
 Create a link.
 .TP
 .I ls [pathname]
@@ -78,55 +94,69 @@
 .BR ls (1)
 command.
 .TP
-.I modify_inode file
+.I modify_inode <file>
 Modify the contents of the inode corresponding to
 .I file
 .TP
-.I mkdir file
+.I mkdir <file>
 Make a directory.
 .TP
-.I open [-w] device
+.I mknod <file> [p|[[c|b] <major> <minor>]]
+Create a special device file
+.TP
+.I ncheck <inode>
+Do inode->name translation.
+.TP
+.I open [-w] <device>
 Open a file system.
 .TP
 .I pwd
+Print the current working directory.
 .TP
 .I quit
 Quit
 .B debugfs
 .TP
-.I rm file
+.I rm <file>
 Remove a file.
 .TP
-.I rmdir file
+.I rmdir <directory>
 Remove a directory.
 .TP
-.I setb block
+.I setb <block>
 Mark the block as allocated.
 .TP
-.I seti file
+.I seti <file>
 Mark in use the inode corresponding to
 .I file
 .TP
 .I show_super_stats
 List the contents of the super block.
 .TP
-.I stat file
+.I stat <file>
 Dump the contents of the inode corresponding to
 .I file
 .TP
-.I testb block
+.I testb <block>
 Test if the block is marked as allocated.
 .TP
-.I testi file
+.I testi <file>
 Test if the inode correponding to
 .I file
 is marked as allocated.
 .TP
-.I unlink file
+.I unlink <file>
 Remove a link.
+.TP
+.I write source_file <file>
+Create a file in the filesystem named
+.IR file ,
+and copy the contents of
+.I source_file
+into the destination file.
 .SH AUTHOR
 .B debugfs
-has been written by Theodore T'so <tytso@mit.edu>.
+was written by Theodore Ts'o <tytso@mit.edu>.
 .SH SEE ALSO
 .BR dumpe2fs (8),
 .BR e2fsck (8),
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index 6c16af8..b0ba7c3 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -14,7 +14,19 @@
 #include <ctype.h>
 #include <string.h>
 #include <time.h>
+#ifdef HAVE_GETOPT_H
 #include <getopt.h>
+#else 
+extern int optind;
+extern char *optarg;
+#endif
+#ifdef HAVE_OPTRESET
+extern int optreset;		/* defined by BSD, but not others */
+#endif
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
@@ -27,7 +39,7 @@
 ext2_filsys fs = NULL;
 ino_t	root, cwd;
 
-void open_filesystem(char *device, int open_flags)
+static void open_filesystem(char *device, int open_flags)
 {
 	int	retval;
 	
@@ -59,11 +71,14 @@
 
 void do_open_filesys(int argc, char **argv)
 {
-	char	*usage = "Usage: open [-w] <device>";
+	const char	*usage = "Usage: open [-w] <device>";
 	char	c;
 	int open_flags = 0;
 	
-	optind = 0;
+	optind = 1;
+#ifdef HAVE_OPTRESET
+	optreset = 1;		/* Makes BSD getopt happy */
+#endif
 	while ((c = getopt (argc, argv, "w")) != EOF) {
 		switch (c) {
 		case 'w':
@@ -83,7 +98,7 @@
 	open_filesystem(argv[optind], open_flags);
 }
 
-void close_filesystem()
+static void close_filesystem(NOARGS)
 {
 	int	retval;
 	
@@ -117,7 +132,7 @@
 
 void do_init_filesys(int argc, char **argv)
 {
-	char	*usage = "Usage: initialize <device> <blocksize>";
+	const char	*usage = "Usage: initialize <device> <blocksize>";
 	struct ext2_super_block param;
 	errcode_t	retval;
 	char		*tmp;
@@ -166,22 +181,22 @@
 	fprintf(out, "Superblock size = %d\n", sizeof(struct ext2_super_block));
 	fprintf(out, "Block size = %d, fragment size = %d\n",
 		EXT2_BLOCK_SIZE(fs->super), EXT2_FRAG_SIZE(fs->super));
-	fprintf(out, "%ld inodes, %ld free\n", fs->super->s_inodes_count,
+	fprintf(out, "%d inodes, %d free\n", fs->super->s_inodes_count,
 	        fs->super->s_free_inodes_count);
-	fprintf(out, "%ld blocks, %ld free, %ld reserved, first block = %ld\n",
+	fprintf(out, "%d blocks, %d free, %d reserved, first block = %d\n",
 	        fs->super->s_blocks_count, fs->super->s_free_blocks_count,
 	        fs->super->s_r_blocks_count, fs->super->s_first_data_block);
-	fprintf(out, "%ld blocks per group\n", fs->super->s_blocks_per_group);
-	fprintf(out, "%ld fragments per group\n", fs->super->s_frags_per_group);
-	fprintf(out, "%ld inodes per group\n", EXT2_INODES_PER_GROUP(fs->super));
+	fprintf(out, "%d blocks per group\n", fs->super->s_blocks_per_group);
+	fprintf(out, "%d fragments per group\n", fs->super->s_frags_per_group);
+	fprintf(out, "%d inodes per group\n", EXT2_INODES_PER_GROUP(fs->super));
 	fprintf(out, "%d inodes per block\n", EXT2_INODES_PER_BLOCK(fs->super));
 	fprintf(out, "%ld group%s (%ld descriptors block%s)\n",
 		fs->group_desc_count, (fs->group_desc_count != 1) ? "s" : "",
 		fs->desc_blocks, (fs->desc_blocks != 1) ? "s" : "");
 	for (i = 0; i < fs->group_desc_count; i++)
-		fprintf(out, " Group %2d: block bitmap at %ld, "
-		        "inode bitmap at %ld, "
-		        "inode table at %ld\n"
+		fprintf(out, " Group %2d: block bitmap at %d, "
+		        "inode bitmap at %d, "
+		        "inode table at %d\n"
 		        "           %d free block%s, "
 		        "%d free inode%s, "
 		        "%d used director%s\n",
@@ -202,17 +217,18 @@
 	int	total;
 };
 
-int list_blocks_proc(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *private)
+static int list_blocks_proc(ext2_filsys fs, blk_t *blocknr, int blockcnt,
+			    void *private)
 {
 	struct list_blocks_struct *lb = (struct list_blocks_struct *) private;
 
-	fprintf(lb->f, "%ld ", *blocknr);
+	fprintf(lb->f, "%d ", *blocknr);
 	lb->total++;
 	return 0;
 }
 
 
-void dump_blocks(FILE *f, ino_t inode)
+static void dump_blocks(FILE *f, ino_t inode)
 {
 	struct list_blocks_struct lb;
 
@@ -226,41 +242,43 @@
 }
 
 
-void dump_inode(ino_t inode_num, struct ext2_inode inode)
+static void dump_inode(ino_t inode_num, struct ext2_inode inode)
 {
-	char *i_type;
+	const char *i_type;
 	FILE	*out;
 	
 	out = open_pager();
-	if (S_ISDIR(inode.i_mode)) i_type = "directory";
-	else if (S_ISREG(inode.i_mode)) i_type = "regular";
-	else if (S_ISLNK(inode.i_mode)) i_type = "symlink";
-	else if (S_ISBLK(inode.i_mode)) i_type = "block special";
-	else if (S_ISCHR(inode.i_mode)) i_type = "character special";
-	else if (S_ISFIFO(inode.i_mode)) i_type = "FIFO";
-	else if (S_ISSOCK(inode.i_mode)) i_type = "socket";
+	if (LINUX_S_ISDIR(inode.i_mode)) i_type = "directory";
+	else if (LINUX_S_ISREG(inode.i_mode)) i_type = "regular";
+	else if (LINUX_S_ISLNK(inode.i_mode)) i_type = "symlink";
+	else if (LINUX_S_ISBLK(inode.i_mode)) i_type = "block special";
+	else if (LINUX_S_ISCHR(inode.i_mode)) i_type = "character special";
+	else if (LINUX_S_ISFIFO(inode.i_mode)) i_type = "FIFO";
+	else if (LINUX_S_ISSOCK(inode.i_mode)) i_type = "socket";
 	else i_type = "bad type";
 	fprintf(out, "Inode: %ld   Type: %s    ", inode_num, i_type);
-	fprintf(out, "Mode:  %04o   Flags: 0x%lx   Version: %ld\n",
+	fprintf(out, "Mode:  %04o   Flags: 0x%x   Version: %d\n",
 		inode.i_mode & 0777, inode.i_flags, inode.i_version);
-	fprintf(out, "User: %5d   Group: %5d   Size: %ld\n",  
+	fprintf(out, "User: %5d   Group: %5d   Size: %d\n",  
 		inode.i_uid, inode.i_gid, inode.i_size);
-	fprintf(out, "File ACL: %ld    Directory ACL: %ld\n",
+	fprintf(out, "File ACL: %d    Directory ACL: %d\n",
 		inode.i_file_acl, inode.i_dir_acl);
-	fprintf(out, "Links: %d   Blockcount: %ld\n", inode.i_links_count,
+	fprintf(out, "Links: %d   Blockcount: %d\n", inode.i_links_count,
 		inode.i_blocks);
-	fprintf(out, "Fragment:  Address: %ld    Number: %d    Size: %d\n",
+#if HAVE_EXT2_FRAGS
+	fprintf(out, "Fragment:  Address: %d    Number: %d    Size: %d\n",
 		inode.i_faddr, inode.i_frag, inode.i_fsize);
-	fprintf(out, "ctime: 0x%08lx -- %s", inode.i_ctime,
+#endif
+	fprintf(out, "ctime: 0x%08x -- %s", inode.i_ctime,
 		ctime(&inode.i_ctime));
-	fprintf(out, "atime: 0x%08lx -- %s", inode.i_atime,
+	fprintf(out, "atime: 0x%08x -- %s", inode.i_atime,
 		ctime(&inode.i_atime));
-	fprintf(out, "mtime: 0x%08lx -- %s", inode.i_mtime,
+	fprintf(out, "mtime: 0x%08x -- %s", inode.i_mtime,
 		ctime(&inode.i_mtime));
 	if (inode.i_dtime) 
-	  fprintf(out, "dtime: 0x%08lx -- %s", inode.i_dtime,
+	  fprintf(out, "dtime: 0x%08x -- %s", inode.i_dtime,
 		  ctime(&inode.i_dtime));
-	if (S_ISLNK(inode.i_mode) && inode.i_blocks == 0)
+	if (LINUX_S_ISLNK(inode.i_mode) && inode.i_blocks == 0)
 		fprintf(out, "Fast_link_dest: %s\n", (char *)inode.i_block);
 	else
 		dump_blocks(out, inode_num);
@@ -490,11 +508,12 @@
 		return;
 	} 
 	if (ext2fs_test_block_bitmap(fs->block_map,block))
-		printf("Block %ld marked in use\n", block);
-	else printf("Block %ld not in use\n", block);
+		printf("Block %d marked in use\n", block);
+	else printf("Block %d not in use\n", block);
 }
 
-void modify_char(char *com, char *prompt, char *format, u_char *val)
+static void modify_u8(char *com, const char *prompt,
+		      const char *format, __u8 *val)
 {
 	char buf[200];
 	u_char v;
@@ -514,7 +533,8 @@
 		*val = v;
 }
 
-void modify_short(char *com, char *prompt, char *format, u_short *val)
+static void modify_u16(char *com, const char *prompt,
+		       const char *format, __u16 *val)
 {
 	char buf[200];
 	u_short v;
@@ -534,7 +554,8 @@
 		*val = v;
 }
 
-void modify_long(char *com, char *prompt, char *format, u_long *val)
+static void modify_u32(char *com, const char *prompt,
+		       const char *format, __u32 *val)
 {
 	char buf[200];
 	u_long v;
@@ -562,9 +583,9 @@
 	int i;
 	errcode_t	retval;
 	char	buf[80];
-	char *hex_format = "0x%x";
-	char *octal_format = "0%o";
-	char *decimal_format = "%d";
+	const char *hex_format = "0x%x";
+	const char *octal_format = "0%o";
+	const char *decimal_format = "%d";
 	
 	if (argc != 2) {
 		com_err(argv[0], 0, "Usage: modify_inode <file>");
@@ -588,32 +609,36 @@
 		return;
 	}
 	
-	modify_short(argv[0], "Mode", octal_format, &inode.i_mode);
-	modify_short(argv[0], "User ID", decimal_format, &inode.i_uid);
-	modify_short(argv[0], "Group ID", decimal_format, &inode.i_gid);
-	modify_long(argv[0], "Size", decimal_format, &inode.i_size);
-	modify_long(argv[0], "Creation time", decimal_format, &inode.i_ctime);
-	modify_long(argv[0], "Modification time", decimal_format, &inode.i_mtime);
-	modify_long(argv[0], "Access time", decimal_format, &inode.i_atime);
-	modify_long(argv[0], "Deletion time", decimal_format, &inode.i_dtime);
-	modify_short(argv[0], "Link count", decimal_format, &inode.i_links_count);
-	modify_long(argv[0], "Block count", decimal_format, &inode.i_blocks);
-	modify_long(argv[0], "File flags", hex_format, &inode.i_flags);
-	modify_long(argv[0], "Reserved1", decimal_format, &inode.i_reserved1);
-	modify_long(argv[0], "File acl", decimal_format, &inode.i_file_acl);
-	modify_long(argv[0], "Directory acl", decimal_format, &inode.i_dir_acl);
-	modify_long(argv[0], "Fragment address", decimal_format, &inode.i_faddr);
-	modify_char(argv[0], "Fragment number", decimal_format, &inode.i_frag);
-	modify_char(argv[0], "Fragment size", decimal_format, &inode.i_fsize);
+	modify_u16(argv[0], "Mode", octal_format, &inode.i_mode);
+	modify_u16(argv[0], "User ID", decimal_format, &inode.i_uid);
+	modify_u16(argv[0], "Group ID", decimal_format, &inode.i_gid);
+	modify_u32(argv[0], "Size", decimal_format, &inode.i_size);
+	modify_u32(argv[0], "Creation time", decimal_format, &inode.i_ctime);
+	modify_u32(argv[0], "Modification time", decimal_format, &inode.i_mtime);
+	modify_u32(argv[0], "Access time", decimal_format, &inode.i_atime);
+	modify_u32(argv[0], "Deletion time", decimal_format, &inode.i_dtime);
+	modify_u16(argv[0], "Link count", decimal_format, &inode.i_links_count);
+	modify_u32(argv[0], "Block count", decimal_format, &inode.i_blocks);
+	modify_u32(argv[0], "File flags", hex_format, &inode.i_flags);
+#if 0
+	modify_u32(argv[0], "Reserved1", decimal_format, &inode.i_reserved1);
+#endif
+	modify_u32(argv[0], "File acl", decimal_format, &inode.i_file_acl);
+	modify_u32(argv[0], "Directory acl", decimal_format, &inode.i_dir_acl);
+	modify_u32(argv[0], "Fragment address", decimal_format, &inode.i_faddr);
+#if HAVE_EXT2_FRAGS
+	modify_u8(argv[0], "Fragment number", decimal_format, &inode.i_frag);
+	modify_u8(argv[0], "Fragment size", decimal_format, &inode.i_fsize);
+#endif
 	for (i=0;  i < EXT2_NDIR_BLOCKS; i++) {
 		sprintf(buf, "Direct Block #%d", i);
-		modify_long(argv[0], buf, decimal_format, &inode.i_block[i]);
+		modify_u32(argv[0], buf, decimal_format, &inode.i_block[i]);
 	}
-	modify_long(argv[0], "Indirect Block", decimal_format,
+	modify_u32(argv[0], "Indirect Block", decimal_format,
 		    &inode.i_block[EXT2_IND_BLOCK]);    
-	modify_long(argv[0], "Double Indirect Block", decimal_format,
+	modify_u32(argv[0], "Double Indirect Block", decimal_format,
 		    &inode.i_block[EXT2_DIND_BLOCK]);
-	modify_long(argv[0], "Triple Indirect Block", decimal_format,
+	modify_u32(argv[0], "Triple Indirect Block", decimal_format,
 		    &inode.i_block[EXT2_TIND_BLOCK]);
 	retval = ext2fs_write_inode(fs, inode_num, &inode);
 	if (retval) {
@@ -632,11 +657,11 @@
 	int	col;
 };
 
-int list_dir_proc(struct ext2_dir_entry *dirent,
-		  int	offset,
-		  int	blocksize,
-		  char	*buf,
-		  void	*private)
+static int list_dir_proc(struct ext2_dir_entry *dirent,
+			 int	offset,
+			 int	blocksize,
+			 char	*buf,
+			 void	*private)
 {
 	char	name[EXT2_NAME_LEN];
 	char	tmp[EXT2_NAME_LEN + 16];
@@ -649,7 +674,7 @@
 	strncpy(name, dirent->name, thislen);
 	name[thislen] = '\0';
 
-	sprintf(tmp, "%ld (%d) %s   ", dirent->inode, dirent->rec_len, name);
+	sprintf(tmp, "%d (%d) %s   ", dirent->inode, dirent->rec_len, name);
 	thislen = strlen(tmp);
 
 	if (ls->col + thislen > 80) {
@@ -748,8 +773,7 @@
 	return;
 }
 
-
-void make_link(char *sourcename, char *destname)
+static void make_link(char *sourcename, char *destname)
 {
 	ino_t	inode;
 	int	retval;
@@ -810,8 +834,7 @@
 	make_link(argv[1], argv[2]);
 }
 
-
-void unlink_file_by_name(char *filename)
+static void unlink_file_by_name(char *filename)
 {
 	int	retval;
 	ino_t	dir;
@@ -851,8 +874,8 @@
 	errcode_t	retval;
 	char		*tmp;
 	
-	if (argc > 2 || *argv[1] == '?') {
-		com_err(argv[0], 0, "Usage: find_free_block <goal>");
+	if ((argc > 2) || (argc==2 && *argv[1] == '?')) {
+		com_err(argv[0], 0, "Usage: find_free_block [goal]");
 		return;
 	}
 	if (check_fs_open(argv[0]))
@@ -872,7 +895,7 @@
 	if (retval)
 		com_err("ext2fs_new_block", retval, "");
 	else
-		printf("Free block found: %ld\n", free_blk);
+		printf("Free block found: %d\n", free_blk);
 
 }
 
@@ -883,8 +906,8 @@
 	int	retval;
 	char	*tmp;
 	
-	if (argc > 3 || *argv[1] == '?') {
-		com_err(argv[0], 0, "Usage: find_free_inode <dir> <mode>");
+	if (argc > 3 || (argc>1 && *argv[1] == '?')) {
+		com_err(argv[0], 0, "Usage: find_free_inode [dir] [mode]");
 		return;
 	}
 	if (check_fs_open(argv[0]))
@@ -905,8 +928,7 @@
 			com_err(argv[0], 0, "Bad mode - %s", argv[2]);
 			return;
 		}
-	}
-	else
+	} else
 		mode = 010755;
 
 	retval = ext2fs_new_inode(fs, dir, mode, 0, &free_inode);
@@ -916,6 +938,263 @@
 		printf("Free inode found: %ld\n", free_inode);
 }
 
+struct copy_file_struct {
+	unsigned long size;
+	int	done, fd, blocks;
+	errcode_t err;
+};
+
+static int copy_file_proc(ext2_filsys fs,
+			   blk_t	*blocknr,
+			   int	blockcnt,
+			   void	*private)
+{
+	struct copy_file_struct *cs = (struct copy_file_struct *) private;
+	blk_t	new_blk;
+	static blk_t	last_blk = 0;
+	char		*block;
+	errcode_t	retval;
+	int		group;
+	int		nr;
+	
+	if (*blocknr) {
+		new_blk = *blocknr;
+	} else {
+		retval = ext2fs_new_block(fs, last_blk, 0, &new_blk);
+		if (retval) {
+			cs->err = retval;
+			return BLOCK_ABORT;
+		}
+	}
+	last_blk = new_blk;
+	block = malloc(fs->blocksize);
+	if (!block) {
+		cs->err = ENOMEM;
+		return BLOCK_ABORT;
+	}
+	if (blockcnt >= 0) {
+		nr = read(cs->fd, block, fs->blocksize);
+	} else {
+		nr = fs->blocksize;
+		memset(block, 0, nr);
+	}
+	if (nr == 0) {
+		cs->done = 1;
+		return BLOCK_ABORT;
+	}
+	if (nr < 0) {
+		cs->err = nr;
+		return BLOCK_ABORT;
+	}
+	retval = io_channel_write_blk(fs->io, new_blk, 1, block);
+	if (retval) {
+		cs->err = retval;
+		return BLOCK_ABORT;
+	}
+	free(block);
+	if (blockcnt >= 0)
+		cs->size += nr;
+	cs->blocks += fs->blocksize / 512;
+	printf("%ld(%d) ", cs->size, blockcnt);
+	fflush(stdout);
+	if (nr < fs->blocksize) {
+		cs->done = 1;
+		printf("\n");
+	}
+	*blocknr = new_blk;
+	ext2fs_mark_block_bitmap(fs->block_map, new_blk);
+	ext2fs_mark_bb_dirty(fs);
+	group = ext2fs_group_of_blk(fs, new_blk);
+	fs->group_desc[group].bg_free_blocks_count--;
+	fs->super->s_free_blocks_count--;
+	ext2fs_mark_super_dirty(fs);
+	if (cs->done)
+		return (BLOCK_CHANGED | BLOCK_ABORT);
+	else
+		return BLOCK_CHANGED;
+}
+
+static errcode_t copy_file(int fd, ino_t newfile)
+{
+	errcode_t	retval;
+	struct	copy_file_struct cs;
+	struct ext2_inode	inode;
+
+	cs.fd = fd;
+	cs.done = 0;
+	cs.err = 0;
+	cs.size = 0;
+	cs.blocks = 0;
+	
+	retval = ext2fs_block_iterate(fs, newfile, BLOCK_FLAG_APPEND,
+				      0, copy_file_proc, &cs);
+
+	if (cs.err)
+		return cs.err;
+	if (!cs.done)
+		return EXT2_ET_EXPAND_DIR_ERR;
+
+	/*
+	 * Update the size and block count fields in the inode.
+	 */
+	retval = ext2fs_read_inode(fs, newfile, &inode);
+	if (retval)
+		return retval;
+	
+	inode.i_blocks += cs.blocks;
+
+	retval = ext2fs_write_inode(fs, newfile, &inode);
+	if (retval)
+		return retval;
+
+	return 0;
+}
+
+void do_write(int argc, char *argv[])
+{
+	int	fd;
+	struct stat statbuf;
+	ino_t	newfile;
+	errcode_t retval;
+	struct ext2_inode inode;
+
+	if (check_fs_open(argv[0]))
+		return;
+	if (argc != 3) {
+		com_err(argv[0], 0, "Usage: write <nativefile> <newfile>");
+		return;
+	}
+	if (!(fs->flags & EXT2_FLAG_RW)) {
+		com_err(argv[0], 0, "read-only filesystem");
+		return;
+	}
+	fd = open(argv[1], O_RDONLY);
+	if (fd < 0) {
+		com_err(argv[1], fd, "");
+		return;
+	}
+	if (fstat(fd, &statbuf) < 0) {
+		com_err(argv[1], errno, "");
+		close(fd);
+		return;
+	}
+
+	retval = ext2fs_new_inode(fs, cwd, 010755, 0, &newfile);
+	if (retval) {
+		com_err(argv[0], retval, "");
+		close(fd);
+		return;
+	}
+	printf("Allocated inode: %ld\n", newfile);
+	retval = ext2fs_link(fs, cwd, argv[2], newfile, 0);
+	if (retval) {
+		com_err(argv[2], retval, "");
+		close(fd);
+		return;
+	}
+        if (ext2fs_test_inode_bitmap(fs->inode_map,newfile))
+		com_err(argv[0], 0, "Warning: inode already set");
+	ext2fs_mark_inode_bitmap(fs->inode_map,newfile);
+	ext2fs_mark_ib_dirty(fs);
+	memset(&inode, 0, sizeof(inode));
+	inode.i_mode = statbuf.st_mode;
+	inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL);
+	inode.i_links_count = 1;
+	inode.i_size = statbuf.st_size;
+	ext2fs_write_inode(fs, newfile, &inode);
+	retval = ext2fs_write_inode(fs, newfile, &inode);
+	if (retval) {
+		com_err(argv[0], retval, "while trying to write inode %d", inode);
+		close(fd);
+		return;
+	}
+	if (LINUX_S_ISREG(inode.i_mode)) {
+		retval = copy_file(fd, newfile);
+		if (retval)
+			com_err("copy_file", retval, "");
+	}
+	close(fd);
+}
+
+void do_mknod(int argc, char *argv[])
+{
+	unsigned long mode, major, minor, nr;
+	ino_t	newfile;
+	errcode_t retval;
+	struct ext2_inode inode;
+
+	if (check_fs_open(argv[0]))
+		return;
+	if (argc < 3 || argv[2][1]) {
+		com_err(argv[0], 0, "Usage: mknod <name> [p| [c|b] <major> <minor>]");
+		return;
+	}
+	mode = minor = major = 0;
+	switch (argv[2][0]) {
+		case 'p':
+			mode = LINUX_S_IFIFO;
+			nr = 3;
+			break;
+		case 'c':
+			mode = LINUX_S_IFCHR;
+			nr = 5;
+			break;
+		case 'b':
+			mode = LINUX_S_IFBLK;
+			nr = 5;
+			break;
+		default:
+			nr = 0;
+	}
+	if (nr == 5) {
+		major = strtoul(argv[3], argv+3, 0);
+		minor = strtoul(argv[4], argv+4, 0);
+		if (major > 255 || minor > 255 || argv[3][0] || argv[4][0])
+			nr = 0;
+	}
+	if (argc != nr) {
+		com_err(argv[0], 0, "Usage: mknod <name> [p| [c|b] <major> <minor>]");
+		return;
+	}
+	if (!(fs->flags & EXT2_FLAG_RW)) {
+		com_err(argv[0], 0, "read-only filesystem");
+		return;
+	}
+	retval = ext2fs_new_inode(fs, cwd, 010755, 0, &newfile);
+	if (retval) {
+		com_err(argv[0], retval, "");
+		return;
+	}
+	printf("Allocated inode: %ld\n", newfile);
+	retval = ext2fs_link(fs, cwd, argv[1], newfile, 0);
+	if (retval) {
+		if (retval == EXT2_ET_DIR_NO_SPACE) {
+			retval = ext2fs_expand_dir(fs, cwd);
+			if (!retval)
+				retval = ext2fs_link(fs, cwd, argv[1], newfile, 0);
+		}
+		if (retval) {
+			com_err(argv[1], retval, "");
+			return;
+		}
+	}
+        if (ext2fs_test_inode_bitmap(fs->inode_map,newfile))
+		com_err(argv[0], 0, "Warning: inode already set");
+	ext2fs_mark_inode_bitmap(fs->inode_map,newfile);
+	ext2fs_mark_ib_dirty(fs);
+	memset(&inode, 0, sizeof(inode));
+	inode.i_mode = mode;
+	inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL);
+	inode.i_block[0] = major*256+minor;
+	inode.i_links_count = 1;
+	ext2fs_write_inode(fs, newfile, &inode);
+	retval = ext2fs_write_inode(fs, newfile, &inode);
+	if (retval) {
+		com_err(argv[0], retval, "while trying to write inode %d", inode);
+		return;
+	}
+}
+
 void do_mkdir(int argc, char *argv[])
 {
 	char	*cp;
@@ -960,9 +1239,10 @@
 }
 
 
-int release_blocks_proc(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *private)
+static int release_blocks_proc(ext2_filsys fs, blk_t *blocknr,
+			       int blockcnt, void *private)
 {
-	printf("%ld ", *blocknr);
+	printf("%d ", *blocknr);
 	ext2fs_unmark_block_bitmap(fs->block_map,*blocknr);
 	return 0;
 }
@@ -1028,7 +1308,7 @@
 		return;
 	}
 
-	if (S_ISDIR(inode.i_mode)) {
+	if (LINUX_S_ISDIR(inode.i_mode)) {
 		com_err(argv[0], 0, "file is a directory");
 		return;
 	}
@@ -1078,11 +1358,11 @@
 
 void main(int argc, char **argv)
 {
-	int	retval;
-	int	sci_idx;
-	char	*usage = "Usage: debugfs [[-w] device]";
-	char	c;
-	int open_flags = 0;
+	int		retval;
+	int		sci_idx;
+	const char	*usage = "Usage: debugfs [[-w] device]";
+	char		c;
+	int		open_flags = 0;
 	
 	initialize_ext2_error_table();
 
diff --git a/debugfs/debugfs.h b/debugfs/debugfs.h
index f7f5f08..7c3c214 100644
--- a/debugfs/debugfs.h
+++ b/debugfs/debugfs.h
@@ -5,6 +5,13 @@
 #include <linux/ext2_fs.h>
 #include "ext2fs/ext2fs.h"
 
+#ifdef __STDC__
+#define NOARGS void
+#else
+#define NOARGS
+#define const
+#endif
+
 extern ext2_filsys fs;
 extern ino_t	root, cwd;
 
@@ -14,5 +21,57 @@
 extern int check_fs_not_open(char *name);
 extern ino_t string_to_inode(char *str);
 
+/* ss command functions */
+
+/* dump.c */
+extern void do_dump(int argc, char **argv);
+extern void do_cat(int argc, char **argv);
+
+/* lsdel.c */
+extern void do_lsdel(int argc, char **argv);
+
+/* icheck.c */
+extern void do_icheck(int argc, char **argv);
+
+/* ncheck.c */
+extern void do_ncheck(int argc, char **argv);
+
+/* debugfs.c */
+
+extern void do_open_filesys(int argc, char **argv);
+extern void do_close_filesys(int argc, char **argv);
+extern void do_init_filesys(int argc, char **argv);
+extern void do_show_super_stats(int argc, char **argv);
+extern void do_kill_file(int argc, char **argv);
+extern void do_rm(int argc, char **argv);
+extern void do_link(int argc, char **argv);
+extern void do_unlink(int argc, char **argv);
+extern void do_find_free_block(int argc, char **argv);
+extern void do_find_free_inode(int argc, char **argv);
+extern void do_stat(int argc, char **argv);
+
+extern void do_chroot(int argc, char **argv);
+extern void do_clri(int argc, char **argv);
+extern void do_freei(int argc, char **argv);
+extern void do_seti(int argc, char **argv);
+extern void do_testi(int argc, char **argv);
+extern void do_freeb(int argc, char **argv);
+extern void do_setb(int argc, char **argv);
+extern void do_testb(int argc, char **argv);
+extern void do_modify_inode(int argc, char **argv);
+extern void do_list_dir(int argc, char **argv);
+extern void do_change_working_dir(int argc, char **argv);
+extern void do_print_working_directory(int argc, char **argv);
+extern void do_write(int argc, char **argv);
+extern void do_mknod(int argc, char **argv);
+extern void do_mkdir(int argc, char **argv);
+extern void do_rmdir(int argc, char **argv);
+extern void do_show_debugfs_params(int argc, char **argv);
+extern void do_expand_dir(int argc, char **argv);
+
+
+
+
+
 
 
diff --git a/debugfs/dump.c b/debugfs/dump.c
index 06c588d..7223bf5 100644
--- a/debugfs/dump.c
+++ b/debugfs/dump.c
@@ -11,7 +11,9 @@
 #include <ctype.h>
 #include <string.h>
 #include <time.h>
-#include <getopt.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -24,8 +26,8 @@
 	errcode_t	errcode;
 };
 
-int dump_block(ext2_filsys fs, blk_t *blocknr, int blockcnt, void
-	       *private)
+static int dump_block(ext2_filsys fs, blk_t *blocknr, int blockcnt,
+		      void *private)
 {
 	ssize_t nbytes;
 	
@@ -58,7 +60,7 @@
 	return 0;
 }
 
-void dump_file(char *cmdname, ino_t inode, int fd, char *outname)
+static void dump_file(char *cmdname, ino_t inode, int fd, char *outname)
 {
 	errcode_t retval;
 	struct dump_block_struct rec;
diff --git a/debugfs/icheck.c b/debugfs/icheck.c
index 848c76a..ef053f5 100644
--- a/debugfs/icheck.c
+++ b/debugfs/icheck.c
@@ -11,9 +11,10 @@
 #include <ctype.h>
 #include <string.h>
 #include <time.h>
-#include <getopt.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 #include <sys/types.h>
-#include <sys/stat.h>
 
 #include "debugfs.h"
 
@@ -29,10 +30,10 @@
 	ino_t			inode;
 };
 
-int icheck_proc(ext2_filsys fs,
-		blk_t	*block_nr,
-		int blockcnt,
-		void *private)
+static int icheck_proc(ext2_filsys fs,
+		       blk_t	*block_nr,
+		       int blockcnt,
+		       void *private)
 {
 	struct block_walk_struct *bw = (struct block_walk_struct *) private;
 	int	i;
diff --git a/debugfs/lsdel.c b/debugfs/lsdel.c
index 3da9a9e..8df894e 100644
--- a/debugfs/lsdel.c
+++ b/debugfs/lsdel.c
@@ -11,7 +11,9 @@
 #include <ctype.h>
 #include <string.h>
 #include <time.h>
-#include <getopt.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 #include <sys/types.h>
 #include <sys/stat.h>
 
@@ -34,20 +36,20 @@
 	int			bad_blocks;
 };
 
-int deleted_info_compare(const void *a, const void *b)
+static int deleted_info_compare(const void *a, const void *b)
 {
-	struct deleted_info *arg1, *arg2;
+	const struct deleted_info *arg1, *arg2;
 
-	arg1 = (struct deleted_info *) a;
-	arg2 = (struct deleted_info *) b;
+	arg1 = (const struct deleted_info *) a;
+	arg2 = (const struct deleted_info *) b;
 
 	return arg1->dtime - arg2->dtime;
 }
 
-int lsdel_proc(ext2_filsys fs,
-	       blk_t	*block_nr,
-	       int blockcnt,
-	       void *private)
+static int lsdel_proc(ext2_filsys fs,
+		      blk_t	*block_nr,
+		      int blockcnt,
+		      void *private)
 {
 	struct lsdel_struct *lsd = (struct lsdel_struct *) private;
 
diff --git a/debugfs/ncheck.c b/debugfs/ncheck.c
index 062e7c5..b5298c2 100644
--- a/debugfs/ncheck.c
+++ b/debugfs/ncheck.c
@@ -11,9 +11,10 @@
 #include <ctype.h>
 #include <string.h>
 #include <time.h>
-#include <getopt.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 #include <sys/types.h>
-#include <sys/stat.h>
 
 #include "debugfs.h"
 
@@ -31,11 +32,11 @@
 	ino_t			parent;
 };
 
-int ncheck_proc(struct ext2_dir_entry *dirent,
-		int	offset,
-		int	blocksize,
-		char	*buf,
-		void	*private)
+static int ncheck_proc(struct ext2_dir_entry *dirent,
+		       int	offset,
+		       int	blocksize,
+		       char	*buf,
+		       void	*private)
 {
 	struct inode_walk_struct *iw = (struct inode_walk_struct *) private;
 	int	i;
@@ -113,7 +114,7 @@
 		if (inode.i_dtime)
 			goto next;
 		/* Ignore anything that isn't a directory */
-		if (!S_ISDIR(inode.i_mode))
+		if (!LINUX_S_ISDIR(inode.i_mode))
 			goto next;
 
 		iw.position = 0;
diff --git a/depfix.sed b/depfix.sed
new file mode 100644
index 0000000..1bcf112
--- /dev/null
+++ b/depfix.sed
@@ -0,0 +1,33 @@
+#
+# Insert the header.....
+#
+1i\
+# +++ Dependency line eater +++\
+# \
+# Makefile dependencies follow.  This must be the last section in\
+# the Makefile.in file\
+#
+
+#
+# Remove line continuations....
+#
+#:FIRST
+#y/	/ /
+#s/^ *//
+#/\\$/{
+#N
+#y/	/ /
+#s/\\\n */ /
+#bFIRST
+#}
+#s/  */ /g
+
+s;/usr/include/[^ ]* *;;g
+s;/usr/lib/[^ ]* *;;g
+s;/mit/cygnus[^ ]* *;;g
+
+#
+# Now insert a trailing newline...
+#
+$a\
+
diff --git a/e2fsck/.depend b/e2fsck/.depend
index e9715c6..0ffb52e 100644
--- a/e2fsck/.depend
+++ b/e2fsck/.depend
@@ -1,8 +1,8 @@
-badblocks.o : badblocks.c /usr/include/time.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h e2fsck.h \
+badblocks.o : ./badblocks.c /usr/include/time.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ./e2fsck.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/types.h /usr/include/linux/types.h \
+  /usr/include/gnu/types.h /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
   /usr/include/asm/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/sys/stat.h \
   /usr/include/linux/stat.h /usr/include/sys/time.h /usr/include/linux/time.h \
@@ -15,12 +15,12 @@
   /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/ext2fs/ext2fs.h ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h \
   ../lib/ext2fs/bitops.h 
-dirinfo.o : dirinfo.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+dirinfo.o : ./dirinfo.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/sys/stat.h /usr/include/linux/stat.h /usr/include/sys/time.h \
   /usr/include/linux/time.h /usr/include/time.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 \
@@ -31,35 +31,36 @@
   /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/ext2fs/ext2fs.h \
   ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h 
-e2fsck.o : e2fsck.c /usr/include/string.h /usr/include/features.h /usr/include/sys/cdefs.h \
+e2fsck.o : ./e2fsck.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/mntent.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \
-  /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h /usr/include/malloc.h ../lib/et/com_err.h \
-  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h e2fsck.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/sys/stat.h /usr/include/linux/stat.h /usr/include/sys/time.h \
-  /usr/include/linux/time.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/ext2fs/ext2fs.h \
-  ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h ../version.h 
-ehandler.o : ehandler.c /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.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/mntent.h /usr/include/stdio.h /usr/include/libio.h \
+  /usr/include/_G_config.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \
+  /usr/include/malloc.h ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./e2fsck.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/sys/stat.h \
+  /usr/include/linux/stat.h /usr/include/sys/time.h /usr/include/linux/time.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/ext2fs/ext2fs.h ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h \
+  ../lib/ext2fs/bitops.h ./../version.h 
+ehandler.o : ./ehandler.c /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.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/unistd.h \
-  /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/sys/types.h /usr/include/linux/types.h \
-  /usr/include/asm/types.h /usr/include/string.h /usr/include/ctype.h /usr/include/termios.h \
-  /usr/include/linux/termios.h /usr/include/sys/resource.h /usr/include/sys/time.h \
-  /usr/include/linux/time.h /usr/include/time.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \
+  /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h /usr/include/sys/types.h \
+  /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/string.h /usr/include/ctype.h \
+  /usr/include/termios.h /usr/include/linux/termios.h /usr/include/sys/resource.h \
+  /usr/include/sys/time.h /usr/include/linux/time.h /usr/include/time.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/resource.h e2fsck.h /usr/include/stdio.h /usr/include/libio.h \
+  /usr/include/linux/resource.h ./e2fsck.h /usr/include/stdio.h /usr/include/libio.h \
   /usr/include/_G_config.h /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/fs.h \
   /usr/include/linux/linkage.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 \
@@ -70,11 +71,11 @@
   /usr/include/linux/sysv_fs_i.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 
-flushb.o : flushb.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+flushb.o : ./flushb.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/sys/ioctl.h \
   /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \
   /usr/include/linux/fs.h /usr/include/linux/linkage.h /usr/include/linux/limits.h \
@@ -84,18 +85,18 @@
   /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 
-mtrace.o : mtrace.c ./malloc.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
+mtrace.o : ./mtrace.c ././malloc.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/libio.h \
   /usr/include/_G_config.h /usr/include/string.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/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 
-pass1.o : pass1.c /usr/include/time.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h e2fsck.h \
+pass1.o : ./pass1.c /usr/include/time.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ./e2fsck.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/types.h /usr/include/linux/types.h \
+  /usr/include/gnu/types.h /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
   /usr/include/asm/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/sys/stat.h \
   /usr/include/linux/stat.h /usr/include/sys/time.h /usr/include/linux/time.h \
@@ -108,11 +109,11 @@
   /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/ext2fs/ext2fs.h ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h \
   ../lib/ext2fs/bitops.h 
-pass1b.o : pass1b.c /usr/include/time.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h e2fsck.h \
+pass1b.o : ./pass1b.c /usr/include/time.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ./e2fsck.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/types.h /usr/include/linux/types.h \
+  /usr/include/gnu/types.h /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
   /usr/include/asm/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/sys/stat.h \
   /usr/include/linux/stat.h /usr/include/sys/time.h /usr/include/linux/time.h \
@@ -125,12 +126,12 @@
   /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/ext2fs/ext2fs.h ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h \
   ../lib/ext2fs/bitops.h 
-pass2.o : pass2.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+pass2.o : ./pass2.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/sys/stat.h /usr/include/linux/stat.h /usr/include/sys/time.h \
   /usr/include/linux/time.h /usr/include/time.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 \
@@ -141,12 +142,12 @@
   /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/ext2fs/ext2fs.h \
   ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h 
-pass3.o : pass3.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+pass3.o : ./pass3.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/sys/stat.h /usr/include/linux/stat.h /usr/include/sys/time.h \
   /usr/include/linux/time.h /usr/include/time.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 \
@@ -157,28 +158,28 @@
   /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/ext2fs/ext2fs.h \
   ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h 
-pass4.o : pass4.c e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+pass4.o : ./pass4.c ./e2fsck.h /usr/include/stdio.h /usr/include/features.h \
+  /usr/include/sys/cdefs.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/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/sys/stat.h \
+  /usr/include/linux/stat.h /usr/include/sys/time.h /usr/include/linux/time.h \
+  /usr/include/time.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/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 
+pass5.o : ./pass5.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/sys/stat.h /usr/include/linux/stat.h /usr/include/sys/time.h \
-  /usr/include/linux/time.h /usr/include/time.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/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 
-pass5.o : pass5.c ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  e2fsck.h /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/sys/stat.h /usr/include/linux/stat.h /usr/include/sys/time.h \
   /usr/include/linux/time.h /usr/include/time.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 \
@@ -189,38 +190,38 @@
   /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/ext2fs/ext2fs.h \
   ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h 
-scantest.o : scantest.c /usr/include/string.h /usr/include/features.h /usr/include/sys/cdefs.h \
+scantest.o : ./scantest.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/mntent.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \
-  /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h /usr/include/malloc.h /usr/include/sys/resource.h \
-  /usr/include/sys/time.h /usr/include/linux/time.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/resource.h ../lib/et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../version.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/sys/stat.h \
-  /usr/include/linux/stat.h /usr/include/linux/fs.h /usr/include/linux/linkage.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/ext2fs/ext2fs.h ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h \
-  ../lib/ext2fs/bitops.h 
-util.o : util.c /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.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/mntent.h /usr/include/stdio.h /usr/include/libio.h \
+  /usr/include/_G_config.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \
+  /usr/include/malloc.h /usr/include/sys/resource.h /usr/include/sys/time.h /usr/include/linux/time.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/resource.h ../lib/et/com_err.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ./../version.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/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/fs.h \
+  /usr/include/linux/linkage.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/ext2fs/ext2fs.h \
+  ../lib/ext2fs/io.h ../lib/ext2fs/ext2_err.h ../lib/ext2fs/bitops.h 
+util.o : ./util.c /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.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/unistd.h \
-  /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/sys/types.h /usr/include/linux/types.h \
-  /usr/include/asm/types.h /usr/include/string.h /usr/include/ctype.h /usr/include/termios.h \
-  /usr/include/linux/termios.h /usr/include/sys/resource.h /usr/include/sys/time.h \
-  /usr/include/linux/time.h /usr/include/time.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \
+  /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h /usr/include/sys/types.h \
+  /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/string.h /usr/include/ctype.h \
+  /usr/include/termios.h /usr/include/linux/termios.h /usr/include/sys/resource.h \
+  /usr/include/sys/time.h /usr/include/linux/time.h /usr/include/time.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/resource.h e2fsck.h /usr/include/stdio.h /usr/include/libio.h \
+  /usr/include/linux/resource.h ./e2fsck.h /usr/include/stdio.h /usr/include/libio.h \
   /usr/include/_G_config.h /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/fs.h \
   /usr/include/linux/linkage.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 \
diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog
index be0ac6c..847d9cd 100644
--- a/e2fsck/ChangeLog
+++ b/e2fsck/ChangeLog
@@ -1,3 +1,256 @@
+Thu Oct 26 12:05:30 1995    <tytso@rsts-11.mit.edu>
+
+	* Makefile.in (install): Strip programs when they are installed.
+		(e2fsck): Build e2fsck statically.
+
+Wed Oct 25 21:18:16 1995    <tytso@rsts-11.mit.edu>
+
+	* util.c (preenhalt): Preenhalt now takes an argument, which is an
+		ext2fs_filsys; this allows it to set the EXT2_ERROR_FS
+		flag in the superblock in cases where preenhalt is called.
+		All calls to preenhalt() were changed to either
+		preenhalt(fs) or preenhalt(NULL) in a few cases where the
+		fs pointer was not available.  (Most notable, for block
+		read/write errors.)
+
+Mon Sep  4 21:41:03 1995  Remy Card  <card@bbj>
+
+	* ehandler.c:
+	  util.c: Include <sys/time.h> before <sys/resource.h>.  BSD needs it.
+
+Mon Sep  4 10:14:49 1995    <tytso@rsts-11.mit.edu>
+
+	* e2fsck.c (show_stats): Show statistics about how many inodes
+		have indirect, doubly indirect, and triply indirect
+		blocks.  Allow up to 8 digits for statistics, instead of
+		merely 6, so things look pretty for large filesystems.
+
+	* pass1.c (pass1): Keep statistics about indirect, doubly
+	        indirect, and triply indirect blocks.
+
+	* pass1.c (unwind_pass1): Clear the above statistics when unwinding
+		pass 1.
+
+Fri Aug 18 15:17:10 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+	* util.c, ehandler.c: Move #include of <sys/resource.h> after
+		#include of "e2fsck.h", since sys/resource.h may depend on
+		sys/time.h, which is #included in e2fsck.h.
+
+Thu Aug 17 22:33:37 1995    <tytso@rsts-11.mit.edu>
+
+	* e2fsck.c (check_mount):  Use the new ext2fs_check_if_mounted()
+		function to determine if the device is mounted.
+
+	* e2fsck.c (main):  Add better error messages if ext2fs_open()
+		fails. 
+
+Wed Aug 16 16:25:02 1995    <tytso@rsts-11.mit.edu>
+
+	* pass1.c (check_blocks): If we're clearing a directory, clear
+		pb.is_dir so we don't do the following check of making
+		sure the directory size matches; this is pointless, since
+		we've already cleared the inode.
+
+Fri Aug 11 09:08:54 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* pass1.c (bad_primary_block): New function, called by
+		process_bad_block, which explains the facts of life to the
+		user when a block in the primary superblock or primary
+		group descriptors is bad.
+
+	* pass2.c (check_dot): Handle the case where the first directory
+		entry is used, but not ".".
+
+	* pass2.c (check_dotdot): Handle the case where the second directory
+		entry is used, but is not "..".
+
+Thu Aug 10 10:05:10 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* e2fsck.c (check_super_block): Get the size of the physical
+		device and if it is smaller than the reported size of the
+		filesystem, report an error.
+
+Sat Aug 12 03:39:18 1995  Remy Card  <card@bbj>
+
+	* e2fsck.c (check_if_skip): Print the number of allocated files and
+		blocks on clean filesystems.
+
+Fri Aug 11 14:15:36 1995  Remy Card  <card@bbj>
+
+	* e2fsck.8: Updated date and version number.
+
+Thu Aug 10 14:26:01 1995  Remy Card  <card@bbj>
+
+	* pass1.c (check_blocks): Check that directory size matches *exactly*
+		the count of allocated blocks.
+
+Wed Aug  9 21:21:24 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+	* pass1b.c (pass1d): Free the shared[] array when we're done with
+		it to avoid a memory leak.
+
+	* pass1.c (unwind_pass1): Use ext2fs_free_block_bitmap to free the
+	        block_dup_map.
+
+	* pass2.c (process_bad_inode): When clearing the inode, make sure
+		the pathname is freed, to prevent a memory leak.
+
+	* pass5.c (check_inode_bitmaps): Free free_array and dir_array
+		when we're finished with them.
+		(check_block_bitmaps): Free free_array when we're finished
+		with them.
+
+	* Makefile.in (e2fsck, flushb): Use $(LD) instead of $(CC) when
+		linking the executable.
+
+	* pass2.c (process_bad_inode): Even on OS's that don't support the
+		fragment fields, make sure the Linux equivalent fields are
+		set to zero.  If an OS wants to reuse these fields, which
+		is probably a bad idea (although we may get desperate in
+		the future) this code will have to be changed.
+
+	* pass1.c (dir_block_cmp): If the block numbers are equal, compare
+		on the inode field, and then blockcnt field.  This is just
+		to keep the ordering of dir_blocks the same on all
+		platforms when there are more than on missing directory
+		blocks, which are indicated directories with holes, which
+		are indicated with the block number being set to zero.
+
+Sun Aug  6 15:40:58 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* pass1.c (check_blocks, process_block): check_blocks() modified
+		to call the ext2fs_block_iterate() with BLOCK_FLAG_HOLE if
+		the inode is a directory.  process_block() now checks to
+		see if a directory has a "hole", or missing block.  If so,
+		this fact is recorded in the directory block list so that
+		the problem can be resolved in pass #2.
+
+	* pass2.c (allocate_dir_block): Added allocate_dir_block() to
+		allocate new blocks for directories with "holes".  Called
+		out of check_dir_block if a block in the directory block
+		list is zero.
+
+	* pass3.c (get_lost_and_found): Move location of free(block) to
+		prevent possible memory leak.
+
+Sat Aug  5 12:42:22 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* pass2.c (check_dir_block): Use a automatic, fixed-saize array
+		instead of alloca() --- alloca is not portable!  Check to
+		make sure the filename is not longer than EXT2_NAME_LEN,
+		and offer to fix it by truncating it, since it should
+		never happen.
+
+	* e2fsck.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.
+
+	* pass2.c (check_dot, check_dotdot): Use malloc() instead of
+		alloca() --- alloca() is not portable!!!
+
+Tue Jul 18 20:04:02 1995    <tytso@rsx-11.mit.edu>
+
+	* pass1b.c (pass1c): 
+	* pass3.c (check_root, get_lost_and_found): 
+	* pass2.c (check_dir_block): Use ext2fs_{read,write}_dir_block
+		to read/write the directory block.
+
+Mon Jul 17 04:00:56 1995    <tytso@rsx-11.mit.edu>
+
+	* util.c (ask_yn): Apply patch supplied by Peter A. Zaitcev to
+		make sure VMIN and VTIME are set correct.
+
+Fri Jul 14 19:26:29 1995    <tytso@rsx-11.mit.edu>
+
+	* pass1.c (mark_block_used): Change to be an inline function.
+		Assume that the block validity checks are already done,
+		and use the fast variant of the bitmap functions.
+
+Thu Jul 13 08:10:55 1995    <tytso@rsx-11.mit.edu>
+
+	* pass5.c (check_block_bitmaps, check_inode_bitmaps): Check the
+		bounds of the bitmaps in advance, and then use the fast
+		variant of e2fs_test_{block,inode}_bitmap.
+
+	* pass1.c (mark_block_used): Use ext2_fast_mark_block_bitmap since
+		the bounds checking has already been done earlier.
+
+Wed Jul 12 02:22:46 1995    <tytso@rsx-11.mit.edu>
+
+	* pass1.c (pass1): Allocate and free the block_illegal_map, which
+		is used for shortcut processing in process_block.
+		(mark_table_blocks): Initialize block_illegal_map with the
+		filesystem blocks.
+		(describe_illegal_block): New helper function that
+		describes why a block is illegal.
+		(process_block): Use block_illegal_map as a shortcut
+		to determine whether a block is bad.  Use
+		describe_illegal_block to print out why the block is illegal.
+
+Mon Jun 12 19:11:06 1995  Theodore Y. Ts'o  (tytso@dcl)
+
+	* flushb.c: Don't include <linux/fs.h> if it doesn't exist.
+
+	* scantest.c: Don't include <linux/fs.h>, <getopt.h>, or
+		<mntent.h> if they don't exist.  (Mostly so that "make
+		depend" works.)
+
+	* pass1.c, pass1b.c, pass3.c, badblocks.c: Include <errno.h> (if
+		it exists).
+
+	* e2fsck.c, scantest.c: Don't include <getopt.h> if it doesn't
+		exist. 
+
+Mon Jun 12 08:37:49 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* pass2.c (process_bad_inode, check_for_zero_long,
+	        check_for_zero_char):  Change long to u32, and char to u8.
+
+Sun Jun 11 15:05:57 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* util.c (inode_has_valid_blocks): 
+	* pass2.c (process_bad_inode): 
+	* pass1.c (pass1, check_blocks, pass1_check_directory): Use
+		LINUX_S_IS* instead of S_IS*.
+
+	* e2fsck.h: Don't #include <sys/stat.h>
+
+	* flushb.c (main): Add #ifdef BLKFLSBUF around ioctl.  (Although
+		this program is pretty much useless if BLKFLSBUF isn't
+		supported.)
+
+	* e2fsck.c, badblocks.c: Add #include <errno.h>, since errno is
+	        used.
+
+Thu Jun  8 12:31:19 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* pass2.c (check_dot, check_dotdot, check_dir_block): Use alloca
+	to allocate space for file names instead of using fixed size buffers.
+	(process_bad_inode): Only check inode frag fields if
+	HAVE_EXT2_FRAGS is defined (by configure).
+	* pass1.c (pass1): Only check the inode frag fields if
+	HAVE_EXT2_FRAGS is defined (by configure).
+
+	* e2fsck.c (check_mount): Only check for a mounted filesystem if
+	HAVE_MNTENT_H is defined (by configure).
+	(PRS): Use alloca to allocate the new path string, instead of
+	having a fixed size buffer (which was the wrong size anyway).
+	(PRS): Only support the -F (flush) option if the BLKFLSBUF ioctl
+	is defined.
+
+	* e2fsck.h: Only include <linux/fs.h> if HAVE_LINUX_FS_H is
+	defined (by configure).
+
+	* Makefile.in: Rewritten to conform to GNU coding standards and
+	support separate compilation directories.
+
+Thu Apr  6 15:04:36 1995  Remy Card  <card@bbj.ibp.fr>
+
+	* pass1.c (pass1): Test the mode in reserved inodes (must be zero).
+
 Sat Mar 11 13:12:16 1995  Theodore Y. Ts'o  <tytso@localhost>
 
 	* pass1.c (unwind_pass1): Clear the file type statistics counter
diff --git a/e2fsck/Makefile b/e2fsck/Makefile
deleted file mode 100644
index a8e0f75..0000000
--- a/e2fsck/Makefile
+++ /dev/null
@@ -1,88 +0,0 @@
-#
-# Makefile for e2fsck
-#
-
-include ../MCONFIG
-
-MK_CMDS=	../lib/ss/mk_cmds
-CFLAGS=		$(PROF) $(OPT) $(MTRACE) $(MCHECK) $(WFLAGS) -I../lib
-LDFLAGS=	$(PROF) $(OPT)
-PROGS=		e2fsck flushb
-MANPAGES=	e2fsck.8
-
-LIBS= -L../lib -lss -lcom_err -lext2fs $(CHECKLIB)
-DEPLIBS= ../lib/libss.a ../lib/libcom_err.a ../lib/libext2fs.a
-
-#
-# Flags for using Checker
-#	Note: The optimization flags must include -g
-#
-#MCHECK=	-checker
-#LIBS= -L../lib -lss -lcom_err -le2fs $(CHECKLIB)
-#DEPLIBS= ../lib/libss.a ../lib/libcom_err.a ../lib/libext2fs.a
-#CHECKLIB= /usr/lib/libchecker.o
-
-#
-# Flags for doing mtrace --- uncomment to produce mtracing e2fsck
-# 	Note:  The optimization flags must include -g
-#
-#MTRACE=	-DMTRACE
-#MTRACE_OBJ= mtrace.o
-#OPT= -g
-
-#
-# Flags for doing mcheck --- uncomment to produce mchecking e2fsck
-# 	Note:  The optimization flags must include -g
-#
-#MCHECK= -DMCHECK
-
-#
-# Flags for profiling --- uncomment to produce profiling e2fsck
-#
-#PROF=		-pg
-#LIBS= -L../lib -lss -lcom_err_p -lext2fs_p 
-#DEPLIBS= ../lib/libss.a ../lib/libcom_err_p.a ../lib/libext2fs_p.a
-
-OBJS= e2fsck.o pass1.o pass1b.o pass2.o pass3.o pass4.o pass5.o \
-	badblocks.o util.o dirinfo.o ehandler.o $(MTRACE_OBJ)
-
-all: $(PROGS)
-
-#e2fsck: $(OBJS)  $(DEPLIBS)
-#	cc $(LDFLAGS) -o e2fsck $(OBJS) $(LIBS) 
-
-e2fsck: $(OBJS)  $(DEPLIBS)
-	$(CC) $(LDFLAGS) -static -o e2fsck $(OBJS) $(LIBS) 
-
-flushb: flushb.o
-	$(CC) $(LDFLAGS) -o flushb flushb.o $(CHECKLIB)
-
-install:: $(PROGS)
-	$(INSTALLBIN) e2fsck $(SBINDIR)/e2fsck
-	$(INSTALLBIN) flushb $(USRSBINDIR)/flushb
-	ln -sf e2fsck $(SBINDIR)/fsck.ext2
-
-install:: $(MANPAGES)
-	for i in $(MANPAGES); do \
-		$(INSTALLMAN) $$i $(SMANDIR)/$$i; \
-	done
-
-install-tree:: $(PROGS)
-	for i in $(PROGS); do \
-		rm -f ../bin/$$i; \
-		cp $$i ../bin; \
-		strip ../bin/$$i; \
-		chmod 555 ../bin/$$i; \
-	done
-	ln -sf e2fsck ../bin/fsck.ext2
-
-clean:
-	rm -f $(PROGS) \#* *\# *.s *.o *.a *~ core
-
-really-clean: clean
-	rm -f .depend
-
-dep depend .depend:
-	$(CPP) $(CFLAGS) -M *.c >.depend
-
-include .depend
diff --git a/e2fsck/Makefile.in b/e2fsck/Makefile.in
new file mode 100644
index 0000000..328fc55
--- /dev/null
+++ b/e2fsck/Makefile.in
@@ -0,0 +1,167 @@
+#
+# Makefile for e2fsck
+#
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+top_builddir = ..
+INSTALL = @INSTALL@
+LDFLAG_STATIC = @LDFLAG_STATIC@
+
+@MCONFIG@
+
+PROGS=		e2fsck extend @EXTRA_PROGS@
+MANPAGES=	e2fsck.8
+
+LIBS= -L../lib -lss -lcom_err -lext2fs $(CHECKLIB)
+DEPLIBS= ../lib/libss.a ../lib/libcom_err.a ../lib/libext2fs.a
+
+.c.o:
+	$(CC) -c $(CFLAGS) $< -o $@
+
+#
+# Flags for using Checker
+#	Note: The optimization flags must include -g
+#
+#MCHECK=	-checker
+#LIBS= -L../lib -lss -lcom_err -le2fs $(CHECKLIB)
+#DEPLIBS= ../lib/libss.a ../lib/libcom_err.a ../lib/libext2fs.a
+#CHECKLIB= /usr/lib/libchecker.o
+
+#
+# Flags for doing mtrace --- uncomment to produce mtracing e2fsck
+# 	Note:  The optimization flags must include -g
+#
+#MTRACE=	-DMTRACE
+#MTRACE_OBJ= mtrace.o
+#MTRACE_SRC= $(srcdir)/mtrace.c
+#OPT= -g
+
+#
+# Flags for doing mcheck --- uncomment to produce mchecking e2fsck
+# 	Note:  The optimization flags must include -g
+#
+#MCHECK= -DMCHECK
+
+#
+# Flags for profiling --- uncomment to produce profiling e2fsck
+#
+#PROF=		-pg
+#LIBS= -L../lib -lss -lcom_err_p -lext2fs_p 
+#DEPLIBS= ../lib/libss.a ../lib/libcom_err_p.a ../lib/libext2fs_p.a
+
+OBJS= e2fsck.o pass1.o pass1b.o pass2.o pass3.o pass4.o pass5.o \
+	badblocks.o util.o dirinfo.o ehandler.o $(MTRACE_OBJ)
+
+SRCS= $(srcdir)/e2fsck.c \
+	$(srcdir)/pass1.c \
+	$(srcdir)/pass1b.c \
+	$(srcdir)/pass2.c \
+	$(srcdir)/pass3.c \
+	$(srcdir)/pass4.c \
+	$(srcdir)/pass5.c \
+	$(srcdir)/badblocks.c \
+	$(srcdir)/util.c \
+	$(srcdir)/dirinfo.c \
+	$(srcdir)/ehandler.c \
+	$(MTRACE_SRC)
+
+all:: $(PROGS)
+
+e2fsck: $(OBJS)  $(DEPLIBS)
+	$(LD) $(LDFLAGS) $(LDFLAG_STATIC) -o e2fsck $(OBJS) $(LIBS) 
+
+extend: extend.o
+	$(LD) $(LDFLAGS) -o extend extend.o $(CHECKLIB)
+
+flushb: flushb.o
+	$(LD) $(LDFLAGS) -o flushb flushb.o $(CHECKLIB)
+
+iscan: iscan.o util.o
+	$(LD) $(LDFLAGS) -o iscan iscan.o util.o ehandler.o $(LIBS)
+
+
+installdirs:
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(sbindir) $(DESTDIR)$(man8dir) \
+		$(DESTDIR)$(cat8dir)
+
+install: $(PROGS) $(MANPAGES) installdirs
+	for i in $(PROGS); do \
+		$(INSTALL_PROGRAM) $$i $(DESTDIR)$(sbindir)/$$i; \
+		$(STRIP) $(DESTDIR)$(sbindir)/$$i; \
+	done
+	$(LN) -f $(DESTDIR)$(sbindir)/e2fsck $(DESTDIR)$(sbindir)/fsck.ext2
+	for i in $(MANPAGES); do \
+		$(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(man8dir)/$$i; \
+	done
+uninstall:
+	$(RM) -f $(sbindir)/e2fsck
+	$(RM) -f $(sbindir)/flushb
+	$(RM) -f $(sbindir)/fsck.ext2
+	for i in $(MANPAGES); do \
+		$(RM) -f $(man8dir)/$$i; \
+	done
+
+clean:
+	$(RM) -f $(PROGS) \#* *\# *.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
+#
+e2fsck.o : $(srcdir)/e2fsck.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+pass1.o : $(srcdir)/pass1.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+pass1b.o : $(srcdir)/pass1b.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+pass2.o : $(srcdir)/pass2.c $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+pass3.o : $(srcdir)/pass3.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+pass4.o : $(srcdir)/pass4.c $(srcdir)/e2fsck.h \
+  $(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 
+pass5.o : $(srcdir)/pass5.c $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+badblocks.o : $(srcdir)/badblocks.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+util.o : $(srcdir)/util.c \
+  $(srcdir)/e2fsck.h \
+  $(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 
+dirinfo.o : $(srcdir)/dirinfo.c $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/e2fsck.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 
+ehandler.o : $(srcdir)/ehandler.c \
+  $(srcdir)/e2fsck.h \
+  $(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 
+
diff --git a/e2fsck/badblocks.c b/e2fsck/badblocks.c
index 62f99c9..f0613d9 100644
--- a/e2fsck/badblocks.c
+++ b/e2fsck/badblocks.c
@@ -6,6 +6,9 @@
  */
 
 #include <time.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <et/com_err.h>
 #include "e2fsck.h"
@@ -16,7 +19,7 @@
 
 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;
 }
 
@@ -97,7 +100,7 @@
 	 */
 	if (*block_nr >= fs->super->s_blocks_count ||
 	    *block_nr < fs->super->s_first_data_block) {
-		printf("Warning illegal block %lu found in bad block inode.  Cleared.\n", *block_nr);
+		printf("Warning illegal block %u found in bad block inode.  Cleared.\n", *block_nr);
 		*block_nr = 0;
 		return BLOCK_CHANGED;
 	}
@@ -127,7 +130,7 @@
 	/*
 	 * Now run the bad blocks program
 	 */
-	sprintf(buf, "badblocks %s%s %ld", preen ? "" : "-s ",
+	sprintf(buf, "badblocks %s%s %d", preen ? "" : "-s ",
 		fs->device_name,
 		fs->super->s_blocks_count);
 	if (verbose)
diff --git a/e2fsck/e2fsck.8 b/e2fsck/e2fsck.8
index ca82963..bc12fc1 100644
--- a/e2fsck/e2fsck.8
+++ b/e2fsck/e2fsck.8
@@ -1,8 +1,8 @@
 .\" -*- nroff -*-
-.\" Copyright 1993, 1994 by Theodore Ts'o.  All Rights Reserved.
+.\" 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 E2FSCK 8 "November 1994" "Version 0.5b"
+.TH E2FSCK 8 "October 1995" "Version 0.5c"
 .SH NAME
 e2fsck \- check a Linux second extended file system
 .SH SYNOPSIS
diff --git a/e2fsck/e2fsck.c b/e2fsck/e2fsck.c
index 78fe3c9..e35e1ba 100644
--- a/e2fsck/e2fsck.c
+++ b/e2fsck/e2fsck.c
@@ -22,9 +22,16 @@
 #include <ctype.h>
 #include <termios.h>
 #include <time.h>
+#ifdef HAVE_GETOPT_H
 #include <getopt.h>
+#endif
 #include <unistd.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#ifdef HAVE_MNTENT_H
 #include <mntent.h>
+#endif
 #include <sys/ioctl.h>
 #include <malloc.h>
 
@@ -36,6 +43,7 @@
 
 const char * program_name = "e2fsck";
 const char * device_name = NULL;
+const char * filesystem_name = NULL;
 
 /* Command line options */
 int nflag = 0;
@@ -99,24 +107,26 @@
 		       inodes_used, inodes, blocks_used, blocks);
 		return;
 	}
-	printf ("\n%6d inode%s used (%d%%)\n", inodes_used,
+	printf ("\n%8d inode%s used (%d%%)\n", inodes_used,
 		(inodes_used != 1) ? "s" : "",
 		100 * inodes_used / inodes);
-	printf ("%6d block%s used (%d%%)\n"
-		"%6d bad block%s\n", blocks_used,
+	printf ("         # of inodes with ind/dind/tind blocks: %d/%d/%d\n",
+		fs_ind_count, fs_dind_count, fs_tind_count);
+	printf ("%8d block%s used (%d%%)\n"
+		"%8d bad block%s\n", blocks_used,
 		(blocks_used != 1) ? "s" : "",
 		100 * blocks_used / blocks, fs_badblocks_count,
 		fs_badblocks_count != 1 ? "s" : "");
-	printf ("\n%6d regular file%s\n"
-		"%6d director%s\n"
-		"%6d character device file%s\n"
-		"%6d block device file%s\n"
-		"%6d fifo%s\n"
-		"%6d link%s\n"
-		"%6d symbolic link%s (%d fast symbolic link%s)\n"
-		"%6d socket%s\n"
-		"------\n"
-		"%6d file%s\n",
+	printf ("\n%8d regular file%s\n"
+		"%8d director%s\n"
+		"%8d character device file%s\n"
+		"%8d block device file%s\n"
+		"%8d fifo%s\n"
+		"%8d link%s\n"
+		"%8d symbolic link%s (%d fast symbolic link%s)\n"
+		"%8d socket%s\n"
+		"--------\n"
+		"%8d file%s\n",
 		fs_regular_count, (fs_regular_count != 1) ? "s" : "",
 		fs_directory_count, (fs_directory_count != 1) ? "ies" : "y",
 		fs_chardev_count, (fs_chardev_count != 1) ? "s" : "",
@@ -133,36 +143,26 @@
 
 static void check_mount(NOARGS)
 {
-	FILE * f;
-	struct mntent * mnt;
-	int cont;
-	int fd;
+	errcode_t	retval;
+	int		mount_flags, cont;
 
-	if ((f = setmntent (MOUNTED, "r")) == NULL)
+	retval = ext2fs_check_if_mounted(filesystem_name, &mount_flags);
+	if (retval) {
+		com_err("ext2fs_check_if_mount", retval,
+			"while determining whether %s is mounted.",
+			filesystem_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;
-
-	if  (!strcmp(mnt->mnt_dir, "/"))
-		root_filesystem = 1;
-
 	/*
 	 * If the root is mounted read-only, then /etc/mtab is
 	 * probably not correct; so we won't issue a warning based on
 	 * it.
 	 */
-	fd = open(MOUNTED, O_RDWR);
-	if (fd < 0) {
-		if (errno == EROFS) {
-			read_only_root = 1;
-			return;
-		}
-	} else
-		close(fd);
+	if ((mount_flags & EXT2_MF_ISROOT) &&
+	    (mount_flags & EXT2_MF_READONLY))
+		return;
 	
 	if (!rwflag) {
 		printf("Warning!  %s is mounted.\n", device_name);
@@ -217,6 +217,7 @@
 	blk_t	blocks_per_group = fs->super->s_blocks_per_group;
 	int	i;
 	blk_t	should_be;
+	errcode_t retval;
 
 	/*
 	 * Verify the super block constants...
@@ -241,6 +242,23 @@
 	check_super_value("r_blocks_count", s->s_r_blocks_count,
 			  MAX_CHECK, 0, s->s_blocks_count);
 
+	retval = ext2fs_get_device_size(filesystem_name, EXT2_BLOCK_SIZE(s),
+					&should_be);
+	if (retval) {
+		com_err("ext2fs_get_device_size", retval,
+			"while trying to check physical size of filesystem");
+		fatal_error(0);
+	}
+	if (should_be < s->s_blocks_count) {
+		printf("The filesystem size (according to the superblock) is %d blocks\n", s->s_blocks_count);
+		printf("The physical size of the device is %d blocks\n",
+		       should_be);
+		printf("Either the superblock or the partition table is likely to be corrupt!\n");
+		preenhalt(fs);
+		if (ask("Abort", 1))
+			fatal_error(0);
+	}
+
 	if (s->s_log_block_size != s->s_log_frag_size) {
 		printf("Superblock block_size = %d, fragsize = %d.\n",
 		       EXT2_BLOCK_SIZE(s), EXT2_FRAG_SIZE(s));
@@ -253,16 +271,16 @@
 	should_be = s->s_frags_per_group /
 		(s->s_log_block_size - s->s_log_frag_size + 1);
 	if (s->s_blocks_per_group != should_be) {
-		printf("Superblock blocks_per_group = %lu, should "
-		       "have been %lu\n", s->s_blocks_per_group,
+		printf("Superblock blocks_per_group = %u, should "
+		       "have been %u\n", s->s_blocks_per_group,
 		       should_be);
 		printf(corrupt_msg);
 	}
 
 	should_be = (s->s_log_block_size == 0) ? 1 : 0;
 	if (s->s_first_data_block != should_be) {
-		printf("Superblock first_data_block = %lu, should "
-		       "have been %lu\n", s->s_first_data_block,
+		printf("Superblock first_data_block = %u, should "
+		       "have been %u\n", s->s_first_data_block,
 		       should_be);
 		printf(corrupt_msg);
 	}
@@ -278,12 +296,12 @@
 			last_block = fs->super->s_blocks_count;
 		if ((fs->group_desc[i].bg_block_bitmap < first_block) ||
 		    (fs->group_desc[i].bg_block_bitmap >= last_block)) {
-			printf("Block bitmap %lu for group %d is "
-			       "not in group.\n",
-			       fs->group_desc[i].bg_block_bitmap, i);
-			preenhalt();
-			if (!ask("Continue (and relocate)", 1)) {
-				fatal_error(0);
+			printf("Block bitmap for group %d is not in group.  "
+			       "(block %u)\n",
+			       i, fs->group_desc[i].bg_block_bitmap);
+			preenhalt(fs);
+			if (!ask("Relocate", 1)) {
+				fatal_error("Block bitmap not in group");
 			}
 			fs->group_desc[i].bg_block_bitmap = 0;
 			invalid_block_bitmap[i]++;
@@ -291,12 +309,12 @@
 		}
 		if ((fs->group_desc[i].bg_inode_bitmap < first_block) ||
 		    (fs->group_desc[i].bg_inode_bitmap >= last_block)) {
-			printf("Warning: Inode bitmap %lu for group %d "
-			       "not in group.\n",
-			       fs->group_desc[i].bg_inode_bitmap, i);
-			preenhalt();
-			if (!ask("Continue", 1)) {
-				fatal_error(0);
+			printf("Inode bitmap group %d not in group.  "
+			       "(block %u)\n",
+			       i, fs->group_desc[i].bg_inode_bitmap);
+			preenhalt(fs);
+			if (!ask("Relocate", 1)) {
+				fatal_error("Inode bitmap not in group");
 			}
 			fs->group_desc[i].bg_inode_bitmap = 0;
 			invalid_inode_bitmap[i]++;
@@ -305,13 +323,13 @@
 		if ((fs->group_desc[i].bg_inode_table < first_block) ||
 		    ((fs->group_desc[i].bg_inode_table +
 		      fs->inode_blocks_per_group - 1) >= last_block)) {
-			printf("Warning: Inode table %lu for group %d "
-			       "not in group.\n",
-			       fs->group_desc[i].bg_inode_table, i);
+			printf("Inode table for group %d not in group.  "
+			       "(block %u)\n",
+			       i, fs->group_desc[i].bg_inode_table);
 			printf("WARNING: SEVERE DATA LOSS POSSIBLE.\n");
-			preenhalt();
-			if (!ask("Continue", 1)) {
-				fatal_error(0);
+			preenhalt(fs);
+			if (!ask("Relocate", 1)) {
+				fatal_error("Inode table not in group");
 			}
 			fs->group_desc[i].bg_inode_table = 0;
 			invalid_inode_table[i]++;
@@ -349,11 +367,17 @@
 		return;
 	}
 	if (fs->super->s_state & EXT2_VALID_FS) {
-		printf("%s is clean, no check.\n", device_name);
+		printf("%s: clean, %d/%d files, %d/%d blocks\n", device_name,
+		       fs->super->s_inodes_count - fs->super->s_free_inodes_count,
+		       fs->super->s_inodes_count,
+		       fs->super->s_blocks_count - fs->super->s_free_blocks_count,
+		       fs->super->s_blocks_count);
 		exit(FSCK_OK);
 	}
 }	
 
+#define PATH_SET "PATH=/sbin"
+
 static void PRS(int argc, char *argv[])
 {
 	int		flush = 0;
@@ -361,14 +385,21 @@
 #ifdef MTRACE
 	extern void	*mallwatch;
 #endif
-	char		*oldpath;
-	static char	newpath[PATH_MAX];
+	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));
+		if (!newpath)
+			fatal_error("Couldn't malloc() newpath");
+		strcpy (newpath, PATH_SET);
+		strcat (newpath, ":");
+		strcat (newpath, oldpath);
+		putenv (newpath);
+	} else
+		putenv (PATH_SET);
 
 	setbuf(stdout, NULL);
 	setbuf(stderr, NULL);
@@ -376,7 +407,7 @@
 	
 	if (argc && *argv)
 		program_name = *argv;
-	while ((c = getopt (argc, argv, "panyrcB:dfvtFVM:b:I:P:l:L:")) != EOF)
+	while ((c = getopt (argc, argv, "panyrcB:dfvtFVM:b:I:P:l:L:N:")) != EOF)
 		switch (c) {
 		case 'p':
 		case 'a':
@@ -427,7 +458,11 @@
 			force = 1;
 			break;
 		case 'F':
+#ifdef BLKFLSBUF
 			flush = 1;
+#else
+			fatal_error ("-F not supported");
+#endif
 			break;
 		case 'v':
 			verbose = 1;
@@ -440,6 +475,9 @@
 			mallwatch = (void *) strtol(optarg, NULL, 0);
 			break;
 #endif
+		case 'N':
+			device_name = optarg;
+			break;
 		default:
 			usage ();
 		}
@@ -449,21 +487,27 @@
 		usage ();
 	if (nflag && !bad_blocks_file && !cflag)
 		rwflag = 0;
-	device_name = argv[optind];
+	filesystem_name = argv[optind];
+	if (device_name == 0)
+		device_name = filesystem_name;
 	if (flush) {
-		int	fd = open(device_name, O_RDONLY, 0);
+#ifdef BLKFLSBUF
+		int	fd = open(filesystem_name, O_RDONLY, 0);
 
 		if (fd < 0) {
 			com_err("open", errno, "while opening %s for flushing",
-				device_name);
+				filesystem_name);
 			exit(FSCK_ERROR);
 		}
 		if (ioctl(fd, BLKFLSBUF, 0) < 0) {
 			com_err("BLKFLSBUF", errno, "while trying to flush %s",
-				device_name);
+				filesystem_name);
 			exit(FSCK_ERROR);
 		}
 		close(fd);
+#else
+		fatal_error ("BLKFLSBUF not supported");
+#endif /* BLKFLSBUF */
 	}
 }
 					
@@ -502,12 +546,13 @@
 restart:
 	sync_disks();
 	if (superblock && blocksize) {
-		retval = ext2fs_open(device_name, rwflag ? EXT2_FLAG_RW : 0,
+		retval = ext2fs_open(filesystem_name,
+				     rwflag ? EXT2_FLAG_RW : 0,
 				     superblock, blocksize, unix_io_manager,
 				     &fs);
 	} else if (superblock) {
 		for (i=0; possible_block_sizes[i]; i++) {
-			retval = ext2fs_open(device_name,
+			retval = ext2fs_open(filesystem_name,
 					     rwflag ? EXT2_FLAG_RW : 0,
 					     superblock,
 					     possible_block_sizes[i],
@@ -516,22 +561,38 @@
 				break;
 		}
 	} else 
-		retval = ext2fs_open(device_name, rwflag ? EXT2_FLAG_RW : 0,
+		retval = ext2fs_open(filesystem_name,
+				     rwflag ? EXT2_FLAG_RW : 0,
 				     0, 0, unix_io_manager, &fs);
 	if (retval) {
 		com_err(program_name, retval, "while trying to open %s",
-			device_name);
-		if (retval == EXT2_ET_REV_TOO_HIGH)
+			filesystem_name);
+		switch (retval) {
+		case EXT2_ET_REV_TOO_HIGH:
 			printf ("Get a newer version of e2fsck!\n");
-		else
+			break;
+		case EXT2_ET_SHORT_READ:
+			printf ("Could this be a zero-length partition?\n");
+			break;
+		case EPERM:
+		case EACCES:
+			printf("You must have %s access to the "
+			       "filesystem or be root\n",
+			       rwflag ? "r/w" : "r/o");
+			break;
+		case ENXIO:
+			printf("Possibly non-existent or swap device?\n");
+			break;
+		default:
 			printf(corrupt_msg);
+		}
 		fatal_error(0);
 	}
 
 #ifdef	EXT2_CURRENT_REV
 	if (fs->super->s_rev_level > E2FSCK_CURRENT_REV) {
 		com_err(program_name, retval, "while trying to open %s",
-			device_name);
+			filesystem_name);
 		printf ("Get a newer version of e2fsck!\n");
 		fatal_error(0);
 	}
@@ -569,6 +630,9 @@
 	ext2fs_mark_valid(fs);
 	
 	pass1(fs);
+	free(invalid_inode_bitmap);
+	free(invalid_block_bitmap);
+	free(invalid_inode_table);
 	if (restart_e2fsck) {
 		ext2fs_close(fs);
 		printf("Restarting e2fsck from the beginning...\n");
diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h
index e978844..debd56a 100644
--- a/e2fsck/e2fsck.h
+++ b/e2fsck/e2fsck.h
@@ -10,11 +10,12 @@
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
-#include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/time.h>
 
+#ifdef HAVE_LINUX_FS_H
 #include <linux/fs.h>
+#endif
 #include <linux/ext2_fs.h>
 
 #include "ext2fs/ext2fs.h"
@@ -134,6 +135,9 @@
 extern int fs_total_count;
 extern int fs_badblocks_count;
 extern int fs_sockets_count;
+extern int fs_ind_count;
+extern int fs_dind_count;
+extern int fs_tind_count;
 
 extern struct resource_track	global_rtrack;
 
@@ -173,7 +177,7 @@
 extern void fatal_error (const char * fmt_string);
 extern void read_bitmaps(ext2_filsys fs);
 extern void write_bitmaps(ext2_filsys fs);
-extern void preenhalt(NOARGS);
+extern void preenhalt(ext2_filsys fs);
 extern void print_resource_track(struct resource_track *track);
 extern void init_resource_track(struct resource_track *track);
 extern int inode_has_valid_blocks(struct ext2_inode *inode);
diff --git a/e2fsck/ehandler.c b/e2fsck/ehandler.c
index 4873a95..131a0ab 100644
--- a/e2fsck/ehandler.c
+++ b/e2fsck/ehandler.c
@@ -11,10 +11,12 @@
 #include <string.h>
 #include <ctype.h>
 #include <termios.h>
-#include <sys/resource.h>
 
 #include "e2fsck.h"
 
+#include <sys/time.h>
+#include <sys/resource.h>
+
 static const char *operation;
 
 static errcode_t e2fsck_handle_read_error(io_channel channel,
@@ -49,7 +51,7 @@
 	else
 		printf("Error reading block %lu (%s).  ", block,
 		       error_message(error));
-	preenhalt();
+	preenhalt(NULL);
 	if (ask("Ignore error", 1))
 		return 0;
 
@@ -89,7 +91,7 @@
 	else
 		printf("Error writing block %lu (%s).  ", block,
 		       error_message(error));
-	preenhalt();
+	preenhalt(NULL);
 	if (ask("Ignore error", 1))
 		return 0;
 
diff --git a/e2fsck/extend.c b/e2fsck/extend.c
new file mode 100644
index 0000000..646348d
--- /dev/null
+++ b/e2fsck/extend.c
@@ -0,0 +1,80 @@
+/*
+ * extend.c --- extend a file so that it has at least a specified
+ * 	number of blocks.
+ * 
+ * Copyright (C) 1993, 1994, 1995 Theodore Ts'o.
+ *
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+static void usage(char *progname)
+{
+	fprintf(stderr, "%s: %s filename nblocks blocksize\n",
+		progname, progname);
+	exit(1);
+}
+
+
+int main(int argc, char **argv)
+{
+	char	*filename;
+	int	nblocks, blocksize;
+	int	fd;
+	char	*block;
+	int	ret;
+
+	if (argc != 4)
+		usage(argv[0]);
+
+	filename = argv[1];
+	nblocks = strtoul(argv[2], 0, 0) - 1;
+	blocksize = strtoul(argv[3], 0, 0);
+
+	if (nblocks < 0) {
+		fprintf(stderr, "Illegal number of blocks!\n");
+		exit(1);
+	}
+
+	block = malloc(blocksize);
+	if (block == 0) {
+		fprintf(stderr, "Couldn't allocate block buffer(size=%d)\n",
+			blocksize);
+		exit(1);
+	}
+	memset(block, 0, blocksize);
+
+	fd = open(filename, O_RDWR);
+	if (fd < 0) {
+		perror(filename);
+		exit(1);
+	}
+	ret = lseek(fd, nblocks*blocksize, SEEK_SET);
+	if (ret < 0) {
+		perror("lseek");
+		exit(1);
+	}
+	ret = read(fd, block, blocksize);
+	if (ret < 0) {
+		perror("read");
+		exit(1);
+	}
+	ret = lseek(fd, nblocks*blocksize, SEEK_SET);
+	if (ret < 0) {
+		perror("lseek #2");
+		exit(1);
+	}
+	ret = write(fd, block, blocksize);
+	if (ret < 0) {
+		perror("read");
+		exit(1);
+	}
+	exit(0);
+}
diff --git a/e2fsck/flushb.c b/e2fsck/flushb.c
index eba4e85..20b9917 100644
--- a/e2fsck/flushb.c
+++ b/e2fsck/flushb.c
@@ -9,7 +9,9 @@
 #include <fcntl.h>
 #include <sys/ioctl.h>
 
+#ifdef HAVE_LINUX_FS_H
 #include <linux/fs.h>
+#endif
 
 #ifdef __STDC__
 #define NOARGS void
@@ -43,9 +45,15 @@
 	 * Note: to reread the partition table, use the ioctl
 	 * BLKRRPART instead of BLKFSLBUF.
 	 */
+#ifdef BLKFLSBUF
 	if (ioctl(fd, BLKFLSBUF, 0) < 0) {
-		perror("ioctl");
+		perror("ioctl BLKFLSBUF");
 		exit(1);
 	}
 	return 0;
+#else
+	fprintf(stderr,
+		"BLKFLSBUF ioctl not supported!  Can't flush buffers.\n");
+	return 1;
+#endif
 }
diff --git a/e2fsck/images/README b/e2fsck/images/README
deleted file mode 100644
index 73e2681..0000000
--- a/e2fsck/images/README
+++ /dev/null
@@ -1,67 +0,0 @@
-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/e2fsck/images/badbblocks.img.gz b/e2fsck/images/badbblocks.img.gz
deleted file mode 100644
index 3fd89cb..0000000
--- a/e2fsck/images/badbblocks.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/baddir.img.gz b/e2fsck/images/baddir.img.gz
deleted file mode 100644
index c7af6c5..0000000
--- a/e2fsck/images/baddir.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/badinode.img.gz b/e2fsck/images/badinode.img.gz
deleted file mode 100644
index 7d10bc1..0000000
--- a/e2fsck/images/badinode.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/badlkcnt.img.gz b/e2fsck/images/badlkcnt.img.gz
deleted file mode 100644
index 96509f5..0000000
--- a/e2fsck/images/badlkcnt.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/badroot.img.gz b/e2fsck/images/badroot.img.gz
deleted file mode 100644
index 5724105..0000000
--- a/e2fsck/images/badroot.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/badtable.img.gz b/e2fsck/images/badtable.img.gz
deleted file mode 100644
index 72934ce..0000000
--- a/e2fsck/images/badtable.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/bbfile.img.gz b/e2fsck/images/bbfile.img.gz
deleted file mode 100644
index 1924a3f..0000000
--- a/e2fsck/images/bbfile.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/bitmapblks.img.gz b/e2fsck/images/bitmapblks.img.gz
deleted file mode 100644
index d5aa60f..0000000
--- a/e2fsck/images/bitmapblks.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/bitmaps.img.gz b/e2fsck/images/bitmaps.img.gz
deleted file mode 100644
index 7eff4fc..0000000
--- a/e2fsck/images/bitmaps.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/dirlink.img.gz b/e2fsck/images/dirlink.img.gz
deleted file mode 100644
index 7e1694a..0000000
--- a/e2fsck/images/dirlink.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/dup.img.gz b/e2fsck/images/dup.img.gz
deleted file mode 100644
index f901f19..0000000
--- a/e2fsck/images/dup.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/dup2.img.gz b/e2fsck/images/dup2.img.gz
deleted file mode 100644
index f5fcd37..0000000
--- a/e2fsck/images/dup2.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/dupfsblks.img.gz b/e2fsck/images/dupfsblks.img.gz
deleted file mode 100644
index d3fd2a1..0000000
--- a/e2fsck/images/dupfsblks.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/dupsuper.img.gz b/e2fsck/images/dupsuper.img.gz
deleted file mode 100644
index f5c2f3e..0000000
--- a/e2fsck/images/dupsuper.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/end-bitmap.img.gz b/e2fsck/images/end-bitmap.img.gz
deleted file mode 100644
index b83478f..0000000
--- a/e2fsck/images/end-bitmap.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/expand.img.gz b/e2fsck/images/expand.img.gz
deleted file mode 100644
index 0ea6729..0000000
--- a/e2fsck/images/expand.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/illfsblks.img.gz b/e2fsck/images/illfsblks.img.gz
deleted file mode 100644
index f218c57..0000000
--- a/e2fsck/images/illfsblks.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/lotsbad.img.gz b/e2fsck/images/lotsbad.img.gz
deleted file mode 100644
index 8e49295..0000000
--- a/e2fsck/images/lotsbad.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/lpf.img.gz b/e2fsck/images/lpf.img.gz
deleted file mode 100644
index 527c09b..0000000
--- a/e2fsck/images/lpf.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/messy_inode.img.gz b/e2fsck/images/messy_inode.img.gz
deleted file mode 100644
index a7eab4a..0000000
--- a/e2fsck/images/messy_inode.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/mke2fs2b.img.gz b/e2fsck/images/mke2fs2b.img.gz
deleted file mode 100644
index 9716a13..0000000
--- a/e2fsck/images/mke2fs2b.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/noroot.img.gz b/e2fsck/images/noroot.img.gz
deleted file mode 100644
index 3e597f3..0000000
--- a/e2fsck/images/noroot.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/okgroup.img.gz b/e2fsck/images/okgroup.img.gz
deleted file mode 100644
index e353032..0000000
--- a/e2fsck/images/okgroup.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/overfsblks.img.gz b/e2fsck/images/overfsblks.img.gz
deleted file mode 100644
index 15f391f..0000000
--- a/e2fsck/images/overfsblks.img.gz
+++ /dev/null
Binary files differ
diff --git a/e2fsck/images/test_script b/e2fsck/images/test_script
deleted file mode 100644
index c0842ef..0000000
--- a/e2fsck/images/test_script
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-#
-# Test script for e2fsck
-#
-
-FSCK=../e2fsck
-SECOND_FSCK=$FSCK
-FSCK_OPT=-yft
-SECOND_FSCK_OPT=$FSCK_OPT
-
-#
-# Uncomment to test against original e2fsck
-#
-#FSCK=/u4/src/e2fsprogs-0.3c/e2fsck
-#FSCK_OPT=-af
-
-OUTFILE=test_script.log
-
-cp /dev/null $OUTFILE
-
-for i in *.img.gz
-do
-	echo -n "Testing $i...	"
-	echo "Testing $i..." >> $OUTFILE
-	gunzip < $i > /tmp/$i.$$
-	echo $FSCK $FSCK_OPT /tmp/$i.$$  >> $OUTFILE
-	$FSCK $FSCK_OPT /tmp/$i.$$  >> $OUTFILE 2>&1 
-	status=$?
-	echo Exit status is $status >> $OUTFILE
-	echo " "  >> $OUTFILE
-	echo -n "Exit status $status	"
-	echo Running e2fsck again.... >> $OUTFILE
-	echo $SECOND_FSCK $SECOND_FSCK_OPT /tmp/$i.$$ >> $OUTFILE
-	$SECOND_FSCK $SECOND_FSCK_OPT /tmp/$i.$$ >> $OUTFILE 2>&1 
-	status=$?
-	echo Exit status is $status >> $OUTFILE
-	echo Exit status $status
-	rm /tmp/$i.$$
-	echo "---------------------------------------------------" >> $OUTFILE
-done
-	
-	
diff --git a/e2fsck/iscan.c b/e2fsck/iscan.c
new file mode 100644
index 0000000..d964b34
--- /dev/null
+++ b/e2fsck/iscan.c
@@ -0,0 +1,146 @@
+/*
+ * Test to see how quickly we can scan the inode table (not doing
+ * anything else)
+ */
+
+#include <string.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <termios.h>
+#include <time.h>
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+#include <unistd.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#ifdef HAVE_MNTENT_H
+#include <mntent.h>
+#endif
+#include <sys/ioctl.h>
+#include <malloc.h>
+
+#include "et/com_err.h"
+#include "e2fsck.h"
+#include "../version.h"
+
+extern int isatty(int);
+
+const char * program_name = "iscan";
+const char * device_name = NULL;
+
+int yflag = 0;
+int nflag = 0;
+int preen = 0;
+int inode_buffer_blocks = 0;
+int invalid_bitmaps = 0;
+
+struct resource_track	global_rtrack;
+
+static void usage(NOARGS)
+{
+	fprintf(stderr,
+		"Usage: %s [-F] [-I inode_buffer_blocks] device\n",
+		program_name);
+	exit(1);
+}
+
+static void PRS(int argc, char *argv[])
+{
+	int		flush = 0;
+	char		c;
+#ifdef MTRACE
+	extern void	*mallwatch;
+#endif
+
+	setbuf(stdout, NULL);
+	setbuf(stderr, NULL);
+	initialize_ext2_error_table();
+	
+	if (argc && *argv)
+		program_name = *argv;
+	while ((c = getopt (argc, argv, "FI")) != EOF)
+		switch (c) {
+		case 'F':
+#ifdef BLKFLSBUF
+			flush = 1;
+#else
+			fatal_error ("-F not supported");
+#endif
+			break;
+		case 'I':
+			inode_buffer_blocks = atoi(optarg);
+			break;
+		default:
+			usage ();
+		}
+	device_name = argv[optind];
+	if (flush) {
+#ifdef BLKFLSBUF
+		int	fd = open(device_name, O_RDONLY, 0);
+
+		if (fd < 0) {
+			com_err("open", errno, "while opening %s for flushing",
+				device_name);
+			exit(FSCK_ERROR);
+		}
+		if (ioctl(fd, BLKFLSBUF, 0) < 0) {
+			com_err("BLKFLSBUF", errno, "while trying to flush %s",
+				device_name);
+			exit(FSCK_ERROR);
+		}
+		close(fd);
+#else
+		fatal_error ("BLKFLSBUF not supported");
+#endif /* BLKFLSBUF */
+	}
+}
+					
+int main (int argc, char *argv[])
+{
+	errcode_t	retval = 0;
+	int		exit_value = FSCK_OK;
+	ext2_filsys	fs;
+	ino_t	ino;
+	int	num_inodes = 0;
+	struct ext2_inode inode;
+	ext2_inode_scan	scan;
+	
+	init_resource_track(&global_rtrack);
+
+	PRS(argc, argv);
+
+	retval = ext2fs_open(device_name, 0,
+			     0, 0, unix_io_manager, &fs);
+	if (retval) {
+		com_err(program_name, retval, "while trying to open %s",
+			device_name);
+		exit(1);
+	}
+
+	ehandler_init(fs->io);
+	
+	retval = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan);
+	if (retval) {
+		com_err(program_name, retval, "while opening inode scan");
+		fatal_error(0);
+	}
+
+	while (1) {
+		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		if (retval) {
+			com_err(program_name, retval,
+				"while getting next inode");
+			fatal_error(0);
+		}
+		if (ino == 0)
+			break;
+		num_inodes++;
+	}
+	
+	print_resource_track(&global_rtrack);
+	printf("%d inodes scanned.\n", num_inodes);
+	
+	exit(0);
+}
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 7eadea8..17b0939 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -31,10 +31,19 @@
  */
 
 #include <time.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <et/com_err.h>
 #include "e2fsck.h"
 
+#ifdef NO_INLINE_FUNCS
+#define _INLINE_
+#else
+#define _INLINE_ inline
+#endif
+
 /* Files counts */
 int fs_directory_count = 0;
 int fs_regular_count = 0;
@@ -47,6 +56,9 @@
 int fs_total_count = 0;
 int fs_badblocks_count = 0;
 int fs_sockets_count = 0;
+int fs_ind_count = 0;
+int fs_dind_count = 0;
+int fs_tind_count = 0;
 
 ext2fs_inode_bitmap inode_used_map = 0;	/* Inodes which are in use */
 ext2fs_inode_bitmap inode_bad_map = 0;	/* Inodes which are bad in some way */
@@ -54,6 +66,7 @@
 
 ext2fs_block_bitmap block_found_map = 0;
 ext2fs_block_bitmap block_dup_map = 0;
+ext2fs_block_bitmap block_illegal_map = 0;
 
 static int fix_link_count = -1;
 
@@ -75,6 +88,7 @@
 static int dir_block_cmp(const void *a, const void *b);
 static errcode_t scan_callback(ext2_filsys fs, ext2_inode_scan scan,
 				  dgrp_t group, void * private);
+static char *describe_illegal_block(ext2_filsys fs, blk_t block);
 
 struct process_block_struct {
 	ino_t	ino;
@@ -125,7 +139,7 @@
 	free(dir_blocks);	dir_blocks = 0;
 	dir_block_size = 0;
 	if (block_dup_map) {
-		free(block_dup_map); block_dup_map = 0;
+		ext2fs_free_block_bitmap(block_dup_map); block_dup_map = 0;
 	}
 
 	/* Clear statistic counters */
@@ -140,6 +154,9 @@
 	fs_total_count = 0;
 	fs_badblocks_count = 0;
 	fs_sockets_count = 0;
+	fs_ind_count = 0;
+	fs_dind_count = 0;
+	fs_tind_count = 0;
 }
 
 void pass1(ext2_filsys fs)
@@ -184,6 +201,13 @@
 			"while allocating block_found_map");
 		fatal_error(0);
 	}
+	retval = ext2fs_allocate_block_bitmap(fs, "illegal block map",
+					      &block_illegal_map);
+	if (retval) {
+		com_err("ext2fs_allocate_block_bitmap", retval,
+			"while allocating block_illegal_map");
+		fatal_error(0);
+	}
 	inode_link_info = allocate_memory((fs->super->s_inodes_count + 1) *
 					  sizeof(unsigned short),
 					  "inode link count array");
@@ -241,9 +265,9 @@
 			 * not, offer to clear it.  It will be
 			 * regnerated in pass #3.
 			 */
-			if (!S_ISDIR(inode.i_mode)) {
+			if (!LINUX_S_ISDIR(inode.i_mode)) {
 				printf("Root inode is not a directory.  ");
-				preenhalt();
+				preenhalt(fs);
 				if (ask("Clear", 1)) {
 					inode.i_dtime = time(0);
 					inode.i_links_count = 0;
@@ -281,6 +305,15 @@
 		}
 		if ((ino != EXT2_ROOT_INO) && (ino < EXT2_FIRST_INO)) {
 			ext2fs_mark_inode_bitmap(inode_used_map, ino);
+			if (inode.i_mode != 0) {
+				printf("Reserved inode %lu has bad mode.  ", ino);
+				if (ask("Clear", 1)) {
+					inode.i_mode = 0;
+					e2fsck_write_inode(fs, ino, &inode,
+							   "pass1");
+				} else 
+					ext2fs_unmark_valid(fs);
+			}
 			check_blocks(fs, ino, &inode, block_buf);
 			goto next;
 		}
@@ -329,37 +362,46 @@
 		}
 		
 		ext2fs_mark_inode_bitmap(inode_used_map, ino);
-		if (inode.i_faddr || inode.i_frag || inode.i_fsize ||
-		    inode.i_file_acl || inode.i_dir_acl) {
+		if (inode.i_faddr
+#if HAVE_EXT2_FRAGS
+		    || inode.i_frag || inode.i_fsize
+#endif
+		    || inode.i_file_acl || inode.i_dir_acl) {
 			if (!inode_bad_map)
 				alloc_bad_map(fs);
 			ext2fs_mark_inode_bitmap(inode_bad_map, ino);
 		}
 		
-		if (S_ISDIR(inode.i_mode)) {
+		if (LINUX_S_ISDIR(inode.i_mode)) {
 			ext2fs_mark_inode_bitmap(inode_dir_map, ino);
 			add_dir_info(fs, ino, 0, &inode);
 			fs_directory_count++;
-		} else if (S_ISREG (inode.i_mode))
+		} else if (LINUX_S_ISREG (inode.i_mode))
 			fs_regular_count++;
-		else if (S_ISCHR (inode.i_mode))
+		else if (LINUX_S_ISCHR (inode.i_mode))
 			fs_chardev_count++;
-		else if (S_ISBLK (inode.i_mode))
+		else if (LINUX_S_ISBLK (inode.i_mode))
 			fs_blockdev_count++;
-		else if (S_ISLNK (inode.i_mode)) {
+		else if (LINUX_S_ISLNK (inode.i_mode)) {
 			fs_symlinks_count++;
 			if (!inode.i_blocks)
 				fs_fast_symlinks_count++;
 		}
-		else if (S_ISFIFO (inode.i_mode))
+		else if (LINUX_S_ISFIFO (inode.i_mode))
 			fs_fifo_count++;
-		else if (S_ISSOCK (inode.i_mode))
+		else if (LINUX_S_ISSOCK (inode.i_mode))
 		        fs_sockets_count++;
 		else {
 			if (!inode_bad_map)
 				alloc_bad_map(fs);
 			ext2fs_mark_inode_bitmap(inode_bad_map, ino);
 		}
+		if (inode.i_block[EXT2_IND_BLOCK])
+			fs_ind_count++;
+		if (inode.i_block[EXT2_DIND_BLOCK])
+			fs_dind_count++;
+		if (inode.i_block[EXT2_TIND_BLOCK])
+			fs_tind_count++;
 		if (inode.i_block[EXT2_IND_BLOCK] ||
 		    inode.i_block[EXT2_DIND_BLOCK] ||
 		    inode.i_block[EXT2_TIND_BLOCK]) {
@@ -397,7 +439,7 @@
 	if (block_dup_map) {
 		if (preen) {
 			printf("Duplicate or bad blocks in use!\n");
-			preenhalt();
+			preenhalt(fs);
 		}
 		pass1_dupblocks(fs, block_buf);
 	}
@@ -406,6 +448,9 @@
 	free(inodes_to_process);
 endit:
 	free(block_buf);
+	ext2fs_free_block_bitmap(block_illegal_map);
+	block_illegal_map = 0;
+	
 	if (tflag > 1) {
 		printf("Pass 1: ");
 		print_resource_track(&rtrack);
@@ -446,7 +491,7 @@
 		ino = inodes_to_process[i].ino;
 		stashed_ino = ino;
 #if 0
-		printf("%lu ", ino);
+		printf("%u ", ino);
 #endif
 		sprintf(buf, "reading indirect blocks of inode %lu", ino);
 		ehandler_operation(buf);
@@ -479,7 +524,13 @@
 	const struct dir_block_struct *db_b =
 		(const struct dir_block_struct *) b;
 
-	return (db_a->blk - db_b->blk);
+	if (db_a->blk != db_b->blk)
+		return (db_a->blk - db_b->blk);
+	
+	if (db_a->ino != db_b->ino)
+		return (db_a->ino - db_b->ino);
+
+	return (db_a->blockcnt - db_b->blockcnt);
 }
 
 /*
@@ -501,12 +552,15 @@
 /*
  * Marks a block as in use, setting the dup_map if it's been set
  * already.  Called by process_block and process_bad_block.
+ *
+ * WARNING: Assumes checks have already been done to make sure block
+ * is valid.  This is true in both process_block and process_bad_block.
  */
-static void mark_block_used(ext2_filsys fs, blk_t block)
+static _INLINE_ void mark_block_used(ext2_filsys fs, blk_t block)
 {
 	errcode_t	retval;
 	
-	if (ext2fs_test_block_bitmap(block_found_map, block)) {
+	if (ext2fs_fast_test_block_bitmap(block_found_map, block)) {
 		if (!block_dup_map) {
 			retval = ext2fs_allocate_block_bitmap(fs,
 			      "multiply claimed block map", &block_dup_map);
@@ -516,9 +570,9 @@
 				fatal_error(0);
 			}
 		}
-		ext2fs_mark_block_bitmap(block_dup_map, block);
+		ext2fs_fast_mark_block_bitmap(block_dup_map, block);
 	} else {
-		ext2fs_mark_block_bitmap(block_found_map, block);
+		ext2fs_fast_mark_block_bitmap(block_found_map, block);
 	}
 }
 
@@ -539,11 +593,12 @@
 	pb.num_blocks = pb.last_block = 0;
 	pb.num_illegal_blocks = 0;
 	pb.suppress = pb.clear = 0;
-	pb.is_dir = S_ISDIR(inode->i_mode);
+	pb.is_dir = LINUX_S_ISDIR(inode->i_mode);
 	pb.fix = -1;
 	pb.inode = inode;
-	retval = ext2fs_block_iterate(fs, ino, 0, block_buf,
-				      process_block, &pb);
+	retval = ext2fs_block_iterate(fs, ino,
+				      pb.is_dir ? BLOCK_FLAG_HOLE : 0,
+				      block_buf, process_block, &pb);
 	if (retval)
 		com_err(program_name, retval,
 			"while calling ext2fs_block_iterate in check_blocks");
@@ -575,7 +630,7 @@
 
 	pb.num_blocks *= (fs->blocksize / 512);
 #if 0
-	printf("inode %lu, i_size = %lu, last_block = %lu, i_blocks=%lu, num_blocks = %lu\n",
+	printf("inode %u, i_size = %lu, last_block = %lu, i_blocks=%lu, num_blocks = %lu\n",
 	       ino, inode->i_size, pb.last_block, inode->i_blocks,
 	       pb.num_blocks);
 #endif
@@ -589,12 +644,14 @@
 			ext2fs_unmark_inode_bitmap(inode_dir_map, ino);
 			ext2fs_unmark_inode_bitmap(inode_used_map, ino);
 			fs_directory_count--;
+			pb.is_dir = 0;
 		} else
 			ext2fs_unmark_valid(fs);
 	}
-	if (inode->i_size < pb.last_block * fs->blocksize) {
-		printf ("Inode %lu, incorrect size, %lu (counted = %u). ",
-			ino, inode->i_size,
+	if ((pb.is_dir && (inode->i_size != (pb.last_block + 1) * fs->blocksize)) ||
+	    (inode->i_size < pb.last_block * fs->blocksize)) {
+		printf ("%s %lu, incorrect size, %u (counted = %u). ",
+			pb.is_dir ? "Directory" : "Inode", ino, inode->i_size,
 			(pb.last_block+1) * fs->blocksize);
 		if (ask ("Set size to counted", 1)) {
 			inode->i_size = (pb.last_block+1) * fs->blocksize;
@@ -603,7 +660,7 @@
 			ext2fs_unmark_valid(fs);
 	}
 	if (pb.num_blocks != inode->i_blocks) {
-		printf ("Inode %lu, i_blocks wrong %lu (counted=%u).  ",
+		printf ("Inode %lu, i_blocks wrong %u (counted=%u).  ",
 			ino, inode->i_blocks, pb.num_blocks);
 		if (ask ("Set i_blocks to counted", 1)) {
 			inode->i_blocks = pb.num_blocks;
@@ -611,7 +668,57 @@
 		} else
 				ext2fs_unmark_valid(fs);
 	}
-}	
+}
+
+/*
+ * Helper function called by process block when an illegal block is
+ * found.  It returns a description about why the block is illegal
+ */
+static char *describe_illegal_block(ext2_filsys fs, blk_t block)
+{
+	blk_t	super;
+	int	i;
+	static char	problem[80];
+
+	super = fs->super->s_first_data_block;
+	strcpy(problem, "PROGRAMMING ERROR: Unknown reason for illegal block");
+	if (block < super) {
+		sprintf(problem, "< FIRSTBLOCK (%u)", super);
+		return(problem);
+	} else if (block >= fs->super->s_blocks_count) {
+		sprintf(problem, "> BLOCKS (%u)", fs->super->s_blocks_count);
+		return(problem);
+	}
+	for (i = 0; i < fs->group_desc_count; i++) {
+		if (block == super) {
+			sprintf(problem, "is the superblock in group %d", i);
+			break;
+		}
+		if (block > super &&
+		    block <= (super + fs->desc_blocks)) {
+			sprintf(problem, "is in the group descriptors "
+				"of group %d", i);
+			break;
+		}
+		if (block == fs->group_desc[i].bg_block_bitmap) {
+			sprintf(problem, "is the block bitmap of group %d", i);
+			break;
+		}
+		if (block == fs->group_desc[i].bg_inode_bitmap) {
+			sprintf(problem, "is the inode bitmap of group %d", i);
+			break;
+		}
+		if (block >= fs->group_desc[i].bg_inode_table &&
+		    (block < fs->group_desc[i].bg_inode_table
+		     + fs->inode_blocks_per_group)) {
+			sprintf(problem, "is in the inode table of group %d",
+				i);
+			break;
+		}
+		super += fs->super->s_blocks_per_group;
+	}
+	return(problem);
+}
 
 /*
  * This is a helper function for check_blocks().
@@ -622,55 +729,41 @@
 		  void *private)
 {
 	struct process_block_struct *p;
-	int	group;
-	int	illegal_block = 0;
-	char	problem[80];
-	blk_t	firstblock, group_super;
+	char	*problem;
 	blk_t	blk = *block_nr;
+	int	ret_code = 0;
 
-	if (!blk)
-		return 0;
 	p = (struct process_block_struct *) private;
 
-#if 0
-	printf("Process_block, inode %lu, block %lu, #%d\n", p->ino, blk,
-	       blockcnt);
-#endif	
-	
-	firstblock = fs->super->s_first_data_block;
-	group = (blk - firstblock) / fs->super->s_blocks_per_group;
-	group_super = ((group * fs->super->s_blocks_per_group) +
-		       fs->super->s_first_data_block);
-	if (blk < firstblock) {
-		sprintf(problem, "< FIRSTBLOCK (%lu)", firstblock);
-		illegal_block++;
-	} else if (blk >= fs->super->s_blocks_count) {
-		sprintf(problem, "> BLOCKS (%lu)", fs->super->s_blocks_count);
-		illegal_block++;
-	} else if (blk == group_super) {
-		sprintf(problem, "is the superblock in group %d", group);
-		illegal_block++;
-	} else if (blk > group_super &&
-		   blk <= (group_super + fs->desc_blocks)) {
-		sprintf(problem, "is in the group descriptors in group %d",
-			group);
-		illegal_block++;
-	} else if (blk == fs->group_desc[group].bg_block_bitmap) {
-		sprintf(problem, "is the block bitmap of group %d", group);
-		illegal_block++;
-	} else if (blk == fs->group_desc[group].bg_inode_bitmap) {
-		sprintf(problem, "is the inode bitmap of group %d", group);
-		illegal_block++;
-	} else if (blk >= fs->group_desc[group].bg_inode_table &&
-		   blk < fs->group_desc[group].bg_inode_table + fs->inode_blocks_per_group) {
-		sprintf(problem, "is in the inode table of group %d", group);
-		illegal_block++;
+	if (blk == 0) {
+		if (p->is_dir == 0) {
+			printf("process_block() called with blk == 0, "
+			       "inode %lu???", p->ino);
+			return 0;
+		}
+		if (blockcnt < 0)
+			return 0;
+		if (blockcnt * fs->blocksize < p->inode->i_size) {
+			printf("Hole found in directory inode %lu!  "
+			       "(blkcnt=%d)\n", p->ino, blockcnt);
+			goto mark_dir;
+		}
+		return 0;
 	}
-	if (illegal_block) {
+
+#if 0
+	printf("Process_block, inode %lu, block %u, #%d\n", p->ino, blk,
+	       blockcnt);
+#endif
+	
+	if (blk < fs->super->s_first_data_block ||
+	    blk >= fs->super->s_blocks_count ||
+	    ext2fs_test_block_bitmap(block_illegal_map, blk)) {
+		problem = describe_illegal_block(fs, blk);
 		if (preen) {
-			printf("Block %lu of inode %lu %s\n", blk, p->ino,
+			printf("Block %u of inode %lu %s\n", blk, p->ino,
 			       problem);
-			preenhalt();
+			preenhalt(fs);
 		}
 		if (p->fix == -1) {
 			printf("Remove illegal block(s) in inode %lu", p->ino);
@@ -689,28 +782,34 @@
 			}
 		}
 		if (!p->suppress)
-			printf("Block #%d (%lu) %s.  %s\n", blockcnt, blk,
+			printf("Block #%d (%u) %s.  %s\n", blockcnt, blk,
 			       problem, clear_msg[p->fix]);
 		if (p->fix) {
-			*block_nr = 0;
-			return BLOCK_CHANGED;
+			blk = *block_nr = 0;
+			ret_code = BLOCK_CHANGED;
+			goto mark_dir;
 		} else {
 			ext2fs_unmark_valid(fs);
 			return 0;
 		}
 	}
 
-	p->num_blocks++;
-	if (blockcnt > 0)
-		p->last_block = blockcnt;
 	mark_block_used(fs, blk);
+	p->num_blocks++;
+	if (blockcnt < 0)
+		return 0;
 	
-	if (p->is_dir && (blockcnt >= 0)) {
+	p->last_block = blockcnt;
+mark_dir:
+	if (p->is_dir) {
 		if (dir_block_count >= dir_block_size) {
 			dir_block_size += 100;
 			dir_blocks = realloc(dir_blocks,
 					     dir_block_size *
 					     sizeof(struct dir_block_struct));
+			if (dir_blocks == 0)
+				fatal_error("Not enough memory to "
+					    "realloc dir_blocks");
 		}
 
 		dir_blocks[dir_block_count].blk = blk;
@@ -718,19 +817,13 @@
 		dir_blocks[dir_block_count].blockcnt = blockcnt;
 		dir_block_count++;
 	}
-	
-#if 0
-	printf("process block, inode %lu, block #%d is %lu\n",
-	       p->ino, blockcnt, blk);
-#endif
-	
-	return 0;
+	return ret_code;
 }
 
-static void bad_block_indirect(blk_t blk)
+static void bad_block_indirect(ext2_filsys fs, blk_t blk)
 {
-	printf("Bad block %lu used as bad block indirect block?!?\n", blk);
-	preenhalt();
+	printf("Bad block %u used as bad block indirect block?!?\n", blk);
+	preenhalt(fs);
 	printf("\nThis inconsistency can not be fixed with "
 	       "e2fsck; to fix it, use\n"
 	       """dumpe2fs -b"" to dump out the bad block "
@@ -741,6 +834,22 @@
 	fatal_error(0);
 }
 
+static int bad_primary_block(ext2_filsys fs, blk_t *block_nr)
+{
+	printf("\nIf the block is really bad, the filesystem can not be "
+	       "fixed.\n");
+	preenhalt(fs);
+	printf("You can clear the this block from the bad block list\n");
+	printf("and hope that block is really OK, but there are no "
+	       "guarantees.\n\n");
+	if (ask("Clear (and hope for the best)", 1)) {
+		*block_nr = 0;
+		return 1;
+	}
+	ext2fs_unmark_valid(fs);
+	return 0;
+}
+
 int process_bad_block(ext2_filsys fs,
 		      blk_t *block_nr,
 		      int blockcnt,
@@ -758,12 +867,12 @@
 	if ((blk < fs->super->s_first_data_block) ||
 	    (blk >= fs->super->s_blocks_count)) {
 		if (preen) {
-			printf("Illegal block %lu in bad block inode\n", blk);
-			preenhalt();
+			printf("Illegal block %u in bad block inode\n", blk);
+			preenhalt(fs);
 		}
 		if (p->fix == -1)
 			p->fix = ask("Remove illegal block(s) in bad block inode", 1);
-		printf("Illegal block %lu in bad block inode.  %s\n", blk,
+		printf("Illegal block %u in bad block inode.  %s\n", blk,
 		       clear_msg[p->fix]);
 		if (p->fix) {
 			*block_nr = 0;
@@ -776,13 +885,13 @@
 
 	if (blockcnt < 0) {
 		if (ext2fs_test_block_bitmap(block_found_map, blk))
-			bad_block_indirect(blk);
+			bad_block_indirect(fs, blk);
 		else
 			mark_block_used(fs, blk);
 		return 0;
 	}
 #if 0 
-	printf ("DEBUG: Marking %lu as bad.\n", blk);
+	printf ("DEBUG: Marking %u as bad.\n", blk);
 #endif
 	fs_badblocks_count++;
 	/*
@@ -803,31 +912,35 @@
 	for (i = 0; i < fs->group_desc_count; i++ ) {
 		if (blk == first_block) {
 			if (i == 0) {
-				printf("The primary superblock (%lu) is "
-				       "bad.  Aiiieeee....\n", blk);
-				fatal_error(0);
+				printf("The primary superblock (%u) is "
+				       "on the bad block list.\n", blk);
+				if (bad_primary_block(fs, block_nr))
+					return BLOCK_CHANGED;
+				return 0;
 			}
 			if (!preen)
 				printf("Warning: Group %d's superblock "
-				       "(%lu) is bad.\n", i, blk);
+				       "(%u) is bad.\n", i, blk);
 			return 0;
 		}
 		if ((blk > first_block) &&
 		    (blk <= first_block + fs->desc_blocks)) {
 			if (i == 0) {
-				printf("Bad block %lu is in the primary "
-				       "group descriptors.  Aiiieeee....\n",
-				       blk);
-				fatal_error(0);
+				printf("Block %u in the primary group "
+				       "descriptors is on the bad block "
+				       "list\n", blk);
+				if (bad_primary_block(fs, block_nr))
+					return BLOCK_CHANGED;
+				return 0;
 			}
 			if (!preen)
 				printf("Warning: Group %d's copy of the "
 				       "group descriptors has a bad "
-				       "block (%lu).\n", i, blk);
+				       "block (%u).\n", i, blk);
 			return 0;
 		}
 		if (blk == fs->group_desc[i].bg_block_bitmap) {
-			printf("Group %d's block bitmap (%lu) is bad.  ",
+			printf("Group %d's block bitmap (%u) is bad.  ",
 			       i, blk);
 			if (ask("Relocate", 1)) {
 				invalid_block_bitmap[i]++;
@@ -837,7 +950,7 @@
 			return 0;
 		}
 		if (blk == fs->group_desc[i].bg_inode_bitmap) {
-			printf("Group %d's inode bitmap (%lu) is bad.  ",
+			printf("Group %d's inode bitmap (%u) is bad.  ",
 			       i, blk);
 			if (ask("Relocate", 1)) {
 				invalid_inode_bitmap[i]++;
@@ -850,7 +963,7 @@
 		    (blk < (fs->group_desc[i].bg_inode_table +
 			    fs->inode_blocks_per_group))) {
 			printf("WARNING: Severe data loss possible!!!!\n");
-			printf("Bad block %lu in group %d's inode table.  ",
+			printf("Bad block %u in group %d's inode table.  ",
 			       blk, i);
 			if (ask("Relocate", 1)) {
 				invalid_inode_table[i]++;
@@ -868,11 +981,11 @@
 	 */
 	if ((blk == p->inode->i_block[EXT2_IND_BLOCK]) ||
 	    p->inode->i_block[EXT2_DIND_BLOCK]) {
-		bad_block_indirect(blk);
+		bad_block_indirect(fs, blk);
 		return 0;
 	}
 	
-	printf("Programming error?  block #%lu claimed for no reason "
+	printf("Programming error?  block #%u claimed for no reason "
 	       "in process_bad_block.\n", blk);
 	return 0;
 }
@@ -904,15 +1017,15 @@
 	ext2fs_mark_super_dirty(fs);
 	printf("Relocating group %d's %s ", group, name);
 	if (old_block)
-		printf("from %lu ", old_block);
-	printf("to %lu...\n", *new_block);
+		printf("from %u ", old_block);
+	printf("to %u...\n", *new_block);
 	for (i = 0; i < num; i++) {
 		ext2fs_mark_block_bitmap(block_found_map, (*new_block)+i);
 		if (old_block) {
 			retval = io_channel_read_blk(fs->io, old_block + i,
 						     1, buf);
 			if (retval)
-				printf("Warning: could not read block %lu "
+				printf("Warning: could not read block %u "
 				       "of %s: %s\n",
 				       old_block + i, name,
 				       error_message(retval));
@@ -922,7 +1035,7 @@
 		retval = io_channel_write_blk(fs->io, (*new_block) + i,
 					      1, buf);
 		if (retval)
-			printf("Warning: could not write block %lu for %s: %s\n",
+			printf("Warning: could not write block %u for %s: %s\n",
 			       (*new_block) + i, name, error_message(retval));
 	}
 	free(buf);
@@ -977,19 +1090,23 @@
 		if (fs->group_desc[i].bg_block_bitmap) {
 			if (ext2fs_test_block_bitmap(block_found_map,
 				     fs->group_desc[i].bg_block_bitmap)) {
-				printf("Group %i's block bitmap at %lu "
+				printf("Group %i's block bitmap at %u "
 				       "conflicts with some other fs block.\n",
 				       i, fs->group_desc[i].bg_block_bitmap);
-				preenhalt();
+				preenhalt(fs);
 				if (ask("Relocate", 1)) {
 					invalid_block_bitmap[i]++;
 					invalid_bitmaps++;
 				} else {
 					ext2fs_unmark_valid(fs);
 				}
-			} else
+			} else {
 			    ext2fs_mark_block_bitmap(block_found_map,
 				     fs->group_desc[i].bg_block_bitmap);
+			    ext2fs_mark_block_bitmap(block_illegal_map,
+				     fs->group_desc[i].bg_block_bitmap);
+		    }
+			
 		}
 		/*
 		 * Mark block used for the inode bitmap 
@@ -997,19 +1114,22 @@
 		if (fs->group_desc[i].bg_inode_bitmap) {
 			if (ext2fs_test_block_bitmap(block_found_map,
 				     fs->group_desc[i].bg_inode_bitmap)) {
-				printf("Group %i's inode bitmap at %lu "
+				printf("Group %i's inode bitmap at %u "
 				       "conflicts with some other fs block.\n",
 				       i, fs->group_desc[i].bg_inode_bitmap);
-				preenhalt();
+				preenhalt(fs);
 				if (ask("Relocate", 1)) {
 					invalid_inode_bitmap[i]++;
 					invalid_bitmaps++;
 				} else {
 					ext2fs_unmark_valid(fs);
 				}
-			} else
+			} else {
 			    ext2fs_mark_block_bitmap(block_found_map,
 				     fs->group_desc[i].bg_inode_bitmap);
+			    ext2fs_mark_block_bitmap(block_illegal_map,
+				     fs->group_desc[i].bg_inode_bitmap);
+			}
 		}
 		    
 		/*
@@ -1021,20 +1141,23 @@
 			     j++, b++) {
 				if (ext2fs_test_block_bitmap(block_found_map,
 							     b)) {
-					printf("Group %i's inode table at %lu "
+					printf("Group %i's inode table at %u "
 					       "conflicts with some other "
 					       "fs block.\n",
 					       i, b);
-					preenhalt();
+					preenhalt(fs);
 					if (ask("Relocate", 1)) {
 						invalid_inode_table[i]++;
 						invalid_bitmaps++;
 					} else {
 						ext2fs_unmark_valid(fs);
 					}
-				} else
+				} else {
 				    ext2fs_mark_block_bitmap(block_found_map,
 							     b);
+				    ext2fs_mark_block_bitmap(block_illegal_map,
+							     b);
+				    }
 			}
 		}
 			    
@@ -1042,13 +1165,17 @@
 		 * Mark this group's copy of the superblock
 		 */
 		ext2fs_mark_block_bitmap(block_found_map, block);
+		ext2fs_mark_block_bitmap(block_illegal_map, block);
 		
 		/*
 		 * Mark this group's copy of the descriptors
 		 */
-		for (j = 0; j < fs->desc_blocks; j++)
+		for (j = 0; j < fs->desc_blocks; j++) {
 			ext2fs_mark_block_bitmap(block_found_map,
 						 block + j + 1);
+			ext2fs_mark_block_bitmap(block_illegal_map,
+						 block + j + 1);
+		}
 		block += fs->super->s_blocks_per_group;
 	}
 }
@@ -1077,7 +1204,7 @@
 static errcode_t pass1_check_directory(ext2_filsys fs, ino_t ino)
 {
 	if (ino == stashed_ino) {
-		if (!S_ISDIR(stashed_inode->i_mode))
+		if (!LINUX_S_ISDIR(stashed_inode->i_mode))
 			return ENOTDIR;
 		return 0;
 	}
diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c
index c98030f..287c24f 100644
--- a/e2fsck/pass1b.c
+++ b/e2fsck/pass1b.c
@@ -24,6 +24,9 @@
  */
 
 #include <time.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <et/com_err.h>
 #include "e2fsck.h"
@@ -237,7 +240,7 @@
 			if (!p->dup_blocks)
 				printf("Duplicate/bad block(s) in inode %lu:",
 				       p->ino);
-			printf(" %lu", *block_nr);
+			printf(" %u", *block_nr);
 		}
 		p->dup_blocks++;
 		ext2fs_mark_block_bitmap(block_dup_map, *block_nr);
@@ -330,8 +333,8 @@
 	 * (by searching for the containing directory for that inode.)
 	 */
 	for (i=0; inodes_left && i < dir_block_count; i++) {
-		retval = io_channel_read_blk(fs->io, dir_blocks[i].blk,
-					     1, block_buf);
+		retval = ext2fs_read_dir_block(fs, dir_blocks[i].blk,
+					       block_buf);
 		entry = offset = 0;
 		while (offset < fs->blocksize) {
 			entry++;
@@ -478,6 +481,7 @@
 			ext2fs_unmark_valid(fs);
 		printf("\n");
 	}
+	free(shared);
 }
 
 static int delete_file_block(ext2_filsys fs,
diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c
index 3331cb9..cd5b267 100644
--- a/e2fsck/pass2.c
+++ b/e2fsck/pass2.c
@@ -31,7 +31,6 @@
  * 	- The inode_used_map bitmap
  * 	- The inode_bad_map bitmap
  * 	- The inode_dir_map bitmap
- * 	- The block_dup_map bitmap
  *
  * Pass 2 frees the following data structures
  * 	- The inode_bad_map bitmap
@@ -52,6 +51,13 @@
 static int check_dir_block(ext2_filsys fs,
 			   struct dir_block_struct *dir_blocks_info,
 			   char *buf);
+static int allocate_dir_block(ext2_filsys fs,
+			      struct dir_block_struct *dir_blocks_info,
+			      char *buf);
+static int update_dir_block(ext2_filsys fs,
+			    blk_t	*block_nr,
+			    int blockcnt,
+			    void *private);
 
 void pass2(ext2_filsys fs)
 {
@@ -100,14 +106,29 @@
 	int	status = 0;
 	int	created = 0;
 	int	new_len;
-	char	name[BLOCK_SIZE];
+	const char 	*question = 0;
 	
 	if (!dirent->inode) {
 		printf("Missing '.' in directory inode %lu.\n", ino);
+		question = "Fix";
+	} else if ((dirent->name_len != 1) ||
+		   strncmp(dirent->name, ".", dirent->name_len)) {
+		char *name = malloc(dirent->name_len + 1);
+		if (!name)
+			fatal_error("Couldn't allocate . name");
+		strncpy(name, dirent->name, dirent->name_len);
+		name[dirent->name_len] = '\0';
+		printf("First entry in directory inode %lu contains '%s' "
+		       "(inode=%u)\n", ino, name, dirent->inode);
+		printf("instead of '.'.\n");
+		free(name);
+		question = "Change to be '.'";
+	}
+	if (question) {
 		if (dirent->rec_len < 12)
 			fatal_error("Cannot fix, insufficient space to add '.'");
-		preenhalt();
-		if (ask("Fix", 1)) {
+		preenhalt(fs);
+		if (ask(question, 1)) {
 			dirent->inode = ino;
 			dirent->name_len = 1;
 			dirent->name[0] = '.';
@@ -118,19 +139,10 @@
 			return 0;
 		}
 	}
-	if ((dirent->name_len != 1) ||
-	    strncmp(dirent->name, ".", dirent->name_len)) {
-		strncpy(name, dirent->name, dirent->name_len);
-		name[dirent->name_len] = '\0';
-		printf("Missing '.' in directory inode %lu.\n", ino);
-		printf("Cannot fix, first entry in directory contains '%s'\n",
-		       name);
-		exit(FSCK_ERROR);
-	}
 	if (dirent->inode != ino) {
 		printf("Bad inode number for '.' in directory inode %lu.\n",
 		       ino);
-		preenhalt();
+		preenhalt(fs);
 		if (ask("Fix", 1)) {
 			dirent->inode = ino;
 			status = 1;
@@ -140,7 +152,7 @@
 	if (dirent->rec_len > 12) {
 		new_len = dirent->rec_len - 12;
 		if (new_len > 12) {
-			preenhalt();
+			preenhalt(fs);
 			if (created ||
 			    ask("Directory entry for '.' is big.  Split", 1)) {
 				nextdir = (struct ext2_dir_entry *)
@@ -165,15 +177,30 @@
 			struct ext2_dir_entry *dirent,
 			struct dir_info *dir)
 {
-	char	name[BLOCK_SIZE];
 	ino_t	ino = dir->ino;
+	const char	*question = 0;
 	
 	if (!dirent->inode) {
 		printf("Missing '..' in directory inode %lu.\n", ino);
+		question = "Fix";
+	} else if ((dirent->name_len != 2) ||
+	    strncmp(dirent->name, "..", dirent->name_len)) {
+		char *name = malloc(dirent->name_len + 1);
+		if (!name)
+			fatal_error("Couldn't allocate bad .. name");
+		strncpy(name, dirent->name, dirent->name_len);
+		name[dirent->name_len] = '\0';
+		printf("Second entry in directory inode %lu contains '%s' "
+		       "(inode=%u)\n", ino, name, dirent->inode);
+		printf("instead of '..'.\n");
+		free(name);
+		question = "Change to be '..'";
+	}
+	if (question) {
 		if (dirent->rec_len < 12)
 			fatal_error("Cannot fix, insufficient space to add '..'");
-		preenhalt();
-		if (ask("Fix", 1)) {
+		preenhalt(fs);
+		if (ask(question, 1)) {
 			/*
 			 * Note: we don't have the parent inode just
 			 * yet, so we will fill it in with the root
@@ -188,15 +215,6 @@
 			ext2fs_unmark_valid(fs);
 		return 0;
 	}
-	if ((dirent->name_len != 2) ||
-	    strncmp(dirent->name, "..", dirent->name_len)) {
-		strncpy(name, dirent->name, dirent->name_len);
-		name[dirent->name_len] = '\0';
-		printf("Missing '..' in directory inode %lu.\n", ino);
-		printf("Cannot fix, first entry in directory contains %s\n",
-		       name);
-		exit(FSCK_ERROR);
-	}
 	dir->dotdot = dirent->inode;
 	return 0;
 }
@@ -232,7 +250,7 @@
 					name, pathname, dir_ino);
 				if (pathname != unknown_pathname)
 					free(pathname);
-				preenhalt();
+				preenhalt(fs);
 				fixup = ask("Replace '/' or null by '.'", 1);
 			}
 			if (fixup) {
@@ -251,14 +269,14 @@
 {
 	struct dir_info		*subdir, *dir;
 	struct ext2_dir_entry 	*dirent;
-	char			name[BLOCK_SIZE];
 	int			offset = 0;
 	int			dir_modified = 0;
 	errcode_t		retval;
 	char			*path1, *path2;
-	int			dot_state;
+	int			dot_state, name_len;
 	blk_t			block_nr = db->blk;
 	ino_t 			ino = db->ino;
+	char			name[EXT2_NAME_LEN+1];
 
 	/*
 	 * Make sure the inode is still in use (could have been 
@@ -266,6 +284,12 @@
 	 */
 	if (!(ext2fs_test_inode_bitmap(inode_used_map, ino))) 
 		return 0;
+
+	if (db->blk == 0) {
+		if (allocate_dir_block(fs, db, buf))
+			return 0;
+		block_nr = db->blk;
+	}
 	
 	if (db->blockcnt)
 		dot_state = 2;
@@ -277,7 +301,7 @@
 	       db->blockcnt, ino);
 #endif
 	
-	retval = io_channel_read_blk(fs->io, block_nr, 1, buf);
+	retval = ext2fs_read_dir_block(fs, block_nr, buf);
 	if (retval) {
 		com_err(program_name, retval,
 			"while reading directory block %d", block_nr);
@@ -291,7 +315,7 @@
 		    ((dirent->name_len+8) > dirent->rec_len)) {
 			printf("Directory inode %lu, block %d, offset %d: directory corrupted\n",
 			       ino, db->blockcnt, offset);
-			preenhalt();
+			preenhalt(fs);
 			if (ask("Salvage", 1)) {
 				dirent->rec_len = fs->blocksize - offset;
 				dirent->name_len = 0;
@@ -302,8 +326,22 @@
 				return DIRENT_ABORT;
 			}
 		}
-		strncpy(name, dirent->name, dirent->name_len);
-		name[dirent->name_len] = '\0';
+
+		name_len = dirent->name_len;
+		if (dirent->name_len > EXT2_NAME_LEN) {
+			printf("Directory inode %lu, block %d, offset %d: filename too long\n",
+			       ino, db->blockcnt, offset);
+			preenhalt(fs);
+			if (ask("Truncate filename", 1)) {
+				dirent->name_len = EXT2_NAME_LEN;
+				dir_modified++;
+			}
+			name_len = EXT2_NAME_LEN;
+		}
+
+		strncpy(name, dirent->name, name_len);
+		name[name_len] = '\0';
+
 		if (dot_state == 1) {
 			if (check_dot(fs, dirent, ino))
 				dir_modified++;
@@ -324,7 +362,7 @@
 			       name, path1, ino);
 			if (path1 != unknown_pathname)
 				free(path1);
-			preenhalt();
+			preenhalt(fs);
 			if (ask("Clear", 1)) {
 				dirent->inode = 0;
 				dir_modified++;
@@ -349,11 +387,11 @@
 			retval = ext2fs_get_pathname(fs, ino, 0, &path1);
 			if (retval)
 				path1 = unknown_pathname;
-			printf("Entry '%s' in %s (%lu) has bad inode #: %lu.\n",
+			printf("Entry '%s' in %s (%lu) has bad inode #: %u.\n",
 			       name, path1, ino, dirent->inode);
 			if (path1 != unknown_pathname)
 				free(path1);
-			preenhalt();
+			preenhalt(fs);
 			if (ask("Clear", 1)) {
 				dirent->inode = 0;
 				dir_modified++;
@@ -370,7 +408,7 @@
 			retval = ext2fs_get_pathname(fs, ino, 0, &path1);
 			if (retval)
 				path1 = unknown_pathname;
-			printf("Entry '%s' in %s (%lu) has deleted/unused inode %lu.\n",
+			printf("Entry '%s' in %s (%lu) has deleted/unused inode %u.\n",
 			       name, path1, ino, dirent->inode);
 			if (path1 != unknown_pathname)
 				free(path1);
@@ -410,7 +448,7 @@
 					      dirent->inode))) {
 			subdir = get_dir_info(dirent->inode);
 			if (!subdir) {
-				printf("INTERNAL ERROR: missing dir %lu\n",
+				printf("INTERNAL ERROR: missing dir %u\n",
 				       dirent->inode);
 				fatal_error(0);
 			}
@@ -425,7 +463,7 @@
 							     &path2);
 				if (retval)
 					path2 = unknown_pathname;
-				printf("Entry '%s' in %s (%lu) is a link to directory %s (%lu).\n",
+				printf("Entry '%s' in %s (%lu) is a link to directory %s (%u).\n",
 				       name, path1, ino, path2, 
 				       dirent->inode);
 				if (path1 != unknown_pathname)
@@ -457,8 +495,7 @@
 		       dirent->rec_len - fs->blocksize + offset);
 	}
 	if (dir_modified) {
-		retval = io_channel_write_blk(fs->io, block_nr,
-					      1, buf);
+		retval = ext2fs_write_dir_block(fs, block_nr, buf);
 		if (retval) {
 			com_err(program_name, retval,
 				"while writing directory block %d", block_nr);
@@ -526,16 +563,16 @@
  * make sure that certain reserved fields are really zero.  If not,
  * prompt the user if he/she wants us to zeroize them.
  */
-static void check_for_zero_long(ext2_filsys fs, ino_t ino, char *pathname,
-				const char *name, unsigned long *val,
+static void check_for_zero_u32(ext2_filsys fs, ino_t ino, char *pathname,
+				const char *name, __u32 *val,
 				int *modified)
 {
 	char prompt[80];
 	
 	if (*val) {
-		printf("%s for inode %lu (%s) is %lu, should be zero.\n",
+		printf("%s for inode %lu (%s) is %u, should be zero.\n",
 		       name, ino, pathname, *val);
-		preenhalt();
+		preenhalt(fs);
 		sprintf(prompt, "Clear %s", name);
 		if (ask(prompt, 1)) {
 			*val = 0;
@@ -545,8 +582,8 @@
 	}
 }
 
-static void check_for_zero_char(ext2_filsys fs, ino_t ino, char *pathname,
-				const char *name, unsigned char *val,
+static void check_for_zero_u8(ext2_filsys fs, ino_t ino, char *pathname,
+				const char *name, __u8 *val,
 				int *modified)
 {
 	char prompt[80];
@@ -554,7 +591,7 @@
 	if (*val) {
 		printf("%s for inode %lu (%s) is %d, should be zero.\n",
 		       name, ino, pathname, *val);
-		preenhalt();
+		preenhalt(fs);
 		sprintf(prompt, "Clear %s", name);
 		if (ask(prompt, 1)) {
 			*val = 0;
@@ -581,28 +618,42 @@
 			ino);
 		return 0;
 	}
-	if (!S_ISDIR(inode.i_mode) && !S_ISREG(inode.i_mode) &&
-	    !S_ISCHR(inode.i_mode) && !S_ISBLK(inode.i_mode) &&
-	    !S_ISLNK(inode.i_mode) && !S_ISFIFO(inode.i_mode) &&
-	    !(S_ISSOCK(inode.i_mode))) {
+	if (!LINUX_S_ISDIR(inode.i_mode) && !LINUX_S_ISREG(inode.i_mode) &&
+	    !LINUX_S_ISCHR(inode.i_mode) && !LINUX_S_ISBLK(inode.i_mode) &&
+	    !LINUX_S_ISLNK(inode.i_mode) && !LINUX_S_ISFIFO(inode.i_mode) &&
+	    !(LINUX_S_ISSOCK(inode.i_mode))) {
 		printf("Inode %lu (%s) has a bad mode (0%o).\n",
 		       ino, pathname, inode.i_mode);
-		preenhalt();
+		preenhalt(fs);
 		if (ask("Clear", 1)) {
 			deallocate_inode(fs, ino, 0);
+			free(pathname);
 			return 1;
 		} else
 			ext2fs_unmark_valid(fs);
 	}
-	check_for_zero_long(fs, ino, pathname, "i_faddr", &inode.i_faddr,
+	check_for_zero_u32(fs, ino, pathname, "i_faddr", &inode.i_faddr,
 			    &inode_modified);
-	check_for_zero_char(fs, ino, pathname, "i_frag", &inode.i_frag,
+#if HAVE_EXT2_FRAGS
+	check_for_zero_u8(fs, ino, pathname, "i_frag", &inode.i_frag,
 			    &inode_modified);
-	check_for_zero_char(fs, ino, pathname, "i_fsize", &inode.i_fsize,
+	check_for_zero_u8(fs, ino, pathname, "i_fsize", &inode.i_fsize,
 			    &inode_modified);
-	check_for_zero_long(fs, ino, pathname, "i_file_acl", &inode.i_file_acl,
+#else
+	/*
+	 * Even if the OS specific fields don't support i_frag and
+	 * i_fsize, make sure they are set to zero anyway.  This may
+	 * cause problems if on some other OS these fields are reused
+	 * for something else, but that's probably a bad idea....
+	 */
+	check_for_zero_u8(fs, ino, pathname, "i_frag",
+			  &inode.osd2.linux2.l_i_frag, &inode_modified);
+	check_for_zero_u8(fs, ino, pathname, "i_fsize",
+			  &inode.osd2.linux2.l_i_fsize, &inode_modified);
+#endif
+	check_for_zero_u32(fs, ino, pathname, "i_file_acl", &inode.i_file_acl,
 			    &inode_modified);
-	check_for_zero_long(fs, ino, pathname, "i_dir_acl", &inode.i_dir_acl,
+	check_for_zero_u32(fs, ino, pathname, "i_dir_acl", &inode.i_dir_acl,
 			    &inode_modified);
 	free(pathname);
 	if (inode_modified)
@@ -610,3 +661,107 @@
 	return 0;
 }
 
+
+/*
+ * allocate_dir_block --- this function allocates a new directory
+ * 	block for a particular inode; this is done if a directory has
+ * 	a "hole" in it, or if a directory has a illegal block number
+ * 	that was zeroed out and now needs to be replaced.
+ */
+static int allocate_dir_block(ext2_filsys fs,
+			      struct dir_block_struct *db,
+			      char *buf)
+{
+	blk_t			blk;
+	char			*block;
+	struct ext2_inode	inode;
+	errcode_t		retval;
+
+	printf("Directory inode %lu has a hole at block #%d\n",
+	       db->ino, db->blockcnt);
+	if (ask("Allocate block", 1) == 0)
+		return 1;
+
+	/*
+	 * Read the inode and block bitmaps in; we'll be messing with
+	 * them.
+	 */
+	read_bitmaps(fs);
+	
+	/*
+	 * First, find a free block
+	 */
+	retval = ext2fs_new_block(fs, 0, block_found_map, &blk);
+	if (retval) {
+		com_err("allocate_dir_block", retval,
+			"while trying to fill a hole in a directory inode");
+		return 1;
+	}
+	ext2fs_mark_block_bitmap(block_found_map, blk);
+	ext2fs_mark_block_bitmap(fs->block_map, blk);
+	ext2fs_mark_bb_dirty(fs);
+
+	/*
+	 * Now let's create the actual data block for the inode
+	 */
+	if (db->blockcnt)
+		retval = ext2fs_new_dir_block(fs, 0, 0, &block);
+	else
+		retval = ext2fs_new_dir_block(fs, db->ino, EXT2_ROOT_INO,
+					      &block);
+
+	if (retval) {
+		com_err("allocate_dir_block", retval,
+			"while creating new directory block");
+		return 1;
+	}
+
+	retval = ext2fs_write_dir_block(fs, blk, block);
+	free(block);
+	if (retval) {
+		com_err("allocate_dir_block", retval,
+			"while writing an empty directory block");
+		return 1;
+	}
+
+	/*
+	 * Update the inode block count
+	 */
+	e2fsck_read_inode(fs, db->ino, &inode, "allocate_dir_block");
+	inode.i_blocks += fs->blocksize / 512;
+	if (inode.i_size < (db->blockcnt+1) * fs->blocksize)
+		inode.i_size = (db->blockcnt+1) * fs->blocksize;
+	e2fsck_write_inode(fs, db->ino, &inode, "allocate_dir_block");
+
+	/*
+	 * Finally, update the block pointers for the inode
+	 */
+	db->blk = blk;
+	retval = ext2fs_block_iterate(fs, db->ino, BLOCK_FLAG_HOLE,
+				      0, update_dir_block, db);
+	if (retval) {
+		com_err("allocate_dir_block", retval,
+			"while calling ext2fs_block_iterate");
+		return 1;
+	}
+
+	return 0;
+}
+
+/*
+ * This is a helper function for allocate_dir_block().
+ */
+static int update_dir_block(ext2_filsys fs,
+			    blk_t	*block_nr,
+			    int blockcnt,
+			    void *private)
+{
+	struct dir_block_struct *db = private;
+
+	if (db->blockcnt == blockcnt) {
+		*block_nr = db->blk;
+		return BLOCK_CHANGED;
+	}
+	return 0;
+}
+	
diff --git a/e2fsck/pass3.c b/e2fsck/pass3.c
index 7e3ad97..df2c5bb 100644
--- a/e2fsck/pass3.c
+++ b/e2fsck/pass3.c
@@ -30,6 +30,9 @@
  *     	- The dirinfo directory information cache.
  */
 
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 #include "et/com_err.h"
 
 #include "e2fsck.h"
@@ -134,7 +137,7 @@
 	}
 
 	printf("Root inode not allocated.  ");
-	preenhalt();
+	preenhalt(fs);
 	if (!ask("Rellocate", 1)) {
 		ext2fs_unmark_valid(fs);
 		fatal_error("Cannot proceed without a root inode.");
@@ -166,9 +169,9 @@
 		fatal_error(0);
 	}
 
-	retval = io_channel_write_blk(fs->io, blk, 1, block);
+	retval = ext2fs_write_dir_block(fs, blk, block);
 	if (retval) {
-		com_err("io_channel_write_blk", retval,
+		com_err("ext2fs_write_dir_block", retval,
 			"while writing the root directory block");
 		fatal_error(0);
 	}
@@ -275,7 +278,7 @@
 	printf("Unconnected directory inode %lu (%s)\n", p->ino, path1);
 	if (path1 != unknown)
 		free(path1);
-	preenhalt();
+	preenhalt(fs);
 	if (ask("Connect to /lost+found", 1)) {
 		if (reconnect_file(fs, p->ino))
 			ext2fs_unmark_valid(fs);
@@ -341,7 +344,7 @@
 		       error_message(retval));
 	else
 		printf("/lost+found not found.  ");
-	preenhalt();
+	preenhalt(fs);
 	if (!ask("Create", 1)) {
 		ext2fs_unmark_valid(fs);
 		return 0;
@@ -391,13 +394,13 @@
 		return 0;
 	}
 
-	retval = io_channel_write_blk(fs->io, blk, 1, block);
+	retval = ext2fs_write_dir_block(fs, blk, block);
+	free(block);
 	if (retval) {
-		com_err("io_channel_write_blk", retval,
+		com_err("ext2fs_write_dir_block", retval,
 			"while writing the directory block for /lost+found");
 		return 0;
 	}
-	free(block);
 
 	/*
 	 * Set up the inode structure
@@ -542,7 +545,7 @@
 	
 	retval = adjust_inode_count(fp->fs, dirent->inode, -1);
 	if (retval)
-		printf("Error while adjusting inode count on inode %lu\n",
+		printf("Error while adjusting inode count on inode %u\n",
 		       dirent->inode);
 	retval = adjust_inode_count(fp->fs, fp->parent, 1);
 	if (retval)
@@ -626,7 +629,7 @@
 		}
 		memset(block, 0, fs->blocksize);
 	}	
-	retval = io_channel_write_blk(fs->io, new_blk, 1, block);
+	retval = ext2fs_write_dir_block(fs, new_blk, block);
 	if (retval) {
 		es->err = retval;
 		return BLOCK_ABORT;
diff --git a/e2fsck/pass4.c b/e2fsck/pass4.c
index 1075731..67a4e9e 100644
--- a/e2fsck/pass4.c
+++ b/e2fsck/pass4.c
@@ -34,7 +34,7 @@
 			 * prompt to reconnect.
 			 */
 			printf("Unattached inode %lu\n", i);
-			preenhalt();
+			preenhalt(fs);
 			if (ask("Connect to /lost+found", 1)) {
 				if (reconnect_file(fs, i))
 					ext2fs_unmark_valid(fs);
@@ -45,7 +45,7 @@
 			e2fsck_read_inode(fs, i, &inode, "pass4");
 			if (inode_link_info[i] != inode.i_links_count) {
 				printf("WARNING: PROGRAMMING BUG IN E2FSCK!\n");
-				printf("inode_link_info[%d] is %lu, "
+				printf("inode_link_info[%ld] is %u, "
 				       "inode.i_links_count is %d.  "
 				       "They should be the same!\n",
 				       i, inode_link_info[i],
diff --git a/e2fsck/pass5.c b/e2fsck/pass5.c
index 888ac97..744aee2 100644
--- a/e2fsck/pass5.c
+++ b/e2fsck/pass5.c
@@ -61,12 +61,39 @@
 	
 	free_array = allocate_memory(fs->group_desc_count * sizeof(int),
 				     "free block count array");
-				     
+
+	if ((fs->super->s_first_data_block <
+	     ext2fs_get_block_bitmap_start(block_found_map)) ||
+	    (fs->super->s_blocks_count-1 >
+	     ext2fs_get_block_bitmap_end(block_found_map))) {
+		printf("PROGRAMMING ERROR: filesystem endpoints (%d, %d)\n\t"
+		       "don't match block_found_map endpoints (%d, %d).\n",
+		       fs->super->s_first_data_block,
+		       fs->super->s_blocks_count -1,
+		       ext2fs_get_block_bitmap_start(block_found_map),
+		       ext2fs_get_block_bitmap_end(block_found_map));
+		fatal_error(0);
+	}
+		       
+	if ((fs->super->s_first_data_block <
+	     ext2fs_get_block_bitmap_start(fs->block_map)) ||
+	    (fs->super->s_blocks_count-1 >
+	     ext2fs_get_block_bitmap_end(fs->block_map))) {
+		printf("PROGRAMMING ERROR: filesystem endpoints (%d, %d)\n\t"
+		       "don't match fs->block_map endpoints (%d, %d).\n",
+		       fs->super->s_first_data_block,
+		       fs->super->s_blocks_count -1,
+		       ext2fs_get_block_bitmap_start(fs->block_map),
+		       ext2fs_get_block_bitmap_end(fs->block_map));
+		fatal_error(0);
+	}
+		       
+		       
 	for (i = fs->super->s_first_data_block;
 	     i < fs->super->s_blocks_count;
 	     i++) {
-		actual = ext2fs_test_block_bitmap(block_found_map, i);
-		bitmap = ext2fs_test_block_bitmap(fs->block_map, i);
+		actual = ext2fs_fast_test_block_bitmap(block_found_map, i);
+		bitmap = ext2fs_fast_test_block_bitmap(fs->block_map, i);
 		
 		if (actual == bitmap)
 			goto do_counts;
@@ -82,7 +109,7 @@
 			 * Block not used, but marked in use in the bitmap.
 			 */
 			if (!preen)
-				printf(" -%lu", i);
+				printf(" -%u", i);
 			if (do_fix)
 				ext2fs_unmark_block_bitmap(fs->block_map,
 							   i);
@@ -91,7 +118,7 @@
 			 * Block used, but not marked in use in the bitmap.
 			 */
 			if (!preen)
-				printf(" +%lu", i);
+				printf(" +%u", i);
 			if (do_fix)
 				ext2fs_mark_block_bitmap(fs->block_map,
 							 i);
@@ -124,7 +151,7 @@
 				do_fix = ask(fix_question, 1);
 			if (!preen)
 				printf("Free blocks count wrong for "
-				       "group %lu (%u, counted=%d).  %s\n", i,
+				       "group %u (%u, counted=%d).  %s\n", i,
 				       fs->group_desc[i].bg_free_blocks_count,
 				       free_array[i], fix_msg[do_fix]);
 			if (do_fix) {
@@ -140,7 +167,7 @@
 			do_fix = ask(fix_question, 1);
 		if (!preen)
 			printf("Free blocks count wrong "
-			       "(%lu, counted=%d).  %s\n",
+			       "(%u, counted=%d).  %s\n",
 			       fs->super->s_free_blocks_count, free_blocks,
 			       fix_msg[do_fix]);
 		if (do_fix) {
@@ -149,6 +176,7 @@
 		} else
 			ext2fs_unmark_valid(fs);
 	}
+	free(free_array);
 }
 			
 static void check_inode_bitmaps(ext2_filsys fs)
@@ -170,9 +198,30 @@
 	dir_array = allocate_memory(fs->group_desc_count * sizeof(int),
 				    "directory count array");
 				     
+	if ((1 < ext2fs_get_inode_bitmap_start(inode_used_map)) ||
+	    (fs->super->s_inodes_count > 
+	     ext2fs_get_inode_bitmap_end(inode_used_map))) {
+		printf("PROGRAMMING ERROR: filesystem inode endpoints (%d, %d)\n\t"
+		       "don't match inode_used_map endpoints (%d, %d).\n",
+		       1, fs->super->s_inodes_count,
+		       ext2fs_get_inode_bitmap_start(inode_used_map),
+		       ext2fs_get_inode_bitmap_end(inode_used_map));
+		fatal_error(0);
+	}
+	if ((1 < ext2fs_get_inode_bitmap_start(fs->inode_map)) ||
+	    (fs->super->s_inodes_count > 
+	     ext2fs_get_inode_bitmap_end(fs->inode_map))) {
+		printf("PROGRAMMING ERROR: filesystem inode endpoints (%d, %d)\n\t"
+		       "don't match fs->inode_map endpoints (%d, %d).\n",
+		       1, fs->super->s_inodes_count,
+		       ext2fs_get_inode_bitmap_start(fs->inode_map),
+		       ext2fs_get_inode_bitmap_end(fs->inode_map));
+		fatal_error(0);
+	}
+
 	for (i = 1; i <= fs->super->s_inodes_count; i++) {
-		actual = ext2fs_test_inode_bitmap(inode_used_map, i);
-		bitmap = ext2fs_test_inode_bitmap(fs->inode_map, i);
+		actual = ext2fs_fast_test_inode_bitmap(inode_used_map, i);
+		bitmap = ext2fs_fast_test_inode_bitmap(fs->inode_map, i);
 		
 		if (actual == bitmap)
 			goto do_counts;
@@ -265,7 +314,7 @@
 			do_fix = ask(fix_question, 1);
 		if (!preen)
 			printf("Free inodes count wrong "
-			       "(%lu, counted=%d).  %s\n",
+			       "(%u, counted=%d).  %s\n",
 			       fs->super->s_free_inodes_count, free_inodes,
 			       fix_msg[do_fix]);
 		if (do_fix) {
@@ -274,6 +323,8 @@
 		} else
 			ext2fs_unmark_valid(fs);
 	}
+	free(free_array);
+	free(dir_array);
 }
 
 static void check_inode_end(ext2_filsys fs)
diff --git a/e2fsck/scantest.c b/e2fsck/scantest.c
index a0b078d..29d1e88 100644
--- a/e2fsck/scantest.c
+++ b/e2fsck/scantest.c
@@ -7,9 +7,13 @@
 #include <ctype.h>
 #include <termios.h>
 #include <time.h>
+#ifdef HAVE_GETOPT_H
 #include <getopt.h>
+#endif
 #include <unistd.h>
+#ifdef HAVE_MNTENT_H
 #include <mntent.h>
+#endif
 #include <sys/ioctl.h>
 #include <malloc.h>
 #include <sys/resource.h>
@@ -25,7 +29,9 @@
 #include <sys/types.h>
 #include <sys/time.h>
 
+#ifdef HAVE_LINUX_FS_H
 #include <linux/fs.h>
+#endif
 #include <linux/ext2_fs.h>
 
 #include "ext2fs/ext2fs.h"
diff --git a/e2fsck/util.c b/e2fsck/util.c
index 3f5447d..9fc22e9 100644
--- a/e2fsck/util.c
+++ b/e2fsck/util.c
@@ -10,10 +10,12 @@
 #include <string.h>
 #include <ctype.h>
 #include <termios.h>
-#include <sys/resource.h>
 
 #include "e2fsck.h"
 
+#include <sys/time.h>
+#include <sys/resource.h>
+
 const char * fix_msg[2] = { "IGNORED", "FIXED" };
 const char * clear_msg[2] = { "IGNORED", "CLEARED" };
 
@@ -51,6 +53,8 @@
 	tcgetattr (0, &termios);
 	tmp = termios;
 	tmp.c_lflag &= ~(ICANON | ECHO);
+	tmp.c_cc[VMIN] = 1;
+	tmp.c_cc[VTIME] = 0;
 	tcsetattr (0, TCSANOW, &tmp);
 
 	if (def == 1)
@@ -152,24 +156,36 @@
 	}
 }
 
-void preenhalt(NOARGS)
+void preenhalt(ext2_filsys fs)
 {
 	if (!preen)
 		return;
 	fprintf(stderr, "\n\n%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n",
 	       device_name);
+	if (fs != NULL) {
+		fs->super->s_state |= EXT2_ERROR_FS;
+		ext2fs_mark_super_dirty(fs);
+		ext2fs_close(fs);
+	}
 	exit(FSCK_UNCORRECTED);
 }
 
 void init_resource_track(struct resource_track *track)
 {
+#ifdef HAVE_GETRUSAGE
 	struct rusage r;
+#endif
 	
 	track->brk_start = sbrk(0);
 	gettimeofday(&track->time_start, 0);
+#ifdef HAVE_GETRUSAGE
 	getrusage(RUSAGE_SELF, &r);
 	track->user_start = r.ru_utime;
 	track->system_start = r.ru_stime;
+#else
+	track->user_start.tv_sec = track->user_start.tv_usec = 0;
+	track->system_start.tv_sec = track->system_start.tv_usec = 0;
+#endif
 }
 
 static __inline__ float timeval_subtract(struct timeval *tv1,
@@ -181,10 +197,13 @@
 
 void print_resource_track(struct resource_track *track)
 {
+#ifdef HAVE_GETRUSAGE
 	struct rusage r;
+#endif
 	struct timeval time_end;
 
 	gettimeofday(&time_end, 0);
+#ifdef HAVE_GETRUSAGE
 	getrusage(RUSAGE_SELF, &r);
 
 	printf("Memory used: %d, elapsed time: %6.3f/%6.3f/%6.3f\n",
@@ -192,6 +211,11 @@
 	       timeval_subtract(&time_end, &track->time_start),
 	       timeval_subtract(&r.ru_utime, &track->user_start),
 	       timeval_subtract(&r.ru_stime, &track->system_start));
+#else
+	printf("Memory used: %d, elapsed time: %6.3f\n",
+	       (int) (((char *) sbrk(0)) - ((char *) track->brk_start)),
+	       timeval_subtract(&time_end, &track->time_start));
+#endif
 }
 
 void e2fsck_read_inode(ext2_filsys fs, unsigned long ino,
@@ -230,15 +254,15 @@
 	 * Only directories, regular files, and some symbolic links
 	 * have valid block entries.
 	 */
-	if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode) &&
-	    !S_ISLNK(inode->i_mode))
+	if (!LINUX_S_ISDIR(inode->i_mode) && !LINUX_S_ISREG(inode->i_mode) &&
+	    !LINUX_S_ISLNK(inode->i_mode))
 		return 0;
 	
 	/*
 	 * If the symbolic link is a "fast symlink", then the symlink
 	 * target is stored in the block entries.
 	 */
-	if (S_ISLNK (inode->i_mode) && inode->i_blocks == 0 &&
+	if (LINUX_S_ISLNK (inode->i_mode) && inode->i_blocks == 0 &&
 	    inode->i_size < EXT2_N_BLOCKS * sizeof (unsigned long))
 		return 0;
 
diff --git a/include/linux/ChangeLog b/include/linux/ChangeLog
new file mode 100644
index 0000000..faa31c6
--- /dev/null
+++ b/include/linux/ChangeLog
@@ -0,0 +1,4 @@
+Mon Sep  4 21:50:12 1995  Remy Card  <card@bbj>
+
+	* ext2_fs.h: Updated to latest version.
+
diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h
new file mode 100644
index 0000000..a443aa2
--- /dev/null
+++ b/include/linux/ext2_fs.h
@@ -0,0 +1,498 @@
+/*
+ *  linux/include/linux/ext2_fs.h
+ *
+ * Copyright (C) 1992, 1993, 1994, 1995
+ * Remy Card (card@masi.ibp.fr)
+ * Laboratoire MASI - Institut Blaise Pascal
+ * Universite Pierre et Marie Curie (Paris VI)
+ *
+ *  from
+ *
+ *  linux/include/linux/minix_fs.h
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+#ifndef _LINUX_EXT2_FS_H
+#define _LINUX_EXT2_FS_H
+
+#include <linux/types.h>
+
+/*
+ * The second extended filesystem constants/structures
+ */
+
+/*
+ * Define EXT2FS_DEBUG to produce debug messages
+ */
+#undef EXT2FS_DEBUG
+
+/*
+ * Define EXT2_PREALLOCATE to preallocate data blocks for expanding files
+ */
+#define EXT2_PREALLOCATE
+
+/*
+ * The second extended file system version
+ */
+#define EXT2FS_DATE		"95/08/09"
+#define EXT2FS_VERSION		"0.5b"
+
+/*
+ * Debug code
+ */
+#ifdef EXT2FS_DEBUG
+#	define ext2_debug(f, a...)	{ \
+					printk ("EXT2-fs DEBUG (%s, %d): %s:", \
+						__FILE__, __LINE__, __FUNCTION__); \
+				  	printk (f, ## a); \
+					}
+#else
+#	define ext2_debug(f, a...)	/**/
+#endif
+
+/*
+ * Special inodes numbers
+ */
+#define	EXT2_BAD_INO		 1	/* Bad blocks inode */
+#define EXT2_ROOT_INO		 2	/* Root inode */
+#define EXT2_ACL_IDX_INO	 3	/* ACL inode */
+#define EXT2_ACL_DATA_INO	 4	/* ACL inode */
+#define EXT2_BOOT_LOADER_INO	 5	/* Boot loader inode */
+#define EXT2_UNDEL_DIR_INO	 6	/* Undelete directory inode */
+#define EXT2_FIRST_INO		11	/* First non reserved inode */
+
+/*
+ * The second extended file system magic number
+ */
+#define EXT2_SUPER_MAGIC	0xEF53
+
+/*
+ * Maximal count of links to a file
+ */
+#define EXT2_LINK_MAX		32000
+
+/*
+ * Macro-instructions used to manage several block sizes
+ */
+#define EXT2_MIN_BLOCK_SIZE		1024
+#define	EXT2_MAX_BLOCK_SIZE		4096
+#define EXT2_MIN_BLOCK_LOG_SIZE		  10
+#ifdef __KERNEL__
+# define EXT2_BLOCK_SIZE(s)		((s)->s_blocksize)
+#else
+# define EXT2_BLOCK_SIZE(s)		(EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
+#endif
+#define EXT2_ACLE_PER_BLOCK(s)		(EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry))
+#define	EXT2_ADDR_PER_BLOCK(s)		(EXT2_BLOCK_SIZE(s) / sizeof (__u32))
+#ifdef __KERNEL__
+# define EXT2_BLOCK_SIZE_BITS(s)	((s)->s_blocksize_bits)
+#else
+# define EXT2_BLOCK_SIZE_BITS(s)	((s)->s_log_block_size + 10)
+#endif
+#define	EXT2_INODES_PER_BLOCK(s)	(EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_inode))
+#ifdef __KERNEL__
+#define	EXT2_ADDR_PER_BLOCK_BITS(s)	((s)->u.ext2_sb.s_addr_per_block_bits)
+#define	EXT2_INODES_PER_BLOCK_BITS(s)	((s)->u.ext2_sb.s_inodes_per_block_bits)
+#endif
+
+/*
+ * Macro-instructions used to manage fragments
+ */
+#define EXT2_MIN_FRAG_SIZE		1024
+#define	EXT2_MAX_FRAG_SIZE		4096
+#define EXT2_MIN_FRAG_LOG_SIZE		  10
+#ifdef __KERNEL__
+# define EXT2_FRAG_SIZE(s)		((s)->u.ext2_sb.s_frag_size)
+# define EXT2_FRAGS_PER_BLOCK(s)	((s)->u.ext2_sb.s_frags_per_block)
+#else
+# define EXT2_FRAG_SIZE(s)		(EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
+# define EXT2_FRAGS_PER_BLOCK(s)	(EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
+#endif
+
+/*
+ * ACL structures
+ */
+struct ext2_acl_header	/* Header of Access Control Lists */
+{
+	__u32	aclh_size;
+	__u32	aclh_file_count;
+	__u32	aclh_acle_count;
+	__u32	aclh_first_acle;
+};
+
+struct ext2_acl_entry	/* Access Control List Entry */
+{
+	__u32	acle_size;
+	__u16	acle_perms;	/* Access permissions */
+	__u16	acle_type;	/* Type of entry */
+	__u16	acle_tag;	/* User or group identity */
+	__u16	acle_pad1;
+	__u32	acle_next;	/* Pointer on next entry for the */
+					/* same inode or on next free entry */
+};
+
+/*
+ * Structure of a blocks group descriptor
+ */
+struct ext2_group_desc
+{
+	__u32	bg_block_bitmap;		/* Blocks bitmap block */
+	__u32	bg_inode_bitmap;		/* Inodes bitmap block */
+	__u32	bg_inode_table;		/* Inodes table block */
+	__u16	bg_free_blocks_count;	/* Free blocks count */
+	__u16	bg_free_inodes_count;	/* Free inodes count */
+	__u16	bg_used_dirs_count;	/* Directories count */
+	__u16	bg_pad;
+	__u32	bg_reserved[3];
+};
+
+/*
+ * Macro-instructions used to manage group descriptors
+ */
+#ifdef __KERNEL__
+# define EXT2_BLOCKS_PER_GROUP(s)	((s)->u.ext2_sb.s_blocks_per_group)
+# define EXT2_DESC_PER_BLOCK(s)		((s)->u.ext2_sb.s_desc_per_block)
+# define EXT2_INODES_PER_GROUP(s)	((s)->u.ext2_sb.s_inodes_per_group)
+# define EXT2_DESC_PER_BLOCK_BITS(s)	((s)->u.ext2_sb.s_desc_per_block_bits)
+#else
+# define EXT2_BLOCKS_PER_GROUP(s)	((s)->s_blocks_per_group)
+# define EXT2_DESC_PER_BLOCK(s)		(EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
+# define EXT2_INODES_PER_GROUP(s)	((s)->s_inodes_per_group)
+#endif
+
+/*
+ * Constants relative to the data blocks
+ */
+#define	EXT2_NDIR_BLOCKS		12
+#define	EXT2_IND_BLOCK			EXT2_NDIR_BLOCKS
+#define	EXT2_DIND_BLOCK			(EXT2_IND_BLOCK + 1)
+#define	EXT2_TIND_BLOCK			(EXT2_DIND_BLOCK + 1)
+#define	EXT2_N_BLOCKS			(EXT2_TIND_BLOCK + 1)
+
+/*
+ * Inode flags
+ */
+#define	EXT2_SECRM_FL			0x00000001 /* Secure deletion */
+#define	EXT2_UNRM_FL			0x00000002 /* Undelete */
+#define	EXT2_COMPR_FL			0x00000004 /* Compress file */
+#define EXT2_SYNC_FL			0x00000008 /* Synchronous updates */
+#define EXT2_IMMUTABLE_FL		0x00000010 /* Immutable file */
+#define EXT2_APPEND_FL			0x00000020 /* writes to file may only append */
+#define EXT2_NODUMP_FL			0x00000040 /* do not dump file */
+
+/*
+ * ioctl commands
+ */
+#define	EXT2_IOC_GETFLAGS		_IOR('f', 1, long)
+#define	EXT2_IOC_SETFLAGS		_IOW('f', 2, long)
+#define	EXT2_IOC_GETVERSION		_IOR('v', 1, long)
+#define	EXT2_IOC_SETVERSION		_IOW('v', 2, long)
+
+/*
+ * Structure of an inode on the disk
+ */
+struct ext2_inode {
+	__u16	i_mode;		/* File mode */
+	__u16	i_uid;		/* Owner Uid */
+	__u32	i_size;		/* Size in bytes */
+	__u32	i_atime;	/* Access time */
+	__u32	i_ctime;	/* Creation time */
+	__u32	i_mtime;	/* Modification time */
+	__u32	i_dtime;	/* Deletion Time */
+	__u16	i_gid;		/* Group Id */
+	__u16	i_links_count;	/* Links count */
+	__u32	i_blocks;	/* Blocks count */
+	__u32	i_flags;	/* File flags */
+	union {
+		struct {
+			__u32  l_i_reserved1;
+		} linux1;
+		struct {
+			__u32  h_i_translator;
+		} hurd1;
+		struct {
+			__u32  m_i_reserved1;
+		} masix1;
+	} osd1;				/* OS dependent 1 */
+	__u32	i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+	__u32	i_version;	/* File version (for NFS) */
+	__u32	i_file_acl;	/* File ACL */
+	__u32	i_dir_acl;	/* Directory ACL */
+	__u32	i_faddr;	/* Fragment address */
+	union {
+		struct {
+			__u8	l_i_frag;	/* Fragment number */
+			__u8	l_i_fsize;	/* Fragment size */
+			__u16	i_pad1;
+			__u32	l_i_reserved2[2];
+		} linux2;
+		struct {
+			__u8	h_i_frag;	/* Fragment number */
+			__u8	h_i_fsize;	/* Fragment size */
+			__u16	h_i_mode_high;
+			__u16	h_i_uid_high;
+			__u16	h_i_gid_high;
+			__u32	h_i_author;
+		} hurd2;
+		struct {
+			__u8	m_i_frag;	/* Fragment number */
+			__u8	m_i_fsize;	/* Fragment size */
+			__u16	m_pad1;
+			__u32	m_i_reserved2[2];
+		} masix2;
+	} osd2;				/* OS dependent 2 */
+};
+
+#if defined(__KERNEL__) || defined(__linux__)
+#define i_reserved1	osd1.linux1.l_i_reserved1
+#define i_frag		osd2.linux2.l_i_frag
+#define i_fsize		osd2.linux2.l_i_fsize
+#define i_reserved2	osd2.linux2.l_i_reserved2
+#endif
+
+#ifdef	__hurd__
+#define i_translator	osd1.hurd1.h_i_translator
+#define i_frag		osd2.hurd2.h_i_frag;
+#define i_fsize		osd2.hurd2.h_i_fsize;
+#define i_uid_high	osd2.hurd2.h_i_uid_high
+#define i_gid_high	osd2.hurd2.h_i_gid_high
+#define i_author	osd2.hurd2.h_i_author
+#endif
+
+#ifdef	__masix__
+#define i_reserved1	osd1.masix1.m_i_reserved1
+#define i_frag		osd2.masix2.m_i_frag
+#define i_fsize		osd2.masix2.m_i_fsize
+#define i_reserved2	osd2.masix2.m_i_reserved2
+#endif
+
+/*
+ * File system states
+ */
+#define	EXT2_VALID_FS			0x0001	/* Unmounted cleanly */
+#define	EXT2_ERROR_FS			0x0002	/* Errors detected */
+
+/*
+ * Mount flags
+ */
+#define EXT2_MOUNT_CHECK_NORMAL		0x0001	/* Do some more checks */
+#define EXT2_MOUNT_CHECK_STRICT		0x0002	/* Do again more checks */
+#define EXT2_MOUNT_CHECK		(EXT2_MOUNT_CHECK_NORMAL | \
+					 EXT2_MOUNT_CHECK_STRICT)
+#define EXT2_MOUNT_GRPID		0x0004	/* Create files with directory's group */
+#define EXT2_MOUNT_DEBUG		0x0008	/* Some debugging messages */
+#define EXT2_MOUNT_ERRORS_CONT		0x0010	/* Continue on errors */
+#define EXT2_MOUNT_ERRORS_RO		0x0020	/* Remount fs ro on errors */
+#define EXT2_MOUNT_ERRORS_PANIC		0x0040	/* Panic on errors */
+#define EXT2_MOUNT_MINIX_DF		0x0080	/* Mimics the Minix statfs */
+
+#define clear_opt(o, opt)		o &= ~EXT2_MOUNT_##opt
+#define set_opt(o, opt)			o |= EXT2_MOUNT_##opt
+#define test_opt(sb, opt)		((sb)->u.ext2_sb.s_mount_opt & \
+					 EXT2_MOUNT_##opt)
+/*
+ * Maximal mount counts between two filesystem checks
+ */
+#define EXT2_DFL_MAX_MNT_COUNT		20	/* Allow 20 mounts */
+#define EXT2_DFL_CHECKINTERVAL		0	/* Don't use interval check */
+
+/*
+ * Behaviour when detecting errors
+ */
+#define EXT2_ERRORS_CONTINUE		1	/* Continue execution */
+#define EXT2_ERRORS_RO			2	/* Remount fs read-only */
+#define EXT2_ERRORS_PANIC		3	/* Panic */
+#define EXT2_ERRORS_DEFAULT		EXT2_ERRORS_CONTINUE
+
+/*
+ * Structure of the super block
+ */
+struct ext2_super_block {
+	__u32	s_inodes_count;		/* Inodes count */
+	__u32	s_blocks_count;		/* Blocks count */
+	__u32	s_r_blocks_count;	/* Reserved blocks count */
+	__u32	s_free_blocks_count;	/* Free blocks count */
+	__u32	s_free_inodes_count;	/* Free inodes count */
+	__u32	s_first_data_block;	/* First Data Block */
+	__u32	s_log_block_size;	/* Block size */
+	__s32	s_log_frag_size;	/* Fragment size */
+	__u32	s_blocks_per_group;	/* # Blocks per group */
+	__u32	s_frags_per_group;	/* # Fragments per group */
+	__u32	s_inodes_per_group;	/* # Inodes per group */
+	__u32	s_mtime;		/* Mount time */
+	__u32	s_wtime;		/* Write time */
+	__u16	s_mnt_count;		/* Mount count */
+	__s16	s_max_mnt_count;	/* Maximal mount count */
+	__u16	s_magic;		/* Magic signature */
+	__u16	s_state;		/* File system state */
+	__u16	s_errors;		/* Behaviour when detecting errors */
+	__u16	s_pad;
+	__u32	s_lastcheck;		/* time of last check */
+	__u32	s_checkinterval;	/* max. time between checks */
+	__u32	s_creator_os;		/* OS */
+	__u32	s_rev_level;		/* Revision level */
+	__u16	s_def_resuid;		/* Default uid for reserved blocks */
+	__u16	s_def_resgid;		/* Default gid for reserved blocks */
+	__u32	s_reserved[235];	/* Padding to the end of the block */
+};
+
+/*
+ * Codes for operating systems
+ */
+#define EXT2_OS_LINUX		0
+#define EXT2_OS_HURD		1
+#define EXT2_OS_MASIX		2
+#define EXT2_OS_FREEBSD		3
+#define EXT2_OS_LITES		4
+
+/*
+ * Revision levels
+ */
+#define EXT2_GOOD_OLD_REV	0	/* The good old (original) format */
+
+#define EXT2_CURRENT_REV	EXT2_GOOD_OLD_REV
+
+/*
+ * Default values for user and/or group using reserved blocks
+ */
+#define	EXT2_DEF_RESUID		0
+#define	EXT2_DEF_RESGID		0
+
+/*
+ * Structure of a directory entry
+ */
+#define EXT2_NAME_LEN 255
+
+struct ext2_dir_entry {
+	__u32	inode;			/* Inode number */
+	__u16	rec_len;		/* Directory entry length */
+	__u16	name_len;		/* Name length */
+	char	name[EXT2_NAME_LEN];	/* File name */
+};
+
+/*
+ * EXT2_DIR_PAD defines the directory entries boundaries
+ *
+ * NOTE: It must be a multiple of 4
+ */
+#define EXT2_DIR_PAD		 	4
+#define EXT2_DIR_ROUND 			(EXT2_DIR_PAD - 1)
+#define EXT2_DIR_REC_LEN(name_len)	(((name_len) + 8 + EXT2_DIR_ROUND) & \
+					 ~EXT2_DIR_ROUND)
+
+#ifdef __KERNEL__
+/*
+ * Function prototypes
+ */
+
+/*
+ * Ok, these declarations are also in <linux/kernel.h> but none of the
+ * ext2 source programs needs to include it so they are duplicated here.
+ */
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
+# define NORET_TYPE    __volatile__
+# define ATTRIB_NORET  /**/
+# define NORET_AND     /**/
+#else
+# define NORET_TYPE    /**/
+# define ATTRIB_NORET  __attribute__((noreturn))
+# define NORET_AND     noreturn,
+#endif
+
+/* acl.c */
+extern int ext2_permission (struct inode *, int);
+
+/* balloc.c */
+extern int ext2_new_block (struct super_block *, unsigned long,
+			   __u32 *, __u32 *);
+extern void ext2_free_blocks (struct super_block *, unsigned long,
+			      unsigned long);
+extern unsigned long ext2_count_free_blocks (struct super_block *);
+extern void ext2_check_blocks_bitmap (struct super_block *);
+
+/* bitmap.c */
+extern unsigned long ext2_count_free (struct buffer_head *, unsigned);
+
+/* dir.c */
+extern int ext2_check_dir_entry (const char *, struct inode *,
+				 struct ext2_dir_entry *, struct buffer_head *,
+				 unsigned long);
+
+/* file.c */
+extern int ext2_read (struct inode *, struct file *, char *, int);
+extern int ext2_write (struct inode *, struct file *, char *, int);
+
+/* fsync.c */
+extern int ext2_sync_file (struct inode *, struct file *);
+
+/* ialloc.c */
+extern struct inode * ext2_new_inode (const struct inode *, int);
+extern void ext2_free_inode (struct inode *);
+extern unsigned long ext2_count_free_inodes (struct super_block *);
+extern void ext2_check_inodes_bitmap (struct super_block *);
+
+/* inode.c */
+extern int ext2_bmap (struct inode *, int);
+
+extern struct buffer_head * ext2_getblk (struct inode *, long, int, int *);
+extern struct buffer_head * ext2_bread (struct inode *, int, int, int *);
+
+extern int ext2_getcluster (struct inode * inode, long block);
+extern void ext2_read_inode (struct inode *);
+extern void ext2_write_inode (struct inode *);
+extern void ext2_put_inode (struct inode *);
+extern int ext2_sync_inode (struct inode *);
+extern void ext2_discard_prealloc (struct inode *);
+
+/* ioctl.c */
+extern int ext2_ioctl (struct inode *, struct file *, unsigned int,
+		       unsigned long);
+
+/* namei.c */
+extern void ext2_release (struct inode *, struct file *);
+extern int ext2_lookup (struct inode *,const char *, int, struct inode **);
+extern int ext2_create (struct inode *,const char *, int, int,
+			struct inode **);
+extern int ext2_mkdir (struct inode *, const char *, int, int);
+extern int ext2_rmdir (struct inode *, const char *, int);
+extern int ext2_unlink (struct inode *, const char *, int);
+extern int ext2_symlink (struct inode *, const char *, int, const char *);
+extern int ext2_link (struct inode *, struct inode *, const char *, int);
+extern int ext2_mknod (struct inode *, const char *, int, int, int);
+extern int ext2_rename (struct inode *, const char *, int,
+			struct inode *, const char *, int);
+
+/* super.c */
+extern void ext2_error (struct super_block *, const char *, const char *, ...)
+	__attribute__ ((format (printf, 3, 4)));
+extern NORET_TYPE void ext2_panic (struct super_block *, const char *,
+				   const char *, ...)
+	__attribute__ ((NORET_AND format (printf, 3, 4)));
+extern void ext2_warning (struct super_block *, const char *, const char *, ...)
+	__attribute__ ((format (printf, 3, 4)));
+extern void ext2_put_super (struct super_block *);
+extern void ext2_write_super (struct super_block *);
+extern int ext2_remount (struct super_block *, int *, char *);
+extern struct super_block * ext2_read_super (struct super_block *,void *,int);
+extern void ext2_statfs (struct super_block *, struct statfs *, int);
+
+/* truncate.c */
+extern void ext2_truncate (struct inode *);
+
+/*
+ * Inodes and files operations
+ */
+
+/* dir.c */
+extern struct inode_operations ext2_dir_inode_operations;
+
+/* file.c */
+extern struct inode_operations ext2_file_inode_operations;
+
+/* symlink.c */
+extern struct inode_operations ext2_symlink_inode_operations;
+
+#endif	/* __KERNEL__ */
+
+#endif	/* _LINUX_EXT2_FS_H */
diff --git a/include/linux/types.h.in b/include/linux/types.h.in
new file mode 100644
index 0000000..4353b5e
--- /dev/null
+++ b/include/linux/types.h.in
@@ -0,0 +1,30 @@
+#ifndef _LINUX_TYPES_H
+#define _LINUX_TYPES_H
+
+typedef unsigned char __u8;
+typedef signed char __s8;
+
+#if (@SIZEOF_INT@ == 2)
+typedef	int		__s16;
+typedef	unsigned int	__u16;
+#elif (@SIZEOF_SHORT@ == 2)
+typedef	short		__s16;
+typedef	unsigned short	__u16;
+#else
+  ?==error: undefined 16 bit type
+#endif
+
+#if (@SIZEOF_LONG@ == 4)
+typedef	long		__s32;
+typedef	unsigned long	__u32;
+#elif (@SIZEOF_INT@ == 4)
+typedef	int		__s32;
+typedef	unsigned int	__u32;
+#elif (@SIZEOF_SHORT@ == 4)
+typedef	short		__s32;
+typedef	unsigned short	__u32;
+#else
+ ?== error: undefined 32 bit type
+#endif
+
+#endif /* LINUX_TYPES_H */
diff --git a/install-sh b/install-sh
new file mode 100644
index 0000000..89fc9b0
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd="$stripprog"
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "install:	no input file specified"
+	exit 1
+else
+	true
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+	
+	if [ -d $dst ]; then
+		instcmd=:
+	else
+		instcmd=mkdir
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f $src -o -d $src ]
+	then
+		true
+	else
+		echo "install:  $src does not exist"
+		exit 1
+	fi
+	
+	if [ x"$dst" = x ]
+	then
+		echo "install:	no destination specified"
+		exit 1
+	else
+		true
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d $dst ]
+	then
+		dst="$dst"/`basename $src`
+	else
+		true
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='	
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp="${pathcomp}${1}"
+	shift
+
+	if [ ! -d "${pathcomp}" ] ;
+        then
+		$mkdirprog "${pathcomp}"
+	else
+		true
+	fi
+
+	pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd $dst &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		dstfile=`basename $dst $transformbasename | 
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		true
+	fi
+
+# Make a temp file name in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd $src $dsttmp &&
+
+	trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+	$doit $rmcmd -f $dstdir/$dstfile &&
+	$doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/lib/ChangeLog b/lib/ChangeLog
new file mode 100644
index 0000000..14a8f19
--- /dev/null
+++ b/lib/ChangeLog
@@ -0,0 +1,28 @@
+Mon Sep  4 21:42:46 1995  Remy Card  <card@bbj>
+
+	* Makefile.bsd-lib: New file containing support for BSD shared
+		libraries.
+
+Sat Aug  5 11:43:05 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* Makefile.dll-lib: Added new target install-shlibs, which just
+		installs the shared libraries.
+
+	* Makefile.elf-lib: Added new target install-shlibs, which just
+		installs the shared libraries.
+
+Tue Jul 18 21:24:13 1995    <tytso@rsx-11.mit.edu>
+
+	* Makefile.dll-lib (jump): For each of the libraries jump/jump.*
+	        files are now in in dll/jump.*; now the subdirs target
+	        takes care of creating the jump directory, and then copy
+	        the jump.* files from the dll directory to the jump
+	        directory.  This allows dll libraries to be built where
+		the build directory is not equal to the source directory.
+
+Tue Jul 11 22:05:56 1995    <tytso@rsx-11.mit.edu>
+
+	* Makefile.checker,Makefile.elf-lib,Makefile.dll-lib,
+		Makefile.profile: Add rule to mkdir the appropriate object
+		subdirectory (checker, elfshared, jump, profiled, etc.)
+
diff --git a/lib/Makefile.bsd-lib b/lib/Makefile.bsd-lib
new file mode 100644
index 0000000..e0227a2
--- /dev/null
+++ b/lib/Makefile.bsd-lib
@@ -0,0 +1,37 @@
+#
+# This is a Makefile stub which handles the creation of Linux BSD shared
+# libraries.
+#
+# In order to use this stub, the following makefile variables must be defined.
+# 
+# BSDLIB_VERSION = 1.0
+# BSDLIB_IMAGE = libce
+# BSDLIB_MYDIR = et
+# BSDLIB_INSTALL_DIR = $(SHLIBDIR)
+#
+
+all:: pic image
+
+subdirs:: pic
+
+pic:
+	mkdir pic
+
+BSD_LIB = $(BSDLIB_IMAGE).so.$(BSDLIB_VERSION)
+
+image:		$(BSD_LIB)
+
+$(BSD_LIB): $(OBJS)
+	(cd pic; ld -Bshareable -o $(BSD_LIB) $(OBJS))
+	$(MV) pic/$(BSD_LIB) .
+	$(RM) -f ../$(BSD_LIB)
+	$(LN) $(BSD_LIB) ../$(BSD_LIB)
+
+install-shlibs install:: $(BSD_LIB)
+	$(INSTALL_PROGRAM) $(BSD_LIB) $(BSDLIB_INSTALL_DIR)/$(BSD_LIB)
+	-ldconfig
+
+clean::
+	$(RM) -rf pic
+	$(RM) -f $(BSD_LIB)
+	$(RM) -f ../$(BSD_LIB)
diff --git a/lib/Makefile.checker b/lib/Makefile.checker
new file mode 100644
index 0000000..6064494
--- /dev/null
+++ b/lib/Makefile.checker
@@ -0,0 +1,16 @@
+all:: checker $(LIBRARY)_chk.a
+
+subdirs:: checker
+
+checker:
+	mkdir checker
+
+clean::
+	$(RM) -rf checker
+
+$(LIBRARY)_chk.a: $(OBJS)
+	@(test -r $@ && $(RM) -f $@.bak && $(MV) $@ $@.bak)
+	(cd checker; $(ARUPD) $@ $(OBJS))
+	-$(RANLIB) $@
+	$(RM) -f ../$@
+	$(LN) $@ ../$@
diff --git a/lib/Makefile.dll-lib b/lib/Makefile.dll-lib
index dee8e62..94864bf 100644
--- a/lib/Makefile.dll-lib
+++ b/lib/Makefile.dll-lib
@@ -14,7 +14,31 @@
 # DLL_INSTALL_DIR = $(SHLIBDIR)
 #
 
-all:: image stubs
+all:: jump image stubs
+
+subdirs:: jump jump/jump.funcs jump/jump.ignore jump/jump.import \
+	jump/jump.params jump/jump.undefs jump/jump.vars
+
+jump:
+	mkdir jump
+
+jump/jump.funcs: dll/jump.funcs
+	$(CP) $< $@
+
+jump/jump.ignore: dll/jump.ignore
+	$(CP) $< $@
+
+jump/jump.import: dll/jump.import
+	$(CP) $< $@
+
+jump/jump.params: dll/jump.params
+	$(CP) $< $@
+
+jump/jump.undefs: dll/jump.undefs
+	$(CP) $< $@
+
+jump/jump.vars: dll/jump.vars
+	$(CP) $< $@
 
 #
 # This is a horrible hack to try to find libgcc.a  --- the DLL documentation
@@ -37,34 +61,31 @@
 		$(DLL_BIN)/mkimage -l $(DLL_IMAGE) -v $(DLL_VERSION) \
 		-a $(DLL_ADDRESS) -j $(DLL_JUMPSIZE) -g $(DLL_GOTSIZE) -- \
 		$(OBJS) -lc $(DLL_LIBS) $(DLL_LIBGCC) -lc)
-	mv jump/$(DLL_IMAGE).so.$(DLL_VERSION) .
+	$(MV) jump/$(DLL_IMAGE).so.$(DLL_VERSION) .
 
 $(DLL_STUB).sa:
 	(cd jump; export JUMP_DIR=`pwd`; \
 		$(DLL_BIN)/mkstubs -l $(DLL_IMAGE) -v $(DLL_VERSION) \
 		-a $(DLL_ADDRESS) -j $(DLL_JUMPSIZE) -g $(DLL_GOTSIZE) \
 		-- $(DLL_STUB))
-	mv jump/$(DLL_STUB).sa .
-	@$(RM) ../$@
-	@$(LN) $(DLL_MYDIR)/$@ ../$@
+	$(MV) jump/$(DLL_STUB).sa .
+	$(RM) -f ../$@
+	$(LN) $@ ../$@
 
-install:: $(DLL_IMAGE).so.$(DLL_VERSION)
-	$(INSTALLBIN) $(DLL_IMAGE).so.$(DLL_VERSION) \
-		$(DLL_INSTALL_DIR)/$(DLL_IMAGE).so.$(DLL_VERSION)
+installdirs::
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(DLL_INSTALL_DIR)
+
+install-shlibs install:: $(DLL_IMAGE).so.$(DLL_VERSION) installdirs
+	$(INSTALL_PROGRAM) $(DLL_IMAGE).so.$(DLL_VERSION) \
+		$(DESTDIR)$(DLL_INSTALL_DIR)/$(DLL_IMAGE).so.$(DLL_VERSION)
 	-ldconfig
 
-install-libs:: $(DLL_STUB).sa
-	$(INSTALLLIB) $(DLL_STUB).sa $(LIBDIR)/$(DLL_STUB).sa
-	$(CHMOD) 644 $(LIBDIR)/$(DLL_STUB).sa
-	$(RANLIB) $(LIBDIR)/$(DLL_STUB).sa
-	$(CHMOD) $(LIBMODE) $(LIBDIR)/$(DLL_STUB).sa
-
-install-tree:: $(DLL_IMAGE).so.$(DLL_VERSION)
-	rm -f ../../shlibs/$(DLL_IMAGE).so.$(DLL_VERSION)
-	cp $(DLL_IMAGE).so.$(DLL_VERSION) ../../shlibs
-	strip ../../shlibs/$(DLL_IMAGE).so.$(DLL_VERSION)
-	chmod 555 ../../shlibs/$(DLL_IMAGE).so.$(DLL_VERSION)
+install:: $(DLL_STUB).sa
+	$(INSTALL_DATA) $(DLL_STUB).sa $(DESTDIR)$(ulibdir)/$(DLL_STUB).sa
+	$(CHMOD) 644 $(DESTDIR)$(ulibdir)/$(DLL_STUB).sa
+	$(RANLIB) $(DESTDIR)$(ulibdir)/$(DLL_STUB).sa
+	$(CHMOD) $(LIBMODE) $(DESTDIR)$(ulibdir)/$(DLL_STUB).sa
 
 clean::
-	(cd jump; $(RM) *~ *.o *.s jump.log size.nm)
-	$(RM) ../$(DLL_STUB).sa $(DLL_STUB).sa $(DLL_IMAGE).so.$(DLL_VERSION)
+	$(RM) -f ../$(DLL_STUB).sa $(DLL_STUB).sa $(DLL_IMAGE).so.$(DLL_VERSION)
+	$(RM) -rf jump
diff --git a/lib/Makefile.elf-lib b/lib/Makefile.elf-lib
new file mode 100644
index 0000000..10051dd
--- /dev/null
+++ b/lib/Makefile.elf-lib
@@ -0,0 +1,41 @@
+#
+# This is a Makefile stub which handles the creation of Linux ELF shared
+# libraries.
+#
+# In order to use this stub, the following makefile variables must be defined.
+# 
+# ELF_VERSION = 1.0
+# ELF_IMAGE = libce
+# ELF_MYDIR = et
+# ELF_INSTALL_DIR = $(SHLIBDIR)
+#
+
+all:: elfshared image
+
+subdirs:: elfshared
+
+elfshared:
+	mkdir elfshared
+
+ELF_LIB = $(ELF_IMAGE).so.$(ELF_VERSION)
+
+image:		$(ELF_LIB)
+
+$(ELF_LIB): $(OBJS)
+	(cd elfshared; $(CC) --shared -o $(ELF_LIB) $(OBJS))
+	$(MV) elfshared/$(ELF_LIB) .
+	$(RM) -f ../$(ELF_LIB) ../$(ELF_IMAGE).so
+	$(LN) $(ELF_LIB) ../$(ELF_LIB)
+	$(LN) ../$(ELF_LIB) ../$(ELF_IMAGE).so
+
+installdirs::
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(ELF_INSTALL_DIR)
+
+install-shlibs install:: $(ELF_LIB) installdirs
+	$(INSTALL_PROGRAM) $(ELF_LIB) $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_LIB)
+	-ldconfig
+
+clean::
+	$(RM) -rf elfshared
+	$(RM) -f $(ELF_LIB)
+	$(RM) -f ../$(ELF_LIB) ../$(ELF_IMAGE).so
diff --git a/lib/Makefile.library b/lib/Makefile.library
new file mode 100644
index 0000000..2ea95c1
--- /dev/null
+++ b/lib/Makefile.library
@@ -0,0 +1,13 @@
+all:: subdirs $(LIBRARY).a
+
+install-shlibs::
+
+subdirs::
+
+$(LIBRARY).a: $(OBJS)
+	(if test -r $@; then $(RM) -f $@.bak && $(MV) $@ $@.bak; fi)
+	$(ARUPD) $@ $(OBJS)
+	-$(RANLIB) $@
+	$(RM) -f ../$@
+	$(LN) $@ ../$@
+
diff --git a/lib/Makefile.profile b/lib/Makefile.profile
new file mode 100644
index 0000000..8cb197a
--- /dev/null
+++ b/lib/Makefile.profile
@@ -0,0 +1,16 @@
+all:: profiled $(LIBRARY)_p.a
+
+subdirs:: profiled
+
+profiled:
+	mkdir profiled
+
+clean::
+	$(RM) -rf profiled
+
+$(LIBRARY)_p.a: $(OBJS)
+	(if test -r $@; then $(RM) -f $@.bak && $(MV) $@ $@.bak; fi)
+	(cd profiled; $(ARUPD) ../$@ $(OBJS))
+	-$(RANLIB) $@
+	$(RM) -f ../$@
+	$(LN) $@ ../$@
diff --git a/lib/e2p/.depend b/lib/e2p/.depend
index f3bd916..0ba793d 100644
--- a/lib/e2p/.depend
+++ b/lib/e2p/.depend
@@ -1,86 +1,88 @@
-fgetflags.o : fgetflags.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/unistd.h /usr/include/posix_opt.h \
-  /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
+fgetflags.o : ./fgetflags.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/linux/errno.h /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/include/confname.h /usr/include/sys/types.h \
+  /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/fcntl.h /usr/include/linux/fcntl.h \
   /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \
-  /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
+  /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
   /usr/include/linux/dirent.h /usr/include/posix1_lim.h /usr/include/stdio.h /usr/include/libio.h \
   /usr/include/_G_config.h 
-fgetversion.o : fgetversion.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/unistd.h /usr/include/posix_opt.h \
+fgetversion.o : ./fgetversion.c /usr/include/errno.h /usr/include/features.h \
+  /usr/include/sys/cdefs.h /usr/include/linux/errno.h /usr/include/unistd.h /usr/include/posix_opt.h \
   /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
-  /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \
-  /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/types.h /usr/include/fcntl.h /usr/include/linux/fcntl.h /usr/include/sys/ioctl.h \
+  /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \
+  /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
   /usr/include/linux/dirent.h /usr/include/posix1_lim.h /usr/include/stdio.h /usr/include/libio.h \
   /usr/include/_G_config.h 
-fsetflags.o : fsetflags.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/unistd.h /usr/include/posix_opt.h \
-  /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
+fsetflags.o : ./fsetflags.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/linux/errno.h /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h /usr/include/confname.h /usr/include/sys/types.h \
+  /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/fcntl.h /usr/include/linux/fcntl.h \
   /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \
-  /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
+  /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
   /usr/include/linux/dirent.h /usr/include/posix1_lim.h /usr/include/stdio.h /usr/include/libio.h \
   /usr/include/_G_config.h 
-fsetversion.o : fsetversion.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/unistd.h /usr/include/posix_opt.h \
+fsetversion.o : ./fsetversion.c /usr/include/errno.h /usr/include/features.h \
+  /usr/include/sys/cdefs.h /usr/include/linux/errno.h /usr/include/unistd.h /usr/include/posix_opt.h \
   /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
-  /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \
-  /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/types.h /usr/include/fcntl.h /usr/include/linux/fcntl.h /usr/include/sys/ioctl.h \
+  /usr/include/linux/ioctl.h /usr/include/termios.h /usr/include/linux/termios.h \
+  /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
   /usr/include/linux/dirent.h /usr/include/posix1_lim.h /usr/include/stdio.h /usr/include/libio.h \
   /usr/include/_G_config.h 
-getflags.o : getflags.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
+getflags.o : ./getflags.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/linux/errno.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \
   /usr/include/termios.h /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
-  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h \
+  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h \
   /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \
   /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h 
-getversion.o : getversion.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
+getversion.o : ./getversion.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/linux/errno.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \
   /usr/include/termios.h /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
-  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h \
+  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h \
   /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \
   /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h 
-iod.o : iod.c /usr/include/dirent.h /usr/include/features.h /usr/include/sys/cdefs.h \
+iod.o : ./iod.c ./e2p.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/types.h /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 \
-  e2p.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/linux/ext2_fs.h 
-ls.o : ls.c /usr/include/grp.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/gnu/types.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/pwd.h /usr/include/time.h \
-  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
-  /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h /usr/include/linux/limits.h \
-  /usr/include/linux/dirent.h /usr/include/posix1_lim.h 
-pe.o : pe.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/linux/ext2_fs.h 
+ls.o : ./ls.c /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
+  /usr/include/grp.h /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/gnu/types.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/pwd.h /usr/include/time.h /usr/include/linux/ext2_fs.h ./e2p.h \
+  /usr/include/dirent.h /usr/include/linux/limits.h /usr/include/linux/dirent.h \
+  /usr/include/posix1_lim.h 
+pe.o : ./pe.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/linux/ext2_fs.h /usr/include/linux/types.h \
-  /usr/include/asm/types.h e2p.h /usr/include/dirent.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/asm/types.h ./e2p.h /usr/include/sys/types.h /usr/include/dirent.h \
+  /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h 
-pf.o : pf.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+pf.o : ./pf.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/linux/ext2_fs.h /usr/include/linux/types.h \
-  /usr/include/asm/types.h e2p.h /usr/include/dirent.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/asm/types.h ./e2p.h /usr/include/sys/types.h /usr/include/dirent.h \
+  /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h 
-ps.o : ps.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+ps.o : ./ps.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/linux/ext2_fs.h /usr/include/linux/types.h \
-  /usr/include/asm/types.h e2p.h /usr/include/dirent.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/asm/types.h ./e2p.h /usr/include/sys/types.h /usr/include/dirent.h \
+  /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h 
-setflags.o : setflags.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
+setflags.o : ./setflags.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/linux/errno.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \
   /usr/include/termios.h /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
-  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h \
+  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h \
   /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \
   /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h 
-setversion.o : setversion.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
+setversion.o : ./setversion.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/linux/errno.h /usr/include/sys/ioctl.h /usr/include/linux/ioctl.h \
   /usr/include/termios.h /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
-  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h e2p.h /usr/include/dirent.h \
+  /usr/include/linux/termios.h /usr/include/linux/ext2_fs.h ./e2p.h /usr/include/dirent.h \
   /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
   /usr/include/linux/limits.h /usr/include/linux/dirent.h /usr/include/posix1_lim.h \
   /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h 
diff --git a/lib/e2p/ChangeLog b/lib/e2p/ChangeLog
index f96ffa8..228b472 100644
--- a/lib/e2p/ChangeLog
+++ b/lib/e2p/ChangeLog
@@ -1,3 +1,61 @@
+Fri Oct 27 18:07:48 1995    <tytso@rsts-11.mit.edu>
+
+	* iod.c (iterate_on_dir): Don't assume that d->reclen is the size
+		of the dirent structure; it isn't under Linux.
+
+Mon Sep  4 21:43:53 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for BSD shared libraries.
+
+Fri Aug 11 08:36:40 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* setflags.c: #include <sys/types.h> before including <sys/stat.h>
+
+Sat Aug 12 03:11:45 1995  Remy Card  <card@bbj>
+
+	* Makefile.in (install): Install static libraries in $(ulibdir)
+		(/usr/lib on Linux) instead of $(libdir) (/lib on Linux).
+
+Sat Aug  5 11:43:36 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* Makefile.in (DLL_INSTALL_DIR, ELF_INSTALL_DIR): Set the
+		installation directories correctly.
+
+Thu Jun 15 23:41:20 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for ELF shared libraries.
+
+Mon Jun 12 08:34:44 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* e2p.h: Move <direct.h> after <stdio.h>
+
+Thu Jun  8 12:47:04 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* iod.c (iterate_on_dir): If struct dirent has a d_namlen field,
+	assume that actual dirent entries may be larger than the structure
+	(by the name field), and take extra care deal with this case.
+	This code assumes that d_reclen is a valid dirent field.
+	Also, don't include <dirent.h>, as e2p.h already does.
+
+	* fgetversion.c (fgetversion): Only use the ext2 ioctl if it
+	doesn't cause a compile-time barf, otherwise just return EOPNOTSUPP.
+	* getversion.c (getversion): Ditto.
+	* fsetversion.c (fsetversion): Ditto.
+	* setversion.c (setversion): Ditto.
+	* fsetflags.c (fsetflags): Use chflags instead of the ext2 ioctl
+	if possible, and otherwise only use the ioctl if it doesn't barf.
+	* setflags.c (setflags): Ditto (with fchflags).
+	* fgetflags.c (fgetflags): Use the stat st_flags field instead of
+	the ext2 ioctl if possible, and otherwise only use the ioctl if it
+	doesn't barf.
+	* getflags.c (getflags): Ditto.
+
+	* e2p.h: Include <sys/types.h>, as some <dirent.h>s need it.
+	* ls.c: Move the include of <sys/types.h> to where <grp.h> can see it.
+
+	* Makefile.in: Rewritten to conform to GNU coding standards and
+	support separate compilation directories.
+
 Mon Nov  7 21:59:12 1994  Remy Card  <card@bbj>
 
 	* ls.c (list_super): List the new fields s_def_resuid and
diff --git a/lib/e2p/MAKELOG b/lib/e2p/MAKELOG
new file mode 100644
index 0000000..27e4420
--- /dev/null
+++ b/lib/e2p/MAKELOG
@@ -0,0 +1,181 @@
+gcc -O2 -fomit-frame-pointer  -I.. -c pe.c
+In file included from pe.c:19:
+/usr/include/linux/ext2_fs.h:127: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:127: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:128: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:129: parse error before `aclh_acle_count'
+/usr/include/linux/ext2_fs.h:129: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:130: parse error before `aclh_first_acle'
+/usr/include/linux/ext2_fs.h:130: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:135: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:135: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:136: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:137: parse error before `acle_type'
+/usr/include/linux/ext2_fs.h:137: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:138: parse error before `acle_tag'
+/usr/include/linux/ext2_fs.h:138: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:139: parse error before `acle_pad1'
+/usr/include/linux/ext2_fs.h:139: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:140: parse error before `acle_next'
+/usr/include/linux/ext2_fs.h:140: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:149: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:149: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:150: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:151: parse error before `bg_inode_table'
+/usr/include/linux/ext2_fs.h:151: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:152: parse error before `bg_free_blocks_count'
+/usr/include/linux/ext2_fs.h:152: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:153: parse error before `bg_free_inodes_count'
+/usr/include/linux/ext2_fs.h:153: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:158: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:158: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:159: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:160: parse error before `bg_inode_table'
+/usr/include/linux/ext2_fs.h:160: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:161: parse error before `bg_free_blocks_count'
+/usr/include/linux/ext2_fs.h:161: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:162: parse error before `bg_free_inodes_count'
+/usr/include/linux/ext2_fs.h:162: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:163: parse error before `bg_used_dirs_count'
+/usr/include/linux/ext2_fs.h:163: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:164: parse error before `bg_pad'
+/usr/include/linux/ext2_fs.h:164: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:165: parse error before `bg_reserved'
+/usr/include/linux/ext2_fs.h:165: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:166: parse error before `}'
+/usr/include/linux/ext2_fs.h:213: parse error before `__u16'
+/usr/include/linux/ext2_fs.h:213: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:214: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:215: parse error before `i_size'
+/usr/include/linux/ext2_fs.h:215: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:216: parse error before `i_atime'
+/usr/include/linux/ext2_fs.h:216: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:217: parse error before `i_ctime'
+/usr/include/linux/ext2_fs.h:217: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:218: parse error before `i_mtime'
+/usr/include/linux/ext2_fs.h:218: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:219: parse error before `i_dtime'
+/usr/include/linux/ext2_fs.h:219: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:220: parse error before `i_gid'
+/usr/include/linux/ext2_fs.h:220: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:221: parse error before `i_links_count'
+/usr/include/linux/ext2_fs.h:221: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:222: parse error before `i_blocks'
+/usr/include/linux/ext2_fs.h:222: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:223: parse error before `i_flags'
+/usr/include/linux/ext2_fs.h:223: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:226: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:226: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:226: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:227: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:229: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:229: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:230: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:232: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:232: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:233: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:234: parse error before `}'
+/usr/include/linux/ext2_fs.h:234: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:235: parse error before `i_block'
+/usr/include/linux/ext2_fs.h:235: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:236: parse error before `i_version'
+/usr/include/linux/ext2_fs.h:236: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:237: parse error before `i_file_acl'
+/usr/include/linux/ext2_fs.h:237: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:238: parse error before `i_dir_acl'
+/usr/include/linux/ext2_fs.h:238: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:239: parse error before `i_faddr'
+/usr/include/linux/ext2_fs.h:239: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:242: parse error before `__u8'
+/usr/include/linux/ext2_fs.h:242: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:242: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:243: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:244: parse error before `i_pad1'
+/usr/include/linux/ext2_fs.h:244: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:245: parse error before `l_i_reserved2'
+/usr/include/linux/ext2_fs.h:245: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:246: parse error before `}'
+/usr/include/linux/ext2_fs.h:246: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:248: parse error before `__u8'
+/usr/include/linux/ext2_fs.h:248: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:249: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:250: parse error before `h_i_mode_high'
+/usr/include/linux/ext2_fs.h:250: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:251: parse error before `h_i_uid_high'
+/usr/include/linux/ext2_fs.h:251: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:252: parse error before `h_i_gid_high'
+/usr/include/linux/ext2_fs.h:252: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:253: parse error before `h_i_author'
+/usr/include/linux/ext2_fs.h:253: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:254: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:256: parse error before `__u8'
+/usr/include/linux/ext2_fs.h:256: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:257: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:258: parse error before `m_pad1'
+/usr/include/linux/ext2_fs.h:258: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:259: parse error before `m_i_reserved2'
+/usr/include/linux/ext2_fs.h:259: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:260: parse error before `}'
+/usr/include/linux/ext2_fs.h:260: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:261: parse error before `}'
+/usr/include/linux/ext2_fs.h:261: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:262: parse error before `}'
+/usr/include/linux/ext2_fs.h:329: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:329: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:330: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:331: parse error before `s_r_blocks_count'
+/usr/include/linux/ext2_fs.h:331: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:332: parse error before `s_free_blocks_count'
+/usr/include/linux/ext2_fs.h:332: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:333: parse error before `s_free_inodes_count'
+/usr/include/linux/ext2_fs.h:333: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:334: parse error before `s_first_data_block'
+/usr/include/linux/ext2_fs.h:334: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:335: parse error before `s_log_block_size'
+/usr/include/linux/ext2_fs.h:335: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:336: parse error before `s_log_frag_size'
+/usr/include/linux/ext2_fs.h:336: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:337: parse error before `s_blocks_per_group'
+/usr/include/linux/ext2_fs.h:337: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:338: parse error before `s_frags_per_group'
+/usr/include/linux/ext2_fs.h:338: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:339: parse error before `s_inodes_per_group'
+/usr/include/linux/ext2_fs.h:339: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:340: parse error before `s_mtime'
+/usr/include/linux/ext2_fs.h:340: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:341: parse error before `s_wtime'
+/usr/include/linux/ext2_fs.h:341: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:342: parse error before `s_mnt_count'
+/usr/include/linux/ext2_fs.h:342: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:343: parse error before `s_max_mnt_count'
+/usr/include/linux/ext2_fs.h:343: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:344: parse error before `s_magic'
+/usr/include/linux/ext2_fs.h:344: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:345: parse error before `s_state'
+/usr/include/linux/ext2_fs.h:345: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:346: parse error before `s_errors'
+/usr/include/linux/ext2_fs.h:346: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:347: parse error before `s_pad'
+/usr/include/linux/ext2_fs.h:347: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:348: parse error before `s_lastcheck'
+/usr/include/linux/ext2_fs.h:348: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:349: parse error before `s_checkinterval'
+/usr/include/linux/ext2_fs.h:349: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:350: parse error before `s_creator_os'
+/usr/include/linux/ext2_fs.h:350: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:351: parse error before `s_rev_level'
+/usr/include/linux/ext2_fs.h:351: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:352: parse error before `s_def_resuid'
+/usr/include/linux/ext2_fs.h:352: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:353: parse error before `s_def_resgid'
+/usr/include/linux/ext2_fs.h:353: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:354: parse error before `s_reserved'
+/usr/include/linux/ext2_fs.h:354: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:355: parse error before `}'
+/usr/include/linux/ext2_fs.h:372: parse error before `__u32'
+/usr/include/linux/ext2_fs.h:372: warning: no semicolon at end of struct or union
+/usr/include/linux/ext2_fs.h:373: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:374: parse error before `name_len'
+/usr/include/linux/ext2_fs.h:374: warning: data definition has no type or storage class
+/usr/include/linux/ext2_fs.h:376: parse error before `}'
+make: *** [pe.o] Error 1
diff --git a/lib/e2p/Makefile b/lib/e2p/Makefile
deleted file mode 100644
index 8ade7fa..0000000
--- a/lib/e2p/Makefile
+++ /dev/null
@@ -1,98 +0,0 @@
-# Makefile for the second extended file system utility functions
-#
-# Copyright (C) 1993 Remy Card (card@masi.ibp.fr)
-#
-# This file can be redistributed under the terms of the GNU General
-# Public License
-
-all::
-
-include ../../MCONFIG
-
-CFLAGS_NO=	$(WFLAGS) -I..
-CFLAGS=		$(OPT) $(CFLAGS_NO)
-LDFLAGS=	$(OPT)
-
-RM=rm -f
-MV=mv
-LN=ln -s
-
-OBJS=		fgetflags.o fsetflags.o fgetversion.o fsetversion.o \
-		getflags.o getversion.o iod.o ls.o pe.o pf.o ps.o \
-		setflags.o setversion.o
-
-ifdef BUILD_DLL_SHLIBS
-DLL_ADDRESS = 0x66980000
-DLL_JUMPSIZE = 0x1000
-DLL_GOTSIZE  = 0x1000
-DLL_VERSION = 1.0
-DLL_IMAGE = libe2p
-DLL_STUB = libe2p
-DLL_MYDIR = e2p
-DLL_INSTALL_DIR = $(SHLIBDIR)
-
-include ../Makefile.dll-lib
-endif
-
-.c.o:
-	$(CC) $(CFLAGS) -c $*.c
-ifdef BUILD_PROFILE_LIBS
-	$(CC) $(CFLAGS_NO) -pg -o profiled/$*.o -c $*.c
-endif
-ifdef BUILD_DLL_SHLIBS
-	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
-		-o jump/$*.o -c $*.c)
-endif
-#	$(CC) $(CFLAGS_NO) -checker -g -o checker/$*.o -c $*.c
- 
-all:: libe2p.a
-
-ifdef BUILD_PROFILE_LIBS
-all:: libe2p_p.a
-endif
-
-libe2p.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	$(ARCHIVE) $@ $(OBJS)
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) e2p/$@ ../$@
-
-libe2p_p.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	(cd profiled; $(ARCHIVE) ../$@ $(OBJS))
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) e2p/$@ ../$@
-
-libe2p_chk.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	(cd checker; $(ARCHIVE) ../$@ $(OBJS))
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) e2p/$@ ../$@
-
-install::
-
-install-libs::
-	$(INSTALLLIB) libe2p.a $(LIBDIR)/libe2p.a
-	$(CHMOD) 644 $(LIBDIR)/libe2p.a
-	$(RANLIB) $(LIBDIR)/libe2p.a
-	$(CHMOD) $(LIBMODE) $(LIBDIR)/libe2p.a
-
-install-tree::
-
-clean::
-	rm -f \#* *.s *.o *.a *~ *.bak core profiled/* checker/*
-	rm -f ../libe2p.a ../libe2p_p.a
-
-really-clean:: clean
-	rm -f .depend
-
-dep depend .depend:
-	$(CC) -M $(CFLAGS) *.c >.depend
-
-include .depend
diff --git a/lib/e2p/Makefile.in b/lib/e2p/Makefile.in
new file mode 100644
index 0000000..2e8da28
--- /dev/null
+++ b/lib/e2p/Makefile.in
@@ -0,0 +1,129 @@
+# Makefile for the second extended file system utility functions
+#
+# Copyright (C) 1993 Remy Card (card@masi.ibp.fr)
+#
+# This file can be redistributed under the terms of the GNU General
+# Public License
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+top_builddir = ../..
+INSTALL = @INSTALL@
+
+@MCONFIG@
+
+all::
+
+OBJS=		fgetflags.o fsetflags.o fgetversion.o fsetversion.o \
+		getflags.o getversion.o iod.o ls.o pe.o pf.o ps.o \
+		setflags.o setversion.o
+
+SRCS=		$(srcdir)/fgetflags.c $(srcdir)/fsetflags.c \
+		$(srcdir)/fgetversion.c $(srcdir)/fsetversion.c \
+		$(srcdir)/getflags.c $(srcdir)/getversion.c \
+		$(srcdir)/iod.c $(srcdir)/ls.c $(srcdir)/pe.c \
+		$(srcdir)/pf.c $(srcdir)/ps.c \
+		$(srcdir)/setflags.c $(srcdir)/setversion.c
+
+LIBRARY= libe2p
+LIBDIR= e2p
+
+DLL_ADDRESS = 0x66980000
+DLL_JUMPSIZE = 0x1000
+DLL_GOTSIZE  = 0x1000
+DLL_VERSION = 1.2
+DLL_IMAGE = libe2p
+DLL_STUB = libe2p
+DLL_MYDIR = e2p
+DLL_INSTALL_DIR = $(libdir)
+
+ELF_VERSION = 2.1
+ELF_IMAGE = libe2p
+ELF_MYDIR = e2p
+ELF_INSTALL_DIR = $(libdir)
+
+BSDLIB_VERSION = 2.1
+BSDLIB_IMAGE = libe2p
+BSDLIB_MYDIR = e2p
+BSDLIB_INSTALL_DIR = $(libdir)
+
+@MAKEFILE_LIBRARY@
+@MAKEFILE_DLL@
+@MAKEFILE_ELF@
+@MAKEFILE_BSDLIB@
+@MAKEFILE_PROFILE@
+@MAKEFILE_CHECKER@
+
+.c.o:
+	$(CC) $(CFLAGS) -c $< -o $@
+@PROFILE_CMT@	$(CC) $(CFLAGS) -pg -o profiled/$*.o -c $<
+@CHECKER_CMT@	$(CC) $(CFLAGS) -checker -g -o checker/$*.o -c $<
+@DLL_CMT@	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
+@DLL_CMT@		-o jump/$*.o -c $<)
+@ELF_CMT@	$(CC) $(CFLAGS) -fPIC -o elfshared/$*.o -c $<
+@BSDLIB_CMT@	$(CC) $(CFLAGS) -fpic -o pic/$*.o -c $<
+
+installdirs::
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(ulibdir)
+
+install:: all installdirs 
+	$(INSTALL_DATA) libe2p.a $(DESTDIR)$(ulibdir)/libe2p.a
+	$(CHMOD) 644 $(DESTDIR)$(ulibdir)/libe2p.a
+	-$(RANLIB) $(DESTDIR)$(ulibdir)/libe2p.a
+	$(CHMOD) $(LIBMODE) $(DESTDIR)$(ulibdir)/libe2p.a
+
+uninstall::
+	$(RM) -f $(ulibdir)/libe2p.a
+
+clean::
+	$(RM) -f \#* *.s *.o *.a *~ *.bak core profiled/* checker/*
+	$(RM) -f ../libe2p.a ../libe2p_p.a
+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
+#
+fgetflags.o : $(srcdir)/fgetflags.c \
+  $(srcdir)/e2p.h \
+  
+fsetflags.o : $(srcdir)/fsetflags.c \
+  $(srcdir)/e2p.h \
+  
+fgetversion.o : $(srcdir)/fgetversion.c \
+  $(srcdir)/e2p.h \
+  
+fsetversion.o : $(srcdir)/fsetversion.c \
+  $(srcdir)/e2p.h \
+  
+getflags.o : $(srcdir)/getflags.c \
+  $(srcdir)/e2p.h \
+  
+getversion.o : $(srcdir)/getversion.c \
+  $(srcdir)/e2p.h \
+  
+iod.o : $(srcdir)/iod.c $(srcdir)/e2p.h \
+  
+ls.o : $(srcdir)/ls.c \
+  $(srcdir)/e2p.h \
+  
+pe.o : $(srcdir)/pe.c \
+  $(srcdir)/e2p.h \
+  
+pf.o : $(srcdir)/pf.c \
+  $(srcdir)/e2p.h \
+  
+ps.o : $(srcdir)/ps.c \
+  $(srcdir)/e2p.h \
+  
+setflags.o : $(srcdir)/setflags.c \
+  $(srcdir)/e2p.h \
+  
+setversion.o : $(srcdir)/setversion.c \
+  $(srcdir)/e2p.h \
+  
+
diff --git a/lib/e2p/configure b/lib/e2p/configure
new file mode 100644
index 0000000..db75368
--- /dev/null
+++ b/lib/e2p/configure
@@ -0,0 +1,613 @@
+#!/bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.1 
+# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+select compiler to use"
+ac_help="$ac_help
+select compiler command line options"
+ac_help="$ac_help
+select compiler preprocessor command line options"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Initialize some other variables.
+subdirs=
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -build | --build | --buil | --bui | --bu | --b)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=PREFIX    install architecture-dependent files in PREFIX
+                          [same as prefix]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+--enable and --with options recognized:$ac_help
+EOF
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.1"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *) 
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 unused; standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 unused; some systems may open it to /dev/tty
+# 4 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 4>/dev/null
+else
+  exec 4>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=e2p.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} $CFLAGS $CPPFLAGS conftest.$ac_ext -c 1>&5 2>&5'
+ac_link='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext -o conftest $LIBS 1>&5 2>&5'
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='	'
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+# Check whether --with-cc or --without-cc was given.
+withval="$with_cc"
+if test -n "$withval"; then
+  echo "$ac_t""CC=$withval" 1>&4
+CC=$withval
+else
+  if test -z "$CC" ; then CC=cc; fi
+echo "$ac_t""CC defaults to $CC" 1>&4
+fi
+
+
+# Check whether --with-ccopts or --without-ccopts was given.
+withval="$with_ccopts"
+if test -n "$withval"; then
+  echo "$ac_t""CCOPTS is $withval" 1>&4
+CCOPTS=$withval
+CFLAGS="$CFLAGS $withval"
+else
+  CCOPTS=
+fi
+
+
+# Check whether --with-cppopts or --without-cppopts was given.
+withval="$with_cppopts"
+if test -n "$withval"; then
+  echo "$ac_t""CPPOPTS=$withval" 1>&4
+CPPOPTS=$withval
+CPPFLAGS="$CPPFLAGS $withval"
+else
+  echo "$ac_t""CPPOPTS defaults to $CPPOPTS" 1>&4
+fi
+
+trap '' 1 2 15
+if test -w $cache_file; then
+echo "updating cache $cache_file"
+cat > $cache_file <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# Ultrix sh set writes to stderr and can't be redirected directly.
+(set) 2>&1 |
+  sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p" \
+  >> $cache_file
+else
+echo "not updating unwritable cache $cache_file"
+fi
+
+trap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%-D\1=\2%g
+s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#!/bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.1"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -f Makefile; exit 1' 1 2 15
+
+# Protect against being on the right side of a sed subst in config.status. 
+sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; 
+ s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@CC@%$CC%g
+s%@CCOPTS@%$CCOPTS%g
+s%@CPPOPTS@%$CPPOPTS%g
+
+CEOF
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust relative srcdir, etc. for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/$ac_dir"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file
+fi; done
+rm -f conftest.subs
+
+
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS
+
diff --git a/lib/e2p/jump/jump.funcs b/lib/e2p/dll/jump.funcs
similarity index 100%
rename from lib/e2p/jump/jump.funcs
rename to lib/e2p/dll/jump.funcs
diff --git a/lib/e2p/dll/jump.ignore b/lib/e2p/dll/jump.ignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lib/e2p/dll/jump.ignore
diff --git a/lib/e2p/jump/jump.import b/lib/e2p/dll/jump.import
similarity index 100%
rename from lib/e2p/jump/jump.import
rename to lib/e2p/dll/jump.import
diff --git a/lib/e2p/jump/jump.params b/lib/e2p/dll/jump.params
similarity index 84%
rename from lib/e2p/jump/jump.params
rename to lib/e2p/dll/jump.params
index 7d3efe9..ebaa892 100644
--- a/lib/e2p/jump/jump.params
+++ b/lib/e2p/dll/jump.params
@@ -3,4 +3,4 @@
 Data=0x00000000
 Jump=0x00001000
 GOT=0x00001000
-Version=1.0.0
+Version=1.2.0
diff --git a/lib/e2p/dll/jump.undefs b/lib/e2p/dll/jump.undefs
new file mode 100644
index 0000000..48d61ea
--- /dev/null
+++ b/lib/e2p/dll/jump.undefs
@@ -0,0 +1 @@
+66982040 D __NEEDS_SHRLIB_libc_4
diff --git a/lib/e2p/dll/jump.vars b/lib/e2p/dll/jump.vars
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lib/e2p/dll/jump.vars
diff --git a/lib/e2p/e2p.h b/lib/e2p/e2p.h
index 8ff770f..dc2dbe5 100644
--- a/lib/e2p/e2p.h
+++ b/lib/e2p/e2p.h
@@ -1,5 +1,6 @@
-#include <dirent.h>
+#include <sys/types.h>		/* Needed by dirent.h on netbsd */
 #include <stdio.h>
+#include <dirent.h>
 
 #include <linux/ext2_fs.h>
 
diff --git a/lib/e2p/fgetflags.c b/lib/e2p/fgetflags.c
index 95b0bdc..752da0b 100644
--- a/lib/e2p/fgetflags.c
+++ b/lib/e2p/fgetflags.c
@@ -14,10 +14,18 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
-#include <fcntl.h>
+#endif
+#if HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#if HAVE_STAT_FLAGS
+#include <sys/stat.h>
+#else
+#include <fcntl.h>
 #include <sys/ioctl.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -25,6 +33,29 @@
 
 int fgetflags (const char * name, unsigned long * flags)
 {
+#if HAVE_STAT_FLAGS
+  struct stat buf;
+
+  if (stat (name, &buf) == -1)
+    return -1;
+
+  *flags = 0;
+#ifdef UF_IMMUTABLE
+  if (buf.st_flags & UF_IMMUTABLE)
+    *flags |= EXT2_IMMUTABLE_FL;
+#endif
+#ifdef UF_APPEND
+  if (buf.st_flags & UF_APPEND)
+    *flags |= EXT2_APPEND_FL;
+#endif
+#ifdef UF_NODUMP
+  if (buf.st_flags & UF_NODUMP)
+    *flags |= EXT2_NODUMP_FL;
+#endif
+
+  return 0;
+#else
+#if HAVE_EXT2_IOCTLS
 	int fd;
 	int r;
 
@@ -32,6 +63,13 @@
 	if (fd == -1)
 		return -1;
 	r = ioctl (fd, EXT2_IOC_GETFLAGS, flags);
+
 	close (fd);
 	return r;
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
+#endif
 }
diff --git a/lib/e2p/fgetversion.c b/lib/e2p/fgetversion.c
index 73429f2..89e0713 100644
--- a/lib/e2p/fgetversion.c
+++ b/lib/e2p/fgetversion.c
@@ -14,9 +14,13 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
-#include <fcntl.h>
+#endif
+#if HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#include <fcntl.h>
 #include <sys/ioctl.h>
 
 #include <linux/ext2_fs.h>
@@ -25,6 +29,7 @@
 
 int fgetversion (const char * name, unsigned long * version)
 {
+#if HAVE_EXT2_IOCTLS
 	int fd;
 	int r;
 
@@ -34,4 +39,9 @@
 	r = ioctl (fd, EXT2_IOC_GETVERSION, version);
 	close (fd);
 	return r;
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
 }
diff --git a/lib/e2p/fsetflags.c b/lib/e2p/fsetflags.c
index 180d48f..a258443 100644
--- a/lib/e2p/fsetflags.c
+++ b/lib/e2p/fsetflags.c
@@ -14,10 +14,18 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
-#include <fcntl.h>
+#endif
+#if HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#if HAVE_CHFLAGS
+#include <sys/stat.h>		/* For the flag values.  */
+#else
+#include <fcntl.h>
 #include <sys/ioctl.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -25,6 +33,25 @@
 
 int fsetflags (const char * name, unsigned long flags)
 {
+#if HAVE_CHFLAGS
+  unsigned long bsd_flags = 0;
+
+#ifdef UF_IMMUTABLE
+  if (flags & EXT2_IMMUTABLE_FL)
+    bsd_flags |= UF_IMMUTABLE;
+#endif
+#ifdef UF_APPEND
+  if (flags & EXT2_APPEND_FL)
+    bsd_flags |= UF_APPEND;
+#endif
+#ifdef UF_NODUMP
+  if (flags & EXT2_NODUMP_FL)
+    bsd_flags |= UF_NODUMP;
+#endif
+
+  return chflags (name, bsd_flags);
+#else
+#if HAVE_EXT2_IOCTLS
 	int fd;
 	int r;
 
@@ -34,4 +61,10 @@
 	r = ioctl (fd, EXT2_IOC_SETFLAGS, &flags);
 	close (fd);
 	return r;
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
+#endif
 }
diff --git a/lib/e2p/fsetversion.c b/lib/e2p/fsetversion.c
index 1bb8acc..afea365 100644
--- a/lib/e2p/fsetversion.c
+++ b/lib/e2p/fsetversion.c
@@ -14,9 +14,13 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
-#include <fcntl.h>
+#endif
+#if HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#include <fcntl.h>
 #include <sys/ioctl.h>
 
 #include <linux/ext2_fs.h>
@@ -25,6 +29,7 @@
 
 int fsetversion (const char * name, unsigned long version)
 {
+#if HAVE_EXT2_IOCTLS
 	int fd;
 	int r;
 
@@ -34,4 +39,9 @@
 	r = ioctl (fd, EXT2_IOC_SETVERSION, &version);
 	close (fd);
 	return r;
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
 }
diff --git a/lib/e2p/getflags.c b/lib/e2p/getflags.c
index 4e53749..ac014a7 100644
--- a/lib/e2p/getflags.c
+++ b/lib/e2p/getflags.c
@@ -14,8 +14,14 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
+#endif
+#if HAVE_STAT_FLAGS
+#include <sys/stat.h>
+#else
 #include <sys/ioctl.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -23,5 +29,34 @@
 
 int getflags (int fd, unsigned long * flags)
 {
+#if HAVE_STAT_FLAGS
+  struct stat buf;
+
+  if (fstat (fd, &buf) == -1)
+    return -1;
+
+  *flags = 0;
+#ifdef UF_IMMUTABLE
+  if (buf.st_flags & UF_IMMUTABLE)
+    *flags |= EXT2_IMMUTABLE_FL;
+#endif
+#ifdef UF_APPEND
+  if (buf.st_flags & UF_APPEND)
+    *flags |= EXT2_APPEND_FL;
+#endif
+#ifdef UF_NODUMP
+  if (buf.st_flags & UF_NODUMP)
+    *flags |= EXT2_NODUMP_FL;
+#endif
+
+  return 0;
+#else
+#if HAVE_EXT2_IOCTLS
 	return ioctl (fd, EXT2_IOC_GETFLAGS, flags);
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
+#endif
 }
diff --git a/lib/e2p/getversion.c b/lib/e2p/getversion.c
index 04dc0f7..309dfb6 100644
--- a/lib/e2p/getversion.c
+++ b/lib/e2p/getversion.c
@@ -14,7 +14,9 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
+#endif
 #include <sys/ioctl.h>
 
 #include <linux/ext2_fs.h>
@@ -23,5 +25,11 @@
 
 int getversion (int fd, unsigned long * version)
 {
+#if HAVE_EXT2_IOCTLS
 	return ioctl (fd, EXT2_IOC_GETVERSION, version);
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
 }
diff --git a/lib/e2p/iod.c b/lib/e2p/iod.c
index 52c16a1..7b02a7f 100644
--- a/lib/e2p/iod.c
+++ b/lib/e2p/iod.c
@@ -14,8 +14,6 @@
  * 93/10/30	- Creation
  */
 
-#include <dirent.h>
-
 #include "e2p.h"
 
 int iterate_on_dir (const char * dir_name,
@@ -23,7 +21,13 @@
 		    void * private)
 {
 	DIR * dir;
-	struct dirent de;
+#if HAVE_DIRENT_NAMELEN
+	/* Declare DE_BUF with some extra room for the name.  */
+	char de_buf[sizeof (struct dirent) + 32];
+	struct dirent *de = (struct dirent *)&de_buf;
+#else
+	struct dirent de_buf, *de = &de_buf;
+#endif
 	struct dirent *dep;
 
 	dir = opendir (dir_name);
@@ -31,12 +35,32 @@
 		return -1;
 	while ((dep = readdir (dir)))
 	{
-		de.d_ino = dep->d_ino;
-		de.d_off = dep->d_off;
-		de.d_reclen = dep->d_reclen;
-		strcpy (de.d_name, dep->d_name);
-		(*func) (dir_name, &de, private);
+#if HAVE_DIRENT_NAMELEN
+	  /* See if there's enough room for this entry in DE, and grow if
+	     not.  */
+	  if (de_len < dep->d_reclen)
+	    {
+	      de_len = dep->d_reclen + 32;
+	      de =
+		(de == (struct dirent *)&de_buf
+		 ? malloc (de_len)
+		 : realloc (de, de_len));
+	      if (de == NULL)
+		{
+		  errno = ENOMEM;
+		  return -1;
+		}
+	    }
+	  memcpy (de, dep, dep->d_reclen);
+#else
+	  *de = *dep;
+#endif
+	  (*func) (dir_name, de, private);
 	}
+#if HAVE_DIRENT_NAMELEN
+	if (de != (struct dirent *)&de_buf)
+	  free (de);
+#endif
 	closedir (dir);
 	return 0;
 }
diff --git a/lib/e2p/jump/jump.undefs b/lib/e2p/jump/jump.undefs
deleted file mode 100644
index 4492562..0000000
--- a/lib/e2p/jump/jump.undefs
+++ /dev/null
@@ -1 +0,0 @@
-66983040 D __NEEDS_SHRLIB_libc_4
diff --git a/lib/e2p/ls.c b/lib/e2p/ls.c
index f879a3c..6870098 100644
--- a/lib/e2p/ls.c
+++ b/lib/e2p/ls.c
@@ -9,11 +9,11 @@
  * Public License
  */
 
+#include <sys/types.h>
 #include <grp.h>
 #include <pwd.h>
 #include <stdio.h>
 #include <time.h>
-#include <sys/types.h>
 
 #include <linux/ext2_fs.h>
 
@@ -52,23 +52,23 @@
 	printf ("Errors behavior:          ");
 	print_fs_errors (stdout, s->s_errors);
 	printf ("\n");
-	printf ("Inode count:              %lu\n", s->s_inodes_count);
-	printf ("Block count:              %lu\n", s->s_blocks_count);
-	printf ("Reserved block count:     %lu\n", s->s_r_blocks_count);
-	printf ("Free blocks:              %lu\n", s->s_free_blocks_count);
-	printf ("Free inodes:              %lu\n", s->s_free_inodes_count);
-	printf ("First block:              %lu\n", s->s_first_data_block);
+	printf ("Inode count:              %u\n", s->s_inodes_count);
+	printf ("Block count:              %u\n", s->s_blocks_count);
+	printf ("Reserved block count:     %u\n", s->s_r_blocks_count);
+	printf ("Free blocks:              %u\n", s->s_free_blocks_count);
+	printf ("Free inodes:              %u\n", s->s_free_inodes_count);
+	printf ("First block:              %u\n", s->s_first_data_block);
 	printf ("Block size:               %u\n", EXT2_BLOCK_SIZE(s));
 	printf ("Fragment size:            %u\n", EXT2_FRAG_SIZE(s));
-	printf ("Blocks per group:         %lu\n", s->s_blocks_per_group);
-	printf ("Fragments per group:      %lu\n", s->s_frags_per_group);
-	printf ("Inodes per group:         %lu\n", s->s_inodes_per_group);
+	printf ("Blocks per group:         %u\n", s->s_blocks_per_group);
+	printf ("Fragments per group:      %u\n", s->s_frags_per_group);
+	printf ("Inodes per group:         %u\n", s->s_inodes_per_group);
 	printf ("Last mount time:          %s", ctime ((time_t *) &s->s_mtime));
 	printf ("Last write time:          %s", ctime ((time_t *) &s->s_wtime));
 	printf ("Mount count:              %u\n", s->s_mnt_count);
 	printf ("Maximum mount count:      %d\n", s->s_max_mnt_count);
 	printf ("Last checked:             %s", ctime ((time_t *) &s->s_lastcheck));
-	printf ("Check interval:           %lu\n", s->s_checkinterval);
+	printf ("Check interval:           %u\n", s->s_checkinterval);
 	if (s->s_checkinterval)
 	{
 		time_t next;
diff --git a/lib/e2p/setflags.c b/lib/e2p/setflags.c
index c1e9fcb..06f127f 100644
--- a/lib/e2p/setflags.c
+++ b/lib/e2p/setflags.c
@@ -14,8 +14,15 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
+#endif
+#if HAVE_CHFLAGS
+#include <sys/types.h>
+#include <sys/stat.h>		/* For the flag values.  */
+#else
 #include <sys/ioctl.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -23,5 +30,30 @@
 
 int setflags (int fd, unsigned long flags)
 {
+#if HAVE_CHFLAGS
+  unsigned long bsd_flags = 0;
+
+#ifdef UF_IMMUTABLE
+  if (flags & EXT2_IMMUTABLE_FL)
+    bsd_flags |= UF_IMMUTABLE;
+#endif
+#ifdef UF_APPEND
+  if (flags & EXT2_APPEND_FL)
+    bsd_flags |= UF_APPEND;
+#endif
+#ifdef UF_NODUMP
+  if (flags & EXT2_NODUMP_FL)
+    bsd_flags |= UF_NODUMP;
+#endif
+
+  return fchflags (fd, bsd_flags);
+#else
+#if HAVE_EXT2_IOCTLS
 	return ioctl (fd, EXT2_IOC_SETFLAGS, &flags);
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
+#endif
 }
diff --git a/lib/e2p/setversion.c b/lib/e2p/setversion.c
index a6da31e..f2c48cd 100644
--- a/lib/e2p/setversion.c
+++ b/lib/e2p/setversion.c
@@ -14,7 +14,9 @@
  * 93/10/30	- Creation
  */
 
+#if HAVE_ERRNO_H
 #include <errno.h>
+#endif
 #include <sys/ioctl.h>
 
 #include <linux/ext2_fs.h>
@@ -23,5 +25,11 @@
 
 int setversion (int fd, unsigned long version)
 {
+#if HAVE_EXT2_IOCTLS
 	return ioctl (fd, EXT2_IOC_SETVERSION, &version);
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
 }
diff --git a/lib/et/.depend b/lib/et/.depend
index 2556ee4..4285560 100644
--- a/lib/et/.depend
+++ b/lib/et/.depend
@@ -1,17 +1,16 @@
-com_err.o : com_err.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/libio.h /usr/include/_G_config.h com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  mit-sipb-copyright.h error_table.h internal.h /usr/include/errno.h /usr/include/linux/errno.h 
-error_message.o : error_message.c /usr/include/stdio.h /usr/include/features.h \
+com_err.o : ./com_err.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/libio.h /usr/include/_G_config.h ./com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./mit-sipb-copyright.h ./error_table.h ./internal.h /usr/include/errno.h /usr/include/linux/errno.h 
+error_message.o : ./error_message.c /usr/include/stdio.h /usr/include/features.h \
   /usr/include/sys/cdefs.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/errno.h /usr/include/linux/errno.h \
-  com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h error_table.h mit-sipb-copyright.h \
-  internal.h 
-et_name.o : et_name.c error_table.h mit-sipb-copyright.h internal.h /usr/include/errno.h \
-  /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/linux/errno.h 
-init_et.o : init_et.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  ./com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ./error_table.h \
+  ./mit-sipb-copyright.h ./internal.h 
+et_name.o : ./et_name.c ./error_table.h ./mit-sipb-copyright.h ./internal.h \
+  /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/linux/errno.h 
+init_et.o : ./init_et.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/errno.h /usr/include/linux/errno.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 com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  error_table.h mit-sipb-copyright.h 
-vfprintf.o : vfprintf.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/libio.h /usr/include/_G_config.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/varargs.h 
+  /usr/include/alloca.h ./com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./error_table.h ./mit-sipb-copyright.h 
+vfprintf.o : ./vfprintf.c 
diff --git a/lib/et/ChangeLog b/lib/et/ChangeLog
index 3c37224..9943632 100644
--- a/lib/et/ChangeLog
+++ b/lib/et/ChangeLog
@@ -1,3 +1,39 @@
+Mon Sep  4 21:44:47 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for BSD shared libraries.
+
+Sat Aug 12 03:11:28 1995  Remy Card  <card@bbj>
+
+	* Makefile.in (install): Install static libraries in $(ulibdir)
+		(/usr/lib on Linux) instead of $(libdir) (/lib on Linux).
+
+Sat Aug  5 11:44:17 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* Makefile.in (DLL_INSTALL_DIR, ELF_INSTALL_DIR): Set the
+		installation directories correctly.
+
+Thu Jun 15 23:39:51 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for ELF shared libraries.
+		Fixed typos in the compilation rules.
+		(distclean): Added compile_et.sh.
+
+Sat Jun 10 19:56:13 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* compile_et.sh.in: Use ET_DIR instead of srcdir to determine the
+		location of the et directory.
+
+Thu Jun  8 12:45:41 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* vfprintf.c (vfprintf): Only compile this function if vfprintf
+	doesn't already exist and _doprnt does.
+
+	* compile_et.sh: Moved to compile_et.sh.in.
+
+	* Makefile.in: Rewritten to conform to GNU coding standards and
+	support separate compilation directories.
+	Don't preprocess compile_et.sh, as this is now done by configure.
+
 Mon Nov  7 21:17:48 1994  Remy Card  <card@bbj>
 
 	* Makefile: Added a dummy install target in case shared libraries
diff --git a/lib/et/Makefile b/lib/et/Makefile
deleted file mode 100644
index 2dcf1ef..0000000
--- a/lib/et/Makefile
+++ /dev/null
@@ -1,118 +0,0 @@
-#
-# Makefile for lib/et
-#
-
-all:: compile_et libcom_err.a
-
-include ../../MCONFIG
-
-OBJS= error_message.o et_name.o init_et.o com_err.o
-SRCS = error_message.c et_name.c init_et.c com_err.c
-
-HFILES= com_err.h
-
-ifdef BUILD_PROFILE_LIBS
-all:: libcom_err_p.a
-endif
-
-ifdef BUILD_DLL_SHLIBS
-DLL_ADDRESS = 0x66800000
-DLL_JUMPSIZE = 0x1000
-DLL_GOTSIZE  = 0x1000
-DLL_VERSION = 1.0
-DLL_IMAGE = libet
-DLL_STUB = libcom_err
-DLL_MYDIR = et
-DLL_INSTALL_DIR = $(SHLIBDIR)
-
-include ../Makefile.dll-lib
-endif
-
-RM=rm -f
-MV=mv
-LN=ln -s
-TAGS=etags
-
-DEFS= -DHAS_STDLIB_H
-
-CFLAGS_NO= $(WFLAGS) $(DEFS)
-CFLAGS= $(CFLAGS_NO) $(OPT)
-
-#
-# what to build...
-#
-
-.c.o:
-	$(CC) $(CFLAGS) -c $*.c
-ifdef BUILD_PROFILE_LIBS
-	$(CC) $(CFLAGS_NO) -g -pg -o profiled/$*.o -c $*.c
-endif
-ifdef BUILD_DLL_SHLIBS
-	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
-		-o jump/$*.o -c $*.c)
-endif
-
-
-compile_et: compile_et.sh
-	./config_script compile_et.sh $(AWK) > compile_et
-	chmod +x compile_et
-
-libcom_err.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	$(ARCHIVE) $@ $(OBJS)
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) et/$@ ../$@
-
-libcom_err_p.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	(cd profiled ; $(ARCHIVE) ../$@ $(OBJS))
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) et/$@ ../$@
-
-clean::
-	$(RM) compile_et libcom_err.a libcom_err_p.a
-	$(RM) $(OBJS) profiled/*
-	$(RM) *~ \#* *.bak *.otl *.aux *.toc *.PS *.dvi *.ps TAGS *.ln
-	$(RM) ../libcom_err.a ../libcom_err_p.a
-
-really-clean:: clean
-	$(RM) .depend
-
-install-libs:: libcom_err.a
-	$(INSTALLLIB) libcom_err.a $(LIBDIR)/libcom_err.a
-	$(CHMOD) 644 $(LIBDIR)/libcom_err.a
-	$(RANLIB)    $(LIBDIR)/libcom_err.a
-	$(CHMOD) $(LIBMODE) $(LIBDIR)/libcom_err.a
-
-install-libs:: $(HFILES)
-	@rm -rf $(INCLDIR)/et
-	@mkdir $(INCLDIR)/et
-	for i in $(HFILES); do \
-		$(INSTALLINC) $$i $(INCLDIR)/et/$$i; \
-	done
-
-install-tree::
-
-install::
-
-## 
-
-com_err.ps : com_err.dvi
-com_err.dvi: com_err.texinfo
-
-libcom_err.o:	$(LIBOBJS)
-	ld -r -s -o libcom_err.o $(LIBOBJS)
-	chmod -x libcom_err.o
-
-
-TAGS:	$(SRCS)
-	$(TAGS) $(SRCS)
-
-dep depend .depend: compile_et
-	$(CPP) -M $(CFLAGS) *.c >.depend
-
-include .depend
diff --git a/lib/et/Makefile.in b/lib/et/Makefile.in
new file mode 100644
index 0000000..39141a4
--- /dev/null
+++ b/lib/et/Makefile.in
@@ -0,0 +1,121 @@
+#
+# Makefile for lib/et
+#
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+top_builddir = ../..
+INSTALL = @INSTALL@
+
+@MCONFIG@
+
+all:: compile_et
+
+OBJS= error_message.o et_name.o init_et.o com_err.o
+SRCS = $(srcdir)/error_message.c $(srcdir)/et_name.c $(srcdir)/init_et.c \
+	$(srcdir)/com_err.c
+
+HFILES= com_err.h
+
+LIBRARY= libcom_err
+LIBDIR= et
+
+DLL_ADDRESS = 0x66800000
+DLL_JUMPSIZE = 0x1000
+DLL_GOTSIZE  = 0x1000
+DLL_VERSION = 1.0
+DLL_IMAGE = libet
+DLL_STUB = libcom_err
+DLL_MYDIR = et
+DLL_INSTALL_DIR = $(libdir)
+
+ELF_VERSION = 2.0
+ELF_IMAGE = libcom_err
+ELF_MYDIR = et
+ELF_INSTALL_DIR = $(libdir)
+
+BSDLIB_VERSION = 1.0
+BSDLIB_IMAGE = libcom_err
+BSDLIB_MYDIR = et
+BSDLIB_INSTALL_DIR = $(libdir)
+
+#
+# what to build...
+#
+.c.o:
+	$(CC) $(CFLAGS) -c $< -o $@
+@PROFILE_CMT@	$(CC) $(CFLAGS) -pg -o profiled/$*.o -c $<
+@CHECKER_CMT@	$(CC) $(CFLAGS) -checker -g -o checker/$*.o -c $<
+@DLL_CMT@	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
+@DLL_CMT@		-o jump/$*.o -c $<)
+@ELF_CMT@	$(CC) $(CFLAGS) -fPIC -o elfshared/$*.o -c $<
+@BSDLIB_CMT@	$(CC) $(CFLAGS) -fpic -o pic/$*.o -c $<
+
+@MAKEFILE_LIBRARY@
+@MAKEFILE_DLL@
+@MAKEFILE_ELF@
+@MAKEFILE_BSDLIB@
+@MAKEFILE_PROFILE@
+@MAKEFILE_CHECKER@
+
+compile_et: compile_et.sh
+	$(CP) $< $@ && $(CHMOD) +x compile_et
+
+com_err.ps : com_err.dvi
+com_err.dvi: com_err.texinfo
+
+#libcom_err.o:	$(LIBOBJS)
+#	$(LD) -r -s -o libcom_err.o $(LIBOBJS)
+#	chmod -x libcom_err.o
+
+TAGS:	$(SRCS)
+	$(TAGS) $(SRCS)
+
+installdirs::
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(ulibdir) \
+		$(DESTDIR)$(includedir)/et
+
+install:: libcom_err.a $(HFILES) installdirs
+	$(INSTALL_DATA) libcom_err.a $(DESTDIR)$(ulibdir)/libcom_err.a
+	$(CHMOD) 644 $(DESTDIR)$(ulibdir)/libcom_err.a
+	-$(RANLIB) $(DESTDIR)$(ulibdir)/libcom_err.a
+	$(CHMOD) $(LIBMODE) $(DESTDIR)$(ulibdir)/libcom_err.a
+	for i in $(HFILES); do \
+		$(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir)/et/$$i; \
+	done
+
+uninstall::
+	$(RM) -f $(ulibdir)/libcom_err.a
+	$(RM) -rf $(includedir)/et
+
+clean::
+	$(RM) -f compile_et libcom_err.a libcom_err_p.a
+	$(RM) -f $(OBJS) profiled/*
+	$(RM) -f *~ \#* *.bak *.otl *.aux *.toc *.PS *.dvi *.ps TAGS *.ln
+	$(RM) -f ../libcom_err.a ../libcom_err_p.a
+mostlyclean:: clean
+distclean:: clean
+	$(RM) -f .depend compile_et.sh Makefile
+
+# +++ Dependency line eater +++
+# 
+# Makefile dependencies follow.  This must be the last section in
+# the Makefile.in file
+#
+error_message.o : $(srcdir)/error_message.c \
+  $(srcdir)/com_err.h \
+  $(srcdir)/error_table.h $(srcdir)/mit-sipb-copyright.h $(srcdir)/internal.h 
+et_name.o : $(srcdir)/et_name.c $(srcdir)/error_table.h $(srcdir)/mit-sipb-copyright.h \
+  $(srcdir)/internal.h \
+  
+init_et.o : $(srcdir)/init_et.c \
+  $(srcdir)/com_err.h \
+  $(srcdir)/error_table.h \
+  $(srcdir)/mit-sipb-copyright.h 
+com_err.o : $(srcdir)/com_err.c \
+  $(srcdir)/com_err.h \
+  $(srcdir)/mit-sipb-copyright.h \
+  $(srcdir)/error_table.h $(srcdir)/internal.h \
+  
+
diff --git a/lib/et/compile_et.sh b/lib/et/compile_et.sh.in
similarity index 92%
rename from lib/et/compile_et.sh
rename to lib/et/compile_et.sh.in
index fdd249e..0cae297 100644
--- a/lib/et/compile_et.sh
+++ b/lib/et/compile_et.sh.in
@@ -2,7 +2,7 @@
 #
 #
 AWK=@AWK@
-DIR=@DIR@
+DIR=@ET_DIR@
 
 ROOT=`echo $1 | sed -e s/.et$//`
 BASE=`basename $ROOT`
diff --git a/lib/et/config_script b/lib/et/config_script
deleted file mode 100644
index e3de35c..0000000
--- a/lib/et/config_script
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-#
-# This program takes a shell script and configures for the following
-# variables:	@DIR@
-#		@AWK@
-#		@SED@
-#
-# Usage: config_script <filename> [<awk>] [<sed>]
-#
-
-FILE=$1
-AWK=$2
-SED=$3
-
-# Grr.... not all Unix's have the dirname command
-TMP=`echo  $1 | sed -e 's;[^/]*$;;' -e 's/^$/./'`
-DIR=`cd ${TMP}; pwd`
-
-if test "${AWK}x" = "x" ; then
-	AWK=awk
-fi
-if test "${SED}x" = "x" ; then
-	SED=sed
-fi
-sed -e "s;@DIR@;${DIR};" -e "s;@AWK@;${AWK};" -e "s;@SED@;${SED};" $FILE
diff --git a/lib/et/jump/jump.funcs b/lib/et/dll/jump.funcs
similarity index 100%
rename from lib/et/jump/jump.funcs
rename to lib/et/dll/jump.funcs
diff --git a/lib/et/jump/jump.ignore b/lib/et/dll/jump.ignore
similarity index 100%
rename from lib/et/jump/jump.ignore
rename to lib/et/dll/jump.ignore
diff --git a/lib/et/jump/jump.import b/lib/et/dll/jump.import
similarity index 100%
rename from lib/et/jump/jump.import
rename to lib/et/dll/jump.import
diff --git a/lib/et/jump/jump.params b/lib/et/dll/jump.params
similarity index 100%
rename from lib/et/jump/jump.params
rename to lib/et/dll/jump.params
diff --git a/lib/et/dll/jump.undefs b/lib/et/dll/jump.undefs
new file mode 100644
index 0000000..de3f8d4
--- /dev/null
+++ b/lib/et/dll/jump.undefs
@@ -0,0 +1 @@
+66803000 D __NEEDS_SHRLIB_libc_4
diff --git a/lib/et/jump/jump.vars b/lib/et/dll/jump.vars
similarity index 100%
rename from lib/et/jump/jump.vars
rename to lib/et/dll/jump.vars
diff --git a/lib/et/init_et.c b/lib/et/init_et.c
index 8e5af84..969ef36 100644
--- a/lib/et/init_et.c
+++ b/lib/et/init_et.c
@@ -11,7 +11,7 @@
 
 #include <stdio.h>
 #include <errno.h>
-#ifdef HAS_STDLIB_H
+#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
 #include "com_err.h"
diff --git a/lib/et/jump/jump.undefs b/lib/et/jump/jump.undefs
deleted file mode 100644
index c61658a..0000000
--- a/lib/et/jump/jump.undefs
+++ /dev/null
@@ -1 +0,0 @@
-66804000 D __NEEDS_SHRLIB_libc_4
diff --git a/lib/et/vfprintf.c b/lib/et/vfprintf.c
index 94f0fb5..a1dc1e8 100644
--- a/lib/et/vfprintf.c
+++ b/lib/et/vfprintf.c
@@ -19,6 +19,7 @@
 static char sccsid[] = "@(#)vfprintf.c	5.2 (Berkeley) 6/27/88";
 #endif /* LIBC_SCCS and not lint */
 
+#if !HAVE_VPRINTF && HAVE_DOPRNT
 #include <stdio.h>
 #include <varargs.h>
 
@@ -45,3 +46,4 @@
 
 	return (ferror(iop) ? EOF : len);
 }
+#endif /* !HAVE_VPRINTF */
diff --git a/lib/ext2fs/.depend b/lib/ext2fs/.depend
index dd371f6..1929009 100644
--- a/lib/ext2fs/.depend
+++ b/lib/ext2fs/.depend
@@ -1,198 +1,199 @@
-alloc.o : alloc.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+alloc.o : ./alloc.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.h \
   /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/time.h \
+  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+badblocks.o : ./badblocks.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
   /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/time.h /usr/include/sys/stat.h /usr/include/linux/stat.h \
-  /usr/include/linux/ext2_fs.h ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-badblocks.o : badblocks.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
   /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
   ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-bb_inode.o : bb_inode.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+bb_inode.o : ./bb_inode.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
   /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
   ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-bitmaps.o : bitmaps.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+bitmaps.o : ./bitmaps.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
   /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
   ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-bitops.o : bitops.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+bitops.o : ./bitops.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/sys/types.h /usr/include/linux/types.h \
-  /usr/include/asm/types.h /usr/include/linux/ext2_fs.h ext2fs.h ../et/com_err.h \
+  /usr/include/asm/types.h /usr/include/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h \
   /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
   ../ext2fs/bitops.h 
-block.o : block.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+block.o : ./block.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ext2fs.h ../et/com_err.h \
+  /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h \
   /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
   ../ext2fs/bitops.h 
-check_desc.o : check_desc.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+check_desc.o : ./check_desc.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
   /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
   ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-closefs.o : closefs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+closefs.o : ./closefs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.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/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/time.h /usr/include/linux/ext2_fs.h ext2fs.h \
-  ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h \
-  ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-expanddir.o : expanddir.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/time.h \
+  /usr/include/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+expanddir.o : ./expanddir.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ext2fs.h ../et/com_err.h \
-  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
-  ../ext2fs/bitops.h 
-ext2_err.o : ext2_err.c 
-freefs.o : freefs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.h \
-  /usr/include/gnu/types.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/confname.h \
   /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ext2fs.h ../et/com_err.h \
+  /usr/include/alloca.h /usr/include/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h \
   /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
   ../ext2fs/bitops.h 
-get_pathname.o : get_pathname.c /usr/include/stdio.h /usr/include/features.h \
-  /usr/include/sys/cdefs.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/types.h /usr/include/linux/types.h \
+ext2_err.o : ./ext2_err.c 
+freefs.o : ./freefs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/libio.h /usr/include/_G_config.h /usr/include/unistd.h /usr/include/posix_opt.h \
+  /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
   /usr/include/asm/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/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
   ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-initialize.o : initialize.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
-  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-inline.o : inline.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
-  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-inode.o : inode.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-link.o : link.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ext2fs.h ../et/com_err.h \
-  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
-  ../ext2fs/bitops.h 
-llseek.o : llseek.c /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
-  /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/linux/errno.h \
-  /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
-  /usr/include/linux/unistd.h /usr/include/asm/unistd.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h 
-mkdir.o : mkdir.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
-  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-namei.o : namei.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ext2fs.h ../et/com_err.h \
-  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
-  ../ext2fs/bitops.h 
-newdir.o : newdir.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ext2fs.h ../et/com_err.h \
-  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
-  ../ext2fs/bitops.h 
-openfs.o : openfs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
-  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-read_bb.o : read_bb.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
-  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-read_bb_file.o : read_bb_file.c /usr/include/stdio.h /usr/include/features.h \
+get_pathname.o : ./get_pathname.c /usr/include/stdio.h /usr/include/features.h \
   /usr/include/sys/cdefs.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/types.h /usr/include/linux/types.h \
+  /usr/include/gnu/types.h /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/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/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+initialize.o : ./initialize.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
+  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+inline.o : ./inline.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
+  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+inode.o : ./inode.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+link.o : ./link.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
+  ../ext2fs/bitops.h 
+llseek.o : ./llseek.c /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
+  /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/linux/errno.h \
+  /usr/include/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
+  /usr/include/confname.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h /usr/include/linux/unistd.h /usr/include/asm/unistd.h 
+mkdir.o : ./mkdir.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
+  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+namei.o : ./namei.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
+  ../ext2fs/bitops.h 
+newdir.o : ./newdir.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ../ext2fs/io.h ../ext2fs/ext2_err.h \
+  ../ext2fs/bitops.h 
+openfs.o : ./openfs.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
+  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+read_bb.o : ./read_bb.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
+  /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
+read_bb_file.o : ./read_bb_file.c /usr/include/stdio.h /usr/include/features.h \
+  /usr/include/sys/cdefs.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/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
   /usr/include/asm/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/fcntl.h \
   /usr/include/linux/fcntl.h /usr/include/time.h /usr/include/sys/stat.h /usr/include/linux/stat.h \
-  /usr/include/linux/ext2_fs.h ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  /usr/include/linux/ext2_fs.h ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
   ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-rw_bitmaps.o : rw_bitmaps.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+rw_bitmaps.o : ./rw_bitmaps.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
   /usr/include/sys/stat.h /usr/include/linux/stat.h /usr/include/linux/ext2_fs.h \
-  ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
+  ./ext2fs.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
   ../ext2fs/io.h ../ext2fs/ext2_err.h ../ext2fs/bitops.h 
-unix_io.o : unix_io.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+unix_io.o : ./unix_io.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.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/types.h \
-  /usr/include/linux/types.h /usr/include/asm/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/unistd.h /usr/include/posix_opt.h /usr/include/gnu/types.h /usr/include/confname.h \
+  /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/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/fcntl.h /usr/include/linux/fcntl.h /usr/include/time.h \
   /usr/include/sys/stat.h /usr/include/linux/stat.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ext2_err.h io.h 
+  ./ext2_err.h ./io.h 
diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog
index 5fd3bfe..4dd44ed 100644
--- a/lib/ext2fs/ChangeLog
+++ b/lib/ext2fs/ChangeLog
@@ -1,3 +1,234 @@
+Thu Oct 26 12:09:16 1995    <tytso@rsts-11.mit.edu>
+
+	* ext2_err.et: Updated message in EXT2_ET_BASE to say version 0.5c
+
+	* swapfs.c (ext2fs_swap_super): Put an #ifdef check around
+		s_def_resuid and s_def_resgid for backwards compatibility.
+
+Fri Oct 20 23:33:31 1995    <tytso@rsts-11.mit.edu>
+
+	* bitops.h: Added #ifdef's for Sparc.
+
+Wed Sep  6 22:14:46 1995    <tytso@rsts-11.mit.edu>
+
+	* getsize.c: #include <sys/ioctl.h> under Linux to pick up ioctl()
+	        declaration
+
+	* closefs.c: #include <string.h> to pick up memset() declaration
+
+Mon Sep  4 21:45:29 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for BSD shared libraries.
+
+	* initialize.c (ext2fs_initialize): Correctly set the s_creator_os
+		flag.
+
+Mon Sep  4 09:55:30 1995    <tytso@rsts-11.mit.edu>
+
+	* unix_io.c (unix_open): Add a double check; if the passed in name
+		is NULL, return EXT2_ET_BAD_DEVICE_NAME.
+
+	* ext2_err.et (EXT2_ET_BAD_DEVICE_NAME): Added new error code
+
+Wed Aug 16 15:44:10 1995    <tytso@rsts-11.mit.edu>
+
+	* inode.c (ext2fs_check_directory): Use LINUX_S_ISDIR instead of
+		S_ISDIR.
+
+Tue Aug 15 13:08:36 1995    <tytso@rsts-11.mit.edu>
+
+	* getsize.c (ext2fs_get_device_size): Add support for reading the
+		partition size from a BSD disk label.
+
+Thu Aug 10 09:33:26 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* getsize.c (ext2fs_get_device_size): New function that determins
+		the size of a device.  Used by mke2fs and e2fsck.
+
+Sat Aug 12 03:09:54 1995  Remy Card  <card@bbj>
+
+	* Makefile.in (install): Install static libraries in $(ulibdir)
+		(/usr/lib on Linux) instead of $(libdir) (/lib on Linux).
+
+Wed Aug  9 17:04:23 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+	* bitmaps.c (ext2fs_free_inode_bitmap, ext2fs_free_block_bitmap):
+		Move these functions to freefs.c.
+
+	* closefs.c (ext2fs_flush): If swapping blocks, clear the group
+		descriptors shadow memory to keep purify quiet.  (This
+		also has the nice benefit that the unused portion of the
+		shadow descriptors are zeroed out.)
+
+	* dirblock.c (ext2fs_write_dir_block): We need to use
+		dirent->rec_len *before* it's byteswapped to find the
+		location of the next directory structure!
+
+	* alloc.c (ext2fs_new_inode): Fix bug which could potentially
+		cause ext2fs_new_inode to loop infinitely if we're trying
+		to allocate an inode in group #0 and there are no free
+		inodes at all in the system.
+
+	* closefs.c: #include <errno.h> if it exists.
+
+Sun Aug  6 13:27:50 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* ext2fs.h (BLOCK_FLAG_HOLE): Added new definition for
+		BLOCK_FLAG_APPEND.  Added documentation for the block
+		interator flags.
+
+Sat Aug  5 11:44:05 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* Makefile.in (DLL_INSTALL_DIR, ELF_INSTALL_DIR): Set the
+		installation directories correctly.
+
+Tue Jul 18 09:27:38 1995    <tytso@rsx-11.mit.edu>
+
+	* namei.c (process_dir_block): 
+	* mkdir.c (ext2fs_mkdir): 
+	* expanddir.c (expand_dir_proc): Use ext2fs_{read,write}_dir_block
+		to read/write the directory block.
+
+	* dirblock.c (ext2fs_read_dir_block), ext2fs_write_dir_block): New
+		file containing functions for reading and writing
+		directory blocks (byte swapping if necesssary)
+
+	* block.c (block_iterate_ind, block_iterate_dind, 
+		block_iterate_tind): Byte swap the block addresses if
+		EXT2_SWAP_BYTES is set (and swap them back before writing
+		them out.)
+
+	* inode.c (inocpy_with_swap): New function.
+	(ext2fs_get_next_inode, ext2fs_read_inode, ext2fs_write_inode):
+		Call inocpy_with_swap if EXT2_SWAP_BYTES if set.
+
+	* closefs.c (ext2fs_flush): If EXT2_SWAP_BYTES is set, then swap
+		the superblock and group descriptors before writing it out.
+
+	* openfs.c (ext2fs_open): If the magic number is byte-swapped,
+		then set the EXT2_SWAP_BYTES and byte-swap the superblock
+		and group descriptors.
+
+	* swapfs.c (ext2fs_swap_super, ext2fs_swap_group_desc): New functions
+		to desp ext2 filesystem structures.
+
+	* bitops.c (set_bit, clear_bit, test_bit): Use modifications
+		supplied by Pete A. Zaitcev so that the C language
+		versions of these functions are more portable.  They will
+		now work on both little and big endian systems, and the
+		assumption that 32-bit integers are used is gone.
+
+	* bitops.h (ext2_swab16, ext2_swab32): Added new functions for
+		doing byte swapping.
+
+	* ext2fs.h (EXT2_SWAP_BYTES): Add new flag which indicates that
+		byte swapping should take place.
+
+Sun Jul 16 06:21:43 1995    <tytso@rsx-11.mit.edu>
+
+	* Makefile.in, cmp_bitmaps.c (ext2fs_compare_block_bitmap_end,
+	        ext2fs_compare_inode_bitmap_end): Added new file
+		containing routines to compare bitmaps.
+
+	* ext2_err.et (EXT2_ET_NEQ_BLOCK_BITMAP, EXT2_ET_NEQ_INODE_BITMAP): 
+		Added new error codes.
+
+Sat Jul 15 04:23:37 1995    <tytso@rsx-11.mit.edu>
+
+	* inode.c (ext2fs_get_next_inode): Don't check scan->inode_buffer;
+		if the magic number is correct, it will be allocated.
+
+Fri Jul 14 19:02:59 1995    <tytso@rsx-11.mit.edu>
+
+	* block.c (block_iterate_ind, block_iterate_dind, 
+		block_iterate_tind): Don't recompute block_nr each loop;
+		just increment it!  Factor check of BLOCK_FLAG_APPEND out
+		of the loop.  Factor mask of BLOCK_CHANGED into changed
+		variable out of the loop.  (block_iterate_ind, in
+		particular, gets called a lot, so every little
+		optimization helps.)
+
+Thu Jul 13 08:02:45 1995    <tytso@rsx-11.mit.edu>
+
+	* block.c (block_iterate_ind, block_iterate_dind, 
+		block_iterate_tind): Precompute limit of loop to speed up
+		block_iterate_ind and company.
+
+	* bitops.h (ext2fs_fast_mark_block_bitmap, 
+		ext2fs_fast_unmark_block_bitmap, ext2fs_fast_test_block_bitmap,
+		ext2fs_fast_mark_inode_bitmap, ext2fs_fast_unmark_inode_bitmap,
+		ext2fs_fast_test_inode_bitmap): Add fast version of these
+		functions, which don't do range checking.
+
+	* bitops.h (ext2fs_get_block_bitmap_start, 
+		ext2fs_get_inode_bitmap_start, ext2fs_get_block_bitmap_end,
+		ext2fs_get_inode_bitmap_end): Add new accessor functions
+		which return the start and end points of the bitmaps.
+
+Tue Jul 11 18:59:41 1995    <tytso@rsx-11.mit.edu>
+
+	* llseek.c (ext2_llseek): If the offset is small enough, use lseek
+		instead of llseek.  The errno if the offset is too large
+		and lseek is not supported should be EINVAL, not -EINVAL.
+
+Thu Jun 15 23:43:02 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for ELF shared libraries.
+		Fixed typos in the compilation rules.
+		(distclean): Added Makefile.
+
+	* llseek.c (llseek): New function, if llseek() does not exist in the
+	C library.
+	(ext2_llseek): Changed to call llseek().
+
+Mon Jun 12 08:29:07 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* ext2fs.h: Use __u32 to define blk_t, instead of unsigned long.
+
+Sun Jun 11 15:02:54 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* mkdir.c (ext2fs_mkdir): Use LINUX_S_IFDIR instead of S_IFDIR.
+
+	* ext2fs.h (LINUX_S_IFDIR): Define a linux specific versions of
+		the S_*, which are normally defined in <sys/stat.h>.  This
+		allows us to compile e2fsprogs on a non-Linux system,
+		which may have a different value for S_IFDIR.
+
+Sat Jun 10 23:47:05 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* bitops.c (clear_bit, set_bit): Remove calls to cli() and sti();
+		this is a user-mode application!
+
+Thu Jun  8 13:13:22 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* llseek.c: Put the include of <linux/unistd.h> inside the #ifdef
+	__linux__ so that non-linux systems won't see it.
+
+	* alloc.c: Include <errno.h> if possible.
+	* badblocks.c: Ditto.
+	* bb_inode.c: Ditto.
+	* bitmaps.c: Ditto.
+	* block.c: Ditto.
+	* expanddir.c: Ditto.
+	* get_pathname.c: Ditto.
+	* initialize.c: Ditto.
+	* inode.c: Ditto.
+	* llseek.c: Ditto.
+	* mkdir.c: Ditto.
+	* namei.c: Ditto.
+	* newdir.c: Ditto.
+	* openfs.c: Ditto.
+	* rw_bitmaps.c: Ditto.
+	* unix_io.c: Ditto.
+
+	* Makefile.in: Rewritten to conform to GNU coding standards and
+	support separate compilation directories.
+
+Thu May 11 04:13:12 1995    <tytso@rsx-11.mit.edu>
+
+	* initialize.c (ext2fs_initialize): Don't allow more than one
+		bitmaps's worth of inodes in a group.
+
 Sat Mar 11 14:07:11 1995  Theodore Y. Ts'o  <tytso@localhost>
 
 	* llseek.c (ext2_llseek): Added error checking to the llseek()
diff --git a/lib/ext2fs/MAKELOG b/lib/ext2fs/MAKELOG
deleted file mode 100644
index bb85c24..0000000
--- a/lib/ext2fs/MAKELOG
+++ /dev/null
@@ -1,54 +0,0 @@
-gcc -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -I.. -c bitmaps.c
-In file included from ext2fs.h:22,
-                 from bitmaps.c:20:
-../ext2fs/io.h:12: warning: ANSI C does not support `long long'
-../ext2fs/bitops.h: In function `ext2fs_mark_block_bitmap':
-In file included from ext2fs.h:112,
-                 from bitmaps.c:20:
-../ext2fs/bitops.h:145: warning: passing arg 1 of `ext2fs_warn_bitmap' from incompatible pointer type
-../ext2fs/bitops.h: In function `ext2fs_unmark_block_bitmap':
-../ext2fs/bitops.h:154: warning: passing arg 1 of `ext2fs_warn_bitmap' from incompatible pointer type
-../ext2fs/bitops.h: At top level:
-../ext2fs/bitops.h:160: conflicting types for `ext2fs_test_block_bitmap'
-../ext2fs/bitops.h:31: previous declaration of `ext2fs_test_block_bitmap'
-../ext2fs/bitops.h: In function `ext2fs_test_block_bitmap':
-../ext2fs/bitops.h:163: warning: passing arg 1 of `ext2fs_warn_bitmap' from incompatible pointer type
-../ext2fs/bitops.h: In function `ext2fs_mark_inode_bitmap':
-../ext2fs/bitops.h:172: warning: passing arg 1 of `ext2fs_warn_bitmap' from incompatible pointer type
-../ext2fs/bitops.h: In function `ext2fs_unmark_inode_bitmap':
-../ext2fs/bitops.h:181: warning: passing arg 1 of `ext2fs_warn_bitmap' from incompatible pointer type
-../ext2fs/bitops.h: At top level:
-../ext2fs/bitops.h:187: conflicting types for `ext2fs_test_inode_bitmap'
-../ext2fs/bitops.h:36: previous declaration of `ext2fs_test_inode_bitmap'
-../ext2fs/bitops.h: In function `ext2fs_test_inode_bitmap':
-../ext2fs/bitops.h:190: warning: passing arg 1 of `ext2fs_warn_bitmap' from incompatible pointer type
-bitmaps.c: In function `ext2fs_read_inode_bitmap':
-bitmaps.c:108: warning: implicit declaration of function `ext2fs_free_inode_bitmap'
-bitmaps.c:109: structure has no member named `device'
-bitmaps.c:110: structure has no member named `device'
-bitmaps.c:110: warning: format argument is not a pointer (arg 3)
-bitmaps.c:103: warning: `nbytes' may be used uninitialized in this function
-bitmaps.c: In function `ext2fs_read_block_bitmap':
-bitmaps.c:154: warning: implicit declaration of function `ext2fs_free_block_bitmap'
-bitmaps.c:155: structure has no member named `device'
-bitmaps.c:156: structure has no member named `device'
-bitmaps.c:156: warning: format argument is not a pointer (arg 3)
-bitmaps.c:149: warning: `nbytes' may be used uninitialized in this function
-bitmaps.c: In function `ext2fs_allocate_inode_bitmap':
-bitmaps.c:194: warning: `map' may be used uninitialized in this function
-bitmaps.c: In function `ext2fs_allocate_block_bitmap':
-bitmaps.c:235: warning: `map' may be used uninitialized in this function
-bitmaps.c: At top level:
-bitmaps.c:272: warning: no previous prototype for `ext2fs_free_inode_bitmap'
-bitmaps.c:272: warning: type mismatch with previous external decl
-bitmaps.c:108: warning: previous external decl of `ext2fs_free_inode_bitmap'
-bitmaps.c:272: warning: type mismatch with previous implicit declaration
-bitmaps.c:108: warning: previous implicit declaration of `ext2fs_free_inode_bitmap'
-bitmaps.c:272: warning: `ext2fs_free_inode_bitmap' was previously implicitly declared to return `int'
-bitmaps.c:286: warning: no previous prototype for `ext2fs_free_block_bitmap'
-bitmaps.c:286: warning: type mismatch with previous external decl
-bitmaps.c:154: warning: previous external decl of `ext2fs_free_block_bitmap'
-bitmaps.c:286: warning: type mismatch with previous implicit declaration
-bitmaps.c:154: warning: previous implicit declaration of `ext2fs_free_block_bitmap'
-bitmaps.c:286: warning: `ext2fs_free_block_bitmap' was previously implicitly declared to return `int'
-make: *** [bitmaps.o] Error 1
diff --git a/lib/ext2fs/Makefile b/lib/ext2fs/Makefile
deleted file mode 100644
index 5f991cf..0000000
--- a/lib/ext2fs/Makefile
+++ /dev/null
@@ -1,107 +0,0 @@
-all:: libext2fs.a
-
-include ../../MCONFIG
-
-OBJS= ext2_err.o openfs.o freefs.o closefs.o bitmaps.o rw_bitmaps.o inode.o \
-	unix_io.o block.o namei.o newdir.o mkdir.o check_desc.o \
-	get_pathname.o bitops.o link.o alloc.o expanddir.o inline.o \
-	initialize.o badblocks.o read_bb.o bb_inode.o read_bb_file.o llseek.o
-
-HFILES= bitops.h ext2_err.h ext2fs.h io.h
-
-ifdef BUILD_PROFILE_LIBS
-all:: libext2fs_p.a
-endif
-
-ifdef BUILD_DLL_SHLIBS
-DLL_ADDRESS = 0x66900000
-DLL_JUMPSIZE = 0x1000
-DLL_GOTSIZE  = 0x1000
-DLL_VERSION = 1.0
-DLL_IMAGE = libe2fs
-DLL_STUB = libext2fs
-DLL_LIBS = -L../.. -lcom_err
-DLL_MYDIR = ext2fs
-DLL_INSTALL_DIR = $(SHLIBDIR)
-
-include ../Makefile.dll-lib
-endif
-
-COMPILE_ET=../et/compile_et
-
-CFLAGS_NO=	$(WFLAGS) -I..
-CFLAGS=		$(OPT) $(CFLAGS_NO)
-LDFLAGS=	$(OPT)
-
-RM=rm -f
-MV=mv
-LN=ln -s
-
-DISTFILES= Makefile *.c *.h image
-
-.c.o:
-	$(CC) $(CFLAGS) -c $*.c
-ifdef BUILD_PROFILE_LIBS
-	$(CC) $(CFLAGS_NO) -pg -o profiled/$*.o -c $*.c
-endif
-#	$(CC) $(CFLAGS_NO) -checker -g -o checker/$*.o -c $*.c
-ifdef BUILD_DLL_SHLIBS
-	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
-		-o jump/$*.o -c $*.c)
-endif
-
-libext2fs.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	$(ARCHIVE) $@ $(OBJS)
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) ext2fs/$@ ../$@
-
-libext2fs_p.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	(cd profiled; $(ARCHIVE) ../$@ $(OBJS))
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) ext2fs/$@ ../$@
-
-libext2fs_chk.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	(cd checker; $(ARCHIVE) ../$@ $(OBJS))
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) ext2fs/$@ ../$@
-
-ext2_err.c ext2_err.h: ext2_err.et
-	$(COMPILE_ET) ext2_err.et
-
-install-libs:: all
-	$(INSTALLLIB) libext2fs.a $(LIBDIR)/libext2fs.a
-	$(CHMOD) 644 $(LIBDIR)/libext2fs.a
-	$(RANLIB) $(LIBDIR)/libext2fs.a
-	$(CHMOD) $(LIBMODE) $(LIBDIR)/libext2fs.a
-
-install-libs:: $(HFILES)
-	@rm -rf $(INCLDIR)/ext2fs
-	@mkdir $(INCLDIR)/ext2fs
-	for i in $(HFILES); do \
-		$(INSTALLINC) $$i $(INCLDIR)/ext2fs/$$i; \
-	done
-
-install-tree::
-
-install::
-
-clean::
-	rm -f \#* *.s *.o *.a *~ *.bak core profiled/* checker/*
-	rm -f ../libext2fs.a ../libext2fs_p.a ../libext2fs_chk.a
-
-really-clean:: clean
-	rm -f .depend ext2_err.c ext2_err.h
-
-dep depend .depend: ext2_err.h
-	$(CC) -M $(CFLAGS) *.c >.depend
-
-include .depend
diff --git a/lib/ext2fs/Makefile.in b/lib/ext2fs/Makefile.in
new file mode 100644
index 0000000..879ea81
--- /dev/null
+++ b/lib/ext2fs/Makefile.in
@@ -0,0 +1,289 @@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+top_builddir = ../..
+INSTALL = @INSTALL@
+
+@MCONFIG@
+
+OBJS= ext2_err.o \
+	alloc.o \
+	badblocks.o \
+	bb_inode.o \
+	bitmaps.o \
+	bitops.o \
+	block.o \
+	check_desc.o \
+	closefs.o \
+	cmp_bitmaps.o \
+	dirblock.o \
+	expanddir.o \
+	freefs.o \
+	get_pathname.o \
+	getsize.o \
+	initialize.o \
+	inline.o \
+	inode.o \
+	ismounted.o \
+	link.o \
+	llseek.o \
+	mkdir.o \
+	namei.o \
+	newdir.o \
+	openfs.o \
+	read_bb.o \
+	read_bb_file.o \
+	rw_bitmaps.o \
+	swapfs.o \
+	unix_io.o 
+
+SRCS= ext2_err.c \
+	$(srcdir)/alloc.c \
+	$(srcdir)/badblocks.c \
+	$(srcdir)/bb_inode.c \
+	$(srcdir)/bitmaps.c \
+	$(srcdir)/bitops.c \
+	$(srcdir)/block.c \
+	$(srcdir)/check_desc.c \
+	$(srcdir)/closefs.c \
+	$(srcdir)/cmp_bitmaps.c \
+	$(srcdir)/dirblock.c \
+	$(srcdir)/expanddir.c \
+	$(srcdir)/freefs.c \
+	$(srcdir)/get_pathname.c \
+	$(srcdir)/getsize.c \
+	$(srcdir)/initialize.c \
+	$(srcdir)/inline.c \
+	$(srcdir)/inode.c \
+	$(srcdir)/ismounted.c \
+	$(srcdir)/link.c \
+	$(srcdir)/llseek.c \
+	$(srcdir)/mkdir.c \
+	$(srcdir)/namei.c \
+	$(srcdir)/newdir.c \
+	$(srcdir)/openfs.c \
+	$(srcdir)/read_bb.c \
+	$(srcdir)/read_bb_file.c \
+	$(srcdir)/rw_bitmaps.c \
+	$(srcdir)/swapfs.c \
+	$(srcdir)/unix_io.c 
+
+HFILES= bitops.h ext2fs.h io.h
+
+LIBRARY= libext2fs
+LIBDIR= ext2fs
+
+DLL_ADDRESS = 0x66900000
+DLL_JUMPSIZE = 0x1000
+DLL_GOTSIZE  = 0x1000
+DLL_VERSION = 1.1
+DLL_IMAGE = libe2fs
+DLL_STUB = libext2fs
+DLL_LIBS = -L../.. -lcom_err
+DLL_MYDIR = ext2fs
+DLL_INSTALL_DIR = $(libdir)
+
+ELF_VERSION = 2.0
+ELF_IMAGE = libext2fs
+ELF_MYDIR = ext2fs
+ELF_INSTALL_DIR = $(libdir)
+
+BSDLIB_VERSION = 2.0
+BSDLIB_IMAGE = libext2fs
+BSDLIB_MYDIR = ext2fs
+BSDLIB_INSTALL_DIR = $(libdir)
+
+@MAKEFILE_LIBRARY@
+@MAKEFILE_DLL@
+@MAKEFILE_ELF@
+@MAKEFILE_BSDLIB@
+@MAKEFILE_PROFILE@
+@MAKEFILE_CHECKER@
+
+.c.o:
+	$(CC) $(CFLAGS) -c $< -o $@
+@PROFILE_CMT@	$(CC) $(CFLAGS) -pg -o profiled/$*.o -c $<
+@CHECKER_CMT@	$(CC) $(CFLAGS) -checker -g -o checker/$*.o -c $<
+@DLL_CMT@	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
+@DLL_CMT@		-o jump/$*.o -c $<)
+@ELF_CMT@	$(CC) $(CFLAGS) -fPIC -o elfshared/$*.o -c $<
+@BSDLIB_CMT@	$(CC) $(CFLAGS) -fpic -o pic/$*.o -c $<
+
+COMPILE_ET=../et/compile_et
+
+DISTFILES= Makefile *.c *.h image
+
+ext2_err.c ext2_err.h: $(srcdir)/ext2_err.et
+	$(COMPILE_ET) $(srcdir)/ext2_err.et
+
+installdirs::
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(ulibdir) \
+		$(DESTDIR)$(includedir)/ext2fs
+
+install:: all $(HFILES) installdirs 
+	$(INSTALL_DATA) libext2fs.a $(DESTDIR)$(ulibdir)/libext2fs.a
+	$(CHMOD) 644 $(DESTDIR)$(ulibdir)/libext2fs.a
+	-$(RANLIB) $(DESTDIR)$(ulibdir)/libext2fs.a
+	$(CHMOD) $(LIBMODE) $(DESTDIR)$(ulibdir)/libext2fs.a
+	for i in $(HFILES); do \
+		$(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir)/ext2fs/$$i; \
+	done
+	$(INSTALL_DATA) ext2_err.h  $(DESTDIR)$(includedir)/ext2fs/ext2_err.h
+
+uninstall::
+	$(RM) -f $(ulibdir)/libext2fs.a
+	$(RM) -rf $(includedir)/ext2fs
+
+clean::
+	$(RM) -f \#* *.s *.o *.a *~ *.bak core profiled/* checker/* \
+		ext2_err.c ext2_err.h \
+		../libext2fs.a ../libext2fs_p.a ../libext2fs_chk.a
+
+mostlyclean:: clean
+distclean:: clean
+	$(RM) -f .depend ext2_err.c ext2_err.h Makefile
+
+# +++ Dependency line eater +++
+# 
+# Makefile dependencies follow.  This must be the last section in
+# the Makefile.in file
+#
+ext2_err.o: ext2_err.c
+alloc.o: $(srcdir)/alloc.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+badblocks.o: $(srcdir)/badblocks.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+bb_inode.o: $(srcdir)/bb_inode.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+bitmaps.o: $(srcdir)/bitmaps.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+bitops.o: $(srcdir)/bitops.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+block.o: $(srcdir)/block.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+check_desc.o: $(srcdir)/check_desc.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+closefs.o: $(srcdir)/closefs.c \
+  $(srcdir)/ext2fs.h $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+cmp_bitmaps.o: $(srcdir)/cmp_bitmaps.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+dirblock.o: $(srcdir)/dirblock.c \
+  $(srcdir)/ext2fs.h $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+expanddir.o: $(srcdir)/expanddir.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+freefs.o: $(srcdir)/freefs.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+get_pathname.o: $(srcdir)/get_pathname.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+getsize.o: $(srcdir)/getsize.c \
+  $(srcdir)/ext2fs.h $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+initialize.o: $(srcdir)/initialize.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+inline.o: $(srcdir)/inline.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+inode.o: $(srcdir)/inode.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+ismounted.o: $(srcdir)/ismounted.c \
+  $(srcdir)/ext2fs.h $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+link.o: $(srcdir)/link.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+llseek.o: $(srcdir)/llseek.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h \
+  
+mkdir.o: $(srcdir)/mkdir.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+namei.o: $(srcdir)/namei.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+newdir.o: $(srcdir)/newdir.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+openfs.o: $(srcdir)/openfs.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+read_bb.o: $(srcdir)/read_bb.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+read_bb_file.o: $(srcdir)/read_bb_file.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+rw_bitmaps.o: $(srcdir)/rw_bitmaps.c \
+  $(srcdir)/ext2fs.h \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+swapfs.o: $(srcdir)/swapfs.c \
+  $(srcdir)/ext2fs.h $(top_srcdir)/lib/et/com_err.h \
+  $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+  $(srcdir)/bitops.h
+unix_io.o: $(srcdir)/unix_io.c \
+  $(top_srcdir)/lib/et/com_err.h \
+  $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/io.h
+
diff --git a/lib/ext2fs/alloc.c b/lib/ext2fs/alloc.c
index 26c0111..5465e80 100644
--- a/lib/ext2fs/alloc.c
+++ b/lib/ext2fs/alloc.c
@@ -11,6 +11,9 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -40,9 +43,9 @@
 		dir_group = (dir - 1) / EXT2_INODES_PER_GROUP(fs->super);
 
 	start_inode = (dir_group * EXT2_INODES_PER_GROUP(fs->super)) + 1;
+	if (start_inode < EXT2_FIRST_INO)
+		start_inode = EXT2_FIRST_INO;
 	i = start_inode;
-	if (i < EXT2_FIRST_INO)
-		i = EXT2_FIRST_INO;
 
 	do {
 		if (!ext2fs_test_inode_bitmap(map, i))
diff --git a/lib/ext2fs/badblocks.c b/lib/ext2fs/badblocks.c
index 8a40501..f286747 100644
--- a/lib/ext2fs/badblocks.c
+++ b/lib/ext2fs/badblocks.c
@@ -13,6 +13,9 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
diff --git a/lib/ext2fs/bb_inode.c b/lib/ext2fs/bb_inode.c
index 2b0ea9f..c8dfeba 100644
--- a/lib/ext2fs/bb_inode.c
+++ b/lib/ext2fs/bb_inode.c
@@ -17,6 +17,9 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
diff --git a/lib/ext2fs/bitmaps.c b/lib/ext2fs/bitmaps.c
index 8712e2d..d5ef0ec 100644
--- a/lib/ext2fs/bitmaps.c
+++ b/lib/ext2fs/bitmaps.c
@@ -14,6 +14,9 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -151,37 +154,3 @@
 	       ((bitmap->real_end - bitmap->start) / 8) + 1);
 }
 
-void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap)
-{
-	if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_INODE_BITMAP))
-		return;
-
-	bitmap->magic = 0;
-	if (bitmap->description) {
-		free(bitmap->description);
-		bitmap->description = 0;
-	}
-	if (bitmap->bitmap) {
-		free(bitmap->bitmap);
-		bitmap->bitmap = 0;
-	}
-	free(bitmap);
-}
-
-void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap)
-{
-	if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_BLOCK_BITMAP))
-		return;
-
-	bitmap->magic = 0;
-	if (bitmap->description) {
-		free(bitmap->description);
-		bitmap->description = 0;
-	}
-	if (bitmap->bitmap) {
-		free(bitmap->bitmap);
-		bitmap->bitmap = 0;
-	}
-	free(bitmap);
-}
-
diff --git a/lib/ext2fs/bitops.c b/lib/ext2fs/bitops.c
index c037199..0dc8967 100644
--- a/lib/ext2fs/bitops.c
+++ b/lib/ext2fs/bitops.c
@@ -21,54 +21,46 @@
  * For the benefit of those who are trying to port Linux to another
  * architecture, here are some C-language equivalents.  You should
  * recode these in the native assmebly language, if at all possible.
- * To guarantee atomicity, these routines call cli() and sti() to
- * disable interrupts while they operate.  (You have to provide inline
- * routines to cli() and sti().)
  *
- * Also note, these routines assume that you have 32 bit integers.
- * You will have to change this if you are trying to port Linux to the
- * Alpha architecture or to a Cray.  :-)
- * 
- * C language equivalents written by Theodore Ts'o, 9/26/92
+ * C language equivalents written by Theodore Ts'o, 9/26/92.
+ * Modified by Pete A. Zaitcev 7/14/95 to be portable to big endian
+ * systems, as well as non-32 bit systems.
  */
 
 int set_bit(int nr,void * addr)
 {
-	int	mask, retval;
-	int	*ADDR = (int *) addr;
+	int		mask, retval;
+	unsigned char	*ADDR = (unsigned char *) addr;
 
-	ADDR += nr >> 5;
-	mask = 1 << (nr & 0x1f);
-	cli();
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
 	retval = (mask & *ADDR) != 0;
 	*ADDR |= mask;
-	sti();
 	return retval;
 }
 
 int clear_bit(int nr, void * addr)
 {
-	int	mask, retval;
-	int	*ADDR = (int *) addr;
+	int		mask, retval;
+	unsigned char	*ADDR = (unsigned char *) addr;
 
-	ADDR += nr >> 5;
-	mask = 1 << (nr & 0x1f);
-	cli();
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
 	retval = (mask & *ADDR) != 0;
 	*ADDR &= ~mask;
-	sti();
 	return retval;
 }
 
 int test_bit(int nr, const void * addr)
 {
-	int		mask;
-	const int	*ADDR = (const int *) addr;
+	int			mask;
+	const unsigned char	*ADDR = (const unsigned char *) addr;
 
-	ADDR += nr >> 5;
-	mask = 1 << (nr & 0x1f);
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
 	return ((mask & *ADDR) != 0);
 }
+
 #endif	/* !_EXT2_HAVE_ASM_BITOPS_ */
 
 void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg,
diff --git a/lib/ext2fs/bitops.h b/lib/ext2fs/bitops.h
index 87e7d79..4b0fa39 100644
--- a/lib/ext2fs/bitops.h
+++ b/lib/ext2fs/bitops.h
@@ -1,7 +1,8 @@
 /*
- * bitops.h --- Bitmap frobbing code.
+ * bitops.h --- Bitmap frobbing code.  The byte swapping routines are
+ * 	also included here.
  * 
- * Copyright (C) 1993, 1994 Theodore Ts'o.  This file may be
+ * Copyright (C) 1993, 1994, 1995 Theodore Ts'o.  This file may be
  * redistributed under the terms of the GNU Public License.
  * 
  * Taken from <asm/bitops.h>, Copyright 1992, Linus Torvalds.
@@ -11,6 +12,8 @@
 extern int set_bit(int nr,void * addr);
 extern int clear_bit(int nr, void * addr);
 extern int test_bit(int nr, const void * addr);
+extern __u16 ext2fs_swab16(__u16 val);
+extern __u32 ext2fs_swab32(__u32 val);
 
 /*
  * EXT2FS bitmap manipulation routines.
@@ -35,12 +38,40 @@
 				       ino_t inode);
 extern int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode);
 
+extern void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
+					  blk_t block);
+extern void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
+					    blk_t block);
+extern int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
+					 blk_t block);
+
+extern void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+					  ino_t inode);
+extern void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+					    ino_t inode);
+extern int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
+					 ino_t inode);
+extern blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap);
+extern blk_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap);
+extern blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap);
+extern blk_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap);
+
 /*
  * The inline routines themselves...
  * 
  * If NO_INLINE_FUNCS is defined, then we won't try to do inline
- * functions at all!
+ * functions at all; they will be included as normal functions in
+ * inline.c
  */
+#ifdef NO_INLINE_FUNCS
+#if (defined(__i386__) || defined(__i486__) || defined(__i586__) || \
+     defined(__mc68000__) || defined(__sparc__))
+	/* This prevents bitops.c from trying to include the C */
+	/* function version of these functions */
+#define _EXT2_HAVE_ASM_BITOPS_
+#endif
+#endif /* NO_INLINE_FUNCS */
+
 #if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
 #ifdef INCLUDE_INLINE_FUNCS
 #define _INLINE_ extern
@@ -137,6 +168,61 @@
 
 #endif /* __mc68000__ */
 
+#ifdef __sparc__
+
+#define _EXT2_HAVE_ASM_BITOPS_
+
+_INLINE_ int set_bit(int nr, void *addr)
+{
+	int		mask, retval;
+	unsigned long	*ADDR = (unsigned long *) addr;
+
+	ADDR += nr >> 5;
+	mask = 1 << (nr & 31);
+	retval = ((mask & *ADDR) != 0);
+	*ADDR |= mask;
+	return retval;
+}
+
+_INLINE_ int clear_bit(int nr, void *addr)
+{
+	int		mask, retval;
+	unsigned long	*ADDR = (unsigned long *) addr;
+
+	ADDR += nr >> 5;
+	mask = 1 << (nr & 31);
+	retval = ((mask & *ADDR) != 0);
+	*ADDR &= ~mask;
+	return retval;
+}
+
+_INLINE_ int test_bit(int nr, const void *addr)
+{
+	int			mask;
+	const unsigned long	*ADDR = (const unsigned long *) addr;
+
+	ADDR += nr >> 5;
+	mask = 1 << (nr & 31);
+	return ((mask & *ADDR) != 0);
+}
+
+#endif /* __sparc__ */
+
+#ifndef _EXT2_HAVE_ASM_SWAB
+
+_INLINE_ __u16 ext2fs_swab16(__u16 val)
+{
+	return (val >> 8) | (val << 8);
+}
+
+_INLINE_ __u32 ext2fs_swab32(__u32 val)
+{
+	return ((val>>24) | ((val>>8)&0xFF00) |
+		((val<<8)&0xFF0000) | (val<<24));
+}
+
+#endif /* !_EXT2_HAVE_ASM_SWAB */
+
 _INLINE_ void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap,
 				       blk_t block)
 {
@@ -203,5 +289,104 @@
 	return test_bit(inode - bitmap->start, bitmap->bitmap);
 }
 
+_INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
+					    blk_t block)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+	if ((block < bitmap->start) || (block > bitmap->end)) {
+		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
+				   bitmap->description);
+		return;
+	}
+#endif	
+	set_bit(block - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
+					      blk_t block)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+	if ((block < bitmap->start) || (block > bitmap->end)) {
+		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK,
+				   block, bitmap->description);
+		return;
+	}
+#endif
+	clear_bit(block - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
+					    blk_t block)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+	if ((block < bitmap->start) || (block > bitmap->end)) {
+		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
+				   block, bitmap->description);
+		return 0;
+	}
+#endif
+	return test_bit(block - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+					    ino_t inode)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+	if ((inode < bitmap->start) || (inode > bitmap->end)) {
+		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_MARK,
+				   inode, bitmap->description);
+		return;
+	}
+#endif
+	set_bit(inode - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+					      ino_t inode)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+	if ((inode < bitmap->start) || (inode > bitmap->end)) {
+		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_UNMARK,
+				   inode, bitmap->description);
+		return;
+	}
+#endif
+	clear_bit(inode - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
+					   ino_t inode)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+	if ((inode < bitmap->start) || (inode > bitmap->end)) {
+		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST,
+				   inode, bitmap->description);
+		return 0;
+	}
+#endif
+	return test_bit(inode - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap)
+{
+	return bitmap->start;
+}
+
+_INLINE_ blk_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap)
+{
+	return bitmap->start;
+}
+
+_INLINE_ blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap)
+{
+	return bitmap->end;
+}
+
+_INLINE_ blk_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap)
+{
+	return bitmap->end;
+}
+
 #undef _INLINE_
 #endif
+
diff --git a/lib/ext2fs/block.c b/lib/ext2fs/block.c
index 53c193c..fe112b3 100644
--- a/lib/ext2fs/block.c
+++ b/lib/ext2fs/block.c
@@ -9,6 +9,9 @@
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -33,7 +36,7 @@
 static int block_iterate_ind(blk_t *ind_block, struct block_context *ctx)
 {
 	int	ret = 0, changed = 0;
-	int	i, flags;
+	int	i, flags, limit;
 	blk_t	*block_nr;
 
 	if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE))
@@ -52,19 +55,42 @@
 		ret |= BLOCK_ERROR;
 		return ret;
 	}
-	for (i = 0; i < (ctx->fs->blocksize >> 2); i++, ctx->bcount++) {
-		block_nr = (blk_t *) ctx->ind_buf + i;
-		if (*block_nr || (ctx->flags & BLOCK_FLAG_APPEND)) {
+	limit = ctx->fs->blocksize >> 2;
+	if (ctx->fs->flags & EXT2_SWAP_BYTES) {
+		block_nr = (blk_t *) ctx->ind_buf;
+		for (i = 0; i < limit; i++, block_nr++)
+			*block_nr = ext2fs_swab32(*block_nr);
+	}
+	block_nr = (blk_t *) ctx->ind_buf;
+	if (ctx->flags & BLOCK_FLAG_APPEND) {
+		for (i = 0; i < limit; i++, ctx->bcount++, block_nr++) {
 			flags = (*ctx->func)(ctx->fs, block_nr, ctx->bcount,
 					     ctx->private);
-			changed	|= flags & BLOCK_CHANGED;
+			changed	|= flags;
+			if (flags & BLOCK_ABORT) {
+				ret |= BLOCK_ABORT;
+				break;
+			}
+		}
+	} else {
+		for (i = 0; i < limit; i++, ctx->bcount++, block_nr++) {
+			if (*block_nr == 0)
+				continue;
+			flags = (*ctx->func)(ctx->fs, block_nr, ctx->bcount,
+					     ctx->private);
+			changed	|= flags;
 			if (flags & BLOCK_ABORT) {
 				ret |= BLOCK_ABORT;
 				break;
 			}
 		}
 	}
-	if (changed) {
+	if (changed & BLOCK_CHANGED) {
+		if (ctx->fs->flags & EXT2_SWAP_BYTES) {
+			block_nr = (blk_t *) ctx->ind_buf;
+			for (i = 0; i < limit; i++, block_nr++)
+				*block_nr = ext2fs_swab32(*block_nr);
+		}
 		ctx->errcode = io_channel_write_blk(ctx->fs->io, *ind_block,
 						    1, ctx->ind_buf);
 		if (ctx->errcode)
@@ -79,7 +105,7 @@
 static int block_iterate_dind(blk_t *dind_block, struct block_context *ctx)
 {
 	int	ret = 0, changed = 0;
-	int	i, flags;
+	int	i, flags, limit;
 	blk_t	*block_nr;
 
 	if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE))
@@ -98,18 +124,40 @@
 		ret |= BLOCK_ERROR;
 		return ret;
 	}
-	for (i = 0; i < (ctx->fs->blocksize >> 2); i++) {
-		block_nr = (blk_t *) ctx->dind_buf + i;
-		if (*block_nr || (ctx->flags & BLOCK_FLAG_APPEND)) {
+	limit = ctx->fs->blocksize >> 2;
+	if (ctx->fs->flags & EXT2_SWAP_BYTES) {
+		block_nr = (blk_t *) ctx->dind_buf;
+		for (i = 0; i < limit; i++, block_nr++)
+			*block_nr = ext2fs_swab32(*block_nr);
+	}
+	block_nr = (blk_t *) ctx->dind_buf;
+	if (ctx->flags & BLOCK_FLAG_APPEND) {
+		for (i = 0; i < limit; i++, block_nr++) {
 			flags = block_iterate_ind(block_nr, ctx);
-			changed |= flags & BLOCK_CHANGED;
+			changed |= flags;
+			if (flags & (BLOCK_ABORT | BLOCK_ERROR)) {
+				ret |= flags & (BLOCK_ABORT | BLOCK_ERROR);
+				break;
+			}
+		}
+	} else {
+		for (i = 0; i < limit; i++, block_nr++) {
+			if (*block_nr == 0)
+				continue;
+			flags = block_iterate_ind(block_nr, ctx);
+			changed |= flags;
 			if (flags & (BLOCK_ABORT | BLOCK_ERROR)) {
 				ret |= flags & (BLOCK_ABORT | BLOCK_ERROR);
 				break;
 			}
 		}
 	}
-	if (changed) {
+	if (changed & BLOCK_CHANGED) {
+		if (ctx->fs->flags & EXT2_SWAP_BYTES) {
+			block_nr = (blk_t *) ctx->dind_buf;
+			for (i = 0; i < limit; i++, block_nr++)
+				*block_nr = ext2fs_swab32(*block_nr);
+		}
 		ctx->errcode = io_channel_write_blk(ctx->fs->io, *dind_block,
 						    1, ctx->dind_buf);
 		if (ctx->errcode)
@@ -124,7 +172,7 @@
 static int block_iterate_tind(blk_t *tind_block, struct block_context *ctx)
 {
 	int	ret = 0, changed = 0;
-	int	i, flags;
+	int	i, flags, limit;
 	blk_t	*block_nr;
 
 	if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE))
@@ -143,17 +191,40 @@
 		ret |= BLOCK_ERROR;
 		return ret;
 	}
-	for (i = 0; i < (ctx->fs->blocksize >> 2); i++) {
-		block_nr = (blk_t *) ctx->tind_buf + i;
-		if (*block_nr || (ctx->flags & BLOCK_FLAG_APPEND)) {
+	limit = ctx->fs->blocksize >> 2;
+	if (ctx->fs->flags & EXT2_SWAP_BYTES) {
+		block_nr = (blk_t *) ctx->tind_buf;
+		for (i = 0; i < limit; i++, block_nr++)
+			*block_nr = ext2fs_swab32(*block_nr);
+	}
+	block_nr = (blk_t *) ctx->tind_buf;
+	if (ctx->flags & BLOCK_FLAG_APPEND) {
+		for (i = 0; i < limit; i++, block_nr++) {
 			flags = block_iterate_dind(block_nr, ctx);
+			changed |= flags;
+			if (flags & (BLOCK_ABORT | BLOCK_ERROR)) {
+				ret |= flags & (BLOCK_ABORT | BLOCK_ERROR);
+				break;
+			}
+		}
+	} else {
+		for (i = 0; i < limit; i++, block_nr++) {
+			if (*block_nr == 0)
+				continue;
+			flags = block_iterate_dind(block_nr, ctx);
+			changed |= flags;
 			if (flags & (BLOCK_ABORT | BLOCK_ERROR)) {
 				ret |= flags & (BLOCK_ABORT | BLOCK_ERROR);
 				break;
 			}
 		}
 	}
-	if (changed) {
+	if (changed & BLOCK_CHANGED) {
+		if (ctx->fs->flags & EXT2_SWAP_BYTES) {
+			block_nr = (blk_t *) ctx->tind_buf;
+			for (i = 0; i < limit; i++, block_nr++)
+				*block_nr = ext2fs_swab32(*block_nr);
+		}
 		ctx->errcode = io_channel_write_blk(ctx->fs->io, *tind_block,
 						    1, ctx->tind_buf);
 		if (ctx->errcode)
diff --git a/lib/ext2fs/closefs.c b/lib/ext2fs/closefs.c
index 41a5052..d8b796e 100644
--- a/lib/ext2fs/closefs.c
+++ b/lib/ext2fs/closefs.c
@@ -9,6 +9,10 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <time.h>
+#include <string.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -21,27 +25,60 @@
 	errcode_t	retval;
 	char		*group_ptr;
 	unsigned long	fs_state;
+	struct ext2_super_block *super_shadow = 0;
+	struct ext2_group_desc *group_shadow = 0;
+	struct ext2_group_desc *s, *t;
 	
 	EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
 
+	fs_state = fs->super->s_state;
+
+	fs->super->s_wtime = time(NULL);
+	if (fs->flags & EXT2_SWAP_BYTES) {
+		retval = ENOMEM;
+		if (!(super_shadow = malloc(SUPERBLOCK_SIZE)))
+			goto errout;
+		if (!(group_shadow = malloc(fs->blocksize*fs->desc_blocks)))
+			goto errout;
+		memset(group_shadow, 0, fs->blocksize*fs->desc_blocks);
+
+		/* swap the superblock */
+		*super_shadow = *fs->super;
+		ext2fs_swap_super(super_shadow);
+
+		/* swap the group descriptors */
+		for (j=0, s=fs->group_desc, t=group_shadow;
+		     j < fs->group_desc_count; j++, t++, s++) {
+			*t = *s;
+			ext2fs_swap_group_desc(t);
+		}
+	} else {
+		super_shadow = fs->super;
+		group_shadow = fs->group_desc;
+	}
+	
 	/*
 	 * Write out master superblock.  This has to be done
 	 * separately, since it is located at a fixed location
 	 * (SUPERBLOCK_OFFSET).
 	 */
-	fs->super->s_wtime = time(NULL);
 	io_channel_set_blksize(fs->io, SUPERBLOCK_OFFSET);
-	retval = io_channel_write_blk(fs->io, 1, -SUPERBLOCK_SIZE, fs->super);
+	retval = io_channel_write_blk(fs->io, 1, -SUPERBLOCK_SIZE,
+				      super_shadow);
 	if (retval)
-		return retval;
+		goto errout;
 	io_channel_set_blksize(fs->io, fs->blocksize);
 
 	/*
-	 * Save the state of the FS and set it to non valid for the
-	 * backup superblocks
+	 * Set the state of the FS to be non-valid.  (The state has
+	 * already been backed up earlier, and will be restored when
+	 * we exit.)
 	 */
-	fs_state = fs->super->s_state;
 	fs->super->s_state &= ~EXT2_VALID_FS;
+	if (fs->flags & EXT2_SWAP_BYTES) {
+		*super_shadow = *fs->super;
+		ext2fs_swap_super(super_shadow);
+	}
 
 	/*
 	 * Write out the master group descriptors, and the backup
@@ -52,28 +89,22 @@
 		if (i !=0 ) {
 			retval = io_channel_write_blk(fs->io, group_block,
 						      -SUPERBLOCK_SIZE,
-						      fs->super);
-			if (retval) {
-				fs->super->s_state = fs_state;
-				return retval;
-			}
+						      super_shadow);
+			if (retval)
+				goto errout;
 		}
-		group_ptr = (char *) fs->group_desc;
+		group_ptr = (char *) group_shadow;
 		for (j=0; j < fs->desc_blocks; j++) {
 			retval = io_channel_write_blk(fs->io,
 						      group_block+1+j, 1,
 						      group_ptr);
-			if (retval) {
-				fs->super->s_state = fs_state;
-				return retval;
-			}
+			if (retval)
+				goto errout;
 			group_ptr += fs->blocksize;
 		}
 		group_block += EXT2_BLOCKS_PER_GROUP(fs->super);
 	}
 
-	fs->super->s_state = fs_state;
-
 	/*
 	 * If the write_bitmaps() function is present, call it to
 	 * flush the bitmaps.  This is done this way so that a simple
@@ -83,10 +114,19 @@
 	if (fs->write_bitmaps) {
 		retval = fs->write_bitmaps(fs);
 		if (retval)
-			return retval;
+			goto errout;
 	}
-		
-	return 0;
+
+	retval = 0;
+errout:
+	fs->super->s_state = fs_state;
+	if (fs->flags & EXT2_SWAP_BYTES) {
+		if (super_shadow)
+			free(super_shadow);
+		if (group_shadow)
+			free(group_shadow);
+	}
+	return retval;
 }
 
 errcode_t ext2fs_close(ext2_filsys fs)
diff --git a/lib/ext2fs/cmp_bitmaps.c b/lib/ext2fs/cmp_bitmaps.c
new file mode 100644
index 0000000..cc9eb6d
--- /dev/null
+++ b/lib/ext2fs/cmp_bitmaps.c
@@ -0,0 +1,65 @@
+/*
+ * cmp_bitmaps.c --- routines to compare inode and block bitmaps.
+ *
+ * Copyright (C) 1995 Theodore Ts'o.  This file may be redistributed
+ * under the terms of the GNU Public License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include <linux/ext2_fs.h>
+
+#include "ext2fs.h"
+
+errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
+				      ext2fs_block_bitmap bm2)
+{
+	int	i;
+	
+	EXT2_CHECK_MAGIC(bm1, EXT2_ET_MAGIC_BLOCK_BITMAP);
+	EXT2_CHECK_MAGIC(bm2, EXT2_ET_MAGIC_BLOCK_BITMAP);
+
+	if ((bm1->start != bm2->start) ||
+	    (bm1->end != bm2->end) ||
+	    (memcmp(bm1->bitmap, bm2->bitmap, (bm1->end - bm1->start)/8)))
+		return EXT2_ET_NEQ_BLOCK_BITMAP;
+
+	for (i = bm1->end - ((bm1->end - bm1->start) % 8); i <= bm1->end; i++)
+		if (ext2fs_fast_test_block_bitmap(bm1, i) !=
+		    ext2fs_fast_test_block_bitmap(bm2, i))
+			return EXT2_ET_NEQ_BLOCK_BITMAP;
+
+	return 0;
+}
+
+errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
+				      ext2fs_inode_bitmap bm2)
+{
+	int	i;
+	
+	EXT2_CHECK_MAGIC(bm1, EXT2_ET_MAGIC_INODE_BITMAP);
+	EXT2_CHECK_MAGIC(bm2, EXT2_ET_MAGIC_INODE_BITMAP);
+
+	if ((bm1->start != bm2->start) ||
+	    (bm1->end != bm2->end) ||
+	    (memcmp(bm1->bitmap, bm2->bitmap, (bm1->end - bm1->start)/8)))
+		return EXT2_ET_NEQ_INODE_BITMAP;
+
+	for (i = bm1->end - ((bm1->end - bm1->start) % 8); i <= bm1->end; i++)
+		if (ext2fs_fast_test_inode_bitmap(bm1, i) !=
+		    ext2fs_fast_test_inode_bitmap(bm2, i))
+			return EXT2_ET_NEQ_INODE_BITMAP;
+
+	return 0;
+}
+
diff --git a/lib/ext2fs/dirblock.c b/lib/ext2fs/dirblock.c
new file mode 100644
index 0000000..bb2f717
--- /dev/null
+++ b/lib/ext2fs/dirblock.c
@@ -0,0 +1,74 @@
+/*
+ * dirblock.c --- directory block routines.
+ * 
+ * Copyright (C) 1995 Theodore Ts'o.  This file may be redistributed
+ * under the terms of the GNU Public License.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <time.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include <linux/ext2_fs.h>
+
+#include "ext2fs.h"
+
+errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
+				void *buf)
+{
+	errcode_t	retval;
+	char		*p, *end;
+	struct ext2_dir_entry *dirent;
+
+ 	retval = io_channel_read_blk(fs->io, block, 1, buf);
+	if (retval)
+		return retval;
+	if ((fs->flags & EXT2_SWAP_BYTES) == 0)
+		return 0;
+	p = buf;
+	end = (char *) buf + fs->blocksize;
+	while (p < end) {
+		dirent = (struct ext2_dir_entry *) p;
+		dirent->inode = ext2fs_swab32(dirent->inode);
+		dirent->rec_len = ext2fs_swab16(dirent->rec_len);
+		dirent->name_len = ext2fs_swab16(dirent->name_len);
+		p += (dirent->rec_len < 8) ? 8 : dirent->rec_len;
+	}
+	return 0;
+}
+
+errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
+				 void *inbuf)
+{
+	errcode_t	retval;
+	char		*p, *end, *write_buf;
+	char		*buf = 0;
+	struct ext2_dir_entry *dirent;
+
+	if (fs->flags & EXT2_SWAP_BYTES) {
+		write_buf = buf = malloc(fs->blocksize);
+		if (!buf)
+			return ENOMEM;
+		memcpy(buf, inbuf, fs->blocksize);
+		p = buf;
+		end = buf + fs->blocksize;
+		while (p < end) {
+			dirent = (struct ext2_dir_entry *) p;
+			p += (dirent->rec_len < 8) ? 8 : dirent->rec_len;
+			dirent->inode = ext2fs_swab32(dirent->inode);
+			dirent->rec_len = ext2fs_swab16(dirent->rec_len);
+			dirent->name_len = ext2fs_swab16(dirent->name_len);
+		}
+	} else
+		write_buf = inbuf;
+ 	retval = io_channel_write_blk(fs->io, block, 1, write_buf);
+	if (buf)
+		free(buf);
+	return retval;
+}
+
+
diff --git a/lib/ext2fs/jump/jump.funcs b/lib/ext2fs/dll/jump.funcs
similarity index 77%
rename from lib/ext2fs/jump/jump.funcs
rename to lib/ext2fs/dll/jump.funcs
index a8f5674..730ee31 100644
--- a/lib/ext2fs/jump/jump.funcs
+++ b/lib/ext2fs/dll/jump.funcs
@@ -73,3 +73,23 @@
 00000000 T _initialize_ext2_error_table 	libext2fs       ext2_err
 00000000 T _ext2_llseek              		libext2fs       llseek
 00000000 T _ext2fs_set_inode_callback 		libext2fs       inode
+00000000 T _ext2fs_compare_block_bitmap		libext2fs       cmp_bitmaps
+00000000 T _ext2fs_compare_inode_bitmap		libext2fs       cmp_bitmaps
+00000000 T _ext2fs_read_dir_block		libext2fs       dirblock
+00000000 T _ext2fs_write_dir_block		libext2fs       dirblock
+00000000 T _ext2fs_swab16       		libext2fs       inline
+00000000 T _ext2fs_swab32       		libext2fs       inline
+00000000 T _ext2fs_fast_mark_block_bitmap 	libext2fs       inline
+00000000 T _ext2fs_fast_unmark_block_bitmap 	libext2fs       inline
+00000000 T _ext2fs_fast_test_block_bitmap 	libext2fs       inline
+00000000 T _ext2fs_fast_mark_inode_bitmap 	libext2fs       inline
+00000000 T _ext2fs_fast_unmark_inode_bitmap 	libext2fs       inline
+00000000 T _ext2fs_fast_test_inode_bitmap 	libext2fs       inline
+00000000 T _ext2fs_get_block_bitmap_start 	libext2fs       inline
+00000000 T _ext2fs_get_inode_bitmap_start 	libext2fs       inline
+00000000 T _ext2fs_get_block_bitmap_end 	libext2fs       inline
+00000000 T _ext2fs_get_inode_bitmap_end 	libext2fs       inline
+00000000 T _ext2fs_swap_super   		libext2fs       swapfs
+00000000 T _ext2fs_swap_group_desc 		libext2fs       swapfs
+00000000 T _ext2fs_get_device_size 		libext2fs       getsize
+00000000 T _ext2fs_check_if_mounted 		libext2fs       ismounted
diff --git a/lib/ext2fs/dll/jump.ignore b/lib/ext2fs/dll/jump.ignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lib/ext2fs/dll/jump.ignore
diff --git a/lib/ext2fs/jump/jump.import b/lib/ext2fs/dll/jump.import
similarity index 100%
rename from lib/ext2fs/jump/jump.import
rename to lib/ext2fs/dll/jump.import
diff --git a/lib/ext2fs/jump/jump.params b/lib/ext2fs/dll/jump.params
similarity index 84%
rename from lib/ext2fs/jump/jump.params
rename to lib/ext2fs/dll/jump.params
index ea74d63..cc96847 100644
--- a/lib/ext2fs/jump/jump.params
+++ b/lib/ext2fs/dll/jump.params
@@ -3,4 +3,4 @@
 Data=0x00000000
 Jump=0x00001000
 GOT=0x00001000
-Version=1.0.0
+Version=1.1.0
diff --git a/lib/ext2fs/dll/jump.undefs b/lib/ext2fs/dll/jump.undefs
new file mode 100644
index 0000000..294a0b7
--- /dev/null
+++ b/lib/ext2fs/dll/jump.undefs
@@ -0,0 +1,2 @@
+6690b080 D __NEEDS_SHRLIB_libc_4
+6690b098 D __NEEDS_SHRLIB_libet_1
diff --git a/lib/ext2fs/jump/jump.vars b/lib/ext2fs/dll/jump.vars
similarity index 100%
rename from lib/ext2fs/jump/jump.vars
rename to lib/ext2fs/dll/jump.vars
diff --git a/lib/ext2fs/expanddir.c b/lib/ext2fs/expanddir.c
index 5af9853..b2597c9 100644
--- a/lib/ext2fs/expanddir.c
+++ b/lib/ext2fs/expanddir.c
@@ -9,6 +9,9 @@
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -55,7 +58,7 @@
 		}
 		memset(block, 0, fs->blocksize);
 	}	
-	retval = io_channel_write_blk(fs->io, new_blk, 1, block);
+	retval = ext2fs_write_dir_block(fs, new_blk, block);
 	if (retval) {
 		es->err = retval;
 		return BLOCK_ABORT;
diff --git a/lib/ext2fs/ext2_err.c b/lib/ext2fs/ext2_err.c
deleted file mode 100644
index f975949..0000000
--- a/lib/ext2fs/ext2_err.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * ext2_err.c:
- * This file is automatically generated; please do not edit it.
- */
-#ifdef __STDC__
-#define NOARGS void
-#else
-#define NOARGS
-#define const
-#endif
-
-static const char * const text[] = {
-		"EXT2FS Library version 0.5b",
-		"Wrong magic number for ext2_filsys structure",
-		"Wrong magic number for badblocks_list structure",
-		"Wrong magic number for badblocks_iterate structure",
-		"Wrong magic number for inode_scan structure",
-		"Wrong magic number for io_channel structure",
-		"Wrong magic number for unix io_channel structure",
-		"Wrong magic number for io_manager structure",
-		"Wrong magic number for block_bitmap structure",
-		"Wrong magic number for inode_bitmap structure",
-		"Wrong magic number --- RESERVED_1",
-		"Wrong magic number --- RESERVED_2",
-		"Wrong magic number --- RESERVED_3",
-		"Wrong magic number --- RESERVED_4",
-		"Wrong magic number --- RESERVED_5",
-		"Wrong magic number --- RESERVED_6",
-		"Wrong magic number --- RESERVED_7",
-		"Wrong magic number --- RESERVED_8",
-		"Wrong magic number --- RESERVED_9",
-		"Bad magic number in super-block",
-		"Filesystem revision too high",
-		"Can't seek to superblock",
-		"Can't read superblock",
-		"Can't write superblock",
-		"Attempt to write to filesystem opened read-only",
-		"Can't read group descriptors",
-		"Can't write group descriptors",
-		"Corrupt group descriptor: bad block for block bitmap",
-		"Corrupt group descriptor: bad block for inode bitmap",
-		"Corrupt group descriptor: bad block for inode table",
-		"Can't write an inode bitmap",
-		"Can't read an inode bitmap",
-		"Can't write an block bitmap",
-		"Can't read an block bitmap",
-		"Can't write an inode table",
-		"Can't read an inode table",
-		"Can't read next inode",
-		"Filesystem has unexpected block size",
-		"EXT2 directory corrupted",
-		"Attempt to read block from filesystem resulted in short read",
-		"Attempt to write block from filesystem resulted in short write",
-		"No free space in the directory",
-		"Inode bitmap not loaded",
-		"BLOCK bitmap not loaded",
-		"Illegal inode number",
-		"Illegal block number",
-		"Internal error in ext2fs_expand_dir",
-		"Not enough space to build proposed filesystem",
-		"Illegal block number passed to ext2fs_mark_block_bitmap",
-		"Illegal block number passed to ext2fs_unmark_block_bitmap",
-		"Illegal block number passed to ext2fs_test_block_bitmap",
-		"Illegal inode number passed to ext2fs_mark_inode_bitmap",
-		"Illegal inode number passed to ext2fs_unmark_inode_bitmap",
-		"Illegal inode number passed to ext2fs_test_inode_bitmap",
-		"Attempt to fudge end of block bitmap past the real end",
-		"Attempt to fudge end of inode bitmap past the real end",
-		"Illegal indirect block found" ,
-		"Illegal doubly indirect block found" ,
-		"Illegal triply indirect block found" ,
-    0
-};
-
-struct error_table {
-    char const * const * msgs;
-    long base;
-    int n_msgs;
-};
-struct et_list {
-    struct et_list *next;
-    const struct error_table * table;
-};
-extern struct et_list *_et_list;
-
-static const struct error_table et = { text, 2133571328L, 59 };
-
-static struct et_list link = { 0, 0 };
-
-void initialize_ext2_error_table (NOARGS);
-
-void initialize_ext2_error_table (NOARGS) {
-    if (!link.table) {
-        link.next = _et_list;
-        link.table = &et;
-        _et_list = &link;
-    }
-}
diff --git a/lib/ext2fs/ext2_err.et b/lib/ext2fs/ext2_err.et
index f439f5a..71298b8 100644
--- a/lib/ext2fs/ext2_err.et
+++ b/lib/ext2fs/ext2_err.et
@@ -5,7 +5,7 @@
 	error_table ext2
 
 ec	EXT2_ET_BASE,
-	"EXT2FS Library version 0.5b"
+	"EXT2FS Library version 0.5c"
 
 ec	EXT2_ET_MAGIC_EXT2FS_FILSYS,
 	"Wrong magic number for ext2_filsys structure"
@@ -181,5 +181,14 @@
 ec	EXT2_ET_BAD_TIND_BLOCK,
 	"Illegal triply indirect block found" 
 
+ec	EXT2_ET_NEQ_BLOCK_BITMAP,
+	"Block bitmaps are not the same"
+
+ec	EXT2_ET_NEQ_INODE_BITMAP,
+	"Inode bitmaps are not the same"
+
+ec	EXT2_ET_BAD_DEVICE_NAME,
+	"Illegal or malformed device name"
+
 	end
 
diff --git a/lib/ext2fs/ext2_err.h b/lib/ext2fs/ext2_err.h
deleted file mode 100644
index 0a93b1a..0000000
--- a/lib/ext2fs/ext2_err.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * ext2_err.h:
- * This file is automatically generated; please do not edit it.
- */
-#ifdef __STDC__
-#define NOARGS void
-#else
-#define NOARGS
-#define const
-#endif
-
-#define EXT2_ET_BASE                             (2133571328L)
-#define EXT2_ET_MAGIC_EXT2FS_FILSYS              (2133571329L)
-#define EXT2_ET_MAGIC_BADBLOCKS_LIST             (2133571330L)
-#define EXT2_ET_MAGIC_BADBLOCKS_ITERATE          (2133571331L)
-#define EXT2_ET_MAGIC_INODE_SCAN                 (2133571332L)
-#define EXT2_ET_MAGIC_IO_CHANNEL                 (2133571333L)
-#define EXT2_ET_MAGIC_UNIX_IO_CHANNEL            (2133571334L)
-#define EXT2_ET_MAGIC_IO_MANAGER                 (2133571335L)
-#define EXT2_ET_MAGIC_BLOCK_BITMAP               (2133571336L)
-#define EXT2_ET_MAGIC_INODE_BITMAP               (2133571337L)
-#define EXT2_ET_MAGIC_RESERVED_1                 (2133571338L)
-#define EXT2_ET_MAGIC_RESERVED_2                 (2133571339L)
-#define EXT2_ET_MAGIC_RESERVED_3                 (2133571340L)
-#define EXT2_ET_MAGIC_RESERVED_4                 (2133571341L)
-#define EXT2_ET_MAGIC_RESERVED_5                 (2133571342L)
-#define EXT2_ET_MAGIC_RESERVED_6                 (2133571343L)
-#define EXT2_ET_MAGIC_RESERVED_7                 (2133571344L)
-#define EXT2_ET_MAGIC_RESERVED_8                 (2133571345L)
-#define EXT2_ET_MAGIC_RESERVED_9                 (2133571346L)
-#define EXT2_ET_BAD_MAGIC                        (2133571347L)
-#define EXT2_ET_REV_TOO_HIGH                     (2133571348L)
-#define EXT2_ET_SB_LSEEK                         (2133571349L)
-#define EXT2_ET_SB_READ                          (2133571350L)
-#define EXT2_ET_SB_WRITE                         (2133571351L)
-#define EXT2_ET_RO_FILSYS                        (2133571352L)
-#define EXT2_ET_GDESC_READ                       (2133571353L)
-#define EXT2_ET_GDESC_WRITE                      (2133571354L)
-#define EXT2_ET_GDESC_BAD_BLOCK_MAP              (2133571355L)
-#define EXT2_ET_GDESC_BAD_INODE_MAP              (2133571356L)
-#define EXT2_ET_GDESC_BAD_INODE_TABLE            (2133571357L)
-#define EXT2_ET_INODE_BITMAP_WRITE               (2133571358L)
-#define EXT2_ET_INODE_BITMAP_READ                (2133571359L)
-#define EXT2_ET_BLOCK_BITMAP_WRITE               (2133571360L)
-#define EXT2_ET_BLOCK_BITMAP_READ                (2133571361L)
-#define EXT2_ET_INODE_TABLE_WRITE                (2133571362L)
-#define EXT2_ET_INODE_TABLE_READ                 (2133571363L)
-#define EXT2_ET_NEXT_INODE_READ                  (2133571364L)
-#define EXT2_ET_UNEXPECTED_BLOCK_SIZE            (2133571365L)
-#define EXT2_ET_DIR_CORRUPTED                    (2133571366L)
-#define EXT2_ET_SHORT_READ                       (2133571367L)
-#define EXT2_ET_SHORT_WRITE                      (2133571368L)
-#define EXT2_ET_DIR_NO_SPACE                     (2133571369L)
-#define EXT2_ET_NO_INODE_BITMAP                  (2133571370L)
-#define EXT2_ET_NO_BLOCK_BITMAP                  (2133571371L)
-#define EXT2_ET_BAD_INODE_NUM                    (2133571372L)
-#define EXT2_ET_BAD_BLOCK_NUM                    (2133571373L)
-#define EXT2_ET_EXPAND_DIR_ERR                   (2133571374L)
-#define EXT2_ET_TOOSMALL                         (2133571375L)
-#define EXT2_ET_BAD_BLOCK_MARK                   (2133571376L)
-#define EXT2_ET_BAD_BLOCK_UNMARK                 (2133571377L)
-#define EXT2_ET_BAD_BLOCK_TEST                   (2133571378L)
-#define EXT2_ET_BAD_INODE_MARK                   (2133571379L)
-#define EXT2_ET_BAD_INODE_UNMARK                 (2133571380L)
-#define EXT2_ET_BAD_INODE_TEST                   (2133571381L)
-#define EXT2_ET_FUDGE_BLOCK_BITMAP_END           (2133571382L)
-#define EXT2_ET_FUDGE_INODE_BITMAP_END           (2133571383L)
-#define EXT2_ET_BAD_IND_BLOCK                    (2133571384L)
-#define EXT2_ET_BAD_DIND_BLOCK                   (2133571385L)
-#define EXT2_ET_BAD_TIND_BLOCK                   (2133571386L)
-extern void initialize_ext2_error_table (NOARGS);
-#define ERROR_TABLE_BASE_ext2 (2133571328L)
-
-/* for compatibility with older versions... */
-#define init_ext2_err_tbl initialize_ext2_error_table
-#define ext2_err_base ERROR_TABLE_BASE_ext2
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index 672466b..140c126 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -21,7 +21,9 @@
  */
 #define EXT2_LIB_CURRENT_REV	0
 
-typedef unsigned long	blk_t;
+#include <linux/types.h>
+
+typedef __u32		blk_t;
 typedef unsigned int	dgrp_t;
 
 #include "et/com_err.h"
@@ -64,6 +66,7 @@
 #define EXT2_FLAG_VALID		0x08
 #define EXT2_FLAG_IB_DIRTY	0x10
 #define EXT2_FLAG_BB_DIRTY	0x20
+#define EXT2_SWAP_BYTES		0x40
 
 struct struct_ext2_filsys {
 	int				magic;
@@ -128,8 +131,21 @@
 
 /*
  * Block interate flags
+ *
+ * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
+ * function should be called on blocks where the block number is zero.
+ * This is used by ext2fs_expand_dir() to be able to add a new block
+ * to an inode.  It can also be used for programs that want to be able
+ * to deal with files that contain "holes".
+ * 
+ * BLOCK_FLAG_TRAVERSE indicates that the iterator function for the
+ * indirect, doubly indirect, etc. blocks should be called after all
+ * of the blocks containined in the indirect blocks are processed.
+ * This is useful if you are going to be deallocating blocks from an
+ * inode.
  */
 #define BLOCK_FLAG_APPEND	1
+#define BLOCK_FLAG_HOLE		1
 #define BLOCK_FLAG_DEPTH_TRAVERSE	2
 
 /*
@@ -169,6 +185,38 @@
 };
 
 /*
+ * ext2fs_check_if_mounted flags
+ */
+#define EXT2_MF_MOUNTED		1
+#define EXT2_MF_ISROOT		2
+#define EXT2_MF_READONLY	4 
+
+/*
+ * Ext2/linux mode flags.  We define them here so that we don't need
+ * to depend on the OS's sys/stat.h, since we may be compiling on a
+ * non-Linux system.
+ */
+#define LINUX_S_IFMT  00170000
+#define LINUX_S_IFSOCK 0140000
+#define LINUX_S_IFLNK	 0120000
+#define LINUX_S_IFREG  0100000
+#define LINUX_S_IFBLK  0060000
+#define LINUX_S_IFDIR  0040000
+#define LINUX_S_IFCHR  0020000
+#define LINUX_S_IFIFO  0010000
+#define LINUX_S_ISUID  0004000
+#define LINUX_S_ISGID  0002000
+#define LINUX_S_ISVTX  0001000
+
+#define LINUX_S_ISLNK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
+#define LINUX_S_ISREG(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
+#define LINUX_S_ISDIR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
+#define LINUX_S_ISCHR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
+#define LINUX_S_ISBLK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
+#define LINUX_S_ISFIFO(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
+#define LINUX_S_ISSOCK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
+
+/*
  * For checking structure magic numbers...
  */
 
@@ -208,20 +256,18 @@
 extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
 extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
 extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
-errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
-				       const char *descr,
-				       ext2fs_block_bitmap *ret);
-errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
-				       const char *descr,
-				       ext2fs_inode_bitmap *ret);
-errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
-					ino_t end, ino_t *oend);
-errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
-					blk_t end, blk_t *oend);
-void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
-void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
-void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
-void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
+extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
+					      const char *descr,
+					      ext2fs_block_bitmap *ret);
+extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
+					      const char *descr,
+					      ext2fs_inode_bitmap *ret);
+extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
+					       ino_t end, ino_t *oend);
+extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
+					       blk_t end, blk_t *oend);
+extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
+extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
 extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
 extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
 
@@ -243,11 +289,30 @@
 extern errcode_t ext2fs_close(ext2_filsys fs);
 extern errcode_t ext2fs_flush(ext2_filsys fs);
 
+/* cmp_bitmaps.c */
+extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
+					     ext2fs_block_bitmap bm2);
+extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
+					     ext2fs_inode_bitmap bm2);
+
+
+/* dirblock.c */
+extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
+				       void *buf);
+extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
+					void *buf);
+
 /* expanddir.c */
 extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ino_t dir);
 
 /* freefs.c */
 extern void ext2fs_free(ext2_filsys fs);
+extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
+extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
+
+/* getsize.c */
+extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
+					blk_t *retblocks);
 
 /* initialize.c */
 extern errcode_t ext2fs_initialize(const char *name, int flags,
@@ -279,6 +344,9 @@
 extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ino_t ino, blk_t *blocks);
 extern errcode_t ext2fs_check_directory(ext2_filsys fs, ino_t ino);
 
+/* ismounted.c */
+extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
+
 /* namei.c */
 extern errcode_t ext2fs_dir_iterate(ext2_filsys fs, 
 			      ino_t dir,
@@ -327,6 +395,10 @@
 				     void (*invalid)(ext2_filsys fs,
 						     blk_t blk));
 
+/* swapfs.c */
+extern void ext2fs_swap_super(struct ext2_super_block * super);
+extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
+
 /* inline functions */
 extern void ext2fs_mark_super_dirty(ext2_filsys fs);
 extern void ext2fs_mark_changed(ext2_filsys fs);
diff --git a/lib/ext2fs/freefs.c b/lib/ext2fs/freefs.c
index d9d4fe9..63b5235 100644
--- a/lib/ext2fs/freefs.c
+++ b/lib/ext2fs/freefs.c
@@ -27,9 +27,43 @@
 	if (fs->group_desc)
 		free(fs->group_desc);
 	if (fs->block_map)
-		free(fs->block_map);
+		ext2fs_free_block_bitmap(fs->block_map);
 	if (fs->inode_map)
-		free(fs->inode_map);
+		ext2fs_free_inode_bitmap(fs->inode_map);
 	free(fs);
 }
 
+void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap)
+{
+	if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_INODE_BITMAP))
+		return;
+
+	bitmap->magic = 0;
+	if (bitmap->description) {
+		free(bitmap->description);
+		bitmap->description = 0;
+	}
+	if (bitmap->bitmap) {
+		free(bitmap->bitmap);
+		bitmap->bitmap = 0;
+	}
+	free(bitmap);
+}
+
+void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap)
+{
+	if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_BLOCK_BITMAP))
+		return;
+
+	bitmap->magic = 0;
+	if (bitmap->description) {
+		free(bitmap->description);
+		bitmap->description = 0;
+	}
+	if (bitmap->bitmap) {
+		free(bitmap->bitmap);
+		bitmap->bitmap = 0;
+	}
+	free(bitmap);
+}
+
diff --git a/lib/ext2fs/get_pathname.c b/lib/ext2fs/get_pathname.c
index a5db2e0..da6b249 100644
--- a/lib/ext2fs/get_pathname.c
+++ b/lib/ext2fs/get_pathname.c
@@ -9,6 +9,9 @@
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
diff --git a/lib/ext2fs/getsize.c b/lib/ext2fs/getsize.c
new file mode 100644
index 0000000..7918624
--- /dev/null
+++ b/lib/ext2fs/getsize.c
@@ -0,0 +1,123 @@
+/*
+ * getsize.c --- get the size of a partition.
+ * 
+ * Copyright (C) 1995 Theodore Ts'o.  This file may be
+ * redistributed under the terms of the GNU Public License.
+ */
+
+#include <stdio.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#include <fcntl.h>
+#ifdef HAVE_LINUX_FS_H
+#include <linux/fs.h>
+#endif
+#ifdef HAVE_LINUX_FD_H
+#include <sys/ioctl.h>
+#include <linux/fd.h>
+#endif
+#ifdef HAVE_SYS_DISKLABEL_H
+#include <sys/ioctl.h>
+#include <sys/disklabel.h>
+#endif /* HAVE_SYS_DISKLABEL_H */
+
+#include <linux/ext2_fs.h>
+#include "ext2fs.h"
+
+static int 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;
+}
+
+/*
+ * Returns the number of blocks in a partition
+ */
+errcode_t ext2fs_get_device_size(const char *file, int blocksize,
+				 blk_t *retblocks)
+{
+	int	fd;
+	int	size;
+	ext2_loff_t high, low;
+#ifdef FDGETPRM
+	struct floppy_struct this_floppy;
+#endif
+#ifdef HAVE_SYS_DISKLABEL_H
+	struct disklabel lab;
+	struct partition *pp;
+	char ch;
+#endif /* HAVE_SYS_DISKLABEL_H */
+
+	fd = open(file, O_RDWR);
+	if (fd < 0)
+		return errno;
+
+#ifdef BLKGETSIZE
+	if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
+		close(fd);
+		*retblocks = size / (blocksize / 512);
+		return 0;
+	}
+#endif
+#ifdef FDGETPRM
+	if (ioctl(fd, FDGETPRM, &this_floppy) >= 0) {
+		close(fd);
+		*retblocks = this_floppy.size / (blocksize / 512);
+		return 0;
+	}
+#endif
+#ifdef HAVE_SYS_DISKLABEL_H
+	size = strlen(file) - 1;
+	if (size >= 0) {
+		ch = file[size];
+		if (isdigit(ch))
+			size = 0;
+		else if (ch >= 'a' && ch <= 'h')
+			size = ch - 'a';
+		else
+			size = -1;
+	}
+	if (size >= 0 && (ioctl(fd, DIOCGDINFO, (char *)&lab) >= 0)) {
+		pp = &lab.d_partitions[size];
+		if (pp->p_size) {
+			close(fd);
+			*retblocks = pp->p_size / (blocksize / 512);
+			return 0;
+		}
+	}
+#endif /* HAVE_SYS_DISKLABEL_H */
+
+	/*
+	 * OK, we couldn't figure it out by using a specialized ioctl,
+	 * which is generally the besy way.  So do binary search to
+	 * find the size of the partition.
+	 */
+	low = 0;
+	for (high = 1024; 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);
+	close(fd);
+	*retblocks = (low + 1) / blocksize;
+	return 0;
+}
diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c
index 22e7eaf..7428b0d 100644
--- a/lib/ext2fs/initialize.c
+++ b/lib/ext2fs/initialize.c
@@ -11,11 +11,26 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
 #include "ext2fs.h"
 
+#if  defined(__linux__)    &&	defined(EXT2_OS_LINUX)
+#define CREATOR_OS EXT2_OS_LINUX
+#elif defined(__gnu__)     &&	defined(EXT2_OS_HURD)
+#define CREATOR_OS EXT2_OS_HURD
+#elif defined(__FreeBSD__) &&	defined(EXT2_OS_FREEBSD)
+#define CREATOR_OS EXT2_OS_FREEBSD
+#elif defined(LITES) 	   &&	defined(EXT2_OS_LITES)
+#define CREATOR_OS EXT2_OS_LITES
+#else
+#define CREATOR_OS EXT2_OS_LINUX /* by default */
+#endif
+
 errcode_t ext2fs_initialize(const char *name, int flags,
 			    struct ext2_super_block *param,
 			    io_manager manager, ext2_filsys *ret_fs)
@@ -72,9 +87,7 @@
 	set_field(s_checkinterval, EXT2_DFL_CHECKINTERVAL);
 	super->s_lastcheck = time(NULL);
 
-#ifdef	EXT2_OS_LINUX
-	super->s_creator_os = EXT2_OS_LINUX;
-#endif
+	super->s_creator_os = CREATOR_OS;
 
 	fs->blocksize = EXT2_BLOCK_SIZE(super);
 	fs->fragsize = EXT2_FRAG_SIZE(super);
@@ -104,11 +117,14 @@
 	/*
 	 * There should be at least as many inodes as the user
 	 * requested.  Figure out how many inodes per group that
-	 * should be.
+	 * should be.  But make sure that we don't allocate more than
+	 * one bitmap's worth of inodes
 	 */
 	super->s_inodes_per_group = (super->s_inodes_count +
 				     fs->group_desc_count - 1) /
 					     fs->group_desc_count;
+	if (super->s_inodes_per_group > fs->blocksize*8)
+		super->s_inodes_per_group = fs->blocksize*8;
 	
 	/*
 	 * Make sure the number of inodes per group completely fills
diff --git a/lib/ext2fs/inode.c b/lib/ext2fs/inode.c
index 6a9c178..ae69bc2 100644
--- a/lib/ext2fs/inode.c
+++ b/lib/ext2fs/inode.c
@@ -11,11 +11,16 @@
 #include <stdlib.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
 #include "ext2fs.h"
 
+static void inocpy_with_swap(struct ext2_inode *t, struct ext2_inode *f);
+
 errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
 				 ext2_inode_scan *ret_scan)
 {
@@ -77,9 +82,6 @@
 	
 	EXT2_CHECK_MAGIC(scan, EXT2_ET_MAGIC_INODE_SCAN);
 
-	if (!scan->inode_buffer)
-		return EINVAL;
-	
 	if (scan->inodes_left <= 0) {
 		if (scan->blocks_left <= 0) {
 			if (scan->done_group) {
@@ -120,7 +122,11 @@
 			return EXT2_ET_NEXT_INODE_READ;
 		scan->inode_scan_ptr = (struct ext2_inode *) scan->inode_buffer;
 	}
-	*inode = *scan->inode_scan_ptr++;
+	if (scan->fs->flags & EXT2_SWAP_BYTES)
+		inocpy_with_swap(inode, scan->inode_scan_ptr++);
+	else
+		*inode = *scan->inode_scan_ptr++;
+
 	scan->inodes_left--;
 	scan->current_inode++;
 	*ino = scan->current_inode;
@@ -171,8 +177,12 @@
 			return retval;
 		inode_buffer_block = block_nr;
 	}
-	memcpy (inode, (struct ext2_inode *) inode_buffer + i,
-		sizeof (struct ext2_inode));
+	if (fs->flags & EXT2_SWAP_BYTES)
+		inocpy_with_swap(inode,
+				 (struct ext2_inode *) inode_buffer + i);
+	else
+		memcpy (inode, (struct ext2_inode *) inode_buffer + i,
+			sizeof (struct ext2_inode));
 	return 0;
 }
 
@@ -217,8 +227,12 @@
 			return retval;
 		inode_buffer_block = block_nr;
 	}
-	memcpy ((struct ext2_inode *) inode_buffer + i, inode,
-		sizeof (struct ext2_inode));
+	if (fs->flags & EXT2_SWAP_BYTES)
+		inocpy_with_swap((struct ext2_inode *) inode_buffer + i,
+				 inode);
+	else
+		memcpy ((struct ext2_inode *) inode_buffer + i, inode,
+			sizeof (struct ext2_inode));
 	retval = io_channel_write_blk(fs->io, block_nr, 1, inode_buffer);
 	if (retval)
 		return retval;
@@ -264,10 +278,33 @@
 	retval = ext2fs_read_inode(fs, ino, &inode);
 	if (retval)
 		return retval;
-	if (!S_ISDIR(inode.i_mode))
+	if (!LINUX_S_ISDIR(inode.i_mode))
 		return ENOTDIR;
 	return 0;
 }
 
+static void inocpy_with_swap(struct ext2_inode *t, struct ext2_inode *f)
+{
+	unsigned i;
 	
-
+	t->i_mode = ext2fs_swab16(f->i_mode);
+	t->i_uid = ext2fs_swab16(f->i_uid);
+	t->i_size = ext2fs_swab32(f->i_size);
+	t->i_atime = ext2fs_swab32(f->i_atime);
+	t->i_ctime = ext2fs_swab32(f->i_ctime);
+	t->i_mtime = ext2fs_swab32(f->i_mtime);
+	t->i_dtime = ext2fs_swab32(f->i_dtime);
+	t->i_gid = ext2fs_swab16(f->i_gid);
+	t->i_links_count = ext2fs_swab16(f->i_links_count);
+	t->i_blocks = ext2fs_swab32(f->i_blocks);
+	t->i_flags = ext2fs_swab32(f->i_flags);
+	for (i = 0; i < EXT2_N_BLOCKS; i++)
+		t->i_block[i] = ext2fs_swab32(f->i_block[i]);
+	t->i_version = ext2fs_swab32(f->i_version);
+	t->i_file_acl = ext2fs_swab32(f->i_file_acl);
+	t->i_dir_acl = ext2fs_swab32(f->i_dir_acl);
+	t->i_faddr = ext2fs_swab32(f->i_faddr);
+	t->osd2.linux2.l_i_frag = f->osd2.linux2.l_i_frag;
+	t->osd2.linux2.l_i_fsize = f->osd2.linux2.l_i_fsize;
+	t->osd2.linux2.i_pad1 = ext2fs_swab16(f->osd2.linux2.i_pad1);
+}
diff --git a/lib/ext2fs/ismounted.c b/lib/ext2fs/ismounted.c
new file mode 100644
index 0000000..58c88fb
--- /dev/null
+++ b/lib/ext2fs/ismounted.c
@@ -0,0 +1,121 @@
+/*
+ * getsize.c --- get the size of a partition.
+ * 
+ * Copyright (C) 1995 Theodore Ts'o.  This file may be
+ * redistributed under the terms of the GNU Public License.
+ */
+
+#include <stdio.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#include <fcntl.h>
+#ifdef HAVE_LINUX_FS_H
+#include <linux/fs.h>
+#endif
+#ifdef HAVE_LINUX_FD_H
+#include <linux/fd.h>
+#endif
+#ifdef HAVE_MNTENT_H
+#include <mntent.h>
+#endif
+#ifdef HAVE_GETMNTINFO
+#include <paths.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#endif /* HAVE_GETMNTINFO */
+
+#include <linux/ext2_fs.h>
+#include "ext2fs.h"
+
+#ifdef HAVE_MNTENT_H
+/*
+ * XXX we only check to see if the mount is readonly when it's the
+ * root filesystem EXT2_FS_READONLY.
+ */
+static errcode_t check_mntent(const char *file, int *mount_flags)
+{
+	FILE * f;
+	struct mntent * mnt;
+	int	fd;
+
+	*mount_flags = 0;
+	if ((f = setmntent (MOUNTED, "r")) == NULL)
+		return errno;
+	while ((mnt = getmntent (f)) != NULL)
+		if (strcmp(file, mnt->mnt_fsname) == 0)
+			break;
+	endmntent (f);
+	if (mnt == 0)
+		return 0;
+	*mount_flags = EXT2_MF_MOUNTED;
+	
+	if (!strcmp(mnt->mnt_dir, "/")) {
+		*mount_flags |= EXT2_MF_ISROOT;
+		fd = open(MOUNTED, O_RDWR);
+		if (fd < 0) {
+			if (errno == EROFS)
+				*mount_flags |= EXT2_MF_READONLY;
+		} else
+			close(fd);
+	}
+	return 0;
+}
+#endif
+
+#ifdef HAVE_GETMNTINFO
+static errcode_t check_getmntinfo(const char *file, int *mount_flags)
+{
+	struct statfs *mp;
+        int    len, n;
+        const  char   *s1;
+	char	*s2;
+
+        n = getmntinfo(&mp, MNT_NOWAIT);
+        if (n == 0)
+		return errno;
+
+        len = sizeof(_PATH_DEV) - 1;
+        s1 = file;
+        if (strncmp(_PATH_DEV, s1, len) == 0)
+                s1 += len;
+ 
+	*mount_flags = 0;
+        while (--n >= 0) {
+                s2 = mp->f_mntfromname;
+                if (strncmp(_PATH_DEV, s2, len) == 0) {
+                        s2 += len - 1;
+                        *s2 = 'r';
+                }
+                if (strcmp(s1, s2) == 0 || strcmp(s1, &s2[1]) == 0) {
+			*mount_flags = EXT2_MF_MOUNTED;
+			break;
+		}
+                ++mp;
+	}
+	return 0;
+}
+#endif /* HAVE_GETMNTINFO */
+
+/*
+ * Is_mounted is set to 1 if the device is mounted, 0 otherwise
+ */
+errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags)
+{
+#ifdef HAVE_MNTENT_H
+	return check_mntent(file, mount_flags);
+#else 
+#ifdef HAVE_GETMNTINFO
+	return check_getmntinfo(file, mount_flags);
+#else
+	*mount_flags = 0;
+	return 0;
+#endif /* HAVE_GETMNTINFO */
+#endif /* HAVE_MNTENT_H */
+}
diff --git a/lib/ext2fs/jump/jump.undefs b/lib/ext2fs/jump/jump.undefs
deleted file mode 100644
index 9469992..0000000
--- a/lib/ext2fs/jump/jump.undefs
+++ /dev/null
@@ -1,2 +0,0 @@
-66909078 D __NEEDS_SHRLIB_libc_4
-6690908c D __NEEDS_SHRLIB_libet_1
diff --git a/lib/ext2fs/llseek.c b/lib/ext2fs/llseek.c
index 00fe3cd..02e0ede 100644
--- a/lib/ext2fs/llseek.c
+++ b/lib/ext2fs/llseek.c
@@ -9,12 +9,25 @@
 
 #include <errno.h>
 #include <unistd.h>
-#include <linux/unistd.h>
 #include "et/com_err.h"
 #include "ext2fs/io.h"
 
 #ifdef __linux__
 
+#ifdef HAVE_LLSEEK
+#include <unistd.h>
+#include <syscall.h>
+
+#else	/* HAVE_LLSEEK */
+
+#ifdef __alpha__
+
+#define llseek lseek
+
+#else /* !__alpha__ */
+
+#include <linux/unistd.h>
+
 #ifndef __NR__llseek
 #define __NR__llseek            140
 #endif
@@ -26,54 +39,62 @@
 		 unsigned long, offset_low,ext2_loff_t *,result,
 		 unsigned int, origin)
 
+static ext2_loff_t llseek (unsigned int fd, ext2_loff_t offset,
+		unsigned int origin)
+{
+	ext2_loff_t result;
+	int retval;
+
+	retval = _llseek (fd, ((unsigned long long) offset) >> 32,
+			((unsigned long long) offset) & 0xffffffff,
+			&result, origin);
+	return (retval == -1 ? (ext2_loff_t) retval : result);
+}
+
+#endif	/* HAVE_LLSEEK */
+
+#endif /* __alpha__ */
+
 ext2_loff_t ext2_llseek (unsigned int fd, ext2_loff_t offset,
 			 unsigned int origin)
 {
-	unsigned long offset_high;
-	unsigned long offset_low;
 	ext2_loff_t result;
-	int retval;
 	static int do_compat = 0;
 
+	if ((sizeof(off_t) >= sizeof(ext2_loff_t)) ||
+	    (offset < ((ext2_loff_t) 1 << ((sizeof(off_t)*8) -1))))
+		return lseek(fd, (off_t) offset, origin);
+
 	if (do_compat) {
-	compat_lseek:
-		if ((sizeof(off_t) < sizeof(ext2_loff_t)) &&
-		    (offset >= ((ext2_loff_t) 1 << ((sizeof(off_t)*8) -1)))) {
-			errno = -EINVAL;
-			return -1;
-		}
-		return lseek (fd, (off_t) offset, origin);
+		errno = EINVAL;
+		return -1;
 	}
 	
-	offset_high = ((unsigned long long) offset) >> 32;
-	offset_low = ((unsigned long long) offset) & 0xffffffff;
-	retval = _llseek (fd, offset_high, offset_low, &result, origin);
-	if (retval == -1 && errno == ENOSYS) {
+	result = llseek (fd, offset, origin);
+	if (result == -1 && errno == ENOSYS) {
 		/*
 		 * Just in case this code runs on top of an old kernel
 		 * which does not support the llseek system call
 		 */
 		do_compat++;
-		goto compat_lseek;
+		errno = EINVAL;
 	}
-	if (retval == -1)
-		result = -1;
 	return result;
 }
 
-#else
+#else /* !linux */
 
 ext2_loff_t ext2_llseek (unsigned int fd, ext2_loff_t offset,
 			 unsigned int origin)
 {
 	if ((sizeof(off_t) < sizeof(ext2_loff_t)) &&
 	    (offset >= ((ext2_loff_t) 1 << ((sizeof(off_t)*8) -1)))) {
-		errno = -EINVAL;
+		errno = EINVAL;
 		return -1;
 	}
 	return lseek (fd, (off_t) offset, origin);
 }
 
-#endif
+#endif 	/* linux */
 
 
diff --git a/lib/ext2fs/mkdir.c b/lib/ext2fs/mkdir.c
index 8bcb542..af3b9b7 100644
--- a/lib/ext2fs/mkdir.c
+++ b/lib/ext2fs/mkdir.c
@@ -13,6 +13,9 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -35,7 +38,8 @@
 	 * Allocate an inode, if necessary
 	 */
 	if (!ino) {
-		retval = ext2fs_new_inode(fs, parent, S_IFDIR | 0755, 0, &ino);
+		retval = ext2fs_new_inode(fs, parent, LINUX_S_IFDIR | 0755,
+					  0, &ino);
 		if (retval)
 			goto cleanup;
 	}
@@ -58,7 +62,7 @@
 	 * Create the inode structure....
 	 */
 	memset(&inode, 0, sizeof(struct ext2_inode));
-	inode.i_mode = S_IFDIR | 0755;
+	inode.i_mode = LINUX_S_IFDIR | 0755;
 	inode.i_uid = inode.i_gid = 0;
 	inode.i_blocks = fs->blocksize / 512;
 	inode.i_block[0] = blk;
@@ -69,7 +73,7 @@
 	/*
 	 * Write out the inode and inode data block
 	 */
-	retval = io_channel_write_blk(fs->io, blk, 1, block);
+	retval = ext2fs_write_dir_block(fs, blk, block);
 	if (retval)
 		goto cleanup;
 	retval = ext2fs_write_inode(fs, ino, &inode); 
diff --git a/lib/ext2fs/namei.c b/lib/ext2fs/namei.c
index da382f7..496c726 100644
--- a/lib/ext2fs/namei.c
+++ b/lib/ext2fs/namei.c
@@ -9,6 +9,9 @@
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -87,7 +90,7 @@
 	if (blockcnt < 0)
 		return 0;
 
-	ctx->errcode = io_channel_read_blk(fs->io, *blocknr, 1, ctx->buf);
+	ctx->errcode = ext2fs_read_dir_block(fs, *blocknr, ctx->buf);
 	if (ctx->errcode)
 		return BLOCK_ABORT;
 	
@@ -116,8 +119,7 @@
 	}
 
 	if (changed) {
-		ctx->errcode = io_channel_write_blk(fs->io, *blocknr, 1,
-						    ctx->buf);
+		ctx->errcode = ext2fs_write_dir_block(fs, *blocknr, ctx->buf);
 		if (ctx->errcode)
 			return BLOCK_ABORT;
 	}
diff --git a/lib/ext2fs/newdir.c b/lib/ext2fs/newdir.c
index d1018c1..2254726 100644
--- a/lib/ext2fs/newdir.c
+++ b/lib/ext2fs/newdir.c
@@ -9,6 +9,9 @@
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c
index d6f5432..b674ace 100644
--- a/lib/ext2fs/openfs.c
+++ b/lib/ext2fs/openfs.c
@@ -1,16 +1,25 @@
 /*
  * openfs.c --- open an ext2 filesystem
  * 
- * Copyright (C) 1993, 1994 Theodore Ts'o.  This file may be redistributed
- * under the terms of the GNU Public License.
+ * Copyright (C) 1993, 1994, 1995 Theodore Ts'o.
+ * 
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
  */
 
 #include <stdio.h>
 #include <string.h>
+#if HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#if HAVE_STDLIB_H
 #include <stdlib.h>
+#endif
 #include <fcntl.h>
 #include <time.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 #include <sys/stat.h>
 #include <sys/types.h>
 
@@ -27,8 +36,9 @@
 {
 	ext2_filsys	fs;
 	errcode_t	retval;
-	int		i, group_block;
+	int		i, j, group_block, groups_per_block;
 	char		*dest;
+	struct ext2_group_desc *gdp;
 	
 	EXT2_CHECK_MAGIC(manager, EXT2_ET_MAGIC_IO_MANAGER);
 	
@@ -77,6 +87,13 @@
 				     fs->super);
 	if (retval)
 		goto cleanup;
+
+	if ((fs->super->s_magic == ext2fs_swab16(EXT2_SUPER_MAGIC)) ||
+	    (fs->flags & EXT2_SWAP_BYTES)) {
+		fs->flags |= EXT2_SWAP_BYTES;
+
+		ext2fs_swap_super(fs->super);
+	}
 	
 	if (fs->super->s_magic != EXT2_SUPER_MAGIC) {
 		retval = EXT2_ET_BAD_MAGIC;
@@ -126,6 +143,13 @@
 		if (retval)
 			goto cleanup;
 		group_block++;
+		if (fs->flags & EXT2_SWAP_BYTES) {
+			gdp = (struct ext2_group_desc *) dest;
+			groups_per_block = fs->blocksize /
+				sizeof(struct ext2_group_desc);
+			for (j=0; j < groups_per_block; j++)
+				ext2fs_swap_group_desc(gdp++);
+		}
 		dest += fs->blocksize;
 	}
 
diff --git a/lib/ext2fs/read_bb_file.c b/lib/ext2fs/read_bb_file.c
index c24674b..04e1581 100644
--- a/lib/ext2fs/read_bb_file.c
+++ b/lib/ext2fs/read_bb_file.c
@@ -41,7 +41,7 @@
 	while (!feof (f)) {
 		if (fgets(buf, sizeof(buf), f) == NULL)
 			break;
-		count = sscanf(buf, "%lu", &blockno);
+		count = sscanf(buf, "%u", &blockno);
 		if (count <= 0)
 			continue;
 		if ((blockno < fs->super->s_first_data_block) ||
diff --git a/lib/ext2fs/rw_bitmaps.c b/lib/ext2fs/rw_bitmaps.c
index 9523294..18b0d3e 100644
--- a/lib/ext2fs/rw_bitmaps.c
+++ b/lib/ext2fs/rw_bitmaps.c
@@ -13,6 +13,9 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
@@ -100,7 +103,7 @@
 static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block)
 {
 	int i;
-	char *block_bitmap, *inode_bitmap;
+	char *block_bitmap = 0, *inode_bitmap = 0;
 	char *buf;
 	errcode_t retval;
 	int block_nbytes = EXT2_BLOCKS_PER_GROUP(fs->super) / 8;
@@ -130,39 +133,31 @@
 		inode_bitmap = fs->inode_map->bitmap;
 	}
 	free(buf);
-	buf = malloc(fs->blocksize);
-	if (!buf) {
-		retval = ENOMEM;
-		goto cleanup;
-	}
 
 	for (i = 0; i < fs->group_desc_count; i++) {
-		if (do_block) {
+		if (block_bitmap) {
 			retval = io_channel_read_blk
 				(fs->io,
 				 fs->group_desc[i].bg_block_bitmap,
-				 1, buf);
+				 -block_nbytes, block_bitmap);
 			if (retval) {
 				retval = EXT2_ET_BLOCK_BITMAP_READ;
 				goto cleanup;
 			}
-			memcpy(block_bitmap, buf, block_nbytes);
 			block_bitmap += block_nbytes;
 		}
-		if (do_inode) {
+		if (inode_bitmap) {
 			retval = io_channel_read_blk
 				(fs->io,
 				 fs->group_desc[i].bg_inode_bitmap,
-				 1, buf);
+				 -inode_nbytes, inode_bitmap);
 			if (retval) {
 				retval = EXT2_ET_INODE_BITMAP_READ;
 				goto cleanup;
 			}
-			memcpy(inode_bitmap, buf, inode_nbytes);
 			inode_bitmap += inode_nbytes;
 		}
 	}
-	free(buf);
 	return 0;
 	
 cleanup:
diff --git a/lib/ext2fs/rw_bitmaps.size b/lib/ext2fs/rw_bitmaps.size
deleted file mode 100644
index 5a3c944..0000000
--- a/lib/ext2fs/rw_bitmaps.size
+++ /dev/null
@@ -1,2 +0,0 @@
-text	data	bss	dec	hex
-1720	0	0	1720	6b8
diff --git a/lib/ext2fs/swapfs.c b/lib/ext2fs/swapfs.c
new file mode 100644
index 0000000..371b8f9
--- /dev/null
+++ b/lib/ext2fs/swapfs.c
@@ -0,0 +1,58 @@
+/*
+ * swapfs.c --- swap ext2 filesystem data structures
+ * 
+ * Copyright (C) 1995 Theodore Ts'o.  This file may be redistributed
+ * under the terms of the GNU Public License.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include <linux/ext2_fs.h>
+
+#include "ext2fs.h"
+
+void ext2fs_swap_super(struct ext2_super_block * super)
+{
+	super->s_inodes_count = ext2fs_swab32(super->s_inodes_count);
+	super->s_blocks_count = ext2fs_swab32(super->s_blocks_count);
+	super->s_r_blocks_count = ext2fs_swab32(super->s_r_blocks_count);
+	super->s_free_blocks_count = ext2fs_swab32(super->s_free_blocks_count);
+	super->s_free_inodes_count = ext2fs_swab32(super->s_free_inodes_count);
+	super->s_first_data_block = ext2fs_swab32(super->s_first_data_block);
+	super->s_log_block_size = ext2fs_swab32(super->s_log_block_size);
+	super->s_log_frag_size = ext2fs_swab32(super->s_log_frag_size);
+	super->s_blocks_per_group = ext2fs_swab32(super->s_blocks_per_group);
+	super->s_frags_per_group = ext2fs_swab32(super->s_frags_per_group);
+	super->s_inodes_per_group = ext2fs_swab32(super->s_inodes_per_group);
+	super->s_mtime = ext2fs_swab32(super->s_mtime);
+	super->s_wtime = ext2fs_swab32(super->s_wtime);
+	super->s_mnt_count = ext2fs_swab16(super->s_mnt_count);
+	super->s_max_mnt_count = ext2fs_swab16(super->s_max_mnt_count);
+	super->s_magic = ext2fs_swab16(super->s_magic);
+	super->s_state = ext2fs_swab16(super->s_state);
+	super->s_errors = ext2fs_swab16(super->s_errors);
+	super->s_lastcheck = ext2fs_swab32(super->s_lastcheck);
+	super->s_checkinterval = ext2fs_swab32(super->s_checkinterval);
+	super->s_creator_os = ext2fs_swab32(super->s_creator_os);
+	super->s_rev_level = ext2fs_swab32(super->s_rev_level);
+#ifdef	EXT2_DEF_RESUID
+	super->s_def_resuid = ext2fs_swab16(super->s_def_resuid);
+	super->s_def_resgid = ext2fs_swab16(super->s_def_resgid);
+#endif
+}
+
+void ext2fs_swap_group_desc(struct ext2_group_desc *gdp)
+{
+	gdp->bg_block_bitmap = ext2fs_swab32(gdp->bg_block_bitmap);
+	gdp->bg_inode_bitmap = ext2fs_swab32(gdp->bg_inode_bitmap);
+	gdp->bg_inode_table = ext2fs_swab32(gdp->bg_inode_table);
+	gdp->bg_free_blocks_count = ext2fs_swab16(gdp->bg_free_blocks_count);
+	gdp->bg_free_inodes_count = ext2fs_swab16(gdp->bg_free_inodes_count);
+	gdp->bg_used_dirs_count = ext2fs_swab16(gdp->bg_used_dirs_count);
+}
+
+	
+
diff --git a/lib/ext2fs/unix_io.c b/lib/ext2fs/unix_io.c
index 5126583..b995515 100644
--- a/lib/ext2fs/unix_io.c
+++ b/lib/ext2fs/unix_io.c
@@ -15,9 +15,12 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include "et/com_err.h"
-#include "ext2_err.h"
+#include "ext2fs/ext2_err.h"
 #include "io.h"
 
 /*
@@ -63,6 +66,8 @@
 	struct unix_private_data *data = NULL;
 	errcode_t	retval;
 
+	if (name == 0)
+		return EXT2_ET_BAD_DEVICE_NAME;
 	io = (io_channel) malloc(sizeof(struct struct_io_channel));
 	if (!io)
 		return ENOMEM;
diff --git a/lib/ss/.depend b/lib/ss/.depend
index b35a682..3851e3b 100644
--- a/lib/ss/.depend
+++ b/lib/ss/.depend
@@ -1,78 +1,74 @@
-data.o : data.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/libio.h /usr/include/_G_config.h ss_internal.h /usr/include/string.h \
-  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ss.h ../ss/mit-sipb-copyright.h \
-  ../ss/ss_err.h copyright.h 
-error.o : error.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/libio.h /usr/include/_G_config.h copyright.h ../et/com_err.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h \
-  ss_internal.h /usr/include/string.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h \
-  ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h 
-execute_cmd.o : execute_cmd.c /usr/include/stdlib.h /usr/include/features.h \
-  /usr/include/sys/cdefs.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 ss_internal.h /usr/include/stdio.h /usr/include/libio.h \
-  /usr/include/_G_config.h /usr/include/string.h ss.h ../ss/mit-sipb-copyright.h \
-  ../ss/ss_err.h copyright.h 
-help.o : help.c /usr/include/unistd.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/posix_opt.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/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/sys/param.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/limits.h \
+data.o : ./data.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/libio.h /usr/include/_G_config.h ./ss_internal.h /usr/include/string.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ./ss.h ../ss/mit-sipb-copyright.h \
+  ../ss/ss_err.h ./copyright.h 
+error.o : ./error.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/libio.h /usr/include/_G_config.h ./copyright.h ./../et/com_err.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stdarg.h ./ss_internal.h /usr/include/string.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ./ss.h ../ss/mit-sipb-copyright.h \
+  ../ss/ss_err.h 
+execute_cmd.o : ./execute_cmd.c ./ss_internal.h /usr/include/stdio.h /usr/include/features.h \
+  /usr/include/sys/cdefs.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 ./ss.h ../ss/mit-sipb-copyright.h \
+  ../ss/ss_err.h ./copyright.h 
+help.o : ./help.c /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/file.h \
-  /usr/include/fcntl.h /usr/include/linux/fcntl.h /usr/include/sys/wait.h /usr/include/waitflags.h \
-  /usr/include/linux/wait.h /usr/include/waitstatus.h /usr/include/endian.h /usr/include/bytesex.h \
-  ss_internal.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \
-  /usr/include/string.h ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h copyright.h \
-  /usr/include/sys/dir.h /usr/include/dirent.h /usr/include/linux/dirent.h 
-invocation.o : invocation.c /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.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 ss_internal.h \
-  /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/string.h \
-  ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h copyright.h 
-list_rqs.o : list_rqs.c copyright.h ss_internal.h /usr/include/stdio.h /usr/include/features.h \
+  /usr/include/features.h /usr/include/sys/cdefs.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/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
+  /usr/include/sys/file.h /usr/include/fcntl.h /usr/include/gnu/types.h /usr/include/linux/fcntl.h \
+  /usr/include/sys/wait.h /usr/include/waitflags.h /usr/include/linux/wait.h /usr/include/waitstatus.h \
+  /usr/include/endian.h /usr/include/bytesex.h ./ss_internal.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 \
+  ./ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h ./copyright.h /usr/include/sys/dir.h \
+  /usr/include/dirent.h /usr/include/linux/dirent.h 
+invocation.o : ./invocation.c ./ss_internal.h /usr/include/stdio.h /usr/include/features.h \
   /usr/include/sys/cdefs.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 ss.h ../ss/mit-sipb-copyright.h \
-  ../ss/ss_err.h /usr/include/signal.h /usr/include/sys/types.h /usr/include/linux/types.h \
-  /usr/include/asm/types.h /usr/include/linux/signal.h /usr/include/setjmp.h /usr/include/jmp_buf.h \
-  /usr/include/i386/jmp_buf.h /usr/include/sys/wait.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 
-listen.o : listen.c copyright.h ss_internal.h /usr/include/stdio.h /usr/include/features.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ./ss.h ../ss/mit-sipb-copyright.h \
+  ../ss/ss_err.h ./copyright.h 
+list_rqs.o : ./list_rqs.c ./copyright.h ./ss_internal.h /usr/include/stdio.h \
+  /usr/include/features.h /usr/include/sys/cdefs.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 ./ss.h \
+  ../ss/mit-sipb-copyright.h ../ss/ss_err.h /usr/include/signal.h /usr/include/sys/types.h \
+  /usr/include/linux/types.h /usr/include/asm/types.h /usr/include/linux/signal.h \
+  /usr/include/setjmp.h /usr/include/jmp_buf.h /usr/include/i386/jmp_buf.h /usr/include/sys/wait.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 
+listen.o : ./listen.c ./copyright.h ./ss_internal.h /usr/include/stdio.h /usr/include/features.h \
   /usr/include/sys/cdefs.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 ss.h ../ss/mit-sipb-copyright.h \
+  /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ./ss.h ../ss/mit-sipb-copyright.h \
   ../ss/ss_err.h /usr/include/setjmp.h /usr/include/jmp_buf.h /usr/include/i386/jmp_buf.h \
   /usr/include/signal.h /usr/include/sys/types.h /usr/include/linux/types.h /usr/include/asm/types.h \
   /usr/include/linux/signal.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 
-pager.o : pager.c /usr/include/unistd.h /usr/include/features.h /usr/include/sys/cdefs.h \
+pager.o : ./pager.c /usr/include/unistd.h /usr/include/features.h /usr/include/sys/cdefs.h \
   /usr/include/posix_opt.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 \
-  ss_internal.h /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \
-  /usr/include/string.h ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h copyright.h \
-  /usr/include/sys/file.h /usr/include/fcntl.h /usr/include/linux/fcntl.h /usr/include/signal.h \
-  /usr/include/linux/signal.h 
-parse.o : parse.c /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.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 ss_internal.h \
+  /usr/include/confname.h /usr/include/sys/types.h /usr/include/linux/types.h \
+  /usr/include/asm/types.h /usr/include/errno.h /usr/include/linux/errno.h ./ss_internal.h \
   /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/string.h \
-  ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h copyright.h 
-prompt.o : prompt.c copyright.h /usr/include/stdio.h /usr/include/features.h \
-  /usr/include/sys/cdefs.h /usr/include/libio.h /usr/include/_G_config.h ss_internal.h \
-  /usr/include/string.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ss.h \
+  ./ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h ./copyright.h /usr/include/sys/file.h \
+  /usr/include/fcntl.h /usr/include/linux/fcntl.h /usr/include/signal.h /usr/include/linux/signal.h 
+parse.o : ./parse.c /usr/include/errno.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/linux/errno.h ./ss_internal.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 \
+  ./ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h ./copyright.h 
+prompt.o : ./prompt.c ./copyright.h /usr/include/stdio.h /usr/include/features.h \
+  /usr/include/sys/cdefs.h /usr/include/libio.h /usr/include/_G_config.h ./ss_internal.h \
+  /usr/include/string.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ./ss.h \
   ../ss/mit-sipb-copyright.h ../ss/ss_err.h 
-request_tbl.o : request_tbl.c copyright.h ss_internal.h /usr/include/stdio.h \
-  /usr/include/features.h /usr/include/sys/cdefs.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 ss.h \
+request_tbl.o : ./request_tbl.c /usr/include/errno.h /usr/include/features.h \
+  /usr/include/sys/cdefs.h /usr/include/linux/errno.h ./copyright.h ./ss_internal.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 ./ss.h ../ss/mit-sipb-copyright.h \
+  ../ss/ss_err.h 
+requests.o : ./requests.c ./mit-sipb-copyright.h /usr/include/stdio.h /usr/include/features.h \
+  /usr/include/sys/cdefs.h /usr/include/libio.h /usr/include/_G_config.h ./ss_internal.h \
+  /usr/include/string.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ./ss.h \
   ../ss/mit-sipb-copyright.h ../ss/ss_err.h 
-requests.o : requests.c mit-sipb-copyright.h /usr/include/stdio.h /usr/include/features.h \
-  /usr/include/sys/cdefs.h /usr/include/libio.h /usr/include/_G_config.h ss_internal.h \
-  /usr/include/string.h /usr/lib/gcc-lib/i486-linux/2.5.8/include/stddef.h ss.h \
-  ../ss/mit-sipb-copyright.h ../ss/ss_err.h 
-ss_err.o : ss_err.c 
-std_rqs.o : std_rqs.c ../ss/ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h 
-test_ss.o : test_ss.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
-  /usr/include/libio.h /usr/include/_G_config.h ss.h ../ss/mit-sipb-copyright.h \
+ss_err.o : ./ss_err.c 
+std_rqs.o : ./std_rqs.c ../ss/ss.h ../ss/mit-sipb-copyright.h ../ss/ss_err.h 
+test_ss.o : ./test_ss.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/libio.h /usr/include/_G_config.h ./ss.h ../ss/mit-sipb-copyright.h \
   ../ss/ss_err.h 
diff --git a/lib/ss/ChangeLog b/lib/ss/ChangeLog
index 9c25553..21c7df1 100644
--- a/lib/ss/ChangeLog
+++ b/lib/ss/ChangeLog
@@ -1,6 +1,72 @@
+Wed Oct 25 11:58:20 1995    <tytso@rsts-11.mit.edu>
+
+	* ss_internal.h: Removed malloc, realloc, free definitions, and
+		#include <stdlib.h> instead.
+
+Mon Sep  4 21:46:00 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for BSD shared libraries.
+		(distclean): Use the -f option when removing files.
+
+Fri Aug 18 15:15:09 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+	* Makefile.in (mk_cmds): Remove usage of $<, since it's not
+		portable. 
+
+Sat Aug 12 03:11:02 1995  Remy Card  <card@bbj>
+
+	* Makefile.in (install): Install static libraries in $(ulibdir)
+		(/usr/lib on Linux) instead of $(libdir) (/lib on Linux).
+
+Thu Aug 10 14:23:31 1995  Remy Card  <card@bbj>
+
+	* Makefile.in (distclean): Remove mk_cmds.sh.
+
+Sat Aug  5 11:44:29 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* mk_cmds.sh.in: Remove the old .c file before moving the new file
+		into place.
+
+	* Makefile.in (DLL_INSTALL_DIR, ELF_INSTALL_DIR): Set the
+		installation directories correctly.
+
+	* Makefile.in (clean): Don't remove mk_cmds.sh, since it's built
+		from the configure script.
+
+Tue Jul 11 20:47:46 1995    <tytso@rsx-11.mit.edu>
+
+	* help.c (ss_help): Use malloc instead of alloca for maximal
+		portability.  Check return value of malloc before using
+		buffer.  Allocate memory when printing usage message.
+
+Thu Jun 15 23:46:16 1995  Remy Card  <card@bbj>
+
+	* Makefile.in: Added support for ELF shared libraries.
+		Fixed typos in the compilation rules.
+		(distclean): Added mk_cmds.sh.
+
+Sat Jun 10 19:57:07 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>
+
+	* mk_cmds.sh.in: Use SS_DIR instead of srcdir to determine the
+		location of the ss directory.
+
+Thu Jun  8 13:18:48 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>
+
+	* help.c (ss_help): Use alloca to allocate space for filenames
+	instead of fixed buffers.
+	* error.c (ss_error, & includes): Change the selection of
+	varargs/stdarg to work with configure.
+	* pager.c: Include <errno.h> if possible.
+	* parse.c: Ditto.
+	* request_tbl.c: Ditto.
+
+	* Makefile.in: Rewritten to conform to GNU coding standards and
+	support separate compilation directories.
+	Don't preprocess mk_cmds.sh, as this is now done by configure.
+
 Sat Mar 11 18:14:52 1995  Theodore Y. Ts'o  <tytso@localhost>
 
-	* Makefile (DLL_INSTALL_DIR): Install libss in /lib, since it's
+	* Makefile.in (DLL_INSTALL_DIR): Install libss in /lib, since it's
 		needed by debugfs (which is installed in /sbin).
 
 
diff --git a/lib/ss/MAKELOG b/lib/ss/MAKELOG
deleted file mode 100644
index 5356fcb..0000000
--- a/lib/ss/MAKELOG
+++ /dev/null
@@ -1,156 +0,0 @@
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c ss_err.c
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/ss_err.o -c ss_err.c)
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c std_rqs.c
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/std_rqs.o -c std_rqs.c)
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c invocation.c
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/invocation.o -c invocation.c)
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c help.c
-help.c: In function `ss_help':
-help.c:45: warning: implicit declaration of function `ss_list_requests'
-help.c: At top level:
-help.c:101: warning: function declaration isn't a prototype
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/help.o -c help.c)
-help.c: In function `ss_help':
-help.c:45: warning: implicit declaration of function `ss_list_requests'
-help.c: At top level:
-help.c:101: warning: function declaration isn't a prototype
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c execute_cmd.c
-execute_cmd.c:69: warning: function declaration isn't a prototype
-execute_cmd.c:122: warning: function declaration isn't a prototype
-execute_cmd.c:155: warning: return-type defaults to `int'
-execute_cmd.c:155: warning: function declaration isn't a prototype
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/execute_cmd.o -c execute_cmd.c)
-execute_cmd.c:69: warning: function declaration isn't a prototype
-execute_cmd.c:122: warning: function declaration isn't a prototype
-execute_cmd.c:155: warning: return-type defaults to `int'
-execute_cmd.c:155: warning: function declaration isn't a prototype
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c listen.c
-listen.c:33: warning: function declaration isn't a prototype
-listen.c:49: warning: function declaration isn't a prototype
-listen.c: In function `ss_listen':
-listen.c:60: warning: function declaration isn't a prototype
-listen.c:60: warning: function declaration isn't a prototype
-listen.c:60: warning: function declaration isn't a prototype
-listen.c:70: warning: function declaration isn't a prototype
-listen.c:72: warning: implicit declaration of function `sigblock'
-listen.c:72: warning: implicit declaration of function `sigmask'
-listen.c:76: warning: implicit declaration of function `sigsetmask'
-listen.c:60: warning: variable `sig_cont' may be clobbered by `longjmp' or `vfork'
-listen.c:63: warning: variable `end' may be clobbered by `longjmp' or `vfork'
-listen.c: At top level:
-listen.c:132: warning: function declaration isn't a prototype
-listen.c: In function `ss_quit':
-listen.c:138: warning: control reaches end of non-void function
-listen.c: At top level:
-listen.c:23: warning: `rcs_id' defined but not used
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/listen.o -c listen.c)
-listen.c:33: warning: function declaration isn't a prototype
-listen.c:49: warning: function declaration isn't a prototype
-listen.c: In function `ss_listen':
-listen.c:60: warning: function declaration isn't a prototype
-listen.c:60: warning: function declaration isn't a prototype
-listen.c:60: warning: function declaration isn't a prototype
-listen.c:70: warning: function declaration isn't a prototype
-listen.c:72: warning: implicit declaration of function `sigblock'
-listen.c:72: warning: implicit declaration of function `sigmask'
-listen.c:76: warning: implicit declaration of function `sigsetmask'
-listen.c:60: warning: variable `sig_cont' may be clobbered by `longjmp' or `vfork'
-listen.c:63: warning: variable `end' may be clobbered by `longjmp' or `vfork'
-listen.c: At top level:
-listen.c:132: warning: function declaration isn't a prototype
-listen.c: In function `ss_quit':
-listen.c:138: warning: control reaches end of non-void function
-listen.c: At top level:
-listen.c:23: warning: `rcs_id' defined but not used
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c parse.c
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/parse.o -c parse.c)
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c error.c
-error.c:87: warning: no previous prototype for `ss_error'
-error.c: In function `ss_error':
-error.c:103: warning: implicit declaration of function `free'
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/error.o -c error.c)
-error.c:87: warning: no previous prototype for `ss_error'
-error.c: In function `ss_error':
-error.c:103: warning: implicit declaration of function `free'
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c prompt.c
-prompt.c:23: warning: no previous prototype for `ss_set_prompt'
-prompt.c:33: warning: no previous prototype for `ss_get_prompt'
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/prompt.o -c prompt.c)
-prompt.c:23: warning: no previous prototype for `ss_set_prompt'
-prompt.c:33: warning: no previous prototype for `ss_get_prompt'
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c request_tbl.c
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/request_tbl.o -c request_tbl.c)
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c list_rqs.c
-list_rqs.c:25: warning: function declaration isn't a prototype
-list_rqs.c: In function `ss_list_requests':
-list_rqs.c:39: warning: function declaration isn't a prototype
-list_rqs.c:51: warning: implicit declaration of function `sigblock'
-list_rqs.c:51: warning: implicit declaration of function `sigmask'
-list_rqs.c:53: warning: implicit declaration of function `ss_pager_create'
-list_rqs.c:55: warning: implicit declaration of function `sigsetmask'
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/list_rqs.o -c list_rqs.c)
-list_rqs.c:25: warning: function declaration isn't a prototype
-list_rqs.c: In function `ss_list_requests':
-list_rqs.c:39: warning: function declaration isn't a prototype
-list_rqs.c:51: warning: implicit declaration of function `sigblock'
-list_rqs.c:51: warning: implicit declaration of function `sigmask'
-list_rqs.c:53: warning: implicit declaration of function `ss_pager_create'
-list_rqs.c:55: warning: implicit declaration of function `sigsetmask'
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c pager.c
-pager.c:23: warning: function declaration isn't a prototype
-pager.c:36: warning: function declaration isn't a prototype
-pager.c: In function `ss_page_stdin':
-pager.c:77: warning: implicit declaration of function `sigblock'
-pager.c:78: warning: implicit declaration of function `sigmask'
-pager.c:79: warning: implicit declaration of function `sigsetmask'
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/pager.o -c pager.c)
-pager.c:23: warning: function declaration isn't a prototype
-pager.c:36: warning: function declaration isn't a prototype
-pager.c: In function `ss_page_stdin':
-pager.c:77: warning: implicit declaration of function `sigblock'
-pager.c:78: warning: implicit declaration of function `sigmask'
-pager.c:79: warning: implicit declaration of function `sigsetmask'
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c requests.c
-requests.c:23: warning: no previous prototype for `ss_self_identify'
-requests.c:33: warning: no previous prototype for `ss_subsystem_name'
-requests.c:41: warning: no previous prototype for `ss_subsystem_version'
-requests.c:50: warning: no previous prototype for `ss_unimplemented'
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/requests.o -c requests.c)
-requests.c:23: warning: no previous prototype for `ss_self_identify'
-requests.c:33: warning: no previous prototype for `ss_subsystem_name'
-requests.c:41: warning: no previous prototype for `ss_subsystem_version'
-requests.c:50: warning: no previous prototype for `ss_unimplemented'
-gcc -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -c data.c
-data.c:12: warning: `copyright' defined but not used
-(export JUMP_DIR=`pwd`/jump; gcc -B/usr/dll/jump/ -I. -I.. -I../et -O2 -fomit-frame-pointer -ansi -D_POSIX_SOURCE -pedantic -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wenum-clash -Wcast-align -Wtraditional -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow  -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H \
-	-o jump/data.o -c data.c)
-data.c:12: warning: `copyright' defined but not used
-(cd jump; export JUMP_DIR=`pwd`; \
-	/usr/dll/bin/mkimage -l libss -v 1.0.0 \
-	-a 0x66880000 -j 0x1000 -g 0x1000 -- \
-	ss_err.o std_rqs.o invocation.o help.o execute_cmd.o listen.o parse.o error.o prompt.o request_tbl.o list_rqs.o pager.o requests.o data.o -lc -L../.. -lcom_err "`gcc --print-libgcc-file-name`" -lc)
-Warning - non-absolute pathname specified for library
-listen.o: Undefined symbol _sigmask referenced from text segment
-list_rqs.o: Undefined symbol _sigmask referenced from text segment
-pager.o: Undefined symbol _sigmask referenced from text segment
-system: No such file or directory
-
-/usr/dll/bin/mkimage: error running 'ld -x -T 66880000 -o libss.so.1.0.0 /u3/src/e2fsprogs-0.5b/lib/ss/jump/__jump.o ss_err.o std_rqs.o invocation.o help.o execute_cmd.o listen.o parse.o error.o prompt.o request_tbl.o list_rqs.o pager.o requests.o data.o -lc -L../.. -lcom_err /usr/lib/gcc-lib/i486-linux/2.5.8/libgcc.a -lc'
-
-mkimage v2.11
-Reading configuration files from /u3/src/e2fsprogs-0.5b/lib/ss/jump
-executing:ld -x -T 66880000 -o libss.so.1.0.0 /u3/src/e2fsprogs-0.5b/lib/ss/jump/__jump.o ss_err.o std_rqs.o invocation.o help.o execute_cmd.o listen.o parse.o error.o prompt.o request_tbl.o list_rqs.o pager.o requests.o data.o -lc -L../.. -lcom_err /usr/lib/gcc-lib/i486-linux/2.5.8/libgcc.a -lc
-make: *** [libss.so.1.0.0] Error 1
diff --git a/lib/ss/Makefile b/lib/ss/Makefile
deleted file mode 100644
index 2f5ae92..0000000
--- a/lib/ss/Makefile
+++ /dev/null
@@ -1,164 +0,0 @@
-#
-# Makefile for lib/ss
-#
-
-include ../../MCONFIG
-
-ifdef BUILD_DLL_SHLIBS
-DLL_ADDRESS = 0x66880000
-DLL_JUMPSIZE = 0x1000
-DLL_GOTSIZE  = 0x1000
-DLL_VERSION = 1.0
-DLL_IMAGE = libss
-DLL_STUB = libss
-DLL_LIBS = -L../.. -lcom_err
-DLL_MYDIR = ss
-DLL_INSTALL_DIR = $(SHLIBDIR)
-endif
-
-RM=rm -f
-MV=mv
-LN=ln -s
-TAGS=etags
-COMPILE_ET=../et/compile_et
-MK_CMDS=../ss/mk_cmds
-
-DEFS= -DWAIT_USES_INT -DHAS_STDLIB_H -DHAS_UNISTD_H -DPOSIX_SIGNALS
-
-# hard coded .. is so that ss/ss_err.h works
-# hard coded ../et is so com_err.h works
-CFLAGS= -I. -I.. -I../et $(OPT) $(WFLAGS) $(DEFS)
-
-# hard coded for target install
-srcdir=	.
-
-# for the library
-
-LIB=	libss.a
-
-# with ss_err.o first, ss_err.h should get rebuilt first too.  should not
-# be relying on this, though.
-OBJS=	ss_err.o \
-	std_rqs.o \
-	invocation.o help.o \
-	execute_cmd.o listen.o parse.o error.o prompt.o \
-	request_tbl.o list_rqs.o pager.o requests.o \
-	data.o
-
-SRCS=	invocation.c help.c \
-	execute_cmd.c listen.c parse.c error.c prompt.c \
-	request_tbl.c list_rqs.c pager.c requests.c \
-	data.c  \
-	ss_err.h
-# ss_err.h here, so that make depend catches it.
-
-ifdef BUILD_DLL_SHLIBS
-include ../Makefile.dll-lib
-endif
-
-CODE= $(SRCS) $(MKCMDSFILES)
-
-MKCMDSOBJS=	mk_cmds.o utils.o options.o ct.tab.o cmd_tbl.lex.o
-
-MKCMDSFILES=	mk_cmds.c utils.c options.c ct.y cmd_tbl.lex.l
-
-MKCMDSCSRCS=	mk_cmds.c utils.c options.c ct.tab.c cmd_tbl.lex.c
-
-
-HFILES=	ss.h ss_internal.h copyright.h
-
-# for 'tags' and dependencies
-
-CFILES=	$(SRCS) $(MKCMDSCSRCS) test_ss.c
-
-# for building archives
-
-FILES=	$(SRCS) $(MKCMDSFILES) $(HFILES) \
-	ss_err.et std_rqs.ct Makefile \
-	test_ss.c ss mit-sipb-copyright.h copyright.h
-
-#
-# stuff to build
-#
-
-.c.o:
-	$(CC) $(CFLAGS) -c $*.c
-ifdef BUILD_DLL_SHLIBS
-	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
-		-o jump/$*.o -c $*.c)
-endif
-
-all::	mk_cmds libss.a # libss_p.a lint
-
-dist:	archives
-
-install::
-
-install-libs:: all
-	$(INSTALLLIB) libss.a $(LIBDIR)/libss.a
-	$(CHMOD) 644 $(LIBDIR)/libss.a
-	$(RANLIB) $(LIBDIR)/libss.a
-	$(CHMOD) $(LIBMODE) $(LIBDIR)/libss.a
-
-install-libs:: $(HFILES) copyright.h
-	@rm -rf $(INCLDIR)/ss
-	@mkdir $(INCLDIR)/ss
-	for i in $(HFILES) copyright.h; do \
-		$(INSTALLINC) $(srcdir)/$$i $(INCLDIR)/ss/$$i; \
-	done
-
-install-libs:: copyright.h
-	$(INSTALLINC) $(srcdir)/copyright.h $(INCLDIR)/ss/mit-sipb-copyright.h
-
-install-tree::
-
-std_rqs.c: std_rqs.ct
-	$(MK_CMDS) std_rqs.ct
-
-ss_err.c ss_err.h: ss_err.et
-	$(COMPILE_ET) ss_err.et
-
-dep depend .depend: ss_err.h
-	$(CPP) -M $(CFLAGS) *.c >.depend
-
-ct.tab.c ct.tab.h: ct.y
-	rm -f ct.tab.* y.*
-	yacc -d $(srcdir)/ct.y
-	mv -f y.tab.c ct.tab.c
-	mv -f y.tab.h ct.tab.h
-
-# install_library_target(ss,$(OBJS),$(SRCS),)
-all:: libss.a
-
-libss.a: $(OBJS)
-	$(RM) $@.bak
-	-$(MV) $@ $@.bak
-	$(ARCHIVE) $@ $(OBJS)
-	$(RANLIB) $@
-	$(RM) ../$@
-	$(LN) ss/$@ ../$@
-
-
-clean::	
-	$(RM) ../libss.a libss.a mk_cmds
-	$(RM) *.o *~ \#* *.bak core 
-
-really-clean:: clean
-	$(RM) .depend ss_err.h ss_err.c
-
-install-libs::
-	$(INSTALLLIB) libss.a $(LIBDIR)/libss.a
-	$(CHMOD) 644 $(LIBDIR)/libss.a
-	$(RANLIB)    $(LIBDIR)/libss.a
-	$(CHMOD) 444 $(LIBDIR)/libss.a
-
-
-libss.o:	$(OBJS)
-	$(LD) -r -s -o $@ $(OBJS)
-	$(CHMOD) -x $@
-
-mk_cmds: mk_cmds.sh
-	./config_script mk_cmds.sh $(AWK) > mk_cmds
-	chmod +x mk_cmds
-
-include .depend
diff --git a/lib/ss/Makefile.in b/lib/ss/Makefile.in
new file mode 100644
index 0000000..aaab812
--- /dev/null
+++ b/lib/ss/Makefile.in
@@ -0,0 +1,207 @@
+#
+# Makefile for lib/ss
+#
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+top_builddir = ../..
+INSTALL = @INSTALL@
+
+@MCONFIG@
+
+LIBRARY= libss
+LIBDIR= ss
+
+DLL_ADDRESS = 0x66880000
+DLL_JUMPSIZE = 0x1000
+DLL_GOTSIZE  = 0x1000
+DLL_VERSION = 1.0
+DLL_IMAGE = libss
+DLL_STUB = libss
+DLL_LIBS = -L../.. -lcom_err
+DLL_MYDIR = ss
+DLL_INSTALL_DIR = $(libdir)
+
+ELF_VERSION = 2.0
+ELF_IMAGE = libss
+ELF_MYDIR = ss
+ELF_INSTALL_DIR = $(libdir)
+
+BSDLIB_VERSION = 1.0
+BSDLIB_IMAGE = libss
+BSDLIB_MYDIR = ss
+BSDLIB_INSTALL_DIR = $(libdir)
+
+TAGS=etags
+COMPILE_ET=../et/compile_et
+MK_CMDS=./mk_cmds
+
+# -I.. is so that ss/ss_err.h works
+# -I$(srcdir)/.. is so that ss/ss.h works
+# -I$(srcdir)/../et is so com_err.h works
+XTRA_CFLAGS=-DPOSIX_SIGNALS -I$(srcdir)/../et
+
+.c.o:
+	$(CC) $(CFLAGS) -c $<
+@PROFILE_CMT@	$(CC) $(CFLAGS) -pg -o profiled/$*.o -c $<
+@CHECKER_CMT@	$(CC) $(CFLAGS) -checker -g -o checker/$*.o -c $<
+@DLL_CMT@	(export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(CFLAGS) \
+@DLL_CMT@		-o jump/$*.o -c $<)
+@ELF_CMT@	$(CC) $(CFLAGS) -fPIC -o elfshared/$*.o -c $<
+@BSDLIB_CMT@	$(CC) $(CFLAGS) -fpic -o pic/$*.o -c $<
+
+# for the library
+
+LIB=	libss.a
+
+# with ss_err.o first, ss_err.h should get rebuilt first too.  should not
+# be relying on this, though.
+OBJS=	ss_err.o \
+	std_rqs.o \
+	invocation.o help.o \
+	execute_cmd.o listen.o parse.o error.o prompt.o \
+	request_tbl.o list_rqs.o pager.o requests.o \
+	data.o
+
+SRCS=	$(srcdir)/invocation.c $(srcdir)/help.c \
+	$(srcdir)/execute_cmd.c $(srcdir)/listen.c $(srcdir)/parse.c \
+	$(srcdir)/error.c $(srcdir)/prompt.c $(srcdir)/request_tbl.c \
+	$(srcdir)/list_rqs.c $(srcdir)/pager.c $(srcdir)/requests.c \
+	$(srcdir)/data.c 
+
+all:: mk_cmds
+
+@MAKEFILE_LIBRARY@
+@MAKEFILE_DLL@
+@MAKEFILE_ELF@
+@MAKEFILE_BSDLIB@
+@MAKEFILE_PROFILE@
+@MAKEFILE_CHECKER@
+
+CODE= $(SRCS) $(MKCMDSFILES)
+
+MKCMDSOBJS=	mk_cmds.o utils.o options.o ct.tab.o cmd_tbl.lex.o
+
+MKCMDSFILES=	mk_cmds.c utils.c options.c ct.y cmd_tbl.lex.l
+
+MKCMDSCSRCS=	mk_cmds.c utils.c options.c ct.tab.c cmd_tbl.lex.c
+
+
+HFILES=	ss.h ss_internal.h copyright.h
+
+# for 'tags' and dependencies
+
+CFILES=	$(SRCS) $(MKCMDSCSRCS) test_ss.c
+
+# for building archives
+
+FILES=	$(SRCS) $(MKCMDSFILES) $(HFILES) \
+	ss_err.et std_rqs.ct Makefile \
+	test_ss.c ss mit-sipb-copyright.h copyright.h
+
+all::	libss.a # libss_p.a lint
+
+std_rqs.c: std_rqs.ct $(MK_CMDS)
+	$(MK_CMDS) $(srcdir)/std_rqs.ct
+
+ss_err.c ss_err.h: ss_err.et
+	$(COMPILE_ET) $(srcdir)/ss_err.et
+
+ct.tab.c ct.tab.h: ct.y
+	$(RM) -f ct.tab.* y.*
+	$(YACC) -d $(srcdir)/ct.y
+	$(MV) -f y.tab.c ct.tab.c
+	$(MV) -f y.tab.h ct.tab.h
+
+#libss.o:	$(OBJS)
+#	$(LD) -r -s -o $@ $(OBJS)
+#	$(CHMOD) -x $@
+
+mk_cmds: mk_cmds.sh
+	$(CP) mk_cmds.sh $@ && $(CHMOD) +x mk_cmds
+
+installdirs::
+	$(top_srcdir)/mkinstalldirs $(DESTDIR)$(ulibdir) \
+		$(DESTDIR)$(includedir)/ss
+
+install:: libss.a $(HFILES) copyright.h installdirs
+	$(INSTALL_DATA) libss.a $(DESTDIR)$(ulibdir)/libss.a
+	$(CHMOD) 644 $(DESTDIR)$(ulibdir)/libss.a
+	-$(RANLIB) $(DESTDIR)$(ulibdir)/libss.a
+	$(CHMOD) $(LIBMODE) $(DESTDIR)$(ulibdir)/libss.a
+	$(RM) -f $(includedir)/ss/*
+	for i in $(HFILES) copyright.h; do \
+		$(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir)/ss/$$i; \
+	done
+
+uninstall::
+	$(RM) -f $(ulibdir)/libss.a
+	$(RM) -rf $(includedir)/ss
+
+clean::
+	$(RM) -f ../libss.a libss.a mk_cmds 
+	$(RM) -f *.o *~ \#* *.bak core 
+
+mostlyclean:: clean
+distclean:: clean
+	$(RM) -f .depend ss_err.h ss_err.c mk_cmds.sh Makefile
+
+# +++ Dependency line eater +++
+# 
+# Makefile dependencies follow.  This must be the last section in
+# the Makefile.in file
+#
+invocation.o: $(srcdir)/invocation.c $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(srcdir)/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h \
+  $(srcdir)/copyright.h
+help.o: $(srcdir)/help.c \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h $(srcdir)/mit-sipb-copyright.h \
+  $(top_builddir)/lib/ss/ss_err.h $(srcdir)/copyright.h 
+execute_cmd.o: $(srcdir)/execute_cmd.c $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(srcdir)/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h \
+  $(srcdir)/copyright.h
+listen.o: $(srcdir)/listen.c $(srcdir)/copyright.h \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h $(srcdir)/mit-sipb-copyright.h \
+  $(top_builddir)/lib/ss/ss_err.h
+parse.o: $(srcdir)/parse.c \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(srcdir)/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h \
+  $(srcdir)/copyright.h
+error.o: $(srcdir)/error.c \
+  $(srcdir)/copyright.h \
+  $(srcdir)/../et/com_err.h \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(srcdir)/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h
+prompt.o: $(srcdir)/prompt.c $(srcdir)/copyright.h \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(srcdir)/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h
+request_tbl.o: $(srcdir)/request_tbl.c \
+  $(srcdir)/copyright.h $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h $(srcdir)/mit-sipb-copyright.h \
+  $(top_builddir)/lib/ss/ss_err.h
+list_rqs.o: $(srcdir)/list_rqs.c $(srcdir)/copyright.h \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h $(srcdir)/mit-sipb-copyright.h \
+  $(top_builddir)/lib/ss/ss_err.h
+pager.o: $(srcdir)/pager.c \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(srcdir)/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h \
+  $(srcdir)/copyright.h
+requests.o: $(srcdir)/requests.c $(srcdir)/mit-sipb-copyright.h \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(top_builddir)/lib/ss/ss_err.h
+data.o: $(srcdir)/data.c \
+  $(srcdir)/ss_internal.h \
+  $(srcdir)/ss.h \
+  $(srcdir)/mit-sipb-copyright.h $(top_builddir)/lib/ss/ss_err.h \
+  $(srcdir)/copyright.h
diff --git a/lib/ss/config_script b/lib/ss/config_script
deleted file mode 100644
index e3de35c..0000000
--- a/lib/ss/config_script
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-#
-# This program takes a shell script and configures for the following
-# variables:	@DIR@
-#		@AWK@
-#		@SED@
-#
-# Usage: config_script <filename> [<awk>] [<sed>]
-#
-
-FILE=$1
-AWK=$2
-SED=$3
-
-# Grr.... not all Unix's have the dirname command
-TMP=`echo  $1 | sed -e 's;[^/]*$;;' -e 's/^$/./'`
-DIR=`cd ${TMP}; pwd`
-
-if test "${AWK}x" = "x" ; then
-	AWK=awk
-fi
-if test "${SED}x" = "x" ; then
-	SED=sed
-fi
-sed -e "s;@DIR@;${DIR};" -e "s;@AWK@;${AWK};" -e "s;@SED@;${SED};" $FILE
diff --git a/lib/ss/error.c b/lib/ss/error.c
index 3b7165a..80ebc82 100644
--- a/lib/ss/error.c
+++ b/lib/ss/error.c
@@ -22,20 +22,10 @@
 #include <com_err.h>
 #include "ss_internal.h"
 
-#ifdef _STDARG_H_
-#define STDARG
-#endif
-
-#ifdef _STDARG_H
-#define STDARG
-#endif
-
-#ifndef __STDC__
-/* we didn't get it in com_err.h if it wasn't STDC. */
-#ifndef STDARG
-/* and we don't need it, either, if we're using stdarg.h... */
-#include <varargs.h>
-#endif
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#else
+#include <vararg.h>
 #endif
   
 #undef ss_error
@@ -78,7 +68,7 @@
     }
 }
 
-#ifdef STDARG
+#ifdef HAVE_STDARG_H
 void ss_error (int sci_idx, long code, const char * fmt, ...)
 #else
 void ss_error (va_alist)
@@ -87,7 +77,7 @@
 {
     register char const *whoami;
     va_list pvar;
-#ifndef STDARG
+#ifndef HAVE_STDARG_H
     int sci_idx;
     long code;
     char * fmt;
diff --git a/lib/ss/help.c b/lib/ss/help.c
index f956ca8..3f3c7f5 100644
--- a/lib/ss/help.c
+++ b/lib/ss/help.c
@@ -4,12 +4,13 @@
  * For copyright info, see copyright.h.
  */
 
-#ifdef HAS_UNISTD_H
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#ifdef HAS_STDLIB_H
+#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
+#include <fcntl.h>
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/file.h>
@@ -29,7 +30,7 @@
     int sci_idx;
     pointer info_ptr;
 {
-    char buffer[MAXPATHLEN];
+    char *buffer;
     char const *request_name;
     int code;
     int fd, child;
@@ -47,9 +48,16 @@
     }
     else if (argc != 2) {
 	/* should do something better than this */
+	buffer = malloc(80+2*strlen(request_name));
+	if (!buffer) {
+		ss_perror(sci_idx, 0,
+			  "couldn't allocate memory to print usage message");
+		return;
+	}
 	sprintf(buffer, "usage:\n\t%s [topic|command]\nor\t%s\n",
 		request_name, request_name);
 	ss_perror(sci_idx, 0, buffer);
+	free(buffer);
 	return;
     }
     info = ss_info(sci_idx);
@@ -61,21 +69,32 @@
 	ss_perror(sci_idx, SS_ET_NO_INFO_DIR, (char *)NULL);
 	return;
     }
-    for (idx = 0; info->info_dirs[idx] != (char *)NULL; idx++) {
+    for (fd = -1, idx = 0; info->info_dirs[idx] != (char *)NULL; idx++) {
+        buffer = malloc(strlen (info->info_dirs[idx]) + 1 +
+			strlen (argv[1]) + 6);
+	if (!buffer) {
+	    ss_perror(sci_idx, 0,
+		      "couldn't allocate memory for help filename");
+	    return;
+	}
 	(void) strcpy(buffer, info->info_dirs[idx]);
 	(void) strcat(buffer, "/");
 	(void) strcat(buffer, argv[1]);
 	(void) strcat(buffer, ".info");
-	if ((fd = open(&buffer[0], O_RDONLY)) >= 0) goto got_it;
+	fd = open(buffer, O_RDONLY);
+	free(buffer);
+	if (fd >= 0)
+	    break;
     }
-    if ((fd = open(&buffer[0], O_RDONLY)) < 0) {
-	char buf[MAXPATHLEN];
-	strcpy(buf, "No info found for ");
+    if (fd < 0) {
+#define MSG "No info found for "
+        char *buf = malloc(strlen (MSG) + strlen (argv[1]) + 1);
+	strcpy(buf, MSG);
 	strcat(buf, argv[1]);
 	ss_perror(sci_idx, 0, buf);
+	free(buf);
 	return;
     }
-got_it:
     switch (child = fork()) {
     case -1:
 	ss_perror(sci_idx, errno, "Can't fork for pager");
@@ -91,7 +110,7 @@
     }
 }
 
-#ifndef USE_DIRENT_H
+#ifndef HAVE_DIRENT_H
 #include <sys/dir.h>
 #else
 #include <dirent.h>
diff --git a/lib/ss/list_rqs.c b/lib/ss/list_rqs.c
index 8c797ad..5a9abe5 100644
--- a/lib/ss/list_rqs.c
+++ b/lib/ss/list_rqs.c
@@ -42,12 +42,8 @@
 #endif
     sigret_t (*func)();
 #ifndef NO_FORK
-#ifndef WAIT_USES_INT
-    union wait waitb;
-#else
     int waitb;
 #endif
-#endif
 
     DONT_USE(argc);
     DONT_USE(argv);
diff --git a/lib/ss/mk_cmds.sh b/lib/ss/mk_cmds.sh.in
similarity index 91%
rename from lib/ss/mk_cmds.sh
rename to lib/ss/mk_cmds.sh.in
index eda3888..4866081 100644
--- a/lib/ss/mk_cmds.sh
+++ b/lib/ss/mk_cmds.sh.in
@@ -2,7 +2,7 @@
 #
 #
 
-DIR=@DIR@
+DIR=@SS_DIR@
 AWK=@AWK@
 SED=@SED@
 
@@ -18,6 +18,7 @@
 	rm ${TMP}
 	exit 1
 else
+	rm -f ${BASE}.c
 	mv ${TMP} ${BASE}.c
 	exit 0
 fi
diff --git a/lib/ss/pager.c b/lib/ss/pager.c
index ff915da..bc5c9b5 100644
--- a/lib/ss/pager.c
+++ b/lib/ss/pager.c
@@ -7,9 +7,12 @@
  * For copyright information, see copyright.h.
  */
 
-#ifdef HAS_UNISTD_H
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include "ss_internal.h"
 #include "copyright.h"
diff --git a/lib/ss/parse.c b/lib/ss/parse.c
index 68a5064..38b8e5b 100644
--- a/lib/ss/parse.c
+++ b/lib/ss/parse.c
@@ -7,6 +7,9 @@
 #ifdef HAS_STDLIB_H
 #include <stdlib.h>
 #endif
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include "ss_internal.h"
 #include "copyright.h"
diff --git a/lib/ss/request_tbl.c b/lib/ss/request_tbl.c
index b15ba91..e1cbfe8 100644
--- a/lib/ss/request_tbl.c
+++ b/lib/ss/request_tbl.c
@@ -4,6 +4,10 @@
  * For copyright information, see copyright.h.
  */
 
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
 #include "copyright.h"
 #include "ss_internal.h"
 
diff --git a/lib/ss/ss_err.c b/lib/ss/ss_err.c
deleted file mode 100644
index 7b97a00..0000000
--- a/lib/ss/ss_err.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * ss_err.c:
- * This file is automatically generated; please do not edit it.
- */
-#ifdef __STDC__
-#define NOARGS void
-#else
-#define NOARGS
-#define const
-#endif
-
-static const char * const text[] = {
-		"Subsystem aborted",
-		"Version mismatch",
-		"No current invocation",
-		"No info directory",
-		"Command not found",
-		"Command line aborted",
-		"End-of-file reached",
-		"Permission denied",
-		"Request table not found",
-		"No info available",
-		"Shell escapes are disabled",
-		"Sorry, this request is not yet implemented",
-    0
-};
-
-struct error_table {
-    char const * const * msgs;
-    long base;
-    int n_msgs;
-};
-struct et_list {
-    struct et_list *next;
-    const struct error_table * table;
-};
-extern struct et_list *_et_list;
-
-static const struct error_table et = { text, 748800L, 12 };
-
-static struct et_list link = { 0, 0 };
-
-void initialize_ss_error_table (NOARGS);
-
-void initialize_ss_error_table (NOARGS) {
-    if (!link.table) {
-        link.next = _et_list;
-        link.table = &et;
-        _et_list = &link;
-    }
-}
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100644
index 0000000..0801ec2
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,32 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do 
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d in ${1+"$@"} ; do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+        mkdir "$pathcomp" || errstatus=$?
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/version.h b/version.h
index 8dd466a..e88d302 100644
--- a/version.h
+++ b/version.h
@@ -2,9 +2,10 @@
  * version.h --- controls the version number printed by the e2fs
  * programs.
  *
- * Copyright 1994, Theodore Ts'o.  This file may be redistributed
+ * Copyright 1995, Theodore Ts'o.  This file may be redistributed
  * under the GNU Public License.
  */
 
-#define E2FSPROGS_VERSION "0.5b"
-#define E2FSPROGS_DATE "11-Mar-95"
+#define E2FSPROGS_VERSION "0.5c"
+#define E2FSPROGS_DATE "27-Oct-95"
+