0.38 
	* New Apps: ping and hostname contributed by Randolph Chung
	    <tausq@debian.org>
	* on reboot, init called 'umount -a -n', which caused errors
	    when BB_MTAB was not enabled.  Changed to 'umount -a',
	    which does the right thing.

	-Erik Andrsen

0.38
	* Fixed a segfault in 'umount -a' when a badly formed /etc/fstab
	    file existed.
	* df will not exit on error, but will stat all mounted filesystems.
	* Fixed tar so uid/gid/permissions on extracted tarballs will be correct.
	* Fixed find -name so it properly uses shell wildcard patterns 
	    (i.e. `*', `?', and `[]') instead of regular expressions, which
	    was causing some confusing and unexpected behavior.
	* Added klogd to syslogd, so now the log will contain both system and
	    kernel messages.
	* syslogd now creates the /dev/log socket to make sure it is there, and
	    is actually a socket with the right permissions.
	* I've taken a first step to making busybox not need the /proc 
	    filesystem.  Most apps don't need it.  Those that _require_ it, 
	    will complain if you enable them when you disable 
	    BB_FEATURE_USE_PROCFS.
	   
	-Erik Andrsen, Dec 5, 1999

0.37
	* Wrote a micro syslogd, and a logger util (to log things to the syslog
	    from the command line or scripts)  With both compiled in, costs 4k.
	* Fixed 'make install' so symlinks are installed in their proper locations.
	* Changed the build system slightly so that features can now be enabled
	    or disabled from the busybox.defs.h header file, without trying to 
	    compile in a source file named after that featue (unless that file exists).
	* Several options are now moved into busybox.defs.h
	* Now 'rm -R' and 'rm -r' both work.
	* dd now properly handles input beyond 1 block from stdin.
	* Fixed a bug where tar unpacked everything a directories. Moved some code 
	    from createPath into mkdir where it belonged, thereby making tar work properly.
	* Fixed an off-by-one bug in cat.  Given a list of file it wouldn't cat out the
	    last file in the list.
	* Fixed 'ls -ln' so numeric group/uid are presented properly, and fixed 'ls -l' 
	    so when uid/gid is not in /etc/{passwd,group} the numeric group/uid are 
	    presented properly.  
	* Also added a TODO.


	-Erik Andrsen, Nov 25, 1999

0.36
	* fixed dd so it properly defaults to stdin and stdout when no 
	    if= and of= are set (fix thanks to Eric Delaunay).
	* Don't try to close the file descriptor of a pipein tar. (fix also from
	    Eric Delaunay).
	* Made createPath be quiet (again thanks to Eric Delaunay).
	* If BB_CONSOLE_CMD_IF_RC_SCRIPT_EXITS is defined, then whatever
	    command you define it as will be run if the init script exits.
	* Updated install.sh to make it more robust (thanks to Adam Di Carlo)
	* NFS support added to mount by Eric Delaunay.  It costs 10k when compiled
	    in, but that is still a big win for those that use NFS.
	* Made 'rm -f' be silent for non-existant files (thanks to Eric Delaunay).
	* changed zcat.c to gunzip.c.  It now obeys the principle of least surprise 
	    and acts as god intended gunzip and zcat to act.  They answer --help and
	    obey the '-c' flag.
	* Fixed a bug in mv which caused it to not move files when the destination
	    was a directory.
	* Fixed a decimal-instead-of-octal bug causing mkdir to make directories
	    with very wrong permissions.
	* chmod would overwrite file permissions instead of modifying them.
	    Now it properly modifies permissions.
	* Init now sends warnings destined for the console to /dev/console to ensure
	    they show up on whatever the active console it.  Otherwise important
	    messages (for example that the system is rebooting) were not seen when
	    switched to a different VT.

	-Erik Andersen, Nov 17, 1999
	
0.35
	* gzip now obeys the principle of least surprise and acts like god intended 
	    (i.e. it accepts a file name, answers --help, and obeys the '-c' flag 
	    and only then outputs to stdout).
	* Fixed more.c to compile autowidth on sparc and set initial winsize 
	    to 0,0 in case the TIOCGWINSZ ioctl fails.  Fix thanks to Eric Delaunay.
	* Fixed tar so it now works as expected (it had TRUE/FALSE backwards)
	* tar now accepts --help
	* chmod, chown, and chgrp usage now works
	* General usage (i.e. --help) cleanups for most apps
	* umount now parses options correctly
	* tar can now unpack tarballs containing device special files, 
	    sockets, and fifos (though it can't pack them up) thanks 
	    to Matt Porter.  Creating archives containing these is still
	    left to the interested student.
	* fixed up the license in more.c to properly point to Bruce Perens.

	-Erik Andersen, Nov  11, 1999

0.34
	* ls -l now displays link names outside the current directory,
	    Patch thanks to Eric Delaunay
	* init now properly handles sparc serial consoles and does a
	    better job of finding the real console device rather than using
	    /dev/console which doesn't support job control. Patch also
	    thanks to Eric Delaunay.
	* more started to read from stdin after the last file was finished, and 
	    options were not parsed correctly (fix thanks to Eric Delaunay).
	* more will now use the terminal size if BB_FEATURE_AUTOWIDTH is on.
	* rm wouldn't remove a symlink unless the symlink was valid.  This was
	    a side effect of the busybox 0.32 recursiveAction() fix.  Things 
	    should now work correctly.
	* grep wouldn't grep stdin.  Now it does.
	* sed wouldn't sed stdin.  Now it does.
	* sed was appending a \n to the end of lines with replacements.
	    Now it doesn't do that.
	* ls -l now bypasses libc6 nss when displaying user/group names.
	    Now uses my_getpwuid and my_getgrgid.

	 -Erik Andersen, Nov  8, 1999

0.33
	* Fixed a bug where init could hang instead of rebooting.
	* Removed some debugging noise from init.c
	* Fixed ln so it works now (it was very broken).
	* Fixed df so it won't segfault when there is no /etc/fstab,
	* If BB_MTAB is not defined, df and mount will whine if /etc/fstab
	    is not installed (since they cannot fixup "/dev/root" to 
	    state the real root device name)
	* merged some redundant code from mtab.c/df.c into utility.c

	 -Erik Andersen, Nov  5, 1999

0.32
	* More changes -- many thanks to Lineo for paying me to work on
	    busybox.  If you have any problems please let me know ASAP
	    at andersen@lineo.com or andersee@debian.org
	* usage() now prints the BusyBox version.  This will help folks
	    realize that they are not in Kansas anymore.
	* Fixed mkdir -m option so that it works.
	* kill segfaulted w/o any arguments.  Now it doesn't do that.
	* kill wasn't properly accepting signal names.  It does now.
	* Added new apps chvt and deallocvt (I should probably add open)
	* Major rewrite of init.c.  Code is now readable by mere mortals IMHO.
	* Wrote sed -- weighs only 1.8k (5.8k with full regular expressions!).
	* Fixed a stupid seg-fault in sync
	* Fixed mount -- mount -a failed to parse and apply mount options
	* Fixed umount -n (patch thanks to Matthew Grant <grantma@anathoth.gen.nz>)
	* umount -a no longer umounts /proc
	* Added BB_MTAB, allowing (at the cost of ~1.5k and the need for a rw /etc)
	    folks to use a real /etc/mtab file instead of a symlink to /proc/mounts.
	    mount, and umount will add/remove entries and df will now use /etc/mtab 
	    if BB_MTAB is defined. 
	* Fixed a nice bug in recursiveAction() which caused it to infinitely
	    hunt through /proc/../fd/* creating new file descriptors if it
	    followed the /dev/fd link over to /proc.  recursiveAction() now 
	    lstat's the file when followLinks==FALSE so it won't follow links 
	    as the name suggests.  Fix thanks to Matt Porter <porter@debian.org>.


	 -Erik Andersen, Nov  4, 1999

0.31
	* I added a changelog for version 0.30. 
	* adjusted find internals to make it smaller, and removed 
	    some redundancy.
	* Fixed a segfault in ps when /etc/passwd or /etc/group 
	    are absent.  Now will warn you and carry on.
	* Added in optional _real_ regular expression support (to be
	    the basis for a future sed utility).  When compiled in
	    it adds 3.9k, but makes grep much more capable.
	* Checked out using nftw(3) for recursive stuff, but unfortunatly
	    it wasn't supported before GNU libc 2.1, and some folks use
	    glibc 2.0.7 since it is much smaller than that latest and greatest.

	 -Erik Andersen, Oct 21, 1999

0.30
	Major changes -- lots of stuff rewritten. Many thanks to Lineo for
	paying me to make these updates. If you have any problems with busybox, 
	or notice any bugs -- please let me know so I can fix it.  These 
	changes include:

	Core Changes:
	    * busybox can now invoke apps in two ways: via symlinks to the
		busybox binary, and as 'busybox [function] [arguments]...'
	    * When invoked as busybox, the list of currently compiled in 
		functions is printed out (no this is not bloat -- the list
		has to be there anyway to map invocation name to function).
	    * busybox no longer parses command lines for apps or displays their
		usage info.  Each app gets to handle (or not handle) this for
		itself.
	    * Eliminated monadic, dyadic, descend, block_device, and 
		postprocess.  It was cumbersome to have so many programs
		cobbled together in this way.  Without them, the app is much
		more granular.
	    * All shared code now lives in utility.c, and is properly
		ifdef'ed to be only included for those apps requiring it.
	    * Eliminated struct FileInfo (the basis of monadic, dyadic, etc)
		so now each app has the function prototype of (da-dum):
		    extern int foo_main(int argc, char** argv);
		which speeds integration of new apps.
	    * Adjusted the Makefile to make it easier to 
		{en|dis}able debugging.
	    * Changed default compiler optimization to -Os 
		(optimize for smaller binaries).

	App Changes:
	    * To cope with the new app function prototype and the removal of
		monadic, dyadic, etc, the following apps were re-written:
		    * cat - Works same as always.
		    * chgrp, chmod, chown - rewrite.  Combined into a single 
			source file.  Absorbed patches from Enrique Zanardi <ezanard@debian.org>
			that removes the dependency on libc6 libnss* libraries.
		    * cp - Can now do 'cp -a' can can copy devices,
			pipes, symlinks, as well as recursive or non-recursive dir copies.
		    * fdflush - adjusted to remove dependancy on struct FileInfo.
		    * find - Now includes some basic regexp matching 
			which will be the basic of a future mini-sed.
		    * ln - Same functionality.
		    * mkdir - Added -p flag to feature set.
		    * mv - rewrite.
		    * rm - Added -f flag to feature set.
		    * rmdir - Same functionality.
		    * swapon, swapoff - Combined into a single binary. No longer
			uses /etc/swaps.  swap{on|off} -a uses /etc/fstab instead.
		    * touch - Same functionality.
	    * date - adjusted with a patch from Matthew Grant <grantma@anathoth.gen.nz>
		to accomodate glibc timezone support.  I then ripped out GNU getopt.
	    * mkswap -- new version merged from util-linux.  Can now make >128Meg swaps.
	    * Replaced the old and star, unstar, and tarcat with the tar 
		implementation from sash.   Now tar behaves as god intended
		it to (i.e. tar -xvf <file> and tar -cf <file> <dir> work).
	    * dd -- rewritten.  Can with with files, stdin, stdout.
	    * Added the following new apps:
		    * loadfont -- added from debian boot floppies 
		    * chroot -- added based on a patch from Paolo Molaro <lupus@lettere.unipd.it> 
		    * grep -- I just wrote it.  Only matches simple strings
		    * ps -- I just wrote it.  Has _no_ options at all, but works.
		    * fsck_minix, mkfs_minix -- added from util-linux, but I ripped out
			internationalization and such to make them smaller.
		    * sfdisk -- Added from util-linux (minus internationalization and such).
	    * Probably some other changes that I forgot to document...

	 -Erik Andersen, Oct 20, 1999

0.29	
	This version was a messy pre-alpha.  stay away or it will bite you.
	 -Erik Andersen, Sep 24, 1999
	
0.28	
	mini-netcat (mnc) rewritten.
	
0.27
	Mount now supports -a, and -t auto.
	Mount now updates mtab correctly for 'ro'.
	More checks screen rows size, outputs bytes percentage.
	Printf added as module.
0.26
	Touch now creates files. -c option for no create.
	
