0.47pre

	* A bug in syslogd was fixed that allowed it to potentially fork-bomb
	    your system.
	* chroot can now call the builtin shell - Pavel Roskin <proski@gnu.org>
	* added 'renice' command, thanks to Dave Cinege <dcinege@psychosis.com>
	* 'make install' now creates relative symlinks, and added a new
	    'make install-hardlinks' target to (tada) install hardlinks.
	* syslogd can now log messages to a remote host -- patch thanks
	    to Gyepi Sam <gyepi@praxis-sw.com>
	* Rewrite of 'tail' to make it simpler, smaller, and more robust.  
	    It now weighs only 2.25k (3k when full featured).  The code is
	    cleaner too, thanks to Allen Soard <esp-software@mail.hypermart.net>
	* Add optional ls file sorting, thanks to a patch from 
	    Sterling Huxley <sterling@europa.com>
	* lsmod now uses the query_module syscall, rather then /proc
	* Added 'rdate' command from Sterling Huxley <sterling@europa.com>
	* Added 'wget' command, contributed by Chip Rosenthal <chip@unicom.com>, 
		<crosenth@covad.com> and Covad Communications
	* Added 'getopt' from "Alfred M. Szmidt" <ams@trillian.itslinux.org>
	* Fixed chmod option parsing so things like 'chmod -r /tmp/file'
	    wouldn't work (since it thought -r was an option).  Doh!
	* Added dos2unix, unix2dos, and unrpm.c thanks to robotti@metconnect.com.



	 -Erik Andersen


0.46

	* Better portability.  Now should compile cleanly with libc5, 
	    GNU libc 2.0 and 2.1, and various Linux kernels including 
	    2.0.x, 2.2.x, and to 2.4.0-test*. (patch for 2.4.x kernels
	    to make /proc/mounts behave included in the kernel-patches dir). 
	* Fixed a _horrible_ bug where 'tar -tvf' could unlink
	    local files that matched tarball contents!!!  Fix thanks 
	    to Marius Groeger <mgroeger@sysgo.de>
	* Fixed a nasty bug in tar when could mess up saved symlinks.
	* Fixed tar creation support when reading from stdin ('tar -cf - . ') 
	    thanks to Daniel Quinlan <quinlan@transmeta.com>
	* Updates to handle Linux 2.4.0 kernels (kludged around the
	    "none" entries in /proc/mounts, added a hack to make sysinfo
	    work with both old and new kernels).
	* Fixed insmod module option parsing for options lacking an '='.
	    Fix thanks to Marc Nijdam <marc_nijdam@hp.com>
	* Fixed segfault with 'cut -f 1 -d:' and added 'cut -s' suport.
	    Fix thanks to Arne Bernin <arne@matrix.loopback.org>
	* Several fixes from Marius Groeger <mag@sysgo.de>
	    - Added support for "sh -c command args..."
	    - Fixed globbing, i.e. 'echo * *' and 'echo "******"' now work.
	    - Added shell environment variable substitution 
	    - Added the "read" shell builtin.
	* Fixed cursor editing in cmdedit.c. The following keyboard sequence 
	    used to create an infinite loop: ls, cursor up, left, down.
	* Added support for being a login shell, so things like
	    '-su' or '-sh' (stuff where argv[0][0]=='-') will now always 
	    invoke the shell.  Now you can use BusyBox as a login shell.
	* ls.c now ignores '-g', since some ftp clients like that sort 
	    of thing.  Patch thanks to David Vrabel <dvrabel@arcom.co.uk>
	* Fix to init.c from Stuart Menefy <Stuart.Menefy@st.com> so that
	    it always sets the controlling terminal before running any programs
	* Several fixes from Matt Kraai <kraai@alumni.carnegiemellon.edu>
	    - Fixed tr so it recognizes standard escape sequences.  
		Merged common escape seq. code from tr and echo into utility.c.
	    - Major work in updating/cleaning up the docs, and getting the
		new SGML based docs into shape.
	    - cleanup of ar.c
	    - BusyBox should now poweroff when asked to do so.
	    - Fixed 'ln -n' and 'ln -s' so they both work properly.
	* Reorganized signal names in kill.c for better architecture support 
	    -- patch thanks to simon wood <simon@mungewell.uklinux.net>
	* In 0.43, backspace and delete worked properly, but with 0.45, 
	    it just echoed a ^? for backspace, and ^H for control-h.  This
	    was due to a broken macro in init.c, that is now fixed.
	* Removed sfdisk from BusyBox.  It was buggy, fat, and we really
	    couldn't maintain it very well, so including it was not really
	    very appropriate.  Those wanting an fdisk are invited to
	    grab a copy from util-linux.
	* Added 'dumpkmap' to allow people to dump a binary keymap, which can 
	    then be loaded in by 'loadkmap' -- submitted by
	    Arne Bernin <arne@matrix.loopback.org>
	* Fixed NFS so it supports 2.4.x kernels and NFSv3.
	* Brand, new versions of grep and sed which use libc regex routines,
	    thanks to Mark Whitley <markw@lineo.com>.  The hand-tooled 
	    "regexp.[ch]" files have been removed. Much help on these from 
	    Matt Kraai as well.


	 -Erik Andersen


0.45
	* Now compiles vs libc5 (which can save lots of space for 
	    embedded systems).
	* Added BB_FEATURE_TRIVIAL_HELP which compiles out most all of the
	    help messages (i.e --help).  Saves 17k over a full compile.
	* Added cut and tr from minix, since due to the license change, 
	    we can now use minix code.  Minix tr saves 4k. 
	* insmod now works.  It costs 29k, but imagine an initrd with a 
	    staticly linked busybox containing only insmod and sh, a few /dev 
	    entries, and a kernel module or two...  It doesn't get smaller
	    then this folks (I pity the fool that writes insmod in asm ;-).
	    Many kudos go to Ron Alder <alder@lineo.com> for finishing this off!
	* Added a mini ar archive utility, especially written for BusyBox by 
	    Glenn McGrath <bug1@netconnect.com.au>
	* Added mktemp, contributed by Daniel Jacobowitz <dan@debian.org>
	* Added setkeycodes, for those that have wierd keyboard buttons.
	* Added md5sum, uuencode and uudecode -- thanks to Alfred M. Szmidt 
	    <ams@trillian.itslinux.org> for contributing these.
        * Added 'grep -v' option (inverted search) and updated 
	    docs accordingly.  -beppu
	* Wrote which
	* Replaced the telnet implementation with one written by 
	    Tomi Ollila <too@iki.fi> It works great and costs 3k.
	* BusyBox sh (lash) now supports being used as a standalone shell.  When
	    BB_FEATURE_SH_STANDALONE_SHELL is defined, all the busybox commands may
	    be invoked as shell internals.  Best used when compiling staticly 
	    (i.e. DOSTATIC=true)
	* BusyBox sh (lash) internals now behave as expected wrt pipes 
	    and redirects. 
	* Fixed ping warnings -- fix from Sascha Ziemann <szi@aibon.ping.de>
	* Fixed update segfault
	* Fixed mknod -- minor number was always 0
	* Fixed tar option parsing, so both "tar xvf foo.tar" and 
	    "tar -xvf foo.tar" now work (i.e. no "-" before options) 
	    (this was very broken in 0.43).
	* Several contributions from Randolph Chung <tausq@debian.org>.
	    * cp/mv now accepts the -f flag
	    * tail can now accept -<num> commands (e.g. -10) for better 
		compatibility with the standard tail command
	    * added a simple id implementation; doesn't support sup. groups yet
	* logname used getlogin(3) which uses utmp.  Now it doesn't. 
	* whoami used getpwuid(3) which uses libc NSS.  Now it behaves. 
	* Add support for "noatime" and "nodiratime" mount flags to mount.
	* Changed 'umount -f' to mean force, and actually use umount2.
	* Changed 'umount -l' to mean "Do not free loop device".
	* Fixed basename to support stripping of suffixes.  Patch thanks
	    to xiong jianxin <jxiong@uiuc.edu>
	* cp -fa now works as expected for symlinks (it didn't before)
	* zcat now works (wasn't working since option parsing was broken)
	* Renamed "mnc" to the more correct "nc" (for netcat).
	* Makefile intelligence updates
	* Changed the way init parses /etc/inittab entries to avoid problems
	    with commands that contain colons in them.  Fix thanks to 
	    Pavel Roskin <proski@gnu.org>
	* Fixed a warning in utility.c due to char being unsigned on Linux/PPC, 
	    Fix thanks to Pavel Roskin <proski@gnu.org>
	* Made "killall" complain (not error and exit) about processes that it 
	    cannot find by name -- Pavel Roskin <proski@gnu.org> 
	* Fixed more and ps to have sensible terminal width defaults, thanks 
	    to Pavel Roskin.
	* Fixed all fatalError() calls lacking a "\n", thanks to Pavel Roskin.
	* Fixed a segfault in yes when no args were given -- Pavel Roskin.
	* Simplified freeramdisk and added argument checking -- Pavel Roskin. 
	* Fixed segfault caused by "touch -c"
	* Fixed segfault caused by "rm -f"
	* Fixed segfault caused by "ln -s -s" and similar abuses. Further fixes
	    and "--" support from Pavel Roskin.
	* Fixed segfault caused by "cp -a -a" and similar abuses.
	* Implemented "rm -- <foo>". Implementation fixed by Pavel Roskin.
	* "which" rewritten to use stat(). Fixes to improve its compatability
	    with traditional implementations -- Pavel Roskin.
	* "mount" now reports errors from nfsmount() and assumes NFS mount
	    if ':' is present in the device name - Pavel Roskin
	* Fixed exit status for killall - Pavel Roskin
	* Fixed 'swapon -a' and 'swapoff -a', which were broken.
	* Fixed 'mount -a' so it works as expected.
	* Implemented 'ls -R' (enabled by enabling BB_FEATURE_LS_RECURSIVE)
	* Implemented "ping -s", fixed error messages and argument parsing -
	    Pavel Roskin
	* Syslogd will not go to background if "-n" is given. Better help
	    and argument checking -- Pavel Roskin
	* Fixed a small bug that could cause tar to emit warning messages
	    and not extract the first file in a directory in some cases
	    of nested directories.  Thanks to Kevin Traas <kevin@netmaster.com>
	    for helping track this one down.
	* More doc updates
	* Fixed grep "Line too long" problem -- John Beppu
	* Fixed 'grep -q -i B some_file' so it works
	* math takes input from stdin if no args are given.  -- John Beppu
	* math was renamed to dc.  Although it deviates from dc's behaviour,
	    this will probably be remedied in the future.  -- John Beppu


	 -Erik Andersen, June 21, 2000


0.44
	Previously, an erronous announcement of BusyBox 0.44 was made, so to 
	avoid possible confusion, we are skipping straight to 0.45, and calling
	it good.

	 -Erik Andersen


0.43
	* Major update to the provided documentation.
	* Busybox now includes a shell!  It currently costs 7.5 k (plus an
	    additional 2.5 k if you compile in command line editing).  Handles
	    job control, has the usual set of builtins, and does everything
	    except for handling programming statements (if, while, etc...)
	* Busybox can now work perfectly when /proc is disabled, thereby 
	    saving a bunch of memory (kernel /proc support is not thin).  This
	    is done by making use of some nice kernel patches I wrote up to
	    support the features that busybox requires and that /proc usually
	    provides.  To enable this, turn on BB_FEATURE_USE_DEVPS_PATCH and
	    patch your kernel with the devps patch in the kernel-patches/
	    directory. 
	* Wrote basename, dirname, killall, and uptime.
	* tar has been completely rewritten by me.  Both tar creation and 
	    extraction are now well behaved.  Costs 7.6k with all optional
	    tar features enabled, and 5k for just tar extraction support. 
	* Added freeramdisk, which will free up all memory associated
	    with a ram disk.  Contributed by Emanuele Caratti <wiz@iol.it>
	    and then adjusted a bit by me.
	* Added tr from John Lombardo <john@deltanet.com> 
	* Added echo and test (from me).
	* Added usleep contributed by Nicolas Pitre <nico@cam.org>
	* BusyBox's bss size has been majorly reduced (was 384668, is now 28740).
	* Several fixes from Pavel Roskin <proski@gnu.org>:
	    - When `tail' fails to open a file it now exits.
	    - When `syslogd' is given the `-n' option it should still use 
		fork() for running klogd.
	* nslookup types are now changed to u_int32_t (instead of uint32_t)
	    changed per a patch from Pascal Bellard <pascal.bellard@ascend.com>
	* Fixed "du" so it gives the same answers as GNU "du" (busybox du used 
	    to count hard-linked files more then once).  Many thanks to 
	    Friedrich Vedder <fwv@myrtle.lahn.de> for the fix.
	* Removed /proc dependancies for init and free (while maintaining 
	    exactly the same functionality).  /proc takes up 90k of kernel 
	    space, so it is nice to avoid using it at all costs.
	* init no longer tries to mount /proc (unless there is less the 1 meg 
	    free).  Use of /proc (or not) is policy that should be set up in 
	    /etc/fstab (or in hardcoded scripts), not in init.
	* Fixed rebooting when init runs as an initrd.
	* Fixes and updates from Karl M. Hegbloom  <karlheg@debian.org>
	    - update.c rewritten to look more like update-2.11
	    - moveed the inode hash out of du.c and into utility.c to make 
		it a common resource that can be used by other apps.
	    - cp_mv.c now checks inodes to see if a source and dest are
		the same, and prints an error (instead of endlessly looping).
	    - mv now attempts to do a rename, and will fall back to doing
		a copy only if the rename fails.
	    - Syslogd now supports multiple concurrent connections
	* Several fixes from Pavel Roskin <proski@gnu.org>:
	    - Fixes to sort.  Removed "-g", fixed and added "-r"
	    - Fixes to the makefile for handling "strip"
	* An initial telnet implementation was added by 
	    Randolph Chung <tausq@debian.org>.
	* Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a "-e")
	* ps now supports BB_FEATURE_AUTOWIDTH, and can adjust its width
	    to match the terminal (defaults to width=79 when this is off).
	* ps now accepts (and ignores) all options except for "--help" (which
		as would be expected displays help).
	* Fixed mount'ing loop devices when the filesystem type was not 
	    specified.  It used to revert to non-loop after the first try.
	* all mallocs now use xmalloc (and so are OOM error safe), and
	    the common error handling saves a few bytes.  Thanks to 
	    Bob Tinsley <bob@earthrise.demon.co.uk> for the patch.
	* Fix "+" parsing bug in date, from "Merle F. McClelland" <mfm@cts.com>.
	* Fix symlink following bug in chmod -R and friends.  
	* Now allows SYSV style 'chown foo:bar' in addition to 'chown foo.bar'
	* Fixed a bug in the busybox globbing routine such that 'find /dir -name [i]' 
	    no longer segfaults.


	-Erik Andersen


0.42

        * Fairly massive restructuring of umount.c to deal with remounting 
	  busy devices read-only. Adds a -r option to control that; it is 
	  optionally compiled in with BB_FEATURE_REMOUNT
	* Added a bunch of functions to mtab.c to interact with the
	  {get,set,end}mntent interface; as it turns out, those functions do
	  not appear to be re-entrant, and that causes a lot of problems with
	  the way umount was originally written.
	* Makes init send TERM and KILL (instead of HUP and KILL) on reboot
	  to be more consistent with sysvinit
	* Changes to init.c to use the new -r option to umount. Also increased
	  the sleep time between the time the TERM and KILL signals are sent

        - Randolph Chung


	* cp.c, mv.c: removed, replaced by cp_mv.c which has been
	    extensively rewritten from the original cp.c.
	* Fixed cp and mv so if the source and destination are a the
	    same directory it will print an error and continue.
	* Also added a warning message to the `mv' usage string saying that
	    this is not GNU mv, and it will break hard links. cp also breaks
	    hard links.
	* ln.c: implemented `-n' switch, no-deref symlinks.
	* include<sys/param.h>: and use PATH_MAX everywhere.  busybox: File
	* name buffer overrun guards to prevent future crashes.
	    - Always check exit status.
	    - Purge all use of `creat()', replace with `open()'.
	* utility.c 
	    - recursiveAction was overriding the value of followLinks thus
	      ignoring it.
	    - isDirectory now takes a followLinks boolean, updated all callers
	    - copyFile had the followLinks logic reversed.
	* messages.c: New file. Put common error message strings all in
	    one place in an attempt to shrink the binary a little.

	-Karl M. Hegbloom


	* changed fsck_minix.c to reduce its .bss size significantly
	  -beppu -piptigger
	* Made tar creation support in busybox tar optional.  You no longer
	* _have_ to put a "-" in front of tar options.  Tar could inadvertently
	* change permissions and ownership on
	    certain directories pointed to by symlinks.
	* Made grep and grep -h do the right thing wrt printing
	    the file name (it failed to print files names in many cases).
	* Fix a namespace aliasing problem wereby if du was built in, the 
	    symlink for both du and dutmp would be installed, or then rm was
	    built in, the symlinks for both rm and rmmod would be installed.
	* Added a closelog() to init.c after loging -- fix thanks to 
	    Taketoshi Sano <kgh12351@nifty.ne.jp>
	* Rewrote and simplified logger.  Added the "-t" option, and made it
	    behave itself a bit better.
	* Optional support contributed by Ben Collins <bcollins@debian.org> 
	    for the kernel init chroot patch by Werner Almesberger, which
	    allows init to chroot to a new device, and umount the old one.
	* Fixed bug that wouldn't let one chown a symlink -- it would
	    always dereference before.  -beppu
	* Fixed a bug where init could have reference already freed memory.
	    Found and fixed by Taketoshi Sano <kgh12351@nifty.ne.jp>
	* Several contributions from Friedrich Vedder <fwv@myrtle.lahn.de>
	* Added (and documented) "-n" option for head
	* Cleanup for a number of usage messages -- also 
	    contributed Friedrich Vedder <fwv@myrtle.lahn.de>
	* Cosmetic fix to busybox.c (Don't print a comma at the
	    end of line if there are no more application names).
	* Fixed a stupid bug in "head" option handling ("head -n" 
	    would segfault).
	* Moved commonly used functions "xmalloc()" and "exit()"
	    to utility.c (with proper #ifdef's).
	* Created a tiny tail implementation, removing -c, -q, -v, and making
	    tail -f work only with a single file.  This reduced tail from 6k to
	    2.4k.  The bigger/more featured tail can still be had by disabling
	    BB_FEATURE_SIMPLE_TAIL in busybox.defs.h
	* Ping now falls back to doing the right thing if /etc/protocols
	    turns up missing.
	* Fixed mount and umount.  Previously they could leak loop device 
	    allocations, causing the system to quickly run out.  Fix for umount
	    by Ben Collins <bcollins@debian.org>, and mount was fixed by me.
	* ls formatting on eight charactor user names fixed by 
	    Randolph Chung <tausq@debian.org>.
	* cp could, when copying symlinks, change permissions of the
	    files pointed to by the symlinks.
	* Several fixes from Pavel Roskin <proski@gnu.org>:
	    - `chown' with 1 argument displayed the error incorrectly
	    - `fdflush', `length' and `printf' crashed if run without arguments
	    - `fdflush' tried to flush itself using *argv
	    - added "skip" and "seek" to dd.
	    - ls no longer messus up output when combining files and
	      directories on the command line 
	* swapoff -a was not working.  Now it is.  
	* init did not cleanly unmount filesystems on reboot.  Now it does.  
	* "sed -ne s/foo/bar/" worked but "sed -n -e s/foo/bar/" didn't.
	    Now both work.
	* Some architectures (PowerPc) assume chars are unsigned, so they could
	    not distinguish between EOF and '\0xFF' in sed.  Sed now uses ints.
	* Began converting error handling to use some common routines
	    in utility.c
	* syslogd now has better message handling and ignores SIGHUP.
	* install.sh had a bug preventing installation to the specified
	    target directory.  Fix from Gilbert Coville <gilbert@mvista.com>
	* You can now spefify alternative strip commands -- change 
	    also from Gilbert Coville.


	-Erik Andersen

0.41
	* New Apps: wc, hostid, logname, tty, whoami, yes -- all contributed 
	    by Edward Betts <edward@debian.org>
	* Fixed a bug in both cp and mv preventing 'cp foo/README bar'
	    type commands (file in a directory to another directory) from
	    working.
	* Fixed a logger bug that caused garbage to be written to the syslog 
	    (unless you used busybox syslog, which hid the bug).  Thanks to
	    Alex Holden <alex@linuxhacker.org> for the fix.
	* /bin/true and /bin/false were echoing a blank line when run.  
	    Now fixed.
	* mkdir -p would print an error when asked to mkdir an existing dir
	    with no interveining subdirectories.
	* Fixed "syslogd -O" so that it works.  Added -o loop option for mount,
	* and support in umount for loop
	  devices. Support is toggled by MOUNT_LOOP feature -- Ben Collins
	  <bcollins@debian.org>
	* Several fixes from Marco Pantaleoni <panta@prosa.it> compile in
	* fullWrite() not only if BB_TAR is defined, but also
		if BB_CP or BB_MV are (fullWrite() is referenced by copyFile())
	    * add some compiler optimizations to further reduce executable size
		(as a side note, on my machines the largest code is generated
		by gcc 2.95.2 with -Os ! The smallest by plain gcc 2.7.2.3 with
		-O2 -m386 ...)
	    * Compile now won't fail if busybox.def.h defines 
		BB_FEATURE_LINUXRC but not BB_INIT.  (init_main used to be
		referenced, but not compiled)
	* Fixed a bug in setting TERM for serial console support.  TERM now
	    defaults to "ansi" for serial consoles.
	* Fixed a bug in handling the CONSOLE env. variable for serial
	* consoles.

	-Erik Andersen, Jan 15, 2000

0.40
	* 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 an embarrasing segfault in head	-beppu Fixed the embarrasing
	* failure of 'logger -p'. -erik Added the -s option to du -beppu
	* 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, Jan 07, 2000

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.
	
