10f66f451Sopenharmony_ci<html><head><title>toybox cleanup</title></head> 20f66f451Sopenharmony_ci<!--#include file="header.html" --> 30f66f451Sopenharmony_ci 40f66f451Sopenharmony_ci<h1>Index</h1> 50f66f451Sopenharmony_ci 60f66f451Sopenharmony_ci<ul> 70f66f451Sopenharmony_ci<li><a href=#intro>Introduction</a></li> 80f66f451Sopenharmony_ci<li><a href=#advice>Advice</a></li> 90f66f451Sopenharmony_ci<li>Commands:</li> 100f66f451Sopenharmony_ci<ul> 110f66f451Sopenharmony_ci<li><a href=#uuencode>uuencode</a></li> 120f66f451Sopenharmony_ci<li><a href=#uudecode>uudecode</a></li> 130f66f451Sopenharmony_ci<li><a href=#ifconfig>ifconfig</a></li> 140f66f451Sopenharmony_ci<li><a href=#stat>stat</a></li> 150f66f451Sopenharmony_ci</ul> 160f66f451Sopenharmony_ci</ul> 170f66f451Sopenharmony_ci 180f66f451Sopenharmony_ci<hr> 190f66f451Sopenharmony_ci 200f66f451Sopenharmony_ci<a name=intro /> 210f66f451Sopenharmony_ci<h1>Cleaning up the toybox code.</h1> 220f66f451Sopenharmony_ci 230f66f451Sopenharmony_ci<p>Toybox <a href=http://landley.net/notes.html#31-03-2013>hasn't always</a> 240f66f451Sopenharmony_citaken proper advantage of external contributions</a>. 250f66f451Sopenharmony_ciLots of people want to help, but their contributions languish out of tree 260f66f451Sopenharmony_cior in the "pending" directory, awaiting cleanup.</p> 270f66f451Sopenharmony_ci 280f66f451Sopenharmony_ci<p>Toybox's design goals require simpler, tighter, and more explicit code 290f66f451Sopenharmony_cithan most other implementations, among other reasons to allow better security 300f66f451Sopenharmony_ciauditing. Writing "another" implementation of standard command line tools 310f66f451Sopenharmony_ciisn't very interesting, they should be _better_ implementations. 320f66f451Sopenharmony_ciUnfortunately, this means existing, working commands often take more effort to 330f66f451Sopenharmony_ciclean up to Toybox's standards than writing a new one from scratch, not 340f66f451Sopenharmony_cibecause they don't work, but because we aim for an unusual level of polish.</p> 350f66f451Sopenharmony_ci 360f66f451Sopenharmony_ci<p>In hopes of teaching more people how to do this 370f66f451Sopenharmony_cicleanup work, I've started breaking cleanup changes into smaller chunks and 380f66f451Sopenharmony_ciposting explanations of each change to the mailing list. 390f66f451Sopenharmony_ciBelow are indexes of such cleanup series. Each commit and post are meant to 400f66f451Sopenharmony_cibe read together: each description explains what the corresponding patch 410f66f451Sopenharmony_ciwas trying to accomplish.</p> 420f66f451Sopenharmony_ci 430f66f451Sopenharmony_ci<p>Line/byte totals of completed series are given for scale, but the point 440f66f451Sopenharmony_ciof this work is simplicity and compactness, not size per se.</p> 450f66f451Sopenharmony_ci 460f66f451Sopenharmony_ci<p>(Note: mercurial's web viewer doesn't follow renames, so although each 470f66f451Sopenharmony_cicommand name links to a commit list with the bulk of the changes, it may 480f66f451Sopenharmony_cinot include the final version of each file moved from the "pending" 490f66f451Sopenharmony_cidirectory to its final location. The summaries link the initial and cleaned 500f66f451Sopenharmony_civersions of each file when giving line counts.)</p> 510f66f451Sopenharmony_ci 520f66f451Sopenharmony_ci<hr> 530f66f451Sopenharmony_ci 540f66f451Sopenharmony_ci<a name=advice /> 550f66f451Sopenharmony_ci<h1>General advice and/or policy.</h1> 560f66f451Sopenharmony_ci 570f66f451Sopenharmony_ci<p>The <a href=design.html>design of toybox</a> page and the coding 580f66f451Sopenharmony_cistyle section at the start of the <a href=code.html>source code walkthrough</a> 590f66f451Sopenharmony_cidon't cover everything. Here are some 600f66f451Sopenharmony_cilinks to mailing list messages that cover various programming topics 610f66f451Sopenharmony_cinot directly related to a specific cleanup series:</p> 620f66f451Sopenharmony_ci 630f66f451Sopenharmony_ci<ul> 640f66f451Sopenharmony_ci<li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000850.html>Error messages and internationalization.</a></li> 650f66f451Sopenharmony_ci<li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000891.html>Why not "const"?</a> (Exception: global variables 660f66f451Sopenharmony_cioutside of GLOBALS can be static const, to go in rodata instead of data. 670f66f451Sopenharmony_ciThis means the pages can be shared between instances.)</li> 680f66f451Sopenharmony_ci<li><a href=http://lkml.indiana.edu/hypermail/linux/kernel/1308.3/03890.html>Why not "bool"?</a> (explanation from Linus Torvalds)</li> 690f66f451Sopenharmony_ci<li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000893.html>Why not to check in debug code.</a></li> 700f66f451Sopenharmony_ci<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> 710f66f451Sopenharmony_ci<li>"Hiding numbers that are used just once into defines to put them out of 720f66f451Sopenharmony_cisight does not really help readability."</a> - 730f66f451Sopenharmony_ci<a href=http://lkml.iu.edu/hypermail/linux/kernel/1407.1/00299.html>Pavel 740f66f451Sopenharmony_ciMachek</a></li> 750f66f451Sopenharmony_ci<li>"Infrastructure in search of a user" is a bad thing, so don't put code 760f66f451Sopenharmony_ciin lib/ that doesn't already have at least two users. Don't preemptively 770f66f451Sopenharmony_cifactor stuff out, it's easy enough to rewrite it uin future if it needs 780f66f451Sopenharmony_cito change. The "extreme programming" fad called this "You Ain't Gonna 790f66f451Sopenharmony_ciNeed It" (while inexplicably screaming at cans of Mountain Dew, back in the 800f66f451Sopenharmony_ci90's). Here's <a href=https://lwn.net/Articles/683745/>Linus Torvalds' take</a>.</li> 810f66f451Sopenharmony_ci</ul> 820f66f451Sopenharmony_ci 830f66f451Sopenharmony_ci<hr> 840f66f451Sopenharmony_ci 850f66f451Sopenharmony_ci<a name="uuencode"><h1><a href=/hg/toybox/log/900/toys/pending/uuencode.c>uuencode</a></h1> 860f66f451Sopenharmony_ci 870f66f451Sopenharmony_ci<p>This is an example of cleaning up something most projects would be quite 880f66f451Sopenharmony_cihappy with. The initial submission of uuencode and uudecode was high 890f66f451Sopenharmony_ciquality code, written by a seasoned developer who did an excellent 900f66f451Sopenharmony_cijob, but it was still possible to shrink the result almost by half:</p> 910f66f451Sopenharmony_ci 920f66f451Sopenharmony_ci<ul> 930f66f451Sopenharmony_ci<li>old total: <a href=/hg/toybox/file/828/toys/pending/uuencode.c>116 lines (2743 940f66f451Sopenharmony_cibytes) in 7 functions</a></li> 950f66f451Sopenharmony_ci<li>new total: <a href=/hg/toybox/file/841/toys/posix/uuencode.c>67 lines (1440 960f66f451Sopenharmony_cibytes) in 1 function</a></li> 970f66f451Sopenharmony_ci</ul> 980f66f451Sopenharmony_ci 990f66f451Sopenharmony_ci<ul> 1000f66f451Sopenharmony_ci<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>, 1010f66f451Sopenharmony_ci<a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000903.html>part 2</a></li> 1020f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/831>831</a>, 1030f66f451Sopenharmony_cisecond pass, description: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000919.html>part 3</a></li> 1040f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/837>837</a>, 1050f66f451Sopenharmony_cidescription: fix test suite.</li> 1060f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/853>853</a>, description: bugfix.</li> 1070f66f451Sopenharmony_ci</ul> 1080f66f451Sopenharmony_ci 1090f66f451Sopenharmony_ci<p>Status: COMPLETE</p> 1100f66f451Sopenharmony_ci 1110f66f451Sopenharmony_ci<a name="uudecode"><h1><a href=/hg/toybox/log/900/toys/pending/uudecode.c>uudecode</a></h1> 1120f66f451Sopenharmony_ci 1130f66f451Sopenharmony_ci<p>The uudecode cleanup was my second "explain as I go along" cleanup, 1140f66f451Sopenharmony_ciand I tried to do it in smaller stages so it was easier to see what 1150f66f451Sopenharmony_cichanged from the diff:</p> 1160f66f451Sopenharmony_ci 1170f66f451Sopenharmony_ci<ul> 1180f66f451Sopenharmony_ci<li>old: <a href=/hg/toybox/file/828/toys/pending/uudecode.c>175 1190f66f451Sopenharmony_cilines (4534 bytes) in 9 functions</a></li> 1200f66f451Sopenharmony_ci<li>new: <a href=/hg/toybox/file/840/toys/posix/uudecode.c>107 lines 1210f66f451Sopenharmony_ci(2300 bytes) in 1 function</a></li> 1220f66f451Sopenharmony_ci</ul> 1230f66f451Sopenharmony_ci 1240f66f451Sopenharmony_ci<ul> 1250f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/833>833</a>, 1260f66f451Sopenharmony_cidescription: preparatory adjustments to test suite.</li> 1270f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/835>835</a>, 1280f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001532.html>Redo command line parsing, redo parsing loop.</a></li> 1290f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/838>838</a>, 1300f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001533.html>Redo b64_1byte, b64_4bytes, and uu_line()</a></li> 1310f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/839>839</a>, 1320f66f451Sopenharmony_cidescription: todo</a></li> 1330f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/840>840</a>, 1340f66f451Sopenharmony_cidescription: todo (finish, move pending->posix, default y)</a></li> 1350f66f451Sopenharmony_ci</ul> 1360f66f451Sopenharmony_ci 1370f66f451Sopenharmony_ci<p>Status: COMPLETE</p> 1380f66f451Sopenharmony_ci 1390f66f451Sopenharmony_ci<a name=ifconfig> 1400f66f451Sopenharmony_ci<h1><a href=/hg/toybox/log/tip/toys/pending/ifconfig.c>ifconfig</a></h1> 1410f66f451Sopenharmony_ci 1420f66f451Sopenharmony_ci<p>This series describes a thorough cleanup that took a while to do.</p> 1430f66f451Sopenharmony_ci 1440f66f451Sopenharmony_ci<p>When ifconfig was submitted, it touched a half-dozen files. I glued it 1450f66f451Sopenharmony_citogether into a single self-contained file, which needed a lot of 1460f66f451Sopenharmony_cicleanup. The final version is about 1/3 the size of the original.</p> 1470f66f451Sopenharmony_ci 1480f66f451Sopenharmony_ci<ul> 1490f66f451Sopenharmony_ci<li>old total: <a href=/hg/toybox/file/841/toys/pending/ifconfig.c>1504 lines (44268 bytes) in 38 functions</a></li> 1500f66f451Sopenharmony_ci<li>new total: <a href=/hg/toybox/file/1133/toys/other/ifconfig.c>521 lines (15963 bytes) in 4 functions</a></li> 1510f66f451Sopenharmony_ci</ul> 1520f66f451Sopenharmony_ci 1530f66f451Sopenharmony_ci<p>This was the first command I started cleaning up with the intent of 1540f66f451Sopenharmony_cidescribing the process, and especially the first few entries in this 1550f66f451Sopenharmony_ciseries describe many of the low hanging fruit techniques used to clean 1560f66f451Sopenharmony_ciup a codebase.</p> 1570f66f451Sopenharmony_ci 1580f66f451Sopenharmony_ci<ul> 1590f66f451Sopenharmony_ci<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, 1600f66f451Sopenharmony_ciunnecessary #defines, shorter code is easier to read.</a></li> 1610f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/844>844</a>, 1620f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000881.html>Headers, replacing repeated code with loops, 1630f66f451Sopenharmony_cilogical operators guaranteed to return 0 or 1, math on string constants, 1640f66f451Sopenharmony_ciremoving unnecessary variables and tests.</a></li> 1650f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/852>852</a>, 1660f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000921.html>hg commit numbers, documenting the obvious, ordering 1670f66f451Sopenharmony_cito avoid prototypes, returning void, collate local declarations, 1680f66f451Sopenharmony_ciuse error_exit(), unnecessary parentheses, inline to remove variables/functions 1690f66f451Sopenharmony_ciused only once, using *var instead of var[0], unnecessary typecasts, 1700f66f451Sopenharmony_cixprintf("\n") vs xputc('\n')</a></li> 1710f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/856>856</a>, 1720f66f451Sopenharmony_cidescription: one line portability fix from Isaac Dunham</li> 1730f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/861>861</a> 1740f66f451Sopenharmony_ciand <a href=/hg/toybox/rev/863>863</a>, 1750f66f451Sopenharmony_cidescription: 1760f66f451Sopenharmony_ci<a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000910.html>Help 1770f66f451Sopenharmony_ciinfrastructure cleanup from Isaac Dunham</a> 1780f66f451Sopenharmony_ci(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> 1790f66f451Sopenharmony_ci 1800f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/862>862</a>, description: 1810f66f451Sopenharmony_ci<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> 1820f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/864>864</a>, description: 1830f66f451Sopenharmony_ci<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> 1840f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/866>866</a>, description: 1850f66f451Sopenharmony_ci<a href=http://lists.landley.net/pipermail/toybox-landley.net/2014-January/001528.html>move standalone globals into GLOBALS() block, collate structs into 1860f66f451Sopenharmony_ciiface_list. Inline/rewrite/remove field_format, iface_flags_str, 1870f66f451Sopenharmony_ciomit_whitespace(), print_iface_flags(), print_media(), get_ifconfig_info(), 1880f66f451Sopenharmony_ciand clear_list(). Merge duplicate function 1890f66f451Sopenharmony_cicalls. Show get_proc_info() version field can't matter in 2.6 or newer kernel, 1900f66f451Sopenharmony_ciand that SIOCGIFMAP has been there since 1994 so doesn't need an #ifdef. 1910f66f451Sopenharmony_ciLoop simplification in readconf() and show_iface().</a></li> 1920f66f451Sopenharmony_ci 1930f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/869>869</a> and <a href=/hg/toybox/rev/870>870</a>, 1940f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000928.html>869: 1950f66f451Sopenharmony_cireorder to eliminate prototypes, put command_main() at end of file, 1960f66f451Sopenharmony_ci870: long repeated variable prefixes, replacing struct+sscanf()+printf with a 1970f66f451Sopenharmony_ciloop and a table (from iface_list, get_proc_info(), display_ifconfig()), 1980f66f451Sopenharmony_ciuse lib/xwrap.c functions to return void, why xstrcpy() fails closed, 1990f66f451Sopenharmony_ci(functional comment: why multicast failed, CSLIP obsolecense), not being 2000f66f451Sopenharmony_ci_too_ clever.</a></li> 2010f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/878>878</a> and <a href=/hg/toybox/rev/879>879</a>: 2020f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-April/000946.html>878: add xsocket(), free(NULL) is a safe NOP (posix!). 2030f66f451Sopenharmony_ci879: inline three functions and simplify, some simplifications only show up 2040f66f451Sopenharmony_ciafter repeated inlining</a></li> 2050f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/883>883</a>, 2060f66f451Sopenharmony_cidescription: move some common code to lib/ and posix headers to toys.h.</li> 2070f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/898>898</a>, 2080f66f451Sopenharmony_cidescription: <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 2090f66f451Sopenharmony_cian array, genericize minus prefix logic, inline a use of set_flags().)</a></li> 2100f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/905>905</a>, 2110f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/000992.html>remove unnecessary wrapper function, inlining more functions, 2120f66f451Sopenharmony_cirelying on the values of constants that don't change across architectures 2130f66f451Sopenharmony_ci(binary backwards compatability), more ifconfig_main table work, 2140f66f451Sopenharmony_ciman ioctl_list.</a></li> 2150f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/906>906</a>, 2160f66f451Sopenharmony_cidescription: <a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-May/000994.html>More ifconfig_main() table work, remove vestigial arguments 2170f66f451Sopenharmony_cito functions, "a frenzy of inlining", slightly better error reporting, 2180f66f451Sopenharmony_cidon't reinvent libc functions.</a></li> 2190f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/907>907</a>, 2200f66f451Sopenharmony_ci<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() 2210f66f451Sopenharmony_ciand set_hw_address(), stop validating data we supplied, remove a table 2220f66f451Sopenharmony_cithat's overkill (two entries, we don't even loop over it), when you don't need a 2230f66f451Sopenharmony_ciNULL terminator for array, remove unnecessary memcpy(offsetof()) with 2240f66f451Sopenharmony_ciassignment, trusting -funsigned-char.</a></li> 2250f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/919>919</a>, 2260f66f451Sopenharmony_ci<a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-June/001027.html>todo whitespace damage, introduce IFREQ_OFFSZ() and poke() to 2270f66f451Sopenharmony_ciifconfig_main() table logic to fold more if/else parts into the table</a></li> 2280f66f451Sopenharmony_ci<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> 2290f66f451Sopenharmony_ci<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> 2300f66f451Sopenharmony_ci<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> 2310f66f451Sopenharmony_ci<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> 2320f66f451Sopenharmony_ci<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> 2330f66f451Sopenharmony_ci<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> 2340f66f451Sopenharmony_ci<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> 2350f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/1132>1132</a>, description: promotion from pending to other</li> 2360f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/1133>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> 2370f66f451Sopenharmony_ci</ul> 2380f66f451Sopenharmony_ci 2390f66f451Sopenharmony_ci<p>Status: COMPLETE.</p> 2400f66f451Sopenharmony_ci 2410f66f451Sopenharmony_ci<p>Status: in progress.</p> 2420f66f451Sopenharmony_ci 2430f66f451Sopenharmony_ci<a name=stat> 2440f66f451Sopenharmony_ci<h1><a href=/hg/toybox/log/917/toys/pending/stat.c>stat</a></h1> 2450f66f451Sopenharmony_ci 2460f66f451Sopenharmony_ci<p>A lot of the stat cleanup was done by Felix Janda.</p> 2470f66f451Sopenharmony_ci 2480f66f451Sopenharmony_ci<ul> 2490f66f451Sopenharmony_ci<li>commit <a href=/hg/toybox/rev/747>747</a>: initial submission</a></li> 2500f66f451Sopenharmony_ci<li>commit <a href=/hg/toybox/rev/810>810</a>: whitespace</li> 2510f66f451Sopenharmony_ci<li>commit <a href=/hg/toybox/rev/811>811</a>: description in commit message.</li> 2520f66f451Sopenharmony_ci<li>commit <a href=/hg/toybox/rev/871>871</a>: whitespace (reindent from 4 spaces to 2)</li> 2530f66f451Sopenharmony_ci<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> 2540f66f451Sopenharmony_ci<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> 2550f66f451Sopenharmony_ci<li>commit <a href=/hg/toybox/rev/885>886</a>: Felix Janda - remove unimplemented options and clean up help text</li> 2560f66f451Sopenharmony_ci<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> 2570f66f451Sopenharmony_ci<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> 2580f66f451Sopenharmony_ci<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> 2590f66f451Sopenharmony_ci<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> 2600f66f451Sopenharmony_ci 2610f66f451Sopenharmony_ci<li>commit <a href=/hg/toybox/rev/914>914</a>: description in commit message.</li> 2620f66f451Sopenharmony_ci<li>commit <a href=/hg/toybox/rev/916>916</a>: description in commit message.</li> 2630f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/917>917</a>: description in commit message.</li> 2640f66f451Sopenharmony_ci<li>commit: <a href=/hg/toybox/rev/918>918</a>, 2650f66f451Sopenharmony_cidescription: done: move pending to posix, default y, no other changes</a>.</li> 2660f66f451Sopenharmony_ci<li><a href=http://lists.landley.net/pipermail/toybox-landley.net/2013-June/001026.html>summary</a></li> 2670f66f451Sopenharmony_ci</ul> 2680f66f451Sopenharmony_ci 2690f66f451Sopenharmony_ci<p>Status: COMPLETE.</p> 2700f66f451Sopenharmony_ci 2710f66f451Sopenharmony_ci<!--#include file="footer.html" --> 272