diff --git a/Changelog b/Changelog
index 87a0bd82e..e9fbdd043 100644
--- a/Changelog
+++ b/Changelog
@@ -5,8 +5,14 @@
* Added setkeycodes, for those that have wierd keyboard buttons.
* Added cut and tr from minix, since due to the license change,
we can now use minix code. Minix tr saves 4k.
- * Added the -v option (inverted search) to grep,
- updated docs/busybox.pod accordingly. -beppu
+ * Added 'grep -v' option (inverted search) and updated
+ docs accordingly. -beppu
+ * Wrote which
+ * BusyBox sh (lash) now supports being used as a standalone shell. When
+ BB_FEATURE_STANDALONE_SHELL is defined, all the busybox commands may
+ be invoked as shell internals. Best used when compiling staticly
+ (i.e. DOSTATIC=true)
+ * BusyBox sh (lash) internals now behave as expected wrt pipes and redirects.
* Fixed ping warnings -- fix from Sascha Ziemann
* Fixed update segfault
* Fixed mknod -- minor number was always 0
@@ -28,16 +34,12 @@
to xiong jianxin
* cp -fa now works as expected for symlinks (it didn't before)
* zcat now works (wasn't working since option parsing was broken)
- * Renamed "mnc" to the more correct "nc".
+ * Renamed "mnc" to the more correct "nc" (for netcat).
* Makefile intelligence updates
- * BusyBox sh (lash) internals now behave wrt pipes and redirects.
- * BusyBox sh (lash) now supports being used as a standalone shell. When
- BB_FEATURE_STANDALONE_SHELL is defined, all the busybox commands may
- be invoked as shell internals.
* More doc updates
- -Erik
+ -Erik Andersen
diff --git a/Makefile b/Makefile
index d3d71ad77..1801cd5df 100644
--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@ export VERSION
# Set the following to `true' to make a debuggable build.
# Leave this set to `false' for production use.
# eg: `make DODEBUG=true tests'
-DODEBUG = false
+DODEBUG = true
# If you want a static binary, turn this on.
DOSTATIC = false
diff --git a/README b/README
index 118e14590..7f425ebb1 100644
--- a/README
+++ b/README
@@ -1,23 +1,33 @@
Please see the LICENSE file for copyright information.
+
+BusyBox combines tiny versions of many common UNIX utilities into a single
+small executable. It provides minimalist replacements for most of the utilities
+you usually find in fileutils, shellutils, findutils, textutils, grep, gzip,
+tar, etc. BusyBox provides a fairly complete POSIX environment for any small or
+emdedded system. The utilities in BusyBox generally have fewer options then
+their full featured GNU cousins; however, the options that are included provide
+the expected functionality and behave very much like their GNU counterparts.
-BusyBox is a suite of "tiny" Unix utilities in a multi-call binary. It
-provides a pretty complete POSIX environment in a very small package.
-Just add a kernel, "ash" (Keith Almquists tiny Bourne shell clone), and
-an editor such as "elvis-tiny" or "ae", and you have a working system.
-Busybox was begun to support the Debian Rescue/Install disks, but it
-also makes an excellent environment for any small or embedded system.
+BusyBox has been written with size-optimization and limited resources in mind.
+It is also extremely modular so you can easily include or exclude commands (or
+features) at compile time. This makes it easy to customize your embedded
+systems. To create a working system, just add a kernel, a shell (such as ash),
+and an editor (such as elvis-tiny or ae).
-As of version 0.20 there is a version number. : ) Also as of version 0.20, BB
-is now modularized to easily allow you to build only the BB parts you need,
-thereby reducing binary size. To turn off unwanted Busybox components, simply
-edit the file busybox.def.h and comment out the parts you do not need using C++
-style (//) comments.
+Busybox was originally written to support the Debian Rescue/Install disks, but
+it also makes an excellent environment for any small or embedded system.
-After the build is complete a busybox.links file is generated which is
-then used by 'make install' to create symlinks to the busybox binary
-for all compiled in functions. By default, 'make install' will place
-the symlink forest into `pwd`/_install unless you have defined the
-PREFIX environment variable (i.e. make PREFIX="/tmp/foo" install)
+As of version 0.20 there is a version number. : ) Also as of version 0.20,
+BusyBox is now modularized to easily allow you to build only the components you
+need, thereby reducing binary size. To turn off unwanted Busybox components,
+simply edit the file busybox.def.h and comment out the components you do not
+need using C++ style (//) comments.
+
+After the build is complete a busybox.links file is generated which is then
+used by 'make install' to create symlinks to the busybox binary for all
+compiled in functions. By default, 'make install' will place the symlink
+forest into `pwd`/_install unless you have defined the PREFIX environment
+variable (i.e. make PREFIX="/tmp/foo" install)
Please feed suggestions, bug reports, insults, and bribes back to:
Erik Andersen
diff --git a/TODO b/TODO
index 3ec400e6e..7ab43c36d 100644
--- a/TODO
+++ b/TODO
@@ -7,9 +7,10 @@ around to it some time. If you have any good ideas, please let me know.
needed or wanted in busybox (or else I'd have to link to libcrypt).
* Networking apps are probably going to be split out some time soon into a
- separate package (named perhaps tiny-netkit?). This currently includes
- hostid, hostname, mnc, and ping.
-
+ separate package (named perhaps netkit-tiny?). This would remove the
+ following items from BusyBox: hostid, hostname, nc, nslookup, telnet,
+ and ping. nfs mounting and syslogd (when it supports network logging)
+ will remain in BusyBox.
-Erik
@@ -20,17 +21,6 @@ Bugs that need fixing:
- 'grep foo$ file' doesn't work
- 'grep *foo file' segfaults
- ps dirent race bug (need to stat the file before attempting chdir)
- - # ls -la
- /etc/passwd: No such file or directory
- /etc/group: No such file or directory
- drwxrwxr-x 3 1000 1000 54 May 14 22:30 .
- /etc/passwd: No such file or directory
- /etc/group: No such file or directory
- drwxrwxr-x 3 1000 1000 54 May 14 22:30 ..
- /etc/passwd: No such file or directory
- /etc/group: No such file or directory
- drwxrwxr-x 2 1000 1000 74 May 14 22:33 bin
- /
-----------
@@ -69,23 +59,6 @@ Most wanted list:
Policy violation. getgroups uses libc nss, which is unlikely
to be present in an embedded system.
-To be replaced with a non-getopt parser.
-
- [andersen@slag busybox]$ grep -l getopt *.[ch]
- dmesg.c
- gunzip.c
- hostname.c
- mkfs_minix.c
- printf.c
- sfdisk.c
-
- This includes the symbols:
- getopt_long
- optarg
- opterr
- optind
-
-
To be replaced with a busybox local glob routine:
[andersen@slag busybox]$ grep -l glob *.[ch]
diff --git a/applets/busybox.c b/applets/busybox.c
index 07caa3446..bf0591d66 100644
--- a/applets/busybox.c
+++ b/applets/busybox.c
@@ -35,9 +35,7 @@ const struct BB_applet applets[] = {
#ifdef BB_BASENAME
{"basename", basename_main, _BB_DIR_USR_BIN},
#endif
-#ifdef BB_BUSYBOX
{"busybox", busybox_main, _BB_DIR_BIN},
-#endif
#ifdef BB_BLOCK_DEVICE
{"block_device", block_device_main, _BB_DIR_SBIN},
#endif
@@ -329,6 +327,9 @@ const struct BB_applet applets[] = {
#ifdef BB_WC
{"wc", wc_main, _BB_DIR_USR_BIN},
#endif
+#ifdef BB_WHICH
+ {"which", which_main, _BB_DIR_USR_BIN},
+#endif
#ifdef BB_WHOAMI
{"whoami", whoami_main, _BB_DIR_USR_BIN},
#endif
@@ -386,16 +387,14 @@ int busybox_main(int argc, char **argv)
if (been_there_done_that == 1 || argc < 1) {
const struct BB_applet *a = applets;
- fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
- BB_VER, BB_BT);
- fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
- fprintf(stderr, " or: [function] [arguments]...\n\n");
- fprintf(stderr,
+ fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n"
+ "Usage: busybox [function] [arguments]...\n"
+ " or: [function] [arguments]...\n\n"
"\tBusyBox is a multi-call binary that combines many common Unix\n"
"\tutilities into a single executable. Most people will create a\n"
"\tlink to busybox for each function they wish to use, and BusyBox\n"
- "\twill act like whatever it was invoked as.\n");
- fprintf(stderr, "\nCurrently defined functions:\n");
+ "\twill act like whatever it was invoked as.\n"
+ "\nCurrently defined functions:\n", BB_VER, BB_BT);
while (a->name != 0) {
col +=
diff --git a/archival/gunzip.c b/archival/gunzip.c
index 11fc3a8f9..78ee1d3c1 100644
--- a/archival/gunzip.c
+++ b/archival/gunzip.c
@@ -367,25 +367,23 @@ void send_bits (int value, int length);
unsigned bi_reverse (unsigned value, int length);
void bi_windup (void);
void copy_block (char *buf, unsigned len, int header);
-extern int (*read_buf) (char *buf, unsigned size);
/* in util.c: */
-extern int copy (int in, int out);
extern ulg updcrc (uch * s, unsigned n);
extern void clear_bufs (void);
-extern int fill_inbuf (int eof_ok);
+static int fill_inbuf (int eof_ok);
extern void flush_outbuf (void);
-extern void flush_window (void);
+static void flush_window (void);
extern void write_buf (int fd, void * buf, unsigned cnt);
#ifndef __linux__
-extern char *basename (char *fname);
+static char *basename (char *fname);
#endif /* not __linux__ */
-extern void read_error (void);
-extern void write_error (void);
+void read_error_msg (void);
+void write_error_msg (void);
/* in inflate.c */
-extern int inflate (void);
+static int inflate (void);
/* #include "lzw.h" */
@@ -450,133 +448,6 @@ extern int unlzw (int in, int out);
# undef LZW
#endif
-/* #include "getopt.h" */
-
-/* Declarations for getopt.
- Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 2, or (at your option) any
- later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-#ifndef _GETOPT_H
-#define _GETOPT_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/* For communication from `getopt' to the caller.
- When `getopt' finds an option that takes an argument,
- the argument value is returned here.
- Also, when `ordering' is RETURN_IN_ORDER,
- each non-option ARGV-element is returned here. */
- extern char *optarg;
-
-/* Index in ARGV of the next element to be scanned.
- This is used for communication to and from the caller
- and for communication between successive calls to `getopt'.
-
- On entry to `getopt', zero means this is the first call; initialize.
-
- When `getopt' returns EOF, this is the index of the first of the
- non-option elements that the caller should itself scan.
-
- Otherwise, `optind' communicates from one call to the next
- how much of ARGV has been scanned so far. */
-
- extern int optind;
-
-/* Callers store zero here to inhibit the error message `getopt' prints
- for unrecognized options. */
-
- extern int opterr;
-
-/* Set to an option character which was unrecognized. */
-
- extern int optopt;
-
-/* Describe the long-named options requested by the application.
- The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
- of `struct option' terminated by an element containing a name which is
- zero.
-
- The field `has_arg' is:
- no_argument (or 0) if the option does not take an argument,
- required_argument (or 1) if the option requires an argument,
- optional_argument (or 2) if the option takes an optional argument.
-
- If the field `flag' is not NULL, it points to a variable that is set
- to the value given in the field `val' when the option is found, but
- left unchanged if the option is not found.
-
- To have a long-named option do something other than set an `int' to
- a compiled-in constant, such as set a value from `optarg', set the
- option's `flag' field to zero and its `val' field to a nonzero
- value (the equivalent single-letter option character, if there is
- one). For long options that have a zero `flag' field, `getopt'
- returns the contents of the `val' field. */
-
- struct option {
-#if __STDC__
- const char *name;
-#else
- char *name;
-#endif
- /* has_arg can't be an enum because some compilers complain about
- type mismatches in all the code that assumes it is an int. */
- int has_arg;
- int *flag;
- int val;
- };
-
-/* Names for the values of the `has_arg' field of `struct option'. */
-
-#define no_argument 0
-#define required_argument 1
-#define optional_argument 2
-
-#if __STDC__ || defined(PROTO)
-#if defined(__GNU_LIBRARY__)
-/* Many other libraries have conflicting prototypes for getopt, with
- differences in the consts, in stdlib.h. To avoid compilation
- errors, only prototype getopt for the GNU C library. */
- extern int getopt(int argc, char *const *argv, const char *shortopts);
-#endif /* not __GNU_LIBRARY__ */
- extern int getopt_long(int argc, char *const *argv,
- const char *shortopts,
- const struct option *longopts, int *longind);
- extern int getopt_long_only(int argc, char *const *argv,
- const char *shortopts,
- const struct option *longopts,
- int *longind);
-
-/* Internal only. Users should not call this directly. */
- extern int _getopt_internal(int argc, char *const *argv,
- const char *shortopts,
- const struct option *longopts,
- int *longind, int long_only);
-#else /* not __STDC__ */
- extern int getopt();
- extern int getopt_long();
- extern int getopt_long_only();
-
- extern int _getopt_internal();
-#endif /* not __STDC__ */
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* _GETOPT_H */
#include
#include
#include
@@ -1161,7 +1032,7 @@ unsigned n; /* number of bytes in s[] */
/* ===========================================================================
* Clear input and output buffers
*/
-void clear_bufs()
+void clear_bufs(void)
{
outcnt = 0;
insize = inptr = 0;
@@ -1189,7 +1060,7 @@ int eof_ok; /* set if EOF acceptable as a result */
if (insize == 0) {
if (eof_ok)
return EOF;
- read_error();
+ read_error_msg();
}
bytes_in += (ulg) insize;
inptr = 1;
@@ -1240,7 +1111,7 @@ unsigned cnt;
while ((n = write(fd, buf, cnt)) != cnt) {
if (n == (unsigned) (-1)) {
- write_error();
+ write_error_msg();
}
cnt -= n;
buf = (void *) ((char *) buf + n);
@@ -1306,7 +1177,7 @@ const char *reject;
/* ========================================================================
* Error handlers.
*/
-void read_error()
+void read_error_msg()
{
fprintf(stderr, "\n");
if (errno != 0) {
@@ -1317,7 +1188,7 @@ void read_error()
abort_gzip();
}
-void write_error()
+void write_error_msg()
{
fprintf(stderr, "\n");
perror("");
diff --git a/archival/gzip.c b/archival/gzip.c
index 17ebf6cb7..a971229d3 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -329,8 +329,8 @@ extern void flush_window (void);
extern void write_buf (int fd, void * buf, unsigned cnt);
extern char *strlwr (char *s);
extern char *add_envopt (int *argcp, char ***argvp, char *env);
-extern void read_error (void);
-extern void write_error (void);
+extern void read_error_msg (void);
+extern void write_error_msg (void);
extern void display_ratio (long num, long den, FILE * file);
/* in inflate.c */
@@ -3138,7 +3138,7 @@ int in, out; /* input and output file descriptors */
insize = read(in, (char *) inbuf, INBUFSIZ);
}
if ((int) insize == EOF && errno != 0) {
- read_error();
+ read_error_msg();
}
bytes_in = bytes_out;
return OK;
diff --git a/basename.c b/basename.c
index 10ae76188..78265a5e6 100644
--- a/basename.c
+++ b/basename.c
@@ -24,19 +24,23 @@
#include "internal.h"
#include
+const char *basename_usage="basename FILE [SUFFIX]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+ "\nStrips directory path and suffixes from FILE.\n"
+ "If specified, also removes any trailing SUFFIX.\n"
+#endif
+;
+
+
extern int basename_main(int argc, char **argv)
{
int m, n;
char *s, *s1;
if ((argc < 2) || (**(argv + 1) == '-')) {
- usage("basename FILE [SUFFIX]\n"
-#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nStrips directory path and suffixes from FILE.\n"
- "If specified, also removes any trailing SUFFIX.\n"
-#endif
- );
+ usage(basename_usage);
}
+
argv++;
s1=*argv+strlen(*argv)-1;
diff --git a/busybox.c b/busybox.c
index 07caa3446..bf0591d66 100644
--- a/busybox.c
+++ b/busybox.c
@@ -35,9 +35,7 @@ const struct BB_applet applets[] = {
#ifdef BB_BASENAME
{"basename", basename_main, _BB_DIR_USR_BIN},
#endif
-#ifdef BB_BUSYBOX
{"busybox", busybox_main, _BB_DIR_BIN},
-#endif
#ifdef BB_BLOCK_DEVICE
{"block_device", block_device_main, _BB_DIR_SBIN},
#endif
@@ -329,6 +327,9 @@ const struct BB_applet applets[] = {
#ifdef BB_WC
{"wc", wc_main, _BB_DIR_USR_BIN},
#endif
+#ifdef BB_WHICH
+ {"which", which_main, _BB_DIR_USR_BIN},
+#endif
#ifdef BB_WHOAMI
{"whoami", whoami_main, _BB_DIR_USR_BIN},
#endif
@@ -386,16 +387,14 @@ int busybox_main(int argc, char **argv)
if (been_there_done_that == 1 || argc < 1) {
const struct BB_applet *a = applets;
- fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
- BB_VER, BB_BT);
- fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
- fprintf(stderr, " or: [function] [arguments]...\n\n");
- fprintf(stderr,
+ fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n"
+ "Usage: busybox [function] [arguments]...\n"
+ " or: [function] [arguments]...\n\n"
"\tBusyBox is a multi-call binary that combines many common Unix\n"
"\tutilities into a single executable. Most people will create a\n"
"\tlink to busybox for each function they wish to use, and BusyBox\n"
- "\twill act like whatever it was invoked as.\n");
- fprintf(stderr, "\nCurrently defined functions:\n");
+ "\twill act like whatever it was invoked as.\n"
+ "\nCurrently defined functions:\n", BB_VER, BB_BT);
while (a->name != 0) {
col +=
diff --git a/busybox.def.h b/busybox.def.h
index 8eb32bfb8..ea17a3982 100644
--- a/busybox.def.h
+++ b/busybox.def.h
@@ -97,6 +97,7 @@
#define BB_UPTIME
#define BB_USLEEP
#define BB_WC
+#define BB_WHICH
#define BB_WHOAMI
#define BB_UMOUNT
#define BB_UNIQ
@@ -200,7 +201,7 @@
#define BB_FEATURE_SORT_REVERSE
//
// Enable command line editing in the shell
-//#define BB_FEATURE_SH_COMMAND_EDITING
+#define BB_FEATURE_SH_COMMAND_EDITING
//
//Allow the shell to invoke all the compiled in BusyBox commands as if they
//were shell builtins. Nice for staticly linking an emergency rescue shell
@@ -261,3 +262,8 @@
#define BB_NFSMOUNT
#endif
//
+#if defined BB_FEATURE_STANDALONE_SHELL
+#ifndef BB_FEATURE_USE_TERMIOS
+#define BB_FEATURE_USE_TERMIOS
+#endif
+#endif
diff --git a/coreutils/basename.c b/coreutils/basename.c
index 10ae76188..78265a5e6 100644
--- a/coreutils/basename.c
+++ b/coreutils/basename.c
@@ -24,19 +24,23 @@
#include "internal.h"
#include
+const char *basename_usage="basename FILE [SUFFIX]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+ "\nStrips directory path and suffixes from FILE.\n"
+ "If specified, also removes any trailing SUFFIX.\n"
+#endif
+;
+
+
extern int basename_main(int argc, char **argv)
{
int m, n;
char *s, *s1;
if ((argc < 2) || (**(argv + 1) == '-')) {
- usage("basename FILE [SUFFIX]\n"
-#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nStrips directory path and suffixes from FILE.\n"
- "If specified, also removes any trailing SUFFIX.\n"
-#endif
- );
+ usage(basename_usage);
}
+
argv++;
s1=*argv+strlen(*argv)-1;
diff --git a/coreutils/printf.c b/coreutils/printf.c
index 28a011dcd..4e9a94049 100644
--- a/coreutils/printf.c
+++ b/coreutils/printf.c
@@ -51,7 +51,6 @@
#include
#include
#include
-#include
#include
#include
#include
diff --git a/coreutils/tr.c b/coreutils/tr.c
index ebb64799f..3e7ba583c 100644
--- a/coreutils/tr.c
+++ b/coreutils/tr.c
@@ -30,6 +30,20 @@
#include
#include
#include
+#define BB_DECLARE_EXTERN
+#define bb_need_write_error
+#include "messages.c"
+
+const char *tr_usage="tr [-cds] STRING1 [STRING2]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+ "\nTranslate, squeeze, and/or delete characters from\n"
+ "standard input, writing to standard output.\n\n"
+ "Options:\n"
+ "\t-c\ttake complement of STRING1\n"
+ "\t-d\tdelete input characters coded STRING1\n"
+ "\t-s\tsqueeze multiple output characters of STRING2 into one character\n"
+#endif
+;
@@ -60,7 +74,7 @@ static void convert()
if (in_index == read_chars) {
if ((read_chars = read(0, (char *) input, BUFSIZ)) <= 0) {
if (write(1, (char *) output, out_index) != out_index)
- write(2, "Bad write\n", 10);
+ write(2, write_error, strlen(write_error));
exit(0);
}
in_index = 0;
@@ -74,7 +88,7 @@ static void convert()
output[out_index++] = last = coded;
if (out_index == BUFSIZ) {
if (write(1, (char *) output, out_index) != out_index) {
- write(2, "Bad write\n", 10);
+ write(2, write_error, strlen(write_error));
exit(1);
}
out_index = 0;
@@ -167,16 +181,7 @@ extern int tr_main(int argc, char **argv)
sq_fl = TRUE;
break;
default:
- usage("tr [-cds] STRING1 [STRING2]\n"
-#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nTranslate, squeeze, and/or delete characters from\n"
- "standard input, writing to standard output.\n\n"
- "Options:\n"
- "\t-c\ttake complement of STRING1\n"
- "\t-d\tdelete input characters coded STRING1\n"
- "\t-s\tsqueeze multiple output characters of STRING2 into one character\n"
-#endif
- );
+ usage(tr_usage);
}
}
index++;
diff --git a/dmesg.c b/dmesg.c
index 6fa17b5fb..c4f4fb408 100644
--- a/dmesg.c
+++ b/dmesg.c
@@ -18,7 +18,6 @@
#include "internal.h"
#include
#include
-#include
#include
#if __GNU_LIBRARY__ < 5
diff --git a/docs/busybox.net/BusyBox.html b/docs/busybox.net/BusyBox.html
new file mode 100644
index 000000000..5a65db127
--- /dev/null
+++ b/docs/busybox.net/BusyBox.html
@@ -0,0 +1,2460 @@
+
+
+BusyBox - The Swiss Army Knife of Embedded Linux
+
+
+
+
+
+
+
+
+BusyBox combines tiny versions of many common UNIX utilities into a single
+small executable. It provides minimalist replacements for most of the
+utilities you usually find in fileutils, shellutils, findutils, textutils,
+grep, gzip, tar, etc. BusyBox provides a fairly complete POSIX environment
+for any small or emdedded system. The utilities in BusyBox generally have
+fewer options then their full featured GNU cousins; however, the options
+that are included provide the expected functionality and behave very much
+like their GNU counterparts.
+
+
+BusyBox has been written with size-optimization and limited resources in
+mind. It is also extremely modular so you can easily include or exclude
+commands (or features) at compile time. This makes it easy to customize
+your embedded systems. To create a working system, just add a kernel, a
+shell (such as ash), and an editor (such as elvis-tiny or ae).
+
+
+When you create a link to BusyBox for the function you wish to use, when
+BusyBox is called using that link it will behave as if the command itself
+has been invoked.
+
+
+For example, entering
+
+
+
ln -s ./BusyBox ls
+ ./ls
+
+
+will cause BusyBox to behave as 'ls' (if the 'ls' command has been compiled
+into BusyBox).
+
+
+You can also invoke BusyBox by issuing the command as an argument on the
+command line. For example, entering
+
+
+Changes file access permissions for the specified FILE(s) (or
+directories). Each MODE is defined by combining the letters for WHO has
+access to the file, an OPERATOR for selecting how the permissions should be
+changed, and a PERISSION for FILE(s) (or directories).
+
+
+WHO may be chosen from
+
+
+
u User who owns the file
+ g Users in the file's Group
+ o Other users not in the file's group
+ a All users
+
+
+OPERATOR may be chosen from
+
+
+
+ Add a permission
+ - Remove a permission
+ = Assign a permission
+
+PERMISSION may be chosen from
+
+
+
r Read
+ w Write
+ x Execute (or access for directories)
+ s Set user (or group) ID bit
+ t Stickey bit (for directories prevents removing files by non-owners)
+
+
+Alternately, permissions can be set numerically where the first three
+numbers are calculated by adding the octal values, such as
+
+
+
4 Read
+ 2 Write
+ 1 Execute
+
+
+An optional fourth digit can also be used to specify
+
+
+
4 Set user ID
+ 2 Set group ID
+ 1 Stickey bit
+
+
+Options:
+
+
+
-R Change files and directories recursively.
+
+Example:
+
+Prints selected fields from each input FILE to standard output.
+
+
+Options:
+
+
+
-b LIST Output only bytes from LIST
+ -c LIST Output only characters from LIST
+ -d DELIM Use DELIM instead of tab as the field delimiter
+ -f N Print only these fields
+ -n Ignored
+
+Copy a file, converting and formatting according to options
+
+
+
if=FILE read from FILE instead of stdin
+ of=FILE write to FILE instead of stdout
+ bs=n read and write n bytes at a time
+ count=n copy only n input blocks
+ skip=n skip n input blocks
+ seek=n skip n output blocks
+
+
+Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2)
+Example:
+
+
+
$ dd if=/dev/zero of=/dev/ram1 bs=1M count=4
+ 4+0 records in
+ 4+0 records out
+
+Search for files in a directory hierarchy. The default PATH is the current
+directory; default EXPRESSION is '-print'
+
+
+EXPRESSION may consist of:
+
+
+
-follow Dereference symbolic links.
+ -name PATTERN File name (leading directories removed) matches PATTERN.
+ -print print the full file name followed by a newline to stdout.
+
+Search for PATTERN in each FILE or standard input.
+
+
+OPTIONS:
+
+
+
-h suppress the prefixing filename on output
+ -i ignore case distinctions
+ -n print line number with output lines
+ -q be quiet. Returns 0 if result was found, 1 otherwise
+ -v select non-matching lines
+
+
+This version of grep matches full regular expresions.
+
+
+Print first 10 lines of each FILE to standard output. With more than one
+FILE, precede each with a header giving the file name. With no FILE, or
+when FILE is -, read standard input.
+
+
+Options:
+
+
+
-n NUM Print first NUM lines instead of first 10
+
+
+Example:
+
+
+
$ head -n 2 /etc/passwd
+ root:x:0:0:root:/root:/bin/bash
+ daemon:x:1:1:daemon:/usr/sbin:/bin/sh
+
+Prints out a unique 32-bit identifier for the current machine. The 32-bit
+identifier is intended to be unique among all UNIX systems in existence.
+
+
+This version of init is designed to be run only by the kernel.
+
+
+BusyBox init doesn't support multiple runlevels. The runlevels field of the
+/etc/inittab file is completely ignored by BusyBox init. If you want
+runlevels, use sysvinit.
+
+
+BusyBox init works just fine without an inittab. If no inittab is found, it
+has the following default behavior:
+
+
+
::sysinit:/etc/init.d/rcS
+ ::askfirst:/bin/sh
+
+
+if it detects that /dev/console is _not_ a serial console, it will also
+run:
+
+
+
tty2::askfirst:/bin/sh
+
+
+If you choose to use an /etc/inittab file, the inittab entry format is as
+follows:
+
+
+
<id>:<runlevels>:<action>:<process>
+
+
+
<id>:
+
+
+
WARNING: This field has a non-traditional meaning for BusyBox init!
+ The id field is used by BusyBox init to specify the controlling tty for
+ the specified process to run on. The contents of this field are
+ appended to "/dev/" and used as-is. There is no need for this field to
+ be unique, although if it isn't you may have strange results. If this
+ field is left blank, it is completely ignored. Also note that if
+ BusyBox detects that a serial console is in use, then all entries
+ containing non-empty id fields will _not_ be run. BusyBox init does
+ nothing with utmp. We don't need no stinkin' utmp.
+
askfirst acts just like respawn, but before running the specified
+ process it displays the line "Please press Enter to activate this
+ console." and then waits for the user to press enter before starting
+ the specified process.
+
+
+
Unrecognised actions (like initdefault) will cause init to emit
+ an error message, and then go along with its business.
+
+
+
<process>:
+
+
+
Specifies the process to be executed and it's command line.
+
+
+Example /etc/inittab file:
+
+
+
# This is run first except when booting in single-user mode.
+ #
+ ::sysinit:/etc/init.d/rcS
+
+
+
# /bin/sh invocations on selected ttys
+ #
+ # Start an "askfirst" shell on the console (whatever that may be)
+ ::askfirst:/bin/sh
+ # Start an "askfirst" shell on /dev/tty2
+ tty2::askfirst:/bin/sh
+
# Example of how to put a getty on a serial line (for a terminal)
+ #
+ #ttyS0::respawn:/sbin/getty -L ttyS0 9600 vt100
+ #ttyS1::respawn:/sbin/getty -L ttyS1 9600 vt100
+ #
+ # Example how to put a getty on a modem line.
+ #ttyS2::respawn:/sbin/getty -x0 -s 57600 ttyS2
+
+
+
# Stuff to do before rebooting
+ ::ctrlaltdel:/bin/umount -a -r > /dev/null 2>&1
+ ::ctrlaltdel:/sbin/swapoff -a > /dev/null 2>&1
+
+Write MESSAGE to the system log. If MESSAGE is '-', log stdin.
+
+
+Options:
+
+
+
-s Log to stderr as well as the system log.
+ -t Log using the specified tag (defaults to user name).
+ -p Enter the message with the specified priority.
+ This may be numerical or a ``facility.level'' pair.
+
-a do not hide entries starting with .
+ -c with -l: show ctime (the time of last
+ modification of file status information)
+ -d list directory entries instead of contents
+ -e list both full date and full time
+ -l use a long listing format
+ -n list numeric UIDs and GIDs instead of names
+ -p append indicator (one of /=@|) to entries
+ -u with -l: show access time (the time of last
+ access of the file)
+ -x list entries by lines instead of by columns
+ -A do not list implied . and ..
+ -C list entries by columns
+ -F append indicator (one of */=@|) to entries
+
+Usage: makedevs NAME TYPE MAJOR MINOR FIRST LAST [s]
+
+
+Creates a range of block or character special files
+
+
+TYPEs include:
+
+
+
b: Make a block (buffered) device.
+ c or u: Make a character (un-buffered) device.
+ p: Make a named pipe. MAJOR and MINOR are ignored for named pipes.
+
+
+FIRST specifies the number appended to NAME to create the first device.
+LAST specifies the number of the last item that should be created. If 's'
+is the last argument, the base device is created as well.
+
+
+Example:
+
+
+
$ makedevs /dev/ttyS c 4 66 2 63
+ [creates ttyS2-ttyS63]
+ $ makedevs /dev/hda b 3 0 0 8 s
+ [creates hda,hda1-hda8]
+
-c Check the device for bad blocks
+ -n [14|30] Specify the maximum length of filenames
+ -i Specify the number of inodes for the filesystem
+ -l FILENAME Read the bad blocks list from FILENAME
+ -v Make a Minix version 2 filesystem
+
+Create a special file (block, character, or pipe).
+
+
+Options:
+
+
+
-m create the special file using the specified mode (default a=rw)
+
+
+TYPEs include: b: Make a block (buffered) device. c or u: Make a character
+(un-buffered) device. p: Make a named pipe. MAJOR and MINOR are ignored for
+named pipes.
+
+
+Example:
+
+
+
$ mknod /dev/fd0 b 2 0
+ $ mknod -m 644 /tmp/pipe p
+
+Prepare a disk partition to be used as a swap partition.
+
+
+Options:
+
+
+
-c Check for read-ability.
+ -v0 Make version 0 swap [max 128 Megs].
+ -v1 Make version 1 swap [big!] (default for kernels > 2.1.117).
+ block-count Number of block to use (default is entire partition).
+
+Usage: mount [flags] mount [flags] device directory [-o options,more-options]
+
+
+Flags:
+
+
+
-a: Mount all file systems in fstab.
+ -o option: One of many filesystem options, listed below.
+ -r: Mount the filesystem read-only.
+ -t fs-type: Specify the filesystem type.
+ -w: Mount for reading and writing (default).
+
+
+Options for use with the ``-o'' flag:
+
+
+
async/sync: Writes are asynchronous / synchronous.
+ atime/noatime: Enable / disable updates to inode access times.
+ dev/nodev: Allow use of special device files / disallow them.
+ exec/noexec: Allow use of executable files / disallow them.
+ loop: Mounts a file via loop device.
+ suid/nosuid: Allow set-user-id-root programs / disallow them.
+ remount: Re-mount a currently-mounted filesystem, changing its flags.
+ ro/rw: Mount for read-only / read-write.
+ There are EVEN MORE flags that are specific to each filesystem.
+ You'll have to see the written documentation for those.
+
+
+Example:
+
+
+
$ mount
+ /dev/hda3 on / type minix (rw)
+ proc on /proc type proc (rw)
+ devpts on /dev/pts type devpts (rw)
+ $ mount /dev/fd0 /mnt -t msdos -o ro
+ $ mount /tmp/diskimage /opt -t ext2 -o loop
+
+Allowed sed scripts come in the following form:
+
+
+
'ADDR [!] COMMAND'
+
+
+
where address ADDR can be:
+ NUMBER Match specified line number
+ $ Match last line
+ /REGEXP/ Match specified regexp
+ (! inverts the meaning of the match)
+
+
+
and COMMAND can be:
+ s/regexp/replacement/[igp]
+ which attempt to match regexp against the pattern space
+ and if successful replaces the matched portion with replacement.
+
+
+
aTEXT
+ which appends TEXT after the pattern space
+
+
+Options:
+
+
+
-e add the script to the commands to be executed
+ -n suppress automatic printing of pattern space
+
+
+This version of sed matches full regular expresions.
+
+
+Example:
+
+
+
$ echo "foo" | sed -e 's/f[a-zA-Z]o/bar/g'
+ bar
+
+lash -- the BusyBox LAme SHell (command interpreter)
+
+
+This command does not yet have proper documentation.
+
+
+Use lash just as you would use any other shell. It properly handles pipes,
+redirects, job control, can be used as the shell for scripts (#!/bin/sh),
+and has a sufficient set of builtins to do what is needed. It does not
+(yet) support Bourne Shell syntax. If you need things like
+``if-then-else'', ``while'', and such, use ash or bash. If you just need a
+very simple and extremely small shell, this will do the job.
+
+
-s [or --show-size]: list size of a partition
+ -c [or --id]: print or change partition Id
+ -l [or --list]: list partitions of each device
+ -d [or --dump]: idem, but in a format suitable for later input
+ -i [or --increment]: number cylinders etc. from 1 instead of from 0
+ -uS, -uB, -uC, -uM: accept/report in units of sectors/blocks/cylinders/MB
+ -T [or --list-types]:list the known partition types
+ -D [or --DOS]: for DOS-compatibility: waste a little space
+ -R [or --re-read]: make kernel reread partition table
+ -N# : change only the partition with number #
+ -n : do not actually write to disk
+ -O file : save the sectors that will be overwritten to file
+ -I file : restore these sectors again
+ -v [or --version]: print version
+ -? [or --help]: print this message
+
+
+dangerous options:
+
+
+
-g [or --show-geometry]: print the kernel's idea of the geometry
+ -x [or --show-extended]: also list extended partitions on output
+
+
+
or expect descriptors for them on input
+ -L [or --Linux]: do not complain about things irrelevant for Linux
+ -q [or --quiet]: suppress warning messages
+ You can override the detected geometry using:
+ -C# [or --cylinders #]:set the number of cylinders to use
+ -H# [or --heads #]: set the number of heads to use
+ -S# [or --sectors #]: set the number of sectors to use
+
+
+You can disable all consistency checking with:
+
+
+
-f [or --force]: do what I say, even if it is stupid
+
+Linux system and kernel (provides klogd) logging utility. Note that this
+version of syslogd/klogd ignores /etc/syslog.conf.
+
+
+Options:
+
+
+
-m Change the mark timestamp interval. default=20min. 0=off
+ -n Do not fork into the background (for when run by init)
+ -K Do not start up the klogd process (by default syslogd spawns klogd).
+ -O Specify an alternate log file. default=/var/log/messages
+
+Print last 10 lines of each FILE to standard output. With more than one
+FILE, precede each with a header giving the file name. With no FILE, or
+when FILE is -, read standard input.
+
+
+Options:
+
+
+
-n NUM Print last NUM lines instead of first 10
+ -f Output data as the file grows. This version
+ of 'tail -f' supports only one file at a time.
+
-a: Unmount all file systems
+ -r: Try to remount devices as read-only if mount is busy
+ -f: Force filesystem umount (i.e. unreachable NFS server)
+ -l: Do not free loop device (if a loop device has been used)
+
+Print certain system information. With no OPTION, same as -s.
+
+
+Options:
+
+
+
-a print all information
+ -m the machine (hardware) type
+ -n print the machine's network node hostname
+ -r print the operating system release
+ -s print the operating system name
+ -p print the host processor type
+ -v print the operating system version
+
+
+Example:
+
+
+
$ uname -a
+ Linux debian 2.2.15pre13 #5 Tue Mar 14 16:03:50 MST 2000 i686 unknown
+
+GNU Libc uses the Name Service Switch (NSS) to configure the behavior of
+the C library for the local environment, and to configure how it reads
+system data, such as passwords and group information. BusyBox has made it
+Policy that it will never use NSS, and will never use and libc calls that
+make use of NSS. This allows you to run an embedded system without the need
+for installing an /etc/nsswitch.conf file and without and /lib/libnss_*
+libraries installed.
+
+
+If you are using a system that is using a remote LDAP server for
+authentication via GNU libc NSS, and you want to use BusyBox, then you will
+need to adjust the BusyBox source. Chances are though, that if you have
+enough space to install of that stuff on your system, then you probably
+want the full GNU utilities.
+
+
+
+BusyBox combines tiny versions of many common UNIX utilities into a single
+small executable. It provides minimalist replacements for most of the utilities
+you usually find in fileutils, shellutils, findutils, textutils, grep, gzip,
+tar, etc. BusyBox provides a fairly complete POSIX environment for any small
+or emdedded system. The utilities in BusyBox generally have fewer options then
+their full featured GNU cousins; however, the options that are included provide
+the expected functionality and behave very much like their GNU counterparts.
+
+BusyBox has been written with size-optimization and limited resources in mind.
+It is also extremely modular so you can easily include or exclude commands (or
+features) at compile time. This makes it easy to customize your embedded
+systems. To create a working system, just add a kernel, a shell (such as ash),
+and an editor (such as elvis-tiny or ae).
+
+
+BusyBox is now maintained by
+
+Erik Andersen, and its ongoing development is being sponsored by
+Lineo.
+
+ it should be logging stuff from both "A" and "B". As released in 0.43 only stuff
+ from "A" would have been logged. This means that if init tries to log something
+ while say ppp has the syslog open, init would block (which is bad, bad, bad).
+
+ Karl M. Hegbloom has created a
+ fix for the problem.
+ Thanks Karl!
+
+
+
18 April 2000 -- BusyBox 0.43 released (finally!)
+
+ I have finally gotten everything into a state where I feel pretty
+ good about things. This is definitely the most stable, solid release
+ so far. A lot of bugs have been fixed, and the following new apps
+ have been added: sh, basename, dirname, killall, uptime,
+ freeramdisk, tr, echo, test, and usleep. Tar has been completely
+ rewritten from scratch. Bss size has also been greatly reduced.
+ More details are available in the
+ changelog.
+ Oh, and as a special bonus, I wrote some fairly comprehensive
+ documentation, complete with examples and full usage information.
+
+
+ Many thanks go out to the fine people that have helped by submitting patches
+ and bug reports; particularly instrumental in helping for this release were
+ Karl Hegbloom, Pavel Roskin, Friedrich Vedder, Emanuele Caratti,
+ Bob Tinsley, Nicolas Pitre, Avery Pennarun, Arne Bernin, John Beppu, and Jim Gleason.
+ There were others so if I somehow forgot to mention you, I'm very sorry.
+
9 April 2000 -- BusyBox 0.43 pre release
+
+ Unfortunately, I have not yet finished all the things I want to
+ do for BusyBox 0.43, so I am posting this pre-release for people
+ to poke at. This contains my complete rewrite of tar, which now weighs in at
+ 5k (7k with all options turned on) and works for reading and writing
+ tarballs (which it does correctly for everything I have been able to throw
+ at it). Tar also (optionally) supports the "--exclude" option (mainly because
+ the Linux Router Project folks asked for it). This also has a pre-release
+ of the micro shell I have been writing. This pre-release should be stable
+ enough for production use -- it just isn't a release since I have some structural
+ changes I still want to make.
+
+ The pre-release can be found here.
+ Please let me know ASAP if you find any bugs.
+
+
28 March 2000 -- Andersen Baby Boy release
+
+ I am pleased to announce that on Tuesday March 28th at 5:48pm, weighing in at 7
+ lbs. 12 oz, Micah Erik Andersen was born at LDS Hospital here in Salt Lake City.
+ He was born in the emergency room less then 5 minutes after we arrived -- and
+ it was such a relief that we even made it to the hospital at all. Despite the
+ fact that I was driving at an amazingly unlawful speed and honking at everybody
+ and thinking decidely unkind thoughts about the people in our way, my wife
+ (inconsiderate of my feelings and complete lack of medical training) was lying
+ down in the back seat saying things like "I think I need to start pushing now"
+ (which she then proceeded to do despite my best encouraging statements to the
+ contrary).
+
+ Anyway, I'm glad to note that despite the much-faster-than-we-were-expecting
+ labor, both Shaunalei and our new baby boy are doing wonderfuly.
+
+ So now that I am done with my excuse for the slow release cycle...
+ Progress on the next release of BusyBox has been slow but steady. I expect
+ to have a release sometime during the first week of April. This release will
+ include a number of important changes, including the addition of a shell, a
+ re-write of tar (to accomodate the Linux Router Project), and syslogd can now
+ accept multiple concurrent connections, fixing lots of unexpected blocking
+ problems.
+
+
+
11 February 2000 -- BusyBox 0.42 released
+
+
+ This is the most solid BusyBox release so far. Many, many
+ bugs have been fixed. See the
+changelog for details.
+
+ Of particular interest, init will now cleanly unmount
+ filesystems on reboot, cp and mv have been rewritten and
+ behave much better, and mount and umount no longer leak
+ loop devices. Many thanks go out to Randolph Chung,
+ Karl M. Hegbloom, Taketoshi Sano, and Pavel Roskin for
+ their hard work on this release of BusyBox. Please pound
+ on it and let me know if you find any bugs.
+
+
19 January 2000 -- BusyBox 0.41 released
+
+
+ This release includes bugfixes to cp, mv, logger, true, false,
+ mkdir, syslogd, and init. New apps include wc, hostid,
+ logname, tty, whoami, and yes. New features include loop device
+ support in mount and umount, and better TERM handling by init.
+ The changelog can be found here.
+
+
7 January 2000 -- BusyBox 0.40 released
+
+
+ This release includes bugfixes to init (now includes inittab support),
+ syslogd, head, logger, du, grep, cp, mv, sed, dmesg, ls, kill, gunzip, and mknod.
+ New apps include sort, uniq, lsmod, rmmod, fbset, and loadacm.
+ In particular, this release fixes an important bug in tar which
+ in some cases produced serious security problems.
+ As always, the changelog can be found here.
+
+
11 December 1999 -- BusyBox Website
+
+ I have received permission from Bruce Perens (the original author of BusyBox)
+ to set up this site as the new primary website for BusyBox. This website
+ will always contain pointers to the latest and greatest, and will also
+ contain the latest documentation on how to use BusyBox, what it can do,
+ what arguments its apps support, etc.
+
+
10 December 1999 -- BusyBox 0.39 released
+
+ This release includes fixes to init, reboot, halt, kill, and ls, and contains
+ the new apps ping, hostname, mkfifo, free, tail, du, tee, and head. A full
+ changelog can be found here.
+
5 December 1999 -- BusyBox 0.38 released
+
+ This release includes fixes to tar, cat, ls, dd, rm, umount, find, df,
+ and make install, and includes new apps syslogd/klogd and logger.
+
BusyBox.html
+ This is a list of the all the available commands in BusyBox with complete
+ usage information and examples of how to use each app. I spent
+ a lot of time updating these docs and trying to make them
+ fairly comprehensive for the BusyBox 0.43 release. If you find any
+ errors (factual, grammatical, whatever) please let me know.
+
+
ash
+ is a very small Bourne shell. If you need a shell for your embedded systems, this is it.
+
+
+
ae
+ is a tiny full-screen text editor with both modal (vi-like) and modeless
+ (emacs-like) modes, determined by an ae.rc config file. It makes a nice editor
+ if people that don't know "vi" will need to work on your embedded system.
+
+
+
elvis-tiny
+ is based on a 1991 Minix version of the elvis "vi" clone. It behaves as one would
+ expect a minamalist vi to behave, and is very small.
+
+
+
nano
+ A small GPLed pico clone that makes a nice editor for people that don't know "vi".
+
+
+
iproute
+ Much more flexible replacement for ifconfig, route, etc. It is quite small, and for
+ most networking applications, it is all you need. It also provides support for extremely
+ advanced networking and provides Quality of Service(QoS) support, but most people will
+ just need to use the "ip" command and will not even need to install the rest.
+
+
+
Pump
+ This is the DHCP/BOOTP client written by RedHat. When compiled properly, it
+ gives you dhcp client support for about 35k.
+
+
+
sash
+ The Stand Alone SHell. This is a small shell (not Bourne shell compatable)
+ that is similar to busybox in that it provides a number of common utilities as built-ins.
+
+
+
NewLib
+ This is a small C library intended for use on embedded systems. If you are finding
+ GNU libc is a bit too big for your applications, try NewLib and it may help.
+
+
+
asmutils
+ asmutils is similar to BusyBox in that it provides a number of common application
+ for embedded systems that are very tiny. In fact, they are a _lot_ smaller than the
+ equivalent apps in busybox -- but the price you pay for the size is reduced portability
+ (x86 only) and interfaces that are tied directly to a perticular kernel (no libc involved).
+
+
+
TinyLogin
+ is a nice embedded tool for handling authentication, changing passwords,
+ and similar tasks, and which nicely complements BusyBox.
+