- add note about need to unify the 4 itoa() implementations.
[platform/upstream/busybox.git] / TODO
1 Busybox TODO
2
3 Stuff that needs to be done.  This is organized by who plans to get around to
4 doing it eventually, but that doesn't mean they "own" the item.  If you want to
5 do one of these bounce an email off the person it's listed under to see if they
6 have any suggestions how they plan to go about it, and to minimize conflicts
7 between your work and theirs.  But otherwise, all of these are fair game.
8
9 Rob Landley <rob@landley.net>:
10   Add BB_NOMMU to platform.h and migrate __uClinux__ tests to that.
11     #if defined __UCLIBC__ && !defined __ARCH_USE_MMU__
12   Add a libbb/platform.c
13     Implement fdprintf() for platforms that haven't got one.
14     Implement bb_realpath() that can handle NULL on non-glibc.
15     Cleanup bb_asprintf()
16
17   Migrate calloc() and bb_calloc() occurrences to bb_xzalloc().
18   Remove obsolete _() wrapper crud for internationalization we don't do.
19   Figure out where we need utf8 support, and add it.
20
21   sh
22     The command shell situation is a big mess.  We have three or four different
23     shells that don't really share any code, and the "standalone shell" doesn't
24     work all that well (especially not in a chroot environment), due to apps not
25     being reentrant.  I'm writing a new shell (bbsh) to unify the various
26     shells and configurably add the minimal set of bash features people
27     actually use.  The hardest part is it has to configure down as small as
28     lash while providing lash's features.  The rest is easy in comparison.
29   bzip2
30     Compression-side support.
31   init
32     General cleanup (should use ENABLE_FEATURE_INIT_SYSLOG and ENABLE_FEATURE_INIT_DEBUG).
33   Unify base64 handling.
34     There's base64 encoding and decoding going on in:
35       networking/wget.c:base64enc()
36       coreutils/uudecode.c:read_base64()
37       coreutils/uuencode.c:tbl_base64[]
38       networking/httpd.c:decodeBase64()
39     And probably elsewhere.  That needs to be unified into libbb functions.
40   Do a SUSv3 audit
41     Look at the full Single Unix Specification version 3 (available online at
42     "http://www.opengroup.org/onlinepubs/009695399/nfindex.html") and
43     figure out which of our apps are compliant, and what we're missing that
44     we might actually care about.
45
46     Even better would be some kind of automated compliance test harness that
47     exercises each command line option and the various corner cases.
48   Internationalization
49     How much internationalization should we do?
50
51     The low hanging fruit is UTF-8 character set support.  We should do this.
52     (Vodz pointed out the shell's cmdedit as needing work here.  What else?)
53
54     We also have lots of hardwired english text messages.  Consolidating this
55     into some kind of message table not only makes translation easier, but
56     also allows us to consolidate redundant (or close) strings.
57
58     We probably don't want to be bloated with locale support.  (Not unless we
59     can cleanly export it from our underlying C library without having to
60     concern ourselves with it directly.  Perhaps a few specific things like a
61     config option for "date" are low hanging fruit here?)
62
63     What level should things happen at?  How much do we care about
64     internationalizing the text console when X11 and xterms are so much better
65     at it?  (There's some infrastructure here we don't implement: The
66     "unicode_start" and "unicode_stop" shell scripts need "vt-is-UTF8" and a
67     --unicode option to loadkeys.  That implies a real loadkeys/dumpkeys
68     implementation to replace loadkmap/dumpkmap.  Plus messing with console font
69     loading.  Is it worth it, or do we just say "use X"?)
70
71   Individual compilation of applets.
72     It would be nice if busybox had the option to compile to individual applets,
73     for people who want an alternate implementation less bloated than the gnu
74     utils (or simply with less political baggage), but without it being one big
75     executable.
76
77     Turning libbb into a real dll is another possibility, especially if libbb
78     could export some of the other library interfaces we've already more or less
79     got the code for (like zlib).
80   buildroot - Make a "dogfood" option
81     Busybox 1.1 will be capable of replacing most gnu packages for real world
82     use, such as developing software or in a live CD.  It needs wider testing.
83
84     Busybox should now be able to replace bzip2, coreutils, e2fsprogs, file,
85     findutils, gawk, grep, inetutils, less, modutils, net-tools, patch, procps,
86     sed, shadow, sysklogd, sysvinit, tar, util-linux, and vim.  The resulting
87     system should be self-hosting (I.E. able to rebuild itself from source
88     code).  This means it would need (at least) binutils, gcc, and make, or
89     equivalents.
90
91     It would be a good "eating our own dogfood" test if buildroot had the option
92     of using a "make allyesconfig" busybox instead of the all of the above
93     packages.  Anything that's wrong with the resulting system, we can fix.  (It
94     would be nice to be able to upgrade busybox to be able to replace bash and
95     diffutils as well, but we're not there yet.)
96
97     One example of an existing system that does this already is Firmware Linux:
98       http://www.landley.net/code/firmware
99   initramfs
100     Busybox should have a sample initramfs build script.  This depends on
101     bbsh, mdev, and switch_root.
102
103
104 Bernhard Fischer <rep.nop@anon.at>:
105   Makefile stuff:
106     make -j is broken, -j1 is forced atm
107   New debug options:
108     -Wlarger-than-127
109   Collate BUFSIZ IOBUF_SIZE MY_BUF_SIZE PIPE_PROGRESS_SIZE BUFSIZE PIPESIZE
110     Use bb_common_bufsiz1?
111
112 As yet unclaimed:
113
114 ----
115 find
116   doesn't understand (), lots of susv3 stuff.
117 ----
118 diff
119   Make sure we handle empty files properly:
120     From the patch man page:
121
122    you can remove a file by sending out a context diff that compares
123    the file to be deleted with an empty file dated the Epoch.  The
124    file will be removed unless patch is conforming to POSIX and the
125    -E or --remove-empty-files option is not given.
126 ---
127 patch
128   Should have simple fuzz factor support to apply patches at an offset which
129   shouldn't take up too much space.
130
131   And while we're at it, a new patch filename quoting format is apparently
132   coming soon:  http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2
133 ---
134 man
135   It would be nice to have a man command.  Not one that handles troff or
136   anything, just one that can handle preformatted ascii man pages, possibly
137   compressed.  This could probably be a script in the extras directory that
138   calls cat/zcat/bzcat | less
139
140   (How doclifter might work into this is anybody's guess.)
141 ---
142 ar
143   Write support?
144 ---
145 crond
146   turn FEATURE_DEBUG_OPT into ENABLE_FEATURE_CROND_DEBUG_OPT
147
148 Architectural issues:
149
150 bb_close() with fsync()
151   We should have a bb_close() in place of normal close, with a CONFIG_ option
152   to not just check the return value of close() for an error, but fsync().
153   Close can't reliably report anything useful because if write() accepted the
154   data then it either went out to the network or it's in cache or a pipe
155   buffer.  Either way, there's no guarantee it'll make it to its final
156   destination before close() gets called, so there's no guarantee that any
157   error will be reported.
158
159   You need to call fsync() if you care about errors that occur after write(),
160   but that can have a big performance impact.  So make it a config option.
161 ---
162 Unify archivers
163   Lots of archivers have the same general infrastructure.  The directory
164   traversal code should be factored out, and the guts of each archiver could
165   be some setup code and a series of callbacks for "add this file",
166   "add this directory", "add this symlink" and so on.
167
168   This could clean up tar and zip, and make it cheaper to add cpio and ar
169   write support, and possibly even cheaply add things like mkisofs or
170   mksquashfs someday, if they become relevant.
171 ---
172 Text buffer support.
173   Several existing applets (sort, vi, less...) read
174   a whole file into memory and act on it.  There might be an opportunity
175   for shared code in there that could be moved into libbb...
176 ---
177 Memory Allocation
178   We have a CONFIG_BUFFER mechanism that lets us select whether to do memory
179   allocation on the stack or the heap.  Unfortunately, we're not using it much.
180   We need to audit our memory allocations and turn a lot of malloc/free calls
181   into RESERVE_CONFIG_BUFFER/RELEASE_CONFIG_BUFFER.
182   For a start, see e.g. make CFLAGS_EXTRA=-Wlarger-than-64
183
184   And while we're at it, many of the CONFIG_FEATURE_CLEAN_UP #ifdefs will be
185   optimized out by the compiler in the stack allocation case (since there's no
186   free for an alloca()), and this means that various cleanup loops that just
187   call free might also be optimized out by the compiler if written right, so
188   we can yank those #ifdefs too, and generally clean up the code.
189 ---
190 Switch CONFIG_SYMBOLS to ENABLE_SYMBOLS
191
192   In busybox 1.0 and earlier, configuration was done by CONFIG_SYMBOLS
193   that were either defined or undefined to indicate whether the symbol was
194   selected in the .config file.  They were used with #ifdefs, ala:
195
196     #ifdef CONFIG_SYMBOL
197       if (other_test) {
198         do_code();
199       }
200     #endif
201
202   In 1.1, we have new ENABLE_SYMBOLS which are always defined (as 0 or 1),
203   meaning you can still use them for preprocessor tests by replacing
204   "#ifdef CONFIG_SYMBOL" with "#if ENABLE_SYMBOL".  But more importantly, we
205   can use them as a true or false test in normal C code:
206
207     if (ENABLE_SYMBOL && other_test) {
208       do_code();
209     }
210
211   (Optimizing away if() statements that resolve to a constant value
212   is known as "dead code elimination", an optimization so old and simple that
213   Turbo Pascal for DOS did it twenty years ago.  Even modern mini-compilers
214   like the Tiny C Compiler (tcc) and the Small Device C Compiler (SDCC)
215   perform dead code elimination.)
216
217   Right now, busybox.h is #including both "config.h" (defining the
218   CONFIG_SYMBOLS) and "bb_config.h" (defining the ENABLE_SYMBOLS).  At some
219   point in the future, it would be nice to wean ourselves off of the
220   CONFIG versions.  (Among other things, some defective build environments
221   leak the Linux kernel's CONFIG_SYMBOLS into the system's standard #include
222   files.  We've experienced collisions before.)
223 ---
224 FEATURE_CLEAN_UP
225   This is more an unresolved issue than a to-do item.  More thought is needed.
226
227   Normally we rely on exit() to free memory, close files, and unmap segments
228   for us.  This makes most calls to free(), close(), and unmap() optional in
229   busybox applets that don't intend to run for very long, and optional stuff
230   can be omitted to save size.
231
232   The idea was raised that we could simulate fork/exit with setjmp/longjmp
233   for _really_ brainless embedded systems, or speed up the standalone shell
234   by not forking.  Doing so would require a reliable FEATURE_CLEAN_UP.
235   Unfortunately, this isn't as easy as it sounds.
236
237   The problem is, lots of things exit(), sometimes unexpectedly (xmalloc())
238   and sometimes reliably (bb_perror_msg_and_die() or show_usage()).  This
239   jumps out of the normal flow control and bypasses any cleanup code we
240   put at the end of our applets.
241
242   It's possible to add hooks to libbb functions like xmalloc() and bb_xopen()
243   to add their entries to a linked list, which could be traversed and
244   freed/closed automatically.  (This would need to be able to free just the
245   entries after a checkpoint to be usable for a forkless standalone shell.
246   You don't want to free the shell's own resources.)
247
248   Right now, FEATURE_CLEAN_UP is more or less a debugging aid, to make things
249   like valgrind happy.  It's also documentation of _what_ we're trusting
250   exit() to clean up for us.  But new infrastructure to auto-free stuff would
251   render the existing FEATURE_CLEAN_UP code redundant.
252
253   For right now, exit() handles it just fine.
254
255
256
257 Minor stuff:
258   watchdog.c could autodetect the timer duration via:
259     if(!ioctl (fd, WDIOC_GETTIMEOUT, &tmo)) timer_duration = 1 + (tmo / 2);
260   Unfortunately, that needs linux/watchdog.h and that contains unfiltered
261   kernel types on some distros, which breaks the build.
262 ---
263   use bb_error_msg where appropriate: See
264   egrep "(printf.*\([[:space:]]*(stderr|2)|[^_]write.*\([[:space:]]*(stderr|2))"
265 ---
266   use bb_perror_msg where appropriate: See
267   egrep "[^_]perror"
268 ---
269   Remove superfluous fmt occurances: e.g.
270   fprintf(stderr, "%s: %s not found\n", "unalias", *argptr);
271   -> fprintf(stderr, "unalias: %s not found\n", *argptr);
272 ---
273   possible code duplication ingroup() and is_a_group_member()
274 ---
275   unify itoa: netstat.c, hush.c, lash.c, msh.c
276   Put one single, robust version into e.g. safe_strtol.c
277 ---
278
279
280 Code cleanup:
281
282 Replace deprecated functions.
283
284 bzero() -> memset()
285 ---
286 sigblock(), siggetmask(), sigsetmask(), sigmask() -> sigprocmask et al
287 ---
288 vdprintf() -> similar sized functionality
289 ---
290