• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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} &lt(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