Rob Landley | 349ff52 | 2014-01-04 13:09:42 -0600 | [diff] [blame] | 1 | <html><head><title>toybox roadmap</title> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 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 |
| 8 | utilities, and are using those to determine which commands to implement |
| 9 | for Toybox's 1.0 release.</p> |
| 10 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 11 | <p>The most interesting standards are POSIX-2008 (also known as the Single |
| 12 | Unix Specification version 4) and the Linux Standard Base (version 4.1). |
| 13 | The main test harness including toybox in Aboriginal Linux and if that can |
| 14 | build itself using the result to build Linux From Scratch (version 6.8). |
| 15 | We 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 |
| 18 | the commands provided by similar projects (klibc, sash, sbase, s6, embutils, |
| 19 | nash, and beastiebox), along with various vendor configurations of busybox, |
| 20 | and some end user requests.</p> |
| 21 | |
| 22 | <p>Finally, we'd like to provide a good replacement for the Bash shell, |
| 23 | which was the first program Linux ever ran and remains the standard shell |
| 24 | of Linux no matter what Ubuntu says. This doesn't mean including the full |
| 25 | set of Bash 4.x functionality, but does involve {various,features} beyond |
| 26 | posix.</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 27 | |
| 28 | <p>See the <a href=status.html>status page</a> for the combined list |
| 29 | and progress towards implementing it.</p> |
| 30 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 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> |
Rob Landley | 348a800 | 2014-04-09 07:57:08 -0500 | [diff] [blame] | 36 | <li>Miscelaneous: <a href=#klibc>klibc</a>, <a href=#glibc>glibc</a>, |
| 37 | <a href=#sash>sash</a>, <a href=#sbase>sbase</a>, <a href=#s6>s6</a>...</li> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 38 | </ul> |
| 39 | |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 40 | <hr /> |
| 41 | <a name="standards"> |
| 42 | <h2>Use case: standards compliance.</h2> |
| 43 | |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 44 | <h3><a name=susv4 /><a href="#susv4">POSIX-2008/SUSv4</a></h3> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 45 | <p>The best standards are the kind that describe reality, rather than |
| 46 | attempting to impose a new one. (I.E. a good standard should document, not |
| 47 | legislate.)</p> |
| 48 | |
| 49 | <p>The kind of standards which describe existing reality tend to be approved by |
| 50 | more than one standards body, such ANSI and ISO both approving C. That's why |
| 51 | the IEEE POSIX committee's 2008 standard, the Single Unix Specification version |
| 52 | 4, and the Open Group Base Specification edition 7 are all the same standard |
| 53 | from three sources.</p> |
| 54 | |
Rob Landley | 62f0021 | 2012-12-06 15:15:30 -0600 | [diff] [blame] | 55 | <p>The <a href="http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html">"utilities" |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 56 | section</a> |
| 57 | of these standards is devoted to the unix command line, and are the best such |
| 58 | standard for our purposes. (My earlier work on BusyBox was implemented with |
| 59 | regard to SUSv3, an earlier version of this standard.)</p> |
| 60 | |
| 61 | <h3>Problems with the standard</h3> |
| 62 | |
| 63 | <p>Unfortunately, these standards describe a subset of reality, lacking any |
| 64 | mention of commands such as init, login, or mount required to actually boot a |
| 65 | system. It provides ipcrm and ipcs, but not ipcmk, so you can use System V IPC |
| 66 | resources but not create them.</p> |
| 67 | |
| 68 | <p>These standards also contain a large number of commands that are |
| 69 | inappropriate for toybox to implement in its 1.0 release. (Perhaps some of |
| 70 | these could be reintroduced in later releases, but not now.)</p> |
| 71 | |
| 72 | <p>Starting with the full "utilities" list, we first remove generally obsolete |
| 73 | commands (compess ed ex pr uncompress uccp uustat uux), commands for the |
| 74 | pre-CVS "SCCS" source control system (admin delta get prs rmdel sact sccs unget |
| 75 | val what), fortran support (asa fort77), and batch processing support (batch |
| 76 | qalter qdel qhold qmove qmsg qrerun qrls qselect qsig qstat qsub).</p> |
| 77 | |
| 78 | <p>Some commands are for a compiler toolchain (ar c99 cflow ctags cxref gencat |
| 79 | iconv lex m4 make nm strings strip tsort yacc), which is outside of toybox's |
| 80 | mandate and should be supplied externally. (Again, some of these may be |
| 81 | revisited later, but not for toybox 1.0.)</p> |
| 82 | |
| 83 | <p>Some commands are part of a command shell, and cannot be implemented as |
| 84 | separate executables (alias bg cd command fc fg getopts hash jobs kill read |
| 85 | type ulimit umask unalias wait). These may be revisited as part of a built-in |
| 86 | toybox shell, but are not exported into $PATH via symlinks. (If you fork a |
| 87 | child process and have it "cd" then exit, you've accomplished nothing.)</p> |
| 88 | |
| 89 | <p>A few other commands are judgement calls, providing command-line |
| 90 | internationalization support (iconv locale localedef), System V inter-process |
| 91 | communication (ipcrm ipcs), and cross-tty communication from the minicomputer |
| 92 | days (talk mesg write). The "pax" utility was supplanted by tar, "mailx" is |
| 93 | a command line email client, and "lp" submits files for printing to... what |
| 94 | exactly? (cups?) The standard defines crontab but not crond.</p> |
| 95 | |
| 96 | <p>Removing all of that leaves the following commands, which toybox should |
| 97 | implement:</p> |
| 98 | |
| 99 | <blockquote><b> |
| 100 | <span id=posix> |
| 101 | at awk basename bc cal cat chgrp chmod chown cksum cmp comm cp |
| 102 | csplit cut date dd df diff dirname du echo env expand expr false file find |
| 103 | fold fuser getconf grep head id join kill link ln logger logname ls man |
| 104 | mkdir mkfifo more mv newgrp nice nl nohup od paste patch pathchk printf ps |
| 105 | pwd renice rm rmdir sed sh sleep sort split stty tabs tail tee test time |
| 106 | touch tput tr true tty uname unexpand uniq unlink uudecode uuencode vi wc |
| 107 | who xargs zcat |
| 108 | </span> |
| 109 | </b></blockquote> |
| 110 | |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 111 | <h3><a name=sigh /><a href="#sigh">Linux Standard Base</a></h3> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 112 | |
| 113 | <p>One attempt to supplement POSIX towards an actual usable system was the |
| 114 | Linux Standard Base. Unfortunately, the quality of this "standard" is |
| 115 | fairly low.</p> |
| 116 | |
| 117 | <p>POSIX allowed its standards process to be compromised |
| 118 | by leaving things out, thus allowing IBM mainframes and Windows NT to drive |
| 119 | a truck through the holes and declare themselves compilant. But it means what |
| 120 | they DID standardize tends to be respected.</p> |
| 121 | |
| 122 | <p>The Linux Standard Base's failure mode is different, they respond to |
| 123 | pressure by including special-case crap, such as allowing Red Hat to shoehorn |
Rob Landley | 62f0021 | 2012-12-06 15:15:30 -0600 | [diff] [blame] | 124 | RPM on the standard even though all sorts of distros (Debian, Slackware, Arch, |
| 125 | Gentoo) don't use it and probably never will. This means anything in the LSB is |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 126 | at best a suggestion: arbitrary portions of this standard are widely |
| 127 | ignored.</p> |
| 128 | |
| 129 | <p>The LSB does specify a <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html>list of command line |
| 130 | utilities</a>:</p> |
| 131 | |
| 132 | <blockquote><b> |
| 133 | ar at awk batch bc chfn chsh col cpio crontab df dmesg du echo egrep |
| 134 | fgrep file fuser gettext grep groupadd groupdel groupmod groups |
| 135 | gunzip gzip hostname install install_initd ipcrm ipcs killall lpr ls |
| 136 | lsb_release m4 md5sum mknod mktemp more mount msgfmt newgrp od passwd |
| 137 | patch pidof remove_initd renice sed sendmail seq sh shutdown su sync |
| 138 | tar umount useradd userdel usermod xargs zcat |
| 139 | </b></blockquote> |
| 140 | |
| 141 | <p>Where posix specifies one of those commands, LSB's deltas tend to be |
| 142 | accomodations for broken tool versions which aren't up to date with the |
| 143 | standard 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> |
| 144 | for examples.)</p> |
| 145 | |
| 146 | <p>Since we've already committed to using our own judgement to skip bits of |
| 147 | POSIX, and LSB's "judgement" in this regard is purely bug workarounds to declare |
| 148 | various legacy tool implementations "compliant", this means we're mostly |
| 149 | interested in the set of tools that aren't specified in posix at all.</p> |
| 150 | |
| 151 | <p>Of these, gettext and msgfmt are internationalization, install_initd and |
| 152 | remove_initd aren't present on ubuntu 10.04, lpr is out of scope, and |
| 153 | lsb_release is a distro issue (it's a nice command, but the output of |
| 154 | lsb_release -a is the name and version number of the linux distro you're |
| 155 | running, which toybox doesn't know).</p> |
| 156 | |
| 157 | <p>This leaves:</p> |
| 158 | |
| 159 | <blockquote><b> |
| 160 | <span id=lsb> |
| 161 | chfn chsh dmesg egrep fgrep groupadd groupdel groupmod groups |
| 162 | gunzip gzip hostname install killall md5sum |
| 163 | mknod mktemp mount passwd pidof sendmail seq shutdown |
| 164 | su sync tar umount useradd userdel usermod zcat |
| 165 | </span> |
| 166 | </b></blockquote> |
| 167 | |
| 168 | <hr /> |
| 169 | <a name="dev_env"> |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 170 | <h2><a href="#dev_env">Use case: provide a self-hosting development environment</a></h2> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 171 | |
| 172 | <p>The following commands are enough to build the Aboriginal Linux development |
| 173 | environment, boot it to a shell prompt, and build Linux From Scratch 6.8 under |
| 174 | it. (Aboriginal Linux currently uses BusyBox for this, thus provides a |
| 175 | drop-in test environment for toybox. We install both implementations side |
| 176 | by side, redirecting the symlinks a command at a time until the older |
| 177 | package is no longer used, and can be removed.)</p> |
| 178 | |
| 179 | <p>This use case includes running init scripts and other shell scripts, running |
| 180 | configure, make, and install in each package, and providing basic command line |
| 181 | facilities such as a text editor. (It does not include a compiler toolchain or |
| 182 | C library, those are outside the scope of this project.)</p> |
| 183 | |
| 184 | <blockquote><b> |
| 185 | <span id=development> |
| 186 | bzcat cat cp dirname echo env patch rmdir sha1sum sleep sort sync |
| 187 | true uname wc which yes zcat |
| 188 | awk basename bzip2 chmod chown cmp cut date dd diff |
| 189 | egrep expr find grep gzip head hostname id install ln ls |
| 190 | mkdir mktemp mv od readlink rm sed sh tail tar touch tr uniq |
| 191 | wget whoami xargs chgrp comm gunzip less logname man split |
| 192 | tee test time bunzip2 chgrp chroot comm cpio dmesg |
| 193 | dnsdomainname ftpd ftpget ftpput gunzip ifconfig init less |
| 194 | logname losetup man mdev mount mountpoint nc pgrep pkill |
| 195 | pwd route split stat switch_root tac umount vi |
| 196 | </span> |
| 197 | </b></blockquote> |
| 198 | |
| 199 | <p>Note: Aboriginal Linux installs bash 2.05b as #!/bin/sh and its scripts |
| 200 | require bash extensions not present in shells such as busybox ash. |
| 201 | This means that toysh needs to supply several bash extensions _and_ work |
| 202 | when called under the name "bash".</p> |
| 203 | |
Rob Landley | 8fe1814 | 2014-10-07 14:11:54 -0500 | [diff] [blame^] | 204 | <p>The <a href=http://landley.net/aboriginal>Aboriginal Linux</a> |
| 205 | self-bootstrapping build still uses the following busybox commands, |
| 206 | not yet supplied by toybox:</p. |
| 207 | |
| 208 | <blockquote><p> |
| 209 | ash awk bunzip2 bzip2 dd diff expr fdisk ftpd ftpget ftpput gunzip |
| 210 | gzip less man pgrep ping pkill ps route sed sh sha512sum tar test tr unxz vi |
| 211 | wget xzcat zcat</p></blockquote> |
| 212 | |
| 213 | <p>Many of those are in "pending". Most of the archive commands are needed |
| 214 | because busybox tar doesn't call external versions. The remaining "difficult" |
| 215 | commands are vi, awk, and ash.</p> |
| 216 | |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 217 | <hr /> |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 218 | <h2><a name=android /><a href="#android">Use case: Replacing Android Toolbox</a></h2> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 219 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 220 | <p>Android has a policy against GPL in userspace, so even though BusyBox |
| 221 | predates Android by many years, they couldn't use it. Instead they grabbed |
| 222 | an old version of ash and implemented their own command line utility set |
| 223 | called "toolbox".</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 224 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 225 | <p>Toolbox doesn't have its own repository, instead it's part of Android's |
| 226 | <a href=https://android.googlesource.com/platform/system/core>system/core |
| 227 | git repository</a> (this analysis looked at commit 51ccef27cab58).</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 228 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 229 | <h3>Toolbox commands:</h3> |
| 230 | |
| 231 | <p>According to core/toolbox/Android.mk the toolbox directory builds the |
| 232 | following commands:</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 233 | |
| 234 | <blockquote><b> |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 235 | ls mount cat ps kill ln insmod rmmod lsmod ifconfig setconsole |
| 236 | rm mkdir rmdir reboot getevent sendevent date wipe sync umount |
| 237 | start stop notify cmp dmesg route hd dd df getprop setprop watchprops |
| 238 | log sleep renice printenv smd chmod chown newfs_msdos netstat ioctl |
| 239 | mv schedtop top iftop id uptime vmstat nandread ionice touch lsof md5 r |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 240 | cp du grep watchdogd |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 241 | </b></blockquote> |
| 242 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 243 | <p>If selinux is enabled, you also get:</p> |
| 244 | <blockquote><b> |
| 245 | getenforce setenforce chcon restorecon runcon getsebool setsebool load_policy |
| 246 | </b></blockquote> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 247 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 248 | <p>The Android.mk file also refers to dynarray.c and toolbox.c as library |
| 249 | code. This leaves the following apparently unused C files in toolbox/*.c, each |
| 250 | of which has a command_main() function and seems to implement a standalone |
| 251 | command:</p> |
| 252 | |
| 253 | <blockquote><b> |
| 254 | alarm exists lsusb readtty rotatefb setkey syren |
| 255 | </b></blockquote> |
| 256 | |
| 257 | <h3>Command shell (ash)</h3> |
| 258 | |
| 259 | <p>The core/sh subdirectory contains a fork of ash 1.17, and sucks in |
| 260 | liblinenoise to provide command line history/editing.</p> |
| 261 | |
| 262 | <h3>Other Android core commands</h3> |
| 263 | |
| 264 | <p>Other than the toolbox and sh directories, the currently interesting |
| 265 | subdirectories in the core repository are fs_mgr, gpttool, init, |
| 266 | logcat, logwrapper, mkbootimg, netcfg, run-as, and sdcard.</p> |
| 267 | |
| 268 | <ul> |
| 269 | <li><b>fs_mgr</b> - subset of mount</li> |
| 270 | <li><b>gpttool</b> - subset of fdisk</li> |
| 271 | <li><b>init</b> - Android's PID 1</li> |
| 272 | <li><b>logcat</b> - read android log format</li> |
| 273 | <li><b>logwrapper</b> - redirect stdio to android log</li> |
| 274 | <li><b>mkbootimg</b> - create signed boot image</li> |
| 275 | <li><b>netcfg</b> - network configuration (sucks in libnetutils)</li> |
| 276 | <li><b>run-as</b> - subset of sudo</li> |
| 277 | <li><b>sdcard</b> - FUSE wrapper to squash UID/GID/permissions to what FAT supports.</li> |
| 278 | </ul> |
| 279 | |
| 280 | <p>Almost all of these reinvent an existing wheel with less functionality and a |
| 281 | different user interface. We may want to provide that interface, but |
| 282 | implementing the full commands (mount, fdisk, init, ifconfig with dhcp, |
| 283 | and sudo) come first.</p> |
| 284 | |
| 285 | <p>Although logcat/logwrapper also reinvent a wheel, Android did so in the |
| 286 | kernel and these provide an interface to that.</p> |
| 287 | |
| 288 | <p>Also, gpttool and mkbootimg are install tools, and sdcard looks like a |
| 289 | testing tool. These aren't a priority if android wants to use its own |
| 290 | bespoke code to install itself.</p> |
| 291 | |
| 292 | <h3>Analysis</h3> |
| 293 | |
| 294 | <p>For reference, combining everything listed above, we get:</p> |
| 295 | |
| 296 | <blockquote><b> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 297 | alarm ash cat chcon chmod chown cmp cp date dd df dmesg du exists fs_mgr |
| 298 | getenforce |
| 299 | getevent getprop getsebool gpttool grep hd id ifconfig iftop init insmod ioctl |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 300 | ionice kill ln load_policy log logcat logwrapper ls lsmod lsof lsusb md5 |
| 301 | mkbootimg mkdir mount mv nandread netcfg netstat newfs_msdos notify printenv |
| 302 | ps r readtty reboot renice restorecon rm rmdir rmmod rotatefb route run-as |
| 303 | runcon schedtop sdcard sendevent setconsole setenforce setkey setprop setsebool |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 304 | sleep smd start stop sync syren top touch umount uptime vmstat watchdogd |
| 305 | watchprops wipe |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 306 | </b></blockquote> |
| 307 | |
| 308 | <p>We may eventually implement all of that, but for toybox 1.0 we need to |
| 309 | focus a bit. For our first pass, let's ignore selinux, strip out the "unlisted" |
| 310 | commands except lsusb, and grab just logcat and logwrapper from the "core" |
| 311 | commands (since the rest have some full/standard version providing that |
| 312 | functionality, which we can implement a shim interface for later).</p> |
| 313 | |
| 314 | <p>This means toybox should implement:</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 315 | <blockquote><b> |
| 316 | <span id=toolbox> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 317 | cat chmod chown cmp cp date dd df dmesg du getevent getprop grep hd id ifconfig |
| 318 | iftop insmod ioctl ionice kill ln log logcat logwrapper ls lsmod lsof lsusb md5 |
| 319 | mkdir mount mv nandread |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 320 | netstat newfs_msdos notify printenv ps r reboot renice rm rmdir rmmod route |
| 321 | schedtop sendevent setconsole setprop sleep smd start stop sync top touch |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 322 | umount uptime vmstat watchprops watchdogd wipe |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 323 | </span> |
Rob Landley | c26ca6e | 2013-01-31 04:05:56 -0600 | [diff] [blame] | 324 | </b></blockquote> |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 325 | |
| 326 | <p>The following Toolbox commands are already covered in previous |
| 327 | sections of this analysis:</p> |
| 328 | |
| 329 | <blockquote><b> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 330 | cat chmod chown cmp cp date dd df dmesg du grep id ifconfig insmod kill ln ls |
| 331 | lsmod mkdir mount mv ps renice rm rmdir rmmod route sleep sync top touch umount |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 332 | </b></blockquote> |
| 333 | |
| 334 | <p>Which leaves the following commands as new from Toolbox:</p> |
| 335 | |
| 336 | <blockquote><b> |
| 337 | getevent getprop hd iftop ioctl ionice log lsof nandread netstat |
| 338 | newfs_msdos notify printenv r reboot schedtop sendevent setconsole |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 339 | setprop smd start stop top uptime vmstat watchprops watchdogd wipe |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 340 | </b></blockquote> |
| 341 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 342 | <hr /><a name=klibc /> |
Rob Landley | 934b2d3 | 2013-05-10 18:54:14 -0500 | [diff] [blame] | 343 | <h2>klibc:</h2> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 344 | |
| 345 | <p>Long ago some kernel developers came up with a project called |
| 346 | <a href=http://en.wikipedia.org/wiki/Klibc>klibc</a>. |
| 347 | After a decade of development it still has no web page or HOWTO, |
| 348 | and nobody's quite sure if the license is BSD or GPL. It inexplicably |
| 349 | <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 |
| 350 | replacement.</p> |
| 351 | |
| 352 | <p>In addition to a C library even less capable than bionic (obsoleted by |
| 353 | musl), klibc builds a random assortment of executables to run init scripts |
| 354 | with. There's no multiplexer command, these are individual executables:</p> |
| 355 | |
| 356 | <blockquote><p> |
| 357 | cat chroot cpio dd dmesg false fixdep fstype gunzip gzip halt ipconfig kill |
| 358 | kinit ln losetup ls minips mkdir mkfifo mknodes |
| 359 | mksyntax mount mv nfsmount nuke pivot_root poweroff readlink reboot resume |
| 360 | run-init sh sha1hash sleep sync true umount uname zcat |
| 361 | </p></blockquote> |
| 362 | |
| 363 | <p>To get that list, build klibc according to the instructions (I |
| 364 | <a href=http://landley.net/notes-2013.html#23-01-2013>looked at</a> version |
| 365 | 2.0.2 and did cd klibc-*; ln -s /output/of/kernel/make/headers_install |
| 366 | linux; make) then <b>echo $(for i in $(find . -type f); do file $i | grep -q |
| 367 | executable && basename $i; done | grep -v '[.]g$' | sort -u)</b> to find |
| 368 | executables, then eliminated the *.so files and *.shared duplicates.</p> |
| 369 | |
| 370 | <p>Some of those binaries are build-time tools that don't get installed, |
| 371 | which removes mknodes, mksyntax, sha1hash, and fixdep from the list. |
| 372 | (And sha1hash is just an unpolished sha1sum anyway.)</p> |
| 373 | |
| 374 | <p>The run-init command is more commonly called switch_root, nuke is just |
| 375 | "rm -rf -- $@", and minips is more commonly called "ps". I'm not doing aliases |
| 376 | for the oddball names.</p> |
| 377 | |
| 378 | <p>Yet more stale forks of dash and gzip sucked in here (see "dubious |
| 379 | license terms" above), adding nothing to the other projects we've looked at. |
| 380 | But we still need sh, gunzip, gzip, and zcat to replace this package.</p> |
| 381 | |
| 382 | <p>By the time I did the analysis toybox already had cat, chroot, dmesg, false, |
| 383 | kill, ln, losetup, ls, mkdir, mkfifo, readlink, rm, switch_root, sleep, sync, |
| 384 | true, and uname.</p> |
| 385 | |
| 386 | <p>The low hanging fruit is cpio, dd, ps, mv, and pivot_root.</p> |
| 387 | |
| 388 | <p>The "kinit" command is another gratuitous rename, it's init running as PID 1. |
| 389 | The halt, poweroff, and reboot commands work with it.</p> |
| 390 | |
| 391 | <p>I've got mount and umount queued up already, fstype and nfsmount go with |
| 392 | those. (And probably smbmount and p9mount, but this hasn't got one. Those |
| 393 | are all about querying for login credentials, probably workable into the |
| 394 | base mount command.)</p> |
| 395 | |
| 396 | <p>The ipconfig command here has a built in dhcp client, so it's ifconfig |
| 397 | and dhcpcd and maybe some other stuff.</p> |
| 398 | |
| 399 | <p>The resume command is... weird. It finds a swap partition and reads data |
| 400 | from it into a /proc file, something the kernel is capable of doing itself. |
| 401 | (Even though the klibc author |
| 402 | <a href=http://www.zytor.com/pipermail/klibc/2006-June/001748.html>attempted |
| 403 | to remove</a> that capability from the kernel, current kernel/power/hibernate.c |
| 404 | still parses "resume=" on the command line). And yet various distros seem to |
| 405 | make use of klibc for this> |
| 406 | Given the history of swsusp/hibernate (and |
| 407 | <a href=http://lwn.net/Articles/333007>TuxOnIce</a> |
| 408 | and <a href=http://lwn.net/Articles/242107>kexec jump</a>) I've lost track |
| 409 | of the current state of the art here. Ah, Documentation/power/userland-swsusp.txt |
| 410 | has the API docs, and <a href=http://suspend.sf.net>here's a better |
| 411 | tool</a>...</p> |
| 412 | |
| 413 | <p>So the list of things actually in klibc are:</p> |
| 414 | |
| 415 | <blockquote><b> |
Rob Landley | c166faf | 2013-09-01 07:25:37 -0500 | [diff] [blame] | 416 | <span id=klibc_cmd> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 417 | cat chroot dmesg false kill ln losetup ls mkdir mkfifo readlink rm switch_root |
| 418 | sleep sync true uname |
| 419 | |
| 420 | cpio dd ps mv pivot_root |
| 421 | mount nfsmount fstype umount |
| 422 | sh gunzip gzip zcat |
| 423 | kinit halt poweroff reboot |
| 424 | ipconfig |
| 425 | resume |
| 426 | </span> |
| 427 | </b></blockquote> |
| 428 | |
| 429 | <hr /> |
Rob Landley | 348a800 | 2014-04-09 07:57:08 -0500 | [diff] [blame] | 430 | <a name=glibc /> |
| 431 | <h2>glibc</h2> |
| 432 | |
| 433 | <p>Rather a lot of command line utilities come bundled with glibc:</p> |
| 434 | |
| 435 | <blockquote><b> |
| 436 | catchsegv getconf getent iconv iconvconfig ldconfig ldd locale localedef |
| 437 | mtrace nscd rpcent rpcinfo tzselect zdump zic |
| 438 | </b></blockquote> |
| 439 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 440 | <p>Of those, musl libc only implements ldd.</p> |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 441 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 442 | <p>catchsegv is a rudimentary debugger, probably out of scope for toybox.</p> |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 443 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 444 | <p>iconv has been <a href="#susv4">previously discussed</a>.</p> |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 445 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 446 | <p>iconvconfig is only relevant if iconv is user-configurable; musl uses a |
| 447 | non-configurable iconv.</p> |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 448 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 449 | <p>getconf is a posix utility which displays several variables from |
| 450 | unistd.h; it probably belongs in the development toolchain.</p> |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 451 | |
| 452 | <p>getent handles retrieving entries from passwd-style databases |
| 453 | (in a rather lame way) and is trivially replacable by grep.</p> |
| 454 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 455 | <p>locale was discussed under <a href=#susv4>posix</a>. |
| 456 | localedef compiles locale definitions, which musl currently does not use.</p> |
| 457 | |
| 458 | <p>mtrace is a perl script to use the malloc debugging that glibc has built-in; |
| 459 | this is not relevant for musl, and would necessarily vary with libc. </p> |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 460 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 461 | <p>nscd is a name service caching daemon, which is not yet relevant for musl. |
| 462 | rpcinfo and rpcent are related to rpc, which musl does not include.</p> |
| 463 | |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 464 | <p>The remaining commands involve glibc's bundled timezone database, |
| 465 | which seems to be derived from the <a href=http://www.iana.org/time-zones>IANA |
| 466 | timezone database</a>. Unless we want to maintain our own fork of the |
| 467 | standards body's database like glibc does, these are of no interest, |
| 468 | but for completeness:</p> |
| 469 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 470 | <p>tzselect outputs a TZ variable correponding to user input. |
| 471 | The documentation does not indicate how to use it in a script, but it seems |
| 472 | that Debian may have done so. |
| 473 | zdump prints current time in each of several timezones, optionally |
| 474 | outputting a great deal of extra information about each timezone. |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 475 | zic converts a description of a timezone to a file in tz format.</p> |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 476 | |
Rob Landley | cbd7752 | 2014-04-12 20:39:33 -0500 | [diff] [blame] | 477 | <p>None of glibc's bundled commands are currently of interest to toybox.</p> |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 478 | |
Isaac Dunham | 931425c | 2014-04-12 17:26:44 -0500 | [diff] [blame] | 479 | </b></blockquote> |
Rob Landley | 348a800 | 2014-04-09 07:57:08 -0500 | [diff] [blame] | 480 | |
| 481 | <hr /> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 482 | <a name=sash /> |
| 483 | <h2>Stand-Alone Shell</h2> |
| 484 | |
| 485 | <p>Wikipedia has <a href=http://en.wikipedia.org/wiki/Stand-alone_shell>a good |
| 486 | summary of sash</a>, with links. The original Stand-Alone Shell project reached |
| 487 | a stopping point, and then <a href=http://www.baiti.net/sash>"sash plus |
| 488 | patches"</a> extended it a bit further. The result is a megabyte executable |
| 489 | that provides 40 commands.</p> |
| 490 | |
| 491 | <p>Sash is a shell with built-in commands. It doesn't have a multiplexer |
| 492 | command, meaning "sash ls -l" doesn't work (you have to go "sash -c 'ls -l'"). |
| 493 | </p> |
| 494 | |
| 495 | <p>The list of commands can be obtained via building it and doing |
| 496 | "echo help | ./sash | awk '{print $1}' | sed 's/^-//' | xargs echo", which |
| 497 | gives us:</p> |
| 498 | |
| 499 | <blockquote><b> |
| 500 | alias aliasall ar cd chattr chgrp chmod chown cmp cp chroot dd echo ed exec |
| 501 | exit file find grep gunzip gzip help kill losetup losetup ln ls lsattr mkdir |
| 502 | mknod more mount mv pivot_root printenv prompt pwd quit rm rmdir setenv source |
| 503 | sum sync tar touch umask umount unalias where |
| 504 | </b></blockquote> |
| 505 | |
| 506 | <p>Plus sh because it's a shell. A dozen or so commands can only sanely be |
| 507 | implemented as shell builtins (alias aliasall cd exec exit prompt quit setenv |
| 508 | source umask unalias), where is an alias for which, and at triage time toybox |
| 509 | already has chgrp, chmod, chown, cmp, cp, chroot, echo, help, kill, losetup, |
| 510 | ln, ls, mkdir, mknod, printenv, pwd, rm, rmdir, sync, and touch.</p> |
| 511 | |
| 512 | <p>This leaves:</p> |
| 513 | |
| 514 | <blockquote><b> |
| 515 | <span id=sash_cmd> |
| 516 | ar chattr dd ed file find grep gunzip gzip lsattr more mount mv pivot_root |
| 517 | sh sum tar umount |
| 518 | </span> |
| 519 | </b></blockquote> |
| 520 | |
| 521 | <p>(For once, this project doesn't include a fork of gzip, instead |
| 522 | it sucks in -lz from the host.)</p> |
| 523 | |
| 524 | <hr /> |
| 525 | <a name=sbase /> |
| 526 | <h2>sbase:</h2> |
| 527 | |
| 528 | <p>It's <a href=http://git.suckless.org/sbase>on suckless</a>. So far it's |
| 529 | implemented:</p> |
| 530 | |
| 531 | <blockquote><p> |
Rob Landley | c166faf | 2013-09-01 07:25:37 -0500 | [diff] [blame] | 532 | <span id=sbase_cmd> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 533 | basename cat chmod chown cksum cmp cp date dirname echo false fold grep head |
| 534 | kill ln ls mc mkdir mkfifo mv nl nohup pwd rm seq sleep sort tail tee test |
| 535 | touch true tty uname uniq wc yes |
| 536 | </span> |
| 537 | </p></blockquote> |
| 538 | |
| 539 | <p>And has a TODO list:</p> |
| 540 | |
| 541 | <blockquote><p> |
Rob Landley | c166faf | 2013-09-01 07:25:37 -0500 | [diff] [blame] | 542 | <span id=sbase_cmd> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 543 | cal chgrp chvt comm cut df diff du env expand expr id md5sum nice paste |
| 544 | printenv printf readlink rmdir seq sha1sum split sync test tr unexpand unlink |
| 545 | who |
| 546 | </span> |
| 547 | </p></blockquote> |
| 548 | |
| 549 | <p>At triage time, of the first list I still need to do: fold grep mc mv nl. Of |
| 550 | the second list: diff expr paste printf split test tr unexpand who.</p> |
| 551 | |
| 552 | <hr /> |
| 553 | <a name=s6 /> |
| 554 | <h2>s6</h2> |
| 555 | |
| 556 | <p>The website <a href=http://skarnet.org/software/>skarnet</a> has a bunch |
| 557 | of small utilities as part of something called "s6". This includes the |
| 558 | <a href=http://skarnet.org/software/s6-portable-utils>s6-portabile-utils</a> |
| 559 | and the <a href=http://skarnet.org/software/s6-linux-utils>s6-linux-utils</a>. |
| 560 | </p> |
| 561 | |
| 562 | <p>Both packages rely on multiple bespoke external libraries without which |
| 563 | they can't compile. The source is completely uncommented and doesn't wrap at |
| 564 | 80 characters. Doing a find for *.c files brings up the following commands:</p> |
| 565 | |
| 566 | <blockquote><b> |
| 567 | <span id=s6> |
| 568 | basename cat chmod chown chroot clock cut devd dirname echo env expr false |
| 569 | format-filter freeramdisk grep halt head hiercopy hostname linkname ln |
| 570 | logwatch ls maximumtime memoryhog mkdir mkfifo mount nice nuke pause |
| 571 | pivotchroot poweroff printenv quote quote-filter reboot rename rmrf sleep |
| 572 | sort swapoff swapon sync tail test touch true umount uniquename unquote |
| 573 | unquote-filter update-symlinks |
| 574 | </span> |
| 575 | </b></blockquote> |
| 576 | |
| 577 | <p>Triage: memoryhog isn't even listed on the website nor does it have |
| 578 | a documentation file, clock seems like a subset |
| 579 | of date, devd is some sort of netlink wrapper that spawns its command line |
| 580 | every time it gets a message (maybe this is meant to implement part of |
| 581 | udev/mdev?), format-filter is sort of awk's '{print $2}' function split out |
| 582 | into its own command, hiercopy a subset of "cp -r", maximumtime is something |
| 583 | I implemented as a shell script (more/timeout.sh in Aboriginal Linux), |
| 584 | nuke isn't the same as klibc (this one's "kill SIG -1" only with hardwared |
| 585 | SIG options), pause is a program that literally waits to be killed (I |
| 586 | generally sleep 999999999 which is a little over 30 years), |
| 587 | pivotchroot is a subset of switch_root, rmrf is rm -rf...</p> |
| 588 | |
| 589 | <p>I see "nuke" resurface, and if "rmrf" wasn't also here I might think |
| 590 | klibc had a point.</b> |
| 591 | |
| 592 | <blockquote> |
| 593 | basename cat chmod chown chroot cut dirname echo env expr false |
| 594 | freeramdisk grep halt head hostname linkname ln |
| 595 | logwatch ls mkdir mkfifo mount nice |
| 596 | pivotchroot poweroff printenv quote quote-filter reboot rename sleep |
| 597 | sort swapoff swapon sync tail test touch true umount uniquename unquote |
| 598 | unquote-filter update-symlinks |
| 599 | </blockquote> |
| 600 | |
| 601 | |
| 602 | <hr /> |
| 603 | <a name=nash /> |
| 604 | <h2>nash:</h2> |
| 605 | |
| 606 | <p>Red Hat's nash was part of its "mkinitrd" package, replacement for a shell |
| 607 | and utilities on the boot floppy back in the 1990's (the same general idea |
| 608 | as BusyBox, developed independently). Red Hat discontinued nash development |
| 609 | in 2010, replacing it with dracut (which collects together existing packages, |
| 610 | including busybox).</p> |
| 611 | |
| 612 | <p>I couldn't figure out how to beat source code out of |
| 613 | <a href=http://pkgs.fedoraproject.org/git/mkinitrd>Fedora's current git</a> |
| 614 | repository. The last release version that used it was Fedora Core 12 |
| 615 | which 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> |
| 616 | that can be unwound with "rpm2cpio mkinitrd.src.rpm | cpio -i -d -H newc |
| 617 | --no-absolute-filenames" and in there is a mkinitrd-6.0.93.tar.bz2 which |
| 618 | has the source.</p> |
| 619 | |
| 620 | <p>In addition to being a bit like a command shell, the nash man page lists the |
| 621 | following commands:</p> |
| 622 | |
| 623 | <blockquote><p> |
| 624 | access echo find losetup mkdevices mkdir mknod mkdmnod mkrootdev mount |
| 625 | pivot_root readlink raidautorun setquiet showlabels sleep switchroot umount |
| 626 | </p></blockquote> |
| 627 | |
| 628 | <p>Oddly, the only occurrence of the string pivot_root in the nash source code |
| 629 | is in the man page, the command isn't there. (It seems to have been removed |
| 630 | when the underscoreless switchroot went in.)</p> |
| 631 | |
| 632 | <p>A more complete list seems to be the handlers[] array in nash.c:</p> |
| 633 | |
| 634 | <blockquote><p> |
| 635 | access buildEnv cat cond cp daemonize dm echo exec exit find kernelopt |
| 636 | loadDrivers loadpolicy mkchardevs mkblktab mkblkdevs mkdir mkdmnod mknod |
| 637 | mkrootdev mount netname network null plymouth hotplug killplug losetup |
| 638 | ln ls raidautorun readlink resume resolveDevice rmparts setDeviceEnv |
| 639 | setquiet setuproot showelfinterp showlabels sleep stabilized status switchroot |
| 640 | umount waitdev |
| 641 | </p></blockquote> |
| 642 | |
| 643 | <p>This list is nuts: "plymouth" is an alias for "null" which is basically |
| 644 | "true" (which thie above list doesn't have). Things like buildEnv and |
| 645 | loadDrivers are bespoke Red Hat behavior that might as well be hardwired in |
| 646 | to nash's main() without being called.</p> |
| 647 | |
| 648 | <p>Instead of eliminating items |
| 649 | from the list with an explanation for each, I'm just going to cherry pick |
| 650 | a few: the device mapper (dm, raidautorun) is probably interesting, |
| 651 | hotplug (may be obsolete due to kernel changes that now load firmware |
| 652 | directly), and another "resume" ala klibc.</p> |
| 653 | |
| 654 | <p>But mostly: I don't care about this one. And neither does Red Hat anymore.</p> |
| 655 | |
Rob Landley | ca04c7f | 2013-03-27 22:34:28 -0500 | [diff] [blame] | 656 | <p>Verdict: ignore</p> |
| 657 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 658 | <hr /> |
| 659 | <a name=beastiebox /> |
| 660 | <h2>Beastiebox</h2> |
| 661 | |
| 662 | <p>Back in 2008, the BSD guys vented some busybox-envy |
| 663 | <a href=http://beastiebox.sourceforge.net>on sourceforge</a>. Then stopped. |
| 664 | Their repository is still in CVS, hasn't been touched in years, it's a giant |
| 665 | hairball of existing code sucked together. (The web page says the author |
| 666 | is aware of crunchgen, but decided to do this by hand anyway. This is not |
| 667 | a collection of new code, it's a katamari of existing code rolled up in a |
| 668 | ball.)</p> |
| 669 | |
| 670 | <p>Combining the set of commands listed on the web page with the set of |
| 671 | man pages in the source gives us:</P> |
| 672 | |
| 673 | <blockquote><p> |
| 674 | [ cat chmod cp csh date df disklabel dmesg echo ex fdisk fsck fsck_ffs getty |
| 675 | halt hostname ifconfig init kill less lesskey ln login ls lv mksh more mount |
| 676 | mount_ffs mv pfctl ping poweroff ps reboot rm route sed sh stty sysctl tar test |
| 677 | traceroute umount vi wiconfig |
| 678 | </p></blockquote> |
| 679 | |
| 680 | <p>Apparently lv is the missing link ed and vi, copyright 1982-1997 (do not |
| 681 | want), ex is another obsolete vi mode, lesskey is "used to |
| 682 | specify a set of key bindings to be used with less", and csh is a shell they |
| 683 | sucked in, [ is an alias for test. Several more bsd-isms that don't have Linux |
| 684 | equivalents (even in the ubuntu "install this package" search) are |
| 685 | disklabel, fsck_ffs, mount_ffs, and pfctl. And wiconfig is a wavelan interface |
| 686 | network card driver utility. Subtracting all that and the commands toybox |
| 687 | already implements at triage time, we get:</p> |
| 688 | |
| 689 | <blockquote><p> |
| 690 | <span id=beastiebox_cmd> |
| 691 | fdisk fsck getty halt ifconfig init kill less mksh more mount mv ping poweroff |
| 692 | ps reboot route sed sh stty sysctl tar test traceroute umount vi |
| 693 | </span> |
| 694 | </p></blockquote> |
| 695 | |
| 696 | <p>Not a hugely interesting list, but eh.</p> |
| 697 | |
Rob Landley | ca04c7f | 2013-03-27 22:34:28 -0500 | [diff] [blame] | 698 | <p>Verdict: ignore</p> |
| 699 | |
| 700 | <hr /> |
| 701 | <a name=BsdBox /> |
| 702 | <h2>BsdBox</h2> |
| 703 | |
| 704 | <p>Somebody decided to do a <a href=https://wiki.freebsd.org/AdrianChadd/BsdBox>multicall binary for freebsd</a>.</p> |
| 705 | |
| 706 | <p>They based it on crunchgen, a tool that glues existing programs together |
| 707 | into an archive and uses the name to execute the right one. It has no |
| 708 | simplification or code sharing benefits whatsoever, it's basically an |
| 709 | archiver that produces executables.</p> |
| 710 | |
| 711 | <p>That's about where I stopped reading.</p> |
| 712 | |
| 713 | <p>Verdict: ignore.</p> |
| 714 | |
| 715 | <hr /> |
| 716 | <a name=slowaris /> |
| 717 | <h2>OpenSolaris Busybox</h2> |
| 718 | |
| 719 | <p>Somebody <a href=http://hub.opensolaris.org/bin/view/Project+busybox/>wrote |
| 720 | a wiki page</a> saying that Busybox for OpenSolaris would be a good idea.</p> |
| 721 | |
| 722 | <p>The corresponding "files" tab is an auto-generated stub. The project never |
| 723 | even got as far as suggesting commands to include before Oracle discontinued |
| 724 | OpenSolaris.</p> |
| 725 | |
| 726 | <p>Verdict: ignore.</p> |
| 727 | |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 728 | <hr /> |
| 729 | <h2>Requests:</h2> |
| 730 | |
Rob Landley | 8fe1814 | 2014-10-07 14:11:54 -0500 | [diff] [blame^] | 731 | <p>The following additional commands have been requested (and often submitted) |
| 732 | by various users:</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 733 | <blockquote><b> |
| 734 | <span id=request> |
Rob Landley | 64b6319 | 2013-12-31 09:01:32 -0600 | [diff] [blame] | 735 | dig freeramdisk getty halt hexdump hwclock klogd modprobe ping ping6 pivot_root |
Rob Landley | ca04c7f | 2013-03-27 22:34:28 -0500 | [diff] [blame] | 736 | poweroff readahead rev sfdisk sudo syslogd taskset telnet telnetd tracepath |
| 737 | traceroute unzip usleep vconfig zip free login modinfo unshare netcat help w |
Rob Landley | 64b6319 | 2013-12-31 09:01:32 -0600 | [diff] [blame] | 738 | ntpd iwconfig iwlist rdate |
Rob Landley | 7dbb982 | 2014-02-21 22:24:02 -0600 | [diff] [blame] | 739 | dos2unix unix2dos catv clear |
| 740 | pmap realpath setsid timeout truncate |
| 741 | mkswap swapon swapoff |
| 742 | count oneit fstype |
| 743 | acpi blkid eject pwdx |
Rob Landley | 8fe1814 | 2014-10-07 14:11:54 -0500 | [diff] [blame^] | 744 | sulogin rfkill bootchartd |
| 745 | arp makedevs sysctl killall5 crond crontab deluser last mkpasswd watch |
| 746 | ipaddr iplink iproute blockdev rpm2cpio arping brctl dumpleases fsck |
| 747 | tcpsvd tftpd |
| 748 | factor fallocate fsfreeze inotifyd lspci nbd-client partprobe strings |
| 749 | |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 750 | </span> |
| 751 | </b></blockquote> |
| 752 | |
| 753 | <!-- #include "footer.html" --> |
| 754 | |