view www/about.html @ 1572:da1bf31ed322 draft

Tweak the "ignoring return value" fortify workaround for readlinkat. We zero the buffer and if the link read fails that's left alone, so it's ok for the symlink not to be there. Unfortunately, typecasting the return value to (void) doesn't shut up gcc, and having an if(); with the semicolon on the same line doesn't shut up llvm. (The semicolon on a new line would, but C does not have significant whitespace and I'm not going to humor llvm if it plans to start.) So far, empty curly brackets consistently get the warning to shut up.
author Rob Landley <rob@landley.net>
date Mon, 24 Nov 2014 17:23:23 -0600
parents 24d21baf52a3
children
line wrap: on
line source

<html><head><title>What is toybox?</title>
<!--#include file="header.html" -->

<h2><a name="what" />What is toybox?</h2>

<p>Toybox combines the most common Linux command line utilities together into
a single <a href=license.html>BSD-licensed</a> executable. It's simple, small, fast, and reasonably
standards-compliant (<a href=http://opengroup.org/onlinepubs/9699919799>POSIX-2008</a> and <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0>LSB 4.1</a>).</p>

<p>Toybox's 1.0 release goal is to turn generic Android into a
development environment capable of compiling <a href=http://www.linuxfromscratch.org>Linux From Scratch</a>.
A tiny system <a href=/aboriginal>built from</a> just toybox, linux, <a href=http://musl-libc.org>a C library</a>, and a C compiler (such as LLVM or
gcc 4.2.1+binutils 2.17) should be
able to rebuild itself from source code without needing any other packages.</p>

<b><h2><a name="status" />What commands are implemented in toybox?</h2></b>

<p>The current list of commands implemented by toybox is on the
<a href=status.html>status page</a>, which is updated each release.
There is also <a href=roadmap.html>roadmap</a> listing all planned commands for the
1.0 release.</p>

<p>In general, configuring toybox for "defconfig" enables all the commands
compete enough to be useful.  Configuring "allyesconfig" enables partially
implemented commands as well, along with debugging features.</p>

<p>Several toybox commands can do things other vesions can't.  For example
the toybox "df" isn't confused by initramfs the way other df implementations
are. (If initramfs is visible, df shows it like any other mount point.)</p>

<b><h3>Command Shell</h3></b>
<p>The toybox shell (toysh) aims to be a reasonable bash replacement.  It
implements the "sh" and "toysh" commands, plus the built-in commands "cd" and
"exit".  This is the largest single sub-project in toybox.</p>

<p>The following additional commands may be built into the shell (but not as
separate executables): cd, exit, if, while, for, function, fg, bg, jobs, source,
<a href="http://opengroup.org/onlinepubs/9699919799/utilities/alias.html">alias</a>,
export, set, unset, read, trap, and exec.  (Note: not done yet.)</p>

</ul>

<h2><a name="commands" />Which commands are planned?</h2>

<p>The toybox <a href=todo.txt>todo list</a> mentions many potential commands
which may be added to this project.  (Whether that file is readable by anybody
but the project's maintainer is open to debate.)  The roadmap wiki in the
nav bar has a more human readable version.</p>

<p>The criteria for a toybox 1.0 release is that a system built from just the
Linux kernel, toybox, C library (such as uClibc), and a compiler (such as
tinycc) can rebuild itself from source code.</p>

<b><h3>Relevant Standards</h3></b>

<p>Most commands are implemented according to
<a href=http://opengroup.org/onlinepubs/9699919799/idx/utilities.html>The
Single Unix Specification version 4</a> where applicable. This does not mean
that toybox is implementing every SUSv4 utility: some such as SCCS and ed are
obsolete, while others such as c99 are outside the scope of the project.
Toybox also isn't implementing full internationalization support: it should be
8-bit clean and handle UTF-8, but otherwise we leave this to X11 and higher
layers. And some things (like $CDPATH support in "cd") await a good
explanation of why to bother with them. (The standard provides an important
frame of reference, but is not infallable set of commandments to be blindly
obeyed.)</p>

<p>The other major sources of commands are the Linux man pages, and testing
the behavior of existing commands (although not generally looking at their
source code), including the commands in Android's toolbox. SUSv4 does not
include many basic commands such as "mount", "init", and "mke2fs", which are
kind of nice to have.</p>

<b><h2><a name="downloads" />Download</h2></b>

<p>This project is maintained as a mercurial archive.  To get a copy of the
current development version, either use mercurial (hg clone
http://landley.net/hg/toybox) or click on one of the zip/gz/bz2 links
at the top of the <a href=/hg/toybox>mercurial archive browser</a> page to get
an archive of the appropriate version.  Click
<a href="/hg/toybox?cmd=tags">tags</a> to see all the tagged release
versions ("tip" is the current development version).</p>

<p>The maintainer's <a href=/notes.html>development log</a> and the project's
<a href=http://lists.landley.net/listinfo.cgi/toybox-landley.net>mailing
list</a> are also good ways to track what's going on with the project.</p>

<!--
<b><h2><a name="why">Why do toybox?</h2></b>

<p>Because smart phones are replacing the PC, and Android must become
self-hosting to beat the iPhone in establishing the new standard.</p>

<p>This is the third such major transition in computer history:
(mainframe-&gt;minicomputer-&gt;microcomputer-&gt;smartphone).
The mainframe was replaced by the minicomputer, which was replaced by
the microcomputer (renamed the "personal" computer to make clear you could
access porn through it), which is being replaced by the smartphone. Nobody
needed to wait for printouts from a big computer in another building when they
could use a little one down the hall.  Then nobody needed the big computer
down the hall when they had a little one on their desk.  Now nobody needs the
big computer on their desk when they have a little one in their pocket.</p>

<p>The new platform displaces the old when it becomes natively self hosting.
Often they leverage existing technology: just as early microcmputers used
teletypes and televisions for output, phones can use
<a href=http://us.toshiba.com/accessory/PA3575U-1PRP>USB docking stations</a>
to access a bigger screen, mouse, keyboard, speakers, etc. Plugging a phone into
USB even charges the battery. But to use the phone as a development
workstation, it needs more software, such as a Posix command line, a native
compiler, and drivers for the USB peripherals.</p>

<p>The new platform also eventually weans itself off of its dominant language.
Dalvik is to Android what ROM Basic was to the PC: something it must
eventually outgrow. Thus toybox is native C code, not Java.</p>

<b><h3>So why aren't self-hosting smartphones attracting more attention?</h3></b>

<p>Because most people are focusing on the legacy platforms, not on the new
stuff. Existing multi-billion dollar industries are getting evicted from their
decades-old established niche, and are trying to spin the transition as an
opportunity instead of a forced march onto reservations. When elephants run
from mice, it's easier to notice the elephants.</p>

<p>History's our guide here: the previous technology always gets kicked up into
the "server space", moving from "the thing you stood in front of waiting for
your printout" to "that thing you sometimes accessed remotely via the new
computer". This time around they're calling it "the cloud" and pretending it's
a big deal; it's really just a beowulf cluster with a layer of
virtualization/containerization software implementing hotplug hardware and
live migration to provide cheap
commodity processing power that dominant players (like amazon) literally
give away for free. These old machines become secondary, only
accessed through the new machines users now directly interact with.</p>

<p>Since there's only one server space, the mainframe ate the minicomputer in
the 1980's (when DEC went under), and this time around "the cloud" seems to be
eating the mainframe (IBM ain't happy). The inevitable consolidation leads
to drama, but doesn't mean much in the long run.</p>

<p><a href=http://landley.net/notes-2012.html#12-07-2012>For more
on this topic...</a></p>

<b><h3><a name="why_android">Why is Android important?</h2></b>

<p>Major hardware transitions introduce
<a href=http://landley.net/notes-2011.html#26-06-2011>new software
standards</a> which are extremely sticky once
established, due to network effects.</p>

<p>Last time around, the PC was stuck with
a proprietary operating system (DOS/Windows) which is still dominant on that
hardware platform's descendants 30 years later. This time around, the choice
is between Android (a Linux derivative) and iPhone (a closed BSD fork ala
SunOS, put out by a company already engaged in multiple aggressive IP lawsuits).
The main difference between Apple and Microsoft is that Apple is competent.</p>

<p>And yes, it has to be Android, it won't be vanilla Linux any time soon,
for three reasons. 1) <a href=http://landley.net/notes-2010.html#13-08-2010>Open
Source can't do user interfaces</a> for about the same reason wikipedia can't
write a novel, 2) it's too late to the
party (a 5 year headstart is forever in computers), 3) preinstalls matter
(GPLv3 spooked all the hardware vendors, Android has a "no GPL in
userspace" policy which is rigidly enforced).</p>

<p>And "any time soon" is important: attempting to displace an existing
entrenched de-facto standard is what linux has spent the last 20
years trying (and failing) to do on the desktop. Spending another 20
years fighting for less than 1% of the phone market would just be sad.</p>

<b><h3><a name="how_google">How is Google less evil than Apple?</h3></b>

<p>Because Android isn't Google's core business, attaching advertising to large
scale data searches is. Android and Chrome and such are Google's way of
"commoditizing their co-factors" to drive down the price of ingredients
to their core business.</p>

<p>Thus Google is pursuing a commodity market and encouring as many vendors as
possible to participate, not to control the new space but to hold it open,
so that its search products are widely available without requiring the
permission of some other monopoly gatekeeper. Apple is attemping to corner the
smartphone market and extract monopoly rents, excluding all
vendors except itself.</p>

<p>So if Google wins we get a commodity market in smartphone/tablet software,
and may be able to open it further in future. If Apple wins we get a proprietary
smartphone/tablet OS with a single monopoly vendor, which is likely to close it
further.</p>

<b><h3>Why not just use BusyBox?</h3></b>

<p>Android can't. Busybox predates android
by many years; if they were ever going to ship it they'd have done so by
now. Android has had a "No GPL in Userspace" policy ever since GPLv3
came out (before the first Android phone shipped), and they mean it.</p>

<p>Toybox also has a better design and simpler code. I did both
and this is the one I enjoy banging on; I tried to contribute a few things
to busybox and it was like crawling through a thornbush of #ifdefs. Busybox
development is just no fun anymore.</p>

-->

<b><h2><a name="toycans" />What's the toybox logo image?</h2></b>

<p>It's <a href=toycans-big.jpg>carefully stacked soda cans</a>.  Specifically,
it's a bunch of the original "Coke Zero" and "Pepsi One" cans, circa 2006,
stacked to spell out the binary values of the ascii string "Toybox", with
null terminator at the bottom.  (The big picture's on it's side because
the camera was held sideways to get a better shot.)</p>

<p>No, it's not photoshopped, I actually had these cans until a coworker
who Totally Did Not Get It <sup><font size=-3><a href=http://www.timesys.com>tm</a></font></sup> threw them out one day after I'd gone home,
thinking they were recycling.  (I still have two of each kind, but
Pepsi One seems discontinued and Coke Zero switched its can color
from black to grey, presumably in celebration.  It was fun while it lasted...)</p>

<!--#include file="footer.html" -->