1<html><head><title>toybox roadmap</title>
   2<!--#include file="header.html" -->
   3<title>Toybox Roadmap</title>
   5<h2>Goals and use cases</h2>
   7<p>We have several potential use cases for a new set of command line
   8utilities, and are using those to determine which commands to implement
   9for Toybox's 1.0 release.</p>
  11<p>The most interesting standards are POSIX-2008 (also known as the Single
  12Unix Specification version 4) and the Linux Standard Base (version 4.1).
  13The main test harness including toybox in Aboriginal Linux and if that can
  14build itself using the result to build Linux From Scratch (version 6.8).
  15We also aim to replace Android's Toolbox.</p>
  17<p>At a secondary level we'd like to meet other use cases. We've analyzed
  18the commands provided by similar projects (klibc, sash, sbase, embutils,
  19nash, and beastiebox), along with various vendor configurations of busybox,
  20and some end user requests.</p>
  22<p>Finally, we'd like to provide a good replacement for the Bash shell,
  23which was the first program Linux ever ran and remains the standard shell
  24of Linux no matter what Ubuntu says. This doesn't mean including the full
  25set of Bash 4.x functionality, but does involve {various,features} beyond
  28<p>See the <a href=status.html>status page</a> for the combined list
  29and progress towards implementing it.</p>
  32<li><a href=#susv4>POSIX-2008/SUSv4</a></li>
  33<li><a href=#sigh>Linux "Standard" Base</a></li>
  34<li><a href=#dev_env>Development Environment</a></li>
  35<li><a href=#android>Android Toolbox</a></li>
  36<li><a href=#aosp>Building AOSP</a></li>
  37<li><a href=#tizen>Tizen Core</a></li>
  38<li><a href=#buildroot>buildroot</a></li>
  39<li>Miscelaneous: <a href=#klibc>klibc</a>, <a href=#glibc>glibc</a>,
  40<a href=#sash>sash</a>, <a href=#sbase>sbase</a>,
  41<a href=#uclinux>uclinux</a>...</li>
  44<hr />
  45<a name="standards">
  46<h2>Use case: standards compliance.</h2>
  48<h3><a name=susv4 /><a href="#susv4">POSIX-2008/SUSv4</a></h3>
  49<p>The best standards are the kind that describe reality, rather than
  50attempting to impose a new one. (I.E. a good standard should document, not
  53<p>The kind of standards which describe existing reality tend to be approved by
  54more than one standards body, such ANSI and ISO both approving C.  That's why
  55the IEEE POSIX committee's 2008 standard, the Single Unix Specification version
  564, and the Open Group Base Specification edition 7 are all the same standard
  57from three sources.</p>
  59<p>The <a href="">"utilities"
  61of these standards is devoted to the unix command line, and are the best such
  62standard for our purposes.  (My earlier work on BusyBox was implemented with
  63regard to SUSv3, an earlier version of this standard.)</p>
  65<h3>Problems with the standard</h3>
  67<p>Unfortunately, these standards describe a subset of reality, lacking any
  68mention of commands such as init, login, or mount required to actually boot a
  69system. It provides ipcrm and ipcs, but not ipcmk, so you can use System V IPC
  70resources but not create them.</p>
  72<p>These standards also contain a large number of commands that are
  73inappropriate for toybox to implement in its 1.0 release.  (Perhaps some of
  74these could be reintroduced in later releases, but not now.)</p>
  76<p>Starting with the full "utilities" list, we first remove generally obsolete
  77commands (compess ed ex pr uncompress uccp uustat uux), commands for the
  78pre-CVS "SCCS" source control system (admin delta get prs rmdel sact sccs unget
  79val what), fortran support (asa fort77), and batch processing support (batch
  80qalter qdel qhold qmove qmsg qrerun qrls qselect qsig qstat qsub).</p>
  82<p>Some commands are for a compiler toolchain (ar c99 cflow ctags cxref gencat
  83iconv lex m4 make nm strings strip tsort yacc), which is outside of toybox's
  84mandate and should be supplied externally.  (Again, some of these may be
  85revisited later, but not for toybox 1.0.)</p>
  87<p>Some commands are part of a command shell, and cannot be implemented as
  88separate executables (alias bg cd command fc fg getopts hash jobs kill read
  89type ulimit umask unalias wait).  These may be revisited as part of a built-in
  90toybox shell, but are not exported into $PATH via symlinks.  (If you fork a
  91child process and have it "cd" then exit, you've accomplished nothing.
  92This is not a complete list, a shell also needs exit, if, while, for, case,
  93export, set, unset, trap, exec... And for bash compatability, function and
  97<span id=shell>
  98alias bg cd command fc fg getopts hash jobs kill read type ulimit umask
  99unalias wait exit if while for case export set unset trap exec function source
 103<p>A few other commands are judgement calls, providing command-line
 104internationalization support (iconv locale localedef), System V inter-process
 105communication (ipcrm ipcs), and cross-tty communication from the minicomputer
 106days (talk mesg write).  The "pax" utility was supplanted by tar, "mailx" is
 107a command line email client, and "lp" submits files for printing to... what
 108exactly?  (cups?)  The standard defines crontab but not crond.</p>
 110<p>Removing all of that leaves the following commands, which toybox should
 114<span id=posix>
 115at awk basename bc cal cat chgrp chmod chown cksum cmp comm cp
 116csplit cut date dd df diff dirname du echo env expand expr false file find
 117fold fuser getconf grep head id join kill link ln logger logname ls man
 118mkdir mkfifo more mv newgrp nice nl nohup od paste patch pathchk printf ps
 119pwd renice rm rmdir sed sh sleep sort split stty tabs tail tee test time
 120touch tput tr true tty uname unexpand uniq unlink uudecode uuencode vi wc
 121who xargs zcat
 125<h3><a name=sigh /><a href="#sigh">Linux Standard Base</a></h3>
 127<p>One attempt to supplement POSIX towards an actual usable system was the
 128Linux Standard Base. Unfortunately, the quality of this "standard" is
 129fairly low.</p>
 131<p>POSIX allowed its standards process to be compromised
 132by leaving things out, thus allowing IBM mainframes and Windows NT to drive
 133a truck through the holes and declare themselves compilant. But it means what
 134they DID standardize tends to be respected (if sometimes obsolete).</p>
 136<p>The Linux Standard Base's failure mode is different, they respond to
 137pressure by including special-case crap, such as allowing Red Hat to shoehorn
 138RPM into the standard even though all sorts of distros (Debian, Slackware, Arch,
 139Gentoo) don't use it and probably never will. This means anything in the LSB is
 140at best a suggestion: arbitrary portions of this standard are widely
 143<p>The community perception seems to be that the Linux Standard Base is
 144the best standard money can buy, I.E. the Linux Foundation is supported by
 145financial donations from large companies and the LSB
 146<a href=>represents the interests
 147of those donors</a> more than technical merit. (The Linux Foundation, which
 148maintains the LSB, isn't a 501c3. It's a 501c6, the
 149same kind of legal entity as the Tobacco Institute and Microsoft's old
 150"Don't Copy That Floppy" program.) Debian officially
 151<a href=>washed its hands of LSB</a> when 5.0
 152came out in 2015, and no longer even pretends to support it (which may affect
 153Debian derivatives like Ubuntu and Knoppix). Toybox hasn't moved to 5.0 for
 154similar reasons.</p>
 156<p>That said, Posix by itself isn't enough, and this is the next most
 157comprehensive standards effort for Linux so far, so we salvage what we can.</p>
 159<p>The LSB specifies a <a href=>list of command line
 163ar at awk batch bc chfn chsh col cpio crontab df dmesg du echo egrep 
 164fgrep file fuser gettext grep groupadd groupdel groupmod groups 
 165gunzip gzip hostname install install_initd ipcrm ipcs killall lpr ls 
 166lsb_release m4 md5sum mknod mktemp more mount msgfmt newgrp od passwd 
 167patch pidof remove_initd renice sed sendmail seq sh shutdown su sync 
 168tar umount useradd userdel usermod xargs zcat
 171<p>Where posix specifies one of those commands, LSB's deltas tend to be
 172accomodations for broken tool versions which aren't up to date with the
 173standard yet. (See <a href=>more</a> and <a href=>xargs</a>
 174for examples.)</p>
 176<p>Since we've already committed to using our own judgement to skip bits of
 177POSIX, and LSB's "judgement" in this regard is purely bug workarounds to declare
 178various legacy tool implementations "compliant", this means we're mostly
 179interested in the set of tools that aren't specified in posix at all.</p>
 181<p>Of these, gettext and msgfmt are internationalization, install_initd and
 182remove_initd weren't present in Ubuntu 10.04, lpr is out of scope,
 183and lsb_release just reports information in /etc/os-release.</p>
 185<p>This leaves:</p>
 188<span id=lsb>
 189chfn chsh dmesg egrep fgrep groupadd groupdel groupmod groups
 190gunzip gzip hostname install killall md5sum
 191mknod mktemp mount passwd pidof sendmail seq shutdown
 192su sync tar umount useradd userdel usermod zcat
 196<hr />
 197<a name="dev_env">
 198<h2><a href="#dev_env">Use case: provide a self-hosting development environment</a></h2>
 200<p>The following commands are enough to build the <a href=>Aboriginal Linux</a> development
 201environment, boot it to a shell prompt, and build <a href=>Linux From Scratch 6.8</a> under it.</p>
 203<p>This use case includes running init scripts and other shell scripts, running
 204configure, make, and install in each package, and providing basic command line
 205facilities such as a text editor. (It does not include a compiler toolchain or
 206C library, those are outside the scope of this project.)</p>
 209<span id=development>
 210bzcat cat cp dirname echo env patch rmdir sha1sum sleep sort sync
 211true uname wc which yes zcat
 212awk basename chmod chown cmp cut date dd diff
 213egrep expr fdisk find grep gzip head hostname id install ln ls
 214mkdir mktemp mv od readlink rm sed sh tail tar touch tr uniq
 215wget whoami xargs chgrp comm gunzip less logname split
 216tee test time bunzip2 chgrp chroot comm cpio dmesg
 217dnsdomainname ftpd ftpget ftpput gunzip ifconfig init less
 218logname losetup mdev mount mountpoint nc pgrep pkill 
 219pwd route split stat switch_root tac umount vi
 220resize2fs tune2fs fsck.ext2 genext2fs mke2fs xzcat
 224<p>Aboriginal Linux also installs bash 2.05b as #!/bin/sh and its scripts
 225require bash extensions not present in shells such as busybox ash.
 226This means that toysh needs to supply several bash extensions _and_ work
 227when called under the name "bash".</p>
 229<p>The <a href=>Aboriginal Linux</a>
 230self-bootstrapping build still uses the following busybox commands,
 231not yet supplied by toybox:</p>
 234awk bunzip2 bzcat dd diff expr fdisk ftpd ftpget
 235ftpput gunzip gzip less ping route sh
 236sha512sum tar test tr unxz vi wget xzcat zcat
 239<p>Many of those are in "pending". The remaining "difficult"
 240commands are vi, awk, and sh.</p>
 242<p>Building Linux From Scratch is not the same as building the
 243<a href=>Android Open Source Project</a>,
 244but after toybox 1.0 focus may shift to <a href=>modifying the AOSP build</a>
 245to reduce dependencies. (It's fairly likely we'll have to add at least
 246a read-only git utility so repo can download the build's source code,
 247but that's actually <a href=>not
 248that hard</a>. We'll probably also need our own "make" at some point after
 251<p>Note: Aboriginal Linux was
 252<a href=>restarted</a> (I.E. <a href=>replaced</a>) due to toolchain licensing issues, but the new project is a simpler implementation of the same goals,
 253and when finished should provide the same test environment for toybox.
 254This section needs to be rewritten whem mkroot is complete enough to build
 255Linux From Scratch.</p>
 257<p>The development methodology used a <a href=>command logging wrapper</a>
 258that intercepted each command called out of the $PATH and append the
 259command line to a log file, then <a href=>analyze</a> the result to create a
 260<a href=>list of commands</a>,
 261then <a href=>create a directory of symlinks</a> pointing to those commands out of the
 262host $PATH. Then the new implementation can replace these commands one
 263at a time, checking the results and the log output to spot any behavior
 266<hr />
 267<h2><a name=android /><a href="#android">Use case: Replacing Android Toolbox</a></h2>
 269<p>Android has a policy against GPL in userspace, so even though BusyBox
 270predates Android by many years, they couldn't use it. Instead they grabbed
 271an old version of ash and implemented their own command line utility set
 272called "toolbox". ash was later replaced by
 273<a href="">mksh</a>; toolbox is being
 274replaced by toybox.</p>
 276<p>Toolbox doesn't have its own repository, instead it's part of Android's
 277<a href=>system/core
 278git repository</a>. Android's Native Development Kit (their standalone
 279downloadable toolchain)  has its own
 280<a href=>roadmap</a>, and each version has
 281<a href=>release
 284<h3>Toolbox commands:</h3>
 286<p>According to <a href=>
 287system/core/toolbox/</a> the toolbox directory builds the
 288following commands:</p>
 291dd getevent newfs_msdos
 294<p>The toolbox makefile also builds the BSD grep right now, because toybox
 295grep is missing <code>--color</code>.</p>
 297<h3>Other Android /system/bin commands</h3>
 299<p>Other than the toolbox links, the currently interesting
 300binaries in /system/bin are:</p>
 303<li><b>arping</b> - ARP REQUEST tool (iputils)</li>
 304<li><b>blkid</b> - identify block devices (e2fsprogs)</li>
 305<li><b>e2fsck</b> - fsck for ext2/ext3/ext4 (e2fsprogs)</li>
 306<li><b>fsck.f2fs</b> - fsck for f2fs (f2fs-tools)</li>
 307<li><b>fsck_msdos</b> - fsck for FAT (BSD)</li>
 308<li><b>gzip</b> - compression/decompression tool (zlib)</li>
 309<li><b>ip</b> - network routing tool (iproute2)</li>
 310<li><b>iptables/ip6tables</b> - IPv4/IPv6 NAT admin (iptables)</li>
 311<li><b>iw</b> - wireless device config tool (iw)</li>
 312<li><b>logwrapper</b> - redirect stdio to android log (Android)</li>
 313<li><b>make_ext4fs</b> - make ext4 fs (Android)</li>
 314<li><b>make_f2fs</b> - make f2fs fs (f2fs-tools)</li>
 315<li><b>ping/ping6</b> - ICMP ECHO_REQUEST tool (iputils)</li>
 316<li><b>reboot</b> - reboot (Android)</li>
 317<li><b>resize2fs</b> - resize ext2/ext3/ext4 fs (e2fsprogs)</li>
 318<li><b>sh</b> - mksh (BSD)</li>
 319<li><b>ss</b> - socket statistics (iproute2)</li>
 320<li><b>tc</b> - traffic control (iproute2)</li>
 321<li><b>tracepath/tracepath6</b> - trace network path (iputils)</li>
 322<li><b>traceroute/traceroute6</b> - trace network route (iputils)</li>
 325<p>The names in parentheses are the source.</p>
 329<p>For reference, combining everything listed above, we get:</p>
 332arping blkid e2fsck dd fsck.f2fs fsck_msdos getevent gzip ip iptables
 333ip6tables iw logwrapper make_ext4fs make_f2fs newfs_msdos ping ping6
 334reboot resize2fs sh ss tc tracepath tracepath6 traceroute traceroute6
 337<p>We may eventually implement all of that, but for toybox 1.0 we need to
 338focus a bit. For our first pass, let's just replace all the "toolbox"
 341<p>This means toybox should implement (or finish implementing):</p>
 343<span id=toolbox>
 344dd getevent grep gzip newfs_msdos
 348<p>Update: is currently building the following toybox files out
 349of "pending". These should be a priority for cleanup (ones marked with *
 350don't have a symlink, so they're a lot less visible):</p>
 353chrt dd expr getfattr* lsof modprobe more setfattr* tar tr traceroute
 356<p>Android wishlist:</p>
 359mtools genvfatfs mke2fs gene2fs
 362<hr />
 363<h2><a name=aosp /><a href="#aosp">Use case: Building AOSP</a></h2>
 365<p>The list of external tools used to build AOSP is
 366<a href="">here</a>.</p>
 369awk basename bash bc bzip2 cat chmod cmp comm cp cut date dd diff dirname du
 370echo egrep env expr find fuser getconf getopt git grep gzip head hexdump
 371hostname id jar java javap ln ls lsof m4 make md5sum mkdir mktemp mv od openssl
 372paste patch pgrep pkill ps pstree pwd python python2.7 python3 readlink
 373realpath rm rmdir rsync sed setsid sh sha1sum sha256sum sha512sum
 374sleep sort stat tar tail tee todos touch tr true uname uniq unix2dos unzip
 375wc which whoami xargs xxd xz zip zipinfo
 378<p>The following are already in the tree and will be used directly:</p>
 381awk bzip2 jar java javap m4 make python python2.7 python3 xz
 384<p>Subtracting what's already in toybox (including the following toybox toys
 385that are still in pending: <code>bc dd diff expr gzip lsof tar tr</code>),
 386that leaves:</p>
 389bash fuser getopt git hexdump openssl pstree rsync sh todos unzip zip zipinfo
 392<p>For AOSP, zip/zipinfo/unzip are likely to be libziparchive based. The
 393todos callers will use unix2dos instead if it's available. git/openssl
 394seem like they should just be brought in to the tree. rsync is used to
 395work around a Mac <code>cp -Rf</code> bug with broken symbolic links. That
 399bash fuser getopt hexdump pstree
 402<p>(Why are fuser and pstree used during the AOSP build? They're used for
 403diagnostics if something goes wrong. So it's really just bash, getopt,
 404and hexdump that are actually used to build.)</p>
 406<hr />
 407<h2><a name=tizen /><a href="#tizen">Use case: Tizen Core</a></h2>
 409<p>The Tizen project has expressed a desire to eliminate GPLv3 software
 410from its core system, and is installing toybox as
 411<a href=>part of this process</a>.</p>
 413<p>They have a fairly long list of new commands they'd like to see in toybox:</p>
 416<span id=tizen>
 417arch base64 users dir vdir unexpand shred join csplit
 418hostid nproc runcon sha224sum sha256sum sha384sum sha512sum sha3sum mkfs.vfat fsck.vfat 
 419dosfslabel uname stdbuf pinky diff3 sdiff zcmp zdiff zegrep zfgrep zless zmore
 423<p>In addition, they'd like to use several commands currently in pending:</p>
 426<span id=tizen>
 427tar diff printf wget rsync fdisk vi less tr test stty fold expr dd
 431<p>Also, tizen uses a different Linux Security Module called SMACK, so
 432many of the SELinux options ala ls -Z need smack alternatives in an
 433if/else setup.</p>
 435<hr /><a name=buildroot />
 438<p>The <a href=>mandatory packages</a>
 439section of the buildroot manual lists:</p>
 442which sed make bash patch gzip bzip2 tar cpio unzip rsync file bc wget
 445<p>(It also lists binutils gcc g++ perl python, and for debian it wants
 446build-essential. And it wants file to be in /usr/bin because
 447<a href=>libtool
 448breaks otherwise</a>.)</p>
 450<p>Buildroot does not support a cross toolchain that lives in "/usr/bin"
 451with a prefix of "" (if you try, and chop out the test for a blank prefix,
 452it dies trying to run "/usr/bin/-gcc"). But you can patch your way to
 453making it work if you try.</p>
 455<hr /><a name=klibc />
 458<p>Long ago some kernel developers came up with a project called
 459<a href=>klibc</a>.
 460After a decade of development it still has no web page or HOWTO,
 461and nobody's quite sure if the license is BSD or GPL. It inexplicably
 462<a href=>requires perl to build</a>, and seems like an ideal candidate for
 465<p>In addition to a C library even less capable than bionic (obsoleted by
 466musl), klibc builds a random assortment of executables to run init scripts
 467with. There's no multiplexer command, these are individual executables:</p>
 470cat chroot cpio dd dmesg false fixdep fstype gunzip gzip halt ipconfig kill
 471kinit ln losetup ls minips mkdir mkfifo mknodes
 472mksyntax mount mv nfsmount nuke pivot_root poweroff readlink reboot resume
 473run-init sh sha1hash sleep sync true umount uname zcat
 476<p>To get that list, build klibc according to the instructions (I
 477<a href=>looked at</a> version
 4782.0.2 and did cd klibc-*; ln -s /output/of/kernel/make/headers_install
 479linux; make) then <b>echo $(for i in $(find . -type f); do file $i | grep -q
 480executable && basename $i; done | grep -v '[.]g$' | sort -u)</b> to find
 481executables, then eliminate the *.so files and *.shared duplicates.</p>
 483<p>Some of those binaries are build-time tools that don't get installed,
 484which removes mknodes, mksyntax, sha1hash, and fixdep from the list.
 485(And sha1hash is just an unpolished sha1sum anyway.)</p>
 487<p>The run-init command is more commonly called switch_root, nuke is just
 488"rm -rf -- $@", and minips is more commonly called "ps". I'm not doing aliases
 489for the oddball names.</p>
 491<p>Yet more stale forks of dash and gzip sucked in here (see "dubious
 492license terms" above), adding nothing to the other projects we've looked at.
 493But we still need sh, gunzip, gzip, and zcat to replace this package.</p>
 495<p>At the time I did the initial analysis toybox already had cat, chroot, dmesg, false,
 496kill, ln, losetup, ls, mkdir, mkfifo, readlink, rm, switch_root, sleep, sync,
 497true, and uname.</p>
 499<p>The low hanging fruit is cpio, dd, ps, mv, and pivot_root.</p>
 501<p>The "kinit" command is another gratuitous rename, it's init running as PID 1.
 502The halt, poweroff, and reboot commands work with it.</p>
 504<p>I've got mount and umount queued up already, fstype and nfsmount go with
 505those. (And probably smbmount and p9mount, but this hasn't got one. Those
 506are all about querying for login credentials, probably workable into the
 507base mount command.)</p>
 509<p>The ipconfig command here has a built in dhcp client, so it's ifconfig
 510and dhcpcd and maybe some other stuff.</p>
 512<p>The resume command is... weird. It finds a swap partition and reads data
 513from it into a /proc file, something the kernel is capable of doing itself.
 514(Even though the klibc author
 515<a href=>attempted
 516to remove</a> that capability from the kernel, current kernel/power/hibernate.c
 517still parses "resume=" on the command line). And yet various distros seem to
 518make use of klibc for this.
 519Given the history of swsusp/hibernate (and 
 520<a href=>TuxOnIce</a>
 521and <a href=>kexec jump</a>) I've lost track
 522of the current state of the art here. Ah, Documentation/power/userland-swsusp.txt
 523has the API docs, and <a href=>here's a better
 526<p>So the list of things actually in klibc are:</p>
 529<span id=klibc_cmd>
 530cat chroot dmesg false kill ln losetup ls mkdir mkfifo readlink rm switch_root
 531sleep sync true uname
 533cpio dd ps mv pivot_root
 534mount nfsmount fstype umount
 535sh gunzip gzip zcat
 536kinit halt poweroff reboot
 542<hr />
 543<a name=glibc />
 546<p>Rather a lot of command line utilities come bundled with glibc:</p>
 549catchsegv getconf getent iconv iconvconfig ldconfig ldd locale localedef
 550mtrace nscd rpcent rpcinfo tzselect zdump zic
 553<p>Of those, musl libc only implements ldd.</p>
 555<p>catchsegv is a rudimentary debugger, probably out of scope for toybox.</p>
 557<p>iconv has been <a href="#susv4">previously discussed</a>.</p>
 559<p>iconvconfig is only relevant if iconv is user-configurable; musl uses a
 560non-configurable iconv.</p>
 562<p>getconf is a posix utility which displays several variables from 
 563unistd.h; it probably belongs in the development toolchain.</p>
 565<p>getent handles retrieving entries from passwd-style databases
 566(in a rather lame way) and is trivially replacable by grep.</p>
 568<p>locale was discussed under <a href=#susv4>posix</a>.
 569localedef compiles locale definitions, which musl currently does not use.</p>
 571<p>mtrace is a perl script to use the malloc debugging that glibc has built-in;
 572this is not relevant for musl, and would necessarily vary with libc. </p>
 574<p>nscd is a name service caching daemon, which is not yet relevant for musl.
 575rpcinfo and rpcent are related to rpc, which musl does not include.</p>
 577<p>The remaining commands involve glibc's bundled timezone database,
 578which seems to be derived from the <a href=>IANA
 579timezone database</a>. Unless we want to maintain our own fork of the
 580standards body's database like glibc does, these are of no interest,
 581but for completeness:</p>
 583<p>tzselect outputs a TZ variable correponding to user input. 
 584The documentation does not indicate how to use it in a script, but it seems
 585that Debian may have done so.
 586zdump prints current time in each of several timezones, optionally
 587outputting a great deal of extra information about each timezone.
 588zic converts a description of a timezone to a file in tz format.</p>
 590<p>None of glibc's bundled commands are currently of interest to toybox.</p>
 594<hr />
 595<a name=sash />
 596<h2>Stand-Alone Shell</h2>
 598<p>Wikipedia has <a href=>a good
 599summary of sash</a>, with links. The original Stand-Alone Shell project reached
 600a stopping point, and then <a href=>"sash plus
 601patches"</a> extended it a bit further. The result is a megabyte executable
 602that provides 40 commands.</p>
 604<p>Sash is a shell with built-in commands. It doesn't have a multiplexer
 605command, meaning "sash ls -l" doesn't work (you have to go "sash -c 'ls -l'").
 608<p>The list of commands can be obtained via building it and doing
 609"echo help | ./sash | awk '{print $1}' | sed 's/^-//' | xargs echo", which
 610gives us:</p>
 613alias aliasall ar cd chattr chgrp chmod chown cmp cp chroot dd echo ed exec
 614exit file find grep gunzip gzip help kill losetup losetup ln ls lsattr mkdir
 615mknod more mount mv pivot_root printenv prompt pwd quit rm rmdir setenv source
 616sum sync tar touch umask umount unalias where
 619<p>Plus sh because it's a shell. A dozen or so commands can only sanely be
 620implemented as shell builtins (alias aliasall cd exec exit prompt quit setenv
 621source umask unalias), where is an alias for which, and at triage time toybox
 622already has chgrp, chmod, chown, cmp, cp, chroot, echo, help, kill, losetup,
 623ln, ls, mkdir, mknod, printenv, pwd, rm, rmdir, sync, and touch.</p>
 625<p>This leaves:</p>
 628<span id=sash_cmd>
 629ar chattr dd ed file find grep gunzip gzip lsattr more mount mv pivot_root
 630sh sum tar umount
 634<p>(For once, this project doesn't include a fork of gzip, instead
 635it sucks in -lz from the host.)</p>
 637<hr />
 638<a name=sbase />
 641<p>It's <a href=>on suckless</a> in
 642<a href=>two parts</a>. As of November 2015 it's
 643implemented the following (renaming "cron" to "crond" for
 644consistency, and yanking "sponge", "mesg", "pagesize", "respawn", and
 648<span id=sbase_cmd>
 649basename cal cat chgrp chmod chown chroot cksum cmp cols comm cp crond cut date
 650dirname du echo env expand expr false find flock fold getconf grep head
 651hostname join kill link ln logger logname ls md5sum mkdir mkfifo mktemp mv
 652nice nl nohup od paste printenv printf pwd readlink renice rm rmdir sed seq
 653setsid sha1sum sha256sum sha512sum sleep sort split strings sync tail
 654tar tee test tftp time touch tr true tty uname unexpand uniq unlink uudecode
 655uuencode wc which xargs yes
 662<span id=sbase_cmd>
 663chvt clear dd df dmesg eject fallocate free id login mknod mountpoint
 664passwd pidof ps stat su truncate unshare uptime watch
 669<hr />
 670<a name=nash />
 673<p>Red Hat's nash was part of its "mkinitrd" package, replacement for a shell
 674and utilities on the boot floppy back in the 1990's (the same general idea
 675as BusyBox, developed independently). Red Hat discontinued nash development
 676in 2010, replacing it with dracut (which collects together existing packages,
 677including busybox).</p>
 679<p>I couldn't figure out how to beat source code out of
 680<a href=>Fedora's current git</a>
 681repository. The last release version that used it was Fedora Core 12
 682which has <a href=>a source rpm</a>
 683that can be unwound with "rpm2cpio mkinitrd.src.rpm | cpio -i -d -H newc
 684--no-absolute-filenames" and in there is a mkinitrd-6.0.93.tar.bz2 which
 685has the source.</p>
 687<p>In addition to being a bit like a command shell, the nash man page lists the
 688following commands:</p>
 691access echo find losetup mkdevices mkdir mknod mkdmnod mkrootdev mount
 692pivot_root readlink raidautorun setquiet showlabels sleep switchroot umount
 695<p>Oddly, the only occurrence of the string pivot_root in the nash source code
 696is in the man page, the command isn't there. (It seems to have been removed
 697when the underscoreless switchroot went in.)</p>
 699<p>A more complete list seems to be the handlers[] array in nash.c:</p>
 702access buildEnv cat cond cp daemonize dm echo exec exit find kernelopt
 703loadDrivers loadpolicy mkchardevs mkblktab mkblkdevs mkdir mkdmnod mknod
 704mkrootdev mount netname network null plymouth hotplug killplug losetup
 705ln ls raidautorun readlink resume resolveDevice rmparts setDeviceEnv
 706setquiet setuproot showelfinterp showlabels sleep stabilized status switchroot
 707umount waitdev
 710<p>This list is nuts: "plymouth" is an alias for "null" which is basically
 711"true" (which thie above list doesn't have). Things like buildEnv and
 712loadDrivers are bespoke Red Hat behavior that might as well be hardwired in
 713to nash's main() without being called.</p>
 715<p>Instead of eliminating items
 716from the list with an explanation for each, I'm just going to cherry pick
 717a few: the device mapper (dm, raidautorun) is probably interesting,
 718hotplug (may be obsolete due to kernel changes that now load firmware
 719directly), and another "resume" ala klibc.</p>
 721<p>But mostly: I don't care about this one. And neither does Red Hat anymore.</p>
 723<p>Verdict: ignore</p>
 725<hr />
 726<a name=beastiebox />
 729<p>Back in 2008, the BSD guys vented some busybox-envy
 730<a href=>on sourceforge</a>. Then stopped.
 731Their repository is still in CVS, hasn't been touched in years, it's a giant
 732hairball of existing code sucked together. (The web page says the author
 733is aware of crunchgen, but decided to do this by hand anyway. This is not
 734a collection of new code, it's a katamari of existing code rolled up in a
 737<p>Combining the set of commands listed on the web page with the set of
 738man pages in the source gives us:</P>
 741[ cat chmod cp csh date df disklabel dmesg echo ex fdisk fsck fsck_ffs getty
 742halt hostname ifconfig init kill less lesskey ln login ls lv mksh more mount
 743mount_ffs mv pfctl ping poweroff ps reboot rm route sed sh stty sysctl tar test
 744traceroute umount vi wiconfig
 747<p>Apparently lv is the missing link between ed and vi, copyright 1982-1997 (do
 748not want), ex is another obsolete vi mode, lesskey is "used to
 749specify a set of key bindings to be used with less", and csh is a shell they
 750sucked in (even though they have mksh?), [ is an alias for test. Several more bsd-isms that don't have Linux
 751equivalents (even in the ubuntu "install this package" search) are
 752disklabel, fsck_ffs, mount_ffs, and pfctl. And wiconfig is a
 753wavelan interface network card driver utility. Subtracting all that and the
 754commands toybox already implements at triage time, we get:</p>
 757<span id=beastiebox_cmd>
 758fdisk fsck getty halt ifconfig init kill less more mount mv ping poweroff
 759ps reboot route sed sh stty sysctl tar test traceroute umount vi
 763<p>Not a hugely interesting list, but eh.</p>
 765<p>Verdict: ignore</p>
 767<hr />
 768<a name=BsdBox />
 771<p>Somebody decided to do a <a href=>multicall binary for freebsd</a>.</p>
 773<p>They based it on crunchgen, a tool that glues existing programs together
 774into an archive and uses the name to execute the right one. It has no
 775simplification or code sharing benefits whatsoever, it's basically an
 776archiver that produces executables.</p>
 778<p>That's about where I stopped reading.</p>
 780<p>Verdict: ignore.</p>
 782<hr />
 783<a name=slowaris />
 784<h2>OpenSolaris Busybox</h2>
 786<p>Somebody <a href=>wrote
 787a wiki page</a> saying that Busybox for OpenSolaris would be a good idea.</p>
 789<p>The corresponding "files" tab is an auto-generated stub. The project never
 790even got as far as suggesting commands to include before Oracle discontinued
 793<p>Verdict: ignore.</p>
 795<hr />
 796<a name=uclinux />
 799<p>Long ago a hardware developer named Jeff Dionne put together a
 800nommu Linux distribution, which involved rewriting a lot of command line
 801utilities that relied on <a href=>features
 802unavailable on nommu</a> hardware.</p>
 804<p>In 2003 Jeff moved to Japan and handed
 805the project off to people who allowed it to roll to a stop. The website
 806turned into a mess of 404 links, the navigation indexes stopped being
 807updated over a decade ago, and the project's CVS repository suffered a
 808hard drive failure for which there were no backups. The project continued
 809to put out "releases" through 2014 (you have to scroll down in the "news"
 810section to find them, the "HTTP download" section in the nav bar on the
 811left hasn't been updated in over a decade), which were hand-updated tarball
 812snapshots mostly consisting of software from the 1990's. For example the
 8132014 release still contained ipfwadm, the package which predated ipchains,
 814which predated iptables, which is in the process of being replaced by
 817<p>Nevertheless, people still try to use this because (at least until the
 818launch of <a href=></a>) the project was viewed
 819as the place to discuss, develop, and learn about nommu Linux.
 820The role of as an educational resource kept people coming
 821to it long after it had collapsed as a Linux distro.</p>
 823<p>Starting around 0.6.0 toybox began to address nommu support with the goal
 824of putting uClinux out of its misery.</p>
 826<p>An analysis of <a href=>uClinux-dist-20140504</a> found 312 package
 827subdirectories under "user".</p>
 829<h3>Taking out the trash</h3>
 831<p>A bunch of packages (<b>inotify-tools, input-event-demon, ipsec-tools, netifd,
 832keepalived, mobile-broadband-provider-info, nuttp, readline, snort,
 833snort-barnyard, socat, sqlite, sysklogd, sysstat, tcl, ubus, uci, udev,
 834unionfs, uqmi, usb_modeswitch, usbutils, util-linux</b>)
 835are hard to evaluate because
 836uclinux has directories for them, but their source isn't actually in the
 837uclinux tree. In some of these the makefiles download a git repo during
 838the build, so I'm assuming you can build the external package if you really
 839care. (Even when I know what these packages do, I'm skipping them
 840because uclinux doesn't actually contain them, and any given snapshot
 841of the build system will bitrot as external web links change over time.)</p>
 843<p>Other packages are orphaned, meaning they're not mentioned from any Kconfig
 844or Makefiles outside of their directory, so uclinux can't actually build
 845them: <b>mbus</b> is an orphaned i2c test program expecting to run in some sort
 846of hardwired hardware context, <b>mkeccbin</b> is an orphaned "ECC annotated
 847binary file" generator (meaning it's half of a flash writer),
 848<b>wsc_upnp</b> is a "Ralink WPS" driver (some sort of stale wifi chip)...</p>
 850<p>The majority of the remaining packages are probably not of interest to
 851toybox due to being so obsolete or special purpose they may not actually be
 852of interest to anybody anymore. (This list also includes a lot of
 853special-purpose network back-end stuff that's hard for anybody but
 854datacenter admins to evaluate the current relevance of.)</p>
 857arj asterisk boottools bpalogin br2684ctl camserv can4linux cgi_generic
 858cgihtml clamav clamsmtp conntrack-tools cramfs crypto-tools cxxtest
 859ddns3-client de2ts-cal debug demo diald discard dnsmasq dnsmasq2
 860ethattach expat-examples ez-ipupdate fakeidentd
 861fconfig ferret flatfs flthdr freeradius freeswan frob-led frox fswcert
 862game gettyd gnugk haserl horch
 863hostap hping httptunnel ifattach ipchains
 864ipfwadm ipmasqadm ipportfw ipredir ipset iso_client
 865jamvm jffs-tools jpegview jquery-ui kendin-config kismet klaxon kmod
 866l2tpd lcd ledcmd ledcon lha lilo lirc lissa load loattach
 867lpr lrpstat lrzsz mail mbus mgetty microwin ModemManager msntp musicbox
 868nooom null openswan openvpn palmbot pam_* pcmcia-cs playrt plugdaemon pop3proxy
 869potrace qspitest quagga radauth
 870ramimage readprofile rdate readprofile routed rrdtool rtc-ds1302
 871sendip ser sethdlc setmac setserial sgutool sigs siproxd slattach
 872smtpclient snmpd net-snmp snortrules speedtouch squashfs scep sslwrap stp
 873stunnel tcpblast tcpdump tcpwrappers threaddemos tinylogin tinyproxy
 874tpt tripwire unrar unzoo version vpnled w3cam xl2tpd zebra
 877<p>This stuff is all over the place: arj, lha, rar, and zoo are DOS archivers,
 878ethattach describes itself as just "a network tool",
 879mail is a textmode smtp mailer literally described as "Some kind of mail
 880proggy" in uclinux's kconfig (as opposed to clamsmtp and smtpclient and
 881so on), this gettyd isn't a generic version but specifically a
 882hardwired ppp dialin utility, mgetty isn't a generic version but is combined
 883with "sendfax", hostap is an intersil prism driver, wlan-ng is also an
 884intersil prism dirver, null is a program to intentionally dereference a
 885null pointer (in case you needed one), iso_client is a
 886"Demo Application for the USB Device Driver", kendin-config is
 887"for configuring the Micrel Kendin KS8995M over QSPI", speedtouch configures
 888a specific brand of asdl modem, portmap is part of Anfs,
 889ferret, linux-igd, and miniupnp are all upnp packages,
 890lanbypass "can be used to control the LAN
 891bypass switches on the Advantech x86 based hardware platforms", lcd is
 892"test of lcddma device driver" (an out-of-tree Coldfire driver apparently
 893lost to history, the uclinux linux-2.4.x directory has a config symbol for
 894it, but nothing in the code actually _uses_ it...), qspitest is another
 895coldfire thing, mii-tool-fec is
 896"strictly for the FEC Ethernet driver as implemented (and modified) for
 897the uCdimm5272", rtc-ds1302 and rtc-m41t11 are usermode drivers for specific
 898clock chips, stunnel is basically "openssl s_client -quiet -connect",
 899potrace is a bitmap to vector graphic converter, radauth performs command line
 900authentication against a radius server,
 901clamav, klaxon, ferret, l7-protocols, and nessus are very old network security
 902software (it's got a stale snapshot of nmap too), xl2tpd is a PPP over UDP
 903tunnel (rfc 2661), zebra is the package quagga replaced,
 904lilo is the x86-only bootloader that predated grub (and recently discontinued
 905development), lissa is a "framebuffer graphics demo" from
 9061998, the squashfs package here is the out of tree patches for 2.4 kernels
 907and such before the filesystem was merged upstream (as opposed to the
 908squashfs-new package which is a snapshot of the userspace tool from 2011),
 909load is basically "dd file /dev/spi", version is basically "cat /proc/version",
 910microwin is a port of the WinCE graphics API to Linux, scep is a 2003
 911implementation of an IETF draft abandoned in 2010, tpt depends on
 912Andrew Morton's 15 year old unmerged "timepegs" kernel patch using the pentium
 913cycle counter, vpnled controls a light that reboots systems (what?),
 914w3cam is a video4linux 1.0 client (v4l2 showed up during 2.5 and support for
 915the old v4l1 was removed in 2.6.38 back in 2011), busybox ate tinylogin
 916over a decade ago, lrpstat is a java network monitor
 917from 2001, lrzsz is zmodem/ymodem/zmodem, msntp and stp implement rfc2030
 918meaning it overflows in 2036 (the package was last updated in 2000), rdate
 919is rfc 868 meaning it also overflows in 2036 (which is why ntp was invented
 920a few decades back), reiserfsprogs development stopped abruptly after
 921Hans Reiser was convicted of murdering his wife Nina (denying it on the
 922stand and then leading them to the body as part of his plea bargain during
 926<p>Seriously, there's a lot of crap in there. It's hard to analyze most
 927of it far enough to prove it _doesn't_ do anything.</p>
 929<h3>Non-toybox programs</h3>
 931<p>The following software may actually still do something intelligible
 932(although the package versions tend to be years out of date), but
 933it's not a direction toybox has chosen to go in.</p>
 935<p>There are several programming languages (<b>bash, lua, jamvm, tinytcl,
 936perl, python</b>) in there. Maybe someone somewhere wants a 2008 release of a
 937java virtual machine tested to work on nommu systems (jamvm), but it's out
 938of scope for toybox.</p>
 940<p>A bunch of benchmark programs: <b>cpu, dhrystone, mathtest, nbench, netperf,
 941netpipe, and whetstone</b>.</p>
 943<p>A bunch of web servers: <b>appWeb, boa, fnord (via tcpserver), goahead, httpd,
 944mini_httpd, and thttpd</b>.</p>
 946<p>A bunch of shells: <b>msh</b> is a clever (I.E. obfuscated) little shell,
 947<b>nwsh</b> is "new shell" (that's what it called itself in 1999 anyway),
 948<b>sash</b> is another shell with a bunch of builtins (ls, ps, df, cp, date, reboot,
 949and shutdown, this roadmap analyzes it <a href="#sash">elsewhere</a>),
 950<b>sh</b> is a very old minix shell fork, and <b>tcsh</b> is also a shell.</p>
 952<p>Also in this category, we have:</p>
 955dropbear jffs-tools jpegview kexec-tools bind ctorrent
 956iperf iproute2 ip-sentinel iptables kexec
 957nmap oggplay openssl oprofile p7zip pppd pptp play vplay
 958hdparm mp3play at clock
 959mtd-utils mysql logrotate brcfg bridge-utils flashw
 960ebtables etherwake ethtool expect gdb gdbserver hostapd
 961lm_sensors load netflash netstat-nat
 962radvd recover rootloader resolveip rp-pppoe
 963rsyslog rsyslogd samba smbmount squashfs-new squid ssh strace tip
 964uboot-envtools ulogd usbhubctrl vconfig vixie-cron watchdogd
 965wireless_tools wpa_supplicant
 968<p>An awful lot of those are borderline: play and vplay are wav file
 969audio players, there's oprofile _and_ readprofile (which just reads kernel
 970profiling data from /proc/profile),
 971radvd is a "routr advertisement daemon" (ipv6 stateless autoconf),
 972ctorrent is a bittorent client, 
 973lm_sensors is hardware (heat?) monitoring,
 974resolveip is dig only less so,
 975rp-pppoe is ppp over ethernet,
 976ebtables is an ethernet version of iptables (for bridging),
 977their dropbear is from 2012, and that ssh version is from 2011
 978(which means it's about nine months too _old_ to have the heartbleed bug).
 979There's both ulogd and ulogd2 (no idea why), and pppd is version 2.4 but
 980there's a ppd-2.3 directory also.</p>
 982<p>Lots of flash stuff:
 983flashw is a flash writer, load is an spi flash loader, netflash writes
 984to flash via tftp,
 985recover is also a reflash daemon intended to come up when the system can't boot,
 986rootloader seems to be another reflash daemon but without dhcp.</p>
 988<h3>Already in roadmap</h3>
 990<p>The following packages contain commands already in the toybox roadmap:</p>
 993agetty cal cksum cron dhcpcd dhcpcd-new dhcpd dhcp-isc dosfstools e2fsprogs
 994elvis-tiny levee fdisk fileutils ftp ftpd grep hd hwclock inetd init ntp
 995iputils login module-init-tools netcat shutils ntpdate lspci ping procps
 996proftpd rsync shadow shutils stty sysutils telnet telnetd tftp tftpd traceroute
 997unzip wget mawk net-tools
1000<p>There are some duplicates in there, levee is a tiny vi implementation
1001like elvis-tiny, ntp and ntpdate overlap, etc.</p>
1003<p>Verdict: We don't really need to do a whole lot special for nommu
1004systems, just get the existing toybox roadmap working on nommu and
1005we're good. The uClinux project can rest in peace.</p>
1007<hr />
1010<p>The following additional commands have been requested (and often submitted)
1011by various users. I _really_ need to clean up this section.</p>
1015<span id=request>
1016dig freeramdisk getty halt hexdump hwclock klogd modprobe ping ping6 pivot_root
1017poweroff readahead rev sfdisk sudo syslogd taskset telnet telnetd tracepath
1018traceroute unzip usleep vconfig zip free login modinfo unshare netcat help w
1019ntpd iwconfig iwlist rdate
1020dos2unix unix2dos catv clear
1021pmap realpath setsid timeout truncate
1022mkswap swapon swapoff
1023count oneit fstype
1024acpi blkid eject pwdx
1025sulogin rfkill bootchartd
1026arp makedevs sysctl killall5 crond crontab deluser last mkpasswd watch
1027blockdev rpm2cpio arping brctl dumpleases fsck
1028tcpsvd tftpd
1029factor fallocate fsfreeze inotifyd lspci nbd-client partprobe strings
1030base64 mix
1031reset hexedit nsenter shred
1032fsync insmod ionice lsmod lsusb rmmod vmstat xxd top iotop
1033lsof ionice compress dhcp dhcpd addgroup delgroup host iconv ip
1034ipcrm ipcs netstat openvt
1035deallocvt iorenice
1036udpsvd adduser
1037microcom tunctl chrt getfattr setfattr
1042<!-- #include "footer.html" -->