diff options
-rw-r--r-- | Changelog | 18 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | README | 42 | ||||
-rw-r--r-- | TODO | 35 | ||||
-rw-r--r-- | applets/busybox.c | 17 | ||||
-rw-r--r-- | archival/gunzip.c | 151 | ||||
-rw-r--r-- | archival/gzip.c | 6 | ||||
-rw-r--r-- | basename.c | 16 | ||||
-rw-r--r-- | busybox.c | 17 | ||||
-rw-r--r-- | busybox.def.h | 8 | ||||
-rw-r--r-- | coreutils/basename.c | 16 | ||||
-rw-r--r-- | coreutils/printf.c | 1 | ||||
-rw-r--r-- | coreutils/tr.c | 29 | ||||
-rw-r--r-- | dmesg.c | 1 | ||||
-rw-r--r-- | docs/busybox.net/BusyBox.html | 2460 | ||||
-rw-r--r-- | docs/busybox.net/images/background.png | bin | 0 -> 4711 bytes | |||
-rw-r--r-- | docs/busybox.net/images/busybox2.jpg | bin | 0 -> 8204 bytes | |||
-rw-r--r-- | docs/busybox.net/index.html | 434 | ||||
-rw-r--r-- | findutils/which.c | 73 | ||||
-rw-r--r-- | gunzip.c | 151 | ||||
-rw-r--r-- | gzip.c | 6 | ||||
-rw-r--r-- | hostname.c | 3 | ||||
-rw-r--r-- | init.c | 2 | ||||
-rw-r--r-- | init/init.c | 2 | ||||
-rw-r--r-- | internal.h | 1 | ||||
-rw-r--r-- | lash.c | 21 | ||||
-rw-r--r-- | messages.c | 25 | ||||
-rw-r--r-- | mkfs_minix.c | 128 | ||||
-rw-r--r-- | networking/hostname.c | 3 | ||||
-rw-r--r-- | printf.c | 1 | ||||
-rw-r--r-- | regexp.c | 2 | ||||
-rw-r--r-- | sh.c | 21 | ||||
-rw-r--r-- | shell/lash.c | 21 | ||||
-rw-r--r-- | tr.c | 29 | ||||
-rw-r--r-- | util-linux/dmesg.c | 1 | ||||
-rw-r--r-- | util-linux/mkfs_minix.c | 128 | ||||
-rw-r--r-- | utility.c | 5 | ||||
-rw-r--r-- | which.c | 73 |
38 files changed, 3428 insertions, 521 deletions
@@ -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 <szi@aibon.ping.de> * Fixed update segfault * Fixed mknod -- minor number was always 0 @@ -28,16 +34,12 @@ to xiong jianxin <jxiong@uiuc.edu> * 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 @@ -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 @@ -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 @@ -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 07caa34..bf0591d 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 11fc3a8..78ee1d3 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 <time.h> #include <fcntl.h> #include <unistd.h> @@ -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 17ebf6c..a971229 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; @@ -24,19 +24,23 @@ #include "internal.h" #include <stdio.h> +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; @@ -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 8eb32bf..ea17a39 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 10ae761..78265a5 100644 --- a/coreutils/basename.c +++ b/coreutils/basename.c @@ -24,19 +24,23 @@ #include "internal.h" #include <stdio.h> +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 28a011d..4e9a940 100644 --- a/coreutils/printf.c +++ b/coreutils/printf.c @@ -51,7 +51,6 @@ #include <unistd.h> #include <stdio.h> #include <sys/types.h> -#include <getopt.h> #include <sys/stat.h> #include <string.h> #include <errno.h> diff --git a/coreutils/tr.c b/coreutils/tr.c index ebb6479..3e7ba58 100644 --- a/coreutils/tr.c +++ b/coreutils/tr.c @@ -30,6 +30,20 @@ #include <stdlib.h> #include <unistd.h> #include <sys/types.h> +#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++; @@ -18,7 +18,6 @@ #include "internal.h" #include <linux/unistd.h> #include <stdio.h> -#include <getopt.h> #include <stdlib.h> #if __GNU_LIBRARY__ < 5 diff --git a/docs/busybox.net/BusyBox.html b/docs/busybox.net/BusyBox.html new file mode 100644 index 0000000..5a65db1 --- /dev/null +++ b/docs/busybox.net/BusyBox.html @@ -0,0 +1,2460 @@ +<HTML> +<HEAD> +<TITLE>BusyBox - The Swiss Army Knife of Embedded Linux</TITLE> +<LINK REV="made" HREF="mailto:none"> +</HEAD> + +<BODY> + +<!-- INDEX BEGIN --> + +<UL> + + <LI><A HREF="#NAME">NAME</A> + <LI><A HREF="#SYNTAX">SYNTAX</A> + <LI><A HREF="#DESCRIPTION">DESCRIPTION</A> + <LI><A HREF="#USAGE">USAGE</A> + <LI><A HREF="#COMMON_OPTIONS">COMMON OPTIONS</A> + <LI><A HREF="#COMMANDS">COMMANDS</A> + <LI><A HREF="#LIBC_NSS">LIBC NSS</A> + <LI><A HREF="#SEE_ALSO">SEE ALSO</A> + <LI><A HREF="#MAINTAINER">MAINTAINER</A> + <LI><A HREF="#AUTHORS">AUTHORS</A> +</UL> +<!-- INDEX END --> + +<HR> +<P> +<H1><A NAME="NAME">NAME</A></H1> +<P> +BusyBox - The Swiss Army Knife of Embedded Linux + +<P> +<HR> +<H1><A NAME="SYNTAX">SYNTAX</A></H1> +<P> +<PRE> BusyBox <function> [arguments...] # or +</PRE> +<P> +<PRE> <function> [arguments...] # if symlinked +</PRE> +<P> +<HR> +<H1><A NAME="DESCRIPTION">DESCRIPTION</A></H1> +<P> +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. + +<P> +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). + +<P> +<HR> +<H1><A NAME="USAGE">USAGE</A></H1> +<P> +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. + +<P> +For example, entering + +<P> +<PRE> ln -s ./BusyBox ls + ./ls +</PRE> +<P> +will cause BusyBox to behave as 'ls' (if the 'ls' command has been compiled +into BusyBox). + +<P> +You can also invoke BusyBox by issuing the command as an argument on the +command line. For example, entering + +<P> +<PRE> ./BusyBox ls +</PRE> +<P> +will also cause BusyBox to behave as 'ls'. + +<P> +<HR> +<H1><A NAME="COMMON_OPTIONS">COMMON OPTIONS</A></H1> +<P> +Most BusyBox commands support the <STRONG>--help</STRONG> option to provide a terse runtime description of their behavior. + +<P> +<HR> +<H1><A NAME="COMMANDS">COMMANDS</A></H1> +<P> +Currently defined functions include: + +<P> +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, [ + +<P> +------------------------------- + +<DL> +<DT><STRONG><A NAME="item_basename">basename</A></STRONG><DD> +<P> +Usage: basename FILE [SUFFIX] + +<P> +Strips directory path and suffixes from FILE. If specified, also removes +any trailing SUFFIX. + +<P> +Example: + +<P> +<PRE> $ basename /usr/local/bin/foo + foo + $ basename /usr/local/bin/ + bin + $ basename /foo/bar.txt .txt + bar +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_cat">cat</A></STRONG><DD> +<P> +Usage: cat [FILE ...] + +<P> +Concatenates <CODE>FILE(s)</CODE> and prints them to the standard output. + +<P> +Example: + +<P> +<PRE> $ cat /proc/uptime + 110716.72 17.67 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_chgrp">chgrp</A></STRONG><DD> +<P> +Usage: chgrp [OPTION]... GROUP FILE... + +<P> +Change the group membership of each FILE to GROUP. + +<P> +Options: + +<P> +<PRE> -R change files and directories recursively +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_chmod">chmod</A></STRONG><DD> +<P> +Usage: chmod [<STRONG>-R</STRONG>] MODE[,MODE]... FILE... + +<P> +Changes file access permissions for the specified <CODE>FILE(s)</CODE> (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 <CODE>FILE(s)</CODE> (or directories). + +<P> +WHO may be chosen from + +<P> +<PRE> 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 +</PRE> +<P> +OPERATOR may be chosen from + +<P> +<PRE> + Add a permission + - Remove a permission + = Assign a permission + +PERMISSION may be chosen from +</PRE> +<P> +<PRE> 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) +</PRE> +<P> +Alternately, permissions can be set numerically where the first three +numbers are calculated by adding the octal values, such as + +<P> +<PRE> 4 Read + 2 Write + 1 Execute +</PRE> +<P> +An optional fourth digit can also be used to specify + +<P> +<PRE> 4 Set user ID + 2 Set group ID + 1 Stickey bit +</PRE> +<P> +Options: + +<P> +<PRE> -R Change files and directories recursively. + +Example: +</PRE> +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_chown">chown</A></STRONG><DD> +<P> +Usage: chown [OPTION]... OWNER[<.|:>[GROUP] FILE... + +<P> +Changes the owner and/or group of each FILE to OWNER and/or GROUP. + +<P> +Options: + +<P> +<PRE> -R Changes files and directories recursively +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_chroot">chroot</A></STRONG><DD> +<P> +Usage: chroot NEWROOT [COMMAND...] + +<P> +Run COMMAND with root directory set to NEWROOT. Example: + +<P> +<PRE> $ 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* +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_clear">clear</A></STRONG><DD> +<P> +Clears the screen. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_chvt">chvt</A></STRONG><DD> +<P> +Usage: chvt N + +<P> +Changes the foreground virtual terminal to /dev/ttyN + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_cp">cp</A></STRONG><DD> +<P> +Usage: cp [OPTION]... SOURCE DEST + +<P> +<PRE> or: cp [OPTION]... SOURCE... DIRECTORY +</PRE> +<P> +Copies SOURCE to DEST, or multiple <CODE>SOURCE(s)</CODE> to DIRECTORY. + +<P> +Options: + +<P> +<PRE> -a Same as -dpR + -d Preserves links + -p Preserves file attributes if possable + -R Copies directories recursively +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_cut">cut</A></STRONG><DD> +<P> +Usage: cut [OPTION]... [FILE]... + +<P> +Prints selected fields from each input FILE to standard output. + +<P> +Options: + +<P> +<PRE> -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 +</PRE> +<P> +Example: + +<P> +<PRE> $ echo "Hello world" | cut -f 1 -d ' ' + Hello + $ echo "Hello world" | cut -f 2 -d ' ' + world +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_date">date</A></STRONG><DD> +<P> +Usage: date [OPTION]... [+FORMAT] + +<P> +<PRE> or: date [OPTION] [MMDDhhmm[[CC]YY][.ss]] +</PRE> +<P> +Displays the current time in the given FORMAT, or sets the system date. + +<P> +Options: + +<P> +<PRE> -R Outputs RFC-822 compliant date string + -s Sets time described by STRING + -u Prints or sets Coordinated Universal Time +</PRE> +<P> +Example: + +<P> +<PRE> $ date + Wed Apr 12 18:52:41 MDT 2000 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_dd">dd</A></STRONG><DD> +<P> +Usage: dd [if=name] [of=name] [bs=n] [count=n] [skip=n] [seek=n] + +<P> +Copy a file, converting and formatting according to options + +<P> +<PRE> 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 +</PRE> +<P> +Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2) +Example: + +<P> +<PRE> $ dd if=/dev/zero of=/dev/ram1 bs=1M count=4 + 4+0 records in + 4+0 records out +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_df">df</A></STRONG><DD> +<P> +Usage: df [filesystem ...] + +<P> +Prints the filesystem space used and space available. + +<P> +Example: + +<P> +<PRE> $ 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% / +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_dirname">dirname</A></STRONG><DD> +<P> +Usage: dirname NAME + +<P> +Strip non-directory suffix from file name + +<P> +Example: + +<P> +<PRE> $ dirname /tmp/foo + /tmp + $ dirname /tmp/foo/ + /tmp +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_dmesg">dmesg</A></STRONG><DD> +<P> +Usage: dmesg [<STRONG>-c</STRONG>] [<STRONG>-n</STRONG> level] [<STRONG>-s</STRONG> bufsize] Print or controls the kernel ring buffer. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_du">du</A></STRONG><DD> +<P> +Usage: du [OPTION]... [FILE]... + +<P> +Summarize disk space used for each FILE and/or directory. Disk space is +printed in units of 1k (i.e. 1024 bytes). + +<P> +Options: + +<P> +<PRE> -l count sizes many times if hard linked + -s display only a total for each argument +</PRE> +<P> +Example: + +<P> +<PRE> $ ./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 . + +------------------------------- +</PRE> +<DT><STRONG><A NAME="item_dutmp">dutmp</A></STRONG><DD> +<P> +Usage: dutmp [FILE] + +<P> +Dump utmp file format (pipe delimited) from FILE or stdin to stdout. + +<P> +Example: + +<P> +<PRE> $ 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 + +------------------------------- +</PRE> +<DT><STRONG><A NAME="item_echo">echo</A></STRONG><DD> +<P> +Usage: echo [-neE] [ARG ...] + +<P> +Prints the specified ARGs to stdout + +<P> +Options: + +<P> +<PRE> -n suppress trailing newline + -e interpret backslash-escaped characters (i.e. \t=tab etc) + -E disable interpretation of backslash-escaped characters +</PRE> +<P> +Example: + +<P> +<PRE> $ echo "Erik is cool" + Erik is cool + $ echo -e "Erik\nis\ncool" + Erik + is + cool + $ echo "Erik\nis\ncool" + Erik\nis\ncool + +------------------------------- +</PRE> +<DT><STRONG><A NAME="item_false">false</A></STRONG><DD> +<P> +Returns an exit code of FALSE (1) + +<P> +Example: + +<P> +<PRE> $ false + $ echo $? + 1 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_fbset">fbset</A></STRONG><DD> +<P> +Usage: fbset [options] [mode] + +<P> +Show and modify frame buffer device settings + +<P> +Options: + +<P> +<PRE> -h + -fb + -db + -a + -i + -g + -t + -accel + -hsync + -vsync + -laced + -double +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_fdflush">fdflush</A></STRONG><DD> +<P> +Usage: fdflush device + +<P> +Force floppy disk drive to detect disk change + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_find">find</A></STRONG><DD> +<P> +Usage: find [PATH...] [EXPRESSION] + +<P> +Search for files in a directory hierarchy. The default PATH is the current +directory; default EXPRESSION is '-print' + +<P> +EXPRESSION may consist of: + +<P> +<PRE> -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. +</PRE> +<P> +Example: + +<P> +<PRE> $ find / -name /etc/passwd + /etc/passwd +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_free">free</A></STRONG><DD> +<P> +Usage: free + +<P> +Displays the amount of free and used system memory. + +<P> +Example: + +<P> +<PRE> $ free + total used free shared buffers + Mem: 257628 248724 8904 59644 93124 + Swap: 128516 8404 120112 + Total: 386144 257128 129016 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_freeramdisk">freeramdisk</A></STRONG><DD> +<P> +Usage: freeramdisk DEVICE + +<P> +Frees all memory used by the specified ramdisk. + +<P> +Example: + +<P> +<PRE> $ freeramdisk /dev/ram2 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_deallocvt">deallocvt</A></STRONG><DD> +<P> +Usage: deallocvt N + +<P> +Deallocates unused virtual terminal /dev/ttyN + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_fsck">fsck.minix</A></STRONG><DD> +<P> +Usage: fsck.minix [<STRONG>-larvsmf</STRONG>] /dev/name + +<P> +Performs a consistency check for MINIX filesystems. + +<P> +OPTIONS: + +<P> +<PRE> -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. +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_grep">grep</A></STRONG><DD> +<P> +Usage: grep [OPTIONS]... PATTERN [FILE]... + +<P> +Search for PATTERN in each FILE or standard input. + +<P> +OPTIONS: + +<P> +<PRE> -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 +</PRE> +<P> +This version of grep matches full regular expresions. + +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_gunzip">gunzip</A></STRONG><DD> +<P> +Usage: gunzip [OPTION]... FILE + +<P> +Uncompress FILE (or standard input if FILE is '-'). + +<P> +Options: + +<P> +<PRE> -c Write output to standard output + -t Test compressed file integrity +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_gzip">gzip</A></STRONG><DD> +<P> +Usage: gzip [OPTION]... FILE + +<P> +Compress FILE with maximum compression. When FILE is '-', reads standard +input. Implies <STRONG>-c</STRONG>. + +<P> +Options: + +<P> +<PRE> -c Write output to standard output instead of FILE.gz +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_halt">halt</A></STRONG><DD> +<P> +Usage: halt + +<P> +This comand halts the system. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_head">head</A></STRONG><DD> +<P> +Usage: head [OPTION] [FILE]... + +<P> +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. + +<P> +Options: + +<P> +<PRE> -n NUM Print first NUM lines instead of first 10 +</PRE> +<P> +Example: + +<P> +<PRE> $ head -n 2 /etc/passwd + root:x:0:0:root:/root:/bin/bash + daemon:x:1:1:daemon:/usr/sbin:/bin/sh +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_hostid">hostid</A></STRONG><DD> +<P> +Usage: hostid + +<P> +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. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_hostname">hostname</A></STRONG><DD> +<P> +Usage: hostname [OPTION] {hostname | <STRONG>-F</STRONG> file} + +<P> +Get or set the hostname or DNS domain name. If a hostname is given (or a +file with the <STRONG>-F</STRONG> parameter), the host name will be set. + +<P> +Options: + +<P> +<PRE> -s Short + -i Addresses for the hostname + -d DNS domain name + -F FILE Use the contents of FILE to specify the hostname +</PRE> +<P> +Example: + +<P> +<PRE> $ hostname + slag +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_id">id</A></STRONG><DD> +<P> +Print information for USERNAME or the current user + +<P> +Options: + +<P> +<PRE> -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) +</PRE> +<P> +Example: + +<P> +<PRE> $ id + uid=1000(andersen) gid=1000(andersen) +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_init">init</A></STRONG><DD> +<P> +Usage: init + +<P> +Init is the parent of all processes. + +<P> +This version of init is designed to be run only by the kernel. + +<P> +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. + +<P> +BusyBox init works just fine without an inittab. If no inittab is found, it +has the following default behavior: + +<P> +<PRE> ::sysinit:/etc/init.d/rcS + ::askfirst:/bin/sh +</PRE> +<P> +if it detects that /dev/console is _not_ a serial console, it will also +run: + +<P> +<PRE> tty2::askfirst:/bin/sh +</PRE> +<P> +If you choose to use an /etc/inittab file, the inittab entry format is as +follows: + +<P> +<PRE> <id>:<runlevels>:<action>:<process> +</PRE> +<P> +<PRE> <id>: +</PRE> +<P> +<PRE> 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. +</PRE> +<P> +<PRE> <runlevels>: +</PRE> +<P> +<PRE> The runlevels field is completely ignored. +</PRE> +<P> +<PRE> <action>: +</PRE> +<P> +<PRE> Valid actions include: sysinit, respawn, askfirst, wait, + once, and ctrlaltdel. +</PRE> +<P> +<PRE> 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. +</PRE> +<P> +<PRE> Unrecognised actions (like initdefault) will cause init to emit + an error message, and then go along with its business. +</PRE> +<P> +<PRE> <process>: +</PRE> +<P> +<PRE> Specifies the process to be executed and it's command line. +</PRE> +<P> +Example /etc/inittab file: + +<P> +<PRE> # This is run first except when booting in single-user mode. + # + ::sysinit:/etc/init.d/rcS +</PRE> +<P> +<PRE> # /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 +</PRE> +<P> +<PRE> # /sbin/getty invocations for selected ttys + # + tty4::respawn:/sbin/getty 38400 tty4 + tty5::respawn:/sbin/getty 38400 tty5 +</PRE> +<P> +<PRE> # 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 +</PRE> +<P> +<PRE> # Stuff to do before rebooting + ::ctrlaltdel:/bin/umount -a -r > /dev/null 2>&1 + ::ctrlaltdel:/sbin/swapoff -a > /dev/null 2>&1 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_kill">kill</A></STRONG><DD> +<P> +Usage: kill [<STRONG>-signal</STRONG>] process-id [process-id ...] + +<P> +Send a signal (default is SIGTERM) to the specified +<CODE>process(es).</CODE> + +<P> +Options: + +<P> +<PRE> -l List all signal names and numbers. +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_killall">killall</A></STRONG><DD> +<P> +Usage: killall [<STRONG>-signal</STRONG>] process-name [process-name ...] + +<P> +Send a signal (default is SIGTERM) to the specified +<CODE>process(es).</CODE> + +<P> +Options: + +<P> +<PRE> -l List all signal names and numbers. +</PRE> +<P> +Example: + +<P> +<PRE> $ killall apache +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_length">length</A></STRONG><DD> +<P> +Usage: length STRING + +<P> +Prints out the length of the specified STRING. + +<P> +Example: + +<P> +<PRE> $ length "Hello" + 5 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_ln">ln</A></STRONG><DD> +<P> +Usage: ln [OPTION] TARGET... LINK_NAME|DIRECTORY + +<P> +Create a link named LINK_NAME or DIRECTORY to the specified TARGET Options: + +<P> +<PRE> -s make symbolic links instead of hard links + -f remove existing destination files + +Example: +</PRE> +<P> +<PRE> $ ln -s BusyBox /tmp/ls + $ ls -l /tmp/ls + lrwxrwxrwx 1 root root 7 Apr 12 18:39 ls -> BusyBox* +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_loadacm">loadacm</A></STRONG><DD> +<P> +Usage: loadacm + +<P> +Loads an acm from standard input. + +<P> +Example: + +<P> +<PRE> $ loadacm < /etc/i18n/acmname +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_loadfont">loadfont</A></STRONG><DD> +<P> +Usage: loadfont + +<P> +Loads a console font from standard input. + +<P> +Example: + +<P> +<PRE> $ loadfont < /etc/i18n/fontname +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_loadkmap">loadkmap</A></STRONG><DD> +<P> +Usage: loadkmap + +<P> +Loads a binary keyboard translation table from standard input. + +<P> +Example: + +<P> +<PRE> $ loadkmap < /etc/i18n/lang-keymap +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_logger">logger</A></STRONG><DD> +<P> +Usage: logger [OPTION]... [MESSAGE] + +<P> +Write MESSAGE to the system log. If MESSAGE is '-', log stdin. + +<P> +Options: + +<P> +<PRE> -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. +</PRE> +<P> +Example: + +<P> +<PRE> $ logger "hello" +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_logname">logname</A></STRONG><DD> +<P> +Usage: logname + +<P> +Print the name of the current user. + +<P> +Example: + +<P> +<PRE> $ logname + root +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_ls">ls</A></STRONG><DD> +<P> +Usage: ls [<STRONG>-1acdelnpuxACF</STRONG>] [filenames...] + +<P> +Options: + +<P> +<PRE> -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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_lsmod">lsmod</A></STRONG><DD> +<P> +Usage: lsmod + +<P> +Shows a list of all currently loaded kernel modules. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_makedevs">makedevs</A></STRONG><DD> +<P> +Usage: makedevs NAME TYPE MAJOR MINOR FIRST LAST [s] + +<P> +Creates a range of block or character special files + +<P> +TYPEs include: + +<P> +<PRE> 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. +</PRE> +<P> +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. + +<P> +Example: + +<P> +<PRE> $ makedevs /dev/ttyS c 4 66 2 63 + [creates ttyS2-ttyS63] + $ makedevs /dev/hda b 3 0 0 8 s + [creates hda,hda1-hda8] +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_math">math</A></STRONG><DD> +<P> +Usage: math expression ... + +<P> +This is a Tiny RPN calculator that understands the following operations: +, +-, /, *, and, or, not, eor. + +<P> +Example: + +<P> +<PRE> $ math 2 2 add + 4 + $ math 8 8 \* 2 2 + / + 16 + $ math 0 1 and + 0 + $ math 0 1 or + 1 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mkdir">mkdir</A></STRONG><DD> +<P> +Usage: mkdir [OPTION] DIRECTORY... + +<P> +Create the <CODE>DIRECTORY(ies),</CODE> if they do not already exist + +<P> +Options: + +<P> +<PRE> -m set permission mode (as in chmod), not rwxrwxrwx - umask + -p no error if dir exists, make parent directories as needed +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mkfifo">mkfifo</A></STRONG><DD> +<P> +Usage: mkfifo [OPTIONS] name + +<P> +Creates a named pipe (identical to 'mknod name p') + +<P> +Options: + +<P> +<PRE> -m create the pipe using the specified mode (default a=rw) +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mkfs">mkfs.minix</A></STRONG><DD> +<P> +Usage: mkfs.minix [<STRONG>-c</STRONG> | <STRONG>-l</STRONG> filename] [<STRONG>-nXX</STRONG>] [<STRONG>-iXX</STRONG>] /dev/name [blocks] + +<P> +Make a MINIX filesystem. + +<P> +OPTIONS: + +<P> +<PRE> -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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mknod">mknod</A></STRONG><DD> +<P> +Usage: mknod [OPTIONS] NAME TYPE MAJOR MINOR + +<P> +Create a special file (block, character, or pipe). + +<P> +Options: + +<P> +<PRE> -m create the special file using the specified mode (default a=rw) +</PRE> +<P> +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. + +<P> +Example: + +<P> +<PRE> $ mknod /dev/fd0 b 2 0 + $ mknod -m 644 /tmp/pipe p +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mkswap">mkswap</A></STRONG><DD> +<P> +Usage: mkswap [<STRONG>-c</STRONG>] [<STRONG>-v0</STRONG>|<STRONG>-v1</STRONG>] device [block-count] + +<P> +Prepare a disk partition to be used as a swap partition. + +<P> +Options: + +<P> +<PRE> -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). +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mktemp">mktemp</A></STRONG><DD> +<P> +Usage: mktemp [<STRONG>-q</STRONG>] TEMPLATE + +<P> +Creates a temporary file with its name based on TEMPLATE. TEMPLATE is any +name with six `Xs' (i.e. /tmp/temp.XXXXXX). + +<P> +Example: + +<P> +<PRE> $ mktemp /tmp/temp.XXXXXX + /tmp/temp.mWiLjM + $ ls -la /tmp/temp.mWiLjM + -rw------- 1 andersen andersen 0 Apr 25 17:10 /tmp/temp.mWiLjM +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_nc">nc</A></STRONG><DD> +<P> +Usage: nc [IP] [port] + +<P> +Netcat opens a pipe to IP:port + +<P> +Example: + +<P> +<PRE> $ 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 + +------------------------------- +</PRE> +<DT><STRONG><A NAME="item_more">more</A></STRONG><DD> +<P> +Usage: more [file ...] + +<P> +More is a filter for paging through text one screenful at a time. + +<P> +Example: + +<P> +<PRE> $ dmesg | more +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mount">mount</A></STRONG><DD> +<P> +Usage: mount [flags] mount [flags] device directory [<STRONG>-o</STRONG> options,more-options] + +<P> +Flags: + +<P> +<PRE> -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). +</PRE> +<P> +Options for use with the ``<STRONG>-o</STRONG>'' flag: + +<P> +<PRE> 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. +</PRE> +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mt">mt</A></STRONG><DD> +<P> +Usage: mt [<STRONG>-f</STRONG> device] opcode value + +<P> +Control magnetic tape drive operation + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_mv">mv</A></STRONG><DD> +<P> +Usage: mv SOURCE DEST + +<P> +<PRE> or: mv SOURCE... DIRECTORY +</PRE> +<P> +Rename SOURCE to DEST, or move <CODE>SOURCE(s)</CODE> to DIRECTORY. + +<P> +Example: + +<P> +<PRE> $ mv /tmp/foo /bin/bar +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_nslookup">nslookup</A></STRONG><DD> +<P> +Usage: nslookup [HOST] + +<P> +Queries the nameserver for the IP address of the given HOST + +<P> +Example: + +<P> +<PRE> $ nslookup localhost + Server: default + Address: default +</PRE> +<P> +<PRE> Name: debian + Address: 127.0.0.1 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_ping">ping</A></STRONG><DD> +<P> +Usage: ping [OPTION]... host + +<P> +Send ICMP ECHO_REQUEST packets to network hosts. + +<P> +Options: + +<P> +<PRE> -c COUNT Send only COUNT pings. + -q Quiet mode, only displays output at start + and when finished. +Example: +</PRE> +<P> +<PRE> $ 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 +</PRE> +<P> +<PRE> --- debian ping statistics --- + 1 packets transmitted, 1 packets received, 0% packet loss + round-trip min/avg/max = 20.1/20.1/20.1 ms +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_poweroff">poweroff</A></STRONG><DD> +<P> +Shuts down the system, and requests that the kernel turn off power upon +halting. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_printf">printf</A></STRONG><DD> +<P> +Usage: printf format [argument...] + +<P> +Formats and prints the given data in a manner similar to the C printf +command. + +<P> +Example: + +<P> +<PRE> $ printf "Val=%d\n" 5 + Val=5 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_ps">ps</A></STRONG><DD> +<P> +Usage: ps + +<P> +Report process status + +<P> +This version of ps accepts no options. + +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_pwd">pwd</A></STRONG><DD> +<P> +Prints the full filename of the current working directory. + +<P> +Example: + +<P> +<PRE> $ pwd + /root +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_reboot">reboot</A></STRONG><DD> +<P> +Instructs the kernel to reboot the system. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_rm">rm</A></STRONG><DD> +<P> +Usage: rm [OPTION]... FILE... + +<P> +Remove (unlink) the <CODE>FILE(s).</CODE> + +<P> +Options: + +<P> +<PRE> -f remove existing destinations, never prompt + -r or -R remove the contents of directories recursively +</PRE> +<P> +Example: + +<P> +<PRE> $ rm -rf /tmp/foo +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_rmdir">rmdir</A></STRONG><DD> +<P> +Usage: rmdir [OPTION]... DIRECTORY... + +<P> +Remove the <CODE>DIRECTORY(ies),</CODE> if they are empty. + +<P> +Example: + +<P> +<PRE> # rmdir /tmp/foo +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_rmmod">rmmod</A></STRONG><DD> +<P> +Usage: rmmod [OPTION]... [MODULE]... + +<P> +Unloads the specified kernel modules from the kernel. + +<P> +Options: + +<P> +<PRE> -a Try to remove all unused kernel modules. +</PRE> +<P> +Example: + +<P> +<PRE> $ rmmod tulip +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_sed">sed</A></STRONG><DD> +<P> +Usage: sed [<STRONG>-n</STRONG>] <STRONG>-e</STRONG> script [file...] + +<P> +Allowed sed scripts come in the following form: + +<P> +<PRE> 'ADDR [!] COMMAND' +</PRE> +<P> +<PRE> where address ADDR can be: + NUMBER Match specified line number + $ Match last line + /REGEXP/ Match specified regexp + (! inverts the meaning of the match) +</PRE> +<P> +<PRE> 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. +</PRE> +<P> +<PRE> aTEXT + which appends TEXT after the pattern space +</PRE> +<P> +Options: + +<P> +<PRE> -e add the script to the commands to be executed + -n suppress automatic printing of pattern space +</PRE> +<P> +This version of sed matches full regular expresions. + +<P> +Example: + +<P> +<PRE> $ echo "foo" | sed -e 's/f[a-zA-Z]o/bar/g' + bar +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_setkeycodes">setkeycodes</A></STRONG><DD> +<P> +Usage: setkeycodes SCANCODE KEYCODE ... + +<P> +Set entries into the kernel's scancode-to-keycode map, allowing unusual +keyboards to generate usable keycodes. + +<P> +SCANCODE may be either xx or e0xx (hexadecimal), and KEYCODE is given in +decimal + +<P> +Example: + +<P> +<PRE> # setkeycodes e030 127 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_sh">sh</A></STRONG><DD> +<P> +Usage: sh + +<P> +lash -- the BusyBox LAme SHell (command interpreter) + +<P> +This command does not yet have proper documentation. + +<P> +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. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_sfdisk">sfdisk</A></STRONG><DD> +<P> +Usage: sfdisk [options] device ... + +<P> +device: something like /dev/hda or /dev/sda + +<P> +useful options: + +<P> +<PRE> -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 +</PRE> +<P> +dangerous options: + +<P> +<PRE> -g [or --show-geometry]: print the kernel's idea of the geometry + -x [or --show-extended]: also list extended partitions on output +</PRE> +<P> +<PRE> 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 +</PRE> +<P> +You can disable all consistency checking with: + +<P> +<PRE> -f [or --force]: do what I say, even if it is stupid +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_sleep">sleep</A></STRONG><DD> +<P> +Usage: sleep N + +<P> +Pause for N seconds. + +<P> +Example: + +<P> +<PRE> $ sleep 2 + [2 second delay results] +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_sort">sort</A></STRONG><DD> +<P> +Usage: sort [<STRONG>-n</STRONG>] [<STRONG>-r</STRONG>] [FILE]... + +<P> +Sorts lines of text in the specified files + +<P> +Example: + +<P> +<PRE> $ echo -e "e\nf\nb\nd\nc\na" | sort + a + b + c + d + e + f +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_sync">sync</A></STRONG><DD> +<P> +Usage: sync + +<P> +Write all buffered filesystem blocks to disk. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_syslogd">syslogd</A></STRONG><DD> +<P> +Usage: syslogd [OPTION]... + +<P> +Linux system and kernel (provides klogd) logging utility. Note that this +version of syslogd/klogd ignores /etc/syslog.conf. + +<P> +Options: + +<P> +<PRE> -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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_swapon">swapon</A></STRONG><DD> +<P> +Usage: swapon [OPTION] [device] + +<P> +Start swapping virtual memory pages on the given device. + +<P> +Options: + +<P> +<PRE> -a Start swapping on all swap devices +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_swapoff">swapoff</A></STRONG><DD> +<P> +Usage: swapoff [OPTION] [device] + +<P> +Stop swapping virtual memory pages on the given device. + +<P> +Options: + +<P> +<PRE> -a Stop swapping on all swap devices +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_tail">tail</A></STRONG><DD> +<P> +Usage: tail [OPTION] [FILE]... + +<P> +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. + +<P> +Options: + +<P> +<PRE> -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. +</PRE> +<P> +Example: + +<P> +<PRE> $ tail -n 1 /etc/resolv.conf + nameserver 10.0.0.1 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_tar">tar</A></STRONG><DD> +<P> +Usage: tar -[cxtvO] [<STRONG>--exclude</STRONG> File] [<STRONG>-f</STRONG> tarFile] [FILE] ... + +<P> +Create, extract, or list files from a tar file. Note that this version of +tar treats hard links as separate files. + +<P> +Main operation mode: + +<P> +<PRE> c create + x extract + t list +</PRE> +<P> +File selection: + +<P> +<PRE> f name of tarfile or "-" for stdin + O extract to stdout + --exclude file to exclude +</PRE> +<P> +Informative output: + +<P> +<PRE> v verbosely list files processed +</PRE> +<P> +Example: + +<P> +<PRE> $ zcat /tmp/tarball.tar.gz | tar -xf - + $ tar -cf /tmp/tarball.tar /usr/local +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_test">test, [</A></STRONG><DD> +<P> +Usage: test EXPRESSION or [ EXPRESSION ] + +<P> +Checks file types and compares values returning an exit code determined by +the value of EXPRESSION. + +<P> +Example: + +<P> +<PRE> $ test 1 -eq 2 + $ echo $? + 1 + $ test 1 -eq 1 + $ echo $? + 0 + $ [ -d /etc ] + $ echo $? + 0 + $ [ -d /junk ] + $ echo $? + 1 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_tee">tee</A></STRONG><DD> +<P> +Usage: tee [OPTION]... [FILE]... + +<P> +Copy standard input to each FILE, and also to standard output. + +<P> +Options: + +<P> +<PRE> -a append to the given FILEs, do not overwrite +</PRE> +<P> +Example: + +<P> +<PRE> $ echo "Hello" | tee /tmp/foo + $ cat /tmp/foo + Hello +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_touch">touch</A></STRONG><DD> +<P> +Usage: touch [<STRONG>-c</STRONG>] file [file ...] + +<P> +Update the last-modified date on (or create) the selected file[s]. + +<P> +Example: + +<P> +<PRE> $ 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 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_tr">tr</A></STRONG><DD> +<P> +Usage: tr [-cds] STRING1 [STRING2] + +<P> +Translate, squeeze, and/or delete characters from standard input, writing +to standard output. + +<P> +Options: + +<P> +<PRE> -c take complement of STRING1 + -d delete input characters coded STRING1 + -s squeeze multiple output characters of STRING2 into one character +</PRE> +<P> +Example: + +<P> +<PRE> $ echo "gdkkn vnqkc" | tr [a-y] [b-z] + hello world +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_true">true</A></STRONG><DD> +<P> +Returns an exit code of TRUE (0) + +<P> +Example: + +<P> +<PRE> $ true + $ echo $? + 0 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_tty">tty</A></STRONG><DD> +<P> +Usage: tty + +<P> +Print the file name of the terminal connected to standard input. + +<P> +Options: + +<P> +<PRE> -s print nothing, only return an exit status +</PRE> +<P> +Example: + +<P> +<PRE> $ tty + /dev/tty2 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_umount">umount</A></STRONG><DD> +<P> +Usage: umount [flags] filesystem|directory + +<P> +Flags: + +<P> +<PRE> -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) +</PRE> +<P> +Example: + +<P> +<PRE> $ umount /dev/hdc1 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_uname">uname</A></STRONG><DD> +<P> +Usage: uname [OPTION]... + +<P> +Print certain system information. With no OPTION, same as <STRONG>-s</STRONG>. + +<P> +Options: + +<P> +<PRE> -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 +</PRE> +<P> +Example: + +<P> +<PRE> $ uname -a + Linux debian 2.2.15pre13 #5 Tue Mar 14 16:03:50 MST 2000 i686 unknown +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_uniq">uniq</A></STRONG><DD> +<P> +Usage: uniq [OPTION]... [INPUT [OUTPUT]] + +<P> +Discard all but one of successive identical lines from INPUT (or standard +input), writing to OUTPUT (or standard output). + +<P> +Example: + +<P> +<PRE> $ echo -e "a\na\nb\nc\nc\na" | sort | uniq + a + b + c +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_update">update</A></STRONG><DD> +<P> +Usage: update [options] + +<P> +Periodically flushes filesystem buffers. + +<P> +Options: + +<P> +<PRE> -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) +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_uptime">uptime</A></STRONG><DD> +<P> +Usage: uptime + +<P> +Tells how long the system has been running since boot. + +<P> +Example: + +<P> +<PRE> $ uptime + 1:55pm up 2:30, load average: 0.09, 0.04, 0.00 +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_usleep">usleep</A></STRONG><DD> +<P> +Usage: usleep N + +<P> +Pauses for N microseconds. + +<P> +Example: + +<P> +<PRE> $ usleep 1000000 + [pauses for 1 second] +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_wc">wc</A></STRONG><DD> +<P> +Usage: wc [OPTION]... [FILE]... + +<P> +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. + +<P> +Options: + +<P> +<PRE> -c print the byte counts + -l print the newline counts + -L print the length of the longest line + -w print the word counts +</PRE> +<P> +Example: + +<P> +<PRE> $ wc /etc/passwd + 31 46 1365 /etc/passwd +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_whoami">whoami</A></STRONG><DD> +<P> +Usage: whoami + +<P> +Prints the user name associated with the current effective user id. + +<P> +Example: + +<P> +<PRE> $ whoami + andersen +</PRE> +<P> +------------------------------- + +<DT><STRONG><A NAME="item_yes">yes</A></STRONG><DD> +<P> +Usage: yes [OPTION]... [STRING]... + +<P> +Repeatedly outputs a line with all specified <CODE>STRING(s),</CODE> or +`y'. + +<P> +------------------------------- + +<DT><STRONG><A NAME="item_zcat">zcat</A></STRONG><DD> +<P> +This is essentially an alias for invoking ``gunzip <STRONG>-c</STRONG>'', where it decompresses the file inquestion and send the output to +stdout. + +<P> +------------------------------- + +</DL> +<P> +<HR> +<H1><A NAME="LIBC_NSS">LIBC NSS</A></H1> +<P> +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. + +<P> +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. + +<P> +<HR> +<H1><A NAME="SEE_ALSO">SEE ALSO</A></H1> +<P> +<CODE>textutils(1),</CODE> <CODE>shellutils(1),</CODE> etc... + +<P> +<HR> +<H1><A NAME="MAINTAINER">MAINTAINER</A></H1> +<P> +Erik Andersen <<A +HREF="mailto:andersee@debian.org">andersee@debian.org</A>> <<A +HREF="mailto:andersen@lineo.com">andersen@lineo.com</A>> + +<P> +<HR> +<H1><A NAME="AUTHORS">AUTHORS</A></H1> +<P> +The following people have contributed code to BusyBox whether they know it +or not. + +<P> +Erik Andersen <<A +HREF="mailto:andersee@debian.org">andersee@debian.org</A>> + +<br> + +<P> +John Beppu <<A HREF="mailto:beppu@lineo.com">beppu@lineo.com</A>> + +<br> + +<P> +Brian Candler <<A +HREF="mailto:B.Candler@pobox.com">B.Candler@pobox.com</A>> + +<br> + +<P> +Randolph Chung <<A +HREF="mailto:tausq@debian.org">tausq@debian.org</A>> + +<br> + +<P> +Dave Cinege <<A +HREF="mailto:dcinege@psychosis.com">dcinege@psychosis.com</A>> + +<br> + +<P> +Karl M. Hegbloom <<A +HREF="mailto:karlheg@debian.org">karlheg@debian.org</A>> + +<br> + +<P> +John Lombardo <<A +HREF="mailto:john@deltanet.com">john@deltanet.com</A>> + +<br> + +<P> +Bruce Perens <<A HREF="mailto:bruce@perens.com">bruce@perens.com</A>> + +<br> + +<P> +Linus Torvalds <<A +HREF="mailto:torvalds@transmeta.com">torvalds@transmeta.com</A>> + +<br> + +<P> +Charles P. Wright <<A +HREF="mailto:cpwright@villagenet.com">cpwright@villagenet.com</A>> + +<br> + +<P> +Enrique Zanardi <<A +HREF="mailto:ezanardi@ull.es">ezanardi@ull.es</A>> + +<br> + +</BODY> + +</HTML> diff --git a/docs/busybox.net/images/background.png b/docs/busybox.net/images/background.png Binary files differnew file mode 100644 index 0000000..11666ce --- /dev/null +++ b/docs/busybox.net/images/background.png diff --git a/docs/busybox.net/images/busybox2.jpg b/docs/busybox.net/images/busybox2.jpg Binary files differnew file mode 100644 index 0000000..abf8f06 --- /dev/null +++ b/docs/busybox.net/images/busybox2.jpg diff --git a/docs/busybox.net/index.html b/docs/busybox.net/index.html new file mode 100644 index 0000000..ff865dc --- /dev/null +++ b/docs/busybox.net/index.html @@ -0,0 +1,434 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> + +<HTML> +<HEAD> +<TITLE>BusyBox</TITLE> +</HEAD> + +<body text="#000000" alink="#660000" link="#660000" bgcolor="#ffffff" vlink="#660000" background="images/background.png" > + +<basefont face="lucida, helvetica, arial" size="3"> + + +<CENTER> + <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> + <TR> + <td bgcolor="#000000"> + <FONT FACE="lucida, helvetica" COLOR="#ccccc0"> + <B>B u s y B o x</B> + </FONT> + </TD> + </TR> + </TABLE> + <a href="/"><IMG SRC="images/busybox2.jpg" alt="BusyBox" border="0" width="360" height="230"</a><BR> + + +<!-- Begin Introduction section --> + + +<TABLE WIDTH=95% CELLSPACING=1 CELLPADDING=4 BORDER=1> +<TR><TD BGCOLOR="#ccccc0" ALIGN=center> + <A NAME="intro"> <BIG><B> + The Swiss Army Knife of Embedded Linux + </font> + </A></B></BIG> +</TD></TR> +<TR><TD BGCOLOR="#eeeee0"> + +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. +<p> +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). +<p> + +BusyBox is now maintained by +<a href="http://www.xmission.com/~andersen/erik/erik.html"> +Erik Andersen</a>, and its ongoing development is being sponsored by +<a href="http://www.lineo.com/">Lineo</a>. +<p> +BusyBox is licensed under the +<a href="http://www.gnu.org/copyleft/gpl.html">GNU GENERAL PUBLIC LICENSE</a> + + +<!-- Begin Download section --> + +<TR><TD BGCOLOR="#ccccc0" ALIGN=center> + <A NAME="download"><BIG><B> + Download + </A></B></BIG> +</TD></TR> +<TR><TD BGCOLOR="#eeeee0"> +<ul> + <li> Source for the latest release can always be downloaded from + <a href="ftp://ftp.lineo.com/pub/busybox">ftp://ftp.lineo.com/pub/busybox</a>. +</ul> + + +<!-- Begin Latest News section --> + +<TR><TD BGCOLOR="#ccccc0" ALIGN=center> + <A NAME="news"> + <BIG><B> + Latest News</A> + </B></BIG> + </A> +</TD></TR> +<TR><TD BGCOLOR="#eeeee0"> + +<ul> + + <p> <li> <b>19 April 2000 -- syslogd bugfix</b> + <br> + Turns out that there was still a bug in busybox syslogd. + For example, with the following test app: +<pre> + #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); + } +</pre> + 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). + <p> + Karl M. Hegbloom has created a + <a href="ftp://ftp.lineo.com/pub/busybox/busybox-0.43-syslog_patch">fix for the problem</a>. + Thanks Karl! + + + <p> <li> <b>18 April 2000 -- BusyBox 0.43 released (finally!)</b> + <br> + 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 + <a href="ftp://ftp.lineo.com/pub/busybox/Changelog">changelog</a>. + Oh, and as a special bonus, I wrote some fairly comprehensive + <em>documentation</em>, complete with examples and full usage information. + + <p> + 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. + <p> + + You can grab BusyBox 0.43 tarballs <a href="ftp://ftp.lineo.com/pub/busybox/">here</a>. + + <p> <li> <b>9 April 2000 -- BusyBox 0.43 pre release</b> + <br> + 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. + <p> + The pre-release can be found <a href="ftp://ftp.lineo.com/pub/busybox/">here</a>. + Please let me know ASAP if you find <em>any</em> bugs. + + <p> <li> <b>28 March 2000 -- Andersen Baby Boy release</b> + <br> + 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). + <p> + 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. + <p> + 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. + + + <p> <li> <b>11 February 2000 -- BusyBox 0.42 released</b> + <br> + + This is the most solid BusyBox release so far. Many, many + bugs have been fixed. See the +<a href="ftp://ftp.lineo.com/pub/busybox/Changelog">changelog</a> 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. + + <p> <li> <b>19 January 2000 -- BusyBox 0.41 released</b> + <br> + + 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 <a href="ftp://ftp.lineo.com/pub/busybox/Changelog">here</a>. + + <p> <li> <b>7 January 2000 -- BusyBox 0.40 released</b> + <br> + + 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 <a href="ftp://ftp.lineo.com/pub/busybox/Changelog">here</a>. + + <p> <li> <b>11 December 1999 -- BusyBox Website</b> + <br> + 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. + + <p> <li> <b>10 December 1999 -- BusyBox 0.39 released</b> + <br> + 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 <a href="ftp://ftp.lineo.com/pub/busybox/Changelog">here</a>. + <p> <li> <b>5 December 1999 -- BusyBox 0.38 released</b> + <br> + This release includes fixes to tar, cat, ls, dd, rm, umount, find, df, + and make install, and includes new apps syslogd/klogd and logger. +</ul> + + +<!-- Begin Docs section --> + +<TR><TD BGCOLOR="#ccccc0" ALIGN=center> + <A NAME="docs"><BIG><B> + Documentation + </A></B></BIG> +</TD></TR> +<TR><TD BGCOLOR="#eeeee0"> +Current documentation for BusyBox includes: +<ul> + <li> <a href="BusyBox.html">BusyBox.html</a> + 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 <em>lot</em> 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. + + <li> More documentation will follow. +</ul> + + +<!-- Begin Links section --> + +<TR><TD BGCOLOR="#ccccc0" ALIGN=center> + <A NAME="related"> + <BIG><B> + Related Software</A> + </B></BIG> + </A> +</TD></TR> +<TR><TD BGCOLOR="#eeeee0"> + +<ul> + + <li><a href="http://www.debian.org/Packages/unstable/shells/ash.html">ash</a> + is a very small Bourne shell. If you need a shell for your embedded systems, this is it. + <p> + + <li><a href="http://www.debian.org/Packages/unstable/base/ae.html">ae</a> + 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. + <p> + + <li> <a href="http://www.debian.org/Packages/unstable/base/elvis-tiny.html">elvis-tiny</a> + 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. + <p> + + <li> <a href="http://www.asty.org/nano/">nano</a> + A small GPLed pico clone that makes a nice editor for people that don't know "vi". + <p> + + <li><a href="http://www.debian.org/Packages/unstable/net/iproute.html">iproute</a> + 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. + <p> + + <li><a href="http://www.debian.org/Packages/unstable/net/pump.html">Pump</a> + This is the DHCP/BOOTP client written by RedHat. When compiled properly, it + gives you dhcp client support for about 35k. + <p> + + <li><a href="http://www.pcug.org.au/~dbell/">sash</a> + 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. + <p> + + <li><a href="http://sourceware.cygnus.com/newlib/">NewLib</a> + 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. + <p> + + <li><a href="http://linuxassembly.org/asmutils.html">asmutils</a> + 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). + <p> + + <li><a href="http://tinylogin.lineo.com/">TinyLogin</a> + is a nice embedded tool for handling authentication, changing passwords, + and similar tasks, and which nicely complements BusyBox. + <p> + +</ul> + +<!-- Begin Projects section --> + +<TR><TD BGCOLOR="#ccccc0" ALIGN=center> + <A NAME="docs"><BIG><B> + Projects using BusyBox + </A></B></BIG> +</TD></TR> +<TR><TD BGCOLOR="#eeeee0"> +I know of the following projects that use BusyBox +<ul> + <li> <a href="http://www.lineo.com/products/embedix.html">Lineo Embedix Linux</a> + <li> <a href="http://cvs.debian.org/boot-floppies/">Debian boot floppies project</a> + <li> <a href="http://www.linuxrouter.org/">Linux Router Project </a> + <li> <a href="http://linux-embedded.org/">LEM</a> + <li> <a href="http://www.toms.net/rb/">tomsrtbt</a> + +</ul> +Do you use BusyBox? I'd love to know about it and I'd be happy to link to you. + + + +<!-- Begin Links section --> + +<TR><TD BGCOLOR="#ccccc0" ALIGN=center> + <A NAME="links"> + <BIG><B> + Important Links</A> + </B></BIG> + </A> +</TD></TR> +<TR><TD BGCOLOR="#eeeee0"> + +<ul> + + <li> <A HREF="http://perens.com/FreeSoftware/"> + Free Software from Bruce Perens</A><br> + The original idea for BusyBox, and all versions up to 0.26 were written + by <A HREF="mailto:bruce@perens.com">Bruce Perens</a>. This is his BusyBox website. + <p> + + <li> <A HREF="http://freshmeat.net/appindex/1999/04/11/923859921.html"> + Freshmeat AppIndex record for BusyBox</A> + <p> + + <li> <A HREF="http://www.lineo.com/">Lineo</A> is sponsoring BusyBox development. + <p> + +</ul> + + + + +<!-- End of Table --> + +</TD></TR> +</TABLE> +</P> + + + +<!-- Footer --> +<HR> +<TABLE WIDTH="100%"> + <TR> + <TD> + <font size="-1" face="arial, helvetica, sans-serif"> + Mail all comments, insults, suggestions and bribes to + <a href="mailto:andersen@lineo.com">Erik Andersen</a><BR> + The Busybox logo is copyright 1999,2000, Erik Andersen. + </font> + </TD> + + <TD> + <a href="http://www.vim.org"><img border=0 width=88 height=32 + src="images/anim.written.in.vi.gif" + alt="This site created with the vi editor"></a> + </TD> + + <TD> + <a href="http://www.gimp.org/"><img border=0 width=88 height=38 + src="images/gfx_by_gimp.gif" alt="Graphics by GIMP"></a> + </TD> + + <TD> + <a href="http://www.linuxtoday.com"><img width=90 height=36 + src="images/ltbutton2.jpg" alt="Linux Today"></a> + </TD> + + <TD> + <p><a href="http://slashdot.org"><img width=90 height=36 + src="images/sdsmall.gif" alt="Slashdot"></a> + </TD> + + <TD> + <a href="http://freshmeat.net"><img width=90 height=36 + src="images/fm.mini.jpg" alt="Freshmeat"></a> + </TD> + + </TR> +</TABLE> + + +</BODY> +</HTML> + diff --git a/findutils/which.c b/findutils/which.c new file mode 100644 index 0000000..46c2204 --- /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 <andersen@lineo.com>, <andersee@debian.org> + * + * 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 <stdio.h> +#include <dirent.h> + + +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: +*/ @@ -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 <time.h> #include <fcntl.h> #include <unistd.h> @@ -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(""); @@ -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; @@ -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 <tausq@debian.org> @@ -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); } @@ -46,7 +46,7 @@ #include <sys/fcntl.h> #include <sys/ioctl.h> #include <sys/mount.h> -#include <sys/sysmacros.h> +//#include <sys/sysmacros.h> #include <sys/types.h> #include <sys/vt.h> /* for vt_stat */ #include <sys/wait.h> diff --git a/init/init.c b/init/init.c index 29d8f48..38e9131 100644 --- a/init/init.c +++ b/init/init.c @@ -46,7 +46,7 @@ #include <sys/fcntl.h> #include <sys/ioctl.h> #include <sys/mount.h> -#include <sys/sysmacros.h> +//#include <sys/sysmacros.h> #include <sys/types.h> #include <sys/vt.h> /* for vt_stat */ #include <sys/wait.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); @@ -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)); } @@ -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 bf4bda9..f4f1d09 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 <andersen@debian.org> -- + * removed getopt based parser and added a hand rolled one. */ #include "internal.h" @@ -72,7 +75,6 @@ #include <sys/stat.h> #include <sys/ioctl.h> #include <mntent.h> -#include <getopt.h> #include <linux/fs.h> #include <linux/minix_fs.h> @@ -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 ef92102..0df9fed 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 <tausq@debian.org> @@ -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); } @@ -51,7 +51,6 @@ #include <unistd.h> #include <stdio.h> #include <sys/types.h> -#include <getopt.h> #include <sys/stat.h> #include <string.h> #include <errno.h> @@ -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 */ @@ -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 9d4c27a..8ea5e30 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)); } @@ -30,6 +30,20 @@ #include <stdlib.h> #include <unistd.h> #include <sys/types.h> +#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 6fa17b5..c4f4fb4 100644 --- a/util-linux/dmesg.c +++ b/util-linux/dmesg.c @@ -18,7 +18,6 @@ #include "internal.h" #include <linux/unistd.h> #include <stdio.h> -#include <getopt.h> #include <stdlib.h> #if __GNU_LIBRARY__ < 5 diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c index bf4bda9..f4f1d09 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 <andersen@debian.org> -- + * removed getopt based parser and added a hand rolled one. */ #include "internal.h" @@ -72,7 +75,6 @@ #include <sys/stat.h> #include <sys/ioctl.h> #include <mntent.h> -#include <getopt.h> #include <linux/fs.h> #include <linux/minix_fs.h> @@ -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); + } @@ -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); } @@ -0,0 +1,73 @@ +/* vi: set sw=4 ts=4: */ +/* + * Which implementation for busybox + * + * Copyright (C) 2000 by Lineo, inc. + * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org> + * + * 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 <stdio.h> +#include <dirent.h> + + +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: +*/ |