0.40
	* Added the -s option to du -beppu
	* Fixed an embarrasing segfault in head	-beppu
	* New Apps: sort, uniq. -beppu
	* New Apps: lsmod, rmmod -erik
	* New Apps: fbset contributed by Randolph Chung <tausq@debian.org>.
	* New App:: loadacm contributed by Peter Novodvorsky <petya@logic.ru>
	    for loading application character maps for Unicode fonts.
	* Major init re-work.  init now supports inittab (slightly different
	    but similar to sysvinit), allowing me to get all the policy out
	    of init and into the conf file.  It works just fine without inittab
	    being present, but if you dont like the defautl behavior you can
	    now do something about it.  Init is much cleaner as a result.
	* Fixed an bug in syslogd causing it to stop after 20 minutes. -erik
	* Fixed the embarrasing failure of 'logger -p'. -erik
	* Re-worked the source tree a bit so it will compile under glibc 2.0.7 
	    with the 2.0.x Linux kernel.
	* Added 'grep -q' thanks to a patch from "Konstantin Boldyshev" 
	    <konst@voshod.com>.
	* Grep -i previously failed on UPPER CASE patterns due to a silly 
	    regexp implementation bug that is now fixed.
	* Fixed a bug where tar would set, and then clear SGID and SUID bits.
	* Fixed a bug where tar would not set the user and group on device
	    special files.
	* Fixed a bug where tar would not restore the time to files.
	* Fixed a major security problem with tar -- it changed ownership 
	    of any file pointed to by a symlink to 777 (like say libc....)
	    Ouch!!!
	* cp and mv were very broken when moving directories.  I have rewritten 
	    them so they should now work as expected. 
	* sed now supports addresses (numeric or regexp, with negation) and 
	    has an append command, thanks to Marco Pantaleoni <panta@prosa.it>
	* Fixed dmesg.  It wasn't parsing its options (-n or -s) properly.  
	* Some cosmetic fixes to ls output formatting to make it behave more
	    like GNU ls.
	* Fixed a stupid segfault in kill.
	* Several fixes from Friedrich Vedder <fwv@myrtle.lahn.de>:
	    - Added gunzip -t, removed gunzip.c dead code,
	    - fixed several typos
	    - Glibc 2.0.7 and libc5 compile fixes
	* Fixed a bug where 'mknod --help' would segfault.
	    

	-Erik Andersen

0.39 
	* New Apps: ping, hostname, and mkfifo contributed by Randolph Chung
	    <tausq@debian.org>.  3 items off the TODO list!
	* I wrote free (just calls "cat /proc/meminfo").
	* Added tail, based on tail from GNU textutils-1.19, but adjusted
	    to suit my evil purposes.  Costs 6k.  I'll make it smaller sometime.
	* 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.
	* init will now try to run /sbin/getty if it is present (for easy
	    integration with the about-to-be-released tinylogin.)
	* kill now behaves itself properly, added 'kill -l' to list signals
	* 'ls -l' was failing on long directories, since my_getid was leaking 
	    one file descriptor per file.  Oops.
	* Fixed rebooting from init.  I'd accidently left some debugging code in
	    which blocked reboots.
	* Fixed reboot, halt (and added poweroff) such that they handle it when
	    init is not at PID 1 (like when running in an initrd).
	* Added a prelinary du implementation.  Some parameter parsing
	    stuff still needs to be added. -beppu (John Beppu <beppu@lineo.com>)
	* Implemented tee.  -beppu
	* Implemented head. -beppu

	-Erik Andersen, Dec 10, 1999

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 Andersen, 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 Andersen, 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.
	
