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