More libc portability updates, add in the website (which has not been
archived previously). Wrote 'which' during the meeting today. -Erik
This commit is contained in:
parent
d356c6e9d1
commit
330fd2b576
18
Changelog
18
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
|
||||
@ -28,16 +34,12 @@
|
||||
to xiong jianxin <jxiong@uiuc.edu>
|
||||
* cp -fa now works as expected for symlinks (it didn't before)
|
||||
* zcat now works (wasn't working since option parsing was broken)
|
||||
* Renamed "mnc" to the more correct "nc".
|
||||
* Renamed "mnc" to the more correct "nc" (for netcat).
|
||||
* Makefile intelligence updates
|
||||
* BusyBox sh (lash) internals now behave wrt pipes and redirects.
|
||||
* BusyBox sh (lash) now supports being used as a standalone shell. When
|
||||
BB_FEATURE_STANDALONE_SHELL is defined, all the busybox commands may
|
||||
be invoked as shell internals.
|
||||
* More doc updates
|
||||
|
||||
|
||||
-Erik
|
||||
-Erik Andersen
|
||||
|
||||
|
||||
|
||||
|
2
Makefile
2
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
|
||||
|
42
README
42
README
@ -1,23 +1,33 @@
|
||||
Please see the LICENSE file for copyright information.
|
||||
|
||||
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 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.
|
||||
|
||||
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 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).
|
||||
|
||||
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)
|
||||
Busybox was originally written to support the Debian Rescue/Install disks, but
|
||||
it also makes an excellent environment for any small or embedded system.
|
||||
|
||||
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
|
||||
|
35
TODO
35
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]
|
||||
|
@ -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 +=
|
||||
|
@ -367,25 +367,23 @@ void send_bits (int value, int length);
|
||||
unsigned bi_reverse (unsigned value, int length);
|
||||
void bi_windup (void);
|
||||
void copy_block (char *buf, unsigned len, int header);
|
||||
extern int (*read_buf) (char *buf, unsigned size);
|
||||
|
||||
/* in util.c: */
|
||||
extern int copy (int in, int out);
|
||||
extern ulg updcrc (uch * s, unsigned n);
|
||||
extern void clear_bufs (void);
|
||||
extern int fill_inbuf (int eof_ok);
|
||||
static int fill_inbuf (int eof_ok);
|
||||
extern void flush_outbuf (void);
|
||||
extern void flush_window (void);
|
||||
static void flush_window (void);
|
||||
extern void write_buf (int fd, void * buf, unsigned cnt);
|
||||
|
||||
#ifndef __linux__
|
||||
extern char *basename (char *fname);
|
||||
static char *basename (char *fname);
|
||||
#endif /* not __linux__ */
|
||||
extern void read_error (void);
|
||||
extern void write_error (void);
|
||||
void read_error_msg (void);
|
||||
void write_error_msg (void);
|
||||
|
||||
/* in inflate.c */
|
||||
extern int inflate (void);
|
||||
static int inflate (void);
|
||||
|
||||
/* #include "lzw.h" */
|
||||
|
||||
@ -450,133 +448,6 @@ extern int unlzw (int in, int out);
|
||||
# undef LZW
|
||||
#endif
|
||||
|
||||
/* #include "getopt.h" */
|
||||
|
||||
/* Declarations for getopt.
|
||||
Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
#define _GETOPT_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
extern char *optarg;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns EOF, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
extern int optind;
|
||||
|
||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||
for unrecognized options. */
|
||||
|
||||
extern int opterr;
|
||||
|
||||
/* Set to an option character which was unrecognized. */
|
||||
|
||||
extern int optopt;
|
||||
|
||||
/* Describe the long-named options requested by the application.
|
||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||
of `struct option' terminated by an element containing a name which is
|
||||
zero.
|
||||
|
||||
The field `has_arg' is:
|
||||
no_argument (or 0) if the option does not take an argument,
|
||||
required_argument (or 1) if the option requires an argument,
|
||||
optional_argument (or 2) if the option takes an optional argument.
|
||||
|
||||
If the field `flag' is not NULL, it points to a variable that is set
|
||||
to the value given in the field `val' when the option is found, but
|
||||
left unchanged if the option is not found.
|
||||
|
||||
To have a long-named option do something other than set an `int' to
|
||||
a compiled-in constant, such as set a value from `optarg', set the
|
||||
option's `flag' field to zero and its `val' field to a nonzero
|
||||
value (the equivalent single-letter option character, if there is
|
||||
one). For long options that have a zero `flag' field, `getopt'
|
||||
returns the contents of the `val' field. */
|
||||
|
||||
struct option {
|
||||
#if __STDC__
|
||||
const char *name;
|
||||
#else
|
||||
char *name;
|
||||
#endif
|
||||
/* has_arg can't be an enum because some compilers complain about
|
||||
type mismatches in all the code that assumes it is an int. */
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||
|
||||
#define no_argument 0
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
#if __STDC__ || defined(PROTO)
|
||||
#if defined(__GNU_LIBRARY__)
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
errors, only prototype getopt for the GNU C library. */
|
||||
extern int getopt(int argc, char *const *argv, const char *shortopts);
|
||||
#endif /* not __GNU_LIBRARY__ */
|
||||
extern int getopt_long(int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
extern int getopt_long_only(int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts,
|
||||
int *longind);
|
||||
|
||||
/* Internal only. Users should not call this directly. */
|
||||
extern int _getopt_internal(int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts,
|
||||
int *longind, int long_only);
|
||||
#else /* not __STDC__ */
|
||||
extern int getopt();
|
||||
extern int getopt_long();
|
||||
extern int getopt_long_only();
|
||||
|
||||
extern int _getopt_internal();
|
||||
#endif /* not __STDC__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* _GETOPT_H */
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
@ -1161,7 +1032,7 @@ unsigned n; /* number of bytes in s[] */
|
||||
/* ===========================================================================
|
||||
* Clear input and output buffers
|
||||
*/
|
||||
void clear_bufs()
|
||||
void clear_bufs(void)
|
||||
{
|
||||
outcnt = 0;
|
||||
insize = inptr = 0;
|
||||
@ -1189,7 +1060,7 @@ int eof_ok; /* set if EOF acceptable as a result */
|
||||
if (insize == 0) {
|
||||
if (eof_ok)
|
||||
return EOF;
|
||||
read_error();
|
||||
read_error_msg();
|
||||
}
|
||||
bytes_in += (ulg) insize;
|
||||
inptr = 1;
|
||||
@ -1240,7 +1111,7 @@ unsigned cnt;
|
||||
|
||||
while ((n = write(fd, buf, cnt)) != cnt) {
|
||||
if (n == (unsigned) (-1)) {
|
||||
write_error();
|
||||
write_error_msg();
|
||||
}
|
||||
cnt -= n;
|
||||
buf = (void *) ((char *) buf + n);
|
||||
@ -1306,7 +1177,7 @@ const char *reject;
|
||||
/* ========================================================================
|
||||
* Error handlers.
|
||||
*/
|
||||
void read_error()
|
||||
void read_error_msg()
|
||||
{
|
||||
fprintf(stderr, "\n");
|
||||
if (errno != 0) {
|
||||
@ -1317,7 +1188,7 @@ void read_error()
|
||||
abort_gzip();
|
||||
}
|
||||
|
||||
void write_error()
|
||||
void write_error_msg()
|
||||
{
|
||||
fprintf(stderr, "\n");
|
||||
perror("");
|
||||
|
@ -329,8 +329,8 @@ extern void flush_window (void);
|
||||
extern void write_buf (int fd, void * buf, unsigned cnt);
|
||||
extern char *strlwr (char *s);
|
||||
extern char *add_envopt (int *argcp, char ***argvp, char *env);
|
||||
extern void read_error (void);
|
||||
extern void write_error (void);
|
||||
extern void read_error_msg (void);
|
||||
extern void write_error_msg (void);
|
||||
extern void display_ratio (long num, long den, FILE * file);
|
||||
|
||||
/* in inflate.c */
|
||||
@ -3138,7 +3138,7 @@ int in, out; /* input and output file descriptors */
|
||||
insize = read(in, (char *) inbuf, INBUFSIZ);
|
||||
}
|
||||
if ((int) insize == EOF && errno != 0) {
|
||||
read_error();
|
||||
read_error_msg();
|
||||
}
|
||||
bytes_in = bytes_out;
|
||||
return OK;
|
||||
|
16
basename.c
16
basename.c
@ -24,19 +24,23 @@
|
||||
#include "internal.h"
|
||||
#include <stdio.h>
|
||||
|
||||
const char *basename_usage="basename FILE [SUFFIX]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nStrips directory path and suffixes from FILE.\n"
|
||||
"If specified, also removes any trailing SUFFIX.\n"
|
||||
#endif
|
||||
;
|
||||
|
||||
|
||||
extern int basename_main(int argc, char **argv)
|
||||
{
|
||||
int m, n;
|
||||
char *s, *s1;
|
||||
|
||||
if ((argc < 2) || (**(argv + 1) == '-')) {
|
||||
usage("basename FILE [SUFFIX]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nStrips directory path and suffixes from FILE.\n"
|
||||
"If specified, also removes any trailing SUFFIX.\n"
|
||||
#endif
|
||||
);
|
||||
usage(basename_usage);
|
||||
}
|
||||
|
||||
argv++;
|
||||
|
||||
s1=*argv+strlen(*argv)-1;
|
||||
|
17
busybox.c
17
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 +=
|
||||
|
@ -97,6 +97,7 @@
|
||||
#define BB_UPTIME
|
||||
#define BB_USLEEP
|
||||
#define BB_WC
|
||||
#define BB_WHICH
|
||||
#define BB_WHOAMI
|
||||
#define BB_UMOUNT
|
||||
#define BB_UNIQ
|
||||
@ -200,7 +201,7 @@
|
||||
#define BB_FEATURE_SORT_REVERSE
|
||||
//
|
||||
// Enable command line editing in the shell
|
||||
//#define BB_FEATURE_SH_COMMAND_EDITING
|
||||
#define BB_FEATURE_SH_COMMAND_EDITING
|
||||
//
|
||||
//Allow the shell to invoke all the compiled in BusyBox commands as if they
|
||||
//were shell builtins. Nice for staticly linking an emergency rescue shell
|
||||
@ -261,3 +262,8 @@
|
||||
#define BB_NFSMOUNT
|
||||
#endif
|
||||
//
|
||||
#if defined BB_FEATURE_STANDALONE_SHELL
|
||||
#ifndef BB_FEATURE_USE_TERMIOS
|
||||
#define BB_FEATURE_USE_TERMIOS
|
||||
#endif
|
||||
#endif
|
||||
|
@ -24,19 +24,23 @@
|
||||
#include "internal.h"
|
||||
#include <stdio.h>
|
||||
|
||||
const char *basename_usage="basename FILE [SUFFIX]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nStrips directory path and suffixes from FILE.\n"
|
||||
"If specified, also removes any trailing SUFFIX.\n"
|
||||
#endif
|
||||
;
|
||||
|
||||
|
||||
extern int basename_main(int argc, char **argv)
|
||||
{
|
||||
int m, n;
|
||||
char *s, *s1;
|
||||
|
||||
if ((argc < 2) || (**(argv + 1) == '-')) {
|
||||
usage("basename FILE [SUFFIX]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nStrips directory path and suffixes from FILE.\n"
|
||||
"If specified, also removes any trailing SUFFIX.\n"
|
||||
#endif
|
||||
);
|
||||
usage(basename_usage);
|
||||
}
|
||||
|
||||
argv++;
|
||||
|
||||
s1=*argv+strlen(*argv)-1;
|
||||
|
@ -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>
|
||||
|
@ -30,6 +30,20 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#define BB_DECLARE_EXTERN
|
||||
#define bb_need_write_error
|
||||
#include "messages.c"
|
||||
|
||||
const char *tr_usage="tr [-cds] STRING1 [STRING2]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nTranslate, squeeze, and/or delete characters from\n"
|
||||
"standard input, writing to standard output.\n\n"
|
||||
"Options:\n"
|
||||
"\t-c\ttake complement of STRING1\n"
|
||||
"\t-d\tdelete input characters coded STRING1\n"
|
||||
"\t-s\tsqueeze multiple output characters of STRING2 into one character\n"
|
||||
#endif
|
||||
;
|
||||
|
||||
|
||||
|
||||
@ -60,7 +74,7 @@ static void convert()
|
||||
if (in_index == read_chars) {
|
||||
if ((read_chars = read(0, (char *) input, BUFSIZ)) <= 0) {
|
||||
if (write(1, (char *) output, out_index) != out_index)
|
||||
write(2, "Bad write\n", 10);
|
||||
write(2, write_error, strlen(write_error));
|
||||
exit(0);
|
||||
}
|
||||
in_index = 0;
|
||||
@ -74,7 +88,7 @@ static void convert()
|
||||
output[out_index++] = last = coded;
|
||||
if (out_index == BUFSIZ) {
|
||||
if (write(1, (char *) output, out_index) != out_index) {
|
||||
write(2, "Bad write\n", 10);
|
||||
write(2, write_error, strlen(write_error));
|
||||
exit(1);
|
||||
}
|
||||
out_index = 0;
|
||||
@ -167,16 +181,7 @@ extern int tr_main(int argc, char **argv)
|
||||
sq_fl = TRUE;
|
||||
break;
|
||||
default:
|
||||
usage("tr [-cds] STRING1 [STRING2]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nTranslate, squeeze, and/or delete characters from\n"
|
||||
"standard input, writing to standard output.\n\n"
|
||||
"Options:\n"
|
||||
"\t-c\ttake complement of STRING1\n"
|
||||
"\t-d\tdelete input characters coded STRING1\n"
|
||||
"\t-s\tsqueeze multiple output characters of STRING2 into one character\n"
|
||||
#endif
|
||||
);
|
||||
usage(tr_usage);
|
||||
}
|
||||
}
|
||||
index++;
|
||||
|
1
dmesg.c
1
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
|
||||
|
2460
docs/busybox.net/BusyBox.html
Normal file
2460
docs/busybox.net/BusyBox.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
docs/busybox.net/images/background.png
Normal file
BIN
docs/busybox.net/images/background.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.6 KiB |
BIN
docs/busybox.net/images/busybox2.jpg
Normal file
BIN
docs/busybox.net/images/busybox2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.0 KiB |
434
docs/busybox.net/index.html
Normal file
434
docs/busybox.net/index.html
Normal file
@ -0,0 +1,434 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>BusyBox</TITLE>
|
||||
</HEAD>
|
||||
|
||||
<body text="#000000" alink="#660000" link="#660000" bgcolor="#ffffff" vlink="#660000" background="images/background.png" >
|
||||
|
||||
<basefont face="lucida, helvetica, arial" size="3">
|
||||
|
||||
|
||||
<CENTER>
|
||||
<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2>
|
||||
<TR>
|
||||
<td bgcolor="#000000">
|
||||
<FONT FACE="lucida, helvetica" COLOR="#ccccc0">
|
||||
<B>B u s y B o x</B>
|
||||
</FONT>
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
<a href="/"><IMG SRC="images/busybox2.jpg" alt="BusyBox" border="0" width="360" height="230"</a><BR>
|
||||
|
||||
|
||||
<!-- Begin Introduction section -->
|
||||
|
||||
|
||||
<TABLE WIDTH=95% CELLSPACING=1 CELLPADDING=4 BORDER=1>
|
||||
<TR><TD BGCOLOR="#ccccc0" ALIGN=center>
|
||||
<A NAME="intro"> <BIG><B>
|
||||
The Swiss Army Knife of Embedded Linux
|
||||
</font>
|
||||
</A></B></BIG>
|
||||
</TD></TR>
|
||||
<TR><TD BGCOLOR="#eeeee0">
|
||||
|
||||
BusyBox combines tiny versions of many common UNIX utilities into a single
|
||||
small executable. It provides minimalist replacements for most of the utilities
|
||||
you usually find in fileutils, shellutils, findutils, textutils, grep, gzip,
|
||||
tar, etc. BusyBox provides a fairly complete POSIX environment for any small
|
||||
or emdedded system. The utilities in BusyBox generally have fewer options then
|
||||
their full featured GNU cousins; however, the options that are included provide
|
||||
the expected functionality and behave very much like their GNU counterparts.
|
||||
<p>
|
||||
BusyBox has been written with size-optimization and limited resources in mind.
|
||||
It is also extremely modular so you can easily include or exclude commands (or
|
||||
features) at compile time. This makes it easy to customize your embedded
|
||||
systems. To create a working system, just add a kernel, a shell (such as ash),
|
||||
and an editor (such as elvis-tiny or ae).
|
||||
<p>
|
||||
|
||||
BusyBox is now maintained by
|
||||
<a href="http://www.xmission.com/~andersen/erik/erik.html">
|
||||
Erik Andersen</a>, and its ongoing development is being sponsored by
|
||||
<a href="http://www.lineo.com/">Lineo</a>.
|
||||
<p>
|
||||
BusyBox is licensed under the
|
||||
<a href="http://www.gnu.org/copyleft/gpl.html">GNU GENERAL PUBLIC LICENSE</a>
|
||||
|
||||
|
||||
<!-- Begin Download section -->
|
||||
|
||||
<TR><TD BGCOLOR="#ccccc0" ALIGN=center>
|
||||
<A NAME="download"><BIG><B>
|
||||
Download
|
||||
</A></B></BIG>
|
||||
</TD></TR>
|
||||
<TR><TD BGCOLOR="#eeeee0">
|
||||
<ul>
|
||||
<li> Source for the latest release can always be downloaded from
|
||||
<a href="ftp://ftp.lineo.com/pub/busybox">ftp://ftp.lineo.com/pub/busybox</a>.
|
||||
</ul>
|
||||
|
||||
|
||||
<!-- Begin Latest News section -->
|
||||
|
||||
<TR><TD BGCOLOR="#ccccc0" ALIGN=center>
|
||||
<A NAME="news">
|
||||
<BIG><B>
|
||||
Latest News</A>
|
||||
</B></BIG>
|
||||
</A>
|
||||
</TD></TR>
|
||||
<TR><TD BGCOLOR="#eeeee0">
|
||||
|
||||
<ul>
|
||||
|
||||
<p> <li> <b>19 April 2000 -- syslogd bugfix</b>
|
||||
<br>
|
||||
Turns out that there was still a bug in busybox syslogd.
|
||||
For example, with the following test app:
|
||||
<pre>
|
||||
#include <syslog.h>
|
||||
|
||||
int do_log(char* msg, int delay)
|
||||
{
|
||||
openlog("testlog", LOG_PID, LOG_DAEMON);
|
||||
while(1) {
|
||||
syslog(LOG_ERR, "%s: testing one, two, three\n", msg);
|
||||
sleep(delay);
|
||||
}
|
||||
closelog();
|
||||
return(0);
|
||||
};
|
||||
|
||||
int main(void)
|
||||
{
|
||||
if (fork()==0)
|
||||
do_log("A", 2);
|
||||
do_log("B", 3);
|
||||
}
|
||||
</pre>
|
||||
it should be logging stuff from both "A" and "B". As released in 0.43 only stuff
|
||||
from "A" would have been logged. This means that if init tries to log something
|
||||
while say ppp has the syslog open, init would block (which is bad, bad, bad).
|
||||
<p>
|
||||
Karl M. Hegbloom has created a
|
||||
<a href="ftp://ftp.lineo.com/pub/busybox/busybox-0.43-syslog_patch">fix for the problem</a>.
|
||||
Thanks Karl!
|
||||
|
||||
|
||||
<p> <li> <b>18 April 2000 -- BusyBox 0.43 released (finally!)</b>
|
||||
<br>
|
||||
I have finally gotten everything into a state where I feel pretty
|
||||
good about things. This is definitely the most stable, solid release
|
||||
so far. A lot of bugs have been fixed, and the following new apps
|
||||
have been added: sh, basename, dirname, killall, uptime,
|
||||
freeramdisk, tr, echo, test, and usleep. Tar has been completely
|
||||
rewritten from scratch. Bss size has also been greatly reduced.
|
||||
More details are available in the
|
||||
<a href="ftp://ftp.lineo.com/pub/busybox/Changelog">changelog</a>.
|
||||
Oh, and as a special bonus, I wrote some fairly comprehensive
|
||||
<em>documentation</em>, complete with examples and full usage information.
|
||||
|
||||
<p>
|
||||
Many thanks go out to the fine people that have helped by submitting patches
|
||||
and bug reports; particularly instrumental in helping for this release were
|
||||
Karl Hegbloom, Pavel Roskin, Friedrich Vedder, Emanuele Caratti,
|
||||
Bob Tinsley, Nicolas Pitre, Avery Pennarun, Arne Bernin, John Beppu, and Jim Gleason.
|
||||
There were others so if I somehow forgot to mention you, I'm very sorry.
|
||||
<p>
|
||||
|
||||
You can grab BusyBox 0.43 tarballs <a href="ftp://ftp.lineo.com/pub/busybox/">here</a>.
|
||||
|
||||
<p> <li> <b>9 April 2000 -- BusyBox 0.43 pre release</b>
|
||||
<br>
|
||||
Unfortunately, I have not yet finished all the things I want to
|
||||
do for BusyBox 0.43, so I am posting this pre-release for people
|
||||
to poke at. This contains my complete rewrite of tar, which now weighs in at
|
||||
5k (7k with all options turned on) and works for reading and writing
|
||||
tarballs (which it does correctly for everything I have been able to throw
|
||||
at it). Tar also (optionally) supports the "--exclude" option (mainly because
|
||||
the Linux Router Project folks asked for it). This also has a pre-release
|
||||
of the micro shell I have been writing. This pre-release should be stable
|
||||
enough for production use -- it just isn't a release since I have some structural
|
||||
changes I still want to make.
|
||||
<p>
|
||||
The pre-release can be found <a href="ftp://ftp.lineo.com/pub/busybox/">here</a>.
|
||||
Please let me know ASAP if you find <em>any</em> bugs.
|
||||
|
||||
<p> <li> <b>28 March 2000 -- Andersen Baby Boy release</b>
|
||||
<br>
|
||||
I am pleased to announce that on Tuesday March 28th at 5:48pm, weighing in at 7
|
||||
lbs. 12 oz, Micah Erik Andersen was born at LDS Hospital here in Salt Lake City.
|
||||
He was born in the emergency room less then 5 minutes after we arrived -- and
|
||||
it was such a relief that we even made it to the hospital at all. Despite the
|
||||
fact that I was driving at an amazingly unlawful speed and honking at everybody
|
||||
and thinking decidely unkind thoughts about the people in our way, my wife
|
||||
(inconsiderate of my feelings and complete lack of medical training) was lying
|
||||
down in the back seat saying things like "I think I need to start pushing now"
|
||||
(which she then proceeded to do despite my best encouraging statements to the
|
||||
contrary).
|
||||
<p>
|
||||
Anyway, I'm glad to note that despite the much-faster-than-we-were-expecting
|
||||
labor, both Shaunalei and our new baby boy are doing wonderfuly.
|
||||
<p>
|
||||
So now that I am done with my excuse for the slow release cycle...
|
||||
Progress on the next release of BusyBox has been slow but steady. I expect
|
||||
to have a release sometime during the first week of April. This release will
|
||||
include a number of important changes, including the addition of a shell, a
|
||||
re-write of tar (to accomodate the Linux Router Project), and syslogd can now
|
||||
accept multiple concurrent connections, fixing lots of unexpected blocking
|
||||
problems.
|
||||
|
||||
|
||||
<p> <li> <b>11 February 2000 -- BusyBox 0.42 released</b>
|
||||
<br>
|
||||
|
||||
This is the most solid BusyBox release so far. Many, many
|
||||
bugs have been fixed. See the
|
||||
<a href="ftp://ftp.lineo.com/pub/busybox/Changelog">changelog</a> for details.
|
||||
|
||||
Of particular interest, init will now cleanly unmount
|
||||
filesystems on reboot, cp and mv have been rewritten and
|
||||
behave much better, and mount and umount no longer leak
|
||||
loop devices. Many thanks go out to Randolph Chung,
|
||||
Karl M. Hegbloom, Taketoshi Sano, and Pavel Roskin for
|
||||
their hard work on this release of BusyBox. Please pound
|
||||
on it and let me know if you find any bugs.
|
||||
|
||||
<p> <li> <b>19 January 2000 -- BusyBox 0.41 released</b>
|
||||
<br>
|
||||
|
||||
This release includes bugfixes to cp, mv, logger, true, false,
|
||||
mkdir, syslogd, and init. New apps include wc, hostid,
|
||||
logname, tty, whoami, and yes. New features include loop device
|
||||
support in mount and umount, and better TERM handling by init.
|
||||
The changelog can be found <a href="ftp://ftp.lineo.com/pub/busybox/Changelog">here</a>.
|
||||
|
||||
<p> <li> <b>7 January 2000 -- BusyBox 0.40 released</b>
|
||||
<br>
|
||||
|
||||
This release includes bugfixes to init (now includes inittab support),
|
||||
syslogd, head, logger, du, grep, cp, mv, sed, dmesg, ls, kill, gunzip, and mknod.
|
||||
New apps include sort, uniq, lsmod, rmmod, fbset, and loadacm.
|
||||
In particular, this release fixes an important bug in tar which
|
||||
in some cases produced serious security problems.
|
||||
As always, the changelog can be found <a href="ftp://ftp.lineo.com/pub/busybox/Changelog">here</a>.
|
||||
|
||||
<p> <li> <b>11 December 1999 -- BusyBox Website</b>
|
||||
<br>
|
||||
I have received permission from Bruce Perens (the original author of BusyBox)
|
||||
to set up this site as the new primary website for BusyBox. This website
|
||||
will always contain pointers to the latest and greatest, and will also
|
||||
contain the latest documentation on how to use BusyBox, what it can do,
|
||||
what arguments its apps support, etc.
|
||||
|
||||
<p> <li> <b>10 December 1999 -- BusyBox 0.39 released</b>
|
||||
<br>
|
||||
This release includes fixes to init, reboot, halt, kill, and ls, and contains
|
||||
the new apps ping, hostname, mkfifo, free, tail, du, tee, and head. A full
|
||||
changelog can be found <a href="ftp://ftp.lineo.com/pub/busybox/Changelog">here</a>.
|
||||
<p> <li> <b>5 December 1999 -- BusyBox 0.38 released</b>
|
||||
<br>
|
||||
This release includes fixes to tar, cat, ls, dd, rm, umount, find, df,
|
||||
and make install, and includes new apps syslogd/klogd and logger.
|
||||
</ul>
|
||||
|
||||
|
||||
<!-- Begin Docs section -->
|
||||
|
||||
<TR><TD BGCOLOR="#ccccc0" ALIGN=center>
|
||||
<A NAME="docs"><BIG><B>
|
||||
Documentation
|
||||
</A></B></BIG>
|
||||
</TD></TR>
|
||||
<TR><TD BGCOLOR="#eeeee0">
|
||||
Current documentation for BusyBox includes:
|
||||
<ul>
|
||||
<li> <a href="BusyBox.html">BusyBox.html</a>
|
||||
This is a list of the all the available commands in BusyBox with complete
|
||||
usage information and examples of how to use each app. I spent
|
||||
a <em>lot</em> of time updating these docs and trying to make them
|
||||
fairly comprehensive for the BusyBox 0.43 release. If you find any
|
||||
errors (factual, grammatical, whatever) please let me know.
|
||||
|
||||
<li> More documentation will follow.
|
||||
</ul>
|
||||
|
||||
|
||||
<!-- Begin Links section -->
|
||||
|
||||
<TR><TD BGCOLOR="#ccccc0" ALIGN=center>
|
||||
<A NAME="related">
|
||||
<BIG><B>
|
||||
Related Software</A>
|
||||
</B></BIG>
|
||||
</A>
|
||||
</TD></TR>
|
||||
<TR><TD BGCOLOR="#eeeee0">
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="http://www.debian.org/Packages/unstable/shells/ash.html">ash</a>
|
||||
is a very small Bourne shell. If you need a shell for your embedded systems, this is it.
|
||||
<p>
|
||||
|
||||
<li><a href="http://www.debian.org/Packages/unstable/base/ae.html">ae</a>
|
||||
is a tiny full-screen text editor with both modal (vi-like) and modeless
|
||||
(emacs-like) modes, determined by an ae.rc config file. It makes a nice editor
|
||||
if people that don't know "vi" will need to work on your embedded system.
|
||||
<p>
|
||||
|
||||
<li> <a href="http://www.debian.org/Packages/unstable/base/elvis-tiny.html">elvis-tiny</a>
|
||||
is based on a 1991 Minix version of the elvis "vi" clone. It behaves as one would
|
||||
expect a minamalist vi to behave, and is very small.
|
||||
<p>
|
||||
|
||||
<li> <a href="http://www.asty.org/nano/">nano</a>
|
||||
A small GPLed pico clone that makes a nice editor for people that don't know "vi".
|
||||
<p>
|
||||
|
||||
<li><a href="http://www.debian.org/Packages/unstable/net/iproute.html">iproute</a>
|
||||
Much more flexible replacement for ifconfig, route, etc. It is quite small, and for
|
||||
most networking applications, it is all you need. It also provides support for extremely
|
||||
advanced networking and provides Quality of Service(QoS) support, but most people will
|
||||
just need to use the "ip" command and will not even need to install the rest.
|
||||
<p>
|
||||
|
||||
<li><a href="http://www.debian.org/Packages/unstable/net/pump.html">Pump</a>
|
||||
This is the DHCP/BOOTP client written by RedHat. When compiled properly, it
|
||||
gives you dhcp client support for about 35k.
|
||||
<p>
|
||||
|
||||
<li><a href="http://www.pcug.org.au/~dbell/">sash</a>
|
||||
The Stand Alone SHell. This is a small shell (not Bourne shell compatable)
|
||||
that is similar to busybox in that it provides a number of common utilities as built-ins.
|
||||
<p>
|
||||
|
||||
<li><a href="http://sourceware.cygnus.com/newlib/">NewLib</a>
|
||||
This is a small C library intended for use on embedded systems. If you are finding
|
||||
GNU libc is a bit too big for your applications, try NewLib and it may help.
|
||||
<p>
|
||||
|
||||
<li><a href="http://linuxassembly.org/asmutils.html">asmutils</a>
|
||||
asmutils is similar to BusyBox in that it provides a number of common application
|
||||
for embedded systems that are very tiny. In fact, they are a _lot_ smaller than the
|
||||
equivalent apps in busybox -- but the price you pay for the size is reduced portability
|
||||
(x86 only) and interfaces that are tied directly to a perticular kernel (no libc involved).
|
||||
<p>
|
||||
|
||||
<li><a href="http://tinylogin.lineo.com/">TinyLogin</a>
|
||||
is a nice embedded tool for handling authentication, changing passwords,
|
||||
and similar tasks, and which nicely complements BusyBox.
|
||||
<p>
|
||||
|
||||
</ul>
|
||||
|
||||
<!-- Begin Projects section -->
|
||||
|
||||
<TR><TD BGCOLOR="#ccccc0" ALIGN=center>
|
||||
<A NAME="docs"><BIG><B>
|
||||
Projects using BusyBox
|
||||
</A></B></BIG>
|
||||
</TD></TR>
|
||||
<TR><TD BGCOLOR="#eeeee0">
|
||||
I know of the following projects that use BusyBox
|
||||
<ul>
|
||||
<li> <a href="http://www.lineo.com/products/embedix.html">Lineo Embedix Linux</a>
|
||||
<li> <a href="http://cvs.debian.org/boot-floppies/">Debian boot floppies project</a>
|
||||
<li> <a href="http://www.linuxrouter.org/">Linux Router Project </a>
|
||||
<li> <a href="http://linux-embedded.org/">LEM</a>
|
||||
<li> <a href="http://www.toms.net/rb/">tomsrtbt</a>
|
||||
|
||||
</ul>
|
||||
Do you use BusyBox? I'd love to know about it and I'd be happy to link to you.
|
||||
|
||||
|
||||
|
||||
<!-- Begin Links section -->
|
||||
|
||||
<TR><TD BGCOLOR="#ccccc0" ALIGN=center>
|
||||
<A NAME="links">
|
||||
<BIG><B>
|
||||
Important Links</A>
|
||||
</B></BIG>
|
||||
</A>
|
||||
</TD></TR>
|
||||
<TR><TD BGCOLOR="#eeeee0">
|
||||
|
||||
<ul>
|
||||
|
||||
<li> <A HREF="http://perens.com/FreeSoftware/">
|
||||
Free Software from Bruce Perens</A><br>
|
||||
The original idea for BusyBox, and all versions up to 0.26 were written
|
||||
by <A HREF="mailto:bruce@perens.com">Bruce Perens</a>. This is his BusyBox website.
|
||||
<p>
|
||||
|
||||
<li> <A HREF="http://freshmeat.net/appindex/1999/04/11/923859921.html">
|
||||
Freshmeat AppIndex record for BusyBox</A>
|
||||
<p>
|
||||
|
||||
<li> <A HREF="http://www.lineo.com/">Lineo</A> is sponsoring BusyBox development.
|
||||
<p>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- End of Table -->
|
||||
|
||||
</TD></TR>
|
||||
</TABLE>
|
||||
</P>
|
||||
|
||||
|
||||
|
||||
<!-- Footer -->
|
||||
<HR>
|
||||
<TABLE WIDTH="100%">
|
||||
<TR>
|
||||
<TD>
|
||||
<font size="-1" face="arial, helvetica, sans-serif">
|
||||
Mail all comments, insults, suggestions and bribes to
|
||||
<a href="mailto:andersen@lineo.com">Erik Andersen</a><BR>
|
||||
The Busybox logo is copyright 1999,2000, Erik Andersen.
|
||||
</font>
|
||||
</TD>
|
||||
|
||||
<TD>
|
||||
<a href="http://www.vim.org"><img border=0 width=88 height=32
|
||||
src="images/anim.written.in.vi.gif"
|
||||
alt="This site created with the vi editor"></a>
|
||||
</TD>
|
||||
|
||||
<TD>
|
||||
<a href="http://www.gimp.org/"><img border=0 width=88 height=38
|
||||
src="images/gfx_by_gimp.gif" alt="Graphics by GIMP"></a>
|
||||
</TD>
|
||||
|
||||
<TD>
|
||||
<a href="http://www.linuxtoday.com"><img width=90 height=36
|
||||
src="images/ltbutton2.jpg" alt="Linux Today"></a>
|
||||
</TD>
|
||||
|
||||
<TD>
|
||||
<p><a href="http://slashdot.org"><img width=90 height=36
|
||||
src="images/sdsmall.gif" alt="Slashdot"></a>
|
||||
</TD>
|
||||
|
||||
<TD>
|
||||
<a href="http://freshmeat.net"><img width=90 height=36
|
||||
src="images/fm.mini.jpg" alt="Freshmeat"></a>
|
||||
</TD>
|
||||
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
73
findutils/which.c
Normal file
73
findutils/which.c
Normal file
@ -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:
|
||||
*/
|
151
gunzip.c
151
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("");
|
||||
|
6
gzip.c
6
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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
2
init.c
2
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>
|
||||
|
@ -46,7 +46,7 @@
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/sysmacros.h>
|
||||
//#include <sys/sysmacros.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/vt.h> /* for vt_stat */
|
||||
#include <sys/wait.h>
|
||||
|
@ -195,6 +195,7 @@ extern int uniq_main(int argc, char** argv);
|
||||
extern int update_main(int argc, char** argv);
|
||||
extern int usleep_main(int argc, char** argv);
|
||||
extern int wc_main(int argc, char** argv);
|
||||
extern int which_main(int argc, char** argv);
|
||||
extern int whoami_main(int argc, char** argv);
|
||||
extern int yes_main(int argc, char** argv);
|
||||
|
||||
|
21
lash.c
21
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));
|
||||
}
|
||||
|
23
messages.c
23
messages.c
@ -27,26 +27,28 @@
|
||||
* may make the binary slightly smaller.
|
||||
*/
|
||||
|
||||
// TO use, do something like this
|
||||
// To use this header file, include something like this:
|
||||
//
|
||||
//#define BB_DECLARE_EXTERN
|
||||
//#define bb_need_memory_exhausted
|
||||
//#include "messages.c"
|
||||
//
|
||||
//Then just use the string memory_exhausted when it is needed.
|
||||
//
|
||||
|
||||
#include "internal.h"
|
||||
#ifndef _BB_MESSAGES_C
|
||||
#define _BB_MESSAGES_C
|
||||
|
||||
#define _BB_DEF_MESSAGE_PROTO(symbol) extern const char *symbol;
|
||||
#define _BB_DEF_MESSAGE_INITIALIZE(symbol, string_const) const char *symbol = string_const;
|
||||
|
||||
#ifdef BB_DECLARE_EXTERN
|
||||
# define BB_DEF_MESSAGE(symbol, string_const) _BB_DEF_MESSAGE_PROTO(symbol)
|
||||
# define BB_DEF_MESSAGE(symbol, string_const) extern const char *symbol;
|
||||
#else
|
||||
# define BB_DEF_MESSAGE(symbol, string_const) _BB_DEF_MESSAGE_INITIALIZE(symbol, string_const)
|
||||
# define BB_DEF_MESSAGE(symbol, string_const) const char *symbol = string_const;
|
||||
#endif
|
||||
|
||||
|
||||
#if defined bb_need_name_too_long || ! defined BB_DECLARE_EXTERN
|
||||
BB_DEF_MESSAGE(name_too_long, "%s: file name too long\n")
|
||||
BB_DEF_MESSAGE(name_too_long, "%s: file name too long\n")
|
||||
#endif
|
||||
#if defined bb_need_omitting_directory || ! defined BB_DECLARE_EXTERN
|
||||
BB_DEF_MESSAGE(omitting_directory, "%s: %s: omitting directory\n")
|
||||
@ -69,6 +71,13 @@ BB_DEF_MESSAGE(name_too_long, "%s: file name too long\n")
|
||||
#if defined bb_need_help || ! defined BB_DECLARE_EXTERN
|
||||
BB_DEF_MESSAGE(dash_dash_help, "--help")
|
||||
#endif
|
||||
#if defined bb_need_write_error || ! defined BB_DECLARE_EXTERN
|
||||
BB_DEF_MESSAGE(write_error, "Write Error\n")
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* _BB_MESSAGES_C */
|
||||
|
||||
|
74
mkfs_minix.c
74
mkfs_minix.c
@ -57,6 +57,9 @@
|
||||
*
|
||||
* The device may be a block device or a image of one, but this isn't
|
||||
* enforced (but it's not much fun on a character device :-).
|
||||
*
|
||||
* Modified for BusyBox by Erik Andersen <andersen@debian.org> --
|
||||
* removed getopt based parser and added a hand rolled one.
|
||||
*/
|
||||
|
||||
#include "internal.h"
|
||||
@ -72,7 +75,6 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <mntent.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/minix_fs.h>
|
||||
@ -174,6 +176,7 @@ static volatile void die(char *str)
|
||||
exit(8);
|
||||
}
|
||||
|
||||
static volatile void show_usage() __attribute__ ((noreturn));
|
||||
static volatile void show_usage()
|
||||
{
|
||||
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
|
||||
@ -648,6 +651,7 @@ extern int mkfs_minix_main(int argc, char **argv)
|
||||
char *tmp;
|
||||
struct stat statbuf;
|
||||
char *listfile = NULL;
|
||||
int stopIt=FALSE;
|
||||
|
||||
if (argc && *argv)
|
||||
program_name = *argv;
|
||||
@ -657,20 +661,45 @@ 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) {
|
||||
|
||||
/* 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':
|
||||
req_nr_inodes = (unsigned long) atol(optarg);
|
||||
if (--argc == 0) {
|
||||
goto goodbye;
|
||||
}
|
||||
req_nr_inodes = (unsigned long) atol(*(++argv));
|
||||
break;
|
||||
case 'l':
|
||||
listfile = optarg;
|
||||
if (--argc == 0) {
|
||||
goto goodbye;
|
||||
}
|
||||
listfile = *(++argv);
|
||||
break;
|
||||
case 'n':
|
||||
i = strtoul(optarg, &tmp, 0);
|
||||
{
|
||||
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)
|
||||
@ -681,7 +710,9 @@ extern int mkfs_minix_main(int argc, char **argv)
|
||||
show_usage();
|
||||
namelen = i;
|
||||
dirsize = i + 2;
|
||||
stopIt=TRUE;
|
||||
break;
|
||||
}
|
||||
case 'v':
|
||||
#ifdef HAVE_MINIX2
|
||||
version2 = 1;
|
||||
@ -691,23 +722,25 @@ extern int mkfs_minix_main(int argc, char **argv)
|
||||
exit(-1);
|
||||
#endif
|
||||
break;
|
||||
case '-':
|
||||
case 'h':
|
||||
default:
|
||||
goodbye:
|
||||
show_usage();
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
if (argc > 0 && !device_name) {
|
||||
device_name = argv[0];
|
||||
argc--;
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
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);
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
1
printf.c
1
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>
|
||||
|
2
regexp.c
2
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 */
|
||||
|
21
sh.c
21
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));
|
||||
}
|
||||
|
21
shell/lash.c
21
shell/lash.c
@ -113,13 +113,18 @@ static int busy_loop(FILE * input);
|
||||
static struct builtInCommand bltins[] = {
|
||||
{"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
|
||||
{"cd", "Change working directory", "cd [dir]", shell_cd},
|
||||
{"env", "Print all environment variables", "env", shell_env},
|
||||
{"exit", "Exit from shell()", "exit", shell_exit},
|
||||
{"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
|
||||
{"jobs", "Lists the active jobs", "jobs", shell_jobs},
|
||||
{"pwd", "Print current directory", "pwd", shell_pwd},
|
||||
{"export", "Set environment variable", "export [VAR=value]", shell_export},
|
||||
{"unset", "Unset environment variable", "unset VAR", shell_unset},
|
||||
{NULL, NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
/* Table of built-in functions */
|
||||
static struct builtInCommand bltins_forking[] = {
|
||||
{"env", "Print all environment variables", "env", shell_env},
|
||||
{"pwd", "Print current directory", "pwd", shell_pwd},
|
||||
{".", "Source-in and run commands in a file", ". filename", shell_source},
|
||||
{"help", "List shell built-in commands", "help", shell_help},
|
||||
{NULL, NULL, NULL, NULL}
|
||||
@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk)
|
||||
for (x = bltins; x->cmd; x++) {
|
||||
fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
|
||||
}
|
||||
for (x = bltins_forking; x->cmd; x++) {
|
||||
fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
|
||||
}
|
||||
fprintf(stdout, "\n\n");
|
||||
return TRUE;
|
||||
}
|
||||
@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
||||
nextout = 1;
|
||||
}
|
||||
|
||||
/* Match any built-ins here */
|
||||
for (x = bltins; x->cmd; x++) {
|
||||
if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
|
||||
return (x->function(&newJob, jobList));
|
||||
}
|
||||
}
|
||||
|
||||
if (!(newJob.progs[i].pid = fork())) {
|
||||
signal(SIGTTOU, SIG_DFL);
|
||||
|
||||
@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
||||
setupRedirections(newJob.progs + i);
|
||||
|
||||
/* Match any built-ins here */
|
||||
for (x = bltins; x->cmd; x++) {
|
||||
for (x = bltins_forking; x->cmd; x++) {
|
||||
if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
|
||||
exit (x->function(&newJob, jobList));
|
||||
}
|
||||
|
29
tr.c
29
tr.c
@ -30,6 +30,20 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#define BB_DECLARE_EXTERN
|
||||
#define bb_need_write_error
|
||||
#include "messages.c"
|
||||
|
||||
const char *tr_usage="tr [-cds] STRING1 [STRING2]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nTranslate, squeeze, and/or delete characters from\n"
|
||||
"standard input, writing to standard output.\n\n"
|
||||
"Options:\n"
|
||||
"\t-c\ttake complement of STRING1\n"
|
||||
"\t-d\tdelete input characters coded STRING1\n"
|
||||
"\t-s\tsqueeze multiple output characters of STRING2 into one character\n"
|
||||
#endif
|
||||
;
|
||||
|
||||
|
||||
|
||||
@ -60,7 +74,7 @@ static void convert()
|
||||
if (in_index == read_chars) {
|
||||
if ((read_chars = read(0, (char *) input, BUFSIZ)) <= 0) {
|
||||
if (write(1, (char *) output, out_index) != out_index)
|
||||
write(2, "Bad write\n", 10);
|
||||
write(2, write_error, strlen(write_error));
|
||||
exit(0);
|
||||
}
|
||||
in_index = 0;
|
||||
@ -74,7 +88,7 @@ static void convert()
|
||||
output[out_index++] = last = coded;
|
||||
if (out_index == BUFSIZ) {
|
||||
if (write(1, (char *) output, out_index) != out_index) {
|
||||
write(2, "Bad write\n", 10);
|
||||
write(2, write_error, strlen(write_error));
|
||||
exit(1);
|
||||
}
|
||||
out_index = 0;
|
||||
@ -167,16 +181,7 @@ extern int tr_main(int argc, char **argv)
|
||||
sq_fl = TRUE;
|
||||
break;
|
||||
default:
|
||||
usage("tr [-cds] STRING1 [STRING2]\n"
|
||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||
"\nTranslate, squeeze, and/or delete characters from\n"
|
||||
"standard input, writing to standard output.\n\n"
|
||||
"Options:\n"
|
||||
"\t-c\ttake complement of STRING1\n"
|
||||
"\t-d\tdelete input characters coded STRING1\n"
|
||||
"\t-s\tsqueeze multiple output characters of STRING2 into one character\n"
|
||||
#endif
|
||||
);
|
||||
usage(tr_usage);
|
||||
}
|
||||
}
|
||||
index++;
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include "internal.h"
|
||||
#include <linux/unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <getopt.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if __GNU_LIBRARY__ < 5
|
||||
|
@ -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,20 +661,45 @@ 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) {
|
||||
|
||||
/* 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':
|
||||
req_nr_inodes = (unsigned long) atol(optarg);
|
||||
if (--argc == 0) {
|
||||
goto goodbye;
|
||||
}
|
||||
req_nr_inodes = (unsigned long) atol(*(++argv));
|
||||
break;
|
||||
case 'l':
|
||||
listfile = optarg;
|
||||
if (--argc == 0) {
|
||||
goto goodbye;
|
||||
}
|
||||
listfile = *(++argv);
|
||||
break;
|
||||
case 'n':
|
||||
i = strtoul(optarg, &tmp, 0);
|
||||
{
|
||||
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)
|
||||
@ -681,7 +710,9 @@ extern int mkfs_minix_main(int argc, char **argv)
|
||||
show_usage();
|
||||
namelen = i;
|
||||
dirsize = i + 2;
|
||||
stopIt=TRUE;
|
||||
break;
|
||||
}
|
||||
case 'v':
|
||||
#ifdef HAVE_MINIX2
|
||||
version2 = 1;
|
||||
@ -691,23 +722,25 @@ extern int mkfs_minix_main(int argc, char **argv)
|
||||
exit(-1);
|
||||
#endif
|
||||
break;
|
||||
case '-':
|
||||
case 'h':
|
||||
default:
|
||||
goodbye:
|
||||
show_usage();
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
if (argc > 0 && !device_name) {
|
||||
device_name = argv[0];
|
||||
argc--;
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
argv++;
|
||||
}
|
||||
if (argc > 0) {
|
||||
BLOCKS = strtol(argv[0], &tmp, 0);
|
||||
if (*tmp) {
|
||||
printf("strtol error: number of blocks not specified");
|
||||
show_usage();
|
||||
}
|
||||
}
|
||||
|
||||
if (device_name && !BLOCKS)
|
||||
BLOCKS = get_size(device_name) / 1024;
|
||||
@ -760,5 +793,6 @@ extern int mkfs_minix_main(int argc, char **argv)
|
||||
}
|
||||
mark_good_blocks();
|
||||
write_tables();
|
||||
return 0;
|
||||
exit( 0);
|
||||
|
||||
}
|
||||
|
@ -801,12 +801,13 @@ unsigned long my_getid(const char *filename, char *name, unsigned long id, unsig
|
||||
{
|
||||
FILE *file;
|
||||
char *rname, *start, *end, buf[128];
|
||||
id_t rid;
|
||||
unsigned long rid;
|
||||
unsigned long rgid = 0;
|
||||
|
||||
file = fopen(filename, "r");
|
||||
if (file == NULL) {
|
||||
perror(filename);
|
||||
/* Do not complain. It is ok for /etc/password and
|
||||
* friends to be missing... */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
73
which.c
Normal file
73
which.c
Normal file
@ -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:
|
||||
*/
|
Loading…
Reference in New Issue
Block a user