From 330fd2b5767110f29544131d4c72c77e0506b6df Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Fri, 19 May 2000 05:35:19 +0000 Subject: [PATCH] More libc portability updates, add in the website (which has not been archived previously). Wrote 'which' during the meeting today. -Erik --- Changelog | 18 +- Makefile | 2 +- README | 42 +- TODO | 35 +- applets/busybox.c | 17 +- archival/gunzip.c | 151 +- archival/gzip.c | 6 +- basename.c | 16 +- busybox.c | 17 +- busybox.def.h | 8 +- coreutils/basename.c | 16 +- coreutils/printf.c | 1 - coreutils/tr.c | 29 +- dmesg.c | 1 - docs/busybox.net/BusyBox.html | 2460 ++++++++++++++++++++++++ docs/busybox.net/images/background.png | Bin 0 -> 4711 bytes docs/busybox.net/images/busybox2.jpg | Bin 0 -> 8204 bytes docs/busybox.net/index.html | 434 +++++ findutils/which.c | 73 + gunzip.c | 151 +- gzip.c | 6 +- hostname.c | 3 +- init.c | 2 +- init/init.c | 2 +- internal.h | 1 + lash.c | 21 +- messages.c | 25 +- mkfs_minix.c | 128 +- networking/hostname.c | 3 +- printf.c | 1 - regexp.c | 2 +- sh.c | 21 +- shell/lash.c | 21 +- tr.c | 29 +- util-linux/dmesg.c | 1 - util-linux/mkfs_minix.c | 128 +- utility.c | 5 +- which.c | 73 + 38 files changed, 3428 insertions(+), 521 deletions(-) create mode 100644 docs/busybox.net/BusyBox.html create mode 100644 docs/busybox.net/images/background.png create mode 100644 docs/busybox.net/images/busybox2.jpg create mode 100644 docs/busybox.net/index.html create mode 100644 findutils/which.c create mode 100644 which.c 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 0000000000000000000000000000000000000000..11666cedbadd525414344ce4d21b375b0947628a GIT binary patch literal 4711 zcmV-t5}56YP)S;nmXE(%a$K&w|%50000MbVXQnQ*UN;cVTj60B31tGH`BZ zATlm8E;Tu~t{(sZ02XvbSad^gZEa<4bO23ZWMv?CX>@2HM@dakeq|k%000qMNkln%A+ zCQO(xVZww76DCZUFk!-k2@@tDnD={vL%GV={An|<%3I&bcS6OLDBvGJW~*D@&$mFi zR!_>UzkB{flAnhb**>JFL4DxOy*93@1H zG7tP7#W2ujD~Sy4jYRa3cSaer+Bs|@O_Z0SOT^Ic>h7$X@`pOWCq8L}ygR*3>~fki zD!uicUKKlaiYgBLjy6+S$GmN`spF^3aTi@@susDAk0i?VKm951^J`+bw zmoAp!x4!GkL(^p~ak=nw9&L(ZcI(@|0!mH>T_1>If9u=6JozvZ5j65mo5gM zx4!cW7d&mjPSN>+b|G)HfD3{j;TL2K$={m_M?ZFY%usN2 zrZ2D8)|ph3d;ymQq(Oi2IiSqwIA$;FJ=4aE$QB3Ry6`C@u6WNE2W$x0Nf1k`S)Q@d7DbroZkp%D--GUdzZiy};ELeS<{v;DCj@(x=-|8|sXxV9X#Gw8T zD22(QQ;cAo^XTI-C0cg8!7ffS$vx;~ls_P9&e$GvdaD}6PSOTzXNW<_Uz%>IA`+eR zNi118j)|N!%nF#6FCYc(qjDx3T~3PLgq6f^Bghgkbp5(~0r_uD7oys1ab9XsZ#Gg( z@mHHMD;2urF8K*U(}gZQ2V^L2V&6$gvg@wkebMrTX}aJ(+Li3=g(6`@b6dlAizlqf;OcM?m8MYr6u5Kp-TLU&O3mrS}%!f0^68BK8M@yd3utrUiO_ z`AF%=4d3LDPc5=#!Z5ZCD!X5IH4;WeE_>6a$!jDGgfZVgi7v~8^`Z>QnApvjzh!3z z>GM5hAIfa0zTZ7^43C>(lF#-g0s--l_A8Mt4?OL?Cy)sv*VdbE(+;FchSso3lk*K2 z1Y@X`UN3daSHVtpNf@-|Nwv&|lo)QUQi^pqG1N$H$qQ0tjY?eZ`Y(&w ziIo}8{8Csk>iLFEzT_AjEqPBkxT$zg8A!voaG53n$8Tj*Y4#B(LpQ<;Xj5`v( z5smOS#3SWf!c3eq8@3hnd-R(l?k|3A4GhwFgb)nHnG`U~a>yqy;8nBzt&xp1mGF2uC+w6*1J7Xpp>>lgSUc_kHxm0whlE4+P8%ZY2desAB z{UXkONT5sF;UtMFwcR*{nc1d^vmk?{4+HEYZdK}H7+B2Q?5WaGf=cgtVdDrJ8`y_z zk_A&F*5s8=La^?V)#K1gDaz=bwoRV8Hj?IyjEH1IDJo%V?+Sbo5ipA1INrLUV3qZGNI|wHv!wYvuhgi~~qZlX=UCEM@W`2h~K) zMVzr1G)#leH9@AG8RQ^Wrawnt_iM=KbJ&(KV$~>!hkCM|Nf;Eyc?57VY@UaTRavW6 zxB-P_h4mgnQrS1t61r!NgJqK#r(Hlwao(0NSa&+BX#_}T0}~*5l**bltEXzoORYE3 zm}Vu1SQ8tNRoWKwC`C*~`^e7^7|9#V^~)cJN(v>PV}Cy%a*mA?Cigb@_BE|oC-B9w?<4Gr2d z#$%jV%aCCL6Gltk(iH!TdP19~(@{9eHd~TpMXhTTTMwAA6Pxmt|EEMz?aI( zfdX_ti?P+ZYE5j|fCjOq4J4}>4Q3d8bV(Lv6ucF0KnK8@Hby~%d>(4MriofcXT?B7 zu9?Hf=84QGZqpJWi^08&EXkwnw9Z-*CUFh2rUHs#S>AAso5dLH{kxUMM~2~nu1-IT zKPiUtQr_`k)0Qv^4emgon*E6;&0c$fgG9wVO3~Xg?l#mW8qBAFjFUWPtVJiX2qQ7h zytQP}HcVOPl8l?QhgY74CO^`r7)#_;gI~z%&+WEy;XP3dp7g!RBP7hiS4mjMiup!s z+>zz7a-wGl(x>Qbn8b~`X{aQ3>;T0IwzYa1fYoMT9r-QMD!G$5sDa4!Vz>lL=uN5n zfGrW_={R|_&>8t6of(OPj~EoP{y_ytbd6iAY^7yiNG0#Bi-2`LOxdjDF#PAMZup9L zZyGV0MM_t?YIYK4R$h93?~xDuXo}uPEC_PsB6*8ptez2vGP?Z}q8V_Y{j#y-qKY}$ zS6RbhfN>VvS*)7V8!FJN?nnlSClTZWCbX4NI!85{b8}{paAdoOfPX0E)MHSEzOsrj z%uu7WTG`k zoV7P>FB7m@gb93yMiAT-2c`C*Olo)XtZJdkv>NcpjXN)>`E1C2iUG=^2Y7PHDIosYxLyP5;_u>(-WaV{K2+}(# zYzX@d(ZW=-o(#s6YD@KtRqSICn|_iRHCBFFe}F`c6ka9Bu}?FbEtPS5Nl7c>V3xik zDrwofMgeVJ-5zBFI0$D>f`!Lf7Vly47!t;m4*s?>2NZNYw)Vty%r~jXV_3<-6*S)g z@a;F6ldL{g;S+{1;%KdA`8<=am$g#%4qS$3j!ymBOv31QuxI*JXikhbY%>4&ZEMxmU%USSh zoJds=?3E_6M1!k6uhAt^Iy1DGPOyqx6;(2LJl=N!ON#)`Ty;~QjTy78uW1X`j~Nuu zQ1YH-#WreIF{p|_ThDE;qI3*GQpb7(@Y6^}r+7e_+!Mo8IPM|liPs1g4qU3^mOvMB zE=h7^Uhn?w!~ci{7U?}u*qgme5q-2FA#+7|9ZGJO>4@7T0w4S5~kgUtqL#z4Iwf?eHde)OSnP2h=Lc@GwC<(lh8v3dfJpm#2;+1u*pVI7k?8x z5}4K6p%52MbPgvk7b z7Tz#XPlyztX!PoTJrn_H;3SIw!L<#zh(4nOPTJ0g@C{wuzmm7tR8SU*+= zc`Y4wnqOWDjK)NslC>yRXX!tYhu(nK0^XG~7Z6>KuYf!bWKb*luC<0v6WL z`_-7Zh2YaA?6zrCpFRF+TeX^9wAA%aZWs-Mw6*Y;&gw`eX>8eSQhME*1j}ebQy%s{ zVZthgx&IPQ3G{l&%knj|yKqDvb&a58NCmUTc1|U^Ka_2l*!`}1GWwnu9|M>>WEK(D z5~i{>-VA87^-}{7!5JZ4lE!{%^h0DVs+hc-sDtNHrK3~S2!4bx>kh&+vnD*k(H>_Z zAWXx$eeFK{+i$duz31i-!tA1{Vy(fu$l_h!Qs5(k??blK?vV@|z&o96d{QRZO5sb4 z1$~lDB1w$zI?HBkr13c>Fnlq?_SSVWI#FrN+X&!ujBI}Icrr|rQ&3aOY>d{fkEf6@ zA-vjN;r%XzihJzIIq;3RuH;AB8ZoJ_8%h1kQSjr0Ste;dvzzIKt^#XkY@)UW)*wvR zf=fPgqDAq)k{}K~TC9(A3_#OhG3Pwvn|<^Zs^_CRO_%`pz$^&gyFPCs*ND>gN8ziR zds*{Iz^0f8a{#{4f9resR`4>BVt*fU^(2rCz84wug z6Qx=L!IpQfrQG^I^1SlS(7JaO<*gs`O(tQ$Y{U5-qxJ$?WVma(OqeiX!h{JECQO(x pVZww76DCZUFk!-k2@@j0{{c3uBN5}y2(bVF002ovPDHLkV1hgM4q^ZR literal 0 HcmV?d00001 diff --git a/docs/busybox.net/images/busybox2.jpg b/docs/busybox.net/images/busybox2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abf8f0610b6d87a97accc655ff4ff5f9948b3e24 GIT binary patch literal 8204 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 literal 0 HcmV?d00001 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: +*/ -- 2.25.1