Busybox TODO

Stuff that needs to be done.  All of this is fair game for 1.2.

build system
  make -j is broken, -j1 is forced atm
  Make sure that the flags get pinned in e.g. Rules.mak so when expanding them
  later on you get the cached result without the need to re-evaluate them.
----
find
  doesn't understand (), lots of susv3 stuff.
----
sh
  The command shell situation is a big mess.  We have three or four different
  shells that don't really share any code, and the "standalone shell" doesn't
  work all that well (especially not in a chroot environment), due to apps not
  being reentrant.  Unifying the various shells and figuring out a configurable
  way of adding the minimal set of bash features a given script uses is a big
  job, but it would be a big improvement.

  Note: Rob Landley (rob@landley.net) is working on a new unified shell called
  bbsh, but it's a low priority...
---
diff
  We should have a diff -u command.  We have patch, we should have diff
  (we only need to support unified diffs though).

  Also, make sure we handle empty files properly:
    From the patch man page:

   you can remove a file by sending out a context diff that compares
   the file to be deleted with an empty file dated the Epoch.  The
   file will be removed unless patch is conforming to POSIX and the
   -E or --remove-empty-files option is not given.
---
patch
  Should have simple fuzz factor support to apply patches at an offset which
  shouldn't take up too much space.

  And while we're at it, a new patch filename quoting format is apparently
  coming soon:  http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2
---
man
  It would be nice to have a man command.  Not one that handles troff or
  anything, just one that can handle preformatted ascii man pages, possibly
  compressed.  This could probably be a script in the extras directory that
  calls cat/zcat/bzcat | less

  (How doclifter might work into this is anybody's guess.)
---
bzip2
  Compression-side support.
---
init
  General cleanup.
---
ar
  Write support?
---
mdev
  Micro-udev.

Architectural issues:

bb_close() with fsync()
  We should have a bb_close() in place of normal close, with a CONFIG_ option
  to not just check the return value of close() for an error, but fsync().
  Close can't reliably report anything useful because if write() accepted the
  data then it either went out to the network or it's in cache or a pipe
  buffer.  Either way, there's no guarantee it'll make it to its final
  destination before close() gets called, so there's no guarantee that any
  error will be reported.

  You need to call fsync() if you care about errors that occur after write(),
  but that can have a big performance impact.  So make it a config option.
---
Unify base64 handling.
  There's base64 encoding and decoding going on in:
    networking/wget.c:base64enc()
    coreutils/uudecode.c:read_base64()
    coreutils/uuencode.c:tbl_base64[]
    networking/httpd.c:decodeBase64()
  And probably elsewhere.  That needs to be unified into libbb functions.
---
Do a SUSv3 audit
  Look at the full Single Unix Specification version 3 (available online at
  "http://www.opengroup.org/onlinepubs/009695399/nfindex.html") and
  figure out which of our apps are compliant, and what we're missing that
  we might actually care about.

  Even better would be some kind of automated compliance test harness that
  exercises each command line option and the various corner cases.
---
Internationalization
  How much internationalization should we do?

  The low hanging fruit is UTF-8 character set support.  We should do this.
  (Vodz pointed out the shell's cmdedit as needing work here.  What else?)

  We also have lots of hardwired english text messages.  Consolidating this
  into some kind of message table not only makes translation easier, but
  also allows us to consolidate redundant (or close) strings.

  We probably don't want to be bloated with locale support.  (Not unless we can
  cleanly export it from our underlying C library without having to concern
  ourselves with it directly.  Perhaps a few specific things like a config
  option for "date" are low hanging fruit here?)

  What level should things happen at?  How much do we care about
  internationalizing the text console when X11 and xterms are so much better
  at it?  (There's some infrastructure here we don't implement: The
  "unicode_start" and "unicode_stop" shell scripts need "vt-is-UTF8" and a
  --unicode option to loadkeys.  That implies a real loadkeys/dumpkeys
  implementation to replace loadkmap/dumpkmap.  Plus messing with console font
  loading.  Is it worth it, or do we just say "use X"?)
---
Unify archivers
  Lots of archivers have the same general infrastructure.  The directory
  traversal code should be factored out, and the guts of each archiver could
  be some setup code and a series of callbacks for "add this file",
  "add this directory", "add this symlink" and so on.

  This could clean up tar and zip, and make it cheaper to add cpio and ar
  write support, and possibly even cheaply add things like mkisofs or
  mksquashfs someday, if they become relevant.
---
Text buffer support.
  Several existing applets (sort, vi, less...) read
  a whole file into memory and act on it.  There might be an opportunity
  for shared code in there that could be moved into libbb...
---
Individual compilation of applets.
  It would be nice if busybox had the option to compile to individual applets,
  for people who want an alternate implementation less bloated than the gnu
  utils (or simply with less political baggage), but without it being one big
  executable.

  Turning libbb into a real dll is another possibility, especially if libbb
  could export some of the other library interfaces we've already more or less
  got the code for (like zlib).
---
buildroot - Make a "dogfood" option
  Busybox 1.1 will be capable of replacing most gnu packages for real world use,
  such as developing software or in a live CD.  It needs wider testing.

  Busybox should now be able to replace bzip2, coreutils, e2fsprogs, file,
  findutils, gawk, grep, inetutils, less, modutils, net-tools, patch, procps,
  sed, shadow, sysklogd, sysvinit, tar, util-linux, and vim.  The resulting
  system should be self-hosting (I.E. able to rebuild itself from source code).
  This means it would need (at least) binutils, gcc, and make, or equivalents.

  It would be a good "eating our own dogfood" test if buildroot had the option
  of using a "make allyesconfig" busybox instead of the all of the above
  packages.  Anything that's wrong with the resulting system, we can fix.  (It
  would be nice to be able to upgrade busybox to be able to replace bash and
  diffutils as well, but we're not there yet.)

  One example of an existing system that does this already is Firmware Linux:
    http://www.landley.net/code/firmware
---
initramfs
  Busybox should have a sample initramfs build script.  This depends on
  bbsh, mdev, and switch_root.
---
Memory Allocation
  We have a CONFIG_BUFFER mechanism that lets us select whether to do memory
  allocation on the stack or the heap.  Unfortunately, we're not using it much.
  We need to audit our memory allocations and turn a lot of malloc/free calls
  into RESERVE_CONFIG_BUFFER/RELEASE_CONFIG_BUFFER.
  For a start, see e.g. make CFLAGS_EXTRA=-Wlarger-than-64

  And while we're at it, many of the CONFIG_FEATURE_CLEAN_UP #ifdefs will be
  optimized out by the compiler in the stack allocation case (since there's no
  free for an alloca()), and this means that various cleanup loops that just
  call free might also be optimized out by the compiler if written right, so
  we can yank those #ifdefs too, and generally clean up the code.
---
Switch CONFIG_SYMBOLS to ENABLE_SYMBOLS

  In busybox 1.0 and earlier, configuration was done by CONFIG_SYMBOLS
  that were either defined or undefined to indicate whether the symbol was
  selected in the .config file.  They were used with #ifdefs, ala:

    #ifdef CONFIG_SYMBOL
      if (other_test) {
        do_code();
      }
    #endif

  In 1.1, we have new ENABLE_SYMBOLS which are always defined (as 0 or 1),
  meaning you can still use them for preprocessor tests by replacing
  "#ifdef CONFIG_SYMBOL" with "#if ENABLE_SYMBOL".  But more importantly, we
  can use them as a true or false test in normal C code:

    if (ENABLE_SYMBOL && other_test) {
      do_code();
    }

  (Optimizing away if() statements that resolve to a constant value
  is known as "dead code elimination", an optimization so old and simple that
  Turbo Pascal for DOS did it twenty years ago.  Even modern mini-compilers
  like the Tiny C Compiler (tcc) and the Small Device C Compiler (SDCC)
  perform dead code elimination.)

  Right now, busybox.h is #including both "config.h" (defining the
  CONFIG_SYMBOLS) and "bb_config.h" (defining the ENABLE_SYMBOLS).  At some
  point in the future, it would be nice to wean ourselves off of the
  CONFIG versions.  (Among other things, some defective build environments
  leak the Linux kernel's CONFIG_SYMBOLS into the system's standard #include
  files.  We've experienced collisions before.)
---
FEATURE_CLEAN_UP
  This is more an unresolved issue than a to-do item.  More thought is needed.

  Normally we rely on exit() to free memory, close files, and unmap segments
  for us.  This makes most calls to free(), close(), and unmap() optional in
  busybox applets that don't intend to run for very long, and optional stuff
  can be omitted to save size.

  The idea was raised that we could simulate fork/exit with setjmp/longjmp
  for _really_ brainless embedded systems, or speed up the standalone shell
  by not forking.  Doing so would require a reliable FEATURE_CLEAN_UP.
  Unfortunately, this isn't as easy as it sounds.

  The problem is, lots of things exit(), sometimes unexpectedly (xmalloc())
  and sometimes reliably (bb_perror_msg_and_die() or show_usage()).  This
  jumps out of the normal flow control and bypasses any cleanup code we
  put at the end of our applets.

  It's possible to add hooks to libbb functions like xmalloc() and bb_xopen()
  to add their entries to a linked list, which could be traversed and
  freed/closed automatically.  (This would need to be able to free just the
  entries after a checkpoint to be usable for a forkless standalone shell.
  You don't want to free the shell's own resources.)

  Right now, FEATURE_CLEAN_UP is more or less a debugging aid, to make things
  like valgrind happy.  It's also documentation of _what_ we're trusting
  exit() to clean up for us.  But new infrastructure to auto-free stuff would
  render the existing FEATURE_CLEAN_UP code redundant.

  For right now, exit() handles it just fine.



Minor stuff:
  watchdog.c could autodetect the timer duration via:
    if(!ioctl (fd, WDIOC_GETTIMEOUT, &tmo)) timer_duration = 1 + (tmo / 2);
  Unfortunately, that needs linux/watchdog.h and that contains unfiltered
  kernel types on some distros, which breaks the build.


Code cleanup:

Replace deprecated functions.

bzero() -> memset()
---
sigblock(), siggetmask(), sigsetmask(), sigmask() -> sigprocmask et al
---

