Major rework of the directory structure and the entire build system.
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Wed, 24 Oct 2001 05:00:29 +0000 (05:00 +0000)
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Wed, 24 Oct 2001 05:00:29 +0000 (05:00 +0000)
 -Erik

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

362 files changed:
.cvsignore
AUTHORS
Changelog
Config.h [deleted file]
LICENSE
Makefile
README
addgroup.c [deleted file]
adduser.c [deleted file]
adjtimex.c [deleted file]
applets.c [deleted file]
applets.h [deleted file]
applets/busybox.c
applets/busybox.sh
applets/usage.h
ar.c [deleted file]
archival/Makefile [new file with mode: 0644]
archival/config.in [new file with mode: 0644]
archival/gzip.c
archival/tar.c
ash.c [deleted file]
basename.c [deleted file]
bunzip2.c [deleted file]
busybox.c [deleted file]
busybox.h [deleted file]
busybox.mkll [deleted file]
busybox.sh [deleted file]
busybox.spec [deleted file]
cat.c [deleted file]
chgrp.c [deleted file]
chmod.c [deleted file]
chown.c [deleted file]
chroot.c [deleted file]
chvt.c [deleted file]
clear.c [deleted file]
cmdedit.c [deleted file]
cmdedit.h [deleted file]
cmp.c [deleted file]
console-tools/Makefile [new file with mode: 0644]
console-tools/clear.c
console-tools/config.in [new file with mode: 0644]
console-tools/reset.c
coreutils/basename.c
coreutils/cat.c
coreutils/chgrp.c
coreutils/chmod.c
coreutils/chown.c
coreutils/chroot.c
coreutils/cmp.c
coreutils/df.c
coreutils/dirname.c
coreutils/du.c
coreutils/head.c
coreutils/ln.c
coreutils/ls.c
coreutils/rmdir.c
coreutils/sort.c
coreutils/tail.c
coreutils/tee.c
coreutils/touch.c
coreutils/tr.c
coreutils/uniq.c
coreutils/uuencode.c
cp.c [deleted file]
cpio.c [deleted file]
cut.c [deleted file]
date.c [deleted file]
dc.c [deleted file]
dd.c [deleted file]
deallocvt.c [deleted file]
debian/Config.h-deb
debian/Config.h-static
debian/Config.h-udeb
debian/rules
deluser.c [deleted file]
df.c [deleted file]
dirname.c [deleted file]
dmesg.c [deleted file]
docs/autodocifier.pl
docs/busybox.net/index.html
docs/busybox.net/oldnews.html
docs/new-applet-HOWTO.txt
docs/style-guide.txt
dos2unix.c [deleted file]
dpkg.c [deleted file]
dpkg_deb.c [deleted file]
du.c [deleted file]
dumpkmap.c [deleted file]
dutmp.c [deleted file]
echo.c [deleted file]
editors/Makefile [new file with mode: 0644]
editors/config.in [new file with mode: 0644]
editors/sed.c
editors/vi.c
env.c [deleted file]
examples/inittab
examples/kernel-patches/devps.patch.9_25_2000
examples/mk2knr.pl
expr.c [deleted file]
fbset.c [deleted file]
fdflush.c [deleted file]
find.c [deleted file]
findutils/Makefile [new file with mode: 0644]
findutils/config.in [new file with mode: 0644]
findutils/find.c
findutils/grep.c
findutils/which.c
findutils/xargs.c
free.c [deleted file]
freeramdisk.c [deleted file]
fsck_minix.c [deleted file]
getopt.c [deleted file]
getty.c [deleted file]
grep.c [deleted file]
gunzip.c [deleted file]
gzip.c [deleted file]
halt.c [deleted file]
head.c [deleted file]
hostid.c [deleted file]
hostname.c [deleted file]
hush.c [deleted file]
id.c [deleted file]
ifconfig.c [deleted file]
include/applets.h
include/busybox.h
include/grp.h
include/libbb.h
include/pwd.h
include/usage.h
init.c [deleted file]
init/Makefile [new file with mode: 0644]
init/config.in [new file with mode: 0644]
init/halt.c
init/init.c
init/poweroff.c
init/reboot.c
insmod.c [deleted file]
install.sh [deleted file]
kill.c [deleted file]
klogd.c [deleted file]
lash.c [deleted file]
length.c [deleted file]
libbb/Makefile
libbb/ask_confirmation.c
libbb/chomp.c
libbb/concat_path_file.c
libbb/copy_file.c
libbb/copy_file_chunk.c
libbb/copyfd.c
libbb/device_open.c
libbb/error_msg.c
libbb/error_msg_and_die.c
libbb/fgets_str.c
libbb/find_mount_point.c
libbb/find_pid_by_name.c
libbb/find_root_device.c
libbb/full_read.c
libbb/full_write.c
libbb/get_console.c
libbb/get_last_path_component.c
libbb/get_line_from_file.c
libbb/gz_open.c
libbb/herror_msg.c
libbb/herror_msg_and_die.c
libbb/inode_hash.c
libbb/interface.c
libbb/isdirectory.c
libbb/kernel_version.c
libbb/libbb.h [deleted file]
libbb/loop.c
libbb/messages.c
libbb/mode_string.c
libbb/module_syscalls.c
libbb/mtab.c
libbb/mtab_file.c
libbb/my_getgrgid.c
libbb/my_getgrnam.c
libbb/my_getpwnam.c
libbb/my_getpwnamegid.c
libbb/my_getpwuid.c
libbb/parse_mode.c
libbb/parse_number.c
libbb/perror_msg.c
libbb/perror_msg_and_die.c
libbb/print_file.c
libbb/read_package_field.c
libbb/recursive_action.c
libbb/remove_file.c
libbb/safe_read.c
libbb/safe_strncpy.c
libbb/syscalls.c
libbb/syslog_msg_with_name.c
libbb/time_string.c
libbb/trim.c
libbb/u_signal_names.c
libbb/vdprintf.c
libbb/verror_msg.c
libbb/vherror_msg.c
libbb/vperror_msg.c
libbb/wfopen.c
libbb/xfuncs.c
libbb/xgethostbyname.c
libbb/xregcomp.c
ln.c [deleted file]
loadacm.c [deleted file]
loadfont.c [deleted file]
loadkmap.c [deleted file]
logger.c [deleted file]
logname.c [deleted file]
logread.c [deleted file]
ls.c [deleted file]
lsmod.c [deleted file]
makedevs.c [deleted file]
md5sum.c [deleted file]
miscutils/Makefile [new file with mode: 0644]
miscutils/config.in [new file with mode: 0644]
miscutils/readlink.c
mk_loop_h.sh [deleted file]
mkdir.c [deleted file]
mkfifo.c [deleted file]
mkfs_minix.c [deleted file]
mknod.c [deleted file]
mkswap.c [deleted file]
mktemp.c [deleted file]
modprobe.c [deleted file]
modutils/Makefile [new file with mode: 0644]
modutils/config.in [new file with mode: 0644]
modutils/insmod.c
modutils/lsmod.c
modutils/rmmod.c
more.c [deleted file]
mount.c [deleted file]
msh.c [deleted file]
mt.c [deleted file]
mv.c [deleted file]
nc.c [deleted file]
networking/Makefile [new file with mode: 0644]
networking/config.in [new file with mode: 0644]
networking/hostname.c
networking/ifconfig.c
networking/nslookup.c
networking/ping.c
networking/telnet.c
networking/tftp.c
networking/traceroute.c
networking/wget.c
nfsmount.c [deleted file]
nfsmount.h [deleted file]
nslookup.c [deleted file]
pidof.c [deleted file]
ping.c [deleted file]
pivot_root.c [deleted file]
poweroff.c [deleted file]
printf.c [deleted file]
pristine_setup.sh [deleted file]
procps/Makefile [new file with mode: 0644]
procps/config.in [new file with mode: 0644]
procps/free.c
procps/kill.c
procps/pidof.c
procps/ps.c
procps/uptime.c
ps.c [deleted file]
pwd.c [deleted file]
rdate.c [deleted file]
readlink.c [deleted file]
reboot.c [deleted file]
renice.c [deleted file]
reset.c [deleted file]
rm.c [deleted file]
rmdir.c [deleted file]
rmmod.c [deleted file]
route.c [deleted file]
rpm2cpio.c [deleted file]
scripts/Configure [new file with mode: 0644]
scripts/Menuconfig [new file with mode: 0644]
scripts/depmod.pl [deleted file]
scripts/inittab [deleted file]
scripts/lxdialog/BIG.FAT.WARNING [new file with mode: 0644]
scripts/lxdialog/Makefile [new file with mode: 0644]
scripts/lxdialog/Makefile-2.5 [new file with mode: 0644]
scripts/lxdialog/checklist.c [new file with mode: 0644]
scripts/lxdialog/colors.h [new file with mode: 0644]
scripts/lxdialog/dialog.h [new file with mode: 0644]
scripts/lxdialog/inputbox.c [new file with mode: 0644]
scripts/lxdialog/lxdialog.c [new file with mode: 0644]
scripts/lxdialog/menubox.c [new file with mode: 0644]
scripts/lxdialog/msgbox.c [new file with mode: 0644]
scripts/lxdialog/textbox.c [new file with mode: 0644]
scripts/lxdialog/util.c [new file with mode: 0644]
scripts/lxdialog/yesno.c [new file with mode: 0644]
scripts/mk2knr.pl [deleted file]
scripts/mkdep.c [new file with mode: 0644]
scripts/split-include.c [new file with mode: 0644]
scripts/undeb [deleted file]
scripts/unrpm [deleted file]
sed.c [deleted file]
setkeycodes.c [deleted file]
shell/Makefile [new file with mode: 0644]
shell/ash.c
shell/cmdedit.c
shell/config.in [new file with mode: 0644]
shell/hush.c
shell/lash.c
shell/msh.c
sleep.c [deleted file]
sort.c [deleted file]
start_stop_daemon.c [deleted file]
stty.c [deleted file]
swaponoff.c [deleted file]
sync.c [deleted file]
sysdeps/linux/config.in [new file with mode: 0644]
sysdeps/linux/defconfig [new file with mode: 0644]
sysklogd/Makefile [new file with mode: 0644]
sysklogd/config.in [new file with mode: 0644]
sysklogd/klogd.c
sysklogd/logger.c
sysklogd/logread.c
sysklogd/syslogd.c
syslogd.c [deleted file]
tail.c [deleted file]
tar.c [deleted file]
tee.c [deleted file]
telnet.c [deleted file]
test.c [deleted file]
tests/multibuild.pl
tests/multifeat.pl
tests/testcases
tests/tester.sh
tftp.c [deleted file]
touch.c [deleted file]
tr.c [deleted file]
traceroute.c [deleted file]
true_false.c [deleted file]
tty.c [deleted file]
umount.c [deleted file]
uname.c [deleted file]
uniq.c [deleted file]
update.c [deleted file]
uptime.c [deleted file]
usage.c [deleted file]
usage.h [deleted file]
usleep.c [deleted file]
util-linux/Makefile [new file with mode: 0644]
util-linux/config.in [new file with mode: 0644]
util-linux/fbset.c
util-linux/fsck_minix.c
util-linux/mkfs_minix.c
util-linux/more.c
util-linux/mount.c
util-linux/swaponoff.c
util-linux/umount.c
uudecode.c [deleted file]
uuencode.c [deleted file]
vi.c [deleted file]
watchdog.c [deleted file]
wc.c [deleted file]
wget.c [deleted file]
which.c [deleted file]
whoami.c [deleted file]
xargs.c [deleted file]
yes.c [deleted file]

index 71269c5..618c9fd 100644 (file)
@@ -2,3 +2,4 @@ busybox
 busybox.links
 _install
 applet_source_list
+.config
diff --git a/AUTHORS b/AUTHORS
index 09b0b50..4df213a 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -8,7 +8,7 @@ incorect, _please_ let me know.
 
 -----------
 
-Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+Erik Andersen <andersen@codepoet.org>, <andersee@debian.org>
     Tons of new stuff, major rewrite of most of the
     core apps, tons of new apps as noted in header files.
 
index 9ed6d58..2a778d6 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -52,8 +52,8 @@
            -- Fixed msh to support underscores in variable names.
            -- Fixed a sed problem with unsatisfied backrefs (the problem was
                noted by Martin Bene).
-           -- Removed BB_SH define entirely.  Now one simply picks the shell
-               or shells they want as BB_<foo> in Config.h
+           -- Removed CONFIG_SH define entirely.  Now one simply picks the shell
+               or shells they want as CONFIG_<foo> in Config.h
            -- Fixed head to use ferror(3) to check for errors, not errno.
        * Shu-Hao Chang <shuhao_chang@trend.com.tw>
            -- Fixed sed handling of multiple -e commands
        * Jaspreet Singh <jsingh@somanetworks.com>
            -- Fixed both a segfault and cosmetic bug in route
        * Erik Andersen
-           -- Made the insmod options BB_FEATURE_NEW_MODULE_INTERFACE and 
-               BB_FEATURE_OLD_MODULE_INTERFACE mutually exclusive
+           -- Made the insmod options CONFIG_FEATURE_NEW_MODULE_INTERFACE and 
+               CONFIG_FEATURE_OLD_MODULE_INTERFACE mutually exclusive
            -- xgetcwd.c now includes sys/param.h to ensure PATH_MAX is defined
-           -- Fixed a potential segfault with lash + BB_FEATURE_CLEAN_UP
+           -- Fixed a potential segfault with lash + CONFIG_FEATURE_CLEAN_UP
            -- Removed uint64_t from dos2unix, avoiding C lib compat. problems.
        * Glenn McGrath
            -- Rewrite of tftp (commands match atftp, accepts -b, can use 
        * Matt Kraai 
            -- Made tar read 20 512byte blocks at a time (like GNU tar)
            -- Allow msh.c assignments with the export and readonly commands.
-           -- Added BB_FEATURE_DEVFS to enable devfs device names.
+           -- Added CONFIG_FEATURE_DEVFS to enable devfs device names.
            -- Better devfs support
            -- Don't save/restore vi readonly flag if vi is compiled read-only.
            -- Reworked rdate option handling (is now smaller).
        * Magnus Damm -- added a tftp applet  
        * Magnus Damm -- powerpc support for busybox insmod.
        * David Douthitt -- fixed a build error in df.c when 
-           BB_FEATURE_HUMAN_READABLE was disabled
+           CONFIG_FEATURE_HUMAN_READABLE was disabled
        * John Beppu -- wrote autodocifier.pl, which will be used to auto-
            generate the documentation from the source code, making life
            much simpler for all.
        * Mark Whitley -- Updates to style guide
        * Mark Whitley -- Big cleanup in utility.c: style guide compliance,
            de-macro-ifying some variables and functions
-       * Erik Andersen -- ls now honors BB_FEATURE_AUTOWIDTH so it can find
+       * Erik Andersen -- ls now honors CONFIG_FEATURE_AUTOWIDTH so it can find
            the width and height of the console.
        * Erik Andersen -- insmod now ignores -L and accepts the -o option.
        * Erik Andersen -- updates so you can now select from the Makefile
 0.48
 
        * Glenn McGrath -- tar now supports uncompressing tar files,
-           define BB_FEATURE_TAR_GZIP to use the -z option.
+           define CONFIG_FEATURE_TAR_GZIP to use the -z option.
        * Matt Kraai -- fix all usage of TRUE and FALSE so all apps now
            return EXIT_SUCCESS or EXIT_FAILURE to the system.
            Now TRUE and FALSE are set to the C standard where TRUE=1.
            GNU-date compatible
        * me -- Progress meter (optional) in wget
        * Doolittle/me -- programs invoked by full path name take
-           precedence over applets unless BB_FEATURE_SH_BUILTINS_ALWAYS_WIN
+           precedence over applets unless CONFIG_FEATURE_SH_BUILTINS_ALWAYS_WIN
        * Gaute B Strokkenes <gs234@cam.ac.uk> -- applets found using a
            binary search instead of linear search.  Much faster!
        * new applets: cmp readlink
 0.45
        * Now compiles vs libc5 (which can save lots of space for 
            embedded systems).
-       * Added BB_FEATURE_TRIVIAL_HELP which compiles out most all of the
+       * Added CONFIG_FEATURE_TRIVIAL_HELP which compiles out most all of the
            help messages (i.e --help).  Saves 17k over a full compile.
        * Added cut and tr from minix, since due to the license change, 
            we can now use minix code.  Minix tr saves 4k. 
        * Replaced the telnet implementation with one written by 
            Tomi Ollila <too@iki.fi> It works great and costs 3k.
        * BusyBox sh (lash) now supports being used as a standalone shell.  When
-           BB_FEATURE_SH_STANDALONE_SHELL is defined, all the busybox commands may
+           CONFIG_FEATURE_SH_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 
        * Fixed exit status for killall - Pavel Roskin
        * Fixed 'swapon -a' and 'swapoff -a', which were broken.
        * Fixed 'mount -a' so it works as expected.
-       * Implemented 'ls -R' (enabled by enabling BB_FEATURE_LS_RECURSIVE)
+       * Implemented 'ls -R' (enabled by enabling CONFIG_FEATURE_LS_RECURSIVE)
        * Implemented "ping -s", fixed error messages and argument parsing -
            Pavel Roskin
        * Syslogd will not go to background if "-n" is given. Better help
            saving a bunch of memory (kernel /proc support is not thin).  This
            is done by making use of some nice kernel patches I wrote up to
            support the features that busybox requires and that /proc usually
-           provides.  To enable this, turn on BB_FEATURE_USE_DEVPS_PATCH and
+           provides.  To enable this, turn on CONFIG_FEATURE_USE_DEVPS_PATCH and
            patch your kernel with the devps patch in the kernel-patches/
            directory. 
        * Wrote basename, dirname, killall, and uptime.
        * An initial telnet implementation was added by 
            Randolph Chung <tausq@debian.org>.
        * Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a "-e")
-       * ps now supports BB_FEATURE_AUTOWIDTH, and can adjust its width
+       * ps now supports CONFIG_FEATURE_AUTOWIDTH, and can adjust its width
            to match the terminal (defaults to width=79 when this is off).
        * ps now accepts (and ignores) all options except for "--help" (which
                as would be expected displays help).
 
         * Fairly massive restructuring of umount.c to deal with remounting 
          busy devices read-only. Adds a -r option to control that; it is 
-         optionally compiled in with BB_FEATURE_REMOUNT
+         optionally compiled in with CONFIG_FEATURE_REMOUNT
        * Added a bunch of functions to mtab.c to interact with the
          {get,set,end}mntent interface; as it turns out, those functions do
          not appear to be re-entrant, and that causes a lot of problems with
        * Created a tiny tail implementation, removing -c, -q, -v, and making
            tail -f work only with a single file.  This reduced tail from 6k to
            2.4k.  The bigger/more featured tail can still be had by disabling
-           BB_FEATURE_SIMPLE_TAIL in busybox.defs.h
+           CONFIG_FEATURE_SIMPLE_TAIL in busybox.defs.h
        * Ping now falls back to doing the right thing if /etc/protocols
            turns up missing.
        * Fixed mount and umount.  Previously they could leak loop device 
          devices. Support is toggled by MOUNT_LOOP feature -- Ben Collins
          <bcollins@debian.org>
        * Several fixes from Marco Pantaleoni <panta@prosa.it> compile in
-       * fullWrite() not only if BB_TAR is defined, but also
-               if BB_CP or BB_MV are (fullWrite() is referenced by copyFile())
+       * fullWrite() not only if CONFIG_TAR is defined, but also
+               if CONFIG_CP or CONFIG_MV are (fullWrite() is referenced by copyFile())
            * add some compiler optimizations to further reduce executable size
                (as a side note, on my machines the largest code is generated
                by gcc 2.95.2 with -Os ! The smallest by plain gcc 2.7.2.3 with
                -O2 -m386 ...)
            * Compile now won't fail if busybox.def.h defines 
-               BB_FEATURE_LINUXRC but not BB_INIT.  (init_main used to be
+               CONFIG_FEATURE_INITRD but not CONFIG_INIT.  (init_main used to be
                referenced, but not compiled)
        * Fixed a bug in setting TERM for serial console support.  TERM now
            defaults to "ansi" for serial consoles.
            to suit my evil purposes.  Costs 6k.  I'll make it smaller
            sometime.
        * on reboot, init called 'umount -a -n', which caused errors
-           when BB_MTAB was not enabled.  Changed to 'umount -a', which does
+           when CONFIG_MTAB was not enabled.  Changed to 'umount -a', which does
            the right thing.
        * init will now try to run /sbin/getty if it is present (for easy
            integration with the about-to-be-released tinylogin.)
        * I've taken a first step to making busybox not need the /proc 
            filesystem.  Most apps don't need it.  Those that _require_ it, 
            will complain if you enable them when you disable 
-           BB_FEATURE_USE_PROCFS.
+           CONFIG_FEATURE_USE_PROCFS.
           
        -Erik Andersen, Dec 5, 1999
 
        * from
            Eric Delaunay).
        * Made createPath be quiet (again thanks to Eric Delaunay).  If
-       * BB_CONSOLE_CMD_IF_RC_SCRIPT_EXITS is defined, then whatever
+       * CONFIG_CONSOLE_CMD_IF_RC_SCRIPT_EXITS is defined, then whatever
            command you define it as will be run if the init script exits.
        * Updated install.sh to make it more robust (thanks to Adam Di Carlo)
        * NFS support added to mount by Eric Delaunay.  It costs 10k when
            to Eric Delaunay.
        * more started to read from stdin after the last file was finished, and 
            options were not parsed correctly (fix thanks to Eric Delaunay).
-       * more will now use the terminal size if BB_FEATURE_AUTOWIDTH is on.
+       * more will now use the terminal size if CONFIG_FEATURE_AUTOWIDTH is on.
        * rm wouldn't remove a symlink unless the symlink was valid.  This was
            a side effect of the busybox 0.32 recursiveAction() fix.  Things
            should now work correctly.
        * Removed some debugging noise from init.c
        * Fixed ln so it works now (it was very broken).
        * Fixed df so it won't segfault when there is no /etc/fstab,
-       * If BB_MTAB is not defined, df and mount will whine if /etc/fstab
+       * If CONFIG_MTAB is not defined, df and mount will whine if /etc/fstab
            is not installed (since they cannot fixup "/dev/root" to 
            state the real root device name)
        * merged some redundant code from mtab.c/df.c into utility.c
         -Erik Andersen, Nov  5, 1999
 
 0.32
-       * More changes -- many thanks to Lineo for paying me to work on
-           busybox.  If you have any problems please let me know ASAP at
-           andersen@lineo.com or andersee@debian.org
+       * More changes -- If you have any problems please let me know ASAP at
+           andersee@debian.org
        * usage() now prints the BusyBox version.  This will help folks
            realize that they are not in Kansas anymore.
        * Fixed mkdir -m option so that it works.  kill segfaulted w/o any
        * with full regular expressions!).  Fixed a stupid seg-fault in sync
        * Fixed mount -- mount -a failed to parse and apply mount options Fixed
        * umount -n (patch thanks to Matthew Grant <grantma@anathoth.gen.nz>)
-       * umount -a no longer umounts /proc Added BB_MTAB, allowing (at the
+       * umount -a no longer umounts /proc Added CONFIG_MTAB, allowing (at the
        * cost of ~1.5k and the need for a rw /etc)
            folks to use a real /etc/mtab file instead of a symlink to
            /proc/mounts.  mount, and umount will add/remove entries and df
-           will now use /etc/mtab if BB_MTAB is defined. 
+           will now use /etc/mtab if CONFIG_MTAB is defined. 
        * Fixed a nice bug in recursiveAction() which caused it to infinitely
            hunt through /proc/../fd/* creating new file descriptors if it
            followed the /dev/fd link over to /proc.  recursiveAction() now
         -Erik Andersen, Oct 21, 1999
 
 0.30
-       Major changes -- lots of stuff rewritten. Many thanks to Lineo for
-       paying me to make these updates. If you have any problems with busybox, 
-       or notice any bugs -- please let me know so I can fix it.  These 
-       changes include:
+       Major changes -- lots of stuff rewritten.  If you have any problems 
+       with busybox, or notice any bugs -- please let me know so I can fix 
+       it.  These changes include:
 
        Core Changes:
            * busybox can now invoke apps in two ways: via symlinks to the
diff --git a/Config.h b/Config.h
deleted file mode 100644 (file)
index 73b0f91..0000000
--- a/Config.h
+++ /dev/null
@@ -1,494 +0,0 @@
-/* vi: set sw=4 ts=4: */
-// This file defines the feature set to be compiled into busybox.
-// When you turn things off here, they won't be compiled in at all.
-//
-//// This file is parsed by sed.  You MUST use single line comments.
-//   i.e.,  //#define BB_BLAH
-//
-//
-// BusyBox Applications
-//#define BB_ADDGROUP
-//#define BB_ADDUSER
-//#define BB_ADJTIMEX
-//#define BB_AR
-//#define BB_ASH
-#define BB_BASENAME
-//#define BB_BUNZIP2
-#define BB_CAT
-#define BB_CHGRP
-#define BB_CHMOD
-#define BB_CHOWN
-#define BB_CHROOT
-#define BB_CHVT
-#define BB_CLEAR
-//#define BB_CMP
-#define BB_CP
-//#define BB_CPIO
-#define BB_CUT
-#define BB_DATE
-//#define BB_DC
-#define BB_DD
-//#define BB_DEALLOCVT
-//#define BB_DELGROUP
-//#define BB_DELUSER
-#define BB_DF
-#define BB_DIRNAME
-#define BB_DMESG
-//#define BB_DOS2UNIX
-//#define BB_DPKG
-//#define BB_DPKG_DEB
-//#define BB_DUTMP
-#define BB_DU
-//#define BB_DUMPKMAP
-#define BB_ECHO
-#define BB_ENV
-//#define BB_EXPR
-//#define BB_FBSET
-//#define BB_FDFLUSH
-#define BB_FIND
-#define BB_FREE
-//#define BB_FREERAMDISK
-//#define BB_FSCK_MINIX
-//#define BB_GETOPT
-//#define BB_GETTY
-#define BB_GREP
-#define BB_GUNZIP
-#define BB_GZIP
-#define BB_HALT
-#define BB_HEAD
-//#define BB_HOSTID
-//#define BB_HOSTNAME
-//#define BB_HUSH
-#define BB_ID
-//#define BB_IFCONFIG
-#define BB_INIT
-//#define BB_INSMOD
-#define BB_KILL
-#define BB_KILLALL
-#define BB_KLOGD
-//#define BB_LASH
-//#define BB_LENGTH
-#define BB_LN
-//#define BB_LOADACM
-//#define BB_LOADFONT
-//#define BB_LOADKMAP
-#define BB_LOGGER
-//#define BB_LOGNAME
-#define BB_LS
-#define BB_LSMOD
-//#define BB_MAKEDEVS
-//#define BB_MD5SUM
-#define BB_MKDIR
-//#define BB_MKFIFO
-//#define BB_MKFS_MINIX
-#define BB_MKNOD
-#define BB_MKSWAP
-//#define BB_MKTEMP
-#define BB_MODPROBE
-#define BB_MORE
-#define BB_MOUNT
-#define BB_MSH
-//#define BB_MT
-#define BB_MV
-//#define BB_NC
-//#define BB_NSLOOKUP
-#define BB_PIDOF
-//#define BB_PING
-//#define BB_PIVOT_ROOT
-#define BB_POWEROFF
-//#define BB_PRINTF
-#define BB_PS
-#define BB_PWD
-//#define BB_RDATE
-//#define BB_READLINK
-#define BB_REBOOT
-//#define BB_RENICE
-#define BB_RESET
-#define BB_RM
-#define BB_RMDIR
-//#define BB_RMMOD
-//#define BB_ROUTE
-//#define BB_RPM2CPIO
-#define BB_SED
-//#define BB_SETKEYCODES
-#define BB_SLEEP
-#define BB_SORT
-//#define BB_STTY
-//#define BB_START_STOP_DAEMON
-#define BB_SWAPONOFF
-#define BB_SYNC
-#define BB_SYSLOGD
-#define BB_TAIL
-#define BB_TAR
-//#define BB_TEE
-//#define BB_TEST
-//#define BB_TELNET
-//#define BB_TFTP
-#define BB_TOUCH
-//#define BB_TR
-//#define BB_TRACEROUTE
-#define BB_TRUE_FALSE
-#define BB_TTY
-//#define BB_UNIX2DOS
-//#define BB_UUENCODE
-//#define BB_UUDECODE
-#define BB_UMOUNT
-#define BB_UNIQ
-#define BB_UNAME
-//#define BB_UPDATE
-#define BB_UPTIME
-//#define BB_USLEEP
-//#define BB_VI
-//#define BB_WATCHDOG
-#define BB_WC
-//#define BB_WGET
-#define BB_WHICH
-#define BB_WHOAMI
-#define BB_XARGS
-#define BB_YES
-// End of Applications List
-//
-//
-//
-// ---------------------------------------------------------
-// This is where feature definitions go.  Generally speaking,
-// turning this stuff off makes things a bit smaller (and less 
-// pretty/useful).
-//
-//
-// If you enabled one or more of the shells, you may select which one
-// should be run when sh is invoked:
-//#define BB_FEATURE_SH_IS_ASH
-//#define BB_FEATURE_SH_IS_HUSH
-//#define BB_FEATURE_SH_IS_LASH
-#define BB_FEATURE_SH_IS_MSH
-//
-// BusyBox will, by default, malloc space for its buffers.  This costs code
-// size for the call to xmalloc.  You can use the following feature to have
-// them put on the stack.  For some very small machines with limited stack
-// space, this can be deadly.  For most folks, this works just fine...
-//#define BB_FEATURE_BUFFERS_GO_ON_STACK
-// The third alternative for buffer allocation is to use BSS.  This works
-// beautifully for computers with a real MMU (and OS support), but wastes
-// runtime RAM for uCLinux.  This behavior was the only one available for
-// BusyBox versions 0.48 and earlier.
-//#define BB_FEATURE_BUFFERS_GO_IN_BSS
-//
-// Turn this on to use Erik's very cool devps, and devmtab kernel drivers,
-// thereby eliminating the need for the /proc filesystem and thereby saving
-// lots and lots memory for more important things.  NOTE:  If you enable this
-// feature, you _must_ have patched the kernel to include the devps patch that
-// is included in the busybox/kernel-patches directory.  You will also need to
-// create some device special files in /dev on your embedded system:
-//        mknod /dev/mtab c 10 22
-//        mknod /dev/ps c 10 21
-// I emailed Linus and this patch will not be going into the stock kernel.
-//#define BB_FEATURE_USE_DEVPS_PATCH
-//
-// show verbose usage messages
-//#define BB_FEATURE_VERBOSE_USAGE
-//
-// Use termios to manipulate the screen ('more' is prettier with this on)
-//#define BB_FEATURE_USE_TERMIOS
-//
-// calculate terminal & column widths (for more and ls)
-#define BB_FEATURE_AUTOWIDTH
-//
-// show username/groupnames for ls
-#define BB_FEATURE_LS_USERNAME
-//
-// show file timestamps in ls
-#define BB_FEATURE_LS_TIMESTAMPS
-//
-// enable ls -p and -F
-#define BB_FEATURE_LS_FILETYPES
-//
-// sort the file names
-#define BB_FEATURE_LS_SORTFILES
-//
-// enable ls -R
-#define BB_FEATURE_LS_RECURSIVE
-//
-// enable ls -L
-#define BB_FEATURE_LS_FOLLOWLINKS
-//
-// Disable for a smaller (but less functional) ping
-#define BB_FEATURE_FANCY_PING
-//
-// Make init use a simplified /etc/inittab file (recommended).
-#define BB_FEATURE_USE_INITTAB
-//
-//Enable init being called as /linuxrc
-#define BB_FEATURE_LINUXRC
-//
-//Have init enable core dumping for child processes (for debugging only) 
-//#define BB_FEATURE_INIT_COREDUMPS
-//
-//Make sure nothing is printed to the console on boot
-//#define BB_FEATURE_EXTRA_QUIET
-//
-// enable syslogd -R remotehost
-#define BB_FEATURE_REMOTE_LOG
-//
-// enable syslogd -C
-//#define BB_FEATURE_IPC_SYSLOG
-//
-//Disable for a simple tail implementation (2.34k vs 3k for the full one).
-//Both provide 'tail -f', but this cuts out -c, -q, -s, and -v. 
-#define BB_FEATURE_FANCY_TAIL
-//
-// Enable support for loop devices in mount
-#define BB_FEATURE_MOUNT_LOOP
-//
-// Enable support for a real /etc/mtab file instead of /proc/mounts
-//#define BB_FEATURE_MTAB_SUPPORT
-//
-// Enable support for mounting remote NFS volumes. 
-// You may need to mount with "-o nolock" if you are
-// not running a local portmapper daemon...
-//
-// If you are using uClibc, be sure that you've already compiled
-// uClibc with INCLUDE_RPC=true (contained in the Config file)
-//#define BB_FEATURE_NFSMOUNT
-//
-// Enable support forced filesystem unmounting 
-// (i.e., in case of an unreachable NFS system).
-#define BB_FEATURE_MOUNT_FORCE
-//
-// Enable support for creation of tar files.
-#define BB_FEATURE_TAR_CREATE
-//
-// Enable support for "--exclude" and "-X" for excluding files
-#define BB_FEATURE_TAR_EXCLUDE
-//
-// Enable support for tar -z option (currently only works for inflating)
-#define BB_FEATURE_TAR_GZIP 
-//
-// Enable reverse sort
-#define BB_FEATURE_SORT_REVERSE
-//
-// Enable uniqe sort
-#define BB_FEATURE_SORT_UNIQUE
-//
-// Enable command line editing in the shell.  
-// Only relevant if a shell is enabled. On by default.
-#define BB_FEATURE_COMMAND_EDITING
-//
-// Enable tab completion in the shell.  This is now working quite nicely.
-// This feature adds a bit over 4k. Only relevant if a shell is enabled.
-#define BB_FEATURE_COMMAND_TAB_COMPLETION
-//
-// Attempts to match usernames in a ~-prefixed path
-//#define BB_FEATURE_COMMAND_USERNAME_COMPLETION
-//
-//Allow the shell to invoke all the compiled in BusyBox applets as if they
-//were shell builtins.  Nice for staticly linking an emergency rescue shell,
-//among other things. Off by default.
-// Only relevant if a shell is enabled.
-//#define BB_FEATURE_SH_STANDALONE_SHELL
-//
-//When this is enabled, busybox shell applets can be called using full path
-//names.  This causes applets (i.e., most busybox commands) to override
-//real commands on the filesystem.  For example, if you run run /bin/cat, it
-//will use BusyBox cat even if /bin/cat exists on the filesystem and is _not_
-//busybox.  Some systems want this, others do not.  Choose wisely.  :-) This
-//only has meaning when BB_FEATURE_SH_STANDALONE_SHELL is enabled.
-// Only relevant if a shell is enabled. Off by default.
-//#define BB_FEATURE_SH_APPLETS_ALWAYS_WIN
-//
-// Uncomment this option for a fancy shell prompt that includes the
-// current username and hostname.  On systems that don't have usernames
-// or hostnames, this can look hideous.
-// Only relevant if a shell is enabled.
-//#define BB_FEATURE_SH_FANCY_PROMPT
-//
-//Make interactive shells not print busybox messages
-//#define BB_FEATURE_SH_EXTRA_QUIET
-//
-//Turn on extra fbset options
-//#define BB_FEATURE_FBSET_FANCY
-//
-//Turn on fbset readmode support
-//#define BB_FEATURE_FBSET_READMODE
-//
-// Support insmod/lsmod/rmmod for post 2.1 kernels
-//#define BB_FEATURE_NEW_MODULE_INTERFACE
-//
-// Support insmod/lsmod/rmmod for pre 2.1 kernels
-//#define BB_FEATURE_OLD_MODULE_INTERFACE
-//
-// Support module version checking
-//#define BB_FEATURE_INSMOD_VERSION_CHECKING
-//
-// Support for uClinux memory usage optimization, which will load the image
-// directly into the kernel memory.  This divides memory requrements by three.
-// If you are not running uClinux (i.e., your CPU has an MMU) leave this
-// disabled...
-//#define BB_FEATURE_INSMOD_LOADINKMEM
-//
-// Support for Minix filesystem, version 2
-//#define BB_FEATURE_MINIX2
-//
-// Enable ifconfig status reporting output -- this feature adds 7k.
-//#define BB_FEATURE_IFCONFIG_STATUS
-//
-// Enable ifconfig slip-specific options "keepalive" and "outfill"
-//#define BB_FEATURE_IFCONFIG_SLIP
-//
-// Enable ifconfig options "mem_start", "io_addr", and "irq".
-//#define BB_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
-//
-// Enable ifconfig option "hw".  Currently works for only with "ether".
-//#define BB_FEATURE_IFCONFIG_HW
-//
-// Allows "broadcast +" to set broadcast automatically based on hostaddr
-// and netmask, at a cost of about 100 bytes of code (i386).
-//#define BB_FEATURE_IFCONFIG_BROADCAST_PLUS
-//
-// Enable busybox --install [-s]
-// to create links (or symlinks) for all the commands that are 
-// compiled into the binary.  (needs /proc filesystem)
-//#define BB_FEATURE_INSTALLER
-//
-// Enable a nifty progress meter in wget (adds just under 2k)
-#define BB_FEATURE_WGET_STATUSBAR
-//
-// Enable HTTP authentication in wget
-#define BB_FEATURE_WGET_AUTHENTICATION
-//
-// Clean up all memory before exiting -- usually not needed
-// as the OS can clean up...  Don't enable this unless you
-// have a really good reason for cleaning things up manually.
-//#define BB_FEATURE_CLEAN_UP
-//
-// Support for human readable output by ls, du, etc.(example 13k, 23M, 235G)
-#define BB_FEATURE_HUMAN_READABLE
-//
-// Support for the find -type option.
-#define BB_FEATURE_FIND_TYPE
-//
-// Support for the find -perm option.
-#define BB_FEATURE_FIND_PERM
-//
-// Support for the find -mtine option.
-#define BB_FEATURE_FIND_MTIME
-//
-// Support for the -A -B and -C context flags in grep
-//#define BB_FEATURE_GREP_CONTEXT
-//
-// Support for the EGREP applet (alias to the grep applet)
-//#define BB_FEATURE_GREP_EGREP_ALIAS
-//
-// Tell tftp what commands that should be supported.
-#define BB_FEATURE_TFTP_PUT
-#define BB_FEATURE_TFTP_GET
-//#define BB_FEATURE_TFTP_BLOCKSIZE
-//
-// features for vi
-#define BB_FEATURE_VI_COLON            // ":" colon commands, no "ex" mode
-#define BB_FEATURE_VI_YANKMARK         // Yank/Put commands and Mark cmds
-#define BB_FEATURE_VI_SEARCH           // search and replace cmds
-#define BB_FEATURE_VI_USE_SIGNALS      // catch signals
-#define BB_FEATURE_VI_DOT_CMD          // remember previous cmd and "." cmd
-#define BB_FEATURE_VI_READONLY         // vi -R and "view" mode
-#define BB_FEATURE_VI_SETOPTS          // set-able options,  ai ic showmatch
-#define BB_FEATURE_VI_SET              // :set
-#define BB_FEATURE_VI_WIN_RESIZE       // handle window resize
-//
-// Enable a if you system have setuped locale
-//#define BB_LOCALE_SUPPORT
-//
-// Support for TELNET to pass TERM type to remote host.  Adds 384 bytes.
-#define BB_FEATURE_TELNET_TTYPE
-//
-// Support for devfs.
-//#define BB_FEATURE_DEVFS
-//
-// End of Features List
-//
-//
-//
-//
-//
-//
-//---------------------------------------------------
-// Nothing beyond this point should ever be touched by 
-// mere mortals so leave this stuff alone.
-//
-#include <features.h>
-#if defined __UCLIBC__ && ! defined __UCLIBC_HAS_MMU__
-       #undef BB_RPM2CPIO              /* Uses gz_open(), which uses fork() */
-       #undef BB_DPKG_DEB              /* Uses gz_open(), which uses fork() */
-       #undef BB_ASH                   /* Uses fork() */
-       #undef BB_HUSH                  /* Uses fork() */
-       #undef BB_LASH                  /* Uses fork() */
-       #undef BB_INIT                  /* Uses fork() */
-       #undef BB_FEATURE_TAR_GZIP      /* Uses fork() */
-       #undef BB_SYSLOGD               /* Uses daemon() */
-       #undef BB_KLOGD                 /* Uses daemon() */
-       #undef BB_UPDATE                /* Uses daemon() */
-#endif
-#if defined BB_ASH || defined BB_HUSH || defined BB_LASH || defined BB_MSH
-       #if defined BB_FEATURE_COMMAND_EDITING
-               #define BB_CMDEDIT
-       #else
-               #undef BB_FEATURE_COMMAND_EDITING
-               #undef BB_FEATURE_COMMAND_TAB_COMPLETION
-               #undef BB_FEATURE_COMMAND_USERNAME_COMPLETION
-               #undef BB_FEATURE_SH_FANCY_PROMPT
-       #endif
-#else
-       #undef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
-       #undef BB_FEATURE_SH_STANDALONE_SHELL
-       #undef BB_FEATURE_SH_FANCY_PROMPT
-#endif
-//
-#if (defined BB_ASH || defined BB_HUSH || defined BB_MSH) && ! defined BB_TEST
-       #define BB_TEST
-#endif
-//
-#ifdef BB_KILLALL
-       #ifndef BB_KILL
-               #define BB_KILL
-       #endif
-#endif
-//
-#ifndef BB_INIT
-       #undef BB_FEATURE_LINUXRC
-#endif
-//
-#if defined BB_MOUNT && defined BB_FEATURE_NFSMOUNT
-       #define BB_NFSMOUNT
-#endif
-//
-#if defined BB_FEATURE_AUTOWIDTH
-       #ifndef BB_FEATURE_USE_TERMIOS
-               #define BB_FEATURE_USE_TERMIOS
-       #endif
-#endif
-//
-#if defined BB_INSMOD || defined BB_LSMOD
-       #if ! defined BB_FEATURE_NEW_MODULE_INTERFACE && ! defined BB_FEATURE_OLD_MODULE_INTERFACE
-               #define BB_FEATURE_NEW_MODULE_INTERFACE
-       #endif
-#endif
-//
-#ifdef BB_UNIX2DOS
-       #define BB_DOS2UNIX
-#endif 
-//
-#ifdef BB_SYSLOGD
-       #if defined BB_FEATURE_IPC_SYSLOG
-               #define BB_LOGREAD
-       #endif
-#endif
-//
-#if defined BB_ASH && defined BB_FEATURE_SH_IS_ASH
-# define shell_main ash_main
-#elif defined BB_HUSH && defined BB_FEATURE_SH_IS_HUSH
-# define shell_main hush_main
-#elif defined BB_LASH && defined BB_FEATURE_SH_IS_LASH
-# define shell_main lash_main
-#elif defined BB_MSH && defined BB_FEATURE_SH_IS_MSH
-# define shell_main msh_main
-#endif
diff --git a/LICENSE b/LICENSE
index 8e5a143..375ad2a 100644 (file)
--- a/LICENSE
+++ b/LICENSE
@@ -17,15 +17,14 @@ Copyright 1998 Dave Cinege <dcinege@psychosis.com>
 mini-gzip(gzip), mini-netcat(mnc)
 Copyright 1998 Charles P. Wright <cpwright@villagenet.com>
 
-Tons of new stuff as noted in header files
-Copyright (C) 1999,2000,2001 by Lineo, inc. and written by 
-Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
-
+Tons of new stuff as noted in header files 
+Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen and Erik Andersen
+Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
 
 
 Please feed suggestions, bug reports, insults, and bribes back to:
        Erik Andersen 
-       <andersen@lineo.com>
+       <andersen@codepoet.org>
        <andersee@debian.org>
 
 
index 3cabc7a..c833780 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 # Makefile for busybox
 #
-# Copyright (C) 1999,2000,2001 Erik Andersen <andersee@debian.org>
+# Copyright (C) 1999,2000,2001 by Erik Andersen <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
 PROG      := busybox
 VERSION   := 0.61.pre
 BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z")
-export VERSION
+TOPDIR    := ${shell /bin/pwd}
+HOSTCC    := gcc
+HOSTCFLAGS:= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+
+
+# What OS are you compiling busybox for?  This allows you to include
+# OS specific things, syscall overrides, etc.
+TARGET_OS := linux
 
 # With a modern GNU make(1) (highly recommended, that's what all the
 # developers use), all of the following configuration values can be
 # overridden at the command line.  For example:
-#   make CROSS=powerpc-linux- BB_SRC_DIR=$HOME/busybox PREFIX=/mnt/app
+#   make CROSS=powerpc-linux- CONFIG_SRC_DIR=$HOME/busybox PREFIX=/mnt/app
 
 # If you want to add some simple compiler switches (like -march=i686),
 # especially from the command line, use this instead of CFLAGS directly.
@@ -39,18 +46,6 @@ DOSTATIC = false
 # Leave this set to `false' for production use.
 DODEBUG = false
 
-# Setting this to `true' will cause busybox to directly use the system's
-# password and group functions.  Assuming you use GNU libc, when this is
-# `true', you will need to install the /etc/nsswitch.conf configuration file
-# and the required libnss_* libraries. This generally makes your embedded
-# system quite a bit larger... If you leave this off, busybox will directly use
-# the /etc/password, /etc/group files (and your system will be smaller, and I
-# will get fewer emails asking about how glibc NSS works).  Enabling this adds
-# just 1.4k to the binary size (which is a _lot_ less then glibc NSS costs).
-# Note that if you want hostname resolution to work with glibc, you still need
-# the libnss_* libraries.  
-USE_SYSTEM_PWD_GRP = true
-
 # This enables compiling with dmalloc ( http://dmalloc.com/ )
 # which is an excellent public domain mem leak and malloc problem
 # detector.  To enable dmalloc, before running busybox you will
@@ -72,17 +67,24 @@ DOEFENCE  = false
 # larger than 2GB!
 DOLFS = false
 
-# If you have a "pristine" source directory, point BB_SRC_DIR to it.
+# If you have a "pristine" source directory, point CONFIG_SRC_DIR to it.
 # Experimental and incomplete; tell the mailing list
 # <busybox@opensource.lineo.com> if you do or don't like it so far.
-BB_SRC_DIR =
+CONFIG_SRC_DIR =
 
-# If you are running a cross compiler, you may want to set this
-# to something more interesting, like "powerpc-linux-".
+# If you are running a cross compiler, you may want to set CROSS
+# to something more interesting, like "arm-linux-".
 CROSS =
-CC = $(CROSS)gcc
-AR = $(CROSS)ar
-STRIPTOOL = $(CROSS)strip
+CC              = $(CROSS)gcc
+AR              = $(CROSS)ar
+AS              = $(CROSS)as
+LD              = $(CROSS)ld
+NM              = $(CROSS)nm
+STRIP           = $(CROSS)strip
+CPP             = $(CC) -E
+MAKEFILES       = $(TOPDIR)/.config
+export VERSION BUILDTIME TOPDIR HOSTCC HOSTCFLAGS CROSS CC AR AS LD NM STRIP CPP
+
 
 # To compile vs uClibc, just use the compiler wrapper built by uClibc...
 # Everything should compile and work as expected these days...
@@ -107,10 +109,11 @@ STRIPTOOL = $(CROSS)strip
 #GCCINCDIR = $(shell gcc -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp")
 
 # use '-Os' optimization if available, else use -O2
-OPTIMIZATION := $(shell if $(CC) -Os -S -o /dev/null -xc /dev/null >/dev/null 2>&1; \
-    then echo "-Os"; else echo "-O2" ; fi)
+OPTIMIZATION := ${shell if $(CC) -Os -S -o /dev/null -xc /dev/null \
+       >/dev/null 2>&1; then echo "-Os"; else echo "-O2" ; fi}
 
 WARNINGS=-Wall -Wstrict-prototypes -Wshadow
+CFLAGS = -I $(TOPDIR)/include -I $(TOPDIR)/busybox
 ARFLAGS = -r
 
 #
@@ -142,25 +145,14 @@ endif
 ifeq ($(strip $(DODEBUG)),true)
     CFLAGS  += $(WARNINGS) -g -D_GNU_SOURCE
     LDFLAGS += -Wl,-warn-common
-    STRIP    =
+    STRIPCMD    =
 else
     CFLAGS  += $(WARNINGS) $(OPTIMIZATION) -fomit-frame-pointer -D_GNU_SOURCE
     LDFLAGS += -s -Wl,-warn-common
-    STRIP    = $(STRIPTOOL) --remove-section=.note --remove-section=.comment $(PROG)
+    STRIPCMD    = $(STRIP) --remove-section=.note --remove-section=.comment $(PROG)
 endif
 ifeq ($(strip $(DOSTATIC)),true)
     LDFLAGS += --static
-    #
-    #use '-ffunction-sections -fdata-sections' and '--gc-sections' (if they 
-    # work) to try and strip out any unused junk.  Doesn't do much for me, 
-    # but you may want to give it a shot...
-    #
-    #ifeq ($(shell $(CC) -ffunction-sections -fdata-sections -S \
-    #  -o /dev/null -xc /dev/null 2>/dev/null && $(LD) \
-    #                  --gc-sections -v >/dev/null && echo 1),1)
-    #  CFLAGS += -ffunction-sections -fdata-sections
-    #  LDFLAGS += --gc-sections
-    #endif
 endif
 
 ifndef $(PREFIX)
@@ -169,125 +161,77 @@ endif
 
 # Additional complications due to support for pristine source dir.
 # Include files in the build directory should take precedence over
-# the copy in BB_SRC_DIR, both during the compilation phase and the
+# the copy in CONFIG_SRC_DIR, both during the compilation phase and the
 # shell script that finds the list of object files.
 # Work in progress by <ldoolitt@recycle.lbl.gov>.
 #
-ifneq ($(strip $(BB_SRC_DIR)),)
-    VPATH = $(BB_SRC_DIR)
+ifneq ($(strip $(CONFIG_SRC_DIR)),)
+    VPATH = $(CONFIG_SRC_DIR)
 endif
-#ifneq ($(strip $(VPATH)),)
-#    CFLAGS += -I- -I. $(patsubst %,-I%,$(subst :, ,$(VPATH)))
-#endif
-
-# We need to set APPLET_SOURCES to something like
-#   $(shell busybox.sh Config.h)
-# but in a manner that works with VPATH and BB_SRC_DIR.
-# Possible ways to approach this:
-#
-#   1. Explicitly search through .:$(VPATH) for busybox.sh and config.h,
-#      then $(shell $(BUSYBOX_SH) $(CONFIG_H) $(BB_SRC_DIR))
-#
-#   2. Explicity search through .:$(VPATH) for slist.mk,
-#      then $(shell $(MAKE) -f $(SLIST_MK) VPATH=$(VPATH) BB_SRC_DIR=$(BB_SRC_DIR))
-#
-#   3. Create slist.mk in this directory, with commands embedded in
-#      a $(shell ...) command, and $(MAKE) it immediately.
-#
-#   4. Use a real rule within this makefile to create a file that sets 
-#      APPLET_SOURCE_LIST, then include that file.  Has complications
-#      with the first trip through the makefile (before processing the
-#      include) trying to do too much, and a spurious warning the first
-#      time make is run.
-#
-# This is option 3:
-#
-#APPLET_SOURCES = $(shell \
-#   echo -e 'all: busybox.sh Config.h\n\t@ $$(SHELL) $$^ $$(BB_SRC_DIR)' >slist.mk; \
-#   make -f slist.mk VPATH=$(VPATH) BB_SRC_DIR=$(BB_SRC_DIR) \
-#)
-# And option 4:
--include applet_source_list
 
 OBJECTS   = $(APPLET_SOURCES:.c=.o) busybox.o usage.o applets.o
 CFLAGS    += $(CROSS_CFLAGS)
-CFLAGS    += -DBB_VER='"$(VERSION)"'
-CFLAGS    += -DBB_BT='"$(BUILDTIME)"'
-ifdef BB_INIT_SCRIPT
-    CFLAGS += -DINIT_SCRIPT='"$(BB_INIT_SCRIPT)"'
+ifdef CONFIG_INIT_SCRIPT
+    CFLAGS += -DINIT_SCRIPT='"$(CONFIG_INIT_SCRIPT)"'
 endif
 
-ifneq ($(strip $(USE_SYSTEM_PWD_GRP)),true)
-    PWD_GRP    = pwd_grp
-    PWD_GRP_DIR = $(BB_SRC_DIR:=/)$(PWD_GRP)
-    PWD_LIB     = libpwd.a
-    PWD_CSRC=__getpwent.c pwent.c getpwnam.c getpwuid.c putpwent.c getpw.c \
-           fgetpwent.c __getgrent.c grent.c getgrnam.c getgrgid.c fgetgrent.c \
-           initgroups.c setgroups.c
-    PWD_OBJS=$(patsubst %.c,$(PWD_GRP)/%.o, $(PWD_CSRC))
-ifneq ($(strip $(BB_SRC_DIR)),)
-    PWD_CFLAGS = -I- -I.
-endif
-    PWD_CFLAGS += -I$(PWD_GRP_DIR)
+# Put user-supplied flags at the end, where they
+# have a chance of winning.
+CFLAGS += $(CFLAGS_EXTRA)
+
+.EXPORT_ALL_VARIABLES:
+
+all:    do-it-all
+
+#
+# Make "config" the default target if there is no configuration file or
+# "depend" the target if there is no top-level dependency information.
+ifeq (.config,$(wildcard .config))
+include .config
+ifeq (.depend,$(wildcard .depend))
+include .depend 
+do-it-all:      busybox busybox.links doc
 else
-    CFLAGS    += -DUSE_SYSTEM_PWD_GRP
+CONFIGURATION = depend
+do-it-all:      depend
 endif
-    
-LIBBB    = libbb
-LIBBB_LIB = libbb.a
-LIBBB_CSRC= ask_confirmation.c chomp.c concat_path_file.c copy_file.c \
-copy_file_chunk.c libc5.c device_open.c error_msg.c \
-error_msg_and_die.c fgets_str.c find_mount_point.c find_pid_by_name.c \
-find_root_device.c full_read.c full_write.c get_console.c \
-get_last_path_component.c get_line_from_file.c gz_open.c human_readable.c \
-isdirectory.c kernel_version.c loop.c mode_string.c module_syscalls.c mtab.c \
-mtab_file.c my_getgrnam.c my_getgrgid.c my_getpwnam.c my_getpwnamegid.c \
-my_getpwuid.c parse_mode.c parse_number.c perror_msg.c perror_msg_and_die.c \
-print_file.c process_escape_sequence.c read_package_field.c recursive_action.c \
-safe_read.c safe_strncpy.c syscalls.c syslog_msg_with_name.c time_string.c \
-trim.c unzip.c vdprintf.c verror_msg.c vperror_msg.c wfopen.c xfuncs.c \
-xgetcwd.c xreadlink.c xregcomp.c interface.c remove_file.c last_char_is.c \
-copyfd.c vherror_msg.c herror_msg.c herror_msg_and_die.c xgethostbyname.c \
-dirname.c make_directory.c create_icmp_socket.c u_signal_names.c arith.c \
-simplify_path.c
-LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC))
-ifeq ($(strip $(BB_SRC_DIR)),)
-    LIBBB_CFLAGS += -I$(LIBBB)
 else
-    LIBBB_CFLAGS = -I- -I. -I./$(LIBBB) -I$(BB_SRC_DIR)/$(LIBBB) -I$(BB_SRC_DIR)
+CONFIGURATION = menuconfig
+do-it-all:      menuconfig
 endif
 
-LIBBB_MSRC=libbb/messages.c
-LIBBB_MESSAGES= full_version name_too_long omitting_directory not_a_directory \
-memory_exhausted invalid_date invalid_option io_error dash_dash_help \
-write_error too_few_args name_longer_than_foo unknown can_not_create_raw_socket
-LIBBB_MOBJ=$(patsubst %,$(LIBBB)/%.o, $(LIBBB_MESSAGES))
+SUBDIRS =applets archival console-tools editors fileutils findutils init \
+       miscutils modutils networking pwd_grp shell shellutils sysklogd \
+       textutils tinylogin util-linux libbb
 
-LIBBB_ARCSRC=libbb/unarchive.c
-LIBBB_ARCOBJ= archive_offset seek_sub_file extract_archive unarchive \
-get_header_ar get_header_cpio get_header_tar deb_extract
-LIBBB_AROBJS=$(patsubst %,$(LIBBB)/%.o, $(LIBBB_ARCOBJ))
+bbsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))
 
+$(patsubst %, _dir_%, $(SUBDIRS)) : dummy include/config/MARKER
+       $(MAKE) CFLAGS="$(CFLAGS)" -C $(patsubst _dir_%, %, $@)
 
-# Put user-supplied flags at the end, where they
-# have a chance of winning.
-CFLAGS += $(CFLAGS_EXTRA)
+busybox: bbsubdirs
+       $(CC) $(LDFLAGS) -o $@ $(shell find $(SUBDIRS) -name \*.a) $(LIBCONFIG_LIB) $(LIBRARIES)
+       $(STRIPCMD)
 
-.EXPORT_ALL_VARIABLES:
+busybox.links: applets/busybox.mkll
+       - $(SHELL) $^ >$@
+
+install: applets/install.sh busybox busybox.links
+       $(SHELL) $< $(PREFIX)
 
-all: applet_source_list busybox busybox.links doc
+install-hardlinks: applets/install.sh busybox busybox.links
+       $(SHELL) $< $(PREFIX) --hardlinks
 
-applet_source_list: busybox.sh Config.h
-       (echo -n "APPLET_SOURCES := "; CC="$(CC)" BB_SRC_DIR="$(BB_SRC_DIR)" $(SHELL) $^) > $@
 
+# Documentation Targets
 doc: olddoc
 
 # Old Docs...
 olddoc: docs/busybox.pod docs/BusyBox.txt docs/BusyBox.1 docs/BusyBox.html
 
-docs/busybox.pod : docs/busybox_header.pod usage.h docs/busybox_footer.pod
+docs/busybox.pod : docs/busybox_header.pod applets/usage.h docs/busybox_footer.pod
        - ( cat docs/busybox_header.pod; \
-           docs/autodocifier.pl usage.h; \
+           docs/autodocifier.pl applets/usage.h; \
            cat docs/busybox_footer.pod ) > docs/busybox.pod
 
 docs/BusyBox.txt: docs/busybox.pod
@@ -340,86 +284,89 @@ docs/busybox/busyboxdocumentation.html: docs/busybox.sgml
        - mkdir -p docs
        (cd docs/busybox.lineo.com; sgmltools -b html ../busybox.sgml)
 
+# The nifty new buildsystem stuff
+scripts/mkdep: scripts/mkdep.c
+       $(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c
 
-busybox: $(PWD_LIB) $(LIBBB_LIB) $(OBJECTS) 
-       $(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBBB_LIB) $(PWD_LIB) $(LIBRARIES)
-       $(STRIP)
+scripts/split-include: scripts/split-include.c
+       $(HOSTCC) $(HOSTCFLAGS) -o scripts/split-include scripts/split-include.c
 
-# Without VPATH, rule expands to "/bin/sh busybox.mkll Config.h applets.h"
-# but with VPATH, some or all of those file names are resolved to the
-# directories in which they live.
-busybox.links: busybox.mkll Config.h applets.h
-       - $(SHELL) $^ >$@
+dep-files: scripts/mkdep #archdep
+       rm -f .depend .hdepend
+       scripts/mkdep -I $(TOPDIR)/include -- `find $(TOPDIR) -name \*.c -print` >> .depend
+       scripts/mkdep -I $(TOPDIR)/include -- `find $(TOPDIR) -name \*.h -print` >> .hdepend
+       $(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS)) _FASTDEP_ALL_SUB_DIRS="$(SUBDIRS)"
 
-nfsmount.o cmdedit.o: %.o: %.h
-ash.o hush.o lash.o msh.o: cmdedit.h
-$(OBJECTS): %.o: %.c Config.h busybox.h applets.h Makefile
-ifeq ($(strip $(BB_SRC_DIR)),)
-       $(CC) $(CFLAGS) -I. $(patsubst %,-I%,$(subst :, ,$(BB_SRC_DIR))) -c $< -o $*.o
-else
-       $(CC) $(CFLAGS) -I- -I. $(patsubst %,-I%,$(subst :, ,$(BB_SRC_DIR))) -c $< -o $*.o
-endif
+depend dep: dep-files
+       @ echo -e "\n\nNow run 'make' to build BusyBox\n\n"
 
-$(PWD_OBJS): %.o: %.c Config.h busybox.h applets.h Makefile
-       - mkdir -p $(PWD_GRP)
-       $(CC) $(CFLAGS) $(PWD_CFLAGS) -c $< -o $*.o
+CONFIG_SHELL := ${shell if [ -x "$$BASH" ]; then echo $$BASH; \
+       else if [ -x /bin/bash ]; then echo /bin/bash; \
+       else echo sh; fi ; fi}
 
-$(LIBBB_OBJS): %.o: %.c Config.h busybox.h applets.h Makefile libbb/libbb.h
-       - mkdir -p $(LIBBB)
-       $(CC) $(CFLAGS) $(LIBBB_CFLAGS) -c $< -o $*.o
+include/config/MARKER: scripts/split-include include/config.h
+       scripts/split-include include/config.h include/config
+       @ touch include/config/MARKER
 
-$(LIBBB_MOBJ): $(LIBBB_MSRC)
-       - mkdir -p $(LIBBB)
-       $(CC) $(CFLAGS) $(LIBBB_CFLAGS) -DL_$(patsubst libbb/%,%,$*) -c $< -o $*.o
+menuconfig:
+       $(MAKE) -C scripts/lxdialog all
+       $(CONFIG_SHELL) scripts/Menuconfig sysdeps/$(TARGET_OS)/config.in
 
-$(LIBBB_AROBJS): $(LIBBB_ARCSRC)
-       - mkdir -p $(LIBBB)
-       $(CC) $(CFLAGS) $(LIBBB_CFLAGS) -DL_$(patsubst libbb/%,%,$*) -c $< -o $*.o
+config:
+       $(CONFIG_SHELL) scripts/Configure sysdeps/$(TARGET_OS)/config.in
 
-libpwd.a: $(PWD_OBJS)
-       $(AR) $(ARFLAGS) $@ $^
+oldconfig:
+       $(CONFIG_SHELL) scripts/Configure -d sysdeps/$(TARGET_OS)/config.in
 
-libbb.a:  $(LIBBB_MOBJ) $(LIBBB_AROBJS) $(LIBBB_OBJS)
-       $(AR) $(ARFLAGS) $@ $^
 
-usage.o: usage.h
+ifdef CONFIGURATION
+..$(CONFIGURATION):
+       @echo
+       @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
+       @echo
+       $(MAKE) $(CONFIGURATION)
+       @echo
+       @echo "Successful. Try re-making (ignore the error that follows)"
+       @echo
+       exit 1
 
-libbb/loop.o: libbb/loop.h
+dummy:
 
-libbb/loop.h: mk_loop_h.sh
-       @ $(SHELL) $< > $@
+else
 
+dummy:
+
+endif
+
+include Rules.mak
+
+# Testing...
 test tests:
        # old way of doing it
        #cd tests && $(MAKE) all
        # new way of doing it
        cd tests && ./tester.sh
 
+# Cleanup
 clean:
-       - cd tests && $(MAKE) clean
+       - $(MAKE) -C tests clean
+       - $(MAKE) -C scripts/lxdialog clean
        - rm -f docs/BusyBox.txt docs/BusyBox.1 docs/BusyBox.html \
            docs/busybox.lineo.com/BusyBox.html
        - rm -f docs/busybox.txt docs/busybox.dvi docs/busybox.ps \
-           docs/busybox.pdf docs/busybox.lineo.com/busybox.html
-       - rm -f multibuild.log Config.h.orig *.gdb *.elf
-       - rm -rf docs/busybox _install libpwd.a libbb.a pod2htm*
-       - rm -f busybox.links libbb/loop.h *~ slist.mk core applet_source_list
+           docs/busybox.pdf docs/busybox.lineo.com/busybox.html \
+           docs/busybox _install pod2htm* *.gdb *.elf *~ core
+       - rm -f busybox.links libbb/loop.h .config.old .hdepend
+       - rm -f scripts/split-include scripts/mkdep .*config.log
+       - rm -rf include/config include/config.h
+       - find -name .\*.flags -o -name .depend -exec rm -f {} \;
        - find -name \*.o -exec rm -f {} \;
+       - find -name \*.a -exec rm -f {} \;
 
 distclean: clean
-       - rm -f busybox applet_source_list
+       - rm -f busybox 
        - cd tests && $(MAKE) distclean
 
-install: install.sh busybox busybox.links
-       $(SHELL) $< $(PREFIX)
-
-install-hardlinks: install.sh busybox busybox.links
-       $(SHELL) $< $(PREFIX) --hardlinks
-
-debug_pristine:
-       @ echo VPATH=\"$(VPATH)\"
-       @ echo OBJECTS=\"$(OBJECTS)\"
-
 dist release: distclean doc
        cd ..;                                  \
        rm -rf busybox-$(VERSION);              \
@@ -437,6 +384,8 @@ dist release: distclean doc
                                                \
        tar -cvzf busybox-$(VERSION).tar.gz busybox-$(VERSION)/;
 
+
+
 .PHONY: tags
 tags:
        ctags -R .
diff --git a/README b/README
index b45ef57..4fbc763 100644 (file)
--- a/README
+++ b/README
@@ -82,7 +82,7 @@ top of ash.c as well, so check those out if you want to tweak things.
 Getting help:
 
 When you find you need help, you can check out the BusyBox mailing list
-archives at http://opensource.lineo.com/lists/busybox/ or even join
+archives at http://oss.lineo.com/lists/busybox/ or even join
 the mailing list if you are interested.
 
 ----------------
@@ -130,23 +130,18 @@ Source for the latest released version can always be downloaded from
 CVS:
 
 BusyBox now has its own publicly browsable CVS tree at:
-    http://opensource.lineo.com/cgi-bin/cvsweb/busybox/
+    http://oss.lineo.com/cgi-bin/cvsweb/busybox/
 
 Anonymous CVS access is available.  For instructions, check out:
-    http://opensource.lineo.com/cvs_anon.html
+    http://oss.lineo.com/cvs_anon.html
 
 For those that are actively contributing there is even CVS write access:
-    http://opensource.lineo.com/cvs_write.html
+    http://oss.lineo.com/cvs_write.html
 
 ----------------
 
 Please feed suggestions, bug reports, insults, and bribes back to:
        Erik Andersen 
-       <andersen@lineo.com>
+       <andersen@codepoet.org>
        <andersee@debian.org>
-       <andersee@codepoet.org>
-
-<blatant plug>
-Many thanks to go to Lineo for paying me to work on busybox. 
-</blatant plug>
 
diff --git a/addgroup.c b/addgroup.c
deleted file mode 100644 (file)
index 3d93201..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * addgroup - add users to /etc/passwd and /etc/shadow
- *
- *
- * Copyright (C) 1999 by Lineo, inc.
- * Written by John Beppu <beppu@lineo.com>
- *
- * 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 <errno.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include "busybox.h"
-#include "pwd_grp/pwd.h"
-#include "pwd_grp/grp.h"
-
-#define GROUP_FILE      "/etc/group"
-#define SHADOW_FILE            "/etc/gshadow"
-
-
-/* structs __________________________ */
-
-/* data _____________________________ */
-
-/* defaults : should this be in an external file? */
-static char *default_passwd = "x";
-
-
-/* make sure gr_name isn't taken, make sure gid is kosher
- * return 1 on failure */
-static int group_study(const char *filename, struct group *g)
-{
-       FILE *etc_group;
-       gid_t desired;
-
-       struct group *grp;
-       const int max = 65000;
-
-       /* FIXME : make an fopen_wrapper */
-       etc_group = fopen(filename, "r");
-       if (!etc_group) {
-               perror_msg_and_die("%s", filename);
-       }
-
-       /* make sure gr_name isn't taken, make sure gid is kosher */
-       desired = g->gr_gid;
-       while ((grp = fgetgrent(etc_group))) {
-               if ((strcmp(grp->gr_name, g->gr_name)) == 0) {
-                       error_msg_and_die("%s: group already in use\n", g->gr_name);
-               }
-               if ((desired) && grp->gr_gid == desired) {
-                       error_msg_and_die("%d: gid has already been allocated\n",
-                                                         desired);
-               }
-               if ((grp->gr_gid > g->gr_gid) && (grp->gr_gid < max)) {
-                       g->gr_gid = grp->gr_gid;
-               }
-       }
-       fclose(etc_group);
-
-       /* gid */
-       if (desired) {
-               g->gr_gid = desired;
-       } else {
-               g->gr_gid++;
-       }
-       /* return 1; */
-       return 0;
-}
-
-/* append a new user to the passwd file */
-static int addgroup(const char *filename, char *group, gid_t gid)
-{
-       FILE *etc_group;
-       FILE *etc_gshadow;
-       char *gshadow = SHADOW_FILE;
-
-       struct group gr;
-
-       /* group:passwd:gid:userlist */
-       const char *entryfmt = "%s:%s:%d:%s\n";
-
-       /* make sure gid and group haven't already been allocated */
-       gr.gr_gid = gid;
-       gr.gr_name = group;
-       if (group_study(filename, &gr))
-               return 1;
-
-       /* add entry to group */
-       etc_group = fopen(filename, "a");
-       if (!etc_group) {
-               perror_msg_and_die("%s", filename);
-       }
-       fprintf(etc_group, entryfmt, group, default_passwd, gr.gr_gid, "");
-       fclose(etc_group);
-
-       /* add entry to gshadow if necessary */
-       if (access(gshadow, F_OK|W_OK) == 0) {
-               etc_gshadow = xfopen(gshadow, "a");
-               fprintf(etc_gshadow, "%s:!::\n", group);
-               fclose(etc_gshadow);
-       }
-
-       /* return 1; */
-       return 0;
-}
-
-/*
- * addgroup will take a login_name as its first parameter.
- *
- * gid 
- *
- * can be customized via command-line parameters.
- * ________________________________________________________________________ */
-int addgroup_main(int argc, char **argv)
-{
-       int i;
-       char opt;
-       char *group;
-       gid_t gid = 0;
-
-       /* get remaining args */
-       for (i = 1; i < argc; i++) {
-               if (argv[i][0] == '-') {
-                       opt = argv[i][1];
-                       switch (opt) {
-                       case 'h':
-                               show_usage();
-                               break;
-                       case 'g':
-                               gid = strtol(argv[++i], NULL, 10);
-                               break;
-                       default:
-                               error_msg_and_die("addgroup: invalid option -- %c\n", opt);
-                       }
-               } else {
-                       break;
-               }
-       }
-
-       if (i >= argc) {
-               show_usage();
-       } else {
-               group = argv[i];
-       }
-
-       if (geteuid() != 0) {
-               error_msg_and_die
-                       ("addgroup: Only root may add a group to the system.\n");
-       }
-
-       /* werk */
-       return addgroup(GROUP_FILE, group, gid);
-}
-
-/* $Id: addgroup.c,v 1.1 2001/08/21 16:18:59 andersen Exp $ */
diff --git a/adduser.c b/adduser.c
deleted file mode 100644 (file)
index 6bd2c25..0000000
--- a/adduser.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * adduser - add users to /etc/passwd and /etc/shadow
- *
- *
- * Copyright (C) 1999 by Lineo, inc.
- * Written by John Beppu <beppu@lineo.com>
- *
- * 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 <errno.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <shadow.h>
-#include <time.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include "busybox.h"
-#include "pwd_grp/pwd.h"
-#include "pwd_grp/grp.h"
-
-#define PASSWD_FILE     "/etc/passwd"
-#define SHADOW_FILE            "/etc/gshadow"
-
-#if 0
-#  define PASSWD_FILE "passwd"
-#  define SHADOW_FILE "shadow"
-#endif
-
-/* structs __________________________ */
-
-typedef struct {
-       uid_t u;
-       gid_t g;
-} Id;
-
-/* data _____________________________ */
-
-/* defaults : should this be in an external file? */
-static char *default_passwd = "x";
-static char *default_gecos = "Embedix User,,,";
-static char *default_home_prefix = "/home";
-static char *default_shell = "/bin/sh";
-
-/* shadow in use? */
-static int shadow_enabled = 0;
-
-/* I was doing this all over the place */
-static FILE *fopen_wrapper(const char *filename, const char *mode)
-{
-       FILE *f;
-
-       f = fopen(filename, mode);
-       if (f == NULL) {
-               fprintf(stderr, "adduser: %s: %s\n", filename, strerror(errno));
-       }
-       return f;
-}
-
-/* remix */
-/* EDR recoded such that the uid may be passed in *p */
-static int passwd_study(const char *filename, struct passwd *p)
-{
-       struct passwd *pw;
-       FILE *passwd;
-
-       const int min = 500;
-       const int max = 65000;
-
-       passwd = fopen_wrapper(filename, "r");
-       if (!passwd)
-               return 4;
-
-       /* EDR if uid is out of bounds, set to min */
-       if ((p->pw_uid > max) || (p->pw_uid < min))
-               p->pw_uid = min;
-
-       /* stuff to do:  
-        * make sure login isn't taken;
-        * find free uid and gid;
-        */
-       while ((pw = fgetpwent(passwd))) {
-               if (strcmp(pw->pw_name, p->pw_name) == 0) {
-                       /* return 0; */
-                       return 1;
-               }
-               if ((pw->pw_uid >= p->pw_uid) && (pw->pw_uid < max)
-                       && (pw->pw_uid >= min)) {
-                       p->pw_uid = pw->pw_uid + 1;
-               }
-       }
-
-       /* EDR check for an already existing gid */
-       while (getgrgid(p->pw_uid) != NULL)
-               p->pw_uid++;
-
-       /* EDR also check for an existing group definition */
-       if (getgrnam(p->pw_name) != NULL)
-               return 3;
-
-       /* EDR bounds check */
-       if ((p->pw_uid > max) || (p->pw_uid < min))
-               return 2;
-
-       /* EDR create new gid always = uid */
-       p->pw_gid = p->pw_uid;
-
-       /* return 1; */
-       return 0;
-}
-
-static void addgroup_wrapper(const char *login, gid_t gid)
-{
-       int argc = 4;
-       char *argv[] = { "addgroup", "-g", NULL, NULL };
-       char group_id[8];
-       char group_name[32];
-
-       strncpy(group_name, login, 32);
-       argv[3] = group_name;
-       sprintf(group_id, "%d", gid);
-       argv[2] = group_id;
-       addgroup_main(argc, argv);
-}
-
-static void passwd_wrapper(const char *login)
-{
-       char *prog = "passwd";
-       execlp(prog, prog, login, NULL);
-       error_msg_and_die("Failed to execute 'passwd', you must set the password for '%s' manually\n", login);
-}
-
-/*
- * pwd_to_spwd - create entries for new spwd structure
- *
- *     pwd_to_spwd() creates a new (struct spwd) containing the
- *     information in the pointed-to (struct passwd).
- */
-#define DAY (24L*3600L)
-#define WEEK (7*DAY)
-#define SCALE DAY
-static struct spwd *pwd_to_spwd(const struct passwd *pw)
-{
-       static struct spwd sp;
-
-       /*
-        * Nice, easy parts first.  The name and passwd map directly
-        * from the old password structure to the new one.
-        */
-       sp.sp_namp = pw->pw_name;
-       sp.sp_pwdp = pw->pw_passwd;
-
-       /*
-        * Defaults used if there is no pw_age information.
-        */
-       sp.sp_min = 0;
-       sp.sp_max = (10000L * DAY) / SCALE;
-       sp.sp_lstchg = time((time_t *) 0) / SCALE;
-
-       /*
-        * These fields have no corresponding information in the password
-        * file.  They are set to uninitialized values.
-        */
-       sp.sp_warn = -1;
-       sp.sp_expire = -1;
-       sp.sp_inact = -1;
-       sp.sp_flag = -1;
-
-       return &sp;
-}
-
-/* putpwent(3) remix */
-static int adduser(const char *filename, struct passwd *p)
-{
-       FILE *passwd;
-       int r;
-       FILE *shadow;
-       struct spwd *sp;
-
-       /* make sure everything is kosher and setup uid && gid */
-       passwd = fopen_wrapper(filename, "a");
-       if (passwd == NULL) {
-               /* return -1; */
-               return 1;
-       }
-       fseek(passwd, 0, SEEK_END);
-
-       /* if (passwd_study(filename, p) == 0) { */
-       r = passwd_study(filename, p);
-       if (r) {
-               if (r == 1)
-                       error_msg("%s: login already in use\n", p->pw_name);
-               else if (r == 2)
-                       error_msg("illegal uid or no uids left\n");
-               else if (r == 3)
-                       error_msg("group name %s already in use\n", p->pw_name);
-               else
-                       error_msg("generic error.\n");
-               /* return -1; */
-               return 1;
-       }
-
-       /* add to passwd */
-       if (putpwent(p, passwd) == -1) {
-               /* return -1; */
-               return 1;
-       }
-       fclose(passwd);
-
-       /* add to shadow if necessary */
-       if (shadow_enabled) {
-               shadow = fopen_wrapper(SHADOW_FILE, "a");
-               if (shadow == NULL) {
-                       /* return -1; */
-                       return 1;
-               }
-               fseek(shadow, 0, SEEK_END);
-               sp = pwd_to_spwd(p);
-               sp->sp_max = 99999;             /* debianish */
-               sp->sp_warn = 7;
-               fprintf(shadow, "%s:!:%ld:%ld:%ld:%ld:::\n",
-                               sp->sp_namp, sp->sp_lstchg, sp->sp_min, sp->sp_max,
-                               sp->sp_warn);
-               fclose(shadow);
-       }
-
-       /* add to group */
-       /* addgroup should be responsible for dealing w/ gshadow */
-       addgroup_wrapper(p->pw_name, p->pw_gid);
-
-       /* Clear the umask for this process so it doesn't
-        * * screw up the permissions on the mkdir and chown. */
-       umask(0);
-
-       /* mkdir */
-       if (mkdir(p->pw_dir, 0755)) {
-               perror_msg("%s", p->pw_dir);
-       }
-       /* Set the owner and group so it is owned by the new user. */
-       if (chown(p->pw_dir, p->pw_uid, p->pw_gid)) {
-               perror_msg("%s", p->pw_dir);
-       }
-       /* Now fix up the permissions to 2755. Can't do it before now
-        * since chown will clear the setgid bit */
-       if (chmod(p->pw_dir, 02755)) {
-               perror_msg("%s", p->pw_dir);
-       }
-       /* interactively set passwd */
-       passwd_wrapper(p->pw_name);
-
-       return 0;
-}
-
-
-/* return current uid (root is always uid == 0, right?) */
-static uid_t i_am_not_root()
-{
-       return geteuid();
-}
-
-/*
- * adduser will take a login_name as its first parameter.
- *
- * home
- * shell
- * gecos 
- *
- * can be customized via command-line parameters.
- * ________________________________________________________________________ */
-int adduser_main(int argc, char **argv)
-{
-       int i;
-       char opt;
-       char *login;
-       char *gecos;
-       char *home = NULL;
-       char *shell;
-       char path[MAXPATHLEN];
-
-       struct passwd pw;
-
-       /* init */
-       if (argc < 2) {
-               show_usage();
-       }
-       gecos = default_gecos;
-       shell = default_shell;
-
-       /* get args */
-       for (i = 1; i < argc; i++) {
-               if (argv[i][0] == '-') {
-                       opt = argv[i][1];
-                       switch (opt) {
-                       case 'h':
-                               home = argv[++i];
-                               break;
-                       case 'g':
-                               gecos = argv[++i];
-                               break;
-                       case 's':
-                               shell = argv[++i];
-                               break;
-                       default:
-                               error_msg("invalid option -- %c\n", opt);
-                               break;
-                       }
-               } else {
-                       break;
-               }
-       }
-
-       /* got root? */
-       if (i_am_not_root()) {
-               error_msg_and_die( "Only root may add a user or group to the system.\n");
-       }
-
-       /* get login */
-       if (i >= argc) {
-               error_msg_and_die( "adduser: no user specified\n");
-       }
-       login = argv[i];
-
-       /* create string for $HOME if not specified already */
-       if (!home) {
-               snprintf(path, MAXPATHLEN, "%s/%s", default_home_prefix, login);
-               path[MAXPATHLEN - 1] = 0;
-               home = path;
-       }
-       /* is /etc/shadow in use? */
-       shadow_enabled = (0 == access(SHADOW_FILE, F_OK));
-
-       /* create a passwd struct */
-       pw.pw_name = login;
-       pw.pw_passwd = default_passwd;
-       pw.pw_uid = 0;
-       pw.pw_gid = 0;
-       pw.pw_gecos = gecos;
-       pw.pw_dir = home;
-       pw.pw_shell = shell;
-
-       /* grand finale */
-       i = adduser(PASSWD_FILE, &pw);
-
-       return (i);
-}
-
-/* $Id: adduser.c,v 1.1 2001/08/21 16:18:59 andersen Exp $ */
diff --git a/adjtimex.c b/adjtimex.c
deleted file mode 100644 (file)
index e3c160d..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * adjtimex.c - read, and possibly modify, the Linux kernel `timex' variables.
- *
- * Originally written: October 1997
- * Last hack: March 2001
- * Copyright 1997, 2000, 2001 Larry Doolittle <LRDoolittle@lbl.gov>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License (Version 2,
- *  June 1991) as published by the Free Software Foundation.  At the
- *  time of writing, that license was published by the FSF with the URL
- *  http://www.gnu.org/copyleft/gpl.html, and is incorporated herein by
- *  reference.
- *
- *  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.
- *
- * This adjtimex(1) is very similar in intent to adjtimex(8) by Steven
- * Dick <ssd@nevets.oau.org> and Jim Van Zandt <jrv@vanzandt.mv.com>
- * (see http://metalab.unc.edu/pub/Linux/system/admin/time/adjtimex*).
- * That version predates this one, and is _much_ bigger and more
- * featureful.  My independently written version was very similar to
- * Steven's from the start, because they both follow the kernel timex
- * structure.  I further tweaked this version to be equivalent to Steven's
- * where possible, but I don't like getopt_long, so the actual usage
- * syntax is incompatible.
- *
- * Amazingly enough, my Red Hat 5.2 sys/timex (and sub-includes)
- * don't actually give a prototype for adjtimex(2), so building
- * this code (with -Wall) gives a warning.  Later versions of
- * glibc fix this issue.
- *
- * This program is too simple for a Makefile, just build with:
- *  gcc -Wall -O adjtimex.c -o adjtimex
- *
- * busyboxed 20 March 2001, Larry Doolittle <ldoolitt@recycle.lbl.gov>
- * It will autosense if it is built in a busybox environment, based
- * on the BB_VER preprocessor macro.
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#if __GNU_LIBRARY__ < 5
-#include <sys/timex.h>
-extern int adjtimex(struct timex *buf);
-#else
-#include <sys/timex.h>
-#endif
-
-#ifdef BB_VER
-#include "busybox.h"
-#endif
-
-static struct {int bit; char *name;} statlist[] = {
-       { STA_PLL,       "PLL"       },
-       { STA_PPSFREQ,   "PPSFREQ"   },
-       { STA_PPSTIME,   "PPSTIME"   },
-       { STA_FLL,       "FFL"       },
-       { STA_INS,       "INS"       },
-       { STA_DEL,       "DEL"       },
-       { STA_UNSYNC,    "UNSYNC"    },
-       { STA_FREQHOLD,  "FREQHOLD"  },
-       { STA_PPSSIGNAL, "PPSSIGNAL" },
-       { STA_PPSJITTER, "PPSJITTER" },
-       { STA_PPSWANDER, "PPSWANDER" },
-       { STA_PPSERROR,  "PPSERROR"  },
-       { STA_CLOCKERR,  "CLOCKERR"  },
-       { 0, NULL } };
-
-static char *ret_code_descript[] = {
-       "clock synchronized",
-       "insert leap second",
-       "delete leap second",
-       "leap second in progress",
-       "leap second has occurred",
-       "clock not synchronized" };
-
-#ifdef BB_VER
-#define main adjtimex_main
-#else
-void usage(char *prog)
-{
-       fprintf(stderr, 
-               "Usage: %s [ -q ] [ -o offset ] [ -f frequency ] [ -p timeconstant ] [ -t tick ]\n",
-               prog);
-}
-#define show_usage() usage(argv[0])
-#endif
-
-int main(int argc, char ** argv)
-{
-       struct timex txc;
-       int quiet=0;
-       int c, i, ret, sep;
-       char *descript;
-       txc.modes=0;
-       for (;;) {
-               c = getopt( argc, argv, "qo:f:p:t:");
-               if (c == EOF) break;
-               switch (c) {
-                       case 'q':
-                               quiet=1;
-                               break;
-                       case 'o':
-                               txc.offset = atoi(optarg);
-                               txc.modes |= ADJ_OFFSET_SINGLESHOT;
-                               break;
-                       case 'f':
-                               txc.freq = atoi(optarg);
-                               txc.modes |= ADJ_FREQUENCY;
-                               break;
-                       case 'p':
-                               txc.constant = atoi(optarg);
-                               txc.modes |= ADJ_TIMECONST;
-                               break;
-                       case 't':
-                               txc.tick = atoi(optarg);
-                               txc.modes |= ADJ_TICK;
-                               break;
-                       default:
-                               show_usage();
-                               exit(1);
-               }
-       }
-       if (argc != optind) { /* no valid non-option parameters */
-               show_usage();
-               exit(1);
-       }
-
-       ret = adjtimex(&txc);
-
-       if (ret < 0) perror("adjtimex");
-       
-       if (!quiet && ret>=0) {
-               printf(
-                       "    mode:         %d\n"
-                       "-o  offset:       %ld\n"
-                       "-f  frequency:    %ld\n"
-                       "    maxerror:     %ld\n"
-                       "    esterror:     %ld\n"
-                       "    status:       %d ( ",
-               txc.modes, txc.offset, txc.freq, txc.maxerror,
-               txc.esterror, txc.status);
-
-               /* representative output of next code fragment:
-                  "PLL | PPSTIME" */
-               sep=0;
-               for (i=0; statlist[i].name; i++) {
-                       if (txc.status & statlist[i].bit) {
-                               if (sep) fputs(" | ",stdout);
-                               fputs(statlist[i].name,stdout);
-                               sep=1;
-                       }
-               }
-
-               descript = "error";
-               if (ret >= 0 && ret <= 5) descript = ret_code_descript[ret];
-               printf(" )\n"
-                       "-p  timeconstant: %ld\n"
-                       "    precision:    %ld\n"
-                       "    tolerance:    %ld\n"
-                       "-t  tick:         %ld\n"
-                       "    time.tv_sec:  %ld\n"
-                       "    time.tv_usec: %ld\n"
-                       "    return value: %d (%s)\n",
-               txc.constant,
-               txc.precision, txc.tolerance, txc.tick,
-               (long)txc.time.tv_sec, (long)txc.time.tv_usec, ret, descript);
-       }
-       return (ret<0);
-}
diff --git a/applets.c b/applets.c
deleted file mode 100644 (file)
index f3e56a9..0000000
--- a/applets.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Utility routines.
- *
- * Copyright (C) tons of folks.  Tracking down who wrote what
- * isn't something I'm going to worry about...  If you wrote something
- * here, please feel free to acknowledge your work.
- *
- * 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
- *
- * Based in part on code from sash, Copyright (c) 1999 by David I. Bell 
- * Permission has been granted to redistribute this code under the GPL.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "busybox.h"
-
-#undef APPLET
-#undef APPLET_NOUSAGE
-#undef PROTOTYPES
-#include "applets.h"
-
-struct BB_applet *applet_using;
-
-/* The -1 arises because of the {0,NULL,0,-1} entry above. */
-const size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1);
-
-extern void show_usage(void)
-{
-       const char *format_string;
-       const char *usage_string = usage_messages;
-       int i;
-
-       for (i = applet_using - applets; i > 0; ) {
-               if (!*usage_string++) {
-                       --i;
-               }
-       }
-       format_string = "%s\n\nUsage: %s %s\n\n";
-       if(*usage_string == 0)
-               format_string = "%s\n\nNo help available.\n\n";
-       fprintf(stderr, format_string,
-                       full_version, applet_using->name, usage_string);
-       exit(EXIT_FAILURE);
-}
-
-static int applet_name_compare(const void *x, const void *y)
-{
-       const char *name = x;
-       const struct BB_applet *applet = y;
-
-       return strcmp(name, applet->name);
-}
-
-extern const size_t NUM_APPLETS;
-
-struct BB_applet *find_applet_by_name(const char *name)
-{
-       return bsearch(name, applets, NUM_APPLETS, sizeof(struct BB_applet),
-                       applet_name_compare);
-}
-
-void run_applet_by_name(const char *name, int argc, char **argv)
-{
-       static int recurse_level = 0;
-       extern int been_there_done_that; /* From busybox.c */
-
-       recurse_level++;
-       /* Do a binary search to find the applet entry given the name. */
-       if ((applet_using = find_applet_by_name(name)) != NULL) {
-               applet_name = applet_using->name;
-               if (argv[1] && strcmp(argv[1], "--help") == 0) {
-                       if (strcmp(applet_using->name, "busybox")==0) {
-                               if(argv[2])
-                                 applet_using = find_applet_by_name(argv[2]);
-                                else
-                                 applet_using = NULL;
-                       }
-                       if(applet_using)
-                               show_usage();
-                       been_there_done_that=1;
-                       busybox_main(0, NULL);
-               }
-               exit((*(applet_using->main)) (argc, argv));
-       }
-       /* Just in case they have renamed busybox - Check argv[1] */
-       if (recurse_level == 1) {
-               run_applet_by_name("busybox", argc, argv);
-       }
-       recurse_level--;
-}
-
-
-/* END CODE */
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/
diff --git a/applets.h b/applets.h
deleted file mode 100644 (file)
index 5ecfe3c..0000000
--- a/applets.h
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * applets.h - a listing of all busybox applets.
- *
- * If you write a new applet, you need to add an entry to this list to make
- * busybox aware of it.
- *
- * It is CRUCIAL that this listing be kept in ascii order, otherwise the binary
- * search lookup contributed by Gaute B Strokkenes stops working. If you value
- * your kneecaps, you'll be sure to *make sure* that any changes made to this
- * file result in the listing remaining in ascii order. You have been warned.
- */
-
-#undef APPLET
-#undef APPLET_ODDNAME
-#undef APPLET_NOUSAGE
-
-
-#if defined(PROTOTYPES)
-  #define APPLET(a,b,c) extern int b(int argc, char **argv);
-  #define APPLET_NOUSAGE(a,b,c) extern int b(int argc, char **argv);
-  #define APPLET_ODDNAME(a,b,c,d) extern int b(int argc, char **argv);
-  extern const char usage_messages[];
-#elif defined(MAKE_USAGE)
-  #ifdef BB_FEATURE_VERBOSE_USAGE
-    #define APPLET(a,b,c) a##_trivial_usage "\n\n" a##_full_usage "\0"
-    #define APPLET_NOUSAGE(a,b,c) "\0"
-    #define APPLET_ODDNAME(a,b,c,d) d##_trivial_usage "\n\n" d##_full_usage "\0"
-  #else
-    #define APPLET(a,b,c) a##_trivial_usage "\0"
-    #define APPLET_NOUSAGE(a,b,c) "\0"
-    #define APPLET_ODDNAME(a,b,c,d) d##_trivial_usage "\0"
-  #endif
-#elif defined(MAKE_LINKS)
-#  define APPLET(a,b,c) LINK c a
-#  define APPLET_NOUSAGE(a,b,c) LINK c a
-#  define APPLET_ODDNAME(a,b,c,d) LINK c a
-#else
-  const struct BB_applet applets[] = {
-  #define APPLET(a,b,c) {#a,b,c},
-  #define APPLET_NOUSAGE(a,b,c) {a,b,c},
-  #define APPLET_ODDNAME(a,b,c,d) {a,b,c},
-#endif
-
-
-
-#ifdef BB_TEST
-       APPLET_NOUSAGE("[", test_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_ADDGROUP
-       APPLET(addgroup, addgroup_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_ADDUSER
-       APPLET(adduser, adduser_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_ADJTIMEX
-       APPLET(adjtimex, adjtimex_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_AR
-       APPLET(ar, ar_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_ASH
-       APPLET_NOUSAGE("ash", ash_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_BASENAME
-       APPLET(basename, basename_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_BUNZIP2
-       APPLET(bunzip2, bunzip2_main, _BB_DIR_USR_BIN)
-#endif
-       APPLET_NOUSAGE("busybox", busybox_main, _BB_DIR_BIN)
-#ifdef BB_CAT
-       APPLET(cat, cat_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_CHGRP
-       APPLET(chgrp, chgrp_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_CHMOD
-       APPLET(chmod, chmod_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_CHOWN
-       APPLET(chown, chown_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_CHROOT
-       APPLET(chroot, chroot_main, _BB_DIR_USR_SBIN)
-#endif
-#ifdef BB_CHVT
-       APPLET(chvt, chvt_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_CLEAR
-       APPLET(clear, clear_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_CMP
-       APPLET(cmp, cmp_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_CP
-       APPLET(cp, cp_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_CPIO
-       APPLET(cpio, cpio_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_CUT
-       APPLET(cut, cut_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_DATE
-       APPLET(date, date_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_DC
-       APPLET(dc, dc_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_DD
-       APPLET(dd, dd_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_DEALLOCVT
-       APPLET(deallocvt, deallocvt_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_DELGROUP
-       APPLET(delgroup, delgroup_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_DELUSER
-       APPLET(deluser, deluser_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_DF
-       APPLET(df, df_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_DIRNAME
-       APPLET(dirname, dirname_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_DMESG
-       APPLET(dmesg, dmesg_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_DOS2UNIX
-       APPLET(dos2unix, dos2unix_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_DPKG
-       APPLET(dpkg, dpkg_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_DPKG_DEB
-       APPLET_ODDNAME("dpkg-deb", dpkg_deb_main, _BB_DIR_USR_BIN, dpkg_deb)
-#endif
-#ifdef BB_DU
-       APPLET(du, du_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_DUMPKMAP
-       APPLET(dumpkmap, dumpkmap_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_DUTMP
-       APPLET(dutmp, dutmp_main, _BB_DIR_USR_SBIN)
-#endif
-#ifdef BB_ECHO
-       APPLET(echo, echo_main, _BB_DIR_BIN)
-#endif
-#if defined(BB_FEATURE_GREP_EGREP_ALIAS) && defined(BB_GREP)
-       APPLET_NOUSAGE("egrep", grep_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_ENV
-       APPLET(env, env_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_EXPR
-       APPLET(expr, expr_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TRUE_FALSE
-       APPLET(false, false_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_FBSET
-       APPLET(fbset, fbset_main, _BB_DIR_USR_SBIN)
-#endif
-#ifdef BB_FDFLUSH
-       APPLET(fdflush, fdflush_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_FIND
-       APPLET(find, find_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_FREE
-       APPLET(free, free_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_FREERAMDISK
-       APPLET(freeramdisk, freeramdisk_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_FSCK_MINIX
-       APPLET_ODDNAME("fsck.minix", fsck_minix_main, _BB_DIR_SBIN, fsck_minix)
-#endif
-#ifdef BB_GETOPT
-       APPLET(getopt, getopt_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_GETTY
-       APPLET(getty, getty_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_GREP
-       APPLET(grep, grep_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_GUNZIP
-       APPLET(gunzip, gunzip_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_GZIP
-       APPLET(gzip, gzip_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_HALT
-       APPLET(halt, halt_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_HEAD
-       APPLET(head, head_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_HOSTID
-       APPLET(hostid, hostid_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_HOSTNAME
-       APPLET(hostname, hostname_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_HUSH
-       APPLET_NOUSAGE("hush", hush_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_ID
-       APPLET(id, id_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_IFCONFIG
-       APPLET(ifconfig, ifconfig_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_INIT
-       APPLET(init, init_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_INSMOD
-       APPLET(insmod, insmod_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_KILL
-       APPLET(kill, kill_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_KILLALL
-       APPLET(killall, kill_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_KLOGD
-       APPLET(klogd, klogd_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_LASH
-       APPLET(lash, lash_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_LENGTH
-       APPLET(length, length_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_FEATURE_LINUXRC
-       APPLET_NOUSAGE("linuxrc", init_main, _BB_DIR_ROOT)
-#endif
-#ifdef BB_LN
-       APPLET(ln, ln_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_LOADACM
-       APPLET(loadacm, loadacm_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_LOADFONT
-       APPLET(loadfont, loadfont_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_LOADKMAP
-       APPLET(loadkmap, loadkmap_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_LOGGER
-       APPLET(logger, logger_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_LOGNAME
-       APPLET(logname, logname_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_LOGREAD
-       APPLET(logread, logread_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_LS
-       APPLET(ls, ls_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_LSMOD
-       APPLET(lsmod, lsmod_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_MAKEDEVS
-       APPLET(makedevs, makedevs_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_MD5SUM
-       APPLET(md5sum, md5sum_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_MKDIR
-       APPLET(mkdir, mkdir_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_MKFIFO
-       APPLET(mkfifo, mkfifo_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_MKFS_MINIX
-       APPLET_ODDNAME("mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN, mkfs_minix)
-#endif
-#ifdef BB_MKNOD
-       APPLET(mknod, mknod_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_MKSWAP
-       APPLET(mkswap, mkswap_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_MKTEMP
-       APPLET(mktemp, mktemp_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_MODPROBE
-       APPLET(modprobe, modprobe_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_MORE
-       APPLET(more, more_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_MOUNT
-       APPLET(mount, mount_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_MSH
-       APPLET_NOUSAGE("msh", msh_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_MT
-       APPLET(mt, mt_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_MV
-       APPLET(mv, mv_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_NC
-       APPLET(nc, nc_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_NSLOOKUP
-       APPLET(nslookup, nslookup_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_PIDOF
-       APPLET(pidof, pidof_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_PING
-       APPLET(ping, ping_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_PIVOT_ROOT
-       APPLET(pivot_root, pivot_root_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_POWEROFF
-       APPLET(poweroff, poweroff_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_PRINTF
-       APPLET(printf, printf_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_PS
-       APPLET(ps, ps_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_PWD
-       APPLET(pwd, pwd_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_RDATE
-       APPLET(rdate, rdate_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_READLINK
-       APPLET(readlink, readlink_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_REBOOT
-       APPLET(reboot, reboot_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_RENICE
-       APPLET(renice, renice_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_RESET
-       APPLET(reset, reset_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_RM
-       APPLET(rm, rm_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_RMDIR
-       APPLET(rmdir, rmdir_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_RMMOD
-       APPLET(rmmod, rmmod_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_ROUTE
-       APPLET(route, route_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_RPM2CPIO
-       APPLET(rpm2cpio, rpm2cpio_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_SED
-       APPLET(sed, sed_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_SETKEYCODES
-       APPLET(setkeycodes, setkeycodes_main, _BB_DIR_USR_BIN)
-#endif
-#if defined(BB_FEATURE_SH_IS_ASH) && defined(BB_ASH)
-       APPLET_NOUSAGE("sh", ash_main, _BB_DIR_BIN)
-#elif defined(BB_FEATURE_SH_IS_HUSH) && defined(BB_HUSH)
-       APPLET_NOUSAGE("sh", hush_main, _BB_DIR_BIN)
-#elif defined(BB_FEATURE_SH_IS_LASH) && defined(BB_LASH)
-       APPLET_NOUSAGE("sh", lash_main, _BB_DIR_BIN)
-#elif defined(BB_FEATURE_SH_IS_MSH) && defined(BB_MSH)
-       APPLET_NOUSAGE("sh", msh_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_SLEEP
-       APPLET(sleep, sleep_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_SORT
-       APPLET(sort, sort_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_START_STOP_DAEMON
-    APPLET_ODDNAME("start-stop-daemon", start_stop_daemon_main, _BB_DIR_SBIN, start_stop_daemon)
-#endif
-#ifdef BB_STTY
-       APPLET(stty, stty_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_SWAPONOFF
-       APPLET(swapoff, swap_on_off_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_SWAPONOFF
-       APPLET(swapon, swap_on_off_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_SYNC
-       APPLET(sync, sync_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_SYSLOGD
-       APPLET(syslogd, syslogd_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_TAIL
-       APPLET(tail, tail_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TAR
-       APPLET(tar, tar_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_TEE
-       APPLET(tee, tee_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TELNET
-       APPLET(telnet, telnet_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TEST
-       APPLET(test, test_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TFTP
-       APPLET(tftp, tftp_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TOUCH
-       APPLET(touch, touch_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_TR
-       APPLET(tr, tr_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TRACEROUTE
-       APPLET(traceroute, traceroute_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_TRUE_FALSE
-       APPLET(true, true_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_TTY
-       APPLET(tty, tty_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_UMOUNT
-       APPLET(umount, umount_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_UNAME
-       APPLET(uname, uname_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_UNIQ
-       APPLET(uniq, uniq_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_UNIX2DOS
-       APPLET(unix2dos, dos2unix_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_UPDATE
-       APPLET(update, update_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_UPTIME
-       APPLET(uptime, uptime_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_USLEEP
-       APPLET(usleep, usleep_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_UUDECODE
-       APPLET(uudecode, uudecode_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_UUENCODE
-       APPLET(uuencode, uuencode_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_VI
-       APPLET(vi, vi_main, _BB_DIR_BIN)
-#endif
-#ifdef BB_WATCHDOG
-       APPLET(watchdog, watchdog_main, _BB_DIR_SBIN)
-#endif
-#ifdef BB_WC
-       APPLET(wc, wc_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_WGET
-       APPLET(wget, wget_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_WHICH
-       APPLET(which, which_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_WHOAMI
-       APPLET(whoami, whoami_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_XARGS
-       APPLET(xargs, xargs_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_YES
-       APPLET(yes, yes_main, _BB_DIR_USR_BIN)
-#endif
-#ifdef BB_GUNZIP
-       APPLET(zcat, gunzip_main, _BB_DIR_BIN)
-#endif
-
-#if !defined(PROTOTYPES) && !defined(MAKE_USAGE)
-       { 0,NULL,0 }
-};
-
-#endif
-
index 33efb5d..e6e5eca 100644 (file)
@@ -5,14 +5,14 @@
 #include <errno.h>
 #include <stdlib.h>
 #include "busybox.h"
-#ifdef BB_LOCALE_SUPPORT
+#ifdef CONFIG_LOCALE_SUPPORT
 #include <locale.h>
 #endif
 
 int been_there_done_that = 0; /* Also used in applets.c */
 const char *applet_name;
 
-#ifdef BB_FEATURE_INSTALLER
+#ifdef CONFIG_FEATURE_INSTALLER
 /* 
  * directory table
  *             this should be consistent w/ the enum, busybox.h::Location,
@@ -63,7 +63,7 @@ static void install_links(const char *busybox, int use_symbolic_links)
        }
 }
 
-#endif /* BB_FEATURE_INSTALLER */
+#endif /* CONFIG_FEATURE_INSTALLER */
 
 int main(int argc, char **argv)
 {
@@ -79,8 +79,8 @@ int main(int argc, char **argv)
                        applet_name = s;
        }
 
-#ifdef BB_LOCALE_SUPPORT 
-#ifdef BB_INIT
+#ifdef CONFIG_LOCALE_SUPPORT 
+#ifdef CONFIG_INIT
        if(getpid()!=1) /* Do not set locale for `init' */
 #endif
        {
@@ -97,7 +97,7 @@ int busybox_main(int argc, char **argv)
 {
        int col = 0, len, i;
 
-#ifdef BB_FEATURE_INSTALLER    
+#ifdef CONFIG_FEATURE_INSTALLER        
        /* 
         * This style of argument parsing doesn't scale well 
         * in the event that busybox starts wanting more --options.
@@ -125,7 +125,7 @@ int busybox_main(int argc, char **argv)
                }
                return rc;
        }
-#endif /* BB_FEATURE_INSTALLER */
+#endif /* CONFIG_FEATURE_INSTALLER */
 
        argc--;
 
index 9ab0f4b..6ac4e80 100755 (executable)
@@ -5,11 +5,11 @@ export LC_CTYPE=POSIX
 
 RAW=` \
     $CC -E -dM ${1:-Config.h} | \
-    sed -n -e '/^.*BB_FEATURE.*$/d;s/^#define.*\<BB_\(.*\)\>/\1.c/gp;' \
+    sed -n -e '/^.*CONFIG_FEATURE.*$/d;s/^#define.*\<CONFIG_\(.*\)\>/\1.c/gp;' \
     | tr A-Z a-z | sort
 `
 test "${RAW}" != "" ||  exit
-if [ -d "$BB_SRC_DIR" ]; then cd $BB_SRC_DIR; fi
+if [ -d "$CONFIG_SRC_DIR" ]; then cd $CONFIG_SRC_DIR; fi
 # By running $RAW through "ls", we avoid listing
 # source files that don't exist.
 ls $RAW 2>/dev/null | tr '\n' ' '
index 5e51427..1de2966 100644 (file)
 #define deluser_full_usage \
         "Deletes user USER from the system"
 
-#ifdef BB_FEATURE_HUMAN_READABLE
+#ifdef CONFIG_FEATURE_HUMAN_READABLE
   #define USAGE_HUMAN_READABLE(a) a
   #define USAGE_NOT_HUMAN_READABLE(a)
 #else
 #define fdflush_full_usage \
        "Forces floppy disk drive to detect disk change"
 
-#ifdef BB_FEATURE_FIND_TYPE
+#ifdef CONFIG_FEATURE_FIND_TYPE
   #define USAGE_FIND_TYPE(a) a
 #else
   #define USAGE_FIND_TYPE(a)
 #endif
-#ifdef BB_FEATURE_FIND_PERM
+#ifdef CONFIG_FEATURE_FIND_PERM
   #define USAGE_FIND_PERM(a) a
 #else
   #define USAGE_FIND_PERM(a)
 #endif
-#ifdef BB_FEATURE_FIND_MTIME
+#ifdef CONFIG_FEATURE_FIND_MTIME
   #define USAGE_FIND_MTIME(a) a
 #else
   #define USAGE_FIND_MTIME(a)
        "$ id\n" \
        "uid=1000(andersen) gid=1000(andersen)\n"
 
-#ifdef BB_FEATURE_IFCONFIG_SLIP
+#ifdef CONFIG_FEATURE_IFCONFIG_SLIP
   #define USAGE_SIOCSKEEPALIVE(a) a
 #else
   #define USAGE_SIOCSKEEPALIVE(a)
 #endif
-#ifdef BB_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
+#ifdef CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
   #define USAGE_IFCONFIG_MII(a) a
 #else
   #define USAGE_IFCONFIG_MII(a)
 #endif
-#ifdef BB_FEATURE_IFCONFIG_HW
+#ifdef CONFIG_FEATURE_IFCONFIG_HW
   #define USAGE_IFCONFIG_HW(a) a
 #else
   #define USAGE_IFCONFIG_HW(a)
 #endif
-#ifdef BB_FEATURE_IFCONFIG_STATUS
+#ifdef CONFIG_FEATURE_IFCONFIG_STATUS
   #define USAGE_IFCONFIG_OPT_A(a) a
 #else
   #define USAGE_IFCONFIG_OPT_A(a)
 #define logread_full_usage \
         "Shows the messages from syslogd (using circular buffer)."
 
-#ifdef BB_FEATURE_LS_TIMESTAMPS
+#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
   #define USAGE_LS_TIMESTAMPS(a) a
 #else
   #define USAGE_LS_TIMESTAMPS(a)
 #endif
-#ifdef BB_FEATURE_LS_FILETYPES
+#ifdef CONFIG_FEATURE_LS_FILETYPES
   #define USAGE_LS_FILETYPES(a) a
 #else
   #define USAGE_LS_FILETYPES(a)
 #endif
-#ifdef BB_FEATURE_LS_FOLLOWLINKS
+#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS
   #define USAGE_LS_FOLLOWLINKS(a) a
 #else
   #define USAGE_LS_FOLLOWLINKS(a)
 #endif
-#ifdef BB_FEATURE_LS_RECURSIVE
+#ifdef CONFIG_FEATURE_LS_RECURSIVE
   #define USAGE_LS_RECURSIVE(a) a
 #else
   #define USAGE_LS_RECURSIVE(a)
 #endif
-#ifdef BB_FEATURE_LS_SORTFILES
+#ifdef CONFIG_FEATURE_LS_SORTFILES
   #define USAGE_LS_SORTFILES(a) a
 #else
   #define USAGE_LS_SORTFILES(a)
 #endif
-#ifdef BB_FEATURE_AUTOWIDTH
+#ifdef CONFIG_FEATURE_AUTOWIDTH
   #define USAGE_AUTOWIDTH(a) a
 #else
   #define USAGE_AUTOWIDTH(a)
 #define more_example_usage \
        "$ dmesg | more\n" 
 
-#ifdef BB_FEATURE_MOUNT_LOOP
+#ifdef CONFIG_FEATURE_MOUNT_LOOP
   #define USAGE_MOUNT_LOOP(a) a
 #else
   #define USAGE_MOUNT_LOOP(a)
 #endif
-#ifdef BB_FEATURE_MTAB_SUPPORT
+#ifdef CONFIG_FEATURE_MTAB_SUPPORT
   #define USAGE_MTAB(a) a
 #else
   #define USAGE_MTAB(a)
        "$ pidof init\n" \
        "1\n"
 
-#ifndef BB_FEATURE_FANCY_PING
+#ifndef CONFIG_FEATURE_FANCY_PING
 #define ping_trivial_usage "host"
 #define ping_full_usage    "Send ICMP ECHO_REQUEST packets to network hosts"
 #else
        "[2 second delay results]\n"
 
 
-#ifdef BB_FEATURE_SORT_UNIQUE
+#ifdef CONFIG_FEATURE_SORT_UNIQUE
   #define USAGE_SORT_UNIQUE(a) a
 #else
   #define USAGE_SORT_UNIQUE(a)
 #endif
-#ifdef BB_FEATURE_SORT_REVERSE
+#ifdef CONFIG_FEATURE_SORT_REVERSE
   #define USAGE_SORT_REVERSE(a) a
 #else
   #define USAGE_SORT_REVERSE(a)
        "Write all buffered filesystem blocks to disk."
 
 
-#ifdef BB_FEATURE_REMOTE_LOG
+#ifdef CONFIG_FEATURE_REMOTE_LOG
   #define USAGE_REMOTE_LOG(a) a
 #else
   #define USAGE_REMOTE_LOG(a)
        "$ syslogd -R 192.168.1.1:601\n"
 
 
-#ifndef BB_FEATURE_FANCY_TAIL
+#ifndef CONFIG_FEATURE_FANCY_TAIL
   #define USAGE_UNSIMPLE_TAIL(a)
 #else
   #define USAGE_UNSIMPLE_TAIL(a) a
        "$ tail -n 1 /etc/resolv.conf\n" \
        "nameserver 10.0.0.1\n"
 
-#ifdef BB_FEATURE_TAR_CREATE
+#ifdef CONFIG_FEATURE_TAR_CREATE
   #define USAGE_TAR_CREATE(a) a
 #else
   #define USAGE_TAR_CREATE(a)
 #endif
-#ifdef BB_FEATURE_TAR_EXCLUDE
+#ifdef CONFIG_FEATURE_TAR_EXCLUDE
   #define USAGE_TAR_EXCLUDE(a) a
 #else
   #define USAGE_TAR_EXCLUDE(a)
        "$ echo $?\n" \
        "1\n"
 
-#ifdef BB_FEATURE_TFTP_GET
+#ifdef CONFIG_FEATURE_TFTP_GET
   #define USAGE_TFTP_GET(a) a
 #else
   #define USAGE_TFTP_GET(a)
 #endif
-#ifdef BB_FEATURE_TFTP_PUT
+#ifdef CONFIG_FEATURE_TFTP_PUT
   #define USAGE_TFTP_PUT(a) a
 #else
   #define USAGE_TFTP_PUT(a)
 #endif
-#ifdef BB_FEATURE_TFTP_BLOCKSIZE
+#ifdef CONFIG_FEATURE_TFTP_BLOCKSIZE
   #define USAGE_TFTP_BS(a) a
 #else
   #define USAGE_TFTP_BS(a)
        "$ tty\n" \
        "/dev/tty2\n"
 
-#ifdef BB_FEATURE_MOUNT_FORCE
+#ifdef CONFIG_FEATURE_MOUNT_FORCE
   #define USAGE_MOUNT_FORCE(a) a
 #else
   #define USAGE_MOUNT_FORCE(a)
diff --git a/ar.c b/ar.c
deleted file mode 100644 (file)
index e02b265..0000000
--- a/ar.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Mini ar implementation for busybox 
- *
- * Copyright (C) 2000 by Glenn McGrath
- * Written by Glenn McGrath <bug1@optushome.com.au> 1 June 2000
- *             
- * Based in part on BusyBox tar, Debian dpkg-deb and GNU ar.
- *
- * 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 <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <unistd.h>
-#include "busybox.h"
-
-extern int ar_main(int argc, char **argv)
-{
-       FILE *src_stream = NULL;
-       char **extract_names = NULL;
-       char ar_magic[8];
-       int extract_function =  extract_unconditional;
-       int opt;
-       int num_of_entries = 0;
-       extern off_t archive_offset;
-
-       while ((opt = getopt(argc, argv, "ovtpx")) != -1) {
-               switch (opt) {
-               case 'o':
-                       extract_function |= extract_preserve_date;
-                       break;
-               case 'v':
-                       extract_function |= extract_verbose_list;
-                       break;
-               case 't':
-                       extract_function |= extract_list;
-                       break;
-               case 'p':
-                       extract_function |= extract_to_stdout;
-                       break;
-               case 'x':
-                       extract_function |= extract_all_to_fs;
-                       break;
-               default:
-                       show_usage();
-               }
-       }
-       /* check the src filename was specified */
-       if (optind == argc) {
-               show_usage();
-       }
-
-       src_stream = xfopen(argv[optind++], "r");
-
-       /* check ar magic */
-       fread(ar_magic, 1, 8, src_stream);
-       archive_offset = 8;
-       if (strncmp(ar_magic,"!<arch>",7) != 0) {
-               error_msg_and_die("invalid magic");
-       }
-
-       /* Create a list of files to extract */
-       while (optind < argc) {
-               extract_names = xrealloc(extract_names, sizeof(char *) * (num_of_entries + 2));
-               extract_names[num_of_entries] = xstrdup(argv[optind]);
-               num_of_entries++;
-               extract_names[num_of_entries] = NULL;
-               optind++;
-       }
-
-       unarchive(src_stream, stdout, &get_header_ar, extract_function, "./", extract_names, NULL);
-       return EXIT_SUCCESS;
-}
diff --git a/archival/Makefile b/archival/Makefile
new file mode 100644 (file)
index 0000000..66c2d0b
--- /dev/null
@@ -0,0 +1,43 @@
+# Makefile for busybox
+#
+# Copyright (C) 1999,2000,2001 by Erik Andersen <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
+#
+
+TOPDIR   :=..
+L_TARGET := archival.a
+
+obj-y           :=
+obj-n           :=
+obj-            :=
+
+obj-$(CONFIG_AR)               += ar.o
+obj-$(CONFIG_BUNZIP2)          += bunzip2.o
+obj-$(CONFIG_CPIO)             += cpio.o
+obj-$(CONFIG_DPKG)             += dpkg.o
+obj-$(CONFIG_DPKG_DEB)         += dpkg_deb.o
+obj-$(CONFIG_GUNZIP)           += gunzip.o
+obj-$(CONFIG_GZIP)             += gzip.o
+obj-$(CONFIG_RPMUNPACK)                += rpm2cpio.o
+obj-$(CONFIG_TAR)              += tar.o
+
+
+# Hand off to toplevel Rules.mak
+include $(TOPDIR)/Rules.mak
+
+clean:
+       rm -f $(L_TARGET) *.o core
+
diff --git a/archival/config.in b/archival/config.in
new file mode 100644 (file)
index 0000000..c195f24
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+mainmenu_option next_comment
+comment 'Archival Utilities'
+
+bool 'ar'          CONFIG_AR
+bool 'bunzip2'     CONFIG_BUNZIP2
+bool 'cpio'        CONFIG_CPIO
+bool 'dpkg'        CONFIG_DPKG
+bool 'dpkg_deb'            CONFIG_DPKG_DEB
+bool 'gunzip'      CONFIG_GUNZIP
+bool 'gzip'        CONFIG_GZIP
+bool 'rpm2cpio'     CONFIG_RPM2CPIO
+bool 'tar'         CONFIG_TAR
+endmenu
+
index 5c86c10..df665c1 100644 (file)
@@ -1231,7 +1231,7 @@ int gzip_main(int argc, char **argv)
                        break;
                case 'q':
                        break;
-#ifdef BB_GUNZIP
+#ifdef CONFIG_GUNZIP
                case 'd':
                        optind = 1;
                        return gunzip_main(argc, argv);
index f7a3da6..9e38eea 100644 (file)
@@ -9,8 +9,8 @@
  * ground up.  It still has remnents of the old code lying about, but it is
  * very different now (i.e., cleaner, less global variables, etc.)
  *
- * Copyright (C) 1999,2000,2001 by Lineo, inc.
- * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
+ * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
  *
  * Based in part in the tar implementation in sash
  *  Copyright (c) 1999 by David I. Bell
@@ -49,7 +49,7 @@
 #include <errno.h>
 #include "busybox.h"
 
-#ifdef BB_FEATURE_TAR_CREATE
+#ifdef CONFIG_FEATURE_TAR_CREATE
 
 /* Tar file constants  */
 # define TAR_MAGIC          "ustar"        /* ustar and a null */
@@ -395,11 +395,11 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf, void*
        if (header_name[0] == '\0')
                return TRUE;
 
-# if defined BB_FEATURE_TAR_EXCLUDE
+# if defined CONFIG_FEATURE_TAR_EXCLUDE
        if (exclude_file(tbInfo->excludeList, header_name)) {
                return SKIP;
        }
-# endif //BB_FEATURE_TAR_EXCLUDE
+# endif //CONFIG_FEATURE_TAR_EXCLUDE
 
        if (writeTarHeader(tbInfo, header_name, fileName, statbuf)==FALSE) {
                return( FALSE);
@@ -527,7 +527,7 @@ void append_file_list_to_list(char *filename, char ***name_list, int *num_of_ent
        fclose(src_stream);
 }
 
-#ifdef BB_FEATURE_TAR_EXCLUDE
+#ifdef CONFIG_FEATURE_TAR_EXCLUDE
 /*
  * Create a list of names that are in the include list AND NOT in the exclude lists
  */
@@ -626,7 +626,7 @@ int tar_main(int argc, char **argv)
 
                /* These are optional */
                /* Exclude or Include files listed in <filename>*/
-#ifdef BB_FEATURE_TAR_EXCLUDE
+#ifdef CONFIG_FEATURE_TAR_EXCLUDE
                case 'X':
                        append_file_list_to_list(optarg, &exclude_list, &exclude_list_count);
                        break;
@@ -660,7 +660,7 @@ int tar_main(int argc, char **argv)
                        }
                        extract_function |= extract_list;
                        break;
-#ifdef BB_FEATURE_TAR_GZIP
+#ifdef CONFIG_FEATURE_TAR_GZIP
                case 'z':
                        untar_funct |= untar_unzip;
                        break;
@@ -698,43 +698,43 @@ int tar_main(int argc, char **argv)
                } else {
                        src_stream = stdin;
                }
-#ifdef BB_FEATURE_TAR_GZIP
+#ifdef CONFIG_FEATURE_TAR_GZIP
                /* Get a binary tree of all the tar file headers */
                if (untar_funct & untar_unzip) {
                        uncompressed_stream = gz_open(src_stream, &gunzip_pid);
                } else
-#endif // BB_FEATURE_TAR_GZIP
+#endif // CONFIG_FEATURE_TAR_GZIP
                        uncompressed_stream = src_stream;
                
                /* extract or list archive */
                unarchive(uncompressed_stream, stdout, &get_header_tar, extract_function, dst_prefix, include_list, exclude_list);
                fclose(uncompressed_stream);
        }
-#ifdef BB_FEATURE_TAR_CREATE
+#ifdef CONFIG_FEATURE_TAR_CREATE
        /* create an archive */
        else if (untar_funct & untar_create) {
                int verboseFlag = FALSE;
 
-#ifdef BB_FEATURE_TAR_GZIP
+#ifdef CONFIG_FEATURE_TAR_GZIP
                if (untar_funct && untar_unzip) {
                        error_msg_and_die("Creation of compressed tarfile not internally support by tar, pipe to busybox gunzip");
                }
-#endif // BB_FEATURE_TAR_GZIP
+#endif // CONFIG_FEATURE_TAR_GZIP
                if (extract_function & extract_verbose_list) {
                        verboseFlag = TRUE;
                }
                writeTarFile(src_filename, verboseFlag, &argv[argc - 1], include_list);
        }
-#endif // BB_FEATURE_TAR_CREATE
+#endif // CONFIG_FEATURE_TAR_CREATE
 
        /* Cleanups */
-#ifdef BB_FEATURE_TAR_GZIP
+#ifdef CONFIG_FEATURE_TAR_GZIP
        if (untar_funct & untar_unzip) {
                fclose(src_stream);
                close(gz_fd);
                gz_close(gunzip_pid);
        }
-#endif // BB_FEATURE_TAR_GZIP
+#endif // CONFIG_FEATURE_TAR_GZIP
        if (src_filename) {
                free(src_filename);
        }
diff --git a/ash.c b/ash.c
deleted file mode 100644 (file)
index 486386a..0000000
--- a/ash.c
+++ /dev/null
@@ -1,12825 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * ash shell port for busybox
- *
- * Copyright (c) 1989, 1991, 1993, 1994
- *      The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Kenneth Almquist.
- *
- * 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
- *
- * This version of ash is adapted from the source in Debian's ash 0.3.8-5
- * package.
- *
- * Modified by Erik Andersen <andersee@debian.org> and
- * Vladimir Oleynik <dzo@simtreas.ru> to be used in busybox
- *
- *
- * Original copyright notice is retained at the end of this file.
- */
-
-
-/* These defines allow you to adjust the feature set to be compiled
- * into the ash shell.   As a rule, enabling these options will make
- * ash get bigger...   With all of these options off, ash adds about
- * 60k to busybox on an x86 system.*/
-
-
-/* Enable job control.  This allows you to run jobs in the background,
- * which is great when ash is being  used as an interactive shell, but
- * it completely useless for is all you are doing is running scripts.
- * This adds about 2.5k on an x86 system. */
-#undef JOBS
-
-/* This enables alias support in ash.  If you want to support things
- * like "alias ls='ls -l'" with ash, enable this.  This is only useful
- * when ash is used as an intractive shell.   This adds about 1.5k */
-#define ASH_ALIAS
-
-/* If you need ash to act as a full Posix shell, with full math
- * support, enable this.   This adds a bit over 2k an x86 system. */
-//#undef ASH_MATH_SUPPORT
-#define ASH_MATH_SUPPORT
-
-/* Getopts is used by shell procedures to parse positional parameters.
- * You probably want to leave this disabled, and use the busybox getopt
- * applet if you want to do this sort of thing.  There are some scripts
- * out there that use it, so it you need it, enable.  Most people will
- * leave this disabled.  This adds 1k on an x86 system. */
-#undef ASH_GETOPTS
-
-/* This allows you to override shell builtins and use whatever is on
- * the filesystem.  This is most useful when ash is acting as a
- * standalone shell.   Adds about 272 bytes. */
-#undef ASH_CMDCMD
-
-
-/* Optimize size vs speed as size */
-#define ASH_OPTIMIZE_FOR_SIZE
-
-/* Enable this to compile in extra debugging noise.  When debugging is
- * on, debugging info will be written to $HOME/trace and a quit signal
- * will generate a core dump. */
-#undef DEBUG
-
-/* These are here to work with glibc -- Don't change these... */
-#undef FNMATCH_BROKEN
-#undef GLOB_BROKEN
-#define IFS_BROKEN
-
-#include <assert.h>
-#include <stddef.h>
-#include <ctype.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <paths.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/cdefs.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/resource.h>
-#include <sys/time.h>
-#include <sys/times.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-
-#if !defined(FNMATCH_BROKEN)
-#include <fnmatch.h>
-#endif
-#if !defined(GLOB_BROKEN)
-#include <glob.h>
-#endif
-
-#ifdef JOBS
-#include <termios.h>
-#endif
-
-#include "busybox.h"
-#include "cmdedit.h"
-
-/*
- * This file was generated by the mksyntax program.
- */
-
-/* Syntax classes */
-#define CWORD 0                 /* character is nothing special */
-#define CNL 1                   /* newline character */
-#define CBACK 2                 /* a backslash character */
-#define CSQUOTE 3               /* single quote */
-#define CDQUOTE 4               /* double quote */
-#define CENDQUOTE 5             /* a terminating quote */
-#define CBQUOTE 6               /* backwards single quote */
-#define CVAR 7                  /* a dollar sign */
-#define CENDVAR 8               /* a '}' character */
-#define CLP 9                   /* a left paren in arithmetic */
-#define CRP 10                  /* a right paren in arithmetic */
-#define CENDFILE 11             /* end of file */
-#define CCTL 12                 /* like CWORD, except it must be escaped */
-#define CSPCL 13                /* these terminate a word */
-#define CIGN 14                 /* character should be ignored */
-
-#define SYNBASE 130
-#define PEOF -130
-
-#define PEOA -129
-
-#define TEOF 0
-#define TNL 1
-#define TREDIR 2
-#define TWORD 3
-#define TASSIGN 4
-#define TSEMI 5
-#define TBACKGND 6
-#define TAND 7
-#define TOR 8
-#define TPIPE 9
-#define TLP 10
-#define TRP 11
-#define TENDCASE 12
-#define TENDBQUOTE 13
-#define TNOT 14
-#define TCASE 15
-#define TDO 16
-#define TDONE 17
-#define TELIF 18
-#define TELSE 19
-#define TESAC 20
-#define TFI 21
-#define TFOR 22
-#define TIF 23
-#define TIN 24
-#define TTHEN 25
-#define TUNTIL 26
-#define TWHILE 27
-#define TBEGIN 28
-#define TEND 29
-
-
-
-/* control characters in argument strings */
-#define CTLESC '\201'
-#define CTLVAR '\202'
-#define CTLENDVAR '\203'
-#define CTLBACKQ '\204'
-#define CTLQUOTE 01             /* ored with CTLBACKQ code if in quotes */
-/*      CTLBACKQ | CTLQUOTE == '\205' */
-#define CTLARI  '\206'
-#define CTLENDARI '\207'
-#define CTLQUOTEMARK '\210'
-
-
-#define is_digit(c)     ((c)>='0' && (c)<='9')
-#define is_name(c)      (((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalpha((unsigned char) (c))))
-#define is_in_name(c)   (((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalnum((unsigned char) (c))))
-
-/*
- * is_special(c) evaluates to 1 for c in "!#$*-0123456789?@"; 0 otherwise
- * (assuming ascii char codes, as the original implementation did)
- */
-#define is_special(c) \
-    ( (((unsigned int)c) - 33 < 32) \
-                        && ((0xc1ff920dUL >> (((unsigned int)c) - 33)) & 1))
-
-#define digit_val(c)    ((c) - '0')
-
-
-#define _DIAGASSERT(x)
-
-
-
-#define S_DFL 1                 /* default signal handling (SIG_DFL) */
-#define S_CATCH 2               /* signal is caught */
-#define S_IGN 3                 /* signal is ignored (SIG_IGN) */
-#define S_HARD_IGN 4            /* signal is ignored permenantly */
-#define S_RESET 5               /* temporary - to reset a hard ignored sig */
-
-
-/* variable substitution byte (follows CTLVAR) */
-#define VSTYPE  0x0f            /* type of variable substitution */
-#define VSNUL   0x10            /* colon--treat the empty string as unset */
-#define VSQUOTE 0x80            /* inside double quotes--suppress splitting */
-
-/* values of VSTYPE field */
-#define VSNORMAL        0x1             /* normal variable:  $var or ${var} */
-#define VSMINUS         0x2             /* ${var-text} */
-#define VSPLUS          0x3             /* ${var+text} */
-#define VSQUESTION      0x4             /* ${var?message} */
-#define VSASSIGN        0x5             /* ${var=text} */
-#define VSTRIMLEFT      0x6             /* ${var#pattern} */
-#define VSTRIMLEFTMAX   0x7             /* ${var##pattern} */
-#define VSTRIMRIGHT     0x8             /* ${var%pattern} */
-#define VSTRIMRIGHTMAX  0x9             /* ${var%%pattern} */
-#define VSLENGTH        0xa             /* ${#var} */
-
-/* flags passed to redirect */
-#define REDIR_PUSH 01           /* save previous values of file descriptors */
-#define REDIR_BACKQ 02          /* save the command output to pipe */
-
-/*
- * BSD setjmp saves the signal mask, which violates ANSI C and takes time,
- * so we use _setjmp instead.
- */
-
-#if defined(BSD)
-#define setjmp(jmploc)  _setjmp(jmploc)
-#define longjmp(jmploc, val)    _longjmp(jmploc, val)
-#endif
-
-/*
- * Most machines require the value returned from malloc to be aligned
- * in some way.  The following macro will get this right on many machines.
- */
-
-#ifndef ALIGN
-union align {
-       int i;
-       char *cp;
-};
-
-#define ALIGN(nbytes)   (((nbytes) + sizeof(union align) - 1) & ~(sizeof(union align) - 1))
-#endif
-
-#ifdef BB_LOCALE_SUPPORT
-#include <locale.h>
-static void change_lc_all(const char *value);
-static void change_lc_ctype(const char *value);
-#endif
-
-/*
- * These macros allow the user to suspend the handling of interrupt signals
- * over a period of time.  This is similar to SIGHOLD to or sigblock, but
- * much more efficient and portable.  (But hacking the kernel is so much
- * more fun than worrying about efficiency and portability. :-))
- */
-
-static void onint (void);
-static volatile int suppressint;
-static volatile int intpending;
-
-#define INTOFF suppressint++
-#ifndef ASH_OPTIMIZE_FOR_SIZE
-#define INTON { if (--suppressint == 0 && intpending) onint(); }
-#define FORCEINTON {suppressint = 0; if (intpending) onint();}
-#else
-static void __inton (void);
-static void forceinton (void);
-#define INTON __inton()
-#define FORCEINTON forceinton()
-#endif
-
-#define CLEAR_PENDING_INT intpending = 0
-#define int_pending() intpending
-
-
-typedef void *pointer;
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
-static inline pointer  ckmalloc (int sz)          { return xmalloc(sz);     }
-static inline pointer  ckrealloc(void *p, int sz) { return xrealloc(p, sz); }
-static inline char *   savestr  (const char *s)   { return xstrdup(s);      }
-
-static pointer stalloc (int);
-static void stunalloc (pointer);
-static void ungrabstackstr (char *, char *);
-static char * growstackstr(void);
-static char * makestrspace(size_t newlen);
-static char *sstrdup (const char *);
-
-/*
- * Parse trees for commands are allocated in lifo order, so we use a stack
- * to make this more efficient, and also to avoid all sorts of exception
- * handling code to handle interrupts in the middle of a parse.
- *
- * The size 504 was chosen because the Ultrix malloc handles that size
- * well.
- */
-
-#define MINSIZE 504             /* minimum size of a block */
-
-
-struct stack_block {
-       struct stack_block *prev;
-       char space[MINSIZE];
-};
-
-static struct stack_block stackbase;
-static struct stack_block *stackp = &stackbase;
-static struct stackmark *markp;
-static char *stacknxt = stackbase.space;
-static int stacknleft = MINSIZE;
-
-
-#define equal(s1, s2)   (strcmp(s1, s2) == 0)
-
-#define stackblock() stacknxt
-#define stackblocksize() stacknleft
-#define STARTSTACKSTR(p)        p = stackblock(), sstrnleft = stackblocksize()
-
-#define STPUTC(c, p)    (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), *p++ = (c)))
-#define CHECKSTRSPACE(n, p)     { if (sstrnleft < n) p = makestrspace(n); }
-#define STACKSTRNUL(p)  (sstrnleft == 0? (p = growstackstr(), *p = '\0') : (*p = '\0'))
-
-
-#define USTPUTC(c, p)   (--sstrnleft, *p++ = (c))
-#define STUNPUTC(p)     (++sstrnleft, --p)
-#define STTOPC(p)       p[-1]
-#define STADJUST(amount, p)     (p += (amount), sstrnleft -= (amount))
-#define grabstackstr(p) stalloc(stackblocksize() - sstrnleft)
-
-#define ckfree(p)       free((pointer)(p))
-
-
-#ifdef DEBUG
-#define TRACE(param)    trace param
-static void trace (const char *, ...);
-static void trargs (char **);
-static void showtree (union node *);
-static void trputc (int);
-static void trputs (const char *);
-static void opentrace (void);
-#else
-#define TRACE(param)
-#endif
-
-#define NSEMI 0
-#define NCMD 1
-#define NPIPE 2
-#define NREDIR 3
-#define NBACKGND 4
-#define NSUBSHELL 5
-#define NAND 6
-#define NOR 7
-#define NIF 8
-#define NWHILE 9
-#define NUNTIL 10
-#define NFOR 11
-#define NCASE 12
-#define NCLIST 13
-#define NDEFUN 14
-#define NARG 15
-#define NTO 16
-#define NFROM 17
-#define NFROMTO 18
-#define NAPPEND 19
-#define NTOOV 20
-#define NTOFD 21
-#define NFROMFD 22
-#define NHERE 23
-#define NXHERE 24
-#define NNOT 25
-
-/*
- * expandarg() flags
- */
-#define EXP_FULL        0x1     /* perform word splitting & file globbing */
-#define EXP_TILDE       0x2     /* do normal tilde expansion */
-#define EXP_VARTILDE    0x4     /* expand tildes in an assignment */
-#define EXP_REDIR       0x8     /* file glob for a redirection (1 match only) */
-#define EXP_CASE        0x10    /* keeps quotes around for CASE pattern */
-#define EXP_RECORD      0x20    /* need to record arguments for ifs breakup */
-
-
-#define NOPTS   16
-
-static char optet_vals[NOPTS];
-
-static const char * const optlist[NOPTS] = {
-       "e" "errexit",
-       "f" "noglob",
-       "I" "ignoreeof",
-       "i" "interactive",
-       "m" "monitor",
-       "n" "noexec",
-       "s" "stdin",
-       "x" "xtrace",
-       "v" "verbose",
-       "V" "vi",
-       "E" "emacs",
-       "C" "noclobber",
-       "a" "allexport",
-       "b" "notify",
-       "u" "nounset",
-       "q" "quietprofile"
-};
-
-#define optent_name(optent) (optent+1)
-#define optent_letter(optent) optent[0]
-#define optent_val(optent) optet_vals[optent]
-
-#define eflag optent_val(0)
-#define fflag optent_val(1)
-#define Iflag optent_val(2)
-#define iflag optent_val(3)
-#define mflag optent_val(4)
-#define nflag optent_val(5)
-#define sflag optent_val(6)
-#define xflag optent_val(7)
-#define vflag optent_val(8)
-#define Vflag optent_val(9)
-#define Eflag optent_val(10)
-#define Cflag optent_val(11)
-#define aflag optent_val(12)
-#define bflag optent_val(13)
-#define uflag optent_val(14)
-#define qflag optent_val(15)
-
-
-/* Mode argument to forkshell.  Don't change FORK_FG or FORK_BG. */
-#define FORK_FG 0
-#define FORK_BG 1
-#define FORK_NOJOB 2
-
-
-struct nbinary {
-      int type;
-      union node *ch1;
-      union node *ch2;
-};
-
-
-struct ncmd {
-      int type;
-      int backgnd;
-      union node *assign;
-      union node *args;
-      union node *redirect;
-};
-
-
-struct npipe {
-      int type;
-      int backgnd;
-      struct nodelist *cmdlist;
-};
-
-
-struct nredir {
-      int type;
-      union node *n;
-      union node *redirect;
-};
-
-
-struct nif {
-      int type;
-      union node *test;
-      union node *ifpart;
-      union node *elsepart;
-};
-
-
-struct nfor {
-      int type;
-      union node *args;
-      union node *body;
-      char *var;
-};
-
-
-struct ncase {
-      int type;
-      union node *expr;
-      union node *cases;
-};
-
-
-struct nclist {
-      int type;
-      union node *next;
-      union node *pattern;
-      union node *body;
-};
-
-
-struct narg {
-      int type;
-      union node *next;
-      char *text;
-      struct nodelist *backquote;
-};
-
-
-struct nfile {
-      int type;
-      union node *next;
-      int fd;
-      union node *fname;
-      char *expfname;
-};
-
-
-struct ndup {
-      int type;
-      union node *next;
-      int fd;
-      int dupfd;
-      union node *vname;
-};
-
-
-struct nhere {
-      int type;
-      union node *next;
-      int fd;
-      union node *doc;
-};
-
-
-struct nnot {
-      int type;
-      union node *com;
-};
-
-
-union node {
-      int type;
-      struct nbinary nbinary;
-      struct ncmd ncmd;
-      struct npipe npipe;
-      struct nredir nredir;
-      struct nif nif;
-      struct nfor nfor;
-      struct ncase ncase;
-      struct nclist nclist;
-      struct narg narg;
-      struct nfile nfile;
-      struct ndup ndup;
-      struct nhere nhere;
-      struct nnot nnot;
-};
-
-
-struct nodelist {
-       struct nodelist *next;
-       union node *n;
-};
-
-struct backcmd {                /* result of evalbackcmd */
-       int fd;                 /* file descriptor to read from */
-       char *buf;              /* buffer */
-       int nleft;              /* number of chars in buffer */
-       struct job *jp;         /* job structure for command */
-};
-
-struct cmdentry {
-       int cmdtype;
-       union param {
-               int index;
-               union node *func;
-               const struct builtincmd *cmd;
-       } u;
-};
-
-struct strlist {
-       struct strlist *next;
-       char *text;
-};
-
-
-struct arglist {
-       struct strlist *list;
-       struct strlist **lastp;
-};
-
-struct strpush {
-       struct strpush *prev;   /* preceding string on stack */
-       char *prevstring;
-       int prevnleft;
-#ifdef ASH_ALIAS
-       struct alias *ap;       /* if push was associated with an alias */
-#endif
-       char *string;           /* remember the string since it may change */
-};
-
-struct parsefile {
-       struct parsefile *prev; /* preceding file on stack */
-       int linno;              /* current line */
-       int fd;                 /* file descriptor (or -1 if string) */
-       int nleft;              /* number of chars left in this line */
-       int lleft;              /* number of chars left in this buffer */
-       char *nextc;            /* next char in buffer */
-       char *buf;              /* input buffer */
-       struct strpush *strpush; /* for pushing strings at this level */
-       struct strpush basestrpush; /* so pushing one is fast */
-};
-
-struct stackmark {
-       struct stack_block *stackp;
-       char *stacknxt;
-       int stacknleft;
-       struct stackmark *marknext;
-};
-
-struct shparam {
-       int nparam;             /* # of positional parameters (without $0) */
-       unsigned char malloc;   /* if parameter list dynamically allocated */
-       char **p;               /* parameter list */
-       int optind;             /* next parameter to be processed by getopts */
-       int optoff;             /* used by getopts */
-};
-
-/*
- * When commands are first encountered, they are entered in a hash table.
- * This ensures that a full path search will not have to be done for them
- * on each invocation.
- *
- * We should investigate converting to a linear search, even though that
- * would make the command name "hash" a misnomer.
- */
-#define CMDTABLESIZE 31         /* should be prime */
-#define ARB 1                   /* actual size determined at run time */
-
-
-
-struct tblentry {
-       struct tblentry *next;  /* next entry in hash chain */
-       union param param;      /* definition of builtin function */
-       short cmdtype;          /* index identifying command */
-       char rehash;            /* if set, cd done since entry created */
-       char cmdname[ARB];      /* name of command */
-};
-
-
-static struct tblentry *cmdtable[CMDTABLESIZE];
-static int builtinloc = -1;             /* index in path of %builtin, or -1 */
-static int exerrno = 0;                 /* Last exec error */
-
-
-static void tryexec (char *, char **, char **);
-static void printentry (struct tblentry *, int);
-static void clearcmdentry (int);
-static struct tblentry *cmdlookup (const char *, int);
-static void delete_cmd_entry (void);
-static int path_change (const char *, int *);
-
-
-static void flushall (void);
-static void out2fmt (const char *, ...)
-    __attribute__((__format__(__printf__,1,2)));
-static int xwrite (int, const char *, int);
-
-static inline void outstr (const char *p, FILE *file) { fputs(p, file); }
-static void out1str(const char *p) { outstr(p, stdout); }
-static void out2str(const char *p) { outstr(p, stderr); }
-
-#ifndef ASH_OPTIMIZE_FOR_SIZE
-#define out2c(c)        putc((c), stderr)
-#else
-static void out2c(int c)           { putc(c, stderr); }
-#endif
-
-
-#ifdef ASH_OPTIMIZE_FOR_SIZE
-#define USE_SIT_FUNCTION
-#endif
-
-/* number syntax index */
-#define  BASESYNTAX  0                  /* not in quotes */
-#define  DQSYNTAX    1                  /* in double quotes */
-#define  SQSYNTAX    2                  /* in single quotes */
-#define  ARISYNTAX   3                  /* in arithmetic */
-
-static const char S_I_T[][4] = {
-  /*  0 */  { CSPCL,    CIGN,      CIGN,      CIGN     },   /* PEOA */
-  /*  1 */  { CSPCL,    CWORD,     CWORD,     CWORD    },   /* ' ' */
-  /*  2 */  { CNL,      CNL,       CNL,       CNL      },   /* \n */
-  /*  3 */  { CWORD,    CCTL,      CCTL,      CWORD    },   /* !*-/:=?[]~ */
-  /*  4 */  { CDQUOTE,  CENDQUOTE, CWORD,     CDQUOTE  },   /* '"' */
-  /*  5 */  { CVAR,     CVAR,      CWORD,     CVAR     },   /* $ */
-  /*  6 */  { CSQUOTE,  CWORD,     CENDQUOTE, CSQUOTE  },   /* "'" */
-  /*  7 */  { CSPCL,    CWORD,     CWORD,     CLP      },   /* ( */
-  /*  8 */  { CSPCL,    CWORD,     CWORD,     CRP      },   /* ) */
-  /*  9 */  { CBACK,    CBACK,     CCTL,      CBACK    },   /* \ */
-  /* 10 */  { CBQUOTE,  CBQUOTE,   CWORD,     CBQUOTE  },   /* ` */
-  /* 11 */  { CENDVAR,  CENDVAR,   CWORD,     CENDVAR  },   /* } */
-#ifndef USE_SIT_FUNCTION
-  /* 12 */  { CENDFILE, CENDFILE,  CENDFILE,  CENDFILE },   /* PEOF */
-  /* 13 */  { CWORD,    CWORD,     CWORD,     CWORD    },   /* 0-9A-Za-z */
-  /* 14 */  { CCTL,     CCTL,      CCTL,      CCTL     }    /* CTLESC ... */
-#endif
-};
-
-#ifdef USE_SIT_FUNCTION
-
-#define U_C(c) ((unsigned char)(c))
-
-static int SIT(int c, int syntax)
-{
-       static const char spec_symbls[]="\t\n !\"$&'()*-/:;<=>?[\\]`|}~";
-       static const char syntax_index_table [] = {
-                               1, 2, 1, 3, 4, 5, 1, 6, /* "\t\n !\"$&'" */
-                               7, 8, 3, 3, 3, 3, 1, 1, /* "()*-/:;<" */
-                               3, 1, 3, 3, 9, 3,10, 1, /* "=>?[\\]`|" */
-                               11,3 }; /* "}~" */
-       const char *s;
-       int indx;
-
-       if(c==PEOF)             /* 2^8+2 */
-               return CENDFILE;
-       if(c==PEOA)             /* 2^8+1 */
-               indx = 0;
-        else if(U_C(c)>=U_C(CTLESC) && U_C(c)<=U_C(CTLQUOTEMARK))
-               return CCTL;
-        else {
-               s = strchr(spec_symbls, c);
-               if(s==0)
-                       return CWORD;
-               indx = syntax_index_table[(s-spec_symbls)];
-       }
-       return S_I_T[indx][syntax];
-}
-
-#else  /* USE_SIT_FUNCTION */
-
-#define SIT(c, syntax) S_I_T[(int)syntax_index_table[((int)c)+SYNBASE]][syntax]
-
-#define CSPCL_CIGN_CIGN_CIGN                           0
-#define CSPCL_CWORD_CWORD_CWORD                        1
-#define CNL_CNL_CNL_CNL                                2
-#define CWORD_CCTL_CCTL_CWORD                          3
-#define CDQUOTE_CENDQUOTE_CWORD_CDQUOTE                4
-#define CVAR_CVAR_CWORD_CVAR                           5
-#define CSQUOTE_CWORD_CENDQUOTE_CSQUOTE                6
-#define CSPCL_CWORD_CWORD_CLP                          7
-#define CSPCL_CWORD_CWORD_CRP                          8
-#define CBACK_CBACK_CCTL_CBACK                         9
-#define CBQUOTE_CBQUOTE_CWORD_CBQUOTE                 10
-#define CENDVAR_CENDVAR_CWORD_CENDVAR                 11
-#define CENDFILE_CENDFILE_CENDFILE_CENDFILE           12
-#define CWORD_CWORD_CWORD_CWORD                       13
-#define CCTL_CCTL_CCTL_CCTL                           14
-
-static const char syntax_index_table[258] = {
-                /* BASESYNTAX_DQSYNTAX_SQSYNTAX_ARISYNTAX */
-  /*   0  -130 PEOF */  CENDFILE_CENDFILE_CENDFILE_CENDFILE,
-  /*   1  -129 PEOA */  CSPCL_CIGN_CIGN_CIGN,
-  /*   2  -128 0xff */  CWORD_CWORD_CWORD_CWORD,
-  /*   3  -127      */  CCTL_CCTL_CCTL_CCTL,    /* CTLQUOTEMARK */
-  /*   4  -126      */  CCTL_CCTL_CCTL_CCTL,
-  /*   5  -125      */  CCTL_CCTL_CCTL_CCTL,
-  /*   6  -124      */  CCTL_CCTL_CCTL_CCTL,
-  /*   7  -123      */  CCTL_CCTL_CCTL_CCTL,
-  /*   8  -122      */  CCTL_CCTL_CCTL_CCTL,
-  /*   9  -121      */  CCTL_CCTL_CCTL_CCTL,
-  /*  10  -120      */  CCTL_CCTL_CCTL_CCTL,    /* CTLESC */
-  /*  11  -119      */  CWORD_CWORD_CWORD_CWORD,
-  /*  12  -118      */  CWORD_CWORD_CWORD_CWORD,
-  /*  13  -117      */  CWORD_CWORD_CWORD_CWORD,
-  /*  14  -116      */  CWORD_CWORD_CWORD_CWORD,
-  /*  15  -115      */  CWORD_CWORD_CWORD_CWORD,
-  /*  16  -114      */  CWORD_CWORD_CWORD_CWORD,
-  /*  17  -113      */  CWORD_CWORD_CWORD_CWORD,
-  /*  18  -112      */  CWORD_CWORD_CWORD_CWORD,
-  /*  19  -111      */  CWORD_CWORD_CWORD_CWORD,
-  /*  20  -110      */  CWORD_CWORD_CWORD_CWORD,
-  /*  21  -109      */  CWORD_CWORD_CWORD_CWORD,
-  /*  22  -108      */  CWORD_CWORD_CWORD_CWORD,
-  /*  23  -107      */  CWORD_CWORD_CWORD_CWORD,
-  /*  24  -106      */  CWORD_CWORD_CWORD_CWORD,
-  /*  25  -105      */  CWORD_CWORD_CWORD_CWORD,
-  /*  26  -104      */  CWORD_CWORD_CWORD_CWORD,
-  /*  27  -103      */  CWORD_CWORD_CWORD_CWORD,
-  /*  28  -102      */  CWORD_CWORD_CWORD_CWORD,
-  /*  29  -101      */  CWORD_CWORD_CWORD_CWORD,
-  /*  30  -100      */  CWORD_CWORD_CWORD_CWORD,
-  /*  31   -99      */  CWORD_CWORD_CWORD_CWORD,
-  /*  32   -98      */  CWORD_CWORD_CWORD_CWORD,
-  /*  33   -97      */  CWORD_CWORD_CWORD_CWORD,
-  /*  34   -96      */  CWORD_CWORD_CWORD_CWORD,
-  /*  35   -95      */  CWORD_CWORD_CWORD_CWORD,
-  /*  36   -94      */  CWORD_CWORD_CWORD_CWORD,
-  /*  37   -93      */  CWORD_CWORD_CWORD_CWORD,
-  /*  38   -92      */  CWORD_CWORD_CWORD_CWORD,
-  /*  39   -91      */  CWORD_CWORD_CWORD_CWORD,
-  /*  40   -90      */  CWORD_CWORD_CWORD_CWORD,
-  /*  41   -89      */  CWORD_CWORD_CWORD_CWORD,
-  /*  42   -88      */  CWORD_CWORD_CWORD_CWORD,
-  /*  43   -87      */  CWORD_CWORD_CWORD_CWORD,
-  /*  44   -86      */  CWORD_CWORD_CWORD_CWORD,
-  /*  45   -85      */  CWORD_CWORD_CWORD_CWORD,
-  /*  46   -84      */  CWORD_CWORD_CWORD_CWORD,
-  /*  47   -83      */  CWORD_CWORD_CWORD_CWORD,
-  /*  48   -82      */  CWORD_CWORD_CWORD_CWORD,
-  /*  49   -81      */  CWORD_CWORD_CWORD_CWORD,
-  /*  50   -80      */  CWORD_CWORD_CWORD_CWORD,
-  /*  51   -79      */  CWORD_CWORD_CWORD_CWORD,
-  /*  52   -78      */  CWORD_CWORD_CWORD_CWORD,
-  /*  53   -77      */  CWORD_CWORD_CWORD_CWORD,
-  /*  54   -76      */  CWORD_CWORD_CWORD_CWORD,
-  /*  55   -75      */  CWORD_CWORD_CWORD_CWORD,
-  /*  56   -74      */  CWORD_CWORD_CWORD_CWORD,
-  /*  57   -73      */  CWORD_CWORD_CWORD_CWORD,
-  /*  58   -72      */  CWORD_CWORD_CWORD_CWORD,
-  /*  59   -71      */  CWORD_CWORD_CWORD_CWORD,
-  /*  60   -70      */  CWORD_CWORD_CWORD_CWORD,
-  /*  61   -69      */  CWORD_CWORD_CWORD_CWORD,
-  /*  62   -68      */  CWORD_CWORD_CWORD_CWORD,
-  /*  63   -67      */  CWORD_CWORD_CWORD_CWORD,
-  /*  64   -66      */  CWORD_CWORD_CWORD_CWORD,
-  /*  65   -65      */  CWORD_CWORD_CWORD_CWORD,
-  /*  66   -64      */  CWORD_CWORD_CWORD_CWORD,
-  /*  67   -63      */  CWORD_CWORD_CWORD_CWORD,
-  /*  68   -62      */  CWORD_CWORD_CWORD_CWORD,
-  /*  69   -61      */  CWORD_CWORD_CWORD_CWORD,
-  /*  70   -60      */  CWORD_CWORD_CWORD_CWORD,
-  /*  71   -59      */  CWORD_CWORD_CWORD_CWORD,
-  /*  72   -58      */  CWORD_CWORD_CWORD_CWORD,
-  /*  73   -57      */  CWORD_CWORD_CWORD_CWORD,
-  /*  74   -56      */  CWORD_CWORD_CWORD_CWORD,
-  /*  75   -55      */  CWORD_CWORD_CWORD_CWORD,
-  /*  76   -54      */  CWORD_CWORD_CWORD_CWORD,
-  /*  77   -53      */  CWORD_CWORD_CWORD_CWORD,
-  /*  78   -52      */  CWORD_CWORD_CWORD_CWORD,
-  /*  79   -51      */  CWORD_CWORD_CWORD_CWORD,
-  /*  80   -50      */  CWORD_CWORD_CWORD_CWORD,
-  /*  81   -49      */  CWORD_CWORD_CWORD_CWORD,
-  /*  82   -48      */  CWORD_CWORD_CWORD_CWORD,
-  /*  83   -47      */  CWORD_CWORD_CWORD_CWORD,
-  /*  84   -46      */  CWORD_CWORD_CWORD_CWORD,
-  /*  85   -45      */  CWORD_CWORD_CWORD_CWORD,
-  /*  86   -44      */  CWORD_CWORD_CWORD_CWORD,
-  /*  87   -43      */  CWORD_CWORD_CWORD_CWORD,
-  /*  88   -42      */  CWORD_CWORD_CWORD_CWORD,
-  /*  89   -41      */  CWORD_CWORD_CWORD_CWORD,
-  /*  90   -40      */  CWORD_CWORD_CWORD_CWORD,
-  /*  91   -39      */  CWORD_CWORD_CWORD_CWORD,
-  /*  92   -38      */  CWORD_CWORD_CWORD_CWORD,
-  /*  93   -37      */  CWORD_CWORD_CWORD_CWORD,
-  /*  94   -36      */  CWORD_CWORD_CWORD_CWORD,
-  /*  95   -35      */  CWORD_CWORD_CWORD_CWORD,
-  /*  96   -34      */  CWORD_CWORD_CWORD_CWORD,
-  /*  97   -33      */  CWORD_CWORD_CWORD_CWORD,
-  /*  98   -32      */  CWORD_CWORD_CWORD_CWORD,
-  /*  99   -31      */  CWORD_CWORD_CWORD_CWORD,
-  /* 100   -30      */  CWORD_CWORD_CWORD_CWORD,
-  /* 101   -29      */  CWORD_CWORD_CWORD_CWORD,
-  /* 102   -28      */  CWORD_CWORD_CWORD_CWORD,
-  /* 103   -27      */  CWORD_CWORD_CWORD_CWORD,
-  /* 104   -26      */  CWORD_CWORD_CWORD_CWORD,
-  /* 105   -25      */  CWORD_CWORD_CWORD_CWORD,
-  /* 106   -24      */  CWORD_CWORD_CWORD_CWORD,
-  /* 107   -23      */  CWORD_CWORD_CWORD_CWORD,
-  /* 108   -22      */  CWORD_CWORD_CWORD_CWORD,
-  /* 109   -21      */  CWORD_CWORD_CWORD_CWORD,
-  /* 110   -20      */  CWORD_CWORD_CWORD_CWORD,
-  /* 111   -19      */  CWORD_CWORD_CWORD_CWORD,
-  /* 112   -18      */  CWORD_CWORD_CWORD_CWORD,
-  /* 113   -17      */  CWORD_CWORD_CWORD_CWORD,
-  /* 114   -16      */  CWORD_CWORD_CWORD_CWORD,
-  /* 115   -15      */  CWORD_CWORD_CWORD_CWORD,
-  /* 116   -14      */  CWORD_CWORD_CWORD_CWORD,
-  /* 117   -13      */  CWORD_CWORD_CWORD_CWORD,
-  /* 118   -12      */  CWORD_CWORD_CWORD_CWORD,
-  /* 119   -11      */  CWORD_CWORD_CWORD_CWORD,
-  /* 120   -10      */  CWORD_CWORD_CWORD_CWORD,
-  /* 121    -9      */  CWORD_CWORD_CWORD_CWORD,
-  /* 122    -8      */  CWORD_CWORD_CWORD_CWORD,
-  /* 123    -7      */  CWORD_CWORD_CWORD_CWORD,
-  /* 124    -6      */  CWORD_CWORD_CWORD_CWORD,
-  /* 125    -5      */  CWORD_CWORD_CWORD_CWORD,
-  /* 126    -4      */  CWORD_CWORD_CWORD_CWORD,
-  /* 127    -3      */  CWORD_CWORD_CWORD_CWORD,
-  /* 128    -2      */  CWORD_CWORD_CWORD_CWORD,
-  /* 129    -1      */  CWORD_CWORD_CWORD_CWORD,
-  /* 130     0      */  CWORD_CWORD_CWORD_CWORD,
-  /* 131     1      */  CWORD_CWORD_CWORD_CWORD,
-  /* 132     2      */  CWORD_CWORD_CWORD_CWORD,
-  /* 133     3      */  CWORD_CWORD_CWORD_CWORD,
-  /* 134     4      */  CWORD_CWORD_CWORD_CWORD,
-  /* 135     5      */  CWORD_CWORD_CWORD_CWORD,
-  /* 136     6      */  CWORD_CWORD_CWORD_CWORD,
-  /* 137     7      */  CWORD_CWORD_CWORD_CWORD,
-  /* 138     8      */  CWORD_CWORD_CWORD_CWORD,
-  /* 139     9 "\t" */  CSPCL_CWORD_CWORD_CWORD,
-  /* 140    10 "\n" */  CNL_CNL_CNL_CNL,
-  /* 141    11      */  CWORD_CWORD_CWORD_CWORD,
-  /* 142    12      */  CWORD_CWORD_CWORD_CWORD,
-  /* 143    13      */  CWORD_CWORD_CWORD_CWORD,
-  /* 144    14      */  CWORD_CWORD_CWORD_CWORD,
-  /* 145    15      */  CWORD_CWORD_CWORD_CWORD,
-  /* 146    16      */  CWORD_CWORD_CWORD_CWORD,
-  /* 147    17      */  CWORD_CWORD_CWORD_CWORD,
-  /* 148    18      */  CWORD_CWORD_CWORD_CWORD,
-  /* 149    19      */  CWORD_CWORD_CWORD_CWORD,
-  /* 150    20      */  CWORD_CWORD_CWORD_CWORD,
-  /* 151    21      */  CWORD_CWORD_CWORD_CWORD,
-  /* 152    22      */  CWORD_CWORD_CWORD_CWORD,
-  /* 153    23      */  CWORD_CWORD_CWORD_CWORD,
-  /* 154    24      */  CWORD_CWORD_CWORD_CWORD,
-  /* 155    25      */  CWORD_CWORD_CWORD_CWORD,
-  /* 156    26      */  CWORD_CWORD_CWORD_CWORD,
-  /* 157    27      */  CWORD_CWORD_CWORD_CWORD,
-  /* 158    28      */  CWORD_CWORD_CWORD_CWORD,
-  /* 159    29      */  CWORD_CWORD_CWORD_CWORD,
-  /* 160    30      */  CWORD_CWORD_CWORD_CWORD,
-  /* 161    31      */  CWORD_CWORD_CWORD_CWORD,
-  /* 162    32  " " */  CSPCL_CWORD_CWORD_CWORD,
-  /* 163    33  "!" */  CWORD_CCTL_CCTL_CWORD,
-  /* 164    34  """ */  CDQUOTE_CENDQUOTE_CWORD_CDQUOTE,
-  /* 165    35  "#" */  CWORD_CWORD_CWORD_CWORD,
-  /* 166    36  "$" */  CVAR_CVAR_CWORD_CVAR,
-  /* 167    37  "%" */  CWORD_CWORD_CWORD_CWORD,
-  /* 168    38  "&" */  CSPCL_CWORD_CWORD_CWORD,
-  /* 169    39  "'" */  CSQUOTE_CWORD_CENDQUOTE_CSQUOTE,
-  /* 170    40  "(" */  CSPCL_CWORD_CWORD_CLP,
-  /* 171    41  ")" */  CSPCL_CWORD_CWORD_CRP,
-  /* 172    42  "*" */  CWORD_CCTL_CCTL_CWORD,
-  /* 173    43  "+" */  CWORD_CWORD_CWORD_CWORD,
-  /* 174    44  "," */  CWORD_CWORD_CWORD_CWORD,
-  /* 175    45  "-" */  CWORD_CCTL_CCTL_CWORD,
-  /* 176    46  "." */  CWORD_CWORD_CWORD_CWORD,
-  /* 177    47  "/" */  CWORD_CCTL_CCTL_CWORD,
-  /* 178    48  "0" */  CWORD_CWORD_CWORD_CWORD,
-  /* 179    49  "1" */  CWORD_CWORD_CWORD_CWORD,
-  /* 180    50  "2" */  CWORD_CWORD_CWORD_CWORD,
-  /* 181    51  "3" */  CWORD_CWORD_CWORD_CWORD,
-  /* 182    52  "4" */  CWORD_CWORD_CWORD_CWORD,
-  /* 183    53  "5" */  CWORD_CWORD_CWORD_CWORD,
-  /* 184    54  "6" */  CWORD_CWORD_CWORD_CWORD,
-  /* 185    55  "7" */  CWORD_CWORD_CWORD_CWORD,
-  /* 186    56  "8" */  CWORD_CWORD_CWORD_CWORD,
-  /* 187    57  "9" */  CWORD_CWORD_CWORD_CWORD,
-  /* 188    58  ":" */  CWORD_CCTL_CCTL_CWORD,
-  /* 189    59  ";" */  CSPCL_CWORD_CWORD_CWORD,
-  /* 190    60  "<" */  CSPCL_CWORD_CWORD_CWORD,
-  /* 191    61  "=" */  CWORD_CCTL_CCTL_CWORD,
-  /* 192    62  ">" */  CSPCL_CWORD_CWORD_CWORD,
-  /* 193    63  "?" */  CWORD_CCTL_CCTL_CWORD,
-  /* 194    64  "@" */  CWORD_CWORD_CWORD_CWORD,
-  /* 195    65  "A" */  CWORD_CWORD_CWORD_CWORD,
-  /* 196    66  "B" */  CWORD_CWORD_CWORD_CWORD,
-  /* 197    67  "C" */  CWORD_CWORD_CWORD_CWORD,
-  /* 198    68  "D" */  CWORD_CWORD_CWORD_CWORD,
-  /* 199    69  "E" */  CWORD_CWORD_CWORD_CWORD,
-  /* 200    70  "F" */  CWORD_CWORD_CWORD_CWORD,
-  /* 201    71  "G" */  CWORD_CWORD_CWORD_CWORD,
-  /* 202    72  "H" */  CWORD_CWORD_CWORD_CWORD,
-  /* 203    73  "I" */  CWORD_CWORD_CWORD_CWORD,
-  /* 204    74  "J" */  CWORD_CWORD_CWORD_CWORD,
-  /* 205    75  "K" */  CWORD_CWORD_CWORD_CWORD,
-  /* 206    76  "L" */  CWORD_CWORD_CWORD_CWORD,
-  /* 207    77  "M" */  CWORD_CWORD_CWORD_CWORD,
-  /* 208    78  "N" */  CWORD_CWORD_CWORD_CWORD,
-  /* 209    79  "O" */  CWORD_CWORD_CWORD_CWORD,
-  /* 210    80  "P" */  CWORD_CWORD_CWORD_CWORD,
-  /* 211    81  "Q" */  CWORD_CWORD_CWORD_CWORD,
-  /* 212    82  "R" */  CWORD_CWORD_CWORD_CWORD,
-  /* 213    83  "S" */  CWORD_CWORD_CWORD_CWORD,
-  /* 214    84  "T" */  CWORD_CWORD_CWORD_CWORD,
-  /* 215    85  "U" */  CWORD_CWORD_CWORD_CWORD,
-  /* 216    86  "V" */  CWORD_CWORD_CWORD_CWORD,
-  /* 217    87  "W" */  CWORD_CWORD_CWORD_CWORD,
-  /* 218    88  "X" */  CWORD_CWORD_CWORD_CWORD,
-  /* 219    89  "Y" */  CWORD_CWORD_CWORD_CWORD,
-  /* 220    90  "Z" */  CWORD_CWORD_CWORD_CWORD,
-  /* 221    91  "[" */  CWORD_CCTL_CCTL_CWORD,
-  /* 222    92  "\" */  CBACK_CBACK_CCTL_CBACK,
-  /* 223    93  "]" */  CWORD_CCTL_CCTL_CWORD,
-  /* 224    94  "^" */  CWORD_CWORD_CWORD_CWORD,
-  /* 225    95  "_" */  CWORD_CWORD_CWORD_CWORD,
-  /* 226    96  "`" */  CBQUOTE_CBQUOTE_CWORD_CBQUOTE,
-  /* 227    97  "a" */  CWORD_CWORD_CWORD_CWORD,
-  /* 228    98  "b" */  CWORD_CWORD_CWORD_CWORD,
-  /* 229    99  "c" */  CWORD_CWORD_CWORD_CWORD,
-  /* 230   100  "d" */  CWORD_CWORD_CWORD_CWORD,
-  /* 231   101  "e" */  CWORD_CWORD_CWORD_CWORD,
-  /* 232   102  "f" */  CWORD_CWORD_CWORD_CWORD,
-  /* 233   103  "g" */  CWORD_CWORD_CWORD_CWORD,
-  /* 234   104  "h" */  CWORD_CWORD_CWORD_CWORD,
-  /* 235   105  "i" */  CWORD_CWORD_CWORD_CWORD,
-  /* 236   106  "j" */  CWORD_CWORD_CWORD_CWORD,
-  /* 237   107  "k" */  CWORD_CWORD_CWORD_CWORD,
-  /* 238   108  "l" */  CWORD_CWORD_CWORD_CWORD,
-  /* 239   109  "m" */  CWORD_CWORD_CWORD_CWORD,
-  /* 240   110  "n" */  CWORD_CWORD_CWORD_CWORD,
-  /* 241   111  "o" */  CWORD_CWORD_CWORD_CWORD,
-  /* 242   112  "p" */  CWORD_CWORD_CWORD_CWORD,
-  /* 243   113  "q" */  CWORD_CWORD_CWORD_CWORD,
-  /* 244   114  "r" */  CWORD_CWORD_CWORD_CWORD,
-  /* 245   115  "s" */  CWORD_CWORD_CWORD_CWORD,
-  /* 246   116  "t" */  CWORD_CWORD_CWORD_CWORD,
-  /* 247   117  "u" */  CWORD_CWORD_CWORD_CWORD,
-  /* 248   118  "v" */  CWORD_CWORD_CWORD_CWORD,
-  /* 249   119  "w" */  CWORD_CWORD_CWORD_CWORD,
-  /* 250   120  "x" */  CWORD_CWORD_CWORD_CWORD,
-  /* 251   121  "y" */  CWORD_CWORD_CWORD_CWORD,
-  /* 252   122  "z" */  CWORD_CWORD_CWORD_CWORD,
-  /* 253   123  "{" */  CWORD_CWORD_CWORD_CWORD,
-  /* 254   124  "|" */  CSPCL_CWORD_CWORD_CWORD,
-  /* 255   125  "}" */  CENDVAR_CENDVAR_CWORD_CENDVAR,
-  /* 256   126  "~" */  CWORD_CCTL_CCTL_CWORD,
-  /* 257   127      */  CWORD_CWORD_CWORD_CWORD,
-};
-
-#endif  /* USE_SIT_FUNCTION */
-
-
-/* first char is indicating which tokens mark the end of a list */
-static const char *const tokname_array[] = {
-       "\1end of file",
-       "\0newline",
-       "\0redirection",
-       "\0word",
-       "\0assignment",
-       "\0;",
-       "\0&",
-       "\0&&",
-       "\0||",
-       "\0|",
-       "\0(",
-       "\1)",
-       "\1;;",
-       "\1`",
-#define KWDOFFSET 14
-       /* the following are keywords */
-       "\0!",
-       "\0case",
-       "\1do",
-       "\1done",
-       "\1elif",
-       "\1else",
-       "\1esac",
-       "\1fi",
-       "\0for",
-       "\0if",
-       "\0in",
-       "\1then",
-       "\0until",
-       "\0while",
-       "\0{",
-       "\1}",
-};
-
-static const char *tokname(int tok)
-{
-       static char buf[16];
-
-       if(tok>=TSEMI)
-               buf[0] = '"';
-       sprintf(buf+(tok>=TSEMI), "%s%c",
-                       tokname_array[tok]+1, (tok>=TSEMI ? '"' : 0));
-       return buf;
-}
-
-static int plinno = 1;          /* input line number */
-
-static int parselleft;          /* copy of parsefile->lleft */
-
-static struct parsefile basepf; /* top level input file */
-static char basebuf[BUFSIZ];    /* buffer for top level input file */
-static struct parsefile *parsefile = &basepf;  /* current input file */
-
-/*
- * NEOF is returned by parsecmd when it encounters an end of file.  It
- * must be distinct from NULL, so we use the address of a variable that
- * happens to be handy.
- */
-
-static int tokpushback;         /* last token pushed back */
-#define NEOF ((union node *)&tokpushback)
-static int checkkwd;            /* 1 == check for kwds, 2 == also eat newlines */
-
-
-static void error (const char *, ...) __attribute__((__noreturn__));
-static void exerror (int, const char *, ...) __attribute__((__noreturn__));
-static void shellexec (char **, char **, const char *, int)
-    __attribute__((noreturn));
-static void exitshell (int) __attribute__((noreturn));
-
-static int  goodname(const char *);
-static void ignoresig (int);
-static void onsig (int);
-static void dotrap (void);
-static int  decode_signal (const char *, int);
-
-static void shprocvar(void);
-static void deletefuncs(void);
-static void setparam (char **);
-static void freeparam (volatile struct shparam *);
-
-/* reasons for skipping commands (see comment on breakcmd routine) */
-#define SKIPBREAK       1
-#define SKIPCONT        2
-#define SKIPFUNC        3
-#define SKIPFILE        4
-
-/* values of cmdtype */
-#define CMDUNKNOWN -1           /* no entry in table for command */
-#define CMDNORMAL 0             /* command is an executable program */
-#define CMDBUILTIN 1            /* command is a shell builtin */
-#define CMDFUNCTION 2           /* command is a shell function */
-
-#define DO_ERR  1               /* find_command prints errors */
-#define DO_ABS  2               /* find_command checks absolute paths */
-#define DO_NOFUN        4       /* find_command ignores functions */
-#define DO_BRUTE        8       /* find_command ignores hash table */
-
-/*
- * Shell variables.
- */
-
-/* flags */
-#define VEXPORT         0x01    /* variable is exported */
-#define VREADONLY       0x02    /* variable cannot be modified */
-#define VSTRFIXED       0x04    /* variable struct is staticly allocated */
-#define VTEXTFIXED      0x08    /* text is staticly allocated */
-#define VSTACK          0x10    /* text is allocated on the stack */
-#define VUNSET          0x20    /* the variable is not set */
-#define VNOFUNC         0x40    /* don't call the callback function */
-
-
-struct var {
-       struct var *next;               /* next entry in hash list */
-       int flags;                      /* flags are defined above */
-       char *text;                     /* name=value */
-       void (*func) (const char *);
-                                       /* function to be called when  */
-                                       /* the variable gets set/unset */
-};
-
-struct localvar {
-       struct localvar *next;          /* next local variable in list */
-       struct var *vp;                 /* the variable that was made local */
-       int flags;                      /* saved flags */
-       char *text;                     /* saved text */
-};
-
-
-#if defined(__GLIBC__) && __GLIBC__ >= 2 && !defined(FNMATCH_BROKEN)
-#define rmescapes(p) _rmescapes((p), 0)
-static char *_rmescapes (char *, int);
-#else
-static void rmescapes (char *);
-#endif
-
-static int  casematch (union node *, const char *);
-static void clearredir(void);
-static void popstring(void);
-static void readcmdfile (const char *);
-
-static int number (const char *);
-static int is_number (const char *, int *num);
-static char *single_quote (const char *);
-static int nextopt (const char *);
-
-static void redirect (union node *, int);
-static void popredir (void);
-static int dup_as_newfd (int, int);
-
-static void changepath(const char *newval);
-static void getoptsreset(const char *value);
-
-
-static int parsenleft;                  /* copy of parsefile->nleft */
-static char *parsenextc;                /* copy of parsefile->nextc */
-static int rootpid;     /* pid of main shell */
-static int rootshell;   /* true if we aren't a child of the main shell */
-
-static const char spcstr[] = " ";
-static const char snlfmt[] = "%s\n";
-
-static int sstrnleft;
-static int herefd = -1;
-
-static struct localvar *localvars;
-
-static struct var vifs;
-static struct var vmail;
-static struct var vmpath;
-static struct var vpath;
-static struct var vps1;
-static struct var vps2;
-static struct var voptind;
-#ifdef BB_LOCALE_SUPPORT
-static struct var vlc_all;
-static struct var vlc_ctype;
-#endif
-
-struct varinit {
-       struct var *var;
-       int flags;
-       const char *text;
-       void (*func) (const char *);
-};
-
-static const char defpathvar[] =
-       "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
-#define defpath (defpathvar + 5)
-
-#ifdef IFS_BROKEN
-static const char defifsvar[] = "IFS= \t\n";
-#define defifs (defifsvar + 4)
-#else
-static const char defifs[] = " \t\n";
-#endif
-
-static const struct varinit varinit[] = {
-#ifdef IFS_BROKEN
-       { &vifs,        VSTRFIXED|VTEXTFIXED,           defifsvar,
-#else
-       { &vifs,        VSTRFIXED|VTEXTFIXED|VUNSET,    "IFS=",
-#endif
-         NULL },
-       { &vmail,       VSTRFIXED|VTEXTFIXED|VUNSET,    "MAIL=",
-         NULL },
-       { &vmpath,      VSTRFIXED|VTEXTFIXED|VUNSET,    "MAILPATH=",
-         NULL },
-       { &vpath,       VSTRFIXED|VTEXTFIXED,           defpathvar,
-         changepath },
-       /*
-        * vps1 depends on uid
-        */
-       { &vps2,        VSTRFIXED|VTEXTFIXED,           "PS2=> ",
-         NULL },
-       { &voptind,     VSTRFIXED|VTEXTFIXED,           "OPTIND=1",
-         getoptsreset },
-#ifdef BB_LOCALE_SUPPORT
-       { &vlc_all,     VSTRFIXED|VTEXTFIXED|VUNSET,    "LC_ALL=",
-         change_lc_all },
-       { &vlc_ctype,   VSTRFIXED|VTEXTFIXED|VUNSET,    "LC_CTYPE=",
-         change_lc_ctype },
-#endif
-       { NULL, 0,                              NULL,
-         NULL }
-};
-
-#define VTABSIZE 39
-
-static struct var *vartab[VTABSIZE];
-
-/*
- * The following macros access the values of the above variables.
- * They have to skip over the name.  They return the null string
- * for unset variables.
- */
-
-#define ifsval()        (vifs.text + 4)
-#define ifsset()        ((vifs.flags & VUNSET) == 0)
-#define mailval()       (vmail.text + 5)
-#define mpathval()      (vmpath.text + 9)
-#define pathval()       (vpath.text + 5)
-#define ps1val()        (vps1.text + 4)
-#define ps2val()        (vps2.text + 4)
-#define optindval()     (voptind.text + 7)
-
-#define mpathset()      ((vmpath.flags & VUNSET) == 0)
-
-static void initvar (void);
-static void setvar (const char *, const char *, int);
-static void setvareq (char *, int);
-static void listsetvar (struct strlist *);
-static const char *lookupvar (const char *);
-static const char *bltinlookup (const char *);
-static char **environment (void);
-static int showvarscmd (int, char **);
-static void mklocal (char *);
-static void poplocalvars (void);
-static int unsetvar (const char *);
-static int varequal (const char *, const char *);
-
-
-static char *arg0;                      /* value of $0 */
-static struct shparam shellparam;       /* current positional parameters */
-static char **argptr;                   /* argument list for builtin commands */
-static char *optionarg;                 /* set by nextopt (like getopt) */
-static char *optptr;                    /* used by nextopt */
-static char *minusc;                    /* argument to -c option */
-
-
-#ifdef ASH_ALIAS
-
-#define ALIASINUSE      1
-#define ALIASDEAD       2
-
-#define ATABSIZE 39
-
-struct alias {
-       struct alias *next;
-       char *name;
-       char *val;
-       int flag;
-};
-
-static struct alias *atab[ATABSIZE];
-
-static void setalias (char *, char *);
-static struct alias **hashalias (const char *);
-static struct alias *freealias (struct alias *);
-static struct alias **__lookupalias (const char *);
-
-static void
-setalias(name, val)
-       char *name, *val;
-{
-       struct alias *ap, **app;
-
-       app = __lookupalias(name);
-       ap = *app;
-       INTOFF;
-       if (ap) {
-               if (!(ap->flag & ALIASINUSE)) {
-                       ckfree(ap->val);
-               }
-               ap->val = savestr(val);
-               ap->flag &= ~ALIASDEAD;
-       } else {
-               /* not found */
-               ap = ckmalloc(sizeof (struct alias));
-               ap->name = savestr(name);
-               ap->val = savestr(val);
-               ap->flag = 0;
-               ap->next = 0;
-               *app = ap;
-       }
-       INTON;
-}
-
-static int
-unalias(char *name)
-{
-       struct alias **app;
-
-       app = __lookupalias(name);
-
-       if (*app) {
-               INTOFF;
-               *app = freealias(*app);
-               INTON;
-               return (0);
-       }
-
-       return (1);
-}
-
-static void
-rmaliases(void)
-{
-       struct alias *ap, **app;
-       int i;
-
-       INTOFF;
-       for (i = 0; i < ATABSIZE; i++) {
-               app = &atab[i];
-               for (ap = *app; ap; ap = *app) {
-                       *app = freealias(*app);
-                       if (ap == *app) {
-                               app = &ap->next;
-                       }
-               }
-       }
-       INTON;
-}
-
-static struct alias *
-lookupalias(const char *name, int check)
-{
-       struct alias *ap = *__lookupalias(name);
-
-       if (check && ap && (ap->flag & ALIASINUSE))
-               return (NULL);
-       return (ap);
-}
-
-static void
-printalias(const struct alias *ap) {
-       char *p;
-
-       p = single_quote(ap->val);
-       printf("alias %s=%s\n", ap->name, p);
-       stunalloc(p);
-}
-
-
-/*
- * TODO - sort output
- */
-static int
-aliascmd(int argc, char **argv)
-{
-       char *n, *v;
-       int ret = 0;
-       struct alias *ap;
-
-       if (argc == 1) {
-               int i;
-
-               for (i = 0; i < ATABSIZE; i++)
-                       for (ap = atab[i]; ap; ap = ap->next) {
-                               printalias(ap);
-                       }
-               return (0);
-       }
-       while ((n = *++argv) != NULL) {
-               if ((v = strchr(n+1, '=')) == NULL) { /* n+1: funny ksh stuff */
-                       if ((ap = *__lookupalias(n)) == NULL) {
-                               out2fmt("%s: %s not found\n", "alias", n);
-                               ret = 1;
-                       } else
-                               printalias(ap);
-               }
-               else {
-                       *v++ = '\0';
-                       setalias(n, v);
-               }
-       }
-
-       return (ret);
-}
-
-static int
-unaliascmd(int argc, char **argv)
-{
-       int i;
-
-       while ((i = nextopt("a")) != '\0') {
-               if (i == 'a') {
-                       rmaliases();
-                       return (0);
-               }
-       }
-       for (i = 0; *argptr; argptr++) {
-               if (unalias(*argptr)) {
-                       out2fmt("%s: %s not found\n", "unalias", *argptr);
-                       i = 1;
-               }
-       }
-
-       return (i);
-}
-
-static struct alias **
-hashalias(p)
-       const char *p;
-       {
-       unsigned int hashval;
-
-       hashval = *p << 4;
-       while (*p)
-               hashval+= *p++;
-       return &atab[hashval % ATABSIZE];
-}
-
-static struct alias *
-freealias(struct alias *ap) {
-       struct alias *next;
-
-       if (ap->flag & ALIASINUSE) {
-               ap->flag |= ALIASDEAD;
-               return ap;
-       }
-
-       next = ap->next;
-       ckfree(ap->name);
-       ckfree(ap->val);
-       ckfree(ap);
-       return next;
-}
-
-
-static struct alias **
-__lookupalias(const char *name) {
-       struct alias **app = hashalias(name);
-
-       for (; *app; app = &(*app)->next) {
-               if (equal(name, (*app)->name)) {
-                       break;
-               }
-       }
-
-       return app;
-}
-#endif
-
-#ifdef ASH_MATH_SUPPORT
-/* The generated file arith.c has been replaced with a custom hand
- * written implementation written by Aaron Lehmann <aaronl@vitelus.com>.
- * This is now part of libbb, so that it can be used by all the shells
- * in busybox. */
-static void expari (int);
-#endif
-
-static char *trap[NSIG];                /* trap handler commands */
-static char sigmode[NSIG - 1];  /* current value of signal */
-static char gotsig[NSIG - 1];           /* indicates specified signal received */
-static int pendingsigs;                 /* indicates some signal received */
-
-/*
- * This file was generated by the mkbuiltins program.
- */
-
-#ifdef JOBS
-static int bgcmd (int, char **);
-static int fgcmd (int, char **);
-static int killcmd (int, char **);
-#endif
-static int bltincmd (int, char **);
-static int cdcmd (int, char **);
-static int breakcmd (int, char **);
-#ifdef ASH_CMDCMD
-static int commandcmd (int, char **);
-#endif
-static int dotcmd (int, char **);
-static int evalcmd (int, char **);
-static int execcmd (int, char **);
-static int exitcmd (int, char **);
-static int exportcmd (int, char **);
-static int histcmd (int, char **);
-static int hashcmd (int, char **);
-static int helpcmd (int, char **);
-static int jobscmd (int, char **);
-static int localcmd (int, char **);
-#ifndef BB_PWD
-static int pwdcmd (int, char **);
-#endif
-static int readcmd (int, char **);
-static int returncmd (int, char **);
-static int setcmd (int, char **);
-static int setvarcmd (int, char **);
-static int shiftcmd (int, char **);
-static int trapcmd (int, char **);
-static int umaskcmd (int, char **);
-#ifdef ASH_ALIAS
-static int aliascmd (int, char **);
-static int unaliascmd (int, char **);
-#endif
-static int unsetcmd (int, char **);
-static int waitcmd (int, char **);
-static int ulimitcmd (int, char **);
-static int timescmd (int, char **);
-#ifdef ASH_MATH_SUPPORT
-static int letcmd (int, char **);
-#endif
-static int typecmd (int, char **);
-#ifdef ASH_GETOPTS
-static int getoptscmd (int, char **);
-#endif
-
-#ifndef BB_TRUE_FALSE
-static int true_main (int, char **);
-static int false_main (int, char **);
-#endif
-
-static void     setpwd (const char *, int);
-
-
-#define BUILTIN_NOSPEC  "0"
-#define BUILTIN_SPECIAL "1"
-#define BUILTIN_REGULAR "2"
-#define BUILTIN_ASSIGN  "4"
-#define BUILTIN_SPEC_ASSG  "5"
-#define BUILTIN_REG_ASSG   "6"
-
-#define IS_BUILTIN_SPECIAL(builtincmd) ((builtincmd)->name[0] & 1)
-#define IS_BUILTIN_REGULAR(builtincmd) ((builtincmd)->name[0] & 2)
-#define IS_BUILTIN_ASSIGN(builtincmd) ((builtincmd)->name[0] & 4)
-
-struct builtincmd {
-       const char *name;
-       int (*const builtinfunc) (int, char **);
-       //unsigned flags;
-};
-
-
-/* It is CRUCIAL that this listing be kept in ascii order, otherwise
- * the binary search in find_builtin() will stop working. If you value
- * your kneecaps, you'll be sure to *make sure* that any changes made
- * to this array result in the listing remaining in ascii order. You
- * have been warned.
- */
-static const struct builtincmd builtincmds[] = {
-       { BUILTIN_SPECIAL   ".", dotcmd },    /* first, see declare DOTCMD */
-       { BUILTIN_SPECIAL   ":", true_main },
-#ifdef ASH_ALIAS
-       { BUILTIN_REG_ASSG  "alias", aliascmd },
-#endif
-#ifdef JOBS
-       { BUILTIN_REGULAR   "bg", bgcmd },
-#endif
-       { BUILTIN_SPECIAL   "break", breakcmd },
-       { BUILTIN_SPECIAL   "builtin", bltincmd },
-       { BUILTIN_REGULAR   "cd", cdcmd },
-       { BUILTIN_NOSPEC    "chdir", cdcmd },
-#ifdef ASH_CMDCMD
-       { BUILTIN_REGULAR   "command", commandcmd },
-#endif
-       { BUILTIN_SPECIAL   "continue", breakcmd },
-       { BUILTIN_SPECIAL   "eval", evalcmd },
-       { BUILTIN_SPECIAL   "exec", execcmd },
-       { BUILTIN_SPECIAL   "exit", exitcmd },
-       { BUILTIN_SPEC_ASSG "export", exportcmd },
-       { BUILTIN_REGULAR   "false", false_main },
-       { BUILTIN_REGULAR   "fc", histcmd },
-#ifdef JOBS
-       { BUILTIN_REGULAR   "fg", fgcmd },
-#endif
-#ifdef ASH_GETOPTS
-       { BUILTIN_REGULAR   "getopts", getoptscmd },
-#endif
-       { BUILTIN_NOSPEC    "hash", hashcmd },
-       { BUILTIN_NOSPEC    "help", helpcmd },
-       { BUILTIN_REGULAR   "jobs", jobscmd },
-#ifdef JOBS
-       { BUILTIN_REGULAR   "kill", killcmd },
-#endif
-#ifdef ASH_MATH_SUPPORT
-       { BUILTIN_REGULAR    "let", letcmd },
-#endif
-       { BUILTIN_ASSIGN    "local", localcmd },
-#ifndef BB_PWD
-       { BUILTIN_NOSPEC    "pwd", pwdcmd },
-#endif
-       { BUILTIN_REGULAR   "read", readcmd },
-       { BUILTIN_SPEC_ASSG "readonly", exportcmd },
-       { BUILTIN_SPECIAL   "return", returncmd },
-       { BUILTIN_SPECIAL   "set", setcmd },
-       { BUILTIN_NOSPEC    "setvar", setvarcmd },
-       { BUILTIN_SPECIAL   "shift", shiftcmd },
-       { BUILTIN_SPECIAL   "times", timescmd },
-       { BUILTIN_SPECIAL   "trap", trapcmd },
-       { BUILTIN_REGULAR   "true", true_main },
-       { BUILTIN_NOSPEC    "type", typecmd },
-       { BUILTIN_NOSPEC    "ulimit", ulimitcmd },
-       { BUILTIN_REGULAR   "umask", umaskcmd },
-#ifdef ASH_ALIAS
-       { BUILTIN_REGULAR   "unalias", unaliascmd },
-#endif
-       { BUILTIN_SPECIAL   "unset", unsetcmd },
-       { BUILTIN_REGULAR   "wait", waitcmd },
-};
-#define NUMBUILTINS  (sizeof (builtincmds) / sizeof (struct builtincmd) )
-
-#define DOTCMD &builtincmds[0]
-static struct builtincmd *BLTINCMD;
-static struct builtincmd *EXECCMD;
-static struct builtincmd *EVALCMD;
-
-/* states */
-#define JOBSTOPPED 1            /* all procs are stopped */
-#define JOBDONE 2               /* all procs are completed */
-
-/*
- * A job structure contains information about a job.  A job is either a
- * single process or a set of processes contained in a pipeline.  In the
- * latter case, pidlist will be non-NULL, and will point to a -1 terminated
- * array of pids.
- */
-
-struct procstat {
-       pid_t pid;              /* process id */
-       int status;             /* status flags (defined above) */
-       char *cmd;              /* text of command being run */
-};
-
-
-static int job_warning;         /* user was warned about stopped jobs */
-
-#ifdef JOBS
-static void setjobctl(int enable);
-#else
-#define setjobctl(on)   /* do nothing */
-#endif
-
-
-struct job {
-       struct procstat ps0;    /* status of process */
-       struct procstat *ps;    /* status or processes when more than one */
-       short nprocs;           /* number of processes */
-       short pgrp;             /* process group of this job */
-       char state;             /* true if job is finished */
-       char used;              /* true if this entry is in used */
-       char changed;           /* true if status has changed */
-#ifdef JOBS
-       char jobctl;            /* job running under job control */
-#endif
-};
-
-static struct job *jobtab;      /* array of jobs */
-static int njobs;               /* size of array */
-static int backgndpid = -1;     /* pid of last background process */
-#ifdef JOBS
-static int initialpgrp;         /* pgrp of shell on invocation */
-static int curjob;              /* current job */
-static int jobctl;
-#endif
-static int intreceived;
-
-static struct job *makejob (const union node *, int);
-static int forkshell (struct job *, const union node *, int);
-static int waitforjob (struct job *);
-
-static int docd (char *, int);
-static char *getcomponent (void);
-static void updatepwd (const char *);
-static void getpwd (void);
-
-static char *padvance (const char **, const char *);
-
-static char nullstr[1];         /* zero length string */
-static char *curdir = nullstr;          /* current working directory */
-static char *cdcomppath;
-
-static int
-cdcmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       const char *dest;
-       const char *path;
-       char *p;
-       struct stat statb;
-       int print = 0;
-
-       nextopt(nullstr);
-       if ((dest = *argptr) == NULL && (dest = bltinlookup("HOME")) == NULL)
-               error("HOME not set");
-       if (*dest == '\0')
-               dest = ".";
-       if (dest[0] == '-' && dest[1] == '\0') {
-               dest = bltinlookup("OLDPWD");
-               if (!dest || !*dest) {
-                       dest = curdir;
-               }
-               print = 1;
-               if (dest)
-                       print = 1;
-               else
-                       dest = ".";
-       }
-       if (*dest == '/' || (path = bltinlookup("CDPATH")) == NULL)
-               path = nullstr;
-       while ((p = padvance(&path, dest)) != NULL) {
-               if (stat(p, &statb) >= 0 && S_ISDIR(statb.st_mode)) {
-                       if (!print) {
-                               /*
-                                * XXX - rethink
-                                */
-                               if (p[0] == '.' && p[1] == '/' && p[2] != '\0')
-                                       p += 2;
-                               print = strcmp(p, dest);
-                       }
-                       if (docd(p, print) >= 0)
-                               return 0;
-
-               }
-       }
-       error("can't cd to %s", dest);
-       /* NOTREACHED */
-}
-
-
-/*
- * Actually do the chdir.  In an interactive shell, print the
- * directory name if "print" is nonzero.
- */
-
-static int
-docd(dest, print)
-       char *dest;
-       int print;
-{
-       char *p;
-       char *q;
-       char *component;
-       struct stat statb;
-       int first;
-       int badstat;
-
-       TRACE(("docd(\"%s\", %d) called\n", dest, print));
-
-       /*
-        *  Check each component of the path. If we find a symlink or
-        *  something we can't stat, clear curdir to force a getcwd()
-        *  next time we get the value of the current directory.
-        */
-       badstat = 0;
-       cdcomppath = sstrdup(dest);
-       STARTSTACKSTR(p);
-       if (*dest == '/') {
-               STPUTC('/', p);
-               cdcomppath++;
-       }
-       first = 1;
-       while ((q = getcomponent()) != NULL) {
-               if (q[0] == '\0' || (q[0] == '.' && q[1] == '\0'))
-                       continue;
-               if (! first)
-                       STPUTC('/', p);
-               first = 0;
-               component = q;
-               while (*q)
-                       STPUTC(*q++, p);
-               if (equal(component, ".."))
-                       continue;
-               STACKSTRNUL(p);
-               if ((lstat(stackblock(), &statb) < 0)
-                   || (S_ISLNK(statb.st_mode)))  {
-                       /* print = 1; */
-                       badstat = 1;
-                       break;
-               }
-       }
-
-       INTOFF;
-       if (chdir(dest) < 0) {
-               INTON;
-               return -1;
-       }
-       updatepwd(badstat ? NULL : dest);
-       INTON;
-       if (print && iflag)
-               printf(snlfmt, curdir);
-       return 0;
-}
-
-
-/*
- * Get the next component of the path name pointed to by cdcomppath.
- * This routine overwrites the string pointed to by cdcomppath.
- */
-
-static char *
-getcomponent() {
-       char *p;
-       char *start;
-
-       if ((p = cdcomppath) == NULL)
-               return NULL;
-       start = cdcomppath;
-       while (*p != '/' && *p != '\0')
-               p++;
-       if (*p == '\0') {
-               cdcomppath = NULL;
-       } else {
-               *p++ = '\0';
-               cdcomppath = p;
-       }
-       return start;
-}
-
-
-
-/*
- * Update curdir (the name of the current directory) in response to a
- * cd command.  We also call hashcd to let the routines in exec.c know
- * that the current directory has changed.
- */
-
-static void hashcd (void);
-
-static void
-updatepwd(const char *dir)
-{
-       char *new;
-       char *p;
-       size_t len;
-
-       hashcd();                               /* update command hash table */
-
-       /*
-        * If our argument is NULL, we don't know the current directory
-        * any more because we traversed a symbolic link or something
-        * we couldn't stat().
-        */
-       if (dir == NULL || curdir == nullstr)  {
-               setpwd(0, 1);
-               return;
-       }
-       len = strlen(dir);
-       cdcomppath = sstrdup(dir);
-       STARTSTACKSTR(new);
-       if (*dir != '/') {
-               p = curdir;
-               while (*p)
-                       STPUTC(*p++, new);
-               if (p[-1] == '/')
-                       STUNPUTC(new);
-       }
-       while ((p = getcomponent()) != NULL) {
-               if (equal(p, "..")) {
-                       while (new > stackblock() && (STUNPUTC(new), *new) != '/');
-               } else if (*p != '\0' && ! equal(p, ".")) {
-                       STPUTC('/', new);
-                       while (*p)
-                               STPUTC(*p++, new);
-               }
-       }
-       if (new == stackblock())
-               STPUTC('/', new);
-       STACKSTRNUL(new);
-       setpwd(stackblock(), 1);
-}
-
-
-#ifndef BB_PWD
-static int
-pwdcmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       printf(snlfmt, curdir);
-       return 0;
-}
-#endif
-
-/*
- * Find out what the current directory is. If we already know the current
- * directory, this routine returns immediately.
- */
-static void
-getpwd(void)
-{
-       curdir = xgetcwd(0);
-       if(curdir==0)
-               curdir = nullstr;
-}
-
-static void
-setpwd(const char *val, int setold)
-{
-       if (setold) {
-               setvar("OLDPWD", curdir, VEXPORT);
-       }
-       INTOFF;
-       if (curdir != nullstr) {
-               free(curdir);
-               curdir = nullstr;
-       }
-       if (!val) {
-               getpwd();
-       } else {
-               curdir = savestr(val);
-       }
-       INTON;
-       setvar("PWD", curdir, VEXPORT);
-}
-
-/*
- * Errors and exceptions.
- */
-
-/*
- * Code to handle exceptions in C.
- */
-
-/*
- * We enclose jmp_buf in a structure so that we can declare pointers to
- * jump locations.  The global variable handler contains the location to
- * jump to when an exception occurs, and the global variable exception
- * contains a code identifying the exeception.  To implement nested
- * exception handlers, the user should save the value of handler on entry
- * to an inner scope, set handler to point to a jmploc structure for the
- * inner scope, and restore handler on exit from the scope.
- */
-
-struct jmploc {
-       jmp_buf loc;
-};
-
-/* exceptions */
-#define EXINT 0         /* SIGINT received */
-#define EXERROR 1       /* a generic error */
-#define EXSHELLPROC 2   /* execute a shell procedure */
-#define EXEXEC 3        /* command execution failed */
-
-static struct jmploc *handler;
-static int exception;
-
-static void exverror (int, const char *, va_list)
-    __attribute__((__noreturn__));
-
-/*
- * Called to raise an exception.  Since C doesn't include exceptions, we
- * just do a longjmp to the exception handler.  The type of exception is
- * stored in the global variable "exception".
- */
-
-static void exraise (int) __attribute__((__noreturn__));
-
-static void
-exraise(int e)
-{
-#ifdef DEBUG
-       if (handler == NULL)
-               abort();
-#endif
-       flushall();
-       exception = e;
-       longjmp(handler->loc, 1);
-}
-
-
-/*
- * Called from trap.c when a SIGINT is received.  (If the user specifies
- * that SIGINT is to be trapped or ignored using the trap builtin, then
- * this routine is not called.)  Suppressint is nonzero when interrupts
- * are held using the INTOFF macro.  The call to _exit is necessary because
- * there is a short period after a fork before the signal handlers are
- * set to the appropriate value for the child.  (The test for iflag is
- * just defensive programming.)
- */
-
-static void
-onint(void) {
-       sigset_t mysigset;
-
-       if (suppressint) {
-               intpending++;
-               return;
-       }
-       intpending = 0;
-       sigemptyset(&mysigset);
-       sigprocmask(SIG_SETMASK, &mysigset, NULL);
-       if (rootshell && iflag)
-               exraise(EXINT);
-       else {
-               signal(SIGINT, SIG_DFL);
-               raise(SIGINT);
-       }
-       /* NOTREACHED */
-}
-
-
-static char *commandname;       /* currently executing command */
-
-/*
- * Exverror is called to raise the error exception.  If the first argument
- * is not NULL then error prints an error message using printf style
- * formatting.  It then raises the error exception.
- */
-static void
-exverror(int cond, const char *msg, va_list ap)
-{
-       CLEAR_PENDING_INT;
-       INTOFF;
-
-#ifdef DEBUG
-       if (msg)
-               TRACE(("exverror(%d, \"%s\") pid=%d\n", cond, msg, getpid()));
-       else
-               TRACE(("exverror(%d, NULL) pid=%d\n", cond, getpid()));
-#endif
-       if (msg) {
-               if (commandname)
-                       out2fmt("%s: ", commandname);
-               vfprintf(stderr, msg, ap);
-               out2c('\n');
-       }
-       exraise(cond);
-       /* NOTREACHED */
-}
-
-
-static void
-error(const char *msg, ...)
-{
-       va_list ap;
-       va_start(ap, msg);
-       exverror(EXERROR, msg, ap);
-       /* NOTREACHED */
-       va_end(ap);
-}
-
-
-static void
-exerror(int cond, const char *msg, ...)
-{
-       va_list ap;
-       va_start(ap, msg);
-       exverror(cond, msg, ap);
-       /* NOTREACHED */
-       va_end(ap);
-}
-
-
-
-/*
- * Table of error messages.
- */
-
-struct errname {
-       short errcode;          /* error number */
-       char  action;           /* operation which encountered the error */
-};
-
-/*
- * Types of operations (passed to the errmsg routine).
- */
-
-#define E_OPEN 01       /* opening a file */
-#define E_CREAT 02      /* creating a file */
-#define E_EXEC 04       /* executing a program */
-
-#define ALL (E_OPEN|E_CREAT|E_EXEC)
-
-static const struct errname errormsg[] = {
-       { EINTR,        ALL     },
-       { EACCES,       ALL     },
-       { EIO,          ALL     },
-       { ENOENT,       E_OPEN  },
-       { ENOENT,       E_CREAT },
-       { ENOENT,       E_EXEC  },
-       { ENOTDIR,      E_OPEN  },
-       { ENOTDIR,      E_CREAT },
-       { ENOTDIR,      E_EXEC  },
-       { EISDIR,       ALL     },
-       { EEXIST,       E_CREAT },
-#ifdef EMFILE
-       { EMFILE,       ALL     },
-#endif
-       { ENFILE,       ALL     },
-       { ENOSPC,       ALL     },
-#ifdef EDQUOT
-       { EDQUOT,       ALL     },
-#endif
-#ifdef ENOSR
-       { ENOSR,        ALL     },
-#endif
-       { ENXIO,        ALL     },
-       { EROFS,        ALL     },
-       { ETXTBSY,      ALL     },
-#ifdef EAGAIN
-       { EAGAIN,       E_EXEC  },
-#endif
-       { ENOMEM,       ALL     },
-#ifdef ENOLINK
-       { ENOLINK,      ALL     },
-#endif
-#ifdef EMULTIHOP
-       { EMULTIHOP,    ALL     },
-#endif
-#ifdef ECOMM
-       { ECOMM,        ALL     },
-#endif
-#ifdef ESTALE
-       { ESTALE,       ALL     },
-#endif
-#ifdef ETIMEDOUT
-       { ETIMEDOUT,    ALL     },
-#endif
-#ifdef ELOOP
-       { ELOOP,        ALL     },
-#endif
-       { E2BIG,        E_EXEC  },
-#ifdef ELIBACC
-       { ELIBACC,      E_EXEC  },
-#endif
-};
-
-#define ERRNAME_SIZE (sizeof(errormsg)/sizeof(struct errname))
-
-/*
- * Return a string describing an error.  The returned string may be a
- * pointer to a static buffer that will be overwritten on the next call.
- * Action describes the operation that got the error.
- */
-
-static const char *
-errmsg(int e, int action)
-{
-       struct errname const *ep;
-       static char buf[12];
-
-       for (ep = errormsg ; ep < errormsg+ERRNAME_SIZE; ep++) {
-               if (ep->errcode == e && (ep->action & action) != 0)
-                       return strerror(e);
-       }
-
-       snprintf(buf, sizeof buf, "error %d", e);
-       return buf;
-}
-
-
-#ifdef ASH_OPTIMIZE_FOR_SIZE
-static void
-__inton() {
-       if (--suppressint == 0 && intpending) {
-               onint();
-       }
-}
-static void forceinton (void) {
-       suppressint = 0;
-       if (intpending)
-               onint();
-}
-#endif
-
-/* flags in argument to evaltree */
-#define EV_EXIT 01              /* exit after evaluating tree */
-#define EV_TESTED 02            /* exit status is checked; ignore -e flag */
-#define EV_BACKCMD 04           /* command executing within back quotes */
-
-static int evalskip;                    /* set if we are skipping commands */
-static int skipcount;           /* number of levels to skip */
-static int loopnest;            /* current loop nesting level */
-static int funcnest;                    /* depth of function calls */
-
-
-static struct strlist *cmdenviron;      /* environment for builtin command */
-static int exitstatus;                  /* exit status of last command */
-static int oexitstatus;         /* saved exit status */
-
-static void evalsubshell (const union node *, int);
-static void expredir (union node *);
-static void prehash (union node *);
-static void eprintlist (struct strlist *);
-
-static union node *parsecmd(int);
-/*
- * Called to reset things after an exception.
- */
-
-/*
- * The eval commmand.
- */
-static void evalstring (char *, int);
-
-static int
-evalcmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       char *p;
-       char *concat;
-       char **ap;
-
-       if (argc > 1) {
-               p = argv[1];
-               if (argc > 2) {
-                       STARTSTACKSTR(concat);
-                       ap = argv + 2;
-                       for (;;) {
-                               while (*p)
-                                       STPUTC(*p++, concat);
-                               if ((p = *ap++) == NULL)
-                                       break;
-                               STPUTC(' ', concat);
-                       }
-                       STPUTC('\0', concat);
-                       p = grabstackstr(concat);
-               }
-               evalstring(p, EV_TESTED);
-       }
-       return exitstatus;
-}
-
-/*
- * Execute a command or commands contained in a string.
- */
-
-static void evaltree (union node *, int);
-static void setinputstring (char *);
-static void popfile (void);
-static void setstackmark(struct stackmark *mark);
-static void popstackmark(struct stackmark *mark);
-
-
-static void
-evalstring(char *s, int flag)
-{
-       union node *n;
-       struct stackmark smark;
-
-       setstackmark(&smark);
-       setinputstring(s);
-       while ((n = parsecmd(0)) != NEOF) {
-               evaltree(n, flag);
-               popstackmark(&smark);
-       }
-       popfile();
-       popstackmark(&smark);
-}
-
-static struct builtincmd *find_builtin (const char *);
-static void expandarg (union node *, struct arglist *, int);
-static void calcsize (const union node *);
-static union node *copynode (const union node *);
-
-/*
- * Make a copy of a parse tree.
- */
-
-static int     funcblocksize;           /* size of structures in function */
-static int     funcstringsize;          /* size of strings in node */
-static pointer funcblock;              /* block to allocate function from */
-static char   *funcstring;              /* block to allocate strings from */
-
-
-static inline union node *
-copyfunc(union node *n)
-{
-       if (n == NULL)
-               return NULL;
-       funcblocksize = 0;
-       funcstringsize = 0;
-       calcsize(n);
-       funcblock = ckmalloc(funcblocksize + funcstringsize);
-       funcstring = (char *) funcblock + funcblocksize;
-       return copynode(n);
-}
-
-/*
- * Free a parse tree.
- */
-
-static void
-freefunc(union node *n)
-{
-       if (n)
-               ckfree(n);
-}
-
-
-/*
- * Add a new command entry, replacing any existing command entry for
- * the same name.
- */
-
-static inline void
-addcmdentry(char *name, struct cmdentry *entry)
-{
-       struct tblentry *cmdp;
-
-       INTOFF;
-       cmdp = cmdlookup(name, 1);
-       if (cmdp->cmdtype == CMDFUNCTION) {
-               freefunc(cmdp->param.func);
-       }
-       cmdp->cmdtype = entry->cmdtype;
-       cmdp->param = entry->u;
-       INTON;
-}
-
-static inline void
-evalloop(const union node *n, int flags)
-{
-       int status;
-
-       loopnest++;
-       status = 0;
-       for (;;) {
-               evaltree(n->nbinary.ch1, EV_TESTED);
-               if (evalskip) {
-skipping:         if (evalskip == SKIPCONT && --skipcount <= 0) {
-                               evalskip = 0;
-                               continue;
-                       }
-                       if (evalskip == SKIPBREAK && --skipcount <= 0)
-                               evalskip = 0;
-                       break;
-               }
-               if (n->type == NWHILE) {
-                       if (exitstatus != 0)
-                               break;
-               } else {
-                       if (exitstatus == 0)
-                               break;
-               }
-               evaltree(n->nbinary.ch2, flags & EV_TESTED);
-               status = exitstatus;
-               if (evalskip)
-                       goto skipping;
-       }
-       loopnest--;
-       exitstatus = status;
-}
-
-static void
-evalfor(const union node *n, int flags)
-{
-       struct arglist arglist;
-       union node *argp;
-       struct strlist *sp;
-       struct stackmark smark;
-
-       setstackmark(&smark);
-       arglist.lastp = &arglist.list;
-       for (argp = n->nfor.args ; argp ; argp = argp->narg.next) {
-               oexitstatus = exitstatus;
-               expandarg(argp, &arglist, EXP_FULL | EXP_TILDE | EXP_RECORD);
-               if (evalskip)
-                       goto out;
-       }
-       *arglist.lastp = NULL;
-
-       exitstatus = 0;
-       loopnest++;
-       for (sp = arglist.list ; sp ; sp = sp->next) {
-               setvar(n->nfor.var, sp->text, 0);
-               evaltree(n->nfor.body, flags & EV_TESTED);
-               if (evalskip) {
-                       if (evalskip == SKIPCONT && --skipcount <= 0) {
-                               evalskip = 0;
-                               continue;
-                       }
-                       if (evalskip == SKIPBREAK && --skipcount <= 0)
-                               evalskip = 0;
-                       break;
-               }
-       }
-       loopnest--;
-out:
-       popstackmark(&smark);
-}
-
-static inline void
-evalcase(const union node *n, int flags)
-{
-       union node *cp;
-       union node *patp;
-       struct arglist arglist;
-       struct stackmark smark;
-
-       setstackmark(&smark);
-       arglist.lastp = &arglist.list;
-       oexitstatus = exitstatus;
-       expandarg(n->ncase.expr, &arglist, EXP_TILDE);
-       for (cp = n->ncase.cases ; cp && evalskip == 0 ; cp = cp->nclist.next) {
-               for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) {
-                       if (casematch(patp, arglist.list->text)) {
-                               if (evalskip == 0) {
-                                       evaltree(cp->nclist.body, flags);
-                               }
-                               goto out;
-                       }
-               }
-       }
-out:
-       popstackmark(&smark);
-}
-
-/*
- * Evaluate a pipeline.  All the processes in the pipeline are children
- * of the process creating the pipeline.  (This differs from some versions
- * of the shell, which make the last process in a pipeline the parent
- * of all the rest.)
- */
-
-static inline void evalpipe(union node *n)
-{
-       struct job *jp;
-       struct nodelist *lp;
-       int pipelen;
-       int prevfd;
-       int pip[2];
-
-       TRACE(("evalpipe(0x%lx) called\n", (long)n));
-       pipelen = 0;
-       for (lp = n->npipe.cmdlist ; lp ; lp = lp->next)
-               pipelen++;
-       INTOFF;
-       jp = makejob(n, pipelen);
-       prevfd = -1;
-       for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) {
-               prehash(lp->n);
-               pip[1] = -1;
-               if (lp->next) {
-                       if (pipe(pip) < 0) {
-                               close(prevfd);
-                               error("Pipe call failed");
-                       }
-               }
-               if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) {
-                       INTON;
-                       if (prevfd > 0) {
-                               close(0);
-                               dup_as_newfd(prevfd, 0);
-                               close(prevfd);
-                               if (pip[0] == 0) {
-                                       pip[0] = -1;
-                               }
-                       }
-                       if (pip[1] >= 0) {
-                               if (pip[0] >= 0) {
-                                       close(pip[0]);
-                               }
-                               if (pip[1] != 1) {
-                                       close(1);
-                                       dup_as_newfd(pip[1], 1);
-                                       close(pip[1]);
-                               }
-                       }
-                       evaltree(lp->n, EV_EXIT);
-               }
-               if (prevfd >= 0)
-                       close(prevfd);
-               prevfd = pip[0];
-               close(pip[1]);
-       }
-       INTON;
-       if (n->npipe.backgnd == 0) {
-               INTOFF;
-               exitstatus = waitforjob(jp);
-               TRACE(("evalpipe:  job done exit status %d\n", exitstatus));
-               INTON;
-       }
-}
-
-static void find_command (const char *, struct cmdentry *, int, const char *);
-
-static int
-isassignment(const char *word) {
-       if (!is_name(*word)) {
-               return 0;
-       }
-       do {
-               word++;
-       } while (is_in_name(*word));
-       return *word == '=';
-}
-
-
-static void
-evalcommand(union node *cmd, int flags)
-{
-       struct stackmark smark;
-       union node *argp;
-       struct arglist arglist;
-       struct arglist varlist;
-       char **argv;
-       int argc;
-       char **envp;
-       struct strlist *sp;
-       int mode;
-       struct cmdentry cmdentry;
-       struct job *jp;
-       char *volatile savecmdname;
-       volatile struct shparam saveparam;
-       struct localvar *volatile savelocalvars;
-       volatile int e;
-       char *lastarg;
-       const char *path;
-       const struct builtincmd *firstbltin;
-       struct jmploc *volatile savehandler;
-       struct jmploc jmploc;
-#if __GNUC__
-       /* Avoid longjmp clobbering */
-       (void) &argv;
-       (void) &argc;
-       (void) &lastarg;
-       (void) &flags;
-#endif
-
-       /* First expand the arguments. */
-       TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags));
-       setstackmark(&smark);
-       arglist.lastp = &arglist.list;
-       varlist.lastp = &varlist.list;
-       arglist.list = 0;
-       oexitstatus = exitstatus;
-       exitstatus = 0;
-       path = pathval();
-       for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) {
-               expandarg(argp, &varlist, EXP_VARTILDE);
-       }
-       for (
-               argp = cmd->ncmd.args; argp && !arglist.list;
-               argp = argp->narg.next
-       ) {
-               expandarg(argp, &arglist, EXP_FULL | EXP_TILDE);
-       }
-       if (argp) {
-               struct builtincmd *bcmd;
-               int pseudovarflag;
-               bcmd = find_builtin(arglist.list->text);
-               pseudovarflag = bcmd && IS_BUILTIN_ASSIGN(bcmd);
-               for (; argp; argp = argp->narg.next) {
-                       if (pseudovarflag && isassignment(argp->narg.text)) {
-                               expandarg(argp, &arglist, EXP_VARTILDE);
-                               continue;
-                       }
-                       expandarg(argp, &arglist, EXP_FULL | EXP_TILDE);
-               }
-       }
-       *arglist.lastp = NULL;
-       *varlist.lastp = NULL;
-       expredir(cmd->ncmd.redirect);
-       argc = 0;
-       for (sp = arglist.list ; sp ; sp = sp->next)
-               argc++;
-       argv = stalloc(sizeof (char *) * (argc + 1));
-
-       for (sp = arglist.list ; sp ; sp = sp->next) {
-               TRACE(("evalcommand arg: %s\n", sp->text));
-               *argv++ = sp->text;
-       }
-       *argv = NULL;
-       lastarg = NULL;
-       if (iflag && funcnest == 0 && argc > 0)
-               lastarg = argv[-1];
-       argv -= argc;
-
-       /* Print the command if xflag is set. */
-       if (xflag) {
-               out2c('+');
-               eprintlist(varlist.list);
-               eprintlist(arglist.list);
-               out2c('\n');
-       }
-
-       /* Now locate the command. */
-       if (argc == 0) {
-               cmdentry.cmdtype = CMDBUILTIN;
-               firstbltin = cmdentry.u.cmd = BLTINCMD;
-       } else {
-               const char *oldpath;
-               int findflag = DO_ERR;
-               int oldfindflag;
-
-               /*
-                * Modify the command lookup path, if a PATH= assignment
-                * is present
-                */
-               for (sp = varlist.list ; sp ; sp = sp->next)
-                       if (varequal(sp->text, defpathvar)) {
-                               path = sp->text + 5;
-                               findflag |= DO_BRUTE;
-                       }
-               oldpath = path;
-               oldfindflag = findflag;
-               firstbltin = 0;
-               for(;;) {
-                       find_command(argv[0], &cmdentry, findflag, path);
-                       if (cmdentry.cmdtype == CMDUNKNOWN) {   /* command not found */
-                               exitstatus = 127;
-                               goto out;
-                       }
-                       /* implement bltin and command here */
-                       if (cmdentry.cmdtype != CMDBUILTIN) {
-                               break;
-                       }
-                       if (!firstbltin) {
-                               firstbltin = cmdentry.u.cmd;
-                       }
-                       if (cmdentry.u.cmd == BLTINCMD) {
-                               for(;;) {
-                                       struct builtincmd *bcmd;
-
-                                       argv++;
-                                       if (--argc == 0)
-                                               goto found;
-                                       if (!(bcmd = find_builtin(*argv))) {
-                                               out2fmt("%s: not found\n", *argv);
-                                               exitstatus = 127;
-                                               goto out;
-                                       }
-                                       cmdentry.u.cmd = bcmd;
-                                       if (bcmd != BLTINCMD)
-                                               break;
-                               }
-                       }
-                       if (cmdentry.u.cmd == find_builtin("command")) {
-                               argv++;
-                               if (--argc == 0) {
-                                       goto found;
-                               }
-                               if (*argv[0] == '-') {
-                                       if (!equal(argv[0], "-p")) {
-                                               argv--;
-                                               argc++;
-                                               break;
-                                       }
-                                       argv++;
-                                       if (--argc == 0) {
-                                               goto found;
-                                       }
-                                       path = defpath;
-                                       findflag |= DO_BRUTE;
-                               } else {
-                                       path = oldpath;
-                                       findflag = oldfindflag;
-                               }
-                               findflag |= DO_NOFUN;
-                               continue;
-                       }
-found:
-                       break;
-               }
-       }
-
-       /* Fork off a child process if necessary. */
-       if (cmd->ncmd.backgnd
-        || (cmdentry.cmdtype == CMDNORMAL && (flags & EV_EXIT) == 0)
-       ) {
-               jp = makejob(cmd, 1);
-               mode = cmd->ncmd.backgnd;
-               if (forkshell(jp, cmd, mode) != 0)
-                       goto parent;    /* at end of routine */
-               flags |= EV_EXIT;
-       }
-
-       /* This is the child process if a fork occurred. */
-       /* Execute the command. */
-       if (cmdentry.cmdtype == CMDFUNCTION) {
-#ifdef DEBUG
-               trputs("Shell function:  ");  trargs(argv);
-#endif
-               exitstatus = oexitstatus;
-               redirect(cmd->ncmd.redirect, REDIR_PUSH);
-               saveparam = shellparam;
-               shellparam.malloc = 0;
-               shellparam.nparam = argc - 1;
-               shellparam.p = argv + 1;
-               INTOFF;
-               savelocalvars = localvars;
-               localvars = NULL;
-               INTON;
-               if (setjmp(jmploc.loc)) {
-                       if (exception == EXSHELLPROC) {
-                               freeparam((volatile struct shparam *)
-                                   &saveparam);
-                       } else {
-                               saveparam.optind = shellparam.optind;
-                               saveparam.optoff = shellparam.optoff;
-                               freeparam(&shellparam);
-                               shellparam = saveparam;
-                       }
-                       poplocalvars();
-                       localvars = savelocalvars;
-                       handler = savehandler;
-                       longjmp(handler->loc, 1);
-               }
-               savehandler = handler;
-               handler = &jmploc;
-               for (sp = varlist.list ; sp ; sp = sp->next)
-                       mklocal(sp->text);
-               funcnest++;
-               evaltree(cmdentry.u.func, flags & EV_TESTED);
-               funcnest--;
-               INTOFF;
-               poplocalvars();
-               localvars = savelocalvars;
-               saveparam.optind = shellparam.optind;
-               saveparam.optoff = shellparam.optoff;
-               freeparam(&shellparam);
-               shellparam = saveparam;
-               handler = savehandler;
-               popredir();
-               INTON;
-               if (evalskip == SKIPFUNC) {
-                       evalskip = 0;
-                       skipcount = 0;
-               }
-               if (flags & EV_EXIT)
-                       exitshell(exitstatus);
-       } else if (cmdentry.cmdtype == CMDBUILTIN) {
-#ifdef DEBUG
-               trputs("builtin command:  ");  trargs(argv);
-#endif
-               mode = (cmdentry.u.cmd == EXECCMD)? 0 : REDIR_PUSH;
-               redirect(cmd->ncmd.redirect, mode);
-               savecmdname = commandname;
-               if (IS_BUILTIN_SPECIAL(firstbltin)) {
-                       listsetvar(varlist.list);
-               } else {
-                       cmdenviron = varlist.list;
-               }
-               e = -1;
-               if (setjmp(jmploc.loc)) {
-                       e = exception;
-                       exitstatus = (e == EXINT)? SIGINT+128 : 2;
-                       goto cmddone;
-               }
-               savehandler = handler;
-               handler = &jmploc;
-               commandname = argv[0];
-               argptr = argv + 1;
-               optptr = NULL;                  /* initialize nextopt */
-               exitstatus = (*cmdentry.u.cmd->builtinfunc)(argc, argv);
-               flushall();
-cmddone:
-               cmdenviron = NULL;
-               if (e != EXSHELLPROC) {
-                       commandname = savecmdname;
-                       if (flags & EV_EXIT)
-                               exitshell(exitstatus);
-               }
-               handler = savehandler;
-               if (e != -1) {
-                       if ((e != EXERROR && e != EXEXEC)
-                          || cmdentry.u.cmd == BLTINCMD
-                          || cmdentry.u.cmd == DOTCMD
-                          || cmdentry.u.cmd == EVALCMD
-                          || cmdentry.u.cmd == EXECCMD)
-                               exraise(e);
-                       FORCEINTON;
-               }
-               if (cmdentry.u.cmd != EXECCMD)
-                       popredir();
-       } else {
-#ifdef DEBUG
-               trputs("normal command:  ");  trargs(argv);
-#endif
-               redirect(cmd->ncmd.redirect, 0);
-               clearredir();
-               for (sp = varlist.list ; sp ; sp = sp->next)
-                       setvareq(sp->text, VEXPORT|VSTACK);
-               envp = environment();
-               shellexec(argv, envp, path, cmdentry.u.index);
-       }
-       goto out;
-
-parent: /* parent process gets here (if we forked) */
-       if (mode == 0) {        /* argument to fork */
-               INTOFF;
-               exitstatus = waitforjob(jp);
-               INTON;
-       }
-
-out:
-       if (lastarg)
-               setvar("_", lastarg, 0);
-       popstackmark(&smark);
-}
-
-/*
- * Evaluate a parse tree.  The value is left in the global variable
- * exitstatus.
- */
-static void
-evaltree(n, flags)
-       union node *n;
-       int flags;
-{
-       int checkexit = 0;
-       if (n == NULL) {
-               TRACE(("evaltree(NULL) called\n"));
-               goto out;
-       }
-       TRACE(("evaltree(0x%lx: %d) called\n", (long)n, n->type));
-       switch (n->type) {
-       case NSEMI:
-               evaltree(n->nbinary.ch1, flags & EV_TESTED);
-               if (evalskip)
-                       goto out;
-               evaltree(n->nbinary.ch2, flags);
-               break;
-       case NAND:
-               evaltree(n->nbinary.ch1, EV_TESTED);
-               if (evalskip || exitstatus != 0)
-                       goto out;
-               evaltree(n->nbinary.ch2, flags);
-               break;
-       case NOR:
-               evaltree(n->nbinary.ch1, EV_TESTED);
-               if (evalskip || exitstatus == 0)
-                       goto out;
-               evaltree(n->nbinary.ch2, flags);
-               break;
-       case NREDIR:
-               expredir(n->nredir.redirect);
-               redirect(n->nredir.redirect, REDIR_PUSH);
-               evaltree(n->nredir.n, flags);
-               popredir();
-               break;
-       case NSUBSHELL:
-               evalsubshell(n, flags);
-               break;
-       case NBACKGND:
-               evalsubshell(n, flags);
-               break;
-       case NIF: {
-               evaltree(n->nif.test, EV_TESTED);
-               if (evalskip)
-                       goto out;
-               if (exitstatus == 0)
-                       evaltree(n->nif.ifpart, flags);
-               else if (n->nif.elsepart)
-                       evaltree(n->nif.elsepart, flags);
-               else
-                       exitstatus = 0;
-               break;
-       }
-       case NWHILE:
-       case NUNTIL:
-               evalloop(n, flags);
-               break;
-       case NFOR:
-               evalfor(n, flags);
-               break;
-       case NCASE:
-               evalcase(n, flags);
-               break;
-       case NDEFUN: {
-               struct builtincmd *bcmd;
-               struct cmdentry entry;
-               if (
-                       (bcmd = find_builtin(n->narg.text)) &&
-                       IS_BUILTIN_SPECIAL(bcmd)
-               ) {
-                       out2fmt("%s is a special built-in\n", n->narg.text);
-                       exitstatus = 1;
-                       break;
-               }
-               entry.cmdtype = CMDFUNCTION;
-               entry.u.func = copyfunc(n->narg.next);
-               addcmdentry(n->narg.text, &entry);
-               exitstatus = 0;
-               break;
-       }
-       case NNOT:
-               evaltree(n->nnot.com, EV_TESTED);
-               exitstatus = !exitstatus;
-               break;
-
-       case NPIPE:
-               evalpipe(n);
-               checkexit = 1;
-               break;
-       case NCMD:
-               evalcommand(n, flags);
-               checkexit = 1;
-               break;
-#ifdef DEBUG
-       default:
-               printf("Node type = %d\n", n->type);
-               break;
-#endif
-       }
-out:
-       if (pendingsigs)
-               dotrap();
-       if (
-               flags & EV_EXIT ||
-               (checkexit && eflag && exitstatus && !(flags & EV_TESTED))
-       )
-               exitshell(exitstatus);
-}
-
-/*
- * Kick off a subshell to evaluate a tree.
- */
-
-static void
-evalsubshell(const union node *n, int flags)
-{
-       struct job *jp;
-       int backgnd = (n->type == NBACKGND);
-
-       expredir(n->nredir.redirect);
-       jp = makejob(n, 1);
-       if (forkshell(jp, n, backgnd) == 0) {
-               if (backgnd)
-                       flags &=~ EV_TESTED;
-               redirect(n->nredir.redirect, 0);
-               evaltree(n->nredir.n, flags | EV_EXIT); /* never returns */
-       }
-       if (! backgnd) {
-               INTOFF;
-               exitstatus = waitforjob(jp);
-               INTON;
-       }
-}
-
-/*
- * Compute the names of the files in a redirection list.
- */
-
-static void fixredir(union node *n, const char *text, int err);
-
-static void
-expredir(union node *n)
-{
-       union node *redir;
-
-       for (redir = n ; redir ; redir = redir->nfile.next) {
-               struct arglist fn;
-               fn.lastp = &fn.list;
-               oexitstatus = exitstatus;
-               switch (redir->type) {
-               case NFROMTO:
-               case NFROM:
-               case NTO:
-               case NAPPEND:
-               case NTOOV:
-                       expandarg(redir->nfile.fname, &fn, EXP_TILDE | EXP_REDIR);
-                       redir->nfile.expfname = fn.list->text;
-                       break;
-               case NFROMFD:
-               case NTOFD:
-                       if (redir->ndup.vname) {
-                               expandarg(redir->ndup.vname, &fn, EXP_FULL | EXP_TILDE);
-                               fixredir(redir, fn.list->text, 1);
-                       }
-                       break;
-               }
-       }
-}
-
-
-/*
- * Execute a command inside back quotes.  If it's a builtin command, we
- * want to save its output in a block obtained from malloc.  Otherwise
- * we fork off a subprocess and get the output of the command via a pipe.
- * Should be called with interrupts off.
- */
-
-static void
-evalbackcmd(union node *n, struct backcmd *result)
-{
-       int pip[2];
-       struct job *jp;
-       struct stackmark smark;         /* unnecessary */
-
-       setstackmark(&smark);
-       result->fd = -1;
-       result->buf = NULL;
-       result->nleft = 0;
-       result->jp = NULL;
-       if (n == NULL) {
-               exitstatus = 0;
-               goto out;
-       }
-       exitstatus = 0;
-       if (pipe(pip) < 0)
-               error("Pipe call failed");
-       jp = makejob(n, 1);
-       if (forkshell(jp, n, FORK_NOJOB) == 0) {
-               FORCEINTON;
-               close(pip[0]);
-               if (pip[1] != 1) {
-                       close(1);
-                       dup_as_newfd(pip[1], 1);
-                       close(pip[1]);
-               }
-               eflag = 0;
-               evaltree(n, EV_EXIT);
-       }
-       close(pip[1]);
-       result->fd = pip[0];
-       result->jp = jp;
-out:
-       popstackmark(&smark);
-       TRACE(("evalbackcmd done: fd=%d buf=0x%x nleft=%d jp=0x%x\n",
-               result->fd, result->buf, result->nleft, result->jp));
-}
-
-
-/*
- * Execute a simple command.
- */
-
-/*
- * Search for a command.  This is called before we fork so that the
- * location of the command will be available in the parent as well as
- * the child.  The check for "goodname" is an overly conservative
- * check that the name will not be subject to expansion.
- */
-
-static void
-prehash(n)
-       union node *n;
-{
-       struct cmdentry entry;
-
-       if (n->type == NCMD && n->ncmd.args)
-               if (goodname(n->ncmd.args->narg.text))
-                       find_command(n->ncmd.args->narg.text, &entry, 0,
-                                    pathval());
-}
-
-
-/*
- * Builtin commands.  Builtin commands whose functions are closely
- * tied to evaluation are implemented here.
- */
-
-/*
- * No command given, or a bltin command with no arguments.  Set the
- * specified variables.
- */
-
-int
-bltincmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       /*
-        * Preserve exitstatus of a previous possible redirection
-        * as POSIX mandates
-        */
-       return exitstatus;
-}
-
-
-/*
- * Handle break and continue commands.  Break, continue, and return are
- * all handled by setting the evalskip flag.  The evaluation routines
- * above all check this flag, and if it is set they start skipping
- * commands rather than executing them.  The variable skipcount is
- * the number of loops to break/continue, or the number of function
- * levels to return.  (The latter is always 1.)  It should probably
- * be an error to break out of more loops than exist, but it isn't
- * in the standard shell so we don't make it one here.
- */
-
-static int
-breakcmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       int n = argc > 1 ? number(argv[1]) : 1;
-
-       if (n > loopnest)
-               n = loopnest;
-       if (n > 0) {
-               evalskip = (**argv == 'c')? SKIPCONT : SKIPBREAK;
-               skipcount = n;
-       }
-       return 0;
-}
-
-
-/*
- * The return command.
- */
-
-static int
-returncmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       int ret = argc > 1 ? number(argv[1]) : oexitstatus;
-
-       if (funcnest) {
-               evalskip = SKIPFUNC;
-               skipcount = 1;
-               return ret;
-       }
-       else {
-               /* Do what ksh does; skip the rest of the file */
-               evalskip = SKIPFILE;
-               skipcount = 1;
-               return ret;
-       }
-}
-
-
-#ifndef BB_TRUE_FALSE
-static int
-false_main(argc, argv)
-       int argc;
-       char **argv;
-{
-       return 1;
-}
-
-
-static int
-true_main(argc, argv)
-       int argc;
-       char **argv;
-{
-       return 0;
-}
-#endif
-
-/*
- * Controls whether the shell is interactive or not.
- */
-
-static void setsignal(int signo);
-static void chkmail(int silent);
-
-
-static void
-setinteractive(int on)
-{
-       static int is_interactive;
-       static int do_banner=0;
-
-       if (on == is_interactive)
-               return;
-       setsignal(SIGINT);
-       setsignal(SIGQUIT);
-       setsignal(SIGTERM);
-       chkmail(1);
-       is_interactive = on;
-       if (do_banner==0 && is_interactive) {
-               /* Looks like they want an interactive shell */
-#ifndef BB_FEATURE_SH_EXTRA_QUIET 
-               printf( "\n\n" BB_BANNER " Built-in shell (ash)\n");
-               printf( "Enter 'help' for a list of built-in commands.\n\n");
-#endif
-               do_banner=1;
-       }
-}
-
-static void
-optschanged(void)
-{
-       setinteractive(iflag);
-       setjobctl(mflag);
-}
-
-
-static int
-execcmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       if (argc > 1) {
-               struct strlist *sp;
-
-               iflag = 0;              /* exit on error */
-               mflag = 0;
-               optschanged();
-               for (sp = cmdenviron; sp ; sp = sp->next)
-                       setvareq(sp->text, VEXPORT|VSTACK);
-               shellexec(argv + 1, environment(), pathval(), 0);
-       }
-       return 0;
-}
-
-static void
-eprintlist(struct strlist *sp)
-{
-       for (; sp; sp = sp->next) {
-               out2fmt(" %s",sp->text);
-       }
-}
-
-/*
- * Exec a program.  Never returns.  If you change this routine, you may
- * have to change the find_command routine as well.
- */
-
-static const char *pathopt;     /* set by padvance */
-
-static void
-shellexec(argv, envp, path, idx)
-       char **argv, **envp;
-       const char *path;
-       int idx;
-{
-       char *cmdname;
-       int e;
-
-       if (strchr(argv[0], '/') != NULL) {
-               tryexec(argv[0], argv, envp);
-               e = errno;
-       } else {
-               e = ENOENT;
-               while ((cmdname = padvance(&path, argv[0])) != NULL) {
-                       if (--idx < 0 && pathopt == NULL) {
-                               tryexec(cmdname, argv, envp);
-                               if (errno != ENOENT && errno != ENOTDIR)
-                                       e = errno;
-                       }
-                       stunalloc(cmdname);
-               }
-       }
-
-       /* Map to POSIX errors */
-       switch (e) {
-       case EACCES:
-               exerrno = 126;
-               break;
-       case ENOENT:
-               exerrno = 127;
-               break;
-       default:
-               exerrno = 2;
-               break;
-       }
-       exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC));
-       /* NOTREACHED */
-}
-
-/*
- * Clear traps on a fork.
- */
-static void
-clear_traps(void) {
-       char **tp;
-
-       for (tp = trap ; tp < &trap[NSIG] ; tp++) {
-               if (*tp && **tp) {      /* trap not NULL or SIG_IGN */
-                       INTOFF;
-                       ckfree(*tp);
-                       *tp = NULL;
-                       if (tp != &trap[0])
-                               setsignal(tp - trap);
-                       INTON;
-               }
-       }
-}
-
-
-static void
-initshellproc(void) {
-
-#ifdef ASH_ALIAS
-      /* from alias.c: */
-      {
-             rmaliases();
-      }
-#endif
-      /* from eval.c: */
-      {
-             exitstatus = 0;
-      }
-
-      /* from exec.c: */
-      {
-             deletefuncs();
-      }
-
-      /* from jobs.c: */
-      {
-             backgndpid = -1;
-#ifdef JOBS
-             jobctl = 0;
-#endif
-      }
-
-      /* from options.c: */
-      {
-             int i;
-
-             for (i = 0; i < NOPTS; i++)
-                     optent_val(i) = 0;
-             optschanged();
-
-      }
-
-      /* from redir.c: */
-      {
-             clearredir();
-      }
-
-      /* from trap.c: */
-      {
-             char *sm;
-
-             clear_traps();
-             for (sm = sigmode ; sm < sigmode + NSIG - 1; sm++) {
-                     if (*sm == S_IGN)
-                             *sm = S_HARD_IGN;
-             }
-      }
-
-      /* from var.c: */
-      {
-             shprocvar();
-      }
-}
-
-static int preadbuffer(void);
-static void pushfile (void);
-
-/*
- * Read a character from the script, returning PEOF on end of file.
- * Nul characters in the input are silently discarded.
- */
-
-#ifndef ASH_OPTIMIZE_FOR_SIZE
-#define pgetc_macro()   (--parsenleft >= 0? *parsenextc++ : preadbuffer())
-static int
-pgetc(void)
-{
-       return pgetc_macro();
-}
-#else
-static int
-pgetc_macro(void)
-{
-       return --parsenleft >= 0? *parsenextc++ : preadbuffer();
-}
-
-static inline int
-pgetc(void)
-{
-       return pgetc_macro();
-}
-#endif
-
-
-/*
- * Undo the last call to pgetc.  Only one character may be pushed back.
- * PEOF may be pushed back.
- */
-
-static void pungetc(void) 
-{
-       parsenleft++;
-       parsenextc--;
-}
-
-
-static void
-popfile(void) {
-       struct parsefile *pf = parsefile;
-
-       INTOFF;
-       if (pf->fd >= 0)
-               close(pf->fd);
-       if (pf->buf)
-               ckfree(pf->buf);
-       while (pf->strpush)
-               popstring();
-       parsefile = pf->prev;
-       ckfree(pf);
-       parsenleft = parsefile->nleft;
-       parselleft = parsefile->lleft;
-       parsenextc = parsefile->nextc;
-       plinno = parsefile->linno;
-       INTON;
-}
-
-
-/*
- * Return to top level.
- */
-
-static void
-popallfiles(void) {
-       while (parsefile != &basepf)
-               popfile();
-}
-
-/*
- * Close the file(s) that the shell is reading commands from.  Called
- * after a fork is done.
- */
-
-static void closescript(void) 
-{
-       popallfiles();
-       if (parsefile->fd > 0) {
-               close(parsefile->fd);
-               parsefile->fd = 0;
-       }
-}
-
-
-/*
- * Like setinputfile, but takes an open file descriptor.  Call this with
- * interrupts off.
- */
-
-static void setinputfd(int fd, int push)
-{
-       (void) fcntl(fd, F_SETFD, FD_CLOEXEC);
-       if (push) {
-               pushfile();
-               parsefile->buf = 0;
-       } else {
-               closescript();
-               while (parsefile->strpush)
-                       popstring();
-       }
-       parsefile->fd = fd;
-       if (parsefile->buf == NULL)
-               parsefile->buf = ckmalloc(BUFSIZ);
-       parselleft = parsenleft = 0;
-       plinno = 1;
-}
-
-
-/*
- * Set the input to take input from a file.  If push is set, push the
- * old input onto the stack first.
- */
-
-static void
-setinputfile(const char *fname, int push)
-{
-       int fd;
-       int myfileno2;
-
-       INTOFF;
-       if ((fd = open(fname, O_RDONLY)) < 0)
-               error("Can't open %s", fname);
-       if (fd < 10) {
-               myfileno2 = dup_as_newfd(fd, 10);
-               close(fd);
-               if (myfileno2 < 0)
-                       error("Out of file descriptors");
-               fd = myfileno2;
-       }
-       setinputfd(fd, push);
-       INTON;
-}
-
-
-static void
-tryexec(char *cmd, char **argv, char **envp)
-{
-       int e;
-
-#ifdef BB_FEATURE_SH_STANDALONE_SHELL
-       char *name = cmd;
-       char** argv_l=argv;
-       int argc_l;
-#ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
-       name = get_last_path_component(name);
-#endif
-       argv_l=envp;
-       for(argc_l=0;*argv_l!=NULL; argv_l++, argc_l++)
-               putenv(*argv_l);
-       argv_l=argv;
-       for(argc_l=0;*argv_l!=NULL; argv_l++, argc_l++)
-       optind = 1;
-       run_applet_by_name(name, argc_l, argv);
-#endif
-       execve(cmd, argv, envp);
-       e = errno;
-       if (e == ENOEXEC) {
-               INTOFF;
-               initshellproc();
-               setinputfile(cmd, 0);
-               commandname = arg0 = savestr(argv[0]);
-               setparam(argv + 1);
-               exraise(EXSHELLPROC);
-       }
-       errno = e;
-}
-
-static char *commandtext (const union node *);
-
-/*
- * Do a path search.  The variable path (passed by reference) should be
- * set to the start of the path before the first call; padvance will update
- * this value as it proceeds.  Successive calls to padvance will return
- * the possible path expansions in sequence.  If an option (indicated by
- * a percent sign) appears in the path entry then the global variable
- * pathopt will be set to point to it; otherwise pathopt will be set to
- * NULL.
- */
-
-static const char *pathopt;
-
-static void growstackblock(void);
-
-
-static char *
-padvance(const char **path, const char *name)
-{
-       const char *p;
-       char *q;
-       const char *start;
-       int len;
-
-       if (*path == NULL)
-               return NULL;
-       start = *path;
-       for (p = start ; *p && *p != ':' && *p != '%' ; p++);
-       len = p - start + strlen(name) + 2;     /* "2" is for '/' and '\0' */
-       while (stackblocksize() < len)
-               growstackblock();
-       q = stackblock();
-       if (p != start) {
-               memcpy(q, start, p - start);
-               q += p - start;
-               *q++ = '/';
-       }
-       strcpy(q, name);
-       pathopt = NULL;
-       if (*p == '%') {
-               pathopt = ++p;
-               while (*p && *p != ':')  p++;
-       }
-       if (*p == ':')
-               *path = p + 1;
-       else
-               *path = NULL;
-       return stalloc(len);
-}
-
-/*
- * Wrapper around strcmp for qsort/bsearch/...
- */
-static int
-pstrcmp(const void *a, const void *b)
-{
-       return strcmp((const char *) a, (*(const char *const *) b) + 1);
-}
-
-/*
- * Find a keyword is in a sorted array.
- */
-
-static const char *const *
-findkwd(const char *s)
-{
-       return  bsearch(s, tokname_array + KWDOFFSET,
-                                       (sizeof(tokname_array)/sizeof(const char *)) - KWDOFFSET,
-                                       sizeof(const char *), pstrcmp);
-}
-
-
-/*** Command hashing code ***/
-
-
-static int
-hashcmd(argc, argv)
-       int argc;
-       char **argv;
-{
-       struct tblentry **pp;
-       struct tblentry *cmdp;
-       int c;
-       int verbose;
-       struct cmdentry entry;
-       char *name;
-#ifdef ASH_ALIAS
-       const struct alias *ap;
-#endif
-
-       verbose = 0;
-       while ((c = nextopt("rvV")) != '\0') {
-               if (c == 'r') {
-                       clearcmdentry(0);
-                       return 0;
-               } else if (c == 'v' || c == 'V') {
-                       verbose = c;
-               }
-       }
-       if (*argptr == NULL) {
-               for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) {
-                       for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) {
-                               if (cmdp->cmdtype != CMDBUILTIN) {
-                                       printentry(cmdp, verbose);
-                               }
-                       }
-               }
-               return 0;
-       }
-       c = 0;
-       while ((name = *argptr++) != NULL) {
-               if ((cmdp = cmdlookup(name, 0)) != NULL
-                && (cmdp->cmdtype == CMDNORMAL
-                    || (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0)))
-                       delete_cmd_entry();
-#ifdef ASH_ALIAS
-       /* Then look at the aliases */
-               if ((ap = lookupalias(name, 0)) != NULL) {
-                       if (verbose=='v')
-                               printf("%s is an alias for %s\n", name, ap->val);
-                       else
-                               printalias(ap);
-                       continue;
-               }
-#endif
-                       /* First look at the keywords */
-               if (findkwd(name)!=0) {
-                       if (verbose=='v')
-                               printf("%s is a shell keyword\n", name);
-                       else
-                               printf(snlfmt, name);
-                       continue;
-               }
-
-               find_command(name, &entry, DO_ERR, pathval());
-               if (entry.cmdtype == CMDUNKNOWN) c = 1;
-               else if (verbose) {
-                       cmdp = cmdlookup(name, 0);
-                       if (cmdp) printentry(cmdp, verbose=='v');
-                       flushall();
-               }
-       }
-       return c;
-}
-
-static void
-printentry(cmdp, verbose)
-       struct tblentry *cmdp;
-       int verbose;
-       {
-       int idx;
-       const char *path;
-       char *name;
-
-       printf("%s%s", cmdp->cmdname, (verbose ? " is " : ""));
-       if (cmdp->cmdtype == CMDNORMAL) {
-               idx = cmdp->param.index;
-               path = pathval();
-               do {
-                       name = padvance(&path, cmdp->cmdname);
-                       stunalloc(name);
-               } while (--idx >= 0);
-               if(verbose)
-                       out1str(name);
-       } else if (cmdp->cmdtype == CMDBUILTIN) {
-               if(verbose)
-                       out1str("a shell builtin");
-       } else if (cmdp->cmdtype == CMDFUNCTION) {
-               if (verbose) {
-                       INTOFF;
-                       out1str("a function\n");
-                       name = commandtext(cmdp->param.func);
-                       printf("%s() {\n %s\n}", cmdp->cmdname, name);
-                       ckfree(name);
-                       INTON;
-               }
-#ifdef DEBUG
-       } else {
-               error("internal error: cmdtype %d", cmdp->cmdtype);
-#endif
-       }
-       printf(snlfmt, cmdp->rehash ? "*" : nullstr);
-}
-
-
-
-/*** List the available builtins ***/
-
-
-static int helpcmd(int argc, char** argv)
-{
-       int col, i;
-
-       printf("\nBuilt-in commands:\n-------------------\n");
-       for (col=0, i=0; i < NUMBUILTINS; i++) {
-               col += printf("%c%s", ((col == 0) ? '\t' : ' '),
-                               builtincmds[i].name+1);
-               if (col > 60) {
-                       printf("\n");
-                       col = 0;
-               }
-       }
-#ifdef BB_FEATURE_SH_STANDALONE_SHELL
-       {
-               extern const struct BB_applet applets[];
-               extern const size_t NUM_APPLETS;
-
-               for (i=0; i < NUM_APPLETS; i++) {
-
-                       col += printf("%c%s", ((col == 0) ? '\t' : ' '),
-                                       applets[i].name);
-                       if (col > 60) {
-                               printf("\n");
-                               col = 0;
-                       }
-               }
-       }
-#endif
-       printf("\n\n");
-       return EXIT_SUCCESS;
-}
-
-/*
- * Resolve a command name.  If you change this routine, you may have to
- * change the shellexec routine as well.
- */
-
-static int prefix (const char *, const char *);
-
-static void
-find_command(const char *name, struct cmdentry *entry, int act, const char *path)
-{
-       struct tblentry *cmdp;
-       int idx;
-       int prev;
-       char *fullname;
-       struct stat statb;
-       int e;
-       int bltin;
-       int firstchange;
-       int updatetbl;
-       int regular;
-       struct builtincmd *bcmd;
-
-       /* If name contains a slash, don't use the hash table */
-       if (strchr(name, '/') != NULL) {
-               if (act & DO_ABS) {
-                       while (stat(name, &statb) < 0) {
-                               if (errno != ENOENT && errno != ENOTDIR)
-                                       e = errno;
-                               entry->cmdtype = CMDUNKNOWN;
-                               entry->u.index = -1;
-                               return;
-                       }
-                       entry->cmdtype = CMDNORMAL;
-                       entry->u.index = -1;
-                       return;
-               }
-               entry->cmdtype = CMDNORMAL;
-               entry->u.index = 0;
-               return;
-       }
-
-       updatetbl = 1;
-       if (act & DO_BRUTE) {
-               firstchange = path_change(path, &bltin);
-       } else {
-               bltin = builtinloc;
-               firstchange = 9999;
-       }
-
-       /* If name is in the table, and not invalidated by cd, we're done */
-       if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->rehash == 0) {
-               if (cmdp->cmdtype == CMDFUNCTION) {
-                       if (act & DO_NOFUN) {
-                               updatetbl = 0;
-                       } else {
-                               goto success;
-                       }
-               } else if (act & DO_BRUTE) {
-                       if ((cmdp->cmdtype == CMDNORMAL &&
-                            cmdp->param.index >= firstchange) ||
-                           (cmdp->cmdtype == CMDBUILTIN &&
-                            ((builtinloc < 0 && bltin >= 0) ?
-                             bltin : builtinloc) >= firstchange)) {
-                               /* need to recompute the entry */
-                       } else {
-                               goto success;
-                       }
-               } else {
-                       goto success;
-               }
-       }
-
-       bcmd = find_builtin(name);
-       regular = bcmd && IS_BUILTIN_REGULAR(bcmd);
-
-       if (regular) {
-               if (cmdp && (cmdp->cmdtype == CMDBUILTIN)) {
-                       goto success;
-               }
-       } else if (act & DO_BRUTE) {
-               if (firstchange == 0) {
-                       updatetbl = 0;
-               }
-       }
-
-       /* If %builtin not in path, check for builtin next */
-       if (regular || (bltin < 0 && bcmd)) {
-builtin:
-               if (!updatetbl) {
-                       entry->cmdtype = CMDBUILTIN;
-                       entry->u.cmd = bcmd;
-                       return;
-               }
-               INTOFF;
-               cmdp = cmdlookup(name, 1);
-               cmdp->cmdtype = CMDBUILTIN;
-               cmdp->param.cmd = bcmd;
-               INTON;
-               goto success;
-       }
-
-       /* We have to search path. */
-       prev = -1;              /* where to start */
-       if (cmdp && cmdp->rehash) {     /* doing a rehash */
-               if (cmdp->cmdtype == CMDBUILTIN)
-                       prev = builtinloc;
-               else
-                       prev = cmdp->param.index;
-       }
-
-       e = ENOENT;
-       idx = -1;
-loop:
-       while ((fullname = padvance(&path, name)) != NULL) {
-               stunalloc(fullname);
-               idx++;
-               if (idx >= firstchange) {
-                       updatetbl = 0;
-               }
-               if (pathopt) {
-                       if (prefix("builtin", pathopt)) {
-                               if ((bcmd = find_builtin(name))) {
-                                       goto builtin;
-                               }
-                               continue;
-                       } else if (!(act & DO_NOFUN) &&
-                                  prefix("func", pathopt)) {
-                               /* handled below */
-                       } else {
-                               continue;       /* ignore unimplemented options */
-                       }
-               }
-               /* if rehash, don't redo absolute path names */
-               if (fullname[0] == '/' && idx <= prev &&
-                   idx < firstchange) {
-                       if (idx < prev)
-                               continue;
-                       TRACE(("searchexec \"%s\": no change\n", name));
-                       goto success;
-               }
-               while (stat(fullname, &statb) < 0) {
-                       if (errno != ENOENT && errno != ENOTDIR)
-                               e = errno;
-                       goto loop;
-               }
-               e = EACCES;     /* if we fail, this will be the error */
-               if (!S_ISREG(statb.st_mode))
-                       continue;
-               if (pathopt) {          /* this is a %func directory */
-                       stalloc(strlen(fullname) + 1);
-                       readcmdfile(fullname);
-                       if ((cmdp = cmdlookup(name, 0)) == NULL || cmdp->cmdtype != CMDFUNCTION)
-                               error("%s not defined in %s", name, fullname);
-                       stunalloc(fullname);
-                       goto success;
-               }
-               TRACE(("searchexec \"%s\" returns \"%s\"\n", name, fullname));
-               /* If we aren't called with DO_BRUTE and cmdp is set, it must
-                  be a function and we're being called with DO_NOFUN */
-               if (!updatetbl) {
-                       entry->cmdtype = CMDNORMAL;
-                       entry->u.index = idx;
-                       return;
-               }
-               INTOFF;
-               cmdp = cmdlookup(name, 1);
-               cmdp->cmdtype = CMDNORMAL;
-               cmdp->param.index = idx;
-               INTON;
-               goto success;
-       }
-
-       /* We failed.  If there was an entry for this command, delete it */
-       if (cmdp && updatetbl)
-               delete_cmd_entry();
-       if (act & DO_ERR)
-               out2fmt("%s: %s\n", name, errmsg(e, E_EXEC));
-       entry->cmdtype = CMDUNKNOWN;
-       return;
-
-success:
-       cmdp->rehash = 0;
-       entry->cmdtype = cmdp->cmdtype;
-       entry->u = cmdp->param;
-}
-
-
-
-/*
- * Search the table of builtin commands.
- */
-
-static int
-bstrcmp(const void *name, const void *b)
-{
-       return strcmp((const char *)name, (*(const char *const *) b)+1);
-}
-
-static struct builtincmd *
-find_builtin(const char *name)
-{
-       struct builtincmd *bp;
-
-       bp = bsearch(name, builtincmds, NUMBUILTINS, sizeof(struct builtincmd),
-               bstrcmp
-       );
-       return bp;
-}
-
-
-/*
- * Called when a cd is done.  Marks all commands so the next time they
- * are executed they will be rehashed.
- */
-
-static void
-hashcd(void) {
-       struct tblentry **pp;
-       struct tblentry *cmdp;
-
-       for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) {
-               for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) {
-                       if (cmdp->cmdtype == CMDNORMAL
-                        || (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0))
-                               cmdp->rehash = 1;
-               }
-       }
-}
-
-
-
-/*
- * Called before PATH is changed.  The argument is the new value of PATH;
- * pathval() still returns the old value at this point.  Called with
- * interrupts off.
- */
-
-static void
-changepath(const char *newval)
-{
-       int firstchange;
-       int bltin;
-
-       firstchange = path_change(newval, &bltin);
-       if (builtinloc < 0 && bltin >= 0)
-               builtinloc = bltin;             /* zap builtins */
-       clearcmdentry(firstchange);
-       builtinloc = bltin;
-}
-
-
-/*
- * Clear out command entries.  The argument specifies the first entry in
- * PATH which has changed.
- */
-
-static void
-clearcmdentry(firstchange)
-       int firstchange;
-{
-       struct tblentry **tblp;
-       struct tblentry **pp;
-       struct tblentry *cmdp;
-
-       INTOFF;
-       for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) {
-               pp = tblp;
-               while ((cmdp = *pp) != NULL) {
-                       if ((cmdp->cmdtype == CMDNORMAL &&
-                            cmdp->param.index >= firstchange)
-                        || (cmdp->cmdtype == CMDBUILTIN &&
-                            builtinloc >= firstchange)) {
-                               *pp = cmdp->next;
-                               ckfree(cmdp);
-                       } else {
-                               pp = &cmdp->next;
-                       }
-               }
-       }
-       INTON;
-}
-
-
-/*
- * Delete all functions.
- */
-
-static void
-deletefuncs(void) {
-