Home | History | Annotate | Download | only in www
      1 <html><head><title>toybox cleanup</title></head>
      2 <!--#include file="header.html" -->
      3 
      4 <h1>Index</h1>
      5 
      6 <ul>
      7 <li><a href=#intro>Introduction</a></li>
      8 <li><a href=#advice>Advice</a></li>
      9 <li>Commands:</li>
     10 <ul>
     11 <li><a href=#uuencode>uuencode</a></li>
     12 <li><a href=#uudecode>uudecode</a></li>
     13 <li><a href=#ifconfig>ifconfig</a></li>
     14 <li><a href=#find>find</a></li>
     15 </ul>
     16 </ul>
     17 
     18 <hr>
     19 
     20 <a name=intro />
     21 <h1>Cleaning up the toybox code.</h1>
     22 
     23 <p>Toybox <a href=http://landley.net/notes.html#31-03-2013>hasn't always</a>
     24 taken proper advantage of external contributions</a>.
     25 Lots of people want to help, but their contributions languish out of tree
     26 or in the "pending" directory, awaiting cleanup.</p>
     27 
     28 <p>Toybox's design goals require simpler, tighter, and more explicit code
     29 than most other implementations, among other reasons to allow better security
     30 auditing. Writing "another" implementation of standard command line tools
     31 isn't very interesting, they should be _better_ implementations.
     32 Unfortunately, this means existing, working commands often take more effort to
     33 clean up to Toybox's standards than writing a new one from scratch, not
     34 because they don't work, but because we aim for an unusual level of polish.</p>
     35 
     36 <p>In hopes of teaching more people how to do this
     37 cleanup work, I've started breaking cleanup changes into smaller chunks and
     38 posting explanations of each change to the mailing list.
     39 Below are indexes of such cleanup series. Each commit and post are meant to
     40 be read together: each description explains what the corresponding patch
     41 was trying to accomplish.</p>
     42 
     43 <p>Line/byte totals of completed series are given for scale, but the point
     44 of this work is simplicity and compactness, not size per se.</p>
     45 
     46 <p>(Note: mercurial's web viewer doesn't follow renames, so although each
     47 command name links to a commit list with the bulk of the changes, it may
     48 not include the final version of each file moved from the "pending"
     49 directory to its final location. The summaries link the initial and cleaned
     50 versions of each file when giving line counts.)</p>
     51 
     52 <hr>
     53 
     54 <a name=advice />
     55 <h1>General advice and/or policy.</h1>
     56 
     57 <p>The <a href=design.html>design of toybox</a> page and the coding
     58 style section at the start of the <a href=code.html>source code walkthrough</a>
     59 don't cover everything. Here are some
     60 links to mailing list messages that cover various programming topics
     61 not directly related to a specific cleanup series:</p>
     62 
     63 <ul>
     64 <li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000850.html>Error messages and internationalization.</a></li>
     65 <li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000891.html>Why not "const"?</a> (Exception: global variables
     66 outside of GLOBALS can be static const, to go in rodata instead of data.
     67 This means the pages can be shared between instances.)</li>
     68 <li><a href=http://lkml.indiana.edu/hypermail/linux/kernel/1308.3/03890.html>Why not "bool"?</a> (explanation from Linus Torvalds)</li>
     69 <li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000893.html>Why not to check in debug code.</a></li>
     70 <li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-June/001044.html>Relationship between /proc and /sys</a> (/proc isn't obsolete and /sys is an ABI)</li>
     71 <li>"Hiding numbers that are used just once into defines to put them out of
     72 sight does not really help readability."</a> -
     73 <a href=http://lkml.iu.edu/hypermail/linux/kernel/1407.1/00299.html>Pavel
     74 Machek</a></li>
     75 </ul>
     76 
     77 <hr>
     78 
     79 <a name="uuencode"><h1><a href=/hg/toybox/log/900/toys/pending/uuencode.c>uuencode</a></h1>
     80 
     81 <p>This is an example of cleaning up something most projects would be quite
     82 happy with. The initial submission of uuencode and uudecode was high
     83 quality code, written by a seasoned developer who did an excellent
     84 job, but it was still possible to shrink the result almost by half:</p>
     85 
     86 <ul>
     87 <li>old total: <a href=/hg/toybox/file/828/toys/pending/uuencode.c>116 lines (2743
     88 bytes) in 7 functions</a></li>
     89 <li>new total: <a href=/hg/toybox/file/841/toys/posix/uuencode.c>67 lines (1440
     90 bytes) in 1 function</a></li>
     91 </ul>
     92 
     93 <ul>
     94 <li>commit: <a href=/hg/toybox/rev/830>830</a>: first pass, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000904.html>part 1</a>,
     95 <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000903.html>part 2</a></li>
     96 <li>commit: <a href=/hg/toybox/rev/831>831</a>,
     97 second pass, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000919.html>part 3</a></li>
     98 <li>commit: <a href=/hg/toybox/rev/837>837</a>,
     99 description: fix test suite.</li>
    100 <li>commit: <a href=/hg/toybox/rev/853>853</a>, description: bugfix.</li>
    101 </ul>
    102 
    103 <p>Status: COMPLETE</p>
    104 
    105 <a name="uudecode"><h1><a href=/hg/toybox/log/900/toys/pending/uudecode.c>uudecode</a></h1>
    106 
    107 <p>The uudecode cleanup was my second "explain as I go along" cleanup,
    108 and I tried to do it in smaller stages so it was easier to see what
    109 changed from the diff:</p>
    110 
    111 <ul>
    112 <li>old: <a href=/hg/toybox/file/828/toys/pending/uudecode.c>175
    113 lines (4534 bytes) in 9 functions</a></li>
    114 <li>new: <a href=/hg/toybox/file/840/toys/posix/uudecode.c>107 lines
    115 (2300 bytes) in 1 function</a></li>
    116 </ul>
    117 
    118 <ul>
    119 <li>commit: <a href=/hg/toybox/rev/833>833</a>,
    120 description: preparatory adjustments to test suite.</li>
    121 <li>commit: <a href=/hg/toybox/rev/835>835</a>,
    122 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001532.html>Redo command line parsing, redo parsing loop.</a></li>
    123 <li>commit: <a href=/hg/toybox/rev/838>838</a>,
    124 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001533.html>Redo b64_1byte, b64_4bytes, and uu_line()</a></li>
    125 <li>commit: <a href=/hg/toybox/rev/839>839</a>,
    126 description: todo</a></li>
    127 <li>commit: <a href=/hg/toybox/rev/840>840</a>,
    128 description: todo (finish, move pending->posix, default y)</a></li>
    129 </ul>
    130 
    131 <p>Status: COMPLETE</p>
    132 
    133 <a name=ifconfig>
    134 <h1><a href=/hg/toybox/log/tip/toys/pending/ifconfig.c>ifconfig</a></h1>
    135 
    136 <p>This series describes a thorough cleanup that took a while to do.</p>
    137 
    138 <p>When ifconfig was submitted, it touched a half-dozen files. I glued it
    139 together into a single self-contained file, which needed a lot of
    140 cleanup. The final version is about 1/3 the size of the original.</p>
    141 
    142 <ul>
    143 <li>old total: <a href=/hg/toybox/file/841/toys/pending/ifconfig.c>1504 lines (44268 bytes) in 38 functions</a></li>
    144 <li>new total: <a href=/hg/toybox/file/1133/toys/other/ifconfig.c>521 lines (15963 bytes) in 4 functions</a></li>
    145 </ul>
    146 
    147 <p>This was the first command I started cleaning up with the intent of
    148 describing the process, and especially the first few entries in this
    149 series describe many of the low hanging fruit techniques used to clean
    150 up a codebase.</p>
    151 
    152 <ul>
    153 <li>commit: <a href=/hg/toybox/rev/843>843</a>, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000882.html>Infrastructure in search of a user, code proximity,
    154 unnecessary #defines, shorter code is easier to read.</a></li>
    155 <li>commit: <a href=/hg/toybox/rev/844>844</a>,
    156 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000881.html>Headers, replacing repeated code with loops,
    157 logical operators guaranteed to return 0 or 1, math on string constants,
    158 removing unnecessary variables and tests.</a></li>
    159 <li>commit: <a href=/hg/toybox/rev/852>852</a>,
    160 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000921.html>hg commit numbers, documenting the obvious, ordering
    161 to avoid prototypes, returning void, collate local declarations,
    162 use error_exit(), unnecessary parentheses, inline to remove variables/functions
    163 used only once, using *var instead of var[0], unnecessary typecasts,
    164 xprintf("\n") vs xputc('\n')</a></li>
    165 <li>commit: <a href=/hg/toybox/rev/856>856</a>,
    166 description: one line portability fix from Isaac Dunham</li>
    167 <li>commit: <a href=/hg/toybox/rev/861>861</a>
    168 and <a href=/hg/toybox/rev/863>863</a>,
    169 description:
    170 <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000910.html>Help
    171 infrastructure cleanup from Isaac Dunham</a>
    172 (which I mis-applied and then <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000920.html>fixed plus some whitespace changes</a>)</li>
    173 
    174 <li>commit: <a href=/hg/toybox/rev/862>862</a>, description:
    175 <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001525.html>remove unused headers and function, replace local buffer with toybuf, perror_exit(), avoid unnecessary assignment.</a></li>
    176 <li>commit: <a href=/hg/toybox/rev/864>864</a>, description:
    177 <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001526.html>use common linked list functions, inline set_data, add xioctl, clean up error messages, whitespace and comment tweaks, remove NOP return statements</a></li>
    178 <li>commit: <a href=/hg/toybox/rev/866>866</a>, description:
    179 <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001528.html>move standalone globals into GLOBALS() block, collate structs into
    180 iface_list. Inline/rewrite/remove field_format, iface_flags_str,
    181 omit_whitespace(), print_iface_flags(), print_media(), get_ifconfig_info(),
    182 and clear_list(). Merge duplicate function
    183 calls. Show get_proc_info() version field can't matter in 2.6 or newer kernel,
    184 and that SIOCGIFMAP has been there since 1994 so doesn't need an #ifdef.
    185 Loop simplification in readconf() and show_iface().</a></li>
    186 
    187 <li>commit: <a href=/hg/toybox/rev/869>869</a> and <a href=/hg/toybox/rev/870>870</a>,
    188 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000928.html>869:
    189 reorder to eliminate prototypes, put command_main() at end of file,
    190 870: long repeated variable prefixes, replacing struct+sscanf()+printf with a
    191 loop and a table (from iface_list, get_proc_info(), display_ifconfig()),
    192 use lib/xwrap.c functions to return void, why xstrcpy() fails closed,
    193 (functional comment: why multicast failed, CSLIP obsolecense), not being
    194 _too_ clever.</a></li>
    195 <li>commit: <a href=/hg/toybox/rev/878>878</a> and <a href=/hg/toybox/rev/879>879</a>:
    196 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000946.html>878: add xsocket(), free(NULL) is a safe NOP (posix!).
    197 879: inline three functions and simplify, some simplifications only show up
    198 after repeated inlining</a></li>
    199 <li>commit: <a href=/hg/toybox/rev/883>883</a>,
    200 description: move some common code to lib/ and posix headers to toys.h.</li>
    201 <li>commit: <a href=/hg/toybox/rev/898>898</a>,
    202 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/000974.html>Argument parsing. (Replace ifconfig_main() if/else staircase with a loop over
    203 an array, genericize minus prefix logic, inline a use of set_flags().)</a></li>
    204 <li>commit: <a href=/hg/toybox/rev/905>905</a>,
    205 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/000992.html>remove unnecessary wrapper function, inlining more functions,
    206 relying on the values of constants that don't change across architectures
    207 (binary backwards compatability), more ifconfig_main table work,
    208 man ioctl_list.</a></li>
    209 <li>commit: <a href=/hg/toybox/rev/906>906</a>,
    210 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/000994.html>More ifconfig_main() table work, remove vestigial arguments
    211 to functions, "a frenzy of inlining", slightly better error reporting,
    212 don't reinvent libc functions.</a></li>
    213 <li>commit: <a href=/hg/toybox/rev/907>907</a>,
    214 <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/000995.html>inlining show_ip_addr() with a loop and a table, inlining hex_to_binary()
    215 and set_hw_address(), stop validating data we supplied, remove a table
    216 that's overkill (two entries, we don't even loop over it), when you don't need a
    217 NULL terminator for array, remove unnecessary memcpy(offsetof()) with
    218 assignment, trusting -funsigned-char.</a></li>
    219 <li>commit: <a href=/hg/toybox/rev/919>919</a>,
    220 <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-June/001027.html>todo whitespace damage, introduce IFREQ_OFFSZ() and poke() to
    221 ifconfig_main() table logic to fold more if/else parts into the table</a></li>
    222 <li>Status update: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-June/001033.html>Entering the home stretch on ifconfig</a> (and a <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-June/001043.html>note about infiniband</a>)</li>
    223 <li>commit: <a href=/hg/toybox/rev/921>921</a>, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-June/003508.html>Inline a couple more functions and make sockfd a global.</li>
    224 <li>commit: <a href=/hg/toybox/rev/957>957</a>, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-July/001121.html>Remove unused socklen and addr_to_len(), cleanup so we can merge get_device_info()/display_ifconfig().</a></li>
    225 <li>commit: <a href=/hg/toybox/rev/958>958</a>, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-July/001131.html>This commit removes struct if_list by unifying get_device_info() and display_ifconfig().</a></li>
    226 <li>commit: <a href=/hg/toybox/rev/1104>1104</a>, description: Merge toynet into toys.h: musl supports it and micromanaging uClibc config options isn't very interesting anymore.</li>
    227 <li>commit: <a href=/hg/toybox/rev/1127>1127</a>, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-November/001464.html>Start tacling ipv6 issues, beginning with display_ifconfig().</a></li>
    228 <li>commit: <a href=/hg/toybox/rev/1128>1128</a>, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-November/001463.html>More ipv6, make struct sockaddr_with_len go away, merge more arguments into the table in main().</a></li>
    229 <li>commit: <a href=/hg/toybox/rev/1132>1132</a>, description: promotion from pending to other</li>
    230 <li>commit: <a href=/hg/toybox/rev/1132>1133</a>, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-November/001462.html>cleanup help text, remove obsolete/NOP commands</a></li>
    231 </ul>
    232 
    233 <p>Status: COMPLETE.</p>
    234 
    235 <h1><a href=/hg/toybox/log/tip/toys/pending/find.c>find</a></h1>
    236 
    237 <pre>
    238 814 Initial version by Gurang Shastri.
    239 815
    240 816
    241 847 Felix Janda
    242 848 Whitespace (reindent from tabs -> 2 spaces)
    243 849 More cleanup
    244 867 Felix Janda Improve operator processing.
    245 874 Felix Janda
    246 875 Felix Janda
    247 887 Felix Janda fix -mtime
    248 </pre>
    249 
    250 <ul>
    251 <li>commit: <a href=/hg/toybox/rev/849>849</a>,
    252 description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000895.html>here</a></li>
    253 </ul>
    254 
    255 <p>Status: in progress.</p>
    256 
    257 <h1><a href=/hg/toybox/log/917/toys/pending/stat.c>stat</a></h1>
    258 
    259 <p>A lot of the stat cleanup was done by Felix Janda.</p>
    260 
    261 <ul>
    262 <li>commit <a href=/hg/toybox/rev/747>747</a>: initial submission</a></li>
    263 <li>commit <a href=/hg/toybox/rev/810>810</a>: whitespace</li>
    264 <li>commit <a href=/hg/toybox/rev/811>811</a>: description in commit message.</li>
    265 <li>commit <a href=/hg/toybox/rev/871>871</a>: whitespace (reindent from 4 spaces to 2)</li>
    266 <li>commit <a href=/hg/toybox/rev/872>872</a>: Felix Janda - <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000923.html>cleanup</a> (with discussion thread)</li>
    267 <li>commit <a href=/hg/toybox/rev/875>885</a>: Felix Janda - <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000936.html>move permission formatting (777 -> -rwxrwxrwx) from ls to lib so stat can reuse it.</a></li>
    268 <li>commit <a href=/hg/toybox/rev/885>886</a>: Felix Janda - remove unimplemented options and clean up help text</li>
    269 <li>commit <a href=/hg/toybox/rev/910>910</a>: Felix Janda - <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/001013.html>Add support for stating multiple files</a>.</li>
    270 <li>commit <a href=/hg/toybox/rev/911>911</a>: Felix Janda - Separate stat and statfs, give stat_main() a ds[2] array to distinguish FLAG_f vs not cases, and some whitespace changes.</li>
    271 <li>commit <a href=/hg/toybox/rev/912>912</a>: description in commit message (also <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/001019.html>here</a>)</li>
    272 <li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/001024.html>design pondering</a> (leading to peek() function in lib/)</li>
    273 
    274 <li>commit <a href=/hg/toybox/rev/914>914</a>: description in commit message.</li>
    275 <li>commit <a href=/hg/toybox/rev/916>916</a>: description in commit message.</li>
    276 <li>commit: <a href=/hg/toybox/rev/917>917</a>: description in commit message.</li>
    277 <li>commit: <a href=/hg/toybox/rev/918>918</a>,
    278 description: done: move pending to posix, default y, no other changes</a>.</li>
    279 <li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-June/001026.html>summary</a></li>
    280 </ul>
    281 
    282 <p>Status: COMPLETE.</p>
    283 
    284 <!--#include file="footer.html" -->
    285