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 setkeycodes, for those that have wierd keyboard buttons.
|
||||||
* Added cut and tr from minix, since due to the license change,
|
* Added cut and tr from minix, since due to the license change,
|
||||||
we can now use minix code. Minix tr saves 4k.
|
we can now use minix code. Minix tr saves 4k.
|
||||||
* Added the -v option (inverted search) to grep,
|
* Added 'grep -v' option (inverted search) and updated
|
||||||
updated docs/busybox.pod accordingly. -beppu
|
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 ping warnings -- fix from Sascha Ziemann <szi@aibon.ping.de>
|
||||||
* Fixed update segfault
|
* Fixed update segfault
|
||||||
* Fixed mknod -- minor number was always 0
|
* Fixed mknod -- minor number was always 0
|
||||||
@ -28,16 +34,12 @@
|
|||||||
to xiong jianxin <jxiong@uiuc.edu>
|
to xiong jianxin <jxiong@uiuc.edu>
|
||||||
* cp -fa now works as expected for symlinks (it didn't before)
|
* cp -fa now works as expected for symlinks (it didn't before)
|
||||||
* zcat now works (wasn't working since option parsing was broken)
|
* 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
|
* 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
|
* 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.
|
# Set the following to `true' to make a debuggable build.
|
||||||
# Leave this set to `false' for production use.
|
# Leave this set to `false' for production use.
|
||||||
# eg: `make DODEBUG=true tests'
|
# eg: `make DODEBUG=true tests'
|
||||||
DODEBUG = false
|
DODEBUG = true
|
||||||
|
|
||||||
# If you want a static binary, turn this on.
|
# If you want a static binary, turn this on.
|
||||||
DOSTATIC = false
|
DOSTATIC = false
|
||||||
|
42
README
42
README
@ -1,23 +1,33 @@
|
|||||||
Please see the LICENSE file for copyright information.
|
Please see the LICENSE file for copyright information.
|
||||||
|
|
||||||
BusyBox is a suite of "tiny" Unix utilities in a multi-call binary. It
|
BusyBox combines tiny versions of many common UNIX utilities into a single
|
||||||
provides a pretty complete POSIX environment in a very small package.
|
small executable. It provides minimalist replacements for most of the utilities
|
||||||
Just add a kernel, "ash" (Keith Almquists tiny Bourne shell clone), and
|
you usually find in fileutils, shellutils, findutils, textutils, grep, gzip,
|
||||||
an editor such as "elvis-tiny" or "ae", and you have a working system.
|
tar, etc. BusyBox provides a fairly complete POSIX environment for any small or
|
||||||
Busybox was begun to support the Debian Rescue/Install disks, but it
|
emdedded system. The utilities in BusyBox generally have fewer options then
|
||||||
also makes an excellent environment for any small or embedded system.
|
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
|
BusyBox has been written with size-optimization and limited resources in mind.
|
||||||
is now modularized to easily allow you to build only the BB parts you need,
|
It is also extremely modular so you can easily include or exclude commands (or
|
||||||
thereby reducing binary size. To turn off unwanted Busybox components, simply
|
features) at compile time. This makes it easy to customize your embedded
|
||||||
edit the file busybox.def.h and comment out the parts you do not need using C++
|
systems. To create a working system, just add a kernel, a shell (such as ash),
|
||||||
style (//) comments.
|
and an editor (such as elvis-tiny or ae).
|
||||||
|
|
||||||
After the build is complete a busybox.links file is generated which is
|
Busybox was originally written to support the Debian Rescue/Install disks, but
|
||||||
then used by 'make install' to create symlinks to the busybox binary
|
it also makes an excellent environment for any small or embedded system.
|
||||||
for all compiled in functions. By default, 'make install' will place
|
|
||||||
the symlink forest into `pwd`/_install unless you have defined the
|
As of version 0.20 there is a version number. : ) Also as of version 0.20,
|
||||||
PREFIX environment variable (i.e. make PREFIX="/tmp/foo" install)
|
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:
|
Please feed suggestions, bug reports, insults, and bribes back to:
|
||||||
Erik Andersen
|
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).
|
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
|
* Networking apps are probably going to be split out some time soon into a
|
||||||
separate package (named perhaps tiny-netkit?). This currently includes
|
separate package (named perhaps netkit-tiny?). This would remove the
|
||||||
hostid, hostname, mnc, and ping.
|
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
|
-Erik
|
||||||
|
|
||||||
@ -20,17 +21,6 @@ Bugs that need fixing:
|
|||||||
- 'grep foo$ file' doesn't work
|
- 'grep foo$ file' doesn't work
|
||||||
- 'grep *foo file' segfaults
|
- 'grep *foo file' segfaults
|
||||||
- ps dirent race bug (need to stat the file before attempting chdir)
|
- 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
|
Policy violation. getgroups uses libc nss, which is unlikely
|
||||||
to be present in an embedded system.
|
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:
|
To be replaced with a busybox local glob routine:
|
||||||
|
|
||||||
[andersen@slag busybox]$ grep -l glob *.[ch]
|
[andersen@slag busybox]$ grep -l glob *.[ch]
|
||||||
|
@ -35,9 +35,7 @@ const struct BB_applet applets[] = {
|
|||||||
#ifdef BB_BASENAME
|
#ifdef BB_BASENAME
|
||||||
{"basename", basename_main, _BB_DIR_USR_BIN},
|
{"basename", basename_main, _BB_DIR_USR_BIN},
|
||||||
#endif
|
#endif
|
||||||
#ifdef BB_BUSYBOX
|
|
||||||
{"busybox", busybox_main, _BB_DIR_BIN},
|
{"busybox", busybox_main, _BB_DIR_BIN},
|
||||||
#endif
|
|
||||||
#ifdef BB_BLOCK_DEVICE
|
#ifdef BB_BLOCK_DEVICE
|
||||||
{"block_device", block_device_main, _BB_DIR_SBIN},
|
{"block_device", block_device_main, _BB_DIR_SBIN},
|
||||||
#endif
|
#endif
|
||||||
@ -329,6 +327,9 @@ const struct BB_applet applets[] = {
|
|||||||
#ifdef BB_WC
|
#ifdef BB_WC
|
||||||
{"wc", wc_main, _BB_DIR_USR_BIN},
|
{"wc", wc_main, _BB_DIR_USR_BIN},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef BB_WHICH
|
||||||
|
{"which", which_main, _BB_DIR_USR_BIN},
|
||||||
|
#endif
|
||||||
#ifdef BB_WHOAMI
|
#ifdef BB_WHOAMI
|
||||||
{"whoami", whoami_main, _BB_DIR_USR_BIN},
|
{"whoami", whoami_main, _BB_DIR_USR_BIN},
|
||||||
#endif
|
#endif
|
||||||
@ -386,16 +387,14 @@ int busybox_main(int argc, char **argv)
|
|||||||
if (been_there_done_that == 1 || argc < 1) {
|
if (been_there_done_that == 1 || argc < 1) {
|
||||||
const struct BB_applet *a = applets;
|
const struct BB_applet *a = applets;
|
||||||
|
|
||||||
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
|
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n"
|
||||||
BB_VER, BB_BT);
|
"Usage: busybox [function] [arguments]...\n"
|
||||||
fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
|
" or: [function] [arguments]...\n\n"
|
||||||
fprintf(stderr, " or: [function] [arguments]...\n\n");
|
|
||||||
fprintf(stderr,
|
|
||||||
"\tBusyBox is a multi-call binary that combines many common Unix\n"
|
"\tBusyBox is a multi-call binary that combines many common Unix\n"
|
||||||
"\tutilities into a single executable. Most people will create a\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"
|
"\tlink to busybox for each function they wish to use, and BusyBox\n"
|
||||||
"\twill act like whatever it was invoked as.\n");
|
"\twill act like whatever it was invoked as.\n"
|
||||||
fprintf(stderr, "\nCurrently defined functions:\n");
|
"\nCurrently defined functions:\n", BB_VER, BB_BT);
|
||||||
|
|
||||||
while (a->name != 0) {
|
while (a->name != 0) {
|
||||||
col +=
|
col +=
|
||||||
|
@ -367,25 +367,23 @@ void send_bits (int value, int length);
|
|||||||
unsigned bi_reverse (unsigned value, int length);
|
unsigned bi_reverse (unsigned value, int length);
|
||||||
void bi_windup (void);
|
void bi_windup (void);
|
||||||
void copy_block (char *buf, unsigned len, int header);
|
void copy_block (char *buf, unsigned len, int header);
|
||||||
extern int (*read_buf) (char *buf, unsigned size);
|
|
||||||
|
|
||||||
/* in util.c: */
|
/* in util.c: */
|
||||||
extern int copy (int in, int out);
|
|
||||||
extern ulg updcrc (uch * s, unsigned n);
|
extern ulg updcrc (uch * s, unsigned n);
|
||||||
extern void clear_bufs (void);
|
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_outbuf (void);
|
||||||
extern void flush_window (void);
|
static void flush_window (void);
|
||||||
extern void write_buf (int fd, void * buf, unsigned cnt);
|
extern void write_buf (int fd, void * buf, unsigned cnt);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
extern char *basename (char *fname);
|
static char *basename (char *fname);
|
||||||
#endif /* not __linux__ */
|
#endif /* not __linux__ */
|
||||||
extern void read_error (void);
|
void read_error_msg (void);
|
||||||
extern void write_error (void);
|
void write_error_msg (void);
|
||||||
|
|
||||||
/* in inflate.c */
|
/* in inflate.c */
|
||||||
extern int inflate (void);
|
static int inflate (void);
|
||||||
|
|
||||||
/* #include "lzw.h" */
|
/* #include "lzw.h" */
|
||||||
|
|
||||||
@ -450,133 +448,6 @@ extern int unlzw (int in, int out);
|
|||||||
# undef LZW
|
# undef LZW
|
||||||
#endif
|
#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 <time.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -1161,7 +1032,7 @@ unsigned n; /* number of bytes in s[] */
|
|||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Clear input and output buffers
|
* Clear input and output buffers
|
||||||
*/
|
*/
|
||||||
void clear_bufs()
|
void clear_bufs(void)
|
||||||
{
|
{
|
||||||
outcnt = 0;
|
outcnt = 0;
|
||||||
insize = inptr = 0;
|
insize = inptr = 0;
|
||||||
@ -1189,7 +1060,7 @@ int eof_ok; /* set if EOF acceptable as a result */
|
|||||||
if (insize == 0) {
|
if (insize == 0) {
|
||||||
if (eof_ok)
|
if (eof_ok)
|
||||||
return EOF;
|
return EOF;
|
||||||
read_error();
|
read_error_msg();
|
||||||
}
|
}
|
||||||
bytes_in += (ulg) insize;
|
bytes_in += (ulg) insize;
|
||||||
inptr = 1;
|
inptr = 1;
|
||||||
@ -1240,7 +1111,7 @@ unsigned cnt;
|
|||||||
|
|
||||||
while ((n = write(fd, buf, cnt)) != cnt) {
|
while ((n = write(fd, buf, cnt)) != cnt) {
|
||||||
if (n == (unsigned) (-1)) {
|
if (n == (unsigned) (-1)) {
|
||||||
write_error();
|
write_error_msg();
|
||||||
}
|
}
|
||||||
cnt -= n;
|
cnt -= n;
|
||||||
buf = (void *) ((char *) buf + n);
|
buf = (void *) ((char *) buf + n);
|
||||||
@ -1306,7 +1177,7 @@ const char *reject;
|
|||||||
/* ========================================================================
|
/* ========================================================================
|
||||||
* Error handlers.
|
* Error handlers.
|
||||||
*/
|
*/
|
||||||
void read_error()
|
void read_error_msg()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
if (errno != 0) {
|
if (errno != 0) {
|
||||||
@ -1317,7 +1188,7 @@ void read_error()
|
|||||||
abort_gzip();
|
abort_gzip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_error()
|
void write_error_msg()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
perror("");
|
perror("");
|
||||||
|
@ -329,8 +329,8 @@ extern void flush_window (void);
|
|||||||
extern void write_buf (int fd, void * buf, unsigned cnt);
|
extern void write_buf (int fd, void * buf, unsigned cnt);
|
||||||
extern char *strlwr (char *s);
|
extern char *strlwr (char *s);
|
||||||
extern char *add_envopt (int *argcp, char ***argvp, char *env);
|
extern char *add_envopt (int *argcp, char ***argvp, char *env);
|
||||||
extern void read_error (void);
|
extern void read_error_msg (void);
|
||||||
extern void write_error (void);
|
extern void write_error_msg (void);
|
||||||
extern void display_ratio (long num, long den, FILE * file);
|
extern void display_ratio (long num, long den, FILE * file);
|
||||||
|
|
||||||
/* in inflate.c */
|
/* in inflate.c */
|
||||||
@ -3138,7 +3138,7 @@ int in, out; /* input and output file descriptors */
|
|||||||
insize = read(in, (char *) inbuf, INBUFSIZ);
|
insize = read(in, (char *) inbuf, INBUFSIZ);
|
||||||
}
|
}
|
||||||
if ((int) insize == EOF && errno != 0) {
|
if ((int) insize == EOF && errno != 0) {
|
||||||
read_error();
|
read_error_msg();
|
||||||
}
|
}
|
||||||
bytes_in = bytes_out;
|
bytes_in = bytes_out;
|
||||||
return OK;
|
return OK;
|
||||||
|
16
basename.c
16
basename.c
@ -24,19 +24,23 @@
|
|||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include <stdio.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)
|
extern int basename_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int m, n;
|
int m, n;
|
||||||
char *s, *s1;
|
char *s, *s1;
|
||||||
|
|
||||||
if ((argc < 2) || (**(argv + 1) == '-')) {
|
if ((argc < 2) || (**(argv + 1) == '-')) {
|
||||||
usage("basename FILE [SUFFIX]\n"
|
usage(basename_usage);
|
||||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
|
||||||
"\nStrips directory path and suffixes from FILE.\n"
|
|
||||||
"If specified, also removes any trailing SUFFIX.\n"
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
argv++;
|
argv++;
|
||||||
|
|
||||||
s1=*argv+strlen(*argv)-1;
|
s1=*argv+strlen(*argv)-1;
|
||||||
|
17
busybox.c
17
busybox.c
@ -35,9 +35,7 @@ const struct BB_applet applets[] = {
|
|||||||
#ifdef BB_BASENAME
|
#ifdef BB_BASENAME
|
||||||
{"basename", basename_main, _BB_DIR_USR_BIN},
|
{"basename", basename_main, _BB_DIR_USR_BIN},
|
||||||
#endif
|
#endif
|
||||||
#ifdef BB_BUSYBOX
|
|
||||||
{"busybox", busybox_main, _BB_DIR_BIN},
|
{"busybox", busybox_main, _BB_DIR_BIN},
|
||||||
#endif
|
|
||||||
#ifdef BB_BLOCK_DEVICE
|
#ifdef BB_BLOCK_DEVICE
|
||||||
{"block_device", block_device_main, _BB_DIR_SBIN},
|
{"block_device", block_device_main, _BB_DIR_SBIN},
|
||||||
#endif
|
#endif
|
||||||
@ -329,6 +327,9 @@ const struct BB_applet applets[] = {
|
|||||||
#ifdef BB_WC
|
#ifdef BB_WC
|
||||||
{"wc", wc_main, _BB_DIR_USR_BIN},
|
{"wc", wc_main, _BB_DIR_USR_BIN},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef BB_WHICH
|
||||||
|
{"which", which_main, _BB_DIR_USR_BIN},
|
||||||
|
#endif
|
||||||
#ifdef BB_WHOAMI
|
#ifdef BB_WHOAMI
|
||||||
{"whoami", whoami_main, _BB_DIR_USR_BIN},
|
{"whoami", whoami_main, _BB_DIR_USR_BIN},
|
||||||
#endif
|
#endif
|
||||||
@ -386,16 +387,14 @@ int busybox_main(int argc, char **argv)
|
|||||||
if (been_there_done_that == 1 || argc < 1) {
|
if (been_there_done_that == 1 || argc < 1) {
|
||||||
const struct BB_applet *a = applets;
|
const struct BB_applet *a = applets;
|
||||||
|
|
||||||
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
|
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n"
|
||||||
BB_VER, BB_BT);
|
"Usage: busybox [function] [arguments]...\n"
|
||||||
fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
|
" or: [function] [arguments]...\n\n"
|
||||||
fprintf(stderr, " or: [function] [arguments]...\n\n");
|
|
||||||
fprintf(stderr,
|
|
||||||
"\tBusyBox is a multi-call binary that combines many common Unix\n"
|
"\tBusyBox is a multi-call binary that combines many common Unix\n"
|
||||||
"\tutilities into a single executable. Most people will create a\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"
|
"\tlink to busybox for each function they wish to use, and BusyBox\n"
|
||||||
"\twill act like whatever it was invoked as.\n");
|
"\twill act like whatever it was invoked as.\n"
|
||||||
fprintf(stderr, "\nCurrently defined functions:\n");
|
"\nCurrently defined functions:\n", BB_VER, BB_BT);
|
||||||
|
|
||||||
while (a->name != 0) {
|
while (a->name != 0) {
|
||||||
col +=
|
col +=
|
||||||
|
@ -97,6 +97,7 @@
|
|||||||
#define BB_UPTIME
|
#define BB_UPTIME
|
||||||
#define BB_USLEEP
|
#define BB_USLEEP
|
||||||
#define BB_WC
|
#define BB_WC
|
||||||
|
#define BB_WHICH
|
||||||
#define BB_WHOAMI
|
#define BB_WHOAMI
|
||||||
#define BB_UMOUNT
|
#define BB_UMOUNT
|
||||||
#define BB_UNIQ
|
#define BB_UNIQ
|
||||||
@ -200,7 +201,7 @@
|
|||||||
#define BB_FEATURE_SORT_REVERSE
|
#define BB_FEATURE_SORT_REVERSE
|
||||||
//
|
//
|
||||||
// Enable command line editing in the shell
|
// 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
|
//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
|
//were shell builtins. Nice for staticly linking an emergency rescue shell
|
||||||
@ -261,3 +262,8 @@
|
|||||||
#define BB_NFSMOUNT
|
#define BB_NFSMOUNT
|
||||||
#endif
|
#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 "internal.h"
|
||||||
#include <stdio.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)
|
extern int basename_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int m, n;
|
int m, n;
|
||||||
char *s, *s1;
|
char *s, *s1;
|
||||||
|
|
||||||
if ((argc < 2) || (**(argv + 1) == '-')) {
|
if ((argc < 2) || (**(argv + 1) == '-')) {
|
||||||
usage("basename FILE [SUFFIX]\n"
|
usage(basename_usage);
|
||||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
|
||||||
"\nStrips directory path and suffixes from FILE.\n"
|
|
||||||
"If specified, also removes any trailing SUFFIX.\n"
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
argv++;
|
argv++;
|
||||||
|
|
||||||
s1=*argv+strlen(*argv)-1;
|
s1=*argv+strlen(*argv)-1;
|
||||||
|
@ -51,7 +51,6 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <getopt.h>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -30,6 +30,20 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.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 (in_index == read_chars) {
|
||||||
if ((read_chars = read(0, (char *) input, BUFSIZ)) <= 0) {
|
if ((read_chars = read(0, (char *) input, BUFSIZ)) <= 0) {
|
||||||
if (write(1, (char *) output, out_index) != out_index)
|
if (write(1, (char *) output, out_index) != out_index)
|
||||||
write(2, "Bad write\n", 10);
|
write(2, write_error, strlen(write_error));
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
in_index = 0;
|
in_index = 0;
|
||||||
@ -74,7 +88,7 @@ static void convert()
|
|||||||
output[out_index++] = last = coded;
|
output[out_index++] = last = coded;
|
||||||
if (out_index == BUFSIZ) {
|
if (out_index == BUFSIZ) {
|
||||||
if (write(1, (char *) output, out_index) != out_index) {
|
if (write(1, (char *) output, out_index) != out_index) {
|
||||||
write(2, "Bad write\n", 10);
|
write(2, write_error, strlen(write_error));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
out_index = 0;
|
out_index = 0;
|
||||||
@ -167,16 +181,7 @@ extern int tr_main(int argc, char **argv)
|
|||||||
sq_fl = TRUE;
|
sq_fl = TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage("tr [-cds] STRING1 [STRING2]\n"
|
usage(tr_usage);
|
||||||
#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
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
index++;
|
index++;
|
||||||
|
1
dmesg.c
1
dmesg.c
@ -18,7 +18,6 @@
|
|||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <getopt.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if __GNU_LIBRARY__ < 5
|
#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);
|
unsigned bi_reverse (unsigned value, int length);
|
||||||
void bi_windup (void);
|
void bi_windup (void);
|
||||||
void copy_block (char *buf, unsigned len, int header);
|
void copy_block (char *buf, unsigned len, int header);
|
||||||
extern int (*read_buf) (char *buf, unsigned size);
|
|
||||||
|
|
||||||
/* in util.c: */
|
/* in util.c: */
|
||||||
extern int copy (int in, int out);
|
|
||||||
extern ulg updcrc (uch * s, unsigned n);
|
extern ulg updcrc (uch * s, unsigned n);
|
||||||
extern void clear_bufs (void);
|
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_outbuf (void);
|
||||||
extern void flush_window (void);
|
static void flush_window (void);
|
||||||
extern void write_buf (int fd, void * buf, unsigned cnt);
|
extern void write_buf (int fd, void * buf, unsigned cnt);
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
extern char *basename (char *fname);
|
static char *basename (char *fname);
|
||||||
#endif /* not __linux__ */
|
#endif /* not __linux__ */
|
||||||
extern void read_error (void);
|
void read_error_msg (void);
|
||||||
extern void write_error (void);
|
void write_error_msg (void);
|
||||||
|
|
||||||
/* in inflate.c */
|
/* in inflate.c */
|
||||||
extern int inflate (void);
|
static int inflate (void);
|
||||||
|
|
||||||
/* #include "lzw.h" */
|
/* #include "lzw.h" */
|
||||||
|
|
||||||
@ -450,133 +448,6 @@ extern int unlzw (int in, int out);
|
|||||||
# undef LZW
|
# undef LZW
|
||||||
#endif
|
#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 <time.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -1161,7 +1032,7 @@ unsigned n; /* number of bytes in s[] */
|
|||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Clear input and output buffers
|
* Clear input and output buffers
|
||||||
*/
|
*/
|
||||||
void clear_bufs()
|
void clear_bufs(void)
|
||||||
{
|
{
|
||||||
outcnt = 0;
|
outcnt = 0;
|
||||||
insize = inptr = 0;
|
insize = inptr = 0;
|
||||||
@ -1189,7 +1060,7 @@ int eof_ok; /* set if EOF acceptable as a result */
|
|||||||
if (insize == 0) {
|
if (insize == 0) {
|
||||||
if (eof_ok)
|
if (eof_ok)
|
||||||
return EOF;
|
return EOF;
|
||||||
read_error();
|
read_error_msg();
|
||||||
}
|
}
|
||||||
bytes_in += (ulg) insize;
|
bytes_in += (ulg) insize;
|
||||||
inptr = 1;
|
inptr = 1;
|
||||||
@ -1240,7 +1111,7 @@ unsigned cnt;
|
|||||||
|
|
||||||
while ((n = write(fd, buf, cnt)) != cnt) {
|
while ((n = write(fd, buf, cnt)) != cnt) {
|
||||||
if (n == (unsigned) (-1)) {
|
if (n == (unsigned) (-1)) {
|
||||||
write_error();
|
write_error_msg();
|
||||||
}
|
}
|
||||||
cnt -= n;
|
cnt -= n;
|
||||||
buf = (void *) ((char *) buf + n);
|
buf = (void *) ((char *) buf + n);
|
||||||
@ -1306,7 +1177,7 @@ const char *reject;
|
|||||||
/* ========================================================================
|
/* ========================================================================
|
||||||
* Error handlers.
|
* Error handlers.
|
||||||
*/
|
*/
|
||||||
void read_error()
|
void read_error_msg()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
if (errno != 0) {
|
if (errno != 0) {
|
||||||
@ -1317,7 +1188,7 @@ void read_error()
|
|||||||
abort_gzip();
|
abort_gzip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_error()
|
void write_error_msg()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
perror("");
|
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 void write_buf (int fd, void * buf, unsigned cnt);
|
||||||
extern char *strlwr (char *s);
|
extern char *strlwr (char *s);
|
||||||
extern char *add_envopt (int *argcp, char ***argvp, char *env);
|
extern char *add_envopt (int *argcp, char ***argvp, char *env);
|
||||||
extern void read_error (void);
|
extern void read_error_msg (void);
|
||||||
extern void write_error (void);
|
extern void write_error_msg (void);
|
||||||
extern void display_ratio (long num, long den, FILE * file);
|
extern void display_ratio (long num, long den, FILE * file);
|
||||||
|
|
||||||
/* in inflate.c */
|
/* in inflate.c */
|
||||||
@ -3138,7 +3138,7 @@ int in, out; /* input and output file descriptors */
|
|||||||
insize = read(in, (char *) inbuf, INBUFSIZ);
|
insize = read(in, (char *) inbuf, INBUFSIZ);
|
||||||
}
|
}
|
||||||
if ((int) insize == EOF && errno != 0) {
|
if ((int) insize == EOF && errno != 0) {
|
||||||
read_error();
|
read_error_msg();
|
||||||
}
|
}
|
||||||
bytes_in = bytes_out;
|
bytes_in = bytes_out;
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* vi: set sw=4 ts=4: */
|
/* 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
|
* Mini hostname implementation for busybox
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
|
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
|
||||||
@ -104,7 +104,6 @@ int hostname_main(int argc, char **argv)
|
|||||||
opt_domain = 1;
|
opt_domain = 1;
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
filename = optarg;
|
|
||||||
if (--argc == 0) {
|
if (--argc == 0) {
|
||||||
usage(hostname_usage);
|
usage(hostname_usage);
|
||||||
}
|
}
|
||||||
|
2
init.c
2
init.c
@ -46,7 +46,7 @@
|
|||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#include <sys/sysmacros.h>
|
//#include <sys/sysmacros.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/vt.h> /* for vt_stat */
|
#include <sys/vt.h> /* for vt_stat */
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#include <sys/sysmacros.h>
|
//#include <sys/sysmacros.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/vt.h> /* for vt_stat */
|
#include <sys/vt.h> /* for vt_stat */
|
||||||
#include <sys/wait.h>
|
#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 update_main(int argc, char** argv);
|
||||||
extern int usleep_main(int argc, char** argv);
|
extern int usleep_main(int argc, char** argv);
|
||||||
extern int wc_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 whoami_main(int argc, char** argv);
|
||||||
extern int yes_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[] = {
|
static struct builtInCommand bltins[] = {
|
||||||
{"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
|
{"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
|
||||||
{"cd", "Change working directory", "cd [dir]", shell_cd},
|
{"cd", "Change working directory", "cd [dir]", shell_cd},
|
||||||
{"env", "Print all environment variables", "env", shell_env},
|
|
||||||
{"exit", "Exit from shell()", "exit", shell_exit},
|
{"exit", "Exit from shell()", "exit", shell_exit},
|
||||||
{"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
|
{"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
|
||||||
{"jobs", "Lists the active jobs", "jobs", shell_jobs},
|
{"jobs", "Lists the active jobs", "jobs", shell_jobs},
|
||||||
{"pwd", "Print current directory", "pwd", shell_pwd},
|
|
||||||
{"export", "Set environment variable", "export [VAR=value]", shell_export},
|
{"export", "Set environment variable", "export [VAR=value]", shell_export},
|
||||||
{"unset", "Unset environment variable", "unset VAR", shell_unset},
|
{"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},
|
{".", "Source-in and run commands in a file", ". filename", shell_source},
|
||||||
{"help", "List shell built-in commands", "help", shell_help},
|
{"help", "List shell built-in commands", "help", shell_help},
|
||||||
{NULL, NULL, NULL, NULL}
|
{NULL, NULL, NULL, NULL}
|
||||||
@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk)
|
|||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x->cmd; x++) {
|
||||||
fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
|
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");
|
fprintf(stdout, "\n\n");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
|||||||
nextout = 1;
|
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())) {
|
if (!(newJob.progs[i].pid = fork())) {
|
||||||
signal(SIGTTOU, SIG_DFL);
|
signal(SIGTTOU, SIG_DFL);
|
||||||
|
|
||||||
@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
|||||||
setupRedirections(newJob.progs + i);
|
setupRedirections(newJob.progs + i);
|
||||||
|
|
||||||
/* Match any built-ins here */
|
/* 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)) {
|
if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
|
||||||
exit (x->function(&newJob, jobList));
|
exit (x->function(&newJob, jobList));
|
||||||
}
|
}
|
||||||
|
23
messages.c
23
messages.c
@ -27,26 +27,28 @@
|
|||||||
* may make the binary slightly smaller.
|
* 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_DECLARE_EXTERN
|
||||||
//#define bb_need_memory_exhausted
|
//#define bb_need_memory_exhausted
|
||||||
//#include "messages.c"
|
//#include "messages.c"
|
||||||
//
|
//
|
||||||
|
//Then just use the string memory_exhausted when it is needed.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
#ifndef _BB_MESSAGES_C
|
#ifndef _BB_MESSAGES_C
|
||||||
#define _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
|
#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
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined bb_need_name_too_long || ! defined BB_DECLARE_EXTERN
|
#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
|
#endif
|
||||||
#if defined bb_need_omitting_directory || ! defined BB_DECLARE_EXTERN
|
#if defined bb_need_omitting_directory || ! defined BB_DECLARE_EXTERN
|
||||||
BB_DEF_MESSAGE(omitting_directory, "%s: %s: omitting directory\n")
|
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
|
#if defined bb_need_help || ! defined BB_DECLARE_EXTERN
|
||||||
BB_DEF_MESSAGE(dash_dash_help, "--help")
|
BB_DEF_MESSAGE(dash_dash_help, "--help")
|
||||||
#endif
|
#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 */
|
||||||
|
|
||||||
|
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
|
* 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 :-).
|
* 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"
|
#include "internal.h"
|
||||||
@ -72,7 +75,6 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <mntent.h>
|
#include <mntent.h>
|
||||||
#include <getopt.h>
|
|
||||||
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/minix_fs.h>
|
#include <linux/minix_fs.h>
|
||||||
@ -174,6 +176,7 @@ static volatile void die(char *str)
|
|||||||
exit(8);
|
exit(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static volatile void show_usage() __attribute__ ((noreturn));
|
||||||
static volatile void show_usage()
|
static volatile void show_usage()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
|
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;
|
char *tmp;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
char *listfile = NULL;
|
char *listfile = NULL;
|
||||||
|
int stopIt=FALSE;
|
||||||
|
|
||||||
if (argc && *argv)
|
if (argc && *argv)
|
||||||
program_name = *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)
|
if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE)
|
||||||
die("bad inode size");
|
die("bad inode size");
|
||||||
#endif
|
#endif
|
||||||
opterr = 0;
|
|
||||||
while ((i = getopt(argc, argv, "ci:l:n:v")) != EOF)
|
/* Parse options */
|
||||||
switch (i) {
|
//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':
|
case 'c':
|
||||||
check = 1;
|
check = 1;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
req_nr_inodes = (unsigned long) atol(optarg);
|
if (--argc == 0) {
|
||||||
|
goto goodbye;
|
||||||
|
}
|
||||||
|
req_nr_inodes = (unsigned long) atol(*(++argv));
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
listfile = optarg;
|
if (--argc == 0) {
|
||||||
|
goto goodbye;
|
||||||
|
}
|
||||||
|
listfile = *(++argv);
|
||||||
break;
|
break;
|
||||||
case 'n':
|
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)
|
if (*tmp)
|
||||||
show_usage();
|
show_usage();
|
||||||
if (i == 14)
|
if (i == 14)
|
||||||
@ -681,7 +710,9 @@ extern int mkfs_minix_main(int argc, char **argv)
|
|||||||
show_usage();
|
show_usage();
|
||||||
namelen = i;
|
namelen = i;
|
||||||
dirsize = i + 2;
|
dirsize = i + 2;
|
||||||
|
stopIt=TRUE;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'v':
|
case 'v':
|
||||||
#ifdef HAVE_MINIX2
|
#ifdef HAVE_MINIX2
|
||||||
version2 = 1;
|
version2 = 1;
|
||||||
@ -691,23 +722,25 @@ extern int mkfs_minix_main(int argc, char **argv)
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
case '-':
|
||||||
|
case 'h':
|
||||||
default:
|
default:
|
||||||
|
goodbye:
|
||||||
show_usage();
|
show_usage();
|
||||||
}
|
}
|
||||||
argc -= optind;
|
}
|
||||||
argv += optind;
|
} else {
|
||||||
if (argc > 0 && !device_name) {
|
//printf("else: argc='%d' argv='%s'\n", argc, *argv);
|
||||||
device_name = argv[0];
|
if (device_name == NULL)
|
||||||
argc--;
|
device_name = *argv;
|
||||||
|
else if (BLOCKS == 0)
|
||||||
|
BLOCKS = strtol(*argv, &tmp, 0);
|
||||||
|
else {
|
||||||
|
goto goodbye;
|
||||||
|
}
|
||||||
|
}
|
||||||
argv++;
|
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)
|
if (device_name && !BLOCKS)
|
||||||
BLOCKS = get_size(device_name) / 1024;
|
BLOCKS = get_size(device_name) / 1024;
|
||||||
@ -760,5 +793,6 @@ extern int mkfs_minix_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
mark_good_blocks();
|
mark_good_blocks();
|
||||||
write_tables();
|
write_tables();
|
||||||
return 0;
|
exit( 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* vi: set sw=4 ts=4: */
|
/* 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
|
* Mini hostname implementation for busybox
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
|
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
|
||||||
@ -104,7 +104,6 @@ int hostname_main(int argc, char **argv)
|
|||||||
opt_domain = 1;
|
opt_domain = 1;
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
filename = optarg;
|
|
||||||
if (--argc == 0) {
|
if (--argc == 0) {
|
||||||
usage(hostname_usage);
|
usage(hostname_usage);
|
||||||
}
|
}
|
||||||
|
1
printf.c
1
printf.c
@ -51,7 +51,6 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <getopt.h>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
2
regexp.c
2
regexp.c
@ -474,7 +474,7 @@ extern regexp *regcomp(char *text)
|
|||||||
int token;
|
int token;
|
||||||
int peek;
|
int peek;
|
||||||
char *build;
|
char *build;
|
||||||
regexp *re; // Ignore compiler whining. If we longjmp, we don't use re anymore.
|
regexp *re;
|
||||||
|
|
||||||
|
|
||||||
/* prepare for error handling */
|
/* prepare for error handling */
|
||||||
|
21
sh.c
21
sh.c
@ -113,13 +113,18 @@ static int busy_loop(FILE * input);
|
|||||||
static struct builtInCommand bltins[] = {
|
static struct builtInCommand bltins[] = {
|
||||||
{"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
|
{"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
|
||||||
{"cd", "Change working directory", "cd [dir]", shell_cd},
|
{"cd", "Change working directory", "cd [dir]", shell_cd},
|
||||||
{"env", "Print all environment variables", "env", shell_env},
|
|
||||||
{"exit", "Exit from shell()", "exit", shell_exit},
|
{"exit", "Exit from shell()", "exit", shell_exit},
|
||||||
{"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
|
{"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
|
||||||
{"jobs", "Lists the active jobs", "jobs", shell_jobs},
|
{"jobs", "Lists the active jobs", "jobs", shell_jobs},
|
||||||
{"pwd", "Print current directory", "pwd", shell_pwd},
|
|
||||||
{"export", "Set environment variable", "export [VAR=value]", shell_export},
|
{"export", "Set environment variable", "export [VAR=value]", shell_export},
|
||||||
{"unset", "Unset environment variable", "unset VAR", shell_unset},
|
{"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},
|
{".", "Source-in and run commands in a file", ". filename", shell_source},
|
||||||
{"help", "List shell built-in commands", "help", shell_help},
|
{"help", "List shell built-in commands", "help", shell_help},
|
||||||
{NULL, NULL, NULL, NULL}
|
{NULL, NULL, NULL, NULL}
|
||||||
@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk)
|
|||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x->cmd; x++) {
|
||||||
fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
|
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");
|
fprintf(stdout, "\n\n");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
|||||||
nextout = 1;
|
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())) {
|
if (!(newJob.progs[i].pid = fork())) {
|
||||||
signal(SIGTTOU, SIG_DFL);
|
signal(SIGTTOU, SIG_DFL);
|
||||||
|
|
||||||
@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
|||||||
setupRedirections(newJob.progs + i);
|
setupRedirections(newJob.progs + i);
|
||||||
|
|
||||||
/* Match any built-ins here */
|
/* 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)) {
|
if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
|
||||||
exit (x->function(&newJob, jobList));
|
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[] = {
|
static struct builtInCommand bltins[] = {
|
||||||
{"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
|
{"bg", "Resume a job in the background", "bg [%%job]", shell_fg_bg},
|
||||||
{"cd", "Change working directory", "cd [dir]", shell_cd},
|
{"cd", "Change working directory", "cd [dir]", shell_cd},
|
||||||
{"env", "Print all environment variables", "env", shell_env},
|
|
||||||
{"exit", "Exit from shell()", "exit", shell_exit},
|
{"exit", "Exit from shell()", "exit", shell_exit},
|
||||||
{"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
|
{"fg", "Bring job into the foreground", "fg [%%job]", shell_fg_bg},
|
||||||
{"jobs", "Lists the active jobs", "jobs", shell_jobs},
|
{"jobs", "Lists the active jobs", "jobs", shell_jobs},
|
||||||
{"pwd", "Print current directory", "pwd", shell_pwd},
|
|
||||||
{"export", "Set environment variable", "export [VAR=value]", shell_export},
|
{"export", "Set environment variable", "export [VAR=value]", shell_export},
|
||||||
{"unset", "Unset environment variable", "unset VAR", shell_unset},
|
{"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},
|
{".", "Source-in and run commands in a file", ". filename", shell_source},
|
||||||
{"help", "List shell built-in commands", "help", shell_help},
|
{"help", "List shell built-in commands", "help", shell_help},
|
||||||
{NULL, NULL, NULL, NULL}
|
{NULL, NULL, NULL, NULL}
|
||||||
@ -247,6 +252,9 @@ static int shell_help(struct job *cmd, struct jobSet *junk)
|
|||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x->cmd; x++) {
|
||||||
fprintf(stdout, "%s\t%s\n", x->cmd, x->descr);
|
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");
|
fprintf(stdout, "\n\n");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -743,6 +751,13 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
|||||||
nextout = 1;
|
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())) {
|
if (!(newJob.progs[i].pid = fork())) {
|
||||||
signal(SIGTTOU, SIG_DFL);
|
signal(SIGTTOU, SIG_DFL);
|
||||||
|
|
||||||
@ -760,7 +775,7 @@ static int runCommand(struct job newJob, struct jobSet *jobList, int inBg)
|
|||||||
setupRedirections(newJob.progs + i);
|
setupRedirections(newJob.progs + i);
|
||||||
|
|
||||||
/* Match any built-ins here */
|
/* 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)) {
|
if (!strcmp(newJob.progs[i].argv[0], x->cmd)) {
|
||||||
exit (x->function(&newJob, jobList));
|
exit (x->function(&newJob, jobList));
|
||||||
}
|
}
|
||||||
|
29
tr.c
29
tr.c
@ -30,6 +30,20 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.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 (in_index == read_chars) {
|
||||||
if ((read_chars = read(0, (char *) input, BUFSIZ)) <= 0) {
|
if ((read_chars = read(0, (char *) input, BUFSIZ)) <= 0) {
|
||||||
if (write(1, (char *) output, out_index) != out_index)
|
if (write(1, (char *) output, out_index) != out_index)
|
||||||
write(2, "Bad write\n", 10);
|
write(2, write_error, strlen(write_error));
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
in_index = 0;
|
in_index = 0;
|
||||||
@ -74,7 +88,7 @@ static void convert()
|
|||||||
output[out_index++] = last = coded;
|
output[out_index++] = last = coded;
|
||||||
if (out_index == BUFSIZ) {
|
if (out_index == BUFSIZ) {
|
||||||
if (write(1, (char *) output, out_index) != out_index) {
|
if (write(1, (char *) output, out_index) != out_index) {
|
||||||
write(2, "Bad write\n", 10);
|
write(2, write_error, strlen(write_error));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
out_index = 0;
|
out_index = 0;
|
||||||
@ -167,16 +181,7 @@ extern int tr_main(int argc, char **argv)
|
|||||||
sq_fl = TRUE;
|
sq_fl = TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage("tr [-cds] STRING1 [STRING2]\n"
|
usage(tr_usage);
|
||||||
#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
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
index++;
|
index++;
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <getopt.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if __GNU_LIBRARY__ < 5
|
#if __GNU_LIBRARY__ < 5
|
||||||
|
@ -57,6 +57,9 @@
|
|||||||
*
|
*
|
||||||
* The device may be a block device or a image of one, but this isn't
|
* 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 :-).
|
* 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"
|
#include "internal.h"
|
||||||
@ -72,7 +75,6 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <mntent.h>
|
#include <mntent.h>
|
||||||
#include <getopt.h>
|
|
||||||
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/minix_fs.h>
|
#include <linux/minix_fs.h>
|
||||||
@ -174,6 +176,7 @@ static volatile void die(char *str)
|
|||||||
exit(8);
|
exit(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static volatile void show_usage() __attribute__ ((noreturn));
|
||||||
static volatile void show_usage()
|
static volatile void show_usage()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
|
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;
|
char *tmp;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
char *listfile = NULL;
|
char *listfile = NULL;
|
||||||
|
int stopIt=FALSE;
|
||||||
|
|
||||||
if (argc && *argv)
|
if (argc && *argv)
|
||||||
program_name = *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)
|
if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE)
|
||||||
die("bad inode size");
|
die("bad inode size");
|
||||||
#endif
|
#endif
|
||||||
opterr = 0;
|
|
||||||
while ((i = getopt(argc, argv, "ci:l:n:v")) != EOF)
|
/* Parse options */
|
||||||
switch (i) {
|
//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':
|
case 'c':
|
||||||
check = 1;
|
check = 1;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
req_nr_inodes = (unsigned long) atol(optarg);
|
if (--argc == 0) {
|
||||||
|
goto goodbye;
|
||||||
|
}
|
||||||
|
req_nr_inodes = (unsigned long) atol(*(++argv));
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
listfile = optarg;
|
if (--argc == 0) {
|
||||||
|
goto goodbye;
|
||||||
|
}
|
||||||
|
listfile = *(++argv);
|
||||||
break;
|
break;
|
||||||
case 'n':
|
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)
|
if (*tmp)
|
||||||
show_usage();
|
show_usage();
|
||||||
if (i == 14)
|
if (i == 14)
|
||||||
@ -681,7 +710,9 @@ extern int mkfs_minix_main(int argc, char **argv)
|
|||||||
show_usage();
|
show_usage();
|
||||||
namelen = i;
|
namelen = i;
|
||||||
dirsize = i + 2;
|
dirsize = i + 2;
|
||||||
|
stopIt=TRUE;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'v':
|
case 'v':
|
||||||
#ifdef HAVE_MINIX2
|
#ifdef HAVE_MINIX2
|
||||||
version2 = 1;
|
version2 = 1;
|
||||||
@ -691,23 +722,25 @@ extern int mkfs_minix_main(int argc, char **argv)
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
case '-':
|
||||||
|
case 'h':
|
||||||
default:
|
default:
|
||||||
|
goodbye:
|
||||||
show_usage();
|
show_usage();
|
||||||
}
|
}
|
||||||
argc -= optind;
|
}
|
||||||
argv += optind;
|
} else {
|
||||||
if (argc > 0 && !device_name) {
|
//printf("else: argc='%d' argv='%s'\n", argc, *argv);
|
||||||
device_name = argv[0];
|
if (device_name == NULL)
|
||||||
argc--;
|
device_name = *argv;
|
||||||
|
else if (BLOCKS == 0)
|
||||||
|
BLOCKS = strtol(*argv, &tmp, 0);
|
||||||
|
else {
|
||||||
|
goto goodbye;
|
||||||
|
}
|
||||||
|
}
|
||||||
argv++;
|
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)
|
if (device_name && !BLOCKS)
|
||||||
BLOCKS = get_size(device_name) / 1024;
|
BLOCKS = get_size(device_name) / 1024;
|
||||||
@ -760,5 +793,6 @@ extern int mkfs_minix_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
mark_good_blocks();
|
mark_good_blocks();
|
||||||
write_tables();
|
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;
|
FILE *file;
|
||||||
char *rname, *start, *end, buf[128];
|
char *rname, *start, *end, buf[128];
|
||||||
id_t rid;
|
unsigned long rid;
|
||||||
unsigned long rgid = 0;
|
unsigned long rgid = 0;
|
||||||
|
|
||||||
file = fopen(filename, "r");
|
file = fopen(filename, "r");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
perror(filename);
|
/* Do not complain. It is ok for /etc/password and
|
||||||
|
* friends to be missing... */
|
||||||
return (-1);
|
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