| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 1 | <!--#include file="header.html" --> | 
|  | 2 |  | 
| Rob Landley | 2704834 | 2013-08-18 14:24:59 -0500 | [diff] [blame^] | 3 | <p><h1><a name="style" /><a href="#style">Code style</a></h1></p> | 
| Rob Landley | e7c9a6d | 2012-02-28 06:34:09 -0600 | [diff] [blame] | 4 |  | 
|  | 5 | <p>The primary goal of toybox is _simple_ code. Keeping the code small is | 
| Rob Landley | ed6ed62 | 2012-03-06 20:49:03 -0600 | [diff] [blame] | 6 | second, with speed and lots of features coming in somewhere after that. | 
|  | 7 | (For more on that, see the <a href=design.html>design</a> page.)</p> | 
| Rob Landley | e7c9a6d | 2012-02-28 06:34:09 -0600 | [diff] [blame] | 8 |  | 
|  | 9 | <p>A simple implementation usually takes up fewer lines of source code, | 
|  | 10 | meaning more code can fit on the screen at once, meaning the programmer can | 
|  | 11 | see more of it on the screen and thus keep more if in their head at once. | 
| Rob Landley | ed6ed62 | 2012-03-06 20:49:03 -0600 | [diff] [blame] | 12 | This helps code auditing and thus reduces bugs. That said, sometimes being | 
|  | 13 | more explicit is preferable to being clever enough to outsmart yourself: | 
|  | 14 | don't be so terse your code is unreadable.</p> | 
| Rob Landley | 5a0660f | 2007-12-27 21:36:44 -0600 | [diff] [blame] | 15 |  | 
| Rob Landley | 7aa651a | 2012-11-13 17:14:08 -0600 | [diff] [blame] | 16 | <p>Toybox source uses two spaces per indentation level, and wraps at 80 | 
|  | 17 | columns.</p> | 
| Rob Landley | 5a0660f | 2007-12-27 21:36:44 -0600 | [diff] [blame] | 18 |  | 
|  | 19 | <p>Gotos are allowed for error handling, and for breaking out of | 
|  | 20 | nested loops.  In general, a goto should only jump forward (not back), and | 
|  | 21 | should either jump to the end of an outer loop, or to error handling code | 
|  | 22 | at the end of the function.  Goto labels are never indented: they override the | 
|  | 23 | block structure of the file.  Putting them at the left edge makes them easy | 
|  | 24 | to spot as overrides to the normal flow of control, which they are.</p> | 
|  | 25 |  | 
| Rob Landley | 2704834 | 2013-08-18 14:24:59 -0500 | [diff] [blame^] | 26 | <p><h1><a name="building" /><a href="#building">Building Toybox</a></h1></p> | 
| Rob Landley | e7c9a6d | 2012-02-28 06:34:09 -0600 | [diff] [blame] | 27 |  | 
|  | 28 | <p>Toybox is configured using the Kconfig language pioneered by the Linux | 
|  | 29 | kernel, and adopted by many other projects (uClibc, OpenEmbedded, etc). | 
|  | 30 | This generates a ".config" file containing the selected options, which | 
| Rob Landley | 7aa651a | 2012-11-13 17:14:08 -0600 | [diff] [blame] | 31 | controls which features are included when compiling toybox.</p> | 
| Rob Landley | e7c9a6d | 2012-02-28 06:34:09 -0600 | [diff] [blame] | 32 |  | 
|  | 33 | <p>Each configuration option has a default value. The defaults indicate the | 
|  | 34 | "maximum sane configuration", I.E. if the feature defaults to "n" then it | 
|  | 35 | either isn't complete or is a special-purpose option (such as debugging | 
|  | 36 | code) that isn't intended for general purpose use.</p> | 
|  | 37 |  | 
|  | 38 | <p>The standard build invocation is:</p> | 
|  | 39 |  | 
|  | 40 | <ul> | 
|  | 41 | <li>make defconfig #(or menuconfig)</li> | 
|  | 42 | <li>make</li> | 
|  | 43 | <li>make install</li> | 
|  | 44 | </ul> | 
|  | 45 |  | 
|  | 46 | <p>Type "make help" to see all available build options.</p> | 
|  | 47 |  | 
|  | 48 | <p>The file "configure" contains a number of environment variable definitions | 
|  | 49 | which influence the build, such as specifying which compiler to use or where | 
|  | 50 | to install the resulting binaries. This file is included by the build, but | 
|  | 51 | accepts existing definitions of the environment variables, so it may be sourced | 
|  | 52 | or modified by the developer before building and the definitions exported | 
|  | 53 | to the environment will take precedence.</p> | 
|  | 54 |  | 
|  | 55 | <p>(To clarify: "configure" describes the build and installation environment, | 
|  | 56 | ".config" lists the features selected by defconfig/menuconfig.)</p> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 57 |  | 
| Rob Landley | 2704834 | 2013-08-18 14:24:59 -0500 | [diff] [blame^] | 58 | <p><h1><a name="running"><a href="#running">Running a command</a></h1></p> | 
|  | 59 |  | 
|  | 60 | <h2>main</h2> | 
|  | 61 |  | 
|  | 62 | <p>The toybox main() function is at the end of main.c at the top level. It has | 
|  | 63 | two possible codepaths, only one of which is configured into any given build | 
|  | 64 | of toybox.</p> | 
|  | 65 |  | 
|  | 66 | <p>If CONFIG_SINGLE is selected, toybox is configured to contain only a single | 
|  | 67 | command, so most of the normal setup can be skipped. In this case the | 
|  | 68 | multiplexer isn't used, instead main() calls toy_singleinit() (also in main.c) | 
|  | 69 | to set up global state and parse command line arguments, calls the command's | 
|  | 70 | main function out of toy_list (in the CONFIG_SINGLE case the array has a single entry, no need to search), and if the function returns instead of exiting | 
|  | 71 | it flushes stdout (detecting error) and returns toys.exitval.</p> | 
|  | 72 |  | 
|  | 73 | <p>When CONFIG_SINGLE is not selected, main() uses basename() to find the | 
|  | 74 | name it was run as, shifts its argument list one to the right so it lines up | 
|  | 75 | with where the multiplexer function expects it, and calls toybox_main(). This | 
|  | 76 | leverages the multiplexer command's infrastructure to find and run the | 
|  | 77 | appropriate command. (A command name starting with "toybox" will | 
|  | 78 | recursively call toybox_main(); you can go "./toybox toybox toybox toybox ls" | 
|  | 79 | if you want to...)</p> | 
|  | 80 |  | 
|  | 81 | <h2>toybox_main</h2> | 
|  | 82 |  | 
|  | 83 | <p>The toybox_main() function is also in main,c. It handles a possible | 
|  | 84 | --help option ("toybox --help ls"), prints the list of available commands if no | 
|  | 85 | arguments were provided to the multiplexer (or with full path names if any | 
|  | 86 | other option is provided before a command name, ala "toybox --list"). | 
|  | 87 | Otherwise it calls toy_exec() on its argument list.</p> | 
|  | 88 |  | 
|  | 89 | <p>Note that the multiplexer is the first entry in toy_list (the rest of the | 
|  | 90 | list is sorted alphabetically to allow binary search), so toybox_main can | 
|  | 91 | cheat and just grab the first entry to quickly set up its context without | 
|  | 92 | searching. Since all command names go through the multiplexer at least once | 
|  | 93 | in the non-TOYBOX_SINGLE case, this avoids a redundant search of | 
|  | 94 | the list.</p> | 
|  | 95 |  | 
|  | 96 | <p>The toy_exec() function is also in main.c. It performs toy_find() to | 
|  | 97 | perform a binary search on the toy_list array to look up the command's | 
|  | 98 | entry by name and saves it in the global variable which, calls toy_init() | 
|  | 99 | to parse command line arguments and set up global state (using which->options), | 
|  | 100 | and calls the appropriate command's main() function (which->toy_main). On | 
|  | 101 | return it flushes all pending ansi FILE * I/O, detects if stdout had an | 
|  | 102 | error, and then calls xexit() (which uses toys.exitval).</p> | 
|  | 103 |  | 
|  | 104 | <p><h1><a name="infrastructure" /><a href="#infrastructure">Infrastructure</a></h1></p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 105 |  | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 106 | <p>The toybox source code is in following directories:</p> | 
|  | 107 | <ul> | 
|  | 108 | <li>The <a href="#top">top level directory</a> contains the file main.c (were | 
|  | 109 | execution starts), the header file toys.h (included by every command), and | 
|  | 110 | other global infrastructure.</li> | 
|  | 111 | <li>The <a href="#lib">lib directory</a> contains common functions shared by | 
| Rob Landley | c8d0da5 | 2012-07-15 17:47:08 -0500 | [diff] [blame] | 112 | multiple commands:</li> | 
|  | 113 | <ul> | 
|  | 114 | <li><a href="#lib_lib">lib/lib.c</a></li> | 
|  | 115 | <li><a href="#lib_llist">lib/llist.c</a></li> | 
|  | 116 | <li><a href="#lib_args">lib/args.c</a></li> | 
|  | 117 | <li><a href="#lib_dirtree">lib/dirtree.c</a></li> | 
|  | 118 | </ul> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 119 | <li>The <a href="#toys">toys directory</a> contains the C files implementating | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 120 | each command. Currently it contains three subdirectories: | 
|  | 121 | posix, lsb, and other.</li> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 122 | <li>The <a href="#scripts">scripts directory</a> contains the build and | 
|  | 123 | test infrastructure.</li> | 
|  | 124 | <li>The <a href="#kconfig">kconfig directory</a> contains the configuration | 
|  | 125 | infrastructure implementing menuconfig (copied from the Linux kernel).</li> | 
|  | 126 | <li>The <a href="#generated">generated directory</a> contains intermediate | 
|  | 127 | files generated from other parts of the source code.</li> | 
|  | 128 | </ul> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 129 |  | 
| Rob Landley | bbe500e | 2012-02-26 21:53:15 -0600 | [diff] [blame] | 130 | <a name="adding" /> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 131 | <p><h1>Adding a new command</h1></p> | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 132 | <p>To add a new command to toybox, add a C file implementing that command under | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 133 | the toys directory.  No other files need to be modified; the build extracts | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 134 | all the information it needs (such as command line arguments) from specially | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 135 | formatted comments and macros in the C file.  (See the description of the | 
| Rob Landley | e7c9a6d | 2012-02-28 06:34:09 -0600 | [diff] [blame] | 136 | <a href="#generated">"generated" directory</a> for details.)</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 137 |  | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 138 | <p>Currently there are three subdirectories under "toys", one for commands | 
|  | 139 | defined by the POSIX standard, one for commands defined by the Linux Standard | 
|  | 140 | Base, and one for all other commands. (This is just for developer convenience | 
|  | 141 | sorting them, the directories are otherwise functionally identical.)</p> | 
|  | 142 |  | 
|  | 143 | <p>An easy way to start a new command is copy the file "toys/other/hello.c" to | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 144 | the name of the new command, and modify this copy to implement the new command. | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 145 | This file is an example command meant to be used as a "skeleton" for | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 146 | new commands (more or less by turning every instance of "hello" into the | 
|  | 147 | name of your command, updating the command line arguments, globals, and | 
|  | 148 | help data,  and then filling out its "main" function with code that does | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 149 | something interesting).  It provides examples of all the build infrastructure | 
|  | 150 | (including optional elements like command line argument parsing and global | 
|  | 151 | variables that a "hello world" program doesn't strictly need).</p> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 152 |  | 
|  | 153 | <p>Here's a checklist of steps to turn hello.c into another command:</p> | 
|  | 154 |  | 
|  | 155 | <ul> | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 156 | <li><p>First "cd toys/other" and "cp hello.c yourcommand.c".  Note that the name | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 157 | of this file is significant, it's the name of the new command you're adding | 
|  | 158 | to toybox.  Open your new file in your favorite editor.</p></li> | 
|  | 159 |  | 
|  | 160 | <li><p>Change the one line comment at the top of the file (currently | 
|  | 161 | "hello.c - A hello world program") to describe your new file.</p></li> | 
|  | 162 |  | 
|  | 163 | <li><p>Change the copyright notice to your name, email, and the current | 
|  | 164 | year.</p></li> | 
|  | 165 |  | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 166 | <li><p>Give a URL to the relevant standards document, where applicable. | 
|  | 167 | (Sample links to SUSv4 and LSB are provided, feel free to link to other | 
|  | 168 | documentation or standards as appropriate.)</p></li> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 169 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 170 | <li><p>Update the USE_YOURCOMMAND(NEWTOY(yourcommand,"blah",0)) line. | 
|  | 171 | The NEWTOY macro fills out this command's <a href="#toy_list">toy_list</a> | 
|  | 172 | structure.  The arguments to the NEWTOY macro are:</p> | 
|  | 173 |  | 
|  | 174 | <ol> | 
|  | 175 | <li><p>the name used to run your command</p></li> | 
|  | 176 | <li><p>the command line argument <a href="#lib_args">option parsing string</a> (NULL if none)</p></li> | 
|  | 177 | <li><p>a bitfield of TOYFLAG values | 
|  | 178 | (defined in toys.h) providing additional information such as where your | 
|  | 179 | command should be installed on a running system, whether to blank umask | 
|  | 180 | before running, whether or not the command must run as root (and thus should | 
|  | 181 | retain root access if installed SUID), and so on.</p></li> | 
|  | 182 | </ol> | 
|  | 183 | </li> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 184 |  | 
|  | 185 | <li><p>Change the kconfig data (from "config YOURCOMMAND" to the end of the | 
|  | 186 | comment block) to supply your command's configuration and help | 
|  | 187 | information.  The uppper case config symbols are used by menuconfig, and are | 
|  | 188 | also what the CFG_ and USE_() macros are generated from (see [TODO]).  The | 
|  | 189 | help information here is used by menuconfig, and also by the "help" command to | 
|  | 190 | describe your new command.  (See [TODO] for details.)  By convention, | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 191 | unfinished commands default to "n" and finished commands default to "y", | 
|  | 192 | so "make defconfig" selects all finished commands.  (Note, "finished" means | 
|  | 193 | "ready to be used", not that it'll never change again.)<p> | 
|  | 194 |  | 
|  | 195 | <p>Each help block should start with a "usage: yourcommand" line explaining | 
|  | 196 | any command line arguments added by this config option.  The "help" command | 
|  | 197 | outputs this text, and scripts/config2help.c in the build infrastructure | 
|  | 198 | collates these usage lines for commands with multiple configuration | 
|  | 199 | options when producing generated/help.h.</p> | 
|  | 200 | </li> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 201 |  | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 202 | <li><p>Change the "#define FOR_hello" line to "#define FOR_yourcommand" right | 
|  | 203 | before the "#include <toys.h>". (This selects the appropriate FLAG_ macros and | 
|  | 204 | does a "#define TT this.yourcommand" so you can access the global variables | 
|  | 205 | out of the space-saving union of structures. If you aren't using any command | 
|  | 206 | flag bits and aren't defining a GLOBAL block, you can delete this line.)</p></li> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 207 |  | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 208 | <li><p>Update the GLOBALS() macro to contain your command's global | 
|  | 209 | variables. If your command has no global variables, delete this macro.</p> | 
|  | 210 |  | 
|  | 211 | <p>Variables in the GLOBALS() block are are stored in a space saving | 
|  | 212 | <a href="#toy_union">union of structures</a> format, which may be accessed | 
|  | 213 | using the TT macro as if TT were a global structure (so TT.membername). | 
|  | 214 | If you specified two-character command line arguments in | 
|  | 215 | NEWTOY(), the first few global variables will be initialized by the automatic | 
|  | 216 | argument parsing logic, and the type and order of these variables must | 
|  | 217 | correspond to the arguments specified in NEWTOY(). | 
|  | 218 | (See <a href="#lib_args">lib/args.c</a> for details.)</p></li> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 219 |  | 
|  | 220 | <li><p>Rename hello_main() to yourcommand_main().  This is the main() function | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 221 | where execution of your command starts. Your command line options are | 
|  | 222 | already sorted into this.optflags, this.optargs, this.optc, and the GLOBALS() | 
|  | 223 | as appropriate by the time this function is called. (See | 
|  | 224 | <a href="#lib_args">get_optflags()</a> for details.</p></li> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 225 | </ul> | 
|  | 226 |  | 
|  | 227 | <p><a name="top" /><h2>Top level directory.</h2></p> | 
|  | 228 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 229 | <p>This directory contains global infrastructure.</p> | 
|  | 230 |  | 
|  | 231 | <h3>toys.h</h3> | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 232 | <p>Each command #includes "toys.h" as part of its standard prolog. It | 
|  | 233 | may "#define FOR_commandname" before doing so to get some extra entries | 
|  | 234 | specific to this command.</p> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 235 |  | 
|  | 236 | <p>This file sucks in most of the commonly used standard #includes, so | 
|  | 237 | individual files can just #include "toys.h" and not have to worry about | 
|  | 238 | stdargs.h and so on.  Individual commands still need to #include | 
|  | 239 | special-purpose headers that may not be present on all systems (and thus would | 
|  | 240 | prevent toybox from building that command on such a system with that command | 
|  | 241 | enabled).  Examples include regex support, any "linux/" or "asm/" headers, mtab | 
|  | 242 | support (mntent.h and sys/mount.h), and so on.</p> | 
|  | 243 |  | 
|  | 244 | <p>The toys.h header also defines structures for most of the global variables | 
|  | 245 | provided to each command by toybox_main().  These are described in | 
|  | 246 | detail in the description for main.c, where they are initialized.</p> | 
|  | 247 |  | 
|  | 248 | <p>The global variables are grouped into structures (and a union) for space | 
|  | 249 | savings, to more easily track the amount of memory consumed by them, | 
|  | 250 | so that they may be automatically cleared/initialized as needed, and so | 
|  | 251 | that access to global variables is more easily distinguished from access to | 
|  | 252 | local variables.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 253 |  | 
|  | 254 | <h3>main.c</h3> | 
|  | 255 | <p>Contains the main() function where execution starts, plus | 
|  | 256 | common infrastructure to initialize global variables and select which command | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 257 | to run.  The "toybox" multiplexer command also lives here.  (This is the | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 258 | only command defined outside of the toys directory.)</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 259 |  | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 260 | <p>Execution starts in main() which trims any path off of the first command | 
|  | 261 | name and calls toybox_main(), which calls toy_exec(), which calls toy_find() | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 262 | and toy_init() before calling the appropriate command's function from | 
|  | 263 | toy_list[] (via toys.which->toy_main()). | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 264 | If the command is "toybox", execution recurses into toybox_main(), otherwise | 
|  | 265 | the call goes to the appropriate commandname_main() from a C file in the toys | 
|  | 266 | directory.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 267 |  | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 268 | <p>The following global variables are defined in main.c:</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 269 | <ul> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 270 | <a name="toy_list" /> | 
|  | 271 | <li><p><b>struct toy_list toy_list[]</b> - array describing all the | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 272 | commands currently configured into toybox.  The first entry (toy_list[0]) is | 
|  | 273 | for the "toybox" multiplexer command, which runs all the other built-in commands | 
|  | 274 | without symlinks by using its first argument as the name of the command to | 
|  | 275 | run and the rest as that command's argument list (ala "./toybox echo hello"). | 
|  | 276 | The remaining entries are the commands in alphabetical order (for efficient | 
|  | 277 | binary search).</p> | 
|  | 278 |  | 
|  | 279 | <p>This is a read-only array initialized at compile time by | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 280 | defining macros and #including generated/newtoys.h.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 281 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 282 | <p>Members of struct toy_list (defined in "toys.h") include:</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 283 | <ul> | 
|  | 284 | <li><p>char *<b>name</b> - the name of this command.</p></li> | 
|  | 285 | <li><p>void (*<b>toy_main</b>)(void) - function pointer to run this | 
|  | 286 | command.</p></li> | 
|  | 287 | <li><p>char *<b>options</b> - command line option string (used by | 
|  | 288 | get_optflags() in lib/args.c to intialize toys.optflags, toys.optargs, and | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 289 | entries in the toy's GLOBALS struct).  When this is NULL, no option | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 290 | parsing is done before calling toy_main().</p></li> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 291 | <li><p>int <b>flags</b> - Behavior flags for this command.  The following flags are currently understood:</p> | 
|  | 292 |  | 
|  | 293 | <ul> | 
|  | 294 | <li><b>TOYFLAG_USR</b> - Install this command under /usr</li> | 
|  | 295 | <li><b>TOYFLAG_BIN</b> - Install this command under /bin</li> | 
|  | 296 | <li><b>TOYFLAG_SBIN</b> - Install this command under /sbin</li> | 
|  | 297 | <li><b>TOYFLAG_NOFORK</b> - This command can be used as a shell builtin.</li> | 
|  | 298 | <li><b>TOYFLAG_UMASK</b> - Call umask(0) before running this command.</li> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 299 | <li><b>TOYFLAG_STAYROOT</b> - Don't drop permissions for this command if toybox is installed SUID root.</li> | 
|  | 300 | <li><b>TOYFLAG_NEEDROOT</b> - This command cannot function unless run with root access.</li> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 301 | </ul> | 
|  | 302 | <br> | 
|  | 303 |  | 
|  | 304 | <p>These flags are combined with | (or).  For example, to install a command | 
|  | 305 | in /usr/bin, or together TOYFLAG_USR|TOYFLAG_BIN.</p> | 
|  | 306 | </ul> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 307 | </li> | 
|  | 308 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 309 | <li><p><b>struct toy_context toys</b> - global structure containing information | 
|  | 310 | common to all commands, initializd by toy_init() and defined in "toys.h". | 
|  | 311 | Members of this structure include:</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 312 | <ul> | 
|  | 313 | <li><p>struct toy_list *<b>which</b> - a pointer to this command's toy_list | 
|  | 314 | structure.  Mostly used to grab the name of the running command | 
|  | 315 | (toys->which.name).</p> | 
|  | 316 | </li> | 
|  | 317 | <li><p>int <b>exitval</b> - Exit value of this command.  Defaults to zero.  The | 
|  | 318 | error_exit() functions will return 1 if this is zero, otherwise they'll | 
|  | 319 | return this value.</p></li> | 
|  | 320 | <li><p>char **<b>argv</b> - "raw" command line options, I.E. the original | 
|  | 321 | unmodified string array passed in to main().  Note that modifying this changes | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 322 | "ps" output, and is not recommended.  This array is null terminated; a NULL | 
|  | 323 | entry indicates the end of the array.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 324 | <p>Most commands don't use this field, instead the use optargs, optflags, | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 325 | and the fields in the GLOBALS struct initialized by get_optflags().</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 326 | </li> | 
|  | 327 | <li><p>unsigned <b>optflags</b> - Command line option flags, set by | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 328 | <a href="#lib_args">get_optflags()</a>.  Indicates which of the command line options listed in | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 329 | toys->which.options occurred this time.</p> | 
|  | 330 |  | 
|  | 331 | <p>The rightmost command line argument listed in toys->which.options sets bit | 
|  | 332 | 1, the next one sets bit 2, and so on.  This means the bits are set in the same | 
|  | 333 | order the binary digits would be listed if typed out as a string.  For example, | 
|  | 334 | the option string "abcd" would parse the command line "-c" to set optflags to 2, | 
|  | 335 | "-a" would set optflags to 8, and "-bd" would set optflags to 6 (4|2).</p> | 
|  | 336 |  | 
|  | 337 | <p>Only letters are relevant to optflags.  In the string "a*b:c#d", d=1, c=2, | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 338 | b=4, a=8.  Punctuation after a letter initializes global variables at the | 
|  | 339 | start of the GLOBALS() block (see <a href="#toy_union">union toy_union this</a> | 
|  | 340 | for details).</p> | 
|  | 341 |  | 
|  | 342 | <p>The build infrastructure creates FLAG_ macros for each option letter, | 
|  | 343 | corresponding to the bit position, so you can check (toys.optflags & FLAG_x) | 
|  | 344 | to see if a flag was specified. (The correct set of FLAG_ macros is selected | 
|  | 345 | by defining FOR_mycommand before #including toys.h. The macros live in | 
|  | 346 | toys/globals.h which is generated by scripts/make.sh.)</p> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 347 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 348 | <p>For more information on option parsing, see <a href="#lib_args">get_optflags()</a>.</p> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 349 |  | 
|  | 350 | </li> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 351 | <li><p>char **<b>optargs</b> - Null terminated array of arguments left over | 
|  | 352 | after get_optflags() removed all the ones it understood.  Note: optarg[0] is | 
|  | 353 | the first argument, not the command name.  Use toys.which->name for the command | 
|  | 354 | name.</p></li> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 355 | <li><p>int <b>optc</b> - Optarg count, equivalent to argc but for | 
|  | 356 | optargs[].<p></li> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 357 | <li><p>int <b>exithelp</b> - Whether error_exit() should print a usage message | 
|  | 358 | via help_main() before exiting.  (True during option parsing, defaults to | 
|  | 359 | false afterwards.)</p></li> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 360 | </ul> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 361 |  | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 362 | <a name="toy_union" /> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 363 | <li><p><b>union toy_union this</b> - Union of structures containing each | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 364 | command's global variables.</p> | 
|  | 365 |  | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 366 | <p>Global variables are useful: they reduce the overhead of passing extra | 
|  | 367 | command line arguments between functions, they conveniently start prezeroed to | 
|  | 368 | save initialization costs, and the command line argument parsing infrastructure | 
|  | 369 | can also initialize global variables with its results.</p> | 
|  | 370 |  | 
|  | 371 | <p>But since each toybox process can only run one command at a time, allocating | 
|  | 372 | space for global variables belonging to other commands you aren't currently | 
|  | 373 | running would be wasteful.</p> | 
|  | 374 |  | 
|  | 375 | <p>Toybox handles this by encapsulating each command's global variables in | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 376 | a structure, and declaring a union of those structures with a single global | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 377 | instance (called "this").  The GLOBALS() macro contains the global | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 378 | variables that should go in the current command's global structure.  Each | 
|  | 379 | variable can then be accessed as "this.commandname.varname". | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 380 | If you #defined FOR_commandname before including toys.h, the macro TT is | 
|  | 381 | #defined to this.commandname so the variable can then be accessed as | 
|  | 382 | "TT.variable".  See toys/hello.c for an example.</p> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 383 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 384 | <p>A command that needs global variables should declare a structure to | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 385 | contain them all, and add that structure to this union.  A command should never | 
|  | 386 | declare global variables outside of this, because such global variables would | 
|  | 387 | allocate memory when running other commands that don't use those global | 
|  | 388 | variables.</p> | 
|  | 389 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 390 | <p>The first few fields of this structure can be intialized by <a href="#lib_args">get_optargs()</a>, | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 391 | as specified by the options field off this command's toy_list entry.  See | 
|  | 392 | the get_optargs() description in lib/args.c for details.</p> | 
|  | 393 | </li> | 
|  | 394 |  | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 395 | <li><b>char toybuf[4096]</b> - a common scratch space buffer so | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 396 | commands don't need to allocate their own.  Any command is free to use this, | 
|  | 397 | and it should never be directly referenced by functions in lib/ (although | 
|  | 398 | commands are free to pass toybuf in to a library function as an argument).</li> | 
|  | 399 | </ul> | 
|  | 400 |  | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 401 | <p>The following functions are defined in main.c:</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 402 | <ul> | 
|  | 403 | <li><p>struct toy_list *<b>toy_find</b>(char *name) - Return the toy_list | 
|  | 404 | structure for this command name, or NULL if not found.</p></li> | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 405 | <li><p>void <b>toy_init</b>(struct toy_list *which, char *argv[]) - fill out | 
|  | 406 | the global toys structure, calling get_optargs() if necessary.</p></li> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 407 | <li><p>void <b>toy_exec</b>(char *argv[]) - Run a built-in command with | 
|  | 408 | arguments.</p> | 
|  | 409 | <p>Calls toy_find() on argv[0] (which must be just a command name | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 410 | without path).  Returns if it can't find this command, otherwise calls | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 411 | toy_init(), toys->which.toy_main(), and exit() instead of returning.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 412 |  | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 413 | <p>Use the library function xexec() to fall back to external executables | 
|  | 414 | in $PATH if toy_exec() can't find a built-in command.  Note that toy_exec() | 
|  | 415 | does not strip paths before searching for a command, so "./command" will | 
|  | 416 | never match an internal command.</li> | 
|  | 417 |  | 
|  | 418 | <li><p>void <b>toybox_main</b>(void) - the main function for the multiplexer | 
|  | 419 | command (I.E. "toybox").  Given a command name as its first argument, calls | 
|  | 420 | toy_exec() on its arguments.  With no arguments, it lists available commands. | 
|  | 421 | If the first argument starts with "-" it lists each command with its default | 
|  | 422 | install path prepended.</p></li> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 423 |  | 
|  | 424 | </ul> | 
|  | 425 |  | 
|  | 426 | <h3>Config.in</h3> | 
|  | 427 |  | 
|  | 428 | <p>Top level configuration file in a stylized variant of | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 429 | <a href=http://kernel.org/doc/Documentation/kbuild/kconfig-language.txt>kconfig</a> format.  Includes generated/Config.in.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 430 |  | 
|  | 431 | <p>These files are directly used by "make menuconfig" to select which commands | 
|  | 432 | to build into toybox (thus generating a .config file), and by | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 433 | scripts/config2help.py to create generated/help.h.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 434 |  | 
|  | 435 | <h3>Temporary files:</h3> | 
|  | 436 |  | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 437 | <p>There is one temporary file in the top level source directory:</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 438 | <ul> | 
|  | 439 | <li><p><b>.config</b> - Configuration file generated by kconfig, indicating | 
|  | 440 | which commands (and options to commands) are currently enabled.  Used | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 441 | to make generated/config.h and determine which toys/*.c files to build.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 442 |  | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 443 | <p>You can create a human readable "miniconfig" version of this file using | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 444 | <a href=http://landley.net/aboriginal/new_platform.html#miniconfig>these | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 445 | instructions</a>.</p> | 
|  | 446 | </li> | 
|  | 447 | </ul> | 
|  | 448 |  | 
| Rob Landley | e7c9a6d | 2012-02-28 06:34:09 -0600 | [diff] [blame] | 449 | <a name="generated" /> | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 450 | <p>The "generated/" directory contains files generated from other source code | 
|  | 451 | in toybox.  All of these files can be recreated by the build system, although | 
|  | 452 | some (such as generated/help.h) are shipped in release versions to reduce | 
|  | 453 | environmental dependencies (I.E. so you don't need python on your build | 
|  | 454 | system).</p> | 
|  | 455 |  | 
|  | 456 | <ul> | 
|  | 457 | <li><p><b>generated/config.h</b> - list of CFG_SYMBOL and USE_SYMBOL() macros, | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 458 | generated from .config by a sed invocation in the top level Makefile.</p> | 
|  | 459 |  | 
|  | 460 | <p>CFG_SYMBOL is a comple time constant set to 1 for enabled symbols and 0 for | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 461 | disabled symbols.  This allows the use of normal if() statements to remove | 
|  | 462 | code at compile time via the optimizer's dead code elimination (which removes | 
|  | 463 | from the binary any code that cannot be reached).  This saves space without | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 464 | cluttering the code with #ifdefs or leading to configuration dependent build | 
|  | 465 | breaks.  (See the 1992 Usenix paper | 
| Rob Landley | b6063de | 2012-01-29 13:54:13 -0600 | [diff] [blame] | 466 | <a href=http://doc.cat-v.org/henry_spencer/ifdef_considered_harmful.pdf>#ifdef | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 467 | Considered Harmful</a> for more information.)</p> | 
|  | 468 |  | 
|  | 469 | <p>USE_SYMBOL(code) evaluates to the code in parentheses when the symbol | 
|  | 470 | is enabled, and nothing when the symbol is disabled.  This can be used | 
|  | 471 | for things like varargs or variable declarations which can't always be | 
| Rob Landley | 6882ee8 | 2008-02-12 18:41:34 -0600 | [diff] [blame] | 472 | eliminated by a simple test on CFG_SYMBOL.  Note that | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 473 | (unlike CFG_SYMBOL) this is really just a variant of #ifdef, and can | 
|  | 474 | still result in configuration dependent build breaks.  Use with caution.</p> | 
|  | 475 | </li> | 
|  | 476 | </ul> | 
|  | 477 |  | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 478 | <p><h2>Directory toys/</h2></p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 479 |  | 
|  | 480 | <h3>toys/Config.in</h3> | 
|  | 481 |  | 
|  | 482 | <p>Included from the top level Config.in, contains one or more | 
|  | 483 | configuration entries for each command.</p> | 
|  | 484 |  | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 485 | <p>Each command has a configuration entry matching the command name (although | 
|  | 486 | configuration symbols are uppercase and command names are lower case). | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 487 | Options to commands start with the command name followed by an underscore and | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 488 | the option name.  Global options are attached to the "toybox" command, | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 489 | and thus use the prefix "TOYBOX_".  This organization is used by | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 490 | scripts/cfg2files to select which toys/*.c files to compile for a given | 
|  | 491 | .config.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 492 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 493 | <p>A command with multiple names (or multiple similar commands implemented in | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 494 | the same .c file) should have config symbols prefixed with the name of their | 
|  | 495 | C file.  I.E. config symbol prefixes are NEWTOY() names.  If OLDTOY() names | 
|  | 496 | have config symbols they're options (symbols with an underscore and suffix) | 
|  | 497 | to the NEWTOY() name.  (See toys/toylist.h)</p> | 
|  | 498 |  | 
|  | 499 | <h3>toys/toylist.h</h3> | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 500 | <p>The first half of this file prototypes all the structures to hold | 
| Rob Landley | da09b7f | 2007-12-20 06:29:59 -0600 | [diff] [blame] | 501 | global variables for each command, and puts them in toy_union.  These | 
|  | 502 | prototypes are only included if the macro NEWTOY isn't defined (in which | 
|  | 503 | case NEWTOY is defined to a default value that produces function | 
|  | 504 | prototypes).</p> | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 505 |  | 
| Rob Landley | da09b7f | 2007-12-20 06:29:59 -0600 | [diff] [blame] | 506 | <p>The second half of this file lists all the commands in alphabetical | 
|  | 507 | order, along with their command line arguments and install location. | 
|  | 508 | Each command has an appropriate configuration guard so only the commands that | 
|  | 509 | are enabled wind up in the list.</p> | 
|  | 510 |  | 
|  | 511 | <p>The first time this header is #included, it defines structures and | 
|  | 512 | produces function prototypes for the commands in the toys directory.</p> | 
|  | 513 |  | 
|  | 514 |  | 
|  | 515 | <p>The first time it's included, it defines structures and produces function | 
|  | 516 | prototypes. | 
|  | 517 | This | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 518 | is used to initialize toy_list in main.c, and later in that file to initialize | 
|  | 519 | NEED_OPTIONS (to figure out whether the command like parsing logic is needed), | 
|  | 520 | and to put the help entries in the right order in toys/help.c.</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 521 |  | 
|  | 522 | <h3>toys/help.h</h3> | 
|  | 523 |  | 
|  | 524 | <p>#defines two help text strings for each command: a single line | 
|  | 525 | command_help and an additinal command_help_long.  This is used by help_main() | 
|  | 526 | in toys/help.c to display help for commands.</p> | 
|  | 527 |  | 
|  | 528 | <p>Although this file is generated from Config.in help entries by | 
|  | 529 | scripts/config2help.py, it's shipped in release tarballs so you don't need | 
|  | 530 | python on the build system.  (If you check code out of source control, or | 
|  | 531 | modify Config.in, then you'll need python installed to rebuild it.)</p> | 
|  | 532 |  | 
|  | 533 | <p>This file contains help for all commands, regardless of current | 
|  | 534 | configuration, but only the currently enabled ones are entered into help_data[] | 
|  | 535 | in toys/help.c.</p> | 
|  | 536 |  | 
| Rob Landley | 137bf34 | 2012-03-09 08:33:57 -0600 | [diff] [blame] | 537 | <a name="lib"> | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 538 | <h2>Directory lib/</h2> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 539 |  | 
| Rob Landley | 137bf34 | 2012-03-09 08:33:57 -0600 | [diff] [blame] | 540 | <p>TODO: document lots more here.</p> | 
|  | 541 |  | 
| Rob Landley | c8d0da5 | 2012-07-15 17:47:08 -0500 | [diff] [blame] | 542 | <p>lib: getmountlist(), error_msg/error_exit, xmalloc(), | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 543 | strlcpy(), xexec(), xopen()/xread(), xgetcwd(), xabspath(), find_in_path(), | 
|  | 544 | itoa().</p> | 
|  | 545 |  | 
| Rob Landley | 137bf34 | 2012-03-09 08:33:57 -0600 | [diff] [blame] | 546 | <h3>lib/portability.h</h3> | 
|  | 547 |  | 
|  | 548 | <p>This file is automatically included from the top of toys.h, and smooths | 
|  | 549 | over differences between platforms (hardware targets, compilers, C libraries, | 
|  | 550 | operating systems, etc).</p> | 
|  | 551 |  | 
|  | 552 | <p>This file provides SWAP macros (SWAP_BE16(x) and SWAP_LE32(x) and so on).</p> | 
|  | 553 |  | 
|  | 554 | <p>A macro like SWAP_LE32(x) means "The value in x is stored as a little | 
|  | 555 | endian 32 bit value, so perform the translation to/from whatever the native | 
|  | 556 | 32-bit format is".  You do the swap once on the way in, and once on the way | 
|  | 557 | out. If your target is already little endian, the macro is a NOP.</p> | 
|  | 558 |  | 
|  | 559 | <p>The SWAP macros come in BE and LE each with 16, 32, and 64 bit versions. | 
|  | 560 | In each case, the name of the macro refers to the _external_ representation, | 
|  | 561 | and converts to/from whatever your native representation happens to be (which | 
|  | 562 | can vary depending on what you're currently compiling for).</p> | 
|  | 563 |  | 
| Rob Landley | c8d0da5 | 2012-07-15 17:47:08 -0500 | [diff] [blame] | 564 | <a name="lib_llist"><h3>lib/llist.c</h3> | 
|  | 565 |  | 
|  | 566 | <p>Some generic single and doubly linked list functions, which take | 
|  | 567 | advantage of a couple properties of C:</p> | 
|  | 568 |  | 
|  | 569 | <ul> | 
|  | 570 | <li><p>Structure elements are laid out in memory in the order listed, and | 
|  | 571 | the first element has no padding. This means you can always treat (typecast) | 
|  | 572 | a pointer to a structure as a pointer to the first element of the structure, | 
|  | 573 | even if you don't know anything about the data following it.</p></li> | 
|  | 574 |  | 
|  | 575 | <li><p>An array of length zero at the end of a structure adds no space | 
|  | 576 | to the sizeof() the structure, but if you calculate how much extra space | 
|  | 577 | you want when you malloc() the structure it will be available at the end. | 
|  | 578 | Since C has no bounds checking, this means each struct can have one variable | 
|  | 579 | length array.</p></li> | 
|  | 580 | </ul> | 
|  | 581 |  | 
|  | 582 | <p>Toybox's list structures always have their <b>next</b> pointer as | 
|  | 583 | the first entry of each struct, and singly linked lists end with a NULL pointer. | 
|  | 584 | This allows generic code to traverse such lists without knowing anything | 
|  | 585 | else about the specific structs composing them: if your pointer isn't NULL | 
|  | 586 | typecast it to void ** and dereference once to get the next entry.</p> | 
|  | 587 |  | 
|  | 588 | <p><b>lib/lib.h</b> defines three structure types:</p> | 
|  | 589 | <ul> | 
|  | 590 | <li><p><b>struct string_list</b> - stores a single string (<b>char str[0]</b>), | 
|  | 591 | memory for which is allocated as part of the node. (I.E. llist_traverse(list, | 
|  | 592 | free); can clean up after this type of list.)</p></li> | 
|  | 593 |  | 
|  | 594 | <li><p><b>struct arg_list</b> - stores a pointer to a single string | 
|  | 595 | (<b>char *arg</b>) which is stored in a separate chunk of memory.</p></li> | 
|  | 596 |  | 
|  | 597 | <li><p><b>struct double_list</b> - has a second pointer (<b>struct double_list | 
|  | 598 | *prev</b> along with a <b>char *data</b> for payload.</p></li> | 
|  | 599 | </ul> | 
|  | 600 |  | 
|  | 601 | <b>List Functions</b> | 
|  | 602 |  | 
|  | 603 | <ul> | 
|  | 604 | <li><p>void *<b>llist_pop</b>(void **list) - advances through a list ala | 
|  | 605 | <b>node = llist_pop(&list);</b>  This doesn't modify the list contents, | 
|  | 606 | but does advance the pointer you feed it (which is why you pass the _address_ | 
|  | 607 | of that pointer, not the pointer itself).</p></li> | 
|  | 608 |  | 
|  | 609 | <li><p>void <b>llist_traverse</b>(void *list, void (*using)(void *data)) - | 
|  | 610 | iterate through a list calling a function on each node.</p></li> | 
|  | 611 |  | 
|  | 612 | <li><p>struct double_list *<b>dlist_add</b>(struct double_list **llist, char *data) | 
|  | 613 | - append an entry to a circular linked list. | 
|  | 614 | This function allocates a new struct double_list wrapper and returns the | 
|  | 615 | pointer to the new entry (which you can usually ignore since it's llist->prev, | 
|  | 616 | but if llist was NULL you need it). The argument is the ->data field for the | 
|  | 617 | new node.</p></li> | 
|  | 618 | <ul><li><p>void <b>dlist_add_nomalloc</b>(struct double_list **llist, | 
|  | 619 | struct double_list *new) - append existing struct double_list to | 
|  | 620 | list, does not allocate anything.</p></li></ul> | 
|  | 621 | </ul> | 
|  | 622 |  | 
|  | 623 | <b>Trivia questions:</b> | 
|  | 624 |  | 
|  | 625 | <ul> | 
|  | 626 | <li><p><b>Why do arg_list and double_list contain a char * payload instead of | 
|  | 627 | a void *?</b> - Because you always have to typecast a void * to use it, and | 
|  | 628 | typecasting a char * does no harm. Thus having it default to the most common | 
|  | 629 | pointer type saves a few typecasts (strings are the most common payload), | 
|  | 630 | and doesn't hurt anything otherwise.</p> | 
|  | 631 | </li> | 
|  | 632 |  | 
|  | 633 | <li><p><b>Why do the names ->str, ->arg, and ->data differ?</b> - To force | 
|  | 634 | you to keep track of which one you're using, calling free(node->str) would | 
|  | 635 | be bad, and _failing_ to free(node->arg) leaks memory.</p></li> | 
|  | 636 |  | 
|  | 637 | <li><p><b>Why does llist_pop() take a void * instead of void **?</b> - | 
|  | 638 | because the stupid compiler complains about "type punned pointers" when | 
|  | 639 | you typecast and dereference ont he same line, | 
|  | 640 | due to insane FSF developers hardwiring limitations of their optimizer | 
|  | 641 | into gcc's warning system. Since C automatically typecasts any other | 
|  | 642 | pointer _down_ to a void *, the current code works fine. It's sad that it | 
|  | 643 | won't warn you if you forget the &, but the code crashes pretty quickly in | 
|  | 644 | that case.</p></li> | 
|  | 645 |  | 
|  | 646 | <li><p><b>How do I assemble a singly-linked-list in order?</b> - use | 
|  | 647 | a double_list, dlist_add() your entries, and then break the circle with | 
|  | 648 | <b>list->prev->next = NULL;</b> when done.</li> | 
|  | 649 | </ul> | 
|  | 650 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 651 | <a name="lib_args"><h3>lib/args.c</h3> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 652 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 653 | <p>Toybox's main.c automatically parses command line options before calling the | 
|  | 654 | command's main function.  Option parsing starts in get_optflags(), which stores | 
|  | 655 | results in the global structures "toys" (optflags and optargs) and "this".</p> | 
|  | 656 |  | 
|  | 657 | <p>The option parsing infrastructure stores a bitfield in toys.optflags to | 
|  | 658 | indicate which options the current command line contained.  Arguments | 
|  | 659 | attached to those options are saved into the command's global structure | 
|  | 660 | ("this").  Any remaining command line arguments are collected together into | 
|  | 661 | the null-terminated array toys.optargs, with the length in toys.optc.  (Note | 
|  | 662 | that toys.optargs does not contain the current command name at position zero, | 
|  | 663 | use "toys.which->name" for that.)  The raw command line arguments get_optflags() | 
|  | 664 | parsed are retained unmodified in toys.argv[].</p> | 
|  | 665 |  | 
|  | 666 | <p>Toybox's option parsing logic is controlled by an "optflags" string, using | 
|  | 667 | a format reminiscent of getopt's optargs but has several important differences. | 
|  | 668 | Toybox does not use the getopt() | 
|  | 669 | function out of the C library, get_optflags() is an independent implementation | 
|  | 670 | which doesn't permute the original arguments (and thus doesn't change how the | 
|  | 671 | command is displayed in ps and top), and has many features not present in | 
|  | 672 | libc optargs() (such as the ability to describe long options in the same string | 
|  | 673 | as normal options).</p> | 
|  | 674 |  | 
|  | 675 | <p>Each command's NEWTOY() macro has an optflags string as its middle argument, | 
|  | 676 | which sets toy_list.options for that command to tell get_optflags() what | 
|  | 677 | command line arguments to look for, and what to do with them. | 
|  | 678 | If a command has no option | 
|  | 679 | definition string (I.E. the argument is NULL), option parsing is skipped | 
|  | 680 | for that command, which must look at the raw data in toys.argv to parse its | 
|  | 681 | own arguments.  (If no currently enabled command uses option parsing, | 
|  | 682 | get_optflags() is optimized out of the resulting binary by the compiler's | 
|  | 683 | --gc-sections option.)</p> | 
|  | 684 |  | 
|  | 685 | <p>You don't have to free the option strings, which point into the environment | 
|  | 686 | space (I.E. the string data is not copied).  A TOYFLAG_NOFORK command | 
|  | 687 | that uses the linked list type "*" should free the list objects but not | 
|  | 688 | the data they point to, via "llist_free(TT.mylist, NULL);".  (If it's not | 
|  | 689 | NOFORK, exit() will free all the malloced data anyway unless you want | 
|  | 690 | to implement a CONFIG_TOYBOX_FREE cleanup for it.)</p> | 
|  | 691 |  | 
|  | 692 | <h4>Optflags format string</h4> | 
|  | 693 |  | 
|  | 694 | <p>Note: the optflags option description string format is much more | 
|  | 695 | concisely described by a large comment at the top of lib/args.c.</p> | 
|  | 696 |  | 
|  | 697 | <p>The general theory is that letters set optflags, and punctuation describes | 
|  | 698 | other actions the option parsing logic should take.</p> | 
|  | 699 |  | 
|  | 700 | <p>For example, suppose the command line <b>command -b fruit -d walrus -a 42</b> | 
|  | 701 | is parsed using the optflags string "<b>a#b:c:d</b>".  (I.E. | 
|  | 702 | toys.which->options="a#b:c:d" and argv = ["command", "-b", "fruit", "-d", | 
|  | 703 | "walrus", "-a", "42"]).  When get_optflags() returns, the following data is | 
|  | 704 | available to command_main(): | 
|  | 705 |  | 
|  | 706 | <ul> | 
|  | 707 | <li><p>In <b>struct toys</b>: | 
|  | 708 | <ul> | 
|  | 709 | <li>toys.optflags = 13; // -a = 8 | -b = 4 | -d = 1</li> | 
|  | 710 | <li>toys.optargs[0] = "walrus"; // leftover argument</li> | 
|  | 711 | <li>toys.optargs[1] = NULL; // end of list</li> | 
|  | 712 | <li>toys.optc=1; // there was 1 leftover argument</li> | 
|  | 713 | <li>toys.argv[] = {"-b", "fruit", "-d", "walrus", "-a", "42"}; // The original command line arguments | 
|  | 714 | </ul> | 
|  | 715 | <p></li> | 
|  | 716 |  | 
|  | 717 | <li><p>In <b>union this</b> (treated as <b>long this[]</b>): | 
|  | 718 | <ul> | 
|  | 719 | <li>this[0] = NULL; // -c didn't get an argument this time, so get_optflags() didn't change it and toys_init() zeroed "this" during setup.)</li> | 
|  | 720 | <li>this[1] = (long)"fruit"; // argument to -b</li> | 
|  | 721 | <li>this[2] = 42; // argument to -a</li> | 
|  | 722 | </ul> | 
|  | 723 | </p></li> | 
|  | 724 | </ul> | 
|  | 725 |  | 
|  | 726 | <p>If the command's globals are:</p> | 
|  | 727 |  | 
|  | 728 | <blockquote><pre> | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 729 | GLOBALS( | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 730 | char *c; | 
|  | 731 | char *b; | 
|  | 732 | long a; | 
|  | 733 | ) | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 734 | </pre></blockquote> | 
|  | 735 | <p>That would mean TT.c == NULL, TT.b == "fruit", and TT.a == 42.  (Remember, | 
|  | 736 | each entry that receives an argument must be a long or pointer, to line up | 
|  | 737 | with the array position.  Right to left in the optflags string corresponds to | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 738 | top to bottom in GLOBALS().</p> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 739 |  | 
|  | 740 | <p><b>long toys.optflags</b></p> | 
|  | 741 |  | 
|  | 742 | <p>Each option in the optflags string corresponds to a bit position in | 
|  | 743 | toys.optflags, with the same value as a corresponding binary digit.  The | 
|  | 744 | rightmost argument is (1<<0), the next to last is (1<<1) and so on.  If | 
| Rob Landley | b4a0efa | 2012-02-06 21:15:19 -0600 | [diff] [blame] | 745 | the option isn't encountered while parsing argv[], its bit remains 0.</p> | 
|  | 746 |  | 
|  | 747 | <p>For example, | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 748 | the optflags string "abcd" would parse the command line argument "-c" to set | 
|  | 749 | optflags to 2, "-a" would set optflags to 8, "-bd" would set optflags to | 
|  | 750 | 6 (I.E. 4|2), and "-a -c" would set optflags to 10 (2|8).</p> | 
|  | 751 |  | 
|  | 752 | <p>Only letters are relevant to optflags, punctuation is skipped: in the | 
|  | 753 | string "a*b:c#d", d=1, c=2, b=4, a=8.  The punctuation after a letter | 
|  | 754 | usually indicate that the option takes an argument.</p> | 
|  | 755 |  | 
| Rob Landley | b4a0efa | 2012-02-06 21:15:19 -0600 | [diff] [blame] | 756 | <p>Since toys.optflags is an unsigned int, it only stores 32 bits.  (Which is | 
|  | 757 | the amount a long would have on 32-bit platforms anyway; 64 bit code on | 
|  | 758 | 32 bit platforms is too expensive to require in common code used by almost | 
|  | 759 | all commands.)  Bit positions beyond the 1<<31 aren't recorded, but | 
|  | 760 | parsing higher options can still set global variables.</p> | 
|  | 761 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 762 | <p><b>Automatically setting global variables from arguments (union this)</b></p> | 
|  | 763 |  | 
|  | 764 | <p>The following punctuation characters may be appended to an optflags | 
|  | 765 | argument letter, indicating the option takes an additional argument:</p> | 
|  | 766 |  | 
|  | 767 | <ul> | 
|  | 768 | <li><b>:</b> - plus a string argument, keep most recent if more than one.</li> | 
|  | 769 | <li><b>*</b> - plus a string argument, appended to a linked list.</li> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 770 | <li><b>@</b> - plus an occurrence counter (stored in a long)</li> | 
| Rob Landley | b6063de | 2012-01-29 13:54:13 -0600 | [diff] [blame] | 771 | <li><b>#</b> - plus a signed long argument. | 
|  | 772 | <li><b>.</b> - plus a floating point argument (if CFG_TOYBOX_FLOAT).</li> | 
|  | 773 | <ul>The following can be appended to a float or double: | 
|  | 774 | <li><b><123</b> - error if argument is less than this</li> | 
|  | 775 | <li><b>>123</b> - error if argument is greater than this</li> | 
|  | 776 | <li><b>=123</b> - default value if argument not supplied</li> | 
|  | 777 | </ul> | 
|  | 778 | <ul><li>Option parsing only understands <>= after . when CFG_TOYBOX_FLOAT | 
|  | 779 | is enabled. (Otherwise the code to determine where floating point constants | 
|  | 780 | end drops out.  When disabled, it can reserve a global data slot for the | 
|  | 781 | argument so offsets won't change, but will never fill it out.). You can handle | 
|  | 782 | this by using the USE_BLAH() macros with C string concatenation, ala: | 
|  | 783 | "abc." USE_TOYBOX_FLOAT("<1.23>4.56=7.89") "def"</li></ul> | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 784 | </ul> | 
|  | 785 |  | 
|  | 786 | <p>Arguments may occur with or without a space (I.E. "-a 42" or "-a42"). | 
|  | 787 | The command line argument "-abc" may be interepreted many different ways: | 
|  | 788 | the optflags string "cba" sets toys.optflags = 7, "c:ba" sets toys.optflags=4 | 
|  | 789 | and saves "ba" as the argument to -c, and "cb:a" sets optflags to 6 and saves | 
|  | 790 | "c" as the argument to -b.</p> | 
|  | 791 |  | 
|  | 792 | <p>Options which have an argument fill in the corresponding slot in the global | 
|  | 793 | union "this" (see generated/globals.h), treating it as an array of longs | 
|  | 794 | with the rightmost saved in this[0].  Again using "a*b:c#d", "-c 42" would set | 
|  | 795 | this[0]=42; and "-b 42" would set this[1]="42"; each slot is left NULL if | 
|  | 796 | the corresponding argument is not encountered.</p> | 
|  | 797 |  | 
|  | 798 | <p>This behavior is useful because the LP64 standard ensures long and pointer | 
| Rob Landley | b4a0efa | 2012-02-06 21:15:19 -0600 | [diff] [blame] | 799 | are the same size. C99 guarantees structure members will occur in memory | 
|  | 800 | in the same order they're declared, and that padding won't be inserted between | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 801 | consecutive variables of register size.  Thus the first few entries can | 
|  | 802 | be longs or pointers corresponding to the saved arguments.</p> | 
|  | 803 |  | 
|  | 804 | <p><b>char *toys.optargs[]</b></p> | 
|  | 805 |  | 
|  | 806 | <p>Command line arguments in argv[] which are not consumed by option parsing | 
|  | 807 | (I.E. not recognized either as -flags or arguments to -flags) will be copied | 
|  | 808 | to toys.optargs[], with the length of that array in toys.optc. | 
|  | 809 | (When toys.optc is 0, no unrecognized command line arguments remain.) | 
|  | 810 | The order of entries is preserved, and as with argv[] this new array is also | 
|  | 811 | terminated by a NULL entry.</p> | 
|  | 812 |  | 
|  | 813 | <p>Option parsing can require a minimum or maximum number of optargs left | 
|  | 814 | over, by adding "<1" (read "at least one") or ">9" ("at most nine") to the | 
|  | 815 | start of the optflags string.</p> | 
|  | 816 |  | 
|  | 817 | <p>The special argument "--" terminates option parsing, storing all remaining | 
|  | 818 | arguments in optargs.  The "--" itself is consumed.</p> | 
|  | 819 |  | 
|  | 820 | <p><b>Other optflags control characters</b></p> | 
|  | 821 |  | 
|  | 822 | <p>The following characters may occur at the start of each command's | 
|  | 823 | optflags string, before any options that would set a bit in toys.optflags:</p> | 
|  | 824 |  | 
|  | 825 | <ul> | 
|  | 826 | <li><b>^</b> - stop at first nonoption argument (for nice, xargs...)</li> | 
|  | 827 | <li><b>?</b> - allow unknown arguments (pass non-option arguments starting | 
|  | 828 | with - through to optargs instead of erroring out).</li> | 
|  | 829 | <li><b>&</b> - the first argument has imaginary dash (ala tar/ps.  If given twice, all arguments have imaginary dash.)</li> | 
|  | 830 | <li><b><</b> - must be followed by a decimal digit indicating at least this many leftover arguments are needed in optargs (default 0)</li> | 
|  | 831 | <li><b>></b> - must be followed by a decimal digit indicating at most this many leftover arguments allowed (default MAX_INT)</li> | 
|  | 832 | </ul> | 
|  | 833 |  | 
|  | 834 | <p>The following characters may be appended to an option character, but do | 
|  | 835 | not by themselves indicate an extra argument should be saved in this[]. | 
|  | 836 | (Technically any character not recognized as a control character sets an | 
|  | 837 | optflag, but letters are never control characters.)</p> | 
|  | 838 |  | 
|  | 839 | <ul> | 
|  | 840 | <li><b>^</b> - stop parsing options after encountering this option, everything else goes into optargs.</li> | 
|  | 841 | <li><b>|</b> - this option is required.  If more than one marked, only one is required.</li> | 
|  | 842 | <li><b>+X</b> enabling this option also enables option X (switch bit on).</li> | 
|  | 843 | <li><b>~X</b> enabling this option disables option X (switch bit off).</li> | 
|  | 844 | <li><b>!X</b> this option cannot be used in combination with X (die with error).</li> | 
|  | 845 | <li><b>[yz]</b> this option requires at least one of y or z to also be enabled.</li> | 
|  | 846 | </ul> | 
|  | 847 |  | 
| Rob Landley | b6063de | 2012-01-29 13:54:13 -0600 | [diff] [blame] | 848 | <p>The following may be appended to a float or double:</p> | 
|  | 849 |  | 
|  | 850 | <ul> | 
|  | 851 | <li><b><123</b> - error if argument is less than this</li> | 
|  | 852 | <li><b>>123</b> - error if argument is greater than this</li> | 
|  | 853 | <li><b>=123</b> - default value if argument not supplied</li> | 
|  | 854 | </ul> | 
|  | 855 |  | 
|  | 856 | <p>Option parsing only understands <>= after . when CFG_TOYBOX_FLOAT | 
|  | 857 | is enabled. (Otherwise the code to determine where floating point constants | 
|  | 858 | end drops out.  When disabled, it can reserve a global data slot for the | 
|  | 859 | argument so offsets won't change, but will never fill it out.). You can handle | 
|  | 860 | this by using the USE_BLAH() macros with C string concatenation, ala:</p> | 
|  | 861 |  | 
|  | 862 | <blockquote>"abc." USE_TOYBOX_FLOAT("<1.23>4.56=7.89") "def"</blockquote> | 
|  | 863 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 864 | <p><b>--longopts</b></p> | 
|  | 865 |  | 
|  | 866 | <p>The optflags string can contain long options, which are enclosed in | 
|  | 867 | parentheses.  They may be appended to an existing option character, in | 
|  | 868 | which case the --longopt is a synonym for that option, ala "a:(--fred)" | 
|  | 869 | which understands "-a blah" or "--fred blah" as synonyms.</p> | 
|  | 870 |  | 
|  | 871 | <p>Longopts may also appear before any other options in the optflags string, | 
|  | 872 | in which case they have no corresponding short argument, but instead set | 
|  | 873 | their own bit based on position.  So for "(walrus)#(blah)xy:z" "command | 
|  | 874 | --walrus 42" would set toys.optflags = 16 (-z = 1, -y = 2, -x = 4, --blah = 8) | 
|  | 875 | and would assign this[1] = 42;</p> | 
|  | 876 |  | 
|  | 877 | <p>A short option may have multiple longopt synonyms, "a(one)(two)", but | 
|  | 878 | each "bare longopt" (ala "(one)(two)abc" before any option characters) | 
|  | 879 | always sets its own bit (although you can group them with +X).</p> | 
| Rob Landley | 7c04f01 | 2008-01-20 19:00:16 -0600 | [diff] [blame] | 880 |  | 
| Rob Landley | c8d0da5 | 2012-07-15 17:47:08 -0500 | [diff] [blame] | 881 | <a name="lib_dirtree"><h3>lib/dirtree.c</h3> | 
|  | 882 |  | 
|  | 883 | <p>The directory tree traversal code should be sufficiently generic | 
|  | 884 | that commands never need to use readdir(), scandir(), or the fts.h family | 
|  | 885 | of functions.</p> | 
|  | 886 |  | 
|  | 887 | <p>These functions do not call chdir() or rely on PATH_MAX. Instead they | 
|  | 888 | use openat() and friends, using one filehandle per directory level to | 
|  | 889 | recurseinto subdirectories. (I.E. they can descend 1000 directories deep | 
|  | 890 | if setrlimit(RLIMIT_NOFILE) allows enough open filehandles, and the default | 
|  | 891 | in /proc/self/limits is generally 1024.)</p> | 
|  | 892 |  | 
|  | 893 | <p>The basic dirtree functions are:</p> | 
|  | 894 |  | 
|  | 895 | <ul> | 
|  | 896 | <li><p><b>dirtree_read(char *path, int (*callback)(struct dirtree node))</b> - | 
|  | 897 | recursively read directories, either applying callback() or returning | 
|  | 898 | a tree of struct dirtree if callback is NULL.</p></li> | 
|  | 899 |  | 
|  | 900 | <li><p><b>dirtree_path(struct dirtree *node, int *plen)</b> - malloc() a | 
|  | 901 | string containing the path from the root of this tree to this node. If | 
|  | 902 | plen isn't NULL then *plen is how many extra bytes to malloc at the end | 
|  | 903 | of string.</p></li> | 
|  | 904 |  | 
|  | 905 | <li><p><b>dirtree_parentfd(struct dirtree *node)</b> - return fd of | 
|  | 906 | containing directory, for use with openat() and such.</p></li> | 
|  | 907 | </ul> | 
|  | 908 |  | 
|  | 909 | <p>The <b>dirtree_read()</b> function takes two arguments, a starting path for | 
|  | 910 | the root of the tree, and a callback function. The callback takes a | 
|  | 911 | <b>struct dirtree *</b> (from lib/lib.h) as its argument. If the callback is | 
|  | 912 | NULL, the traversal uses a default callback (dirtree_notdotdot()) which | 
|  | 913 | recursively assembles a tree of struct dirtree nodes for all files under | 
|  | 914 | this directory and subdirectories (filtering out "." and ".." entries), | 
|  | 915 | after which dirtree_read() returns the pointer to the root node of this | 
|  | 916 | snapshot tree.</p> | 
|  | 917 |  | 
|  | 918 | <p>Otherwise the callback() is called on each entry in the directory, | 
|  | 919 | with struct dirtree * as its argument. This includes the initial | 
|  | 920 | node created by dirtree_read() at the top of the tree.</p> | 
|  | 921 |  | 
|  | 922 | <p><b>struct dirtree</b></p> | 
|  | 923 |  | 
|  | 924 | <p>Each struct dirtree node contains <b>char name[]</b> and <b>struct stat | 
|  | 925 | st</b> entries describing a file, plus a <b>char *symlink</b> | 
|  | 926 | which is NULL for non-symlinks.</p> | 
|  | 927 |  | 
|  | 928 | <p>During a callback function, the <b>int data</b> field of directory nodes | 
|  | 929 | contains a dirfd (for use with the openat() family of functions). This is | 
|  | 930 | generally used by calling dirtree_parentfd() on the callback's node argument. | 
|  | 931 | For symlinks, data contains the length of the symlink string. On the second | 
|  | 932 | callback from DIRTREE_COMEAGAIN (depth-first traversal) data = -1 for | 
|  | 933 | all nodes (that's how you can tell it's the second callback).</p> | 
|  | 934 |  | 
|  | 935 | <p>Users of this code may put anything they like into the <b>long extra</b> | 
|  | 936 | field. For example, "cp" and "mv" use this to store a dirfd for the destination | 
|  | 937 | directory (and use DIRTREE_COMEAGAIN to get the second callback so they can | 
|  | 938 | close(node->extra) to avoid running out of filehandles). | 
|  | 939 | This field is not directly used by the dirtree code, and | 
|  | 940 | thanks to LP64 it's large enough to store a typecast pointer to an | 
|  | 941 | arbitrary struct.</p> | 
|  | 942 |  | 
|  | 943 | <p>The return value of the callback combines flags (with boolean or) to tell | 
|  | 944 | the traversal infrastructure how to behave:</p> | 
|  | 945 |  | 
|  | 946 | <ul> | 
|  | 947 | <li><p><b>DIRTREE_SAVE</b> - Save this node, assembling a tree. (Without | 
|  | 948 | this the struct dirtree is freed after the callback returns. Filtering out | 
|  | 949 | siblings is fine, but discarding a parent while keeping its child leaks | 
|  | 950 | memory.)</p></li> | 
|  | 951 | <li><p><b>DIRTREE_ABORT</b> - Do not examine any more entries in this | 
|  | 952 | directory. (Does not propagate up tree: to abort entire traversal, | 
|  | 953 | return DIRTREE_ABORT from parent callbacks too.)</p></li> | 
|  | 954 | <li><p><b>DIRTREE_RECURSE</b> - Examine directory contents. Ignored for | 
|  | 955 | non-directory entries. The remaining flags only take effect when | 
|  | 956 | recursing into the children of a directory.</p></li> | 
|  | 957 | <li><p><b>DIRTREE_COMEAGAIN</b> - Call the callback a second time after | 
|  | 958 | examining all directory contents, allowing depth-first traversal. | 
|  | 959 | On the second call, dirtree->data = -1.</p></li> | 
|  | 960 | <li><p><b>DIRTREE_SYMFOLLOW</b> - follow symlinks when populating children's | 
|  | 961 | <b>struct stat st</b> (by feeding a nonzero value to the symfollow argument of | 
|  | 962 | dirtree_add_node()), which means DIRTREE_RECURSE treats symlinks to | 
|  | 963 | directories as directories. (Avoiding infinite recursion is the callback's | 
|  | 964 | problem: the non-NULL dirtree->symlink can still distinguish between | 
|  | 965 | them.)</p></li> | 
|  | 966 | </ul> | 
|  | 967 |  | 
|  | 968 | <p>Each struct dirtree contains three pointers (next, parent, and child) | 
|  | 969 | to other struct dirtree.</p> | 
|  | 970 |  | 
|  | 971 | <p>The <b>parent</b> pointer indicates the directory | 
|  | 972 | containing this entry; even when not assembling a persistent tree of | 
|  | 973 | nodes the parent entries remain live up to the root of the tree while | 
|  | 974 | child nodes are active. At the top of the tree the parent pointer is | 
|  | 975 | NULL, meaning the node's name[] is either an absolute path or relative | 
|  | 976 | to cwd. The function dirtree_parentfd() gets the directory file descriptor | 
|  | 977 | for use with openat() and friends, returning AT_FDCWD at the top of tree.</p> | 
|  | 978 |  | 
|  | 979 | <p>The <b>child</b> pointer points to the first node of the list of contents of | 
|  | 980 | this directory. If the directory contains no files, or the entry isn't | 
|  | 981 | a directory, child is NULL.</p> | 
|  | 982 |  | 
|  | 983 | <p>The <b>next</b> pointer indicates sibling nodes in the same directory as this | 
|  | 984 | node, and since it's the first entry in the struct the llist.c traversal | 
|  | 985 | mechanisms work to iterate over sibling nodes. Each dirtree node is a | 
|  | 986 | single malloc() (even char *symlink points to memory at the end of the node), | 
|  | 987 | so llist_free() works but its callback must descend into child nodes (freeing | 
|  | 988 | a tree, not just a linked list), plus whatever the user stored in extra.</p> | 
|  | 989 |  | 
|  | 990 | <p>The <b>dirtree_read</b>() function is a simple wrapper, calling <b>dirtree_add_node</b>() | 
|  | 991 | to create a root node relative to the current directory, then calling | 
|  | 992 | <b>handle_callback</b>() on that node (which recurses as instructed by the callback | 
|  | 993 | return flags). Some commands (such as chgrp) bypass this wrapper, for example | 
|  | 994 | to control whether or not to follow symlinks to the root node; symlinks | 
|  | 995 | listed on the command line are often treated differently than symlinks | 
|  | 996 | encountered during recursive directory traversal). | 
|  | 997 |  | 
|  | 998 | <p>The ls command not only bypasses the wrapper, but never returns | 
|  | 999 | <b>DIRTREE_RECURSE</b> from the callback, instead calling <b>dirtree_recurse</b>() manually | 
|  | 1000 | from elsewhere in the program. This gives ls -lR manual control | 
|  | 1001 | of traversal order, which is neither depth first nor breadth first but | 
|  | 1002 | instead a sort of FIFO order requried by the ls standard.</p> | 
|  | 1003 |  | 
| Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 1004 | <a name="#toys"> | 
|  | 1005 | <h2>Directory toys/</h2> | 
|  | 1006 |  | 
|  | 1007 | <p>This directory contains command implementations. Each command is a single | 
|  | 1008 | self-contained file. Adding a new command involves adding a single | 
|  | 1009 | file, and removing a command involves removing that file. Commands use | 
|  | 1010 | shared infrastructure from the lib/ and generated/ directories.</p> | 
|  | 1011 |  | 
|  | 1012 | <p>Currently there are three subdirectories under "toys/" containing commands | 
|  | 1013 | described in POSIX-2008, the Linux Standard Base 4.1, or "other". The only | 
|  | 1014 | difference this makes is which menu the command shows up in during "make | 
|  | 1015 | menuconfig", the directories are otherwise identical. Note that they commands | 
|  | 1016 | exist within a single namespace at runtime, so you can't have the same | 
|  | 1017 | command in multiple subdirectories.</p> | 
|  | 1018 |  | 
|  | 1019 | <p>(There are actually four sub-menus in "make menuconfig", the fourth | 
|  | 1020 | contains global configuration options for toybox, and lives in Config.in at | 
|  | 1021 | the top level.)</p> | 
|  | 1022 |  | 
|  | 1023 | <p>See <a href="#adding">adding a new command</a> for details on the | 
|  | 1024 | layout of a command file.</p> | 
|  | 1025 |  | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 1026 | <h2>Directory scripts/</h2> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 1027 |  | 
| Rob Landley | 1f4f41a | 2012-10-08 21:31:07 -0500 | [diff] [blame] | 1028 | <p>Build infrastructure. The makefile calls scripts/make.sh for "make" | 
|  | 1029 | and scripts/install.sh for "make install".</p> | 
|  | 1030 |  | 
|  | 1031 | <p>There's also a test suite, "make test" calls make/test.sh, which runs all | 
|  | 1032 | the tests in make/test/*. You can run individual tests via | 
|  | 1033 | "scripts/test.sh command", or "TEST_HOST=1 scripts/test.sh command" to run | 
|  | 1034 | that test against the host implementation instead of the toybox one.</p> | 
|  | 1035 |  | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 1036 | <h3>scripts/cfg2files.sh</h3> | 
|  | 1037 |  | 
|  | 1038 | <p>Run .config through this filter to get a list of enabled commands, which | 
|  | 1039 | is turned into a list of files in toys via a sed invocation in the top level | 
|  | 1040 | Makefile. | 
|  | 1041 | </p> | 
|  | 1042 |  | 
| Rob Landley | 81b899d | 2007-12-18 02:02:47 -0600 | [diff] [blame] | 1043 | <h2>Directory kconfig/</h2> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 1044 |  | 
|  | 1045 | <p>Menuconfig infrastructure copied from the Linux kernel.  See the | 
|  | 1046 | Linux kernel's Documentation/kbuild/kconfig-language.txt</p> | 
|  | 1047 |  | 
| Rob Landley | 66a69d9 | 2012-01-16 01:44:17 -0600 | [diff] [blame] | 1048 | <a name="generated"> | 
|  | 1049 | <h2>Directory generated/</h2> | 
|  | 1050 |  | 
|  | 1051 | <p>All the files in this directory except the README are generated by the | 
|  | 1052 | build.  (See scripts/make.sh)</p> | 
|  | 1053 |  | 
|  | 1054 | <ul> | 
|  | 1055 | <li><p><b>config.h</b> - CFG_COMMAND and USE_COMMAND() macros set by menuconfig via .config.</p></li> | 
|  | 1056 |  | 
|  | 1057 | <li><p><b>Config.in</b> - Kconfig entries for each command.  Included by top level Config.in.  The help text in here is used to generated help.h</p></li> | 
|  | 1058 |  | 
|  | 1059 | <li><p><b>help.h</b> - Help text strings for use by "help" command.  Building | 
|  | 1060 | this file requires python on the host system, so the prebuilt file is shipped | 
|  | 1061 | in the build tarball to avoid requiring python to build toybox.</p></li> | 
|  | 1062 |  | 
|  | 1063 | <li><p><b>newtoys.h</b> - List of NEWTOY() or OLDTOY() macros for all available | 
|  | 1064 | commands.  Associates command_main() functions with command names, provides | 
|  | 1065 | option string for command line parsing (<a href="#lib_args">see lib/args.c</a>), | 
|  | 1066 | specifies where to install each command and whether toysh should fork before | 
|  | 1067 | calling it.</p></li> | 
|  | 1068 | </ul> | 
|  | 1069 |  | 
|  | 1070 | <p>Everything in this directory is a derivative file produced from something | 
|  | 1071 | else.  The entire directory is deleted by "make distclean".</p> | 
| Rob Landley | 4e68de1 | 2007-12-13 07:00:27 -0600 | [diff] [blame] | 1072 | <!--#include file="footer.html" --> |