More libc portability updates, add in the website (which has not been
authorerik <erik@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Fri, 19 May 2000 05:35:19 +0000 (05:35 +0000)
committererik <erik@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Fri, 19 May 2000 05:35:19 +0000 (05:35 +0000)
archived previously).  Wrote 'which' during the meeting today.
 -Erik

git-svn-id: svn://busybox.net/trunk/busybox@558 69ca8d6d-28ef-0310-b511-8ec308f3f277

38 files changed:
Changelog
Makefile
README
TODO
applets/busybox.c
archival/gunzip.c
archival/gzip.c
basename.c
busybox.c
busybox.def.h
coreutils/basename.c
coreutils/printf.c
coreutils/tr.c
dmesg.c
docs/busybox.net/BusyBox.html [new file with mode: 0644]
docs/busybox.net/images/background.png [new file with mode: 0644]
docs/busybox.net/images/busybox2.jpg [new file with mode: 0644]
docs/busybox.net/index.html [new file with mode: 0644]
findutils/which.c [new file with mode: 0644]
gunzip.c
gzip.c
hostname.c
init.c
init/init.c
internal.h
lash.c
messages.c
mkfs_minix.c
networking/hostname.c
printf.c
regexp.c
sh.c
shell/lash.c
tr.c
util-linux/dmesg.c
util-linux/mkfs_minix.c
utility.c
which.c [new file with mode: 0644]

index 87a0bd8..e9fbdd0 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -5,8 +5,14 @@
        * Added setkeycodes, for those that have wierd keyboard buttons.
        * Added cut and tr from minix, since due to the license change, 
            we can now use minix code.  Minix tr saves 4k. 
-        * Added the -v option (inverted search) to grep,
-            updated docs/busybox.pod accordingly.  -beppu
+        * Added 'grep -v' option (inverted search) and updated 
+           docs accordingly.  -beppu
+       * Wrote which
+       * BusyBox sh (lash) now supports being used as a standalone shell.  When
+           BB_FEATURE_STANDALONE_SHELL is defined, all the busybox commands may
+           be invoked as shell internals.  Best used when compiling staticly 
+           (i.e. DOSTATIC=true)
+       * BusyBox sh (lash) internals now behave as expected wrt pipes and redirects. 
        * Fixed ping warnings -- fix from Sascha Ziemann <szi@aibon.ping.de>
        * Fixed update segfault
        * Fixed mknod -- minor number was always 0
            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
 
 
 
index d3d71ad..1801cd5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@ export VERSION
 # Set the following to `true' to make a debuggable build.
 # Leave this set to `false' for production use.
 # eg: `make DODEBUG=true tests'
-DODEBUG = false
+DODEBUG = true
 
 # If you want a static binary, turn this on.
 DOSTATIC = false
diff --git a/README b/README
index 118e145..7f425eb 100644 (file)
--- a/README
+++ b/README
@@ -1,23 +1,33 @@
 Please see the LICENSE file for copyright information.
+    
+BusyBox combines tiny versions of many common UNIX utilities into a single
+small executable. It provides minimalist replacements for most of the utilities
+you usually find in fileutils, shellutils, findutils, textutils, grep, gzip,
+tar, etc. BusyBox provides a fairly complete POSIX environment for any small or
+emdedded system. The utilities in BusyBox generally have fewer options then
+their full featured GNU cousins; however, the options that are included provide
+the expected functionality and behave very much like their GNU counterparts.
 
-BusyBox is a suite of "tiny" Unix utilities in a multi-call binary. It
-provides a pretty complete POSIX environment in a very small package.
-Just add a kernel, "ash" (Keith Almquists tiny Bourne shell clone), and
-an editor such as "elvis-tiny" or "ae", and you have a working system.
-Busybox was begun to support the Debian Rescue/Install disks, but it
-also makes an excellent environment for any small or embedded system.
+BusyBox has been written with size-optimization and limited resources in mind.
+It is also extremely modular so you can easily include or exclude commands (or
+features) at compile time. This makes it easy to customize your embedded
+systems. To create a working system, just add a kernel, a shell (such as ash),
+and an editor (such as elvis-tiny or ae).
 
-As of version 0.20 there is a version number. : ) Also as of version 0.20, BB
-is now modularized to easily allow you to build only the BB parts you need,
-thereby reducing binary size. To turn off unwanted Busybox components, simply
-edit the file busybox.def.h and comment out the parts you do not need using C++
-style (//) comments.
+Busybox was originally written to support the Debian Rescue/Install disks, but
+it also makes an excellent environment for any small or embedded system.
 
-After the build is complete a busybox.links file is generated which is
-then used by 'make install' to create symlinks to the busybox binary
-for all compiled in functions.  By default, 'make install' will place
-the symlink forest into `pwd`/_install unless you have defined the 
-PREFIX environment variable (i.e. make PREFIX="/tmp/foo" install)
+As of version 0.20 there is a version number. : ) Also as of version 0.20,
+BusyBox is now modularized to easily allow you to build only the components you
+need, thereby reducing binary size. To turn off unwanted Busybox components,
+simply edit the file busybox.def.h and comment out the components you do not
+need using C++ style (//) comments.
+
+After the build is complete a busybox.links file is generated which is then
+used by 'make install' to create symlinks to the busybox binary for all
+compiled in functions.  By default, 'make install' will place the symlink
+forest into `pwd`/_install unless you have defined the PREFIX environment
+variable (i.e. make PREFIX="/tmp/foo" install)
 
 Please feed suggestions, bug reports, insults, and bribes back to:
        Erik Andersen 
diff --git a/TODO b/TODO
index 3ec400e..7ab43c3 100644 (file)
--- a/TODO
+++ b/TODO
@@ -7,9 +7,10 @@ around to it some time. If you have any good ideas, please let me know.
     needed or wanted in busybox (or else I'd have to link to libcrypt).
 
 * Networking apps are probably going to be split out some time soon into a
-    separate package (named perhaps tiny-netkit?).  This currently includes 
-    hostid, hostname, mnc, and ping.
-
+    separate package (named perhaps netkit-tiny?).  This would remove the
+    following items from BusyBox: hostid, hostname, nc, nslookup, telnet, 
+    and ping.  nfs mounting and syslogd (when it supports network logging)
+    will remain in BusyBox.
 
  -Erik
 
@@ -20,17 +21,6 @@ Bugs that need fixing:
  - 'grep foo$ file' doesn't work
  - 'grep *foo file' segfaults
  - ps dirent race bug (need to stat the file before attempting chdir)
- - # ls -la
-     /etc/passwd: No such file or directory
-     /etc/group: No such file or directory
-     drwxrwxr-x    3     1000     1000      54 May 14 22:30 .
-     /etc/passwd: No such file or directory
-     /etc/group: No such file or directory
-     drwxrwxr-x    3     1000     1000      54 May 14 22:30 ..
-     /etc/passwd: No such file or directory
-     /etc/group: No such file or directory
-     drwxrwxr-x    2     1000     1000      74 May 14 22:33 bin
-     /
 
 -----------
 
@@ -69,23 +59,6 @@ Most wanted list:
 Policy violation.  getgroups uses libc nss, which is unlikely
 to be present in an embedded system.
 
-To be replaced with a non-getopt parser.
-
-    [andersen@slag busybox]$ grep -l getopt *.[ch]
-    dmesg.c
-    gunzip.c
-    hostname.c
-    mkfs_minix.c
-    printf.c
-    sfdisk.c
-
-    This includes the symbols: 
-    getopt_long
-    optarg
-    opterr
-    optind
-
-
 To be replaced with a busybox local glob routine:
 
     [andersen@slag busybox]$ grep -l glob *.[ch]
index 07caa34..bf0591d 100644 (file)
@@ -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 +=
index 11fc3a8..78ee1d3 100644 (file)
@@ -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("");
index 17ebf6c..a971229 100644 (file)
@@ -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;
index 10ae761..78265a5 100644 (file)
 #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;
index 07caa34..bf0591d 100644 (file)
--- a/busybox.c
+++ b/busybox.c
@@ -35,9 +35,7 @@ const struct BB_applet applets[] = {
 #ifdef BB_BASENAME
        {"basename", basename_main, _BB_DIR_USR_BIN},
 #endif
-#ifdef BB_BUSYBOX
        {"busybox", busybox_main, _BB_DIR_BIN},
-#endif
 #ifdef BB_BLOCK_DEVICE
        {"block_device", block_device_main, _BB_DIR_SBIN},
 #endif
@@ -329,6 +327,9 @@ const struct BB_applet applets[] = {
 #ifdef BB_WC
        {"wc", wc_main, _BB_DIR_USR_BIN},
 #endif
+#ifdef BB_WHICH
+       {"which", which_main, _BB_DIR_USR_BIN},
+#endif
 #ifdef BB_WHOAMI
        {"whoami", whoami_main, _BB_DIR_USR_BIN},
 #endif
@@ -386,16 +387,14 @@ int busybox_main(int argc, char **argv)
        if (been_there_done_that == 1 || argc < 1) {
                const struct BB_applet *a = applets;
 
-               fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
-                               BB_VER, BB_BT);
-               fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
-               fprintf(stderr, "   or: [function] [arguments]...\n\n");
-               fprintf(stderr,
+               fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n"
+                               "Usage: busybox [function] [arguments]...\n"
+                               "   or: [function] [arguments]...\n\n"
                                "\tBusyBox is a multi-call binary that combines many common Unix\n"
                                "\tutilities into a single executable.  Most people will create a\n"
                                "\tlink to busybox for each function they wish to use, and BusyBox\n"
-                               "\twill act like whatever it was invoked as.\n");
-               fprintf(stderr, "\nCurrently defined functions:\n");
+                               "\twill act like whatever it was invoked as.\n" 
+                               "\nCurrently defined functions:\n", BB_VER, BB_BT);
 
                while (a->name != 0) {
                        col +=
index 8eb32bf..ea17a39 100644 (file)
@@ -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
 #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
 #define BB_NFSMOUNT
 #endif
 //
+#if defined BB_FEATURE_STANDALONE_SHELL
+#ifndef BB_FEATURE_USE_TERMIOS
+#define BB_FEATURE_USE_TERMIOS
+#endif
+#endif
index 10ae761..78265a5 100644 (file)
 #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;
index 28a011d..4e9a940 100644 (file)
@@ -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>
index ebb6479..3e7ba58 100644 (file)
 #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/dmesg.c b/dmesg.c
index 6fa17b5..c4f4fb4 100644 (file)
--- a/dmesg.c
+++ b/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/docs/busybox.net/BusyBox.html b/docs/busybox.net/BusyBox.html
new file mode 100644 (file)
index 0000000..5a65db1
--- /dev/null
@@ -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 &lt;function&gt; [arguments...]  # or
+</PRE>
+<P>
+<PRE> &lt;function&gt; [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[&lt;.|:&gt;[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 -&gt; /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 &quot;Hello world&quot; | cut -f 1 -d ' '
+        Hello
+        $ echo &quot;Hello world&quot; | 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 &quot;Erik is cool&quot;
+        Erik is cool
+        $  echo -e &quot;Erik\nis\ncool&quot;
+        Erik
+        is
+        cool
+        $ echo &quot;Erik\nis\ncool&quot;
+        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 &quot;1024x768-76&quot;
+                        # 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 &quot;mode not cleared&quot; 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>        &lt;id&gt;:&lt;runlevels&gt;:&lt;action&gt;:&lt;process&gt;
+</PRE>
+<P>
+<PRE>        &lt;id&gt;: 
+</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 &quot;/dev/&quot; 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>        &lt;runlevels&gt;: 
+</PRE>
+<P>
+<PRE>                The runlevels field is completely ignored.
+</PRE>
+<P>
+<PRE>        &lt;action&gt;: 
+</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 &quot;Please press Enter to activate this
+                console.&quot; 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>        &lt;process&gt;: 
+</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 &quot;askfirst&quot; shell on the console (whatever that may be)
+        ::askfirst:/bin/sh
+        # Start an &quot;askfirst&quot; 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 &gt; /dev/null 2&gt;&amp;1
+        ::ctrlaltdel:/sbin/swapoff -a &gt; /dev/null 2&gt;&amp;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 &quot;Hello&quot;
+        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 -&gt; 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 &lt; /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 &lt; /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 &lt; /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 &quot;hello&quot;
+</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 &gt; 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 &quot;Val=%d\n&quot; 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 &quot;foo&quot; | 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 &quot;e\nf\nb\nd\nc\na&quot; | 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 &quot;-&quot; 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 &quot;Hello&quot; | 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 &quot;gdkkn vnqkc&quot; | 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 &quot;a\na\nb\nc\nc\na&quot; | 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 &lt;<A
+HREF="mailto:andersee@debian.org">andersee@debian.org</A>&gt; &lt;<A
+HREF="mailto:andersen@lineo.com">andersen@lineo.com</A>&gt;
+
+<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 &lt;<A
+HREF="mailto:andersee@debian.org">andersee@debian.org</A>&gt;
+
+<br>
+
+<P>
+John Beppu &lt;<A HREF="mailto:beppu@lineo.com">beppu@lineo.com</A>&gt;
+
+<br>
+
+<P>
+Brian Candler &lt;<A
+HREF="mailto:B.Candler@pobox.com">B.Candler@pobox.com</A>&gt;
+
+<br>
+
+<P>
+Randolph Chung &lt;<A
+HREF="mailto:tausq@debian.org">tausq@debian.org</A>&gt;
+
+<br>
+
+<P>
+Dave Cinege &lt;<A
+HREF="mailto:dcinege@psychosis.com">dcinege@psychosis.com</A>&gt;      
+
+<br>
+
+<P>
+Karl M. Hegbloom &lt;<A
+HREF="mailto:karlheg@debian.org">karlheg@debian.org</A>&gt;
+
+<br>
+
+<P>
+John Lombardo &lt;<A
+HREF="mailto:john@deltanet.com">john@deltanet.com</A>&gt;      
+
+<br>
+
+<P>
+Bruce Perens &lt;<A HREF="mailto:bruce@perens.com">bruce@perens.com</A>&gt;
+
+<br>
+
+<P>
+Linus Torvalds &lt;<A
+HREF="mailto:torvalds@transmeta.com">torvalds@transmeta.com</A>&gt;
+
+<br>
+
+<P>
+Charles P. Wright &lt;<A
+HREF="mailto:cpwright@villagenet.com">cpwright@villagenet.com</A>&gt;
+
+<br>
+
+<P>
+Enrique Zanardi &lt;<A
+HREF="mailto:ezanardi@ull.es">ezanardi@ull.es</A>&gt;
+
+<br>
+
+</BODY>
+
+</HTML>
diff --git a/docs/busybox.net/images/background.png b/docs/busybox.net/images/background.png
new file mode 100644 (file)
index 0000000..11666ce
Binary files /dev/null and b/docs/busybox.net/images/background.png differ
diff --git a/docs/busybox.net/images/busybox2.jpg b/docs/busybox.net/images/busybox2.jpg
new file mode 100644 (file)
index 0000000..abf8f06
Binary files /dev/null and b/docs/busybox.net/images/busybox2.jpg differ
diff --git a/docs/busybox.net/index.html b/docs/busybox.net/index.html
new file mode 100644 (file)
index 0000000..ff865dc
--- /dev/null
@@ -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&nbsp;u&nbsp;s&nbsp;y&nbsp;B&nbsp;o&nbsp;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 &lt;syslog.h&gt
+
+       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 (file)
index 0000000..46c2204
--- /dev/null
@@ -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:
+*/
index 11fc3a8..78ee1d3 100644 (file)
--- a/gunzip.c
+++ b/gunzip.c
@@ -367,25 +367,23 @@ void send_bits (int value, int length);
 unsigned bi_reverse (unsigned value, int length);
 void bi_windup (void);
 void copy_block (char *buf, unsigned len, int header);
-extern int (*read_buf) (char *buf, unsigned size);
 
        /* in util.c: */
-extern int copy (int in, int out);
 extern ulg updcrc (uch * s, unsigned n);
 extern void clear_bufs (void);
-extern int fill_inbuf (int eof_ok);
+static int fill_inbuf (int eof_ok);
 extern void flush_outbuf (void);
-extern void flush_window (void);
+static void flush_window (void);
 extern void write_buf (int fd, void * buf, unsigned cnt);
 
 #ifndef __linux__
-extern char *basename (char *fname);
+static char *basename (char *fname);
 #endif                                                 /* not __linux__ */
-extern void read_error (void);
-extern void write_error (void);
+void read_error_msg (void);
+void write_error_msg (void);
 
        /* in inflate.c */
-extern int inflate (void);
+static int inflate (void);
 
 /* #include "lzw.h" */
 
@@ -450,133 +448,6 @@ extern int unlzw (int in, int out);
 #  undef LZW
 #endif
 
-/* #include "getopt.h" */
-
-/* Declarations for getopt.
-   Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, or (at your option) any
-   later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
-
-#ifndef _GETOPT_H
-#define _GETOPT_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/* For communication from `getopt' to the caller.
-   When `getopt' finds an option that takes an argument,
-   the argument value is returned here.
-   Also, when `ordering' is RETURN_IN_ORDER,
-   each non-option ARGV-element is returned here.  */
-               extern char *optarg;
-
-/* Index in ARGV of the next element to be scanned.
-   This is used for communication to and from the caller
-   and for communication between successive calls to `getopt'.
-
-   On entry to `getopt', zero means this is the first call; initialize.
-
-   When `getopt' returns EOF, this is the index of the first of the
-   non-option elements that the caller should itself scan.
-
-   Otherwise, `optind' communicates from one call to the next
-   how much of ARGV has been scanned so far.  */
-
-       extern int optind;
-
-/* Callers store zero here to inhibit the error message `getopt' prints
-   for unrecognized options.  */
-
-       extern int opterr;
-
-/* Set to an option character which was unrecognized.  */
-
-       extern int optopt;
-
-/* Describe the long-named options requested by the application.
-   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
-   of `struct option' terminated by an element containing a name which is
-   zero.
-
-   The field `has_arg' is:
-   no_argument         (or 0) if the option does not take an argument,
-   required_argument   (or 1) if the option requires an argument,
-   optional_argument   (or 2) if the option takes an optional argument.
-
-   If the field `flag' is not NULL, it points to a variable that is set
-   to the value given in the field `val' when the option is found, but
-   left unchanged if the option is not found.
-
-   To have a long-named option do something other than set an `int' to
-   a compiled-in constant, such as set a value from `optarg', set the
-   option's `flag' field to zero and its `val' field to a nonzero
-   value (the equivalent single-letter option character, if there is
-   one).  For long options that have a zero `flag' field, `getopt'
-   returns the contents of the `val' field.  */
-
-       struct option {
-#if    __STDC__
-               const char *name;
-#else
-               char *name;
-#endif
-               /* has_arg can't be an enum because some compilers complain about
-                  type mismatches in all the code that assumes it is an int.  */
-               int has_arg;
-               int *flag;
-               int val;
-       };
-
-/* Names for the values of the `has_arg' field of `struct option'.  */
-
-#define        no_argument             0
-#define required_argument      1
-#define optional_argument      2
-
-#if __STDC__ || defined(PROTO)
-#if defined(__GNU_LIBRARY__)
-/* Many other libraries have conflicting prototypes for getopt, with
-   differences in the consts, in stdlib.h.  To avoid compilation
-   errors, only prototype getopt for the GNU C library.  */
-       extern int getopt(int argc, char *const *argv, const char *shortopts);
-#endif                                                 /* not __GNU_LIBRARY__ */
-       extern int getopt_long(int argc, char *const *argv,
-                                                  const char *shortopts,
-                                                  const struct option *longopts, int *longind);
-       extern int getopt_long_only(int argc, char *const *argv,
-                                                               const char *shortopts,
-                                                               const struct option *longopts,
-                                                               int *longind);
-
-/* Internal only.  Users should not call this directly.  */
-       extern int _getopt_internal(int argc, char *const *argv,
-                                                               const char *shortopts,
-                                                               const struct option *longopts,
-                                                               int *longind, int long_only);
-#else                                                  /* not __STDC__ */
-       extern int getopt();
-       extern int getopt_long();
-       extern int getopt_long_only();
-
-       extern int _getopt_internal();
-#endif                                                 /* not __STDC__ */
-
-#ifdef __cplusplus
-}
-#endif
-#endif                                                 /* _GETOPT_H */
 #include <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/gzip.c b/gzip.c
index 17ebf6c..a971229 100644 (file)
--- a/gzip.c
+++ b/gzip.c
@@ -329,8 +329,8 @@ extern void flush_window (void);
 extern void write_buf (int fd, void * buf, unsigned cnt);
 extern char *strlwr (char *s);
 extern char *add_envopt (int *argcp, char ***argvp, char *env);
-extern void read_error (void);
-extern void write_error (void);
+extern void read_error_msg (void);
+extern void write_error_msg (void);
 extern void display_ratio (long num, long den, FILE * file);
 
        /* in inflate.c */
@@ -3138,7 +3138,7 @@ int in, out;                                      /* input and output file descriptors */
                insize = read(in, (char *) inbuf, INBUFSIZ);
        }
        if ((int) insize == EOF && errno != 0) {
-               read_error();
+               read_error_msg();
        }
        bytes_in = bytes_out;
        return OK;
index ef92102..0df9fed 100644 (file)
@@ -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);
                                }
diff --git a/init.c b/init.c
index 29d8f48..38e9131 100644 (file)
--- a/init.c
+++ b/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>
index 29d8f48..38e9131 100644 (file)
@@ -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>
index eb498be..9c55f5a 100644 (file)
@@ -195,6 +195,7 @@ extern int uniq_main(int argc, char** argv);
 extern int update_main(int argc, char** argv);
 extern int usleep_main(int argc, char** argv);
 extern int wc_main(int argc, char** argv);
+extern int which_main(int argc, char** argv);
 extern int whoami_main(int argc, char** argv);
 extern int yes_main(int argc, char** argv);
 
diff --git a/lash.c b/lash.c
index 9d4c27a..8ea5e30 100644 (file)
--- a/lash.c
+++ b/lash.c
@@ -113,13 +113,18 @@ static int busy_loop(FILE * input);
 static struct builtInCommand bltins[] = {
        {"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
        {"cd", "Change working directory", "cd [dir]", shell_cd},
-       {"env", "Print all environment variables", "env", shell_env},
        {"exit", "Exit from shell()", "exit", shell_exit},
        {"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
        {"jobs", "Lists the active jobs", "jobs", shell_jobs},
-       {"pwd", "Print current directory", "pwd", shell_pwd},
        {"export", "Set environment variable", "export [VAR=value]", shell_export},
        {"unset", "Unset environment variable", "unset VAR", shell_unset},
+       {NULL, NULL, NULL, NULL}
+};
+
+/* Table of built-in functions */
+static struct builtInCommand bltins_forking[] = {
+       {"env", "Print all environment variables", "env", shell_env},
+       {"pwd", "Print current directory", "pwd", shell_pwd},
        {".", "Source-in and run commands in a file", ". filename", shell_source},
        {"help", "List shell built-in commands", "help", shell_help},
        {NULL, NULL, NULL, NULL}
@@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk)
        for (x = bltins; x->cmd; x++) {
                fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
        }
+       for (x = bltins_forking; x->cmd; x++) {
+               fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
+       }
        fprintf(stdout, "\n\n");
        return TRUE;
 }
@@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
                        nextout = 1;
                }
 
+               /* Match any built-ins here */
+               for (x = bltins; x->cmd; x++) {
+                       if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
+                               return (x->function(&newJob, jobList));
+                       }
+               }
+
                if (!(newJob.progs[i].pid = fork())) {
                        signal(SIGTTOU, SIG_DFL);
 
@@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
                        setupRedirections(newJob.progs + i);
 
                        /* Match any built-ins here */
-                       for (x = bltins; x->cmd; x++) {
+                       for (x = bltins_forking; x->cmd; x++) {
                                if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
                                        exit (x->function(&newJob, jobList));
                                }
index 73d6427..2f8aab5 100644 (file)
  *  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 */
 
index bf4bda9..f4f1d09 100644 (file)
@@ -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);
+
 }
index ef92102..0df9fed 100644 (file)
@@ -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);
                                }
index 28a011d..4e9a940 100644 (file)
--- a/printf.c
+++ b/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>
index 048c03f..c271412 100644 (file)
--- a/regexp.c
+++ b/regexp.c
@@ -474,7 +474,7 @@ extern regexp *regcomp(char *text)
        int token;
        int peek;
        char *build;
-       regexp *re;                                     // Ignore compiler whining.  If we longjmp, we don't use re anymore.
+       regexp *re;
 
 
        /* prepare for error handling */
diff --git a/sh.c b/sh.c
index 9d4c27a..8ea5e30 100644 (file)
--- a/sh.c
+++ b/sh.c
@@ -113,13 +113,18 @@ static int busy_loop(FILE * input);
 static struct builtInCommand bltins[] = {
        {"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
        {"cd", "Change working directory", "cd [dir]", shell_cd},
-       {"env", "Print all environment variables", "env", shell_env},
        {"exit", "Exit from shell()", "exit", shell_exit},
        {"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
        {"jobs", "Lists the active jobs", "jobs", shell_jobs},
-       {"pwd", "Print current directory", "pwd", shell_pwd},
        {"export", "Set environment variable", "export [VAR=value]", shell_export},
        {"unset", "Unset environment variable", "unset VAR", shell_unset},
+       {NULL, NULL, NULL, NULL}
+};
+
+/* Table of built-in functions */
+static struct builtInCommand bltins_forking[] = {
+       {"env", "Print all environment variables", "env", shell_env},
+       {"pwd", "Print current directory", "pwd", shell_pwd},
        {".", "Source-in and run commands in a file", ". filename", shell_source},
        {"help", "List shell built-in commands", "help", shell_help},
        {NULL, NULL, NULL, NULL}
@@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk)
        for (x = bltins; x->cmd; x++) {
                fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
        }
+       for (x = bltins_forking; x->cmd; x++) {
+               fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
+       }
        fprintf(stdout, "\n\n");
        return TRUE;
 }
@@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
                        nextout = 1;
                }
 
+               /* Match any built-ins here */
+               for (x = bltins; x->cmd; x++) {
+                       if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
+                               return (x->function(&newJob, jobList));
+                       }
+               }
+
                if (!(newJob.progs[i].pid = fork())) {
                        signal(SIGTTOU, SIG_DFL);
 
@@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
                        setupRedirections(newJob.progs + i);
 
                        /* Match any built-ins here */
-                       for (x = bltins; x->cmd; x++) {
+                       for (x = bltins_forking; x->cmd; x++) {
                                if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
                                        exit (x->function(&newJob, jobList));
                                }
index 9d4c27a..8ea5e30 100644 (file)
@@ -113,13 +113,18 @@ static int busy_loop(FILE * input);
 static struct builtInCommand bltins[] = {
        {"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
        {"cd", "Change working directory", "cd [dir]", shell_cd},
-       {"env", "Print all environment variables", "env", shell_env},
        {"exit", "Exit from shell()", "exit", shell_exit},
        {"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
        {"jobs", "Lists the active jobs", "jobs", shell_jobs},
-       {"pwd", "Print current directory", "pwd", shell_pwd},
        {"export", "Set environment variable", "export [VAR=value]", shell_export},
        {"unset", "Unset environment variable", "unset VAR", shell_unset},
+       {NULL, NULL, NULL, NULL}
+};
+
+/* Table of built-in functions */
+static struct builtInCommand bltins_forking[] = {
+       {"env", "Print all environment variables", "env", shell_env},
+       {"pwd", "Print current directory", "pwd", shell_pwd},
        {".", "Source-in and run commands in a file", ". filename", shell_source},
        {"help", "List shell built-in commands", "help", shell_help},
        {NULL, NULL, NULL, NULL}
@@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk)
        for (x = bltins; x->cmd; x++) {
                fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
        }
+       for (x = bltins_forking; x->cmd; x++) {
+               fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
+       }
        fprintf(stdout, "\n\n");
        return TRUE;
 }
@@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
                        nextout = 1;
                }
 
+               /* Match any built-ins here */
+               for (x = bltins; x->cmd; x++) {
+                       if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
+                               return (x->function(&newJob, jobList));
+                       }
+               }
+
                if (!(newJob.progs[i].pid = fork())) {
                        signal(SIGTTOU, SIG_DFL);
 
@@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
                        setupRedirections(newJob.progs + i);
 
                        /* Match any built-ins here */
-                       for (x = bltins; x->cmd; x++) {
+                       for (x = bltins_forking; x->cmd; x++) {
                                if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
                                        exit (x->function(&newJob, jobList));
                                }
diff --git a/tr.c b/tr.c
index ebb6479..3e7ba58 100644 (file)
--- a/tr.c
+++ b/tr.c
 #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++;
index 6fa17b5..c4f4fb4 100644 (file)
@@ -18,7 +18,6 @@
 #include "internal.h"
 #include <linux/unistd.h>
 #include <stdio.h>
-#include <getopt.h>
 #include <stdlib.h>
 
 #if __GNU_LIBRARY__ < 5
index bf4bda9..f4f1d09 100644 (file)
@@ -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);
+
 }
index 234955e..07e540e 100644 (file)
--- a/utility.c
+++ b/utility.c
@@ -801,12 +801,13 @@ unsigned long my_getid(const char *filename, char *name, unsigned long id, unsig
 {
        FILE *file;
        char *rname, *start, *end, buf[128];
-       id_t rid;
+       unsigned long rid;
        unsigned long rgid = 0;
 
        file = fopen(filename, "r");
        if (file == NULL) {
-               perror(filename);
+               /* Do not complain.  It is ok for /etc/password and
+                * friends to be missing... */
                return (-1);
        }
 
diff --git a/which.c b/which.c
new file mode 100644 (file)
index 0000000..46c2204
--- /dev/null
+++ b/which.c
@@ -0,0 +1,73 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Which implementation for busybox
+ *
+ * Copyright (C) 2000 by Lineo, inc.
+ * Written by Erik Andersen <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:
+*/