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 + + + + + + + + + + +
+

+

NAME

+

+BusyBox - The Swiss Army Knife of Embedded Linux + +

+


+

SYNTAX

+

+

 BusyBox <function> [arguments...]  # or
+
+

+

 <function> [arguments...]          # if symlinked
+
+

+


+

DESCRIPTION

+

+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). + +

+


+

USAGE

+

+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 + +

+

        ./BusyBox ls
+
+

+will also cause BusyBox to behave as 'ls'. + +

+


+

COMMON OPTIONS

+

+Most BusyBox commands support the --help option to provide a terse runtime description of their behavior. + +

+


+

COMMANDS

+

+Currently defined functions include: + +

+basename, cat, chgrp, chmod, chown, chroot, clear, chvt, cp, cut, date, dd, +df, dirname, dmesg, du, dutmp, echo, false, fbset, fdflush, find, free, +freeramdisk, deallocvt, fsck.minix, grep, gunzip, gzip, halt, head, hostid, +hostname, id, init, kill, killall, length, ln, loadacm, loadfont, loadkmap, +logger, logname, ls, lsmod, makedevs, math, mkdir, mkfifo, mkfs.minix, +mknod, mkswap, mktemp, nc, more, mount, mt, mv, nslookup, ping, poweroff, +printf, ps, pwd, reboot, rm, rmdir, rmmod, sed, setkeycodes, sh, sfdisk, +sleep, sort, sync, syslogd, swapon, swapoff, tail, tar, test, tee, touch, +tr, true, tty, umount, uname, uniq, update, uptime, usleep, wc, whoami, +yes, zcat, [ + +

+------------------------------- + +

+
basename
+

+Usage: basename FILE [SUFFIX] + +

+Strips directory path and suffixes from FILE. If specified, also removes +any trailing SUFFIX. + +

+Example: + +

+

        $ basename /usr/local/bin/foo
+        foo
+        $ basename /usr/local/bin/
+        bin
+        $ basename /foo/bar.txt .txt
+        bar
+
+

+------------------------------- + +

cat
+

+Usage: cat [FILE ...] + +

+Concatenates FILE(s) and prints them to the standard output. + +

+Example: + +

+

        $ cat /proc/uptime
+        110716.72 17.67
+
+

+------------------------------- + +

chgrp
+

+Usage: chgrp [OPTION]... GROUP FILE... + +

+Change the group membership of each FILE to GROUP. + +

+Options: + +

+

        -R      change files and directories recursively
+
+

+Example: + +

+

        $ ls -l /tmp/foo
+        -r--r--r--    1 andersen andersen        0 Apr 12 18:25 /tmp/foo
+        $ chgrp root /tmp/foo
+        $ ls -l /tmp/foo
+        -r--r--r--    1 andersen root            0 Apr 12 18:25 /tmp/foo
+
+

+------------------------------- + +

chmod
+

+Usage: chmod [-R] MODE[,MODE]... FILE... + +

+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:
+
+

+

        $ ls -l /tmp/foo
+        -rw-rw-r--    1 root     root            0 Apr 12 18:25 /tmp/foo
+        $ chmod u+x /tmp/foo
+        $ ls -l /tmp/foo
+        -rwxrw-r--    1 root     root            0 Apr 12 18:25 /tmp/foo*
+        $ chmod 444 /tmp/foo
+        $ ls -l /tmp/foo
+        -r--r--r--    1 root     root            0 Apr 12 18:25 /tmp/foo
+
+

+------------------------------- + +

chown
+

+Usage: chown [OPTION]... OWNER[<.|:>[GROUP] FILE... + +

+Changes the owner and/or group of each FILE to OWNER and/or GROUP. + +

+Options: + +

+

        -R      Changes files and directories recursively
+
+

+Example: + +

+

        $ ls -l /tmp/foo
+        -r--r--r--    1 andersen andersen        0 Apr 12 18:25 /tmp/foo
+        $ chown root /tmp/foo
+        $ ls -l /tmp/foo
+        -r--r--r--    1 root     andersen        0 Apr 12 18:25 /tmp/foo
+        $ chown root.root /tmp/foo
+        ls -l /tmp/foo
+        -r--r--r--    1 root     root            0 Apr 12 18:25 /tmp/foo
+
+

+------------------------------- + +

chroot
+

+Usage: chroot NEWROOT [COMMAND...] + +

+Run COMMAND with root directory set to NEWROOT. Example: + +

+

        $ ls -l /bin/ls
+        lrwxrwxrwx    1 root     root          12 Apr 13 00:46 /bin/ls -> /BusyBox
+        $ mount /dev/hdc1 /mnt -t minix
+        $ chroot /mnt
+        $ ls -l /bin/ls
+        -rwxr-xr-x    1 root     root        40816 Feb  5 07:45 /bin/ls*
+
+

+------------------------------- + +

clear
+

+Clears the screen. + +

+------------------------------- + +

chvt
+

+Usage: chvt N + +

+Changes the foreground virtual terminal to /dev/ttyN + +

+------------------------------- + +

cp
+

+Usage: cp [OPTION]... SOURCE DEST + +

+

   or: cp [OPTION]... SOURCE... DIRECTORY
+
+

+Copies SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. + +

+Options: + +

+

        -a      Same as -dpR
+        -d      Preserves links
+        -p      Preserves file attributes if possable
+        -R      Copies directories recursively
+
+

+------------------------------- + +

cut
+

+Usage: cut [OPTION]... [FILE]... + +

+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
+
+

+Example: + +

+

        $ echo "Hello world" | cut -f 1 -d ' '
+        Hello
+        $ echo "Hello world" | cut -f 2 -d ' '
+        world
+
+

+------------------------------- + +

date
+

+Usage: date [OPTION]... [+FORMAT] + +

+

  or:  date [OPTION] [MMDDhhmm[[CC]YY][.ss]]
+
+

+Displays the current time in the given FORMAT, or sets the system date. + +

+Options: + +

+

        -R      Outputs RFC-822 compliant date string
+        -s      Sets time described by STRING
+        -u      Prints or sets Coordinated Universal Time
+
+

+Example: + +

+

        $ date
+        Wed Apr 12 18:52:41 MDT 2000
+
+

+------------------------------- + +

dd
+

+Usage: dd [if=name] [of=name] [bs=n] [count=n] [skip=n] [seek=n] + +

+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
+
+

+------------------------------- + +

df
+

+Usage: df [filesystem ...] + +

+Prints the filesystem space used and space available. + +

+Example: + +

+

        $ df
+        Filesystem           1k-blocks      Used Available Use% Mounted on
+        /dev/sda3              8690864   8553540    137324  98% /
+        /dev/sda1                64216     36364     27852  57% /boot
+        $ df /dev/sda3
+        Filesystem           1k-blocks      Used Available Use% Mounted on
+        /dev/sda3              8690864   8553540    137324  98% /
+
+

+------------------------------- + +

dirname
+

+Usage: dirname NAME + +

+Strip non-directory suffix from file name + +

+Example: + +

+

        $ dirname /tmp/foo
+        /tmp
+        $ dirname /tmp/foo/
+        /tmp
+
+

+------------------------------- + +

dmesg
+

+Usage: dmesg [-c] [-n level] [-s bufsize] Print or controls the kernel ring buffer. + +

+------------------------------- + +

du
+

+Usage: du [OPTION]... [FILE]... + +

+Summarize disk space used for each FILE and/or directory. Disk space is +printed in units of 1k (i.e. 1024 bytes). + +

+Options: + +

+

        -l      count sizes many times if hard linked
+        -s      display only a total for each argument
+
+

+Example: + +

+

        $ ./BusyBox du
+        16      ./CVS
+        12      ./kernel-patches/CVS
+        80      ./kernel-patches
+        12      ./tests/CVS
+        36      ./tests
+        12      ./scripts/CVS
+        16      ./scripts
+        12      ./docs/CVS
+        104     ./docs
+        2417    .
+         
+-------------------------------
+
+
dutmp
+

+Usage: dutmp [FILE] + +

+Dump utmp file format (pipe delimited) from FILE or stdin to stdout. + +

+Example: + +

+

        $ dutmp /var/run/utmp
+        8|7||si|||0|0|0|955637625|760097|0
+        2|0|~|~~|reboot||0|0|0|955637625|782235|0
+        1|20020|~|~~|runlevel||0|0|0|955637625|800089|0
+        8|125||l4|||0|0|0|955637629|998367|0
+        6|245|tty1|1|LOGIN||0|0|0|955637630|998974|0
+        6|246|tty2|2|LOGIN||0|0|0|955637630|999498|0
+        7|336|pts/0|vt00andersen|andersen|:0.0|0|0|0|955637763|0|0
+         
+-------------------------------
+
+
echo
+

+Usage: echo [-neE] [ARG ...] + +

+Prints the specified ARGs to stdout + +

+Options: + +

+

        -n      suppress trailing newline
+        -e      interpret backslash-escaped characters (i.e. \t=tab etc)
+        -E      disable interpretation of backslash-escaped characters
+
+

+Example: + +

+

        $ echo "Erik is cool"
+        Erik is cool
+        $  echo -e "Erik\nis\ncool"
+        Erik
+        is
+        cool
+        $ echo "Erik\nis\ncool"
+        Erik\nis\ncool
+         
+-------------------------------
+
+
false
+

+Returns an exit code of FALSE (1) + +

+Example: + +

+

        $ false
+        $ echo $?
+        1
+
+

+------------------------------- + +

fbset
+

+Usage: fbset [options] [mode] + +

+Show and modify frame buffer device settings + +

+Options: + +

+

        -h
+        -fb
+        -db
+        -a
+        -i
+        -g
+        -t
+        -accel
+        -hsync
+        -vsync
+        -laced
+        -double
+
+

+Example: + +

+

        $ fbset
+        mode "1024x768-76"
+                        # D: 78.653 MHz, H: 59.949 kHz, V: 75.694 Hz
+                        geometry 1024 768 1024 768 16
+                        timings 12714 128 32 16 4 128 4
+                        accel false
+                        rgba 5/11,6/5,5/0,0/0
+        endmode
+
+

+------------------------------- + +

fdflush
+

+Usage: fdflush device + +

+Force floppy disk drive to detect disk change + +

+------------------------------- + +

find
+

+Usage: find [PATH...] [EXPRESSION] + +

+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.
+
+

+Example: + +

+

        $ find / -name /etc/passwd
+        /etc/passwd
+
+

+------------------------------- + +

free
+

+Usage: free + +

+Displays the amount of free and used system memory. + +

+Example: + +

+

        $ free
+                                  total         used         free       shared      buffers
+          Mem:       257628       248724         8904        59644        93124
+         Swap:       128516         8404       120112
+        Total:       386144       257128       129016
+
+

+------------------------------- + +

freeramdisk
+

+Usage: freeramdisk DEVICE + +

+Frees all memory used by the specified ramdisk. + +

+Example: + +

+

        $ freeramdisk /dev/ram2
+
+

+------------------------------- + +

deallocvt
+

+Usage: deallocvt N + +

+Deallocates unused virtual terminal /dev/ttyN + +

+------------------------------- + +

fsck.minix
+

+Usage: fsck.minix [-larvsmf] /dev/name + +

+Performs a consistency check for MINIX filesystems. + +

+OPTIONS: + +

+

        -l      Lists all filenames
+        -r      Perform interactive repairs
+        -a      Perform automatic repairs
+        -v      verbose
+        -s      Outputs super-block information
+        -m      Activates MINIX-like "mode not cleared" warnings
+        -f      Force file system check.
+
+

+------------------------------- + +

grep
+

+Usage: grep [OPTIONS]... PATTERN [FILE]... + +

+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. + +

+Example: + +

+

        $ grep root /etc/passwd
+        root:x:0:0:root:/root:/bin/bash
+        $ grep ^[rR]oo. /etc/passwd
+        root:x:0:0:root:/root:/bin/bash
+
+

+------------------------------- + +

gunzip
+

+Usage: gunzip [OPTION]... FILE + +

+Uncompress FILE (or standard input if FILE is '-'). + +

+Options: + +

+

        -c      Write output to standard output
+        -t      Test compressed file integrity
+
+

+Example: + +

+

        $ ls -la /tmp/BusyBox*
+        -rw-rw-r--    1 andersen andersen   557009 Apr 11 10:55 /tmp/BusyBox-0.43.tar.gz
+        $ gunzip /tmp/BusyBox-0.43.tar.gz
+        $ ls -la /tmp/BusyBox*
+        -rw-rw-r--    1 andersen andersen  1761280 Apr 14 17:47 /tmp/BusyBox-0.43.tar
+
+

+------------------------------- + +

gzip
+

+Usage: gzip [OPTION]... FILE + +

+Compress FILE with maximum compression. When FILE is '-', reads standard +input. Implies -c. + +

+Options: + +

+

        -c      Write output to standard output instead of FILE.gz
+
+

+Example: + +

+

        $ ls -la /tmp/BusyBox*
+        -rw-rw-r--    1 andersen andersen  1761280 Apr 14 17:47 /tmp/BusyBox-0.43.tar
+        $ gzip /tmp/BusyBox-0.43.tar
+        $ ls -la /tmp/BusyBox*
+        -rw-rw-r--    1 andersen andersen   554058 Apr 14 17:49 /tmp/BusyBox-0.43.tar.gz
+
+

+------------------------------- + +

halt
+

+Usage: halt + +

+This comand halts the system. + +

+------------------------------- + +

head
+

+Usage: head [OPTION] [FILE]... + +

+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
+
+

+------------------------------- + +

hostid
+

+Usage: hostid + +

+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. + +

+------------------------------- + +

hostname
+

+Usage: hostname [OPTION] {hostname | -F file} + +

+Get or set the hostname or DNS domain name. If a hostname is given (or a +file with the -F parameter), the host name will be set. + +

+Options: + +

+

        -s              Short
+        -i              Addresses for the hostname
+        -d              DNS domain name
+        -F FILE         Use the contents of FILE to specify the hostname
+
+

+Example: + +

+

        $ hostname
+        slag 
+
+

+------------------------------- + +

id
+

+Print information for USERNAME or the current user + +

+Options: + +

+

        -g      prints only the group ID
+        -u      prints only the user ID
+        -r      prints the real user ID instead of the effective ID (with -ug)
+
+

+Example: + +

+

        $ id
+        uid=1000(andersen) gid=1000(andersen)
+
+

+------------------------------- + +

init
+

+Usage: init + +

+Init is the parent of all processes. + +

+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.
+
+

+

        <runlevels>: 
+
+

+

                The runlevels field is completely ignored.
+
+

+

        <action>: 
+
+

+

                Valid actions include: sysinit, respawn, askfirst, wait, 
+                once, and ctrlaltdel.
+
+

+

                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
+
+

+

        # /sbin/getty invocations for selected ttys
+        #
+        tty4::respawn:/sbin/getty 38400 tty4
+        tty5::respawn:/sbin/getty 38400 tty5
+
+

+

        # 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
+
+

+------------------------------- + +

kill
+

+Usage: kill [-signal] process-id [process-id ...] + +

+Send a signal (default is SIGTERM) to the specified +process(es). + +

+Options: + +

+

        -l      List all signal names and numbers.
+
+

+Example: + +

+

        $ ps | grep apache
+        252 root     root     S [apache]
+        263 www-data www-data S [apache]
+        264 www-data www-data S [apache]
+        265 www-data www-data S [apache]
+        266 www-data www-data S [apache]
+        267 www-data www-data S [apache]
+        $ kill 252
+
+

+------------------------------- + +

killall
+

+Usage: killall [-signal] process-name [process-name ...] + +

+Send a signal (default is SIGTERM) to the specified +process(es). + +

+Options: + +

+

        -l      List all signal names and numbers.
+
+

+Example: + +

+

        $ killall apache
+
+

+------------------------------- + +

length
+

+Usage: length STRING + +

+Prints out the length of the specified STRING. + +

+Example: + +

+

        $ length "Hello"
+        5
+
+

+------------------------------- + +

ln
+

+Usage: ln [OPTION] TARGET... LINK_NAME|DIRECTORY + +

+Create a link named LINK_NAME or DIRECTORY to the specified TARGET Options: + +

+

        -s      make symbolic links instead of hard links
+        -f      remove existing destination files
+ 
+Example:
+
+

+

    $ ln -s BusyBox /tmp/ls
+    $ ls -l /tmp/ls
+    lrwxrwxrwx    1 root     root            7 Apr 12 18:39 ls -> BusyBox*
+
+

+------------------------------- + +

loadacm
+

+Usage: loadacm + +

+Loads an acm from standard input. + +

+Example: + +

+

        $ loadacm < /etc/i18n/acmname
+
+

+------------------------------- + +

loadfont
+

+Usage: loadfont + +

+Loads a console font from standard input. + +

+Example: + +

+

        $ loadfont < /etc/i18n/fontname
+
+

+------------------------------- + +

loadkmap
+

+Usage: loadkmap + +

+Loads a binary keyboard translation table from standard input. + +

+Example: + +

+

        $ loadkmap < /etc/i18n/lang-keymap
+
+

+------------------------------- + +

logger
+

+Usage: logger [OPTION]... [MESSAGE] + +

+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.
+
+

+Example: + +

+

                $ logger "hello"
+
+

+------------------------------- + +

logname
+

+Usage: logname + +

+Print the name of the current user. + +

+Example: + +

+

        $ logname
+        root
+
+

+------------------------------- + +

ls
+

+Usage: ls [-1acdelnpuxACF] [filenames...] + +

+Options: + +

+

        -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
+
+

+------------------------------- + +

lsmod
+

+Usage: lsmod + +

+Shows a list of all currently loaded kernel modules. + +

+------------------------------- + +

makedevs
+

+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]
+
+

+------------------------------- + +

math
+

+Usage: math expression ... + +

+This is a Tiny RPN calculator that understands the following operations: +, +-, /, *, and, or, not, eor. + +

+Example: + +

+

        $ math 2 2 add
+        4
+        $ math 8 8 \* 2 2 + /
+        16
+        $ math 0 1 and
+        0
+        $ math 0 1 or
+        1
+
+

+------------------------------- + +

mkdir
+

+Usage: mkdir [OPTION] DIRECTORY... + +

+Create the DIRECTORY(ies), if they do not already exist + +

+Options: + +

+

        -m      set permission mode (as in chmod), not rwxrwxrwx - umask
+        -p      no error if dir exists, make parent directories as needed
+
+

+Example: + +

+

        $ mkdir /tmp/foo
+        $ mkdir /tmp/foo
+        /tmp/foo: File exists
+        $ mkdir /tmp/foo/bar/baz
+        /tmp/foo/bar/baz: No such file or directory
+        $ mkdir -p /tmp/foo/bar/baz
+
+

+------------------------------- + +

mkfifo
+

+Usage: mkfifo [OPTIONS] name + +

+Creates a named pipe (identical to 'mknod name p') + +

+Options: + +

+

        -m      create the pipe using the specified mode (default a=rw)
+
+

+------------------------------- + +

mkfs.minix
+

+Usage: mkfs.minix [-c | -l filename] [-nXX] [-iXX] /dev/name [blocks] + +

+Make a MINIX filesystem. + +

+OPTIONS: + +

+

        -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
+
+

+------------------------------- + +

mknod
+

+Usage: mknod [OPTIONS] NAME TYPE MAJOR MINOR + +

+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
+
+

+------------------------------- + +

mkswap
+

+Usage: mkswap [-c] [-v0|-v1] device [block-count] + +

+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).
+
+

+------------------------------- + +

mktemp
+

+Usage: mktemp [-q] TEMPLATE + +

+Creates a temporary file with its name based on TEMPLATE. TEMPLATE is any +name with six `Xs' (i.e. /tmp/temp.XXXXXX). + +

+Example: + +

+

        $ mktemp /tmp/temp.XXXXXX
+        /tmp/temp.mWiLjM
+        $ ls -la /tmp/temp.mWiLjM
+        -rw-------    1 andersen andersen        0 Apr 25 17:10 /tmp/temp.mWiLjM
+
+

+------------------------------- + +

nc
+

+Usage: nc [IP] [port] + +

+Netcat opens a pipe to IP:port + +

+Example: + +

+

        $ nc foobar.somedomain.com 25
+        220 foobar ESMTP Exim 3.12 #1 Sat, 15 Apr 2000 00:03:02 -0600
+        help
+        214-Commands supported:
+        214-    HELO EHLO MAIL RCPT DATA AUTH
+        214     NOOP QUIT RSET HELP
+        quit
+        221 foobar closing connection
+ 
+-------------------------------
+
+
more
+

+Usage: more [file ...] + +

+More is a filter for paging through text one screenful at a time. + +

+Example: + +

+

        $ dmesg | more
+
+

+------------------------------- + +

mount
+

+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
+
+

+------------------------------- + +

mt
+

+Usage: mt [-f device] opcode value + +

+Control magnetic tape drive operation + +

+------------------------------- + +

mv
+

+Usage: mv SOURCE DEST + +

+

   or: mv SOURCE... DIRECTORY
+
+

+Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY. + +

+Example: + +

+

        $ mv /tmp/foo /bin/bar
+
+

+------------------------------- + +

nslookup
+

+Usage: nslookup [HOST] + +

+Queries the nameserver for the IP address of the given HOST + +

+Example: + +

+

        $ nslookup localhost
+        Server:     default
+        Address:    default
+
+

+

        Name:       debian
+        Address:    127.0.0.1
+
+

+------------------------------- + +

ping
+

+Usage: ping [OPTION]... host + +

+Send ICMP ECHO_REQUEST packets to network hosts. + +

+Options: + +

+

        -c COUNT        Send only COUNT pings.
+        -q              Quiet mode, only displays output at start
+                        and when finished.
+Example:
+
+

+

        $ ping localhost
+        PING slag (127.0.0.1): 56 data bytes
+        64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=20.1 ms
+
+

+

        --- debian ping statistics ---
+        1 packets transmitted, 1 packets received, 0% packet loss
+        round-trip min/avg/max = 20.1/20.1/20.1 ms
+
+

+------------------------------- + +

poweroff
+

+Shuts down the system, and requests that the kernel turn off power upon +halting. + +

+------------------------------- + +

printf
+

+Usage: printf format [argument...] + +

+Formats and prints the given data in a manner similar to the C printf +command. + +

+Example: + +

+

        $ printf "Val=%d\n" 5
+        Val=5
+
+

+------------------------------- + +

ps
+

+Usage: ps + +

+Report process status + +

+This version of ps accepts no options. + +

+Example: + +

+

        $ ps
+  PID  Uid      Gid State Command
+    1 root     root     S init
+    2 root     root     S [kflushd]
+    3 root     root     S [kupdate]
+    4 root     root     S [kpiod]
+    5 root     root     S [kswapd]
+  742 andersen andersen S [bash]
+  743 andersen andersen S -bash
+  745 root     root     S [getty]
+ 2990 andersen andersen R ps
+
+

+------------------------------- + +

pwd
+

+Prints the full filename of the current working directory. + +

+Example: + +

+

        $ pwd
+        /root
+
+

+------------------------------- + +

reboot
+

+Instructs the kernel to reboot the system. + +

+------------------------------- + +

rm
+

+Usage: rm [OPTION]... FILE... + +

+Remove (unlink) the FILE(s). + +

+Options: + +

+

        -f              remove existing destinations, never prompt
+        -r or -R        remove the contents of directories recursively
+
+

+Example: + +

+

        $ rm -rf /tmp/foo
+
+

+------------------------------- + +

rmdir
+

+Usage: rmdir [OPTION]... DIRECTORY... + +

+Remove the DIRECTORY(ies), if they are empty. + +

+Example: + +

+

        # rmdir /tmp/foo
+
+

+------------------------------- + +

rmmod
+

+Usage: rmmod [OPTION]... [MODULE]... + +

+Unloads the specified kernel modules from the kernel. + +

+Options: + +

+

        -a      Try to remove all unused kernel modules.
+
+

+Example: + +

+

        $ rmmod tulip
+
+

+------------------------------- + +

sed
+

+Usage: sed [-n] -e script [file...] + +

+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
+
+

+------------------------------- + +

setkeycodes
+

+Usage: setkeycodes SCANCODE KEYCODE ... + +

+Set entries into the kernel's scancode-to-keycode map, allowing unusual +keyboards to generate usable keycodes. + +

+SCANCODE may be either xx or e0xx (hexadecimal), and KEYCODE is given in +decimal + +

+Example: + +

+

        # setkeycodes e030 127
+
+

+------------------------------- + +

sh
+

+Usage: sh + +

+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. + +

+------------------------------- + +

sfdisk
+

+Usage: sfdisk [options] device ... + +

+device: something like /dev/hda or /dev/sda + +

+useful options: + +

+

    -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
+
+

+------------------------------- + +

sleep
+

+Usage: sleep N + +

+Pause for N seconds. + +

+Example: + +

+

        $ sleep 2
+        [2 second delay results]
+
+

+------------------------------- + +

sort
+

+Usage: sort [-n] [-r] [FILE]... + +

+Sorts lines of text in the specified files + +

+Example: + +

+

        $ echo -e "e\nf\nb\nd\nc\na" | sort
+        a
+        b
+        c
+        d
+        e
+        f
+
+

+------------------------------- + +

sync
+

+Usage: sync + +

+Write all buffered filesystem blocks to disk. + +

+------------------------------- + +

syslogd
+

+Usage: syslogd [OPTION]... + +

+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
+
+

+------------------------------- + +

swapon
+

+Usage: swapon [OPTION] [device] + +

+Start swapping virtual memory pages on the given device. + +

+Options: + +

+

        -a      Start swapping on all swap devices
+
+

+------------------------------- + +

swapoff
+

+Usage: swapoff [OPTION] [device] + +

+Stop swapping virtual memory pages on the given device. + +

+Options: + +

+

        -a      Stop swapping on all swap devices
+
+

+------------------------------- + +

tail
+

+Usage: tail [OPTION] [FILE]... + +

+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.
+
+

+Example: + +

+

        $ tail -n 1 /etc/resolv.conf
+        nameserver 10.0.0.1
+
+

+------------------------------- + +

tar
+

+Usage: tar -[cxtvO] [--exclude File] [-f tarFile] [FILE] ... + +

+Create, extract, or list files from a tar file. Note that this version of +tar treats hard links as separate files. + +

+Main operation mode: + +

+

        c               create
+        x               extract
+        t               list
+
+

+File selection: + +

+

        f               name of tarfile or "-" for stdin
+        O               extract to stdout
+        --exclude       file to exclude
+
+

+Informative output: + +

+

        v               verbosely list files processed
+
+

+Example: + +

+

        $ zcat /tmp/tarball.tar.gz | tar -xf -
+        $ tar -cf /tmp/tarball.tar /usr/local
+
+

+------------------------------- + +

test, [
+

+Usage: test EXPRESSION or [ EXPRESSION ] + +

+Checks file types and compares values returning an exit code determined by +the value of EXPRESSION. + +

+Example: + +

+

        $ test 1 -eq 2
+        $ echo $?
+        1
+        $ test 1 -eq 1
+        $ echo $?
+        0
+        $ [ -d /etc ]
+        $ echo $?
+        0
+        $ [ -d /junk ]
+        $ echo $?
+        1
+
+

+------------------------------- + +

tee
+

+Usage: tee [OPTION]... [FILE]... + +

+Copy standard input to each FILE, and also to standard output. + +

+Options: + +

+

        -a      append to the given FILEs, do not overwrite
+
+

+Example: + +

+

        $ echo "Hello" | tee /tmp/foo
+        $ cat /tmp/foo
+        Hello
+
+

+------------------------------- + +

touch
+

+Usage: touch [-c] file [file ...] + +

+Update the last-modified date on (or create) the selected file[s]. + +

+Example: + +

+

        $ ls -l /tmp/foo
+        /bin/ls: /tmp/foo: No such file or directory
+        $ touch /tmp/foo
+        $ ls -l /tmp/foo
+        -rw-rw-r--    1 andersen andersen        0 Apr 15 01:11 /tmp/foo
+
+

+------------------------------- + +

tr
+

+Usage: tr [-cds] STRING1 [STRING2] + +

+Translate, squeeze, and/or delete characters from standard input, writing +to standard output. + +

+Options: + +

+

        -c      take complement of STRING1
+        -d      delete input characters coded STRING1
+        -s      squeeze multiple output characters of STRING2 into one character
+
+

+Example: + +

+

        $ echo "gdkkn vnqkc" | tr [a-y] [b-z]
+        hello world
+
+

+------------------------------- + +

true
+

+Returns an exit code of TRUE (0) + +

+Example: + +

+

        $ true
+        $ echo $?
+        0
+
+

+------------------------------- + +

tty
+

+Usage: tty + +

+Print the file name of the terminal connected to standard input. + +

+Options: + +

+

        -s      print nothing, only return an exit status
+
+

+Example: + +

+

        $ tty
+        /dev/tty2
+
+

+------------------------------- + +

umount
+

+Usage: umount [flags] filesystem|directory + +

+Flags: + +

+

                -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)
+
+

+Example: + +

+

        $ umount /dev/hdc1 
+
+

+------------------------------- + +

uname
+

+Usage: uname [OPTION]... + +

+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
+
+

+------------------------------- + +

uniq
+

+Usage: uniq [OPTION]... [INPUT [OUTPUT]] + +

+Discard all but one of successive identical lines from INPUT (or standard +input), writing to OUTPUT (or standard output). + +

+Example: + +

+

        $ echo -e "a\na\nb\nc\nc\na" | sort | uniq
+        a
+        b
+        c
+
+

+------------------------------- + +

update
+

+Usage: update [options] + +

+Periodically flushes filesystem buffers. + +

+Options: + +

+

        -S      force use of sync(2) instead of flushing
+        -s SECS call sync this often (default 30)
+        -f SECS flush some buffers this often (default 5)
+
+

+------------------------------- + +

uptime
+

+Usage: uptime + +

+Tells how long the system has been running since boot. + +

+Example: + +

+

        $ uptime
+          1:55pm  up  2:30, load average: 0.09, 0.04, 0.00
+
+

+------------------------------- + +

usleep
+

+Usage: usleep N + +

+Pauses for N microseconds. + +

+Example: + +

+

        $ usleep 1000000
+        [pauses for 1 second]
+
+

+------------------------------- + +

wc
+

+Usage: wc [OPTION]... [FILE]... + +

+Print line, word, and byte counts for each FILE, and a total line if more +than one FILE is specified. With no FILE, read standard input. + +

+Options: + +

+

        -c      print the byte counts
+        -l      print the newline counts
+        -L      print the length of the longest line
+        -w      print the word counts
+
+

+Example: + +

+

        $ wc /etc/passwd
+             31      46    1365 /etc/passwd
+
+

+------------------------------- + +

whoami
+

+Usage: whoami + +

+Prints the user name associated with the current effective user id. + +

+Example: + +

+

        $ whoami
+        andersen
+
+

+------------------------------- + +

yes
+

+Usage: yes [OPTION]... [STRING]... + +

+Repeatedly outputs a line with all specified STRING(s), or +`y'. + +

+------------------------------- + +

zcat
+

+This is essentially an alias for invoking ``gunzip -c'', where it decompresses the file inquestion and send the output to +stdout. + +

+------------------------------- + +

+

+


+

LIBC NSS

+

+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. + +

+


+

SEE ALSO

+

+textutils(1), shellutils(1), etc... + +

+


+

MAINTAINER

+

+Erik Andersen <andersee@debian.org> <andersen@lineo.com> + +

+


+

AUTHORS

+

+The following people have contributed code to BusyBox whether they know it +or not. + +

+Erik Andersen <andersee@debian.org> + +
+ +

+John Beppu <beppu@lineo.com> + +
+ +

+Brian Candler <B.Candler@pobox.com> + +
+ +

+Randolph Chung <tausq@debian.org> + +
+ +

+Dave Cinege <dcinege@psychosis.com> + +
+ +

+Karl M. Hegbloom <karlheg@debian.org> + +
+ +

+John Lombardo <john@deltanet.com> + +
+ +

+Bruce Perens <bruce@perens.com> + +
+ +

+Linus Torvalds <torvalds@transmeta.com> + +
+ +

+Charles P. Wright <cpwright@villagenet.com> + +
+ +

+Enrique Zanardi <ezanardi@ull.es> + +
+ + + + diff --git a/docs/busybox.net/images/background.png b/docs/busybox.net/images/background.png new file mode 100644 index 000000000..11666cedb Binary files /dev/null and b/docs/busybox.net/images/background.png differ diff --git a/docs/busybox.net/images/busybox2.jpg b/docs/busybox.net/images/busybox2.jpg new file mode 100644 index 000000000..abf8f0610 Binary files /dev/null and b/docs/busybox.net/images/busybox2.jpg differ diff --git a/docs/busybox.net/index.html b/docs/busybox.net/index.html new file mode 100644 index 000000000..ff865dc1e --- /dev/null +++ b/docs/busybox.net/index.html @@ -0,0 +1,434 @@ + + + + +BusyBox + + + + + + + +

+ + + + +
+ + B u s y B o x + +
+ 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). +

+ +BusyBox is now maintained by + +Erik Andersen, and its ongoing development is being sponsored by +Lineo. +

+BusyBox is licensed under the +GNU GENERAL PUBLIC LICENSE + + + + +

+ + Download + +
+ + + + + +
+ + + Latest News + + +
+ +
    + +

  • 19 April 2000 -- syslogd bugfix +
    + Turns out that there was still a bug in busybox syslogd. + For example, with the following test app: +
    +	#include <syslog.h>
    +
    +	int do_log(char* msg, int delay)
    +	{
    +	    openlog("testlog", LOG_PID, LOG_DAEMON);
    +	    while(1) {
    +	        syslog(LOG_ERR, "%s: testing one, two, three\n", msg);
    +	        sleep(delay);
    +	    }
    +	    closelog();
    +	    return(0);
    +	};
    +
    +	int main(void)
    +	{
    +	    if (fork()==0)
    +	        do_log("A", 2);
    +	    do_log("B", 3);
    +	}
    +
    + 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. +

    + + You can grab BusyBox 0.43 tarballs here. + +

  • 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. +
+ + + + +
+ + Documentation + +
+Current documentation for BusyBox includes: +
    +
  • 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. + +
  • More documentation will follow. +
+ + + + +
+ + + Related Software + + +
+ +
    + +
  • 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. +

    + +

+ + + +
+ + Projects using BusyBox + +
+I know of the following projects that use BusyBox + +Do you use BusyBox? I'd love to know about it and I'd be happy to link to you. + + + + + +
+ + + Important Links + + +
+ + + + + + + + +
+

+ + + + +
+ + + + + + + + + + + + + + + +
+ + Mail all comments, insults, suggestions and bribes to + Erik Andersen
+ The Busybox logo is copyright 1999,2000, Erik Andersen. +
+
+ This site created with the vi editor + + Graphics by GIMP + + Linux Today + +

Slashdot +

+ Freshmeat +
+ + + + + diff --git a/findutils/which.c b/findutils/which.c new file mode 100644 index 000000000..46c2204a5 --- /dev/null +++ b/findutils/which.c @@ -0,0 +1,73 @@ +/* vi: set sw=4 ts=4: */ +/* + * Which implementation for busybox + * + * Copyright (C) 2000 by Lineo, inc. + * Written by Erik Andersen , + * + * 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 of the License, 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, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" +#include +#include + + +extern int which_main(int argc, char **argv) +{ + char *path_list, *test, *tmp; + struct dirent *next; + + if (**(argv + 1) == '-') { + usage("which [COMMAND ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nLocates a COMMAND.\n" +#endif + ); + } + argc--; + + path_list = getenv("PATH"); + if (!path_list) + path_list = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"; + + while(argc-- > 0 && *(argv++) != '\0' && strlen(*argv)) { + for( test=path_list; (tmp=strchr(test, ':')) && (tmp+1)!=NULL; test=++tmp) { + DIR *dir; + *tmp='\0'; + //printf("Checking directory '%s'\n", test); + dir = opendir(test); + if (!dir) + continue; + while ((next = readdir(dir)) != NULL) { + //printf("Checking file '%s'\n", next->d_name); + if ((strcmp(next->d_name, *argv) == 0)) { + printf("%s/%s\n", test, next->d_name); + exit(TRUE); + } + } + } + } + exit(TRUE); +} + +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/ diff --git a/gunzip.c b/gunzip.c index 11fc3a8f9..78ee1d3c1 100644 --- a/gunzip.c +++ b/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/gzip.c b/gzip.c index 17ebf6cb7..a971229d3 100644 --- a/gzip.c +++ b/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/hostname.c b/hostname.c index ef921024b..0df9fed75 100644 --- a/hostname.c +++ b/hostname.c @@ -1,6 +1,6 @@ /* vi: set sw=4 ts=4: */ /* - * $Id: hostname.c,v 1.8 2000/05/12 19:41:47 erik Exp $ + * $Id: hostname.c,v 1.9 2000/05/19 05:35:18 erik Exp $ * Mini hostname implementation for busybox * * Copyright (C) 1999 by Randolph Chung @@ -104,7 +104,6 @@ int hostname_main(int argc, char **argv) opt_domain = 1; break; case 'F': - filename = optarg; if (--argc == 0) { usage(hostname_usage); } diff --git a/init.c b/init.c index 29d8f48f9..38e913121 100644 --- a/init.c +++ b/init.c @@ -46,7 +46,7 @@ #include #include #include -#include +//#include #include #include /* for vt_stat */ #include diff --git a/init/init.c b/init/init.c index 29d8f48f9..38e913121 100644 --- a/init/init.c +++ b/init/init.c @@ -46,7 +46,7 @@ #include #include #include -#include +//#include #include #include /* for vt_stat */ #include diff --git a/internal.h b/internal.h index eb498be43..9c55f5a49 100644 --- a/internal.h +++ b/internal.h @@ -195,6 +195,7 @@ extern int uniq_main(int argc, char** argv); extern int update_main(int argc, char** argv); extern int usleep_main(int argc, char** argv); extern int wc_main(int argc, char** argv); +extern int which_main(int argc, char** argv); extern int whoami_main(int argc, char** argv); extern int yes_main(int argc, char** argv); diff --git a/lash.c b/lash.c index 9d4c27a9a..8ea5e305b 100644 --- a/lash.c +++ b/lash.c @@ -113,13 +113,18 @@ static int busy_loop(FILE * input); static struct builtInCommand bltins[] = { {"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg}, {"cd", "Change working directory", "cd [dir]", shell_cd}, - {"env", "Print all environment variables", "env", shell_env}, {"exit", "Exit from shell()", "exit", shell_exit}, {"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg}, {"jobs", "Lists the active jobs", "jobs", shell_jobs}, - {"pwd", "Print current directory", "pwd", shell_pwd}, {"export", "Set environment variable", "export [VAR=value]", shell_export}, {"unset", "Unset environment variable", "unset VAR", shell_unset}, + {NULL, NULL, NULL, NULL} +}; + +/* Table of built-in functions */ +static struct builtInCommand bltins_forking[] = { + {"env", "Print all environment variables", "env", shell_env}, + {"pwd", "Print current directory", "pwd", shell_pwd}, {".", "Source-in and run commands in a file", ". filename", shell_source}, {"help", "List shell built-in commands", "help", shell_help}, {NULL, NULL, NULL, NULL} @@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk) for (x = bltins; x->cmd; x++) { fprintf(stdout, "%s\t%s\n", x->cmd, x->descr); } + for (x = bltins_forking; x->cmd; x++) { + fprintf(stdout, "%s\t%s\n", x->cmd, x->descr); + } fprintf(stdout, "\n\n"); return TRUE; } @@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg) nextout = 1; } + /* Match any built-ins here */ + for (x = bltins; x->cmd; x++) { + if (!strcmp(newJob.progs[i].argv[0], x->cmd)) { + return (x->function(&newJob, jobList)); + } + } + if (!(newJob.progs[i].pid = fork())) { signal(SIGTTOU, SIG_DFL); @@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg) setupRedirections(newJob.progs + i); /* Match any built-ins here */ - for (x = bltins; x->cmd; x++) { + for (x = bltins_forking; x->cmd; x++) { if (!strcmp(newJob.progs[i].argv[0], x->cmd)) { exit (x->function(&newJob, jobList)); } diff --git a/messages.c b/messages.c index 73d64276d..2f8aab515 100644 --- a/messages.c +++ b/messages.c @@ -27,26 +27,28 @@ * may make the binary slightly smaller. */ -// TO use, do something like this +// To use this header file, include something like this: // //#define BB_DECLARE_EXTERN //#define bb_need_memory_exhausted //#include "messages.c" // +//Then just use the string memory_exhausted when it is needed. +// + +#include "internal.h" #ifndef _BB_MESSAGES_C #define _BB_MESSAGES_C -#define _BB_DEF_MESSAGE_PROTO(symbol) extern const char *symbol; -#define _BB_DEF_MESSAGE_INITIALIZE(symbol, string_const) const char *symbol = string_const; - #ifdef BB_DECLARE_EXTERN -# define BB_DEF_MESSAGE(symbol, string_const) _BB_DEF_MESSAGE_PROTO(symbol) +# define BB_DEF_MESSAGE(symbol, string_const) extern const char *symbol; #else -# define BB_DEF_MESSAGE(symbol, string_const) _BB_DEF_MESSAGE_INITIALIZE(symbol, string_const) +# define BB_DEF_MESSAGE(symbol, string_const) const char *symbol = string_const; #endif + #if defined bb_need_name_too_long || ! defined BB_DECLARE_EXTERN -BB_DEF_MESSAGE(name_too_long, "%s: file name too long\n") + BB_DEF_MESSAGE(name_too_long, "%s: file name too long\n") #endif #if defined bb_need_omitting_directory || ! defined BB_DECLARE_EXTERN BB_DEF_MESSAGE(omitting_directory, "%s: %s: omitting directory\n") @@ -69,6 +71,13 @@ BB_DEF_MESSAGE(name_too_long, "%s: file name too long\n") #if defined bb_need_help || ! defined BB_DECLARE_EXTERN BB_DEF_MESSAGE(dash_dash_help, "--help") #endif +#if defined bb_need_write_error || ! defined BB_DECLARE_EXTERN + BB_DEF_MESSAGE(write_error, "Write Error\n") +#endif -#endif /* _BB_MESSAGES_C */ + + + + +#endif /* _BB_MESSAGES_C */ diff --git a/mkfs_minix.c b/mkfs_minix.c index bf4bda9fd..f4f1d0997 100644 --- a/mkfs_minix.c +++ b/mkfs_minix.c @@ -57,6 +57,9 @@ * * The device may be a block device or a image of one, but this isn't * enforced (but it's not much fun on a character device :-). + * + * Modified for BusyBox by Erik Andersen -- + * removed getopt based parser and added a hand rolled one. */ #include "internal.h" @@ -72,7 +75,6 @@ #include #include #include -#include #include #include @@ -174,6 +176,7 @@ static volatile void die(char *str) exit(8); } +static volatile void show_usage() __attribute__ ((noreturn)); static volatile void show_usage() { fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n", @@ -648,6 +651,7 @@ extern int mkfs_minix_main(int argc, char **argv) char *tmp; struct stat statbuf; char *listfile = NULL; + int stopIt=FALSE; if (argc && *argv) program_name = *argv; @@ -657,57 +661,86 @@ extern int mkfs_minix_main(int argc, char **argv) if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE) die("bad inode size"); #endif - opterr = 0; - while ((i = getopt(argc, argv, "ci:l:n:v")) != EOF) - switch (i) { - case 'c': - check = 1; - break; - case 'i': - req_nr_inodes = (unsigned long) atol(optarg); - break; - case 'l': - listfile = optarg; - break; - case 'n': - i = strtoul(optarg, &tmp, 0); - if (*tmp) - show_usage(); - if (i == 14) - magic = MINIX_SUPER_MAGIC; - else if (i == 30) - magic = MINIX_SUPER_MAGIC2; - else - show_usage(); - namelen = i; - dirsize = i + 2; - break; - case 'v': + + /* Parse options */ + //printf("argc='%d' argv='%s'\n", argc, *argv); + argv++; + while (--argc >= 0 && *argv && **argv) { + if (**argv == '-') { + stopIt=FALSE; + while (i > 0 && *++(*argv) && stopIt==FALSE) { + //printf("argc='%d' argv='%s'\n", argc, *argv); + switch (**argv) { + case 'c': + check = 1; + break; + case 'i': + if (--argc == 0) { + goto goodbye; + } + req_nr_inodes = (unsigned long) atol(*(++argv)); + break; + case 'l': + if (--argc == 0) { + goto goodbye; + } + listfile = *(++argv); + break; + case 'n': + { + char *cp=NULL; + + if (--argc == 0) { + goto goodbye; + } + if (*(*argv+1) != 0) { + cp = ++(*argv); + } else { + cp = *(++argv); + } + i = strtoul(cp, &tmp, 0); + //printf("cp='%s' i='%d'\n", cp, i); + if (*tmp) + show_usage(); + if (i == 14) + magic = MINIX_SUPER_MAGIC; + else if (i == 30) + magic = MINIX_SUPER_MAGIC2; + else + show_usage(); + namelen = i; + dirsize = i + 2; + stopIt=TRUE; + break; + } + case 'v': #ifdef HAVE_MINIX2 - version2 = 1; + version2 = 1; #else - fprintf(stderr, "%s: not compiled with minix v2 support\n", - program_name, device_name); - exit(-1); + fprintf(stderr, "%s: not compiled with minix v2 support\n", + program_name, device_name); + exit(-1); #endif - break; - default: - show_usage(); + break; + case '-': + case 'h': + default: +goodbye: + show_usage(); + } + } + } else { + //printf("else: argc='%d' argv='%s'\n", argc, *argv); + if (device_name == NULL) + device_name = *argv; + else if (BLOCKS == 0) + BLOCKS = strtol(*argv, &tmp, 0); + else { + goto goodbye; + } } - argc -= optind; - argv += optind; - if (argc > 0 && !device_name) { - device_name = argv[0]; - argc--; argv++; } - if (argc > 0) { - BLOCKS = strtol(argv[0], &tmp, 0); - if (*tmp) { - printf("strtol error: number of blocks not specified"); - show_usage(); - } - } if (device_name && !BLOCKS) BLOCKS = get_size(device_name) / 1024; @@ -760,5 +793,6 @@ extern int mkfs_minix_main(int argc, char **argv) } mark_good_blocks(); write_tables(); - return 0; + exit( 0); + } diff --git a/networking/hostname.c b/networking/hostname.c index ef921024b..0df9fed75 100644 --- a/networking/hostname.c +++ b/networking/hostname.c @@ -1,6 +1,6 @@ /* vi: set sw=4 ts=4: */ /* - * $Id: hostname.c,v 1.8 2000/05/12 19:41:47 erik Exp $ + * $Id: hostname.c,v 1.9 2000/05/19 05:35:18 erik Exp $ * Mini hostname implementation for busybox * * Copyright (C) 1999 by Randolph Chung @@ -104,7 +104,6 @@ int hostname_main(int argc, char **argv) opt_domain = 1; break; case 'F': - filename = optarg; if (--argc == 0) { usage(hostname_usage); } diff --git a/printf.c b/printf.c index 28a011dcd..4e9a94049 100644 --- a/printf.c +++ b/printf.c @@ -51,7 +51,6 @@ #include #include #include -#include #include #include #include diff --git a/regexp.c b/regexp.c index 048c03f79..c271412cb 100644 --- a/regexp.c +++ b/regexp.c @@ -474,7 +474,7 @@ extern regexp *regcomp(char *text) int token; int peek; char *build; - regexp *re; // Ignore compiler whining. If we longjmp, we don't use re anymore. + regexp *re; /* prepare for error handling */ diff --git a/sh.c b/sh.c index 9d4c27a9a..8ea5e305b 100644 --- a/sh.c +++ b/sh.c @@ -113,13 +113,18 @@ static int busy_loop(FILE * input); static struct builtInCommand bltins[] = { {"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg}, {"cd", "Change working directory", "cd [dir]", shell_cd}, - {"env", "Print all environment variables", "env", shell_env}, {"exit", "Exit from shell()", "exit", shell_exit}, {"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg}, {"jobs", "Lists the active jobs", "jobs", shell_jobs}, - {"pwd", "Print current directory", "pwd", shell_pwd}, {"export", "Set environment variable", "export [VAR=value]", shell_export}, {"unset", "Unset environment variable", "unset VAR", shell_unset}, + {NULL, NULL, NULL, NULL} +}; + +/* Table of built-in functions */ +static struct builtInCommand bltins_forking[] = { + {"env", "Print all environment variables", "env", shell_env}, + {"pwd", "Print current directory", "pwd", shell_pwd}, {".", "Source-in and run commands in a file", ". filename", shell_source}, {"help", "List shell built-in commands", "help", shell_help}, {NULL, NULL, NULL, NULL} @@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk) for (x = bltins; x->cmd; x++) { fprintf(stdout, "%s\t%s\n", x->cmd, x->descr); } + for (x = bltins_forking; x->cmd; x++) { + fprintf(stdout, "%s\t%s\n", x->cmd, x->descr); + } fprintf(stdout, "\n\n"); return TRUE; } @@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg) nextout = 1; } + /* Match any built-ins here */ + for (x = bltins; x->cmd; x++) { + if (!strcmp(newJob.progs[i].argv[0], x->cmd)) { + return (x->function(&newJob, jobList)); + } + } + if (!(newJob.progs[i].pid = fork())) { signal(SIGTTOU, SIG_DFL); @@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg) setupRedirections(newJob.progs + i); /* Match any built-ins here */ - for (x = bltins; x->cmd; x++) { + for (x = bltins_forking; x->cmd; x++) { if (!strcmp(newJob.progs[i].argv[0], x->cmd)) { exit (x->function(&newJob, jobList)); } diff --git a/shell/lash.c b/shell/lash.c index 9d4c27a9a..8ea5e305b 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -113,13 +113,18 @@ static int busy_loop(FILE * input); static struct builtInCommand bltins[] = { {"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg}, {"cd", "Change working directory", "cd [dir]", shell_cd}, - {"env", "Print all environment variables", "env", shell_env}, {"exit", "Exit from shell()", "exit", shell_exit}, {"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg}, {"jobs", "Lists the active jobs", "jobs", shell_jobs}, - {"pwd", "Print current directory", "pwd", shell_pwd}, {"export", "Set environment variable", "export [VAR=value]", shell_export}, {"unset", "Unset environment variable", "unset VAR", shell_unset}, + {NULL, NULL, NULL, NULL} +}; + +/* Table of built-in functions */ +static struct builtInCommand bltins_forking[] = { + {"env", "Print all environment variables", "env", shell_env}, + {"pwd", "Print current directory", "pwd", shell_pwd}, {".", "Source-in and run commands in a file", ". filename", shell_source}, {"help", "List shell built-in commands", "help", shell_help}, {NULL, NULL, NULL, NULL} @@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk) for (x = bltins; x->cmd; x++) { fprintf(stdout, "%s\t%s\n", x->cmd, x->descr); } + for (x = bltins_forking; x->cmd; x++) { + fprintf(stdout, "%s\t%s\n", x->cmd, x->descr); + } fprintf(stdout, "\n\n"); return TRUE; } @@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg) nextout = 1; } + /* Match any built-ins here */ + for (x = bltins; x->cmd; x++) { + if (!strcmp(newJob.progs[i].argv[0], x->cmd)) { + return (x->function(&newJob, jobList)); + } + } + if (!(newJob.progs[i].pid = fork())) { signal(SIGTTOU, SIG_DFL); @@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg) setupRedirections(newJob.progs + i); /* Match any built-ins here */ - for (x = bltins; x->cmd; x++) { + for (x = bltins_forking; x->cmd; x++) { if (!strcmp(newJob.progs[i].argv[0], x->cmd)) { exit (x->function(&newJob, jobList)); } diff --git a/tr.c b/tr.c index ebb64799f..3e7ba583c 100644 --- a/tr.c +++ b/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/util-linux/dmesg.c b/util-linux/dmesg.c index 6fa17b5fb..c4f4fb408 100644 --- a/util-linux/dmesg.c +++ b/util-linux/dmesg.c @@ -18,7 +18,6 @@ #include "internal.h" #include #include -#include #include #if __GNU_LIBRARY__ < 5 diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c index bf4bda9fd..f4f1d0997 100644 --- a/util-linux/mkfs_minix.c +++ b/util-linux/mkfs_minix.c @@ -57,6 +57,9 @@ * * The device may be a block device or a image of one, but this isn't * enforced (but it's not much fun on a character device :-). + * + * Modified for BusyBox by Erik Andersen -- + * removed getopt based parser and added a hand rolled one. */ #include "internal.h" @@ -72,7 +75,6 @@ #include #include #include -#include #include #include @@ -174,6 +176,7 @@ static volatile void die(char *str) exit(8); } +static volatile void show_usage() __attribute__ ((noreturn)); static volatile void show_usage() { fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n", @@ -648,6 +651,7 @@ extern int mkfs_minix_main(int argc, char **argv) char *tmp; struct stat statbuf; char *listfile = NULL; + int stopIt=FALSE; if (argc && *argv) program_name = *argv; @@ -657,57 +661,86 @@ extern int mkfs_minix_main(int argc, char **argv) if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE) die("bad inode size"); #endif - opterr = 0; - while ((i = getopt(argc, argv, "ci:l:n:v")) != EOF) - switch (i) { - case 'c': - check = 1; - break; - case 'i': - req_nr_inodes = (unsigned long) atol(optarg); - break; - case 'l': - listfile = optarg; - break; - case 'n': - i = strtoul(optarg, &tmp, 0); - if (*tmp) - show_usage(); - if (i == 14) - magic = MINIX_SUPER_MAGIC; - else if (i == 30) - magic = MINIX_SUPER_MAGIC2; - else - show_usage(); - namelen = i; - dirsize = i + 2; - break; - case 'v': + + /* Parse options */ + //printf("argc='%d' argv='%s'\n", argc, *argv); + argv++; + while (--argc >= 0 && *argv && **argv) { + if (**argv == '-') { + stopIt=FALSE; + while (i > 0 && *++(*argv) && stopIt==FALSE) { + //printf("argc='%d' argv='%s'\n", argc, *argv); + switch (**argv) { + case 'c': + check = 1; + break; + case 'i': + if (--argc == 0) { + goto goodbye; + } + req_nr_inodes = (unsigned long) atol(*(++argv)); + break; + case 'l': + if (--argc == 0) { + goto goodbye; + } + listfile = *(++argv); + break; + case 'n': + { + char *cp=NULL; + + if (--argc == 0) { + goto goodbye; + } + if (*(*argv+1) != 0) { + cp = ++(*argv); + } else { + cp = *(++argv); + } + i = strtoul(cp, &tmp, 0); + //printf("cp='%s' i='%d'\n", cp, i); + if (*tmp) + show_usage(); + if (i == 14) + magic = MINIX_SUPER_MAGIC; + else if (i == 30) + magic = MINIX_SUPER_MAGIC2; + else + show_usage(); + namelen = i; + dirsize = i + 2; + stopIt=TRUE; + break; + } + case 'v': #ifdef HAVE_MINIX2 - version2 = 1; + version2 = 1; #else - fprintf(stderr, "%s: not compiled with minix v2 support\n", - program_name, device_name); - exit(-1); + fprintf(stderr, "%s: not compiled with minix v2 support\n", + program_name, device_name); + exit(-1); #endif - break; - default: - show_usage(); + break; + case '-': + case 'h': + default: +goodbye: + show_usage(); + } + } + } else { + //printf("else: argc='%d' argv='%s'\n", argc, *argv); + if (device_name == NULL) + device_name = *argv; + else if (BLOCKS == 0) + BLOCKS = strtol(*argv, &tmp, 0); + else { + goto goodbye; + } } - argc -= optind; - argv += optind; - if (argc > 0 && !device_name) { - device_name = argv[0]; - argc--; argv++; } - if (argc > 0) { - BLOCKS = strtol(argv[0], &tmp, 0); - if (*tmp) { - printf("strtol error: number of blocks not specified"); - show_usage(); - } - } if (device_name && !BLOCKS) BLOCKS = get_size(device_name) / 1024; @@ -760,5 +793,6 @@ extern int mkfs_minix_main(int argc, char **argv) } mark_good_blocks(); write_tables(); - return 0; + exit( 0); + } diff --git a/utility.c b/utility.c index 234955ea7..07e540e22 100644 --- a/utility.c +++ b/utility.c @@ -801,12 +801,13 @@ unsigned long my_getid(const char *filename, char *name, unsigned long id, unsig { FILE *file; char *rname, *start, *end, buf[128]; - id_t rid; + unsigned long rid; unsigned long rgid = 0; file = fopen(filename, "r"); if (file == NULL) { - perror(filename); + /* Do not complain. It is ok for /etc/password and + * friends to be missing... */ return (-1); } diff --git a/which.c b/which.c new file mode 100644 index 000000000..46c2204a5 --- /dev/null +++ b/which.c @@ -0,0 +1,73 @@ +/* vi: set sw=4 ts=4: */ +/* + * Which implementation for busybox + * + * Copyright (C) 2000 by Lineo, inc. + * Written by Erik Andersen , + * + * 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 of the License, 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, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" +#include +#include + + +extern int which_main(int argc, char **argv) +{ + char *path_list, *test, *tmp; + struct dirent *next; + + if (**(argv + 1) == '-') { + usage("which [COMMAND ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nLocates a COMMAND.\n" +#endif + ); + } + argc--; + + path_list = getenv("PATH"); + if (!path_list) + path_list = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"; + + while(argc-- > 0 && *(argv++) != '\0' && strlen(*argv)) { + for( test=path_list; (tmp=strchr(test, ':')) && (tmp+1)!=NULL; test=++tmp) { + DIR *dir; + *tmp='\0'; + //printf("Checking directory '%s'\n", test); + dir = opendir(test); + if (!dir) + continue; + while ((next = readdir(dir)) != NULL) { + //printf("Checking file '%s'\n", next->d_name); + if ((strcmp(next->d_name, *argv) == 0)) { + printf("%s/%s\n", test, next->d_name); + exit(TRUE); + } + } + } + } + exit(TRUE); +} + +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/