OSDN Git Service

Roadmap update, mostly from enh with a few other pending bits mixed in.
[android-x86/external-toybox.git] / www / news.html
index 0978881..084d753 100755 (executable)
@@ -1,3 +1,4 @@
+<html><head><title>toybox news</title>
 <!--#include file="header.html" -->
 
 <p>Toybox combines common Linux command line utilities together
@@ -6,6 +7,641 @@ reasonably standards-compliant, and powerful enough to turn Android into
 a development environment. See the links on the left for details.</p>
 
 <h2>News</h2>
+
+<hr><b>April 5, 2015</b>
+<p>Since <a href=https://android.googlesource.com/platform/external/toybox/>android</a> and
+<a href=https://git.tizen.org/cgit/platform/upstream/toybox.git>tizen</a>
+and <a href=https://github.com/kraj/meta-musl/tree/master/recipes-core/toybox>openembedded</a>
+and <a href=https://packages.gentoo.org/package/sys-apps/toybox>gentoo</a>
+and so on have all been using Georgi Chorbadzhiyski's git mirror rather
+than the mercurial repository, I bit the bullet and switched the project's repo
+<a href=https://github.com/landley/toybox>to git</a>. Georgi's
+<a href=https://github.com/gfto/toybox>mirror</a> is now pulling from that.</p>
+
+<hr><b>February 25, 2015</b>
+<blockquote><p>"A common mistake that people make when trying to design
+something completely foolproof is to underestimate the ingenuity of
+complete fools."</p><p>- The Hitchhiker's Guide to the Galaxy.</p></blockquote>
+
+<p><a href=downloads/toybox-0.5.2.tar.gz>Toybox 0.5.2</a>
+(<a href=/hg/toybox/shortlog/1702>commit 1702</a>) is out.</p>
+
+<p>New promoted commands: sed (finally fixed enough it builds Linux From
+Scratch), printf (cleaned up and promoted), shred and
+base64 (the Tizen guys wanted them), getenforce, setenforce, and chcon (android),
+mix (promoted with fixes from Isaac Dunham), nsenter (from
+Andy Lutomirski, merged into unshare).</p>
+
+<p>Elliott Hughes submited a bunch of patches to support Android (to
+both toybox and Bionic libc, which he maintains). On toybox's end this
+involved a lot of fixups to portability.[ch] and fixes to over a dozen
+commands, plus several new ones. Other portability fixes included working
+with buildroot's uclibc fork and building for nommu targets.</p>
+
+<p>The new "make change" target builds each toybox command as a standalone
+binary. Rather a lot of commands that didn't build by themselves (mv depending
+on cp and so on) were hit with a large rock until they built standalone.
+This involved rewriting bits of option parsing, more elaborate dependency
+generation, making each command have its own config
+symbol and main() function (even when it's just a wrapper calling another
+command's main()), and so on. Also, some commands can't be built standalone
+at a conceptual level: "help" describes other enabled commands and "sh"
+has a number of bulitin commands (cd, exit, set) that require the
+multiplexer infrastructure, so "make change" filters them out.</p>
+
+<p>The mailing list's web archive is still screwed up. Dreamhost has
+been trying to fix it since approximately September. There are
+<a href=http://www.mail-archive.com/toybox@lists.landley.net/>two</a>
+<a href=http://news.gmane.org/gmane.linux.toybox>other</a> less broken
+archives, but neither has quite the same UI as mailman.</p>
+
+<h3>Bugfixes and tweaks</h3>
+
+<p>Cynt Rynt sent in tests for ifconfig,
+Robert Thompson taught factor to accept whitespace separated arguments,
+Hyejin Kim pointed out that some of mktemp's longopts were attached to
+the wrong short options,
+Luis Felipe Strano Moraes fixed a wrong free() call in bootchartd in pending.
+Patches from Ashwini Sharma to make "df /dev/node" work, prevent du from
+looping endlessly following symlinks, and to make expr.c
+(in pending) understand == and regex matches. (Speaking of expr, it gets
+priority groupings wrong but the bug was actually in the posix spec's
+HTML conversion. They fixed the posix spec upstream for us. Still need
+to fix the expr code, but it's in pending for a reason...)</p>
+
+<p>Some commands grew new option flags, such as cp --remove-destination
+and touch -h.</p>
+
+<p>The parallel build has better error reporting now. When toybox needs to
+re-exec itself to regain suid root permissions and hasn't got the suid bit,
+it now gives the right error message ("not root" instead of "no such command").
+
+<p>Added a test to "mount" to not mount the same device/directory combination
+over itself (the OS catches this for block devices, but not for tmpfs).
+Make blkid distinguish ext3 from ext4. Added catv back into cat (because
+the Android guys wanted it, and they have historical usage on their side,
+so...). Handle nanoseconds in touch.</p>
+
+<p>Fixed a segfault when CP_MORE was disabled (the resulting option flag list
+no longer defined -d but still had it in option groups at the end).
+Workaround for glibc redefining dirname() and basename() to random non-posix
+semantics because gnu. (They could have created dirname_r() but didn't want
+to.)</p>
+
+<p>Fix an ifconfig test that was preventing assigning an ipv4 address to
+interface aliases. Several cleanup passes on hwclock but not quite
+promoted out of pending yet.<p>
+
+<p>Fixed a wrong error message in rm (if you had a chmod 000 directory and
+did rm -r on it without -f, after the prompt it would complain it was a
+directory, which was not the problem).</p>
+
+<p>The gzip compression code now does "store only" output to stdout, for
+what that's worth.</p>
+
+<p>Cleanup mountpoint and expand, and remove them from toys/pending/README
+(a list of commands that predate the toys/pending directory but needed
+another pass).</p>
+
+<h3>Library and infrastructure:</h3>
+
+<p>Reworked the option parsing infrastructure so more commands build
+standalone (via scripts/single.sh or "make change"). The option flag bit
+values are no longer packed, it leaves spaces where currently disabled
+flags go, and you can #define FORCE_FLAGS so disabled flags aren't zeroed.
+This allows multiple commands to more easily share infrastructure, even if
+your current flag context is for a disabled command (switched off in config),
+you can force them to stay on and as long as the flags read the same right
+to left they'll have the same values.</p>
+
+<p>We've started removing use of strncpy() because it's a hugely broken
+standard C function: the length is the maximum length to _append_, not
+the size of the destination buffer. It memsets the remaining space it didn't
+copy ala "memset(dest+strlen(dest), 0, len);" so
+if you think len is the size of dest you're guaranteed to stomp memory off the
+end). And if it runs out of space it won't null terminate because reasons.
+(Meanwhile sprintf("%*s", len, str) is counting wide characters in your current
+locale, so if you set a locale other than "C" it will also go past your
+allocated buffer size. Whoever is maintining the C library standards is really
+bad at strings.)
+Instead we have xstrncat() which will error_exit() if src+dest+1 doesn't
+fit in the buffer. (Because randomly truncating input data isn't necessarily
+an improvement.) And there's always xmprintf().</p>
+
+<p>Similarly, strtol() doesn't return an error indicator on overflow,
+you have to clear and then check errno. So new xstrtol() that cares
+about overflow.</p>
+
+<p>The bionic and musl guys agree faccessat(AT_SYMLINK_NOFOLLOW) is not
+supported, so stop using it.</p>
+
+<p>Fixed toy_exec() to detect when argc is in optargs, so we don't
+need a separate xexec_optargs().</p>
+
+<hr><b>February 18, 2015</b>
+<p>Dreamhost continues to be unable to make mailing list archives work, so
+here's <a href=http://www.mail-archive.com/toybox@lists.landley.net/>another
+list archive</a> with a less awkward interface than gmane.</p>
+
+<p>(Neither gives you the convenient historical monthly views of mailman,
+but I still have hopes dreamhost will someday figure out what they're doing
+wrong. They've only been trying since October. Last month they did a
+<a href=http://www.dreamhoststatus.com/2015/01/14/discussion-list-hardware-maintenance/>hardware upgrade to fix a software problem</a>, and the stale
+data loads much faster now, so that's something.)</p>
+
+<p>Update (Feb 19): the archive started updating again, by discarding
+all the pending data. So there are now _two_ giant holes in Dreamhost's
+web archive, from Dec 15-Jan 3, and then another hole from Jan 16-Feb 18.
+The relevant messages are in both of the other archives. Here's hoping
+the chronic archive constipation problem won't happen a sixth time.</p>
+
+<hr><b>December 30, 2014</b>
+<p>Due to Dreamhost's <a href=http://landley.net/dreamhost.txt>ongoing</a>
+<a href=http://landley.net/dreamhost2.txt>inability</a> to make mailman
+work reliably, I've added a link to a backup web archive at
+<a href=http://news.gmane.org/gmane.linux.toybox>gmane</a> to the nav bar
+on the left.</p>
+
+<p>You still subscribe to the list through
+<a href=http://lists.landley.net/listinfo.cgi/toybox-landley.net>the first link</a>.</p>
+
+<p>Update (January 27, 2015): they're <a href=https://twitter.com/landley/status/558428839462703104>still working on it</a>.</p>
+
+<hr><b>November 19, 2014</b>
+
+<blockquote><p>"This time it was right, it would work, and no one would have to get nailed to anything." - The Hitchhiker's Guide to the Galaxy.</p></blockquote>
+
+<p><a href=downloads/toybox-0.5.1.tar.bz2>Toybox 0.5.1</a>
+(<a href=/hg/toybox/shortlog/1566>commit 1566</a>) is out.</p>
+
+<p>It's an interim release, mostly bugfixes. There are several new commands,
+but they're all in pending.</p>
+
+<h3>Development</h3>
+
+<p>Finally implemented sed, which is still in pending because although
+it's feature complete according to posix, and even passes the parts of
+Busybox's sed test suite that aren't explicitly testing for gnu bugs we
+don't want to copy, it's not yet good enough to build Linux From Scratch.
+(The ./configure stages use very long sed scripts. 20 commits worth of
+implementation and debugging, just under 1000 lines of code, and there's
+still more to do. We're definitely up to some of the "fiddly" commands now.
+Did you know "echo hello | sed p - -" segfaults gnu sed in Ubuntu 12.04?
+Yeah...)</p>
+
+<p>Talked with the Tizen developers to follow up on their desire to
+make toybox a part of the base Tizen system, and got a list of commands
+to add to the roadmap. The tizen todo list is:</p>
+
+<blockquote><p>
+wget, sha256*, gzip, gunzip, bunzip2, rsync, zdiff*,
+less, ar, arch, base64, csplit, dir, fmt, join, 
+nproc, shred, shuf, stdbuf, stty, test, tr, unexpand,
+users, vdir, diff3, sdiff, dosfsck (fsck.vfat), awk, fdisk
+</p></blockquote>
+
+<p>(Most of which was already on the todo list, but it helps prioritize.)</p>
+
+<p>Fixed md5sum and sha1sum on big endian systems (reported by James McMechan).
+Andy Lutomirski fixed unshare's help text and option parsing,
+and submitted nsenter (a tool to use setns(2)) to pending.
+Isaac Dunham implemented acpi -ctV options, and spotted the bug that ls -d
+was inappropraitely following command line symlinks without -H or -L (it
+should act like ls -l does), and ls -F handles symlinks wrong too.
+Lukasz Szpakowski sent in two bugfixes to tail.c. Cynt Rynt spotted an
+unnecessary assignment in lib/password.c.</p>
+
+<p>Ashwini Sharma's team was as busy as usual, submitting tr, crontab, and
+ipcrm, and hwclock to pending, more features to the pending ip.c, and a
+pile of bugfixes (to chgrp, killall, ifconfig, insmod,
+losetup, comm, cp, id, xwrap, netcat, modprobe, nohup...) mostly found by
+static analysis. (These fixes are mostly to seldom-used codepaths like the
+TOYBOX_FREE config option, but test coverage is always appreciated.) Ashwini
+also suggested upgrading ln -f to leave the original target alone if link
+creation fails, and reported that mv -f and -i weren't implemented (now fixed).</p>
+
+<p>New config option: TOYBOX_NORECURSE prevents xexec() from making internal
+function calls (for nommu systems with a finite stack).</p>
+
+<p>The "toybox" multiplexer command no longer adds a trailing space to each
+line of command names, so things like "./toybox | tr ' \n' '|'" to create
+a grep pattern snippet are easier to do. (Why you'd want to is your business,
+but the output is tidier now.)</p>
+
+<h3>Infrastructure</h3>
+
+<p>Isaac Dunham added Android support to portability.h, including compile
+probes for functions missing from bionic-libc, and annotated the commands that
+use those functions. We haven't really tested building against bionic,
+but in theory it's possible now.</p>
+
+<p>Running the test suite now color codes the PASS/SKIP/FAIL notifications
+if output is to a tty. (And in case you missed it last time, VERBOSE=fail
+to stop at the first failure is really useful.)</p>
+
+<p>In loopfiles_rw() use O_CLOEXEC instead of O_RDONLY to request the loop
+function close filehandles for us. (Otherwise the callback function must
+close each supplied filehandle itself.)</p>
+
+<p>The printf-style escape parsing ("\n" and friends) got factored out into
+a new unescape() function.</p>
+
+<hr><b>October 2, 2014</b>
+<blockquote><p>"There is an art, it says, or rather, a knack to flying.
+The knack lies in learning how to throw yourself at the ground and miss...
+Clearly, it is this second part, the missing, which presents the
+difficulties." - The Hitchhiker's Guide to the Galaxy.<p></blockquote>
+
+<p><a href=downloads/toybox-0.5.0.tar.bz2>Toybox 0.5.0</a>
+(<a href=/hg/toybox/shortlog/1512>commit 1512</a>) is out.</p>
+
+<h3>New commands</h3>
+
+<p>The new commands are find, install, factor, and mount. Promoted commands
+(cleaned up and moved out of "pending") are lspci, inotifyd, and blockdev.</p>
+
+<p>cp now implements -HL and -F to force delete of pending files, cpio now
+ignores -m and implements -p, ls -C now has utf8 support (using wcwidth
+instead of strlen), and umount got a number of upgrades involving
+looking things up in /proc/mounts. Other minor cleanups happend to
+cut, touch, free, and id.</p>
+
+<p>In pending: Bradley Controy submitted mix (adjusts OSS sound volume). Ashwini
+Sharma submitted diff, userdel, blockdev, ipcs, and crond, upgraded
+fdisk, fsck, and ftpget, and ran a static analyzer on a lot of other code.
+Partial cleanup was done to useradd, userdel, groupadd, and groupdel.</p>
+
+<h3>Build infrastructure</h3>
+
+<p><b>Parallel builds</b></p>
+
+<p>The build now takes advantage of SMP, autodetecting the number of
+processors. (Export the environment variable CPUS to pick a specific number.)
+Other build changes: split out $LDOPTIMIZE because old compilers complain
+about linker options passed with -c, and the entire "generated" directory now
+gets deleted by clean (the README that was in there got merged into code.html).</p>
+
+<p><b>Standalone builds</b></p>
+
+<p>The standalone build infrastructure (scripts/single.sh) got upgraded to
+build more commands as standalone executables. In make.sh the source file
+selection uses a regex to find the source files with the NEWTOY/OLDTOY macro
+for the command. It enables each command's
+sub-options (so CP has CP_MORE), enables I18N and FLOAT support to build
+full-featured commands, and includes --help text (at least when
+the command doesn't use another command's help). The OLDTOY() macro
+now produces (redundant) function prototypes so you can build an OLDTOY
+without the NEWTOY</p>
+
+<p>It doesn't quite have complete coverage yet, the defconfig entries that
+aren't building standalone yet are:</p>
+
+<blockquote><p>chown, egrep, fgrep, fstype, halt, mv, nc, poweroff, unix2dos,
+whoami</p></blockquote>
+
+<p>The main reason for standalone build failures is NEWTOY() or OLDTOY()
+entries that don't have their own config symbol. Another problem is entries
+that depend on another entry in kconfig, usually because common infrastructure
+is using one command's flags (which the other commands copy): if that command
+is disabled, the FLAG macros become 0 so dead code elimination can remove the
+code. It's <a href=http://landley.net/hg/toybox/rev/1503>possible
+to untangle</a> this, but a bit awkward. (It boils down to conflicting
+design goals in the two contexts.)</p>
+
+<p>Standalone builds are used by the test suite when testing individual
+commands.
+
+<p><b>Snapshot builds</b></p>
+
+<p>A new addition to the "generated" directory is generated/build.sh
+containing a single compiler command line to build toybox in its current
+configuration. Combined with the generated/*.{h,sh} files from an
+exisiting build, this may let you build on a new system that hasn't quite
+got enough OS bits working to run a full configureand make.</p>
+
+<h3>Internals</h3>
+
+<p>Library code: xcreate/xopen now O_CLOEXEC by default to avoid leaking
+filehandles to child processes. DIRTREE_COMEAGAIN's second callback is now
+done with the directory filehandle still open (new dir->again variable added
+to distinguish first from second callback, and requesting DIRTREE_RECURSE now
+requires passing in the specific macro value, not just a true/false).
+Use daemon() out of libc instead of hand-rolled daemonize() in various
+pending commands. string_to_mode() now passes through type bits so you can
+use it to more easily modify a file's existing mode.
+Split xpopen() into xpopen_both(), xopen(), and xrun() depending on whether
+we want to redirect both, one, or neither of stdin/stdout.</p>
+
+<p>Bugfixes: Better error message when TOYBOX_SUID option can't drop priviliges
+(which happens when you suid something _other_ than root).
+The old pending version of nbd_client.c wasn't deleted when the
+command was promoted (and the build would break if both were enabled),
+toy_exec() sometimes needs to re-exec from $PATH rather than recurse
+internally (to gain dropped root permissions or limit stack depth),
+always call setlocale() when I18N is enabled to switch it back _off_ when
+we run commands that expect sscanf("%n") to return bytes,
+dirtree() had a memory leak in an error path, patch.c had some bugs in
+error paths (didn't report problem clearly). Ashwini Sharma spotted an
+option parsing bug where [-abc] would forget _all_ command line arguments
+saved in the GLOBALS() block (not just the ones for options being switched
+off), plus various minor fixes to nbd_client and cpio.
+Lukasz Szpakowski fixed rm -f on a broken symlink (failed), and killall
+with no arguments (segfaulted).</p>
+
+<p><b>Portability</b></p>
+
+<p>A somewhat fiddly fix to rm -rf (which needs to chmod directories to u+rwx
+to descend into them) which hit a musl bug in faccessat() which the musl
+maintainer refuses to fix. (He literally wants the man page changed
+instead, despite other libcs working.) Added an #ifdef __MUSL__ section
+to portability.h with a workaround, you may need CFLAGS=-D__MUSL__ in your
+build if your musl build's features.h doesn't #define that. (I may do
+a different workaround in future, but sometimes you've just got to make
+it work so you can ship. Also, toybox grep with multiple patterns
+requires <a href=http://landley.net/hg/aboriginal/rev/1692>a patch
+to musl's regex engine</a>, which applies to 1.1.4 but not to the current
+musl source control.)</p>
+
+<p>More portability.h fixes for uClibc too. (I don't expect that to ever have
+another release, so locally patching around posix-2008 violations is silly).</p>
+
+<p><b>Change to username filtering</b></p>
+
+<p>Posix recommends the username creation logic filter usernames to a small
+allowed set of characters (which even Red Hat breaks by explicitly allowing
+"$" at the end), but this prevents UTF-8 usernames. Posix' stated logic
+is to allow filesystems to create the user's home directory, but Linux
+filesystems can accept any character but NUL and "/". The only characters
+we actually _need_ to filter out are ":" (field separator in passwd),
+newline (line separator in passwd), and "/" (directory separator in
+filesystem).</p>
+
+<h3>Documentation</h3>
+
+<p>Web pages updated: cleanup.html documents more cleanup, code.html
+documents more code, and about.html now capitalizes "toybox" consistently
+(it's just a word, capitalize at start of sentence).</p>
+
+<p>The pending/README file now lists commands that needed review/cleanup
+before the pending directory was added.</p>
+
+<h3>Test Suite</h3>
+
+<p>Moved out of scripts/test into top level "tests" directory, and the
+testing.sh script is now in scripts rather than mixed into the *.test files.</p>
+
+<p>Johan Bergström requested VERBOSE=fail to make tests (telling it to
+stop at the first failure), and spotted a build bug where using gnu
+sort on the host broke in non-C locales.</p>
+
+<p>Divya Kothari submitted tests for chmod, link, tar, bzcat, xzcat, zcat,
+and hostname. (And more, but that's all that's merged so far.)</p>
+
+<hr><b>July 7, 2014</b>
+<blockquote><p>"This planet has - or rather had - a problem, which was this:
+most of the people living on it were unhappy for pretty much of the time. Many
+solutions were suggested for this problem, but most of these were largely
+concerned with the movement of small green pieces of paper, which was odd
+because on the whole it wasn't the small green pieces of paper that were
+unhappy." - The Hitchhiker's Guide to the Galaxy.</p></blockquote>
+
+<p><a href=downloads/toybox-0.4.9.tar.bz2>Toybox 0.4.9</a> (<a href=/hg/toybox/shortlog/1385>commit 1385</a>) is out.</p>
+
+<p><b>New commands</b> added to pending include:
+lsattr, chattr, inotifyd, rfkill, sulogin, strings, makedevs,
+killall5, and tar from Ashwini Sharma, arp from Kyungwan Han,
+sysctl by Bilal Qureshi, partprobe from Bertold Van den Bergh,
+host from Rich felker, and I did nbd-client and the first 2/3 of mount.</p>
+
+<p>Finished cleanups (commands promoted out of pending):
+sysctl, rfkill, strings, mkpasswd, makedevs, partprobe, killall5,
+fallocate, and nbd-client.</p>
+
+<p>(Along the way partial cleanups got made to: last, fold, lspci, ps,
+bootchartd, init, fsck, telnetd, telnet, vconfig, toysh, iconv, useradd,
+login, host, openvt, deallocvt, getty, tftpd, and modprobe. But there's
+still more to do on all of those.)</p>
+
+<p>This time around the <a href=bin>static binaries</a> are linked against
+musl instead of uClibc. (That's why there's no sparc version, musl doesn't
+support that target yet.)</p>
+
+<p><b>Documentation:</b></p>
+
+<p>The help text parser expects lower case "usage:" lines with
+a blank line after them, so go through and regularize those. Expand the
+"coding style" section in the docs and move it to design.html. (Not a show
+stopper for incoming
+contributions, just an explanation of some of the things I'll do to them
+during cleanup.) The help text for the "toybox" command now includes
+the shell script snippet to install symlinks to the toybox binary.</p>
+
+<p>The <a href=cleanup.html>cleanup page</a> now has descriptions for the
+full ifconfig cleanup series, among others.</p>
+
+<p>The new toys/examples directory contains hello.c and skeleton.c. The first is
+a simple hello world program in toybox style, the second is a much more
+elaborate example program using showing how to use the command line option
+parsing and how to provide multiple commands in the same C file.</p>
+
+<p><b>Fixes</b>:</p>
+
+<p>Fix od bug reported by Samuel Holland ("od -v -b" was appending the default
+output type even though an output type was specified). Ashwini Sharma reported
+bugs where readfile() was incorrectly freeing its buffer, and where toy_init()
+was zeroing the wrong data because the field it was using to measure (rebound)
+had moved (when I moved it back I added a comment why the field needs to be
+there), fixed a segfault in the dhcp client, and made a 0 length read at
+the start of password entry count as EOF. Make the "we are not root" test
+in the init code show the help text. Posix implies that fflush() can return
+success even when the stream's error bit is set, so call both fflush() and
+ferror() from xprintf().</p>
+
+<p>Isaac Dunham pointed out that bloatcheck couldn't deal with diff
+implementations that only implement "unified diff" format, and that some
+diff implementations can't handle nonseekable input (I.E. reading from
+a pipe). Bugfix so "help -a" works again. Option parsing on nohup now stops
+at first nonoption argument. Fix segfault in "which" if PATH wasn't set,
+which was actually a bug in lib function find_in_path(). Made rm -rf of
+chmod 000 directories actually remove them.</p>
+
+<p>The build now passes the same $CFLAGS to the library probe as the final
+build, because arch linux is so broken it provides different sets of
+libraries for static and dynamic linking.</p>
+
+<p>It turns out sprintf("%.123s", str) is counting characters, not bytes,
+so globally enabling locale support opens stack smashing vulnerabilities.
+So there's a new TOYFLAGS_LOCALE you set in toyflags when you want the
+setup code to setlocale().</p>
+
+<p><b>Upgrades:</b></p>
+
+<p>Isaac Dunham extended cpio to archive unreadable empty files, and I taught it
+to set uid/gid and timestamp when extracting archives. Isaac also
+added tests for cpio, link, and du, added lspci -i, made the pci database
+parsing skip # comment lines, merged logname and whoami into id.</p>
+
+<p>Daniel Verkamp sped up md5sum about 30% with some loop unrolling, making
+it actually smaller in the process. I added -b flags to md5sum and sha1sum
+for "brief" output that's just the hash with no filename. (I'm aware other
+implementations use that for MSDOS "binary" mode, and don't care.)</p>
+
+<p>When building standalone commands (scripts/singleconfig.sh commandname),
+the build now switches on all the sub-options of the command so we get
+a standalone version with all the bells and whistles enabled.</p>
+
+<p>Add -ds flags to date and document +FORMAT escapes. Add the shell NOP
+command ":" as an alias for true (for toysh).</p>
+
+<p>Add uClibc probe for iconv() and fallocate. (The fact it didn't always
+build against uClibc is why fallocate wasn't enabled in defconfig before.)</p>
+
+<p>The umount command now does an losetup -d on the device by default, so
+we don't leak loopback devices. Bugfix to losetup so "losetup /dev/loop0
+filename" actually works again.</p>
+
+<p>Divya Kothari sent in test suite entries for ls, ln, rm, mv, printf, dd,
+and renice. Then a second round for lsattr/chattr, mount, chmod, pgrep/pkill,
+groupadd, groupdel, and useradd. Several of these uncovered bugs, still
+working to fix them.</p>
+
+<p>There are now free() functions for the predefined llist types and a
+dlist_terminate() function to break doubly linked lists. The new
+generic_signal() handler either sets "toys.signal" or writes a byte
+to toys.signalfd with the signal number if signalfd isn't -1 (which it's
+initialized to in toy_init).</p>
+
+<p>The option parsing logic can now detect when a double fits in a long and
+use the more precise type for floating point arguments (the FLOAT macro
+contains the type used). The human_readable() function now just outputs
+decimal kilo/mega/gigabytes (so when du -u says 5.0G it means 5.0 billion
+bytes). The build infrastructure now notices duplicate commands (so if you
+cp toys/pending/command.c toys/other/command.c and forget to delete the
+first one, the build break is now more informative).</p>
+
+<hr><b>April 20, 2014</b>
+<blockquote><p>And to this end they built themselves a stupendous supercomputer
+which was so amazingly intelligent that even before the data banks
+had been connected up it had started from "I think therefore I am" and got as
+far as the existence of rice pudding and income tax before anyone managed to
+turn it off. - The Hitchhiker's Guide to the Galaxy.</p></blockquote>
+
+<p><a href=downloads/toybox-0.4.8.tar.bz2>Toybox 0.4.8</a> is based on
+<a href=http://landley.net/hg/toybox/shortlog/1262>commit 1262</a>. And
+about time too.</p>
+
+<p>The big news is that the build no longer needs python to generate help.h,
+that's now done in C. The help text generation is also collating help text
+from multiple options, merging command line option blocks and usage: lines.
+There's even a new <a href=help.html>help web page</a>.</p>
+
+<p><b>New commands:</b> Ifconfig, cpio, and su were cleaned up the rest of the
+way and promoted out of pending. That saga is mostly explained on the
+<a href=cleanup.html>cleanup page</a>. Vivek Bhagat's freeramdisk,
+Isaac Dunham's fsfreeze, and Felix Janda's iconv are also new.</p>
+
+<p><b>In pending:</b>
+Ashwini Sharma's team submitted tcpsvd, udpsvd, telnet, telnetd, last, more,
+groupdel/delgroup, arping, brctl, ftpget, ftpput, printf, reset, and added
+ipv6 support to traceroute. Kyungwan Han's team submitted modprobe and getty.
+Vivek Bhagat submitted openvt and deacllocvt. Samuel Holland submitted fold.
+I wrote a new inflate (zip/zlib/gzip decompression) implementation in
+compress.c, and still  need to do a corresponding deflate (compression-side)
+and plug them into gzip and zip and so on. (Right now it does zcat.)</p>
+
+<p>Several commands (vmstat, login, du, vconfig, mountpoint, free, chroot,
+cut, touch, modinfo, expand) predate the "pending" directory, and are thus
+in other directories but still need cleanup. Of these, vmstat got some
+work this time (which would be much easier other vmstat implementations
+documented what their output actually meant).</p>
+
+<p><b>Upgrades:</b> Ifconfig grew /prefix netmask support (ala 1.2.3.4/24). Grep now has -zZ to
+handle null terminated data, cksum grew -H for hex output. Upgraded od so the
+fields align better when producing multiple output types. Help has -a and -h
+options (all commands, html output).
+Bugfix to blkid building for a 32 bit target. The date command can actually
+set dates now. The O_NOFOLLOW compile time probe didn't work with cross
+compiling, so it's back to an #ifdef test in portability.h. Nathan McSween
+sent in a bugfix to od and a portability fix in the common library code.
+Ashwini Sharma spotted a bug in pidof -o, and added verbose (-v) options
+to mkdir and ln, and suggested killall should have an -s option and
+allow -l to take zero arguments. Ashwini Sharma and Felix Janda upgraded
+tftpd.  Fixed dumpleases still using toynet.h after
+that was removed. Corrected killall return code and error reporting.
+Isacc Dunham fixed bugs all over the tree, did cleanup on a bunch of
+pending commands (getty, ftpget, init, openvt, modprobe...), and clarified
+find's help text. Tom Sparrow ran three different static analyzers on
+the code, which resulted in a few cleanups. The peek()/poke() functions
+now use "volatile" to prevent broken compiler "optimizations" to do with
+aliasing.</p>
+
+<p><b>Build stuff:</b> Each FOR_xxxx macro now has a complementary CLEANUP_xxxx macro, so you
+can put multiple commands with different command line options in the same
+.c file, so they can share infrastructure outside of lib. (This let the
+bunzip logic move out of lib into bzcat.c.) See XXX for example.
+i
+<p>The headers #included in toys.h are now grouped by standard, and headers
+not listed in Posix or LSB were moved to portability.h. The old xregcomp.h
+was folded into lib.h because it's posix (and supporting oddball uClibc
+configurations isn't as important as it once was).</p>
+
+<p>Regression tested against Ubuntu 8.04 to fix up bit-rot in defconfig
+build on older systems. (We depend on Posix-2008, but not necessarily
+the absolute latest build environment.)</p>
+
+<p><b>In lib</b>: lib/xwrap.c added xgetpwnam(), xchroot(), and lib/lib.c now has names_to_pid().
+xsetuid() was replaced with xsetuser() which takes a struct passwd
+and sets both gid and uid, mkpathat() got factored out into a library command,
+get_int_value() became atolx_range(), and
+xmsprintf() is now just xmprintf(). The bunzip2 logic moved from lib into
+bzcat.c.</p>
+
+<p><b>Documentation</b>: new <a href=help.html>help page</a> with the
+help text for all the defconfig commands, using the new help -ah output.
+The <a href=code.html>source code walkthrough</a> now says more about
+#including header files, and how the generated/* directory works. The
+<a href=design.html>design page</a> has some new paragraphs about trading
+of different kinds of simplicity, and why comments aren't a substitute for
+good code. The README no longer trails off into obvious unfinished confusion
+at the end. Each page on the website should now have its own title.</p>
+
+<hr><b>November 18, 2013</b>
+<blockquote><p>"Space," it says, "is big. Really big. You just won't believe how vastly, hugely, mindbogglingly big it is. I mean, you may think it's a long way down the street to the chemist's, but that's just peanuts to space." -
+The Hitchhiker's Guide to the Galaxy.</p></blockquote>
+
+<p><a href=downloads/toybox-0.4.7.tar.bz2>Toybox 0.4.7</a> is based on
+<a href=http://landley.net/hg/toybox/shortlog/1122>commit 1122</a>.</p>
+
+<p>New commands: Brad Conroy submitted blkid. Elie De Brauwer submitted
+reboot, halt, and poweroff. Strake's nl got cleaned up and promoted from
+pending to posix. In addition, the existing chvt and vconfig got some
+cleanup.</p>
+
+<p>That said, I haven't nearly kept up with the flood of new commands going
+into pending: Ashwini Sharma's team submitted
+dd, dumpleases, traceroute, top, useradd, groupadd, mkpasswd, tftpd, and
+an fsck wrapper (with no filesystem drivers yet). Isaac Dunham sent in cpio.</p>
+
+<p>Bugfixes: Jeroen van Rijn added a user count to uptime. Elie De Brauwer
+added -e to watch, removed a memory leak, and fixed a terminal size problem.
+William Haddon made xargs call its command line once even with blank input
+(the standard is vague, but builds expect it), and fixed an off by one bug
+where grep didn't malloc enough space with -E (leading to a segfault).
+I fixed a glitch in bunzip2 (same one as went into busybox since they're using
+the code I wrote), in od to fix -t co, -J, and -c options. Add uname -o as a
+synonym for -s. Build fix to never use $CC without prefixing it with
+$CROSS_COMPILE (since $HOSTCC could be different). Anca Emanuel spotted
+a typo in the web page.</p>
+
+<p>The compile-time command line option parsing got rewritten (ported from
+bash to C), which should speed up builds a bit and allow code controlled by
+--longopts to drop out properly when disabled in the configuration. Terminal
+querying got refactored. Patch's -x option is now more informative (a
+debug thing if you're trying to figure out why a patch didn't apply).
+The "toynet.h" file got folded into toys.h since musl supports it and
+micromanging uClibc options isn't very interesting anymore. The test suite
+now uses scripts/single.sh when testing a single command.</p>
+
 <hr><b>September 17, 2013</b>
 <blockquote><p>"Think of a number," said the computer, "any number."
 Arthur told the computer the telephone number of King's Cross railway