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