diff options
-rw-r--r-- | Changelog | 4 | ||||
-rw-r--r-- | applets.h | 253 | ||||
-rw-r--r-- | applets/busybox.c | 4 | ||||
-rw-r--r-- | busybox.c | 4 | ||||
-rw-r--r-- | busybox.h | 247 | ||||
-rw-r--r-- | include/applets.h | 253 | ||||
-rw-r--r-- | include/busybox.h | 247 | ||||
-rw-r--r-- | lash.c | 1 | ||||
-rw-r--r-- | sh.c | 1 | ||||
-rw-r--r-- | shell/lash.c | 1 |
10 files changed, 302 insertions, 713 deletions
@@ -13,9 +13,11 @@ (it was reading the whole thing and then writing it out). Also updated usage information (was missing conv=notrunc) and added conv=sync feature. - * Larry Doolittle (in collaboration with Matt Kraai) to allow for a + * Larry Doolittle (in collaboration with Matt Kraai) -- allow for a pristine source directory -- where all the .o files and such are not placed into the source tree. Thanks Larry! + * Larry Doolittle -- use the applet definitions in applets.h + to autogenerate the applet function and usage prototypes. -Erik Andersen @@ -10,366 +10,379 @@ * file result in the listing remaining in ascii order. You have been warned. */ +#ifndef PROTOTYPES const struct BB_applet applets[] = { +#define APPLET(a,b,c,d) {a,b,c,d}, +#define APPLET_NOUSAGE(a,b,c) {a,b,c,NULL}, +#else +#define APPLET(a,b,c,d) \ + extern int b(int argc, char **argv); \ + extern const char d[]; +#define APPLET_NOUSAGE(a,b,c) \ + extern int b(int argc, char **argv); +#endif #ifdef BB_TEST - {"[", test_main, _BB_DIR_USR_BIN, test_usage}, + APPLET("[", test_main, _BB_DIR_USR_BIN, test_usage) #endif #ifdef BB_AR - {"ar", ar_main, _BB_DIR_USR_BIN, ar_usage}, + APPLET("ar", ar_main, _BB_DIR_USR_BIN, ar_usage) #endif #ifdef BB_BASENAME - {"basename", basename_main, _BB_DIR_USR_BIN, basename_usage}, + APPLET("basename", basename_main, _BB_DIR_USR_BIN, basename_usage) #endif - {"busybox", busybox_main, _BB_DIR_BIN, NULL}, + APPLET_NOUSAGE("busybox", busybox_main, _BB_DIR_BIN) #ifdef BB_CAT - {"cat", cat_main, _BB_DIR_BIN, cat_usage}, + APPLET("cat", cat_main, _BB_DIR_BIN, cat_usage) #endif #ifdef BB_CHMOD_CHOWN_CHGRP - {"chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN, chgrp_usage}, + APPLET("chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN, chgrp_usage) #endif #ifdef BB_CHMOD_CHOWN_CHGRP - {"chmod", chmod_chown_chgrp_main, _BB_DIR_BIN, chmod_usage}, + APPLET("chmod", chmod_chown_chgrp_main, _BB_DIR_BIN, chmod_usage) #endif #ifdef BB_CHMOD_CHOWN_CHGRP - {"chown", chmod_chown_chgrp_main, _BB_DIR_BIN, chown_usage}, + APPLET("chown", chmod_chown_chgrp_main, _BB_DIR_BIN, chown_usage) #endif #ifdef BB_CHROOT - {"chroot", chroot_main, _BB_DIR_USR_SBIN, chroot_usage}, + APPLET("chroot", chroot_main, _BB_DIR_USR_SBIN, chroot_usage) #endif #ifdef BB_CHVT - {"chvt", chvt_main, _BB_DIR_USR_BIN, chvt_usage}, + APPLET("chvt", chvt_main, _BB_DIR_USR_BIN, chvt_usage) #endif #ifdef BB_CLEAR - {"clear", clear_main, _BB_DIR_USR_BIN, clear_usage}, + APPLET("clear", clear_main, _BB_DIR_USR_BIN, clear_usage) #endif #ifdef BB_CMP - {"cmp", cmp_main, _BB_DIR_USR_BIN, cmp_usage}, + APPLET("cmp", cmp_main, _BB_DIR_USR_BIN, cmp_usage) #endif #ifdef BB_CP_MV - {"cp", cp_mv_main, _BB_DIR_BIN, cp_usage}, + APPLET("cp", cp_mv_main, _BB_DIR_BIN, cp_usage) #endif #ifdef BB_CUT - {"cut", cut_main, _BB_DIR_USR_BIN, cut_usage}, + APPLET("cut", cut_main, _BB_DIR_USR_BIN, cut_usage) #endif #ifdef BB_DATE - {"date", date_main, _BB_DIR_BIN, date_usage}, + APPLET("date", date_main, _BB_DIR_BIN, date_usage) #endif #ifdef BB_DC - {"dc", dc_main, _BB_DIR_USR_BIN, dc_usage}, + APPLET("dc", dc_main, _BB_DIR_USR_BIN, dc_usage) #endif #ifdef BB_DD - {"dd", dd_main, _BB_DIR_BIN, dd_usage}, + APPLET("dd", dd_main, _BB_DIR_BIN, dd_usage) #endif #ifdef BB_DEALLOCVT - {"deallocvt", deallocvt_main, _BB_DIR_USR_BIN, deallocvt_usage}, + APPLET("deallocvt", deallocvt_main, _BB_DIR_USR_BIN, deallocvt_usage) #endif #ifdef BB_DF - {"df", df_main, _BB_DIR_BIN, df_usage}, + APPLET("df", df_main, _BB_DIR_BIN, df_usage) #endif #ifdef BB_DIRNAME - {"dirname", dirname_main, _BB_DIR_USR_BIN, dirname_usage}, + APPLET("dirname", dirname_main, _BB_DIR_USR_BIN, dirname_usage) #endif #ifdef BB_DMESG - {"dmesg", dmesg_main, _BB_DIR_BIN, dmesg_usage}, + APPLET("dmesg", dmesg_main, _BB_DIR_BIN, dmesg_usage) #endif #ifdef BB_DOS2UNIX - {"dos2unix", dos2unix_main, _BB_DIR_USR_BIN, dos2unix_usage}, + APPLET("dos2unix", dos2unix_main, _BB_DIR_USR_BIN, dos2unix_usage) #endif #ifdef BB_DU - {"du", du_main, _BB_DIR_USR_BIN, du_usage}, + APPLET("du", du_main, _BB_DIR_USR_BIN, du_usage) #endif #ifdef BB_DUMPKMAP - {"dumpkmap", dumpkmap_main, _BB_DIR_BIN, dumpkmap_usage}, + APPLET("dumpkmap", dumpkmap_main, _BB_DIR_BIN, dumpkmap_usage) #endif #ifdef BB_DUTMP - {"dutmp", dutmp_main, _BB_DIR_USR_SBIN, dutmp_usage}, + APPLET("dutmp", dutmp_main, _BB_DIR_USR_SBIN, dutmp_usage) #endif #ifdef BB_ECHO - {"echo", echo_main, _BB_DIR_BIN, echo_usage}, + APPLET("echo", echo_main, _BB_DIR_BIN, echo_usage) #endif #ifdef BB_EXPR - {"expr", expr_main, _BB_DIR_USR_BIN, expr_usage}, + APPLET("expr", expr_main, _BB_DIR_USR_BIN, expr_usage) #endif #ifdef BB_TRUE_FALSE - {"false", false_main, _BB_DIR_BIN, false_usage}, + APPLET("false", false_main, _BB_DIR_BIN, false_usage) #endif #ifdef BB_FBSET - {"fbset", fbset_main, _BB_DIR_USR_SBIN, NULL}, + APPLET_NOUSAGE("fbset", fbset_main, _BB_DIR_USR_SBIN) #endif #ifdef BB_FDFLUSH - {"fdflush", fdflush_main, _BB_DIR_BIN, fdflush_usage}, + APPLET("fdflush", fdflush_main, _BB_DIR_BIN, fdflush_usage) #endif #ifdef BB_FIND - {"find", find_main, _BB_DIR_USR_BIN, find_usage}, + APPLET("find", find_main, _BB_DIR_USR_BIN, find_usage) #endif #ifdef BB_FREE - {"free", free_main, _BB_DIR_USR_BIN, free_usage}, + APPLET("free", free_main, _BB_DIR_USR_BIN, free_usage) #endif #ifdef BB_FREERAMDISK - {"freeramdisk", freeramdisk_main, _BB_DIR_SBIN, freeramdisk_usage}, + APPLET("freeramdisk", freeramdisk_main, _BB_DIR_SBIN, freeramdisk_usage) #endif #ifdef BB_FSCK_MINIX - {"fsck.minix", fsck_minix_main, _BB_DIR_SBIN, fsck_minix_usage}, + APPLET("fsck.minix", fsck_minix_main, _BB_DIR_SBIN, fsck_minix_usage) #endif #ifdef BB_GETOPT - {"getopt", getopt_main, _BB_DIR_BIN, getopt_usage}, + APPLET("getopt", getopt_main, _BB_DIR_BIN, getopt_usage) #endif #ifdef BB_GREP - {"grep", grep_main, _BB_DIR_BIN, grep_usage}, + APPLET("grep", grep_main, _BB_DIR_BIN, grep_usage) #endif #ifdef BB_GUNZIP - {"gunzip", gunzip_main, _BB_DIR_BIN, gunzip_usage}, + APPLET("gunzip", gunzip_main, _BB_DIR_BIN, gunzip_usage) #endif #ifdef BB_GZIP - {"gzip", gzip_main, _BB_DIR_BIN, gzip_usage}, + APPLET("gzip", gzip_main, _BB_DIR_BIN, gzip_usage) #endif #ifdef BB_HALT - {"halt", halt_main, _BB_DIR_SBIN, halt_usage}, + APPLET("halt", halt_main, _BB_DIR_SBIN, halt_usage) #endif #ifdef BB_HEAD - {"head", head_main, _BB_DIR_USR_BIN, head_usage}, + APPLET("head", head_main, _BB_DIR_USR_BIN, head_usage) #endif #ifdef BB_HOSTID - {"hostid", hostid_main, _BB_DIR_USR_BIN, hostid_usage}, + APPLET("hostid", hostid_main, _BB_DIR_USR_BIN, hostid_usage) #endif #ifdef BB_HOSTNAME - {"hostname", hostname_main, _BB_DIR_BIN, hostname_usage}, + APPLET("hostname", hostname_main, _BB_DIR_BIN, hostname_usage) #endif #ifdef BB_ID - {"id", id_main, _BB_DIR_USR_BIN, id_usage}, + APPLET("id", id_main, _BB_DIR_USR_BIN, id_usage) #endif #ifdef BB_INIT - {"init", init_main, _BB_DIR_SBIN, NULL}, + APPLET_NOUSAGE("init", init_main, _BB_DIR_SBIN) #endif #ifdef BB_INSMOD - {"insmod", insmod_main, _BB_DIR_SBIN, insmod_usage}, + APPLET("insmod", insmod_main, _BB_DIR_SBIN, insmod_usage) #endif #ifdef BB_KILL - {"kill", kill_main, _BB_DIR_BIN, kill_usage}, + APPLET("kill", kill_main, _BB_DIR_BIN, kill_usage) #endif #ifdef BB_KILLALL - {"killall", kill_main, _BB_DIR_USR_BIN, kill_usage}, + APPLET("killall", kill_main, _BB_DIR_USR_BIN, killall_usage) #endif #ifdef BB_LENGTH - {"length", length_main, _BB_DIR_USR_BIN, length_usage}, + APPLET("length", length_main, _BB_DIR_USR_BIN, length_usage) #endif #ifdef BB_LINUXRC - {"linuxrc", init_main, _BB_DIR_ROOT, NULL}, + APPLET_NOUSAGE("linuxrc", init_main, _BB_DIR_ROOT) #endif #ifdef BB_LN - {"ln", ln_main, _BB_DIR_BIN, ln_usage}, + APPLET("ln", ln_main, _BB_DIR_BIN, ln_usage) #endif #ifdef BB_LOADACM - {"loadacm", loadacm_main, _BB_DIR_USR_BIN, loadacm_usage}, + APPLET("loadacm", loadacm_main, _BB_DIR_USR_BIN, loadacm_usage) #endif #ifdef BB_LOADFONT - {"loadfont", loadfont_main, _BB_DIR_USR_BIN, loadfont_usage}, + APPLET("loadfont", loadfont_main, _BB_DIR_USR_BIN, loadfont_usage) #endif #ifdef BB_LOADKMAP - {"loadkmap", loadkmap_main, _BB_DIR_SBIN, loadkmap_usage}, + APPLET("loadkmap", loadkmap_main, _BB_DIR_SBIN, loadkmap_usage) #endif #ifdef BB_LOGGER - {"logger", logger_main, _BB_DIR_USR_BIN, logger_usage}, + APPLET("logger", logger_main, _BB_DIR_USR_BIN, logger_usage) #endif #ifdef BB_LOGNAME - {"logname", logname_main, _BB_DIR_USR_BIN, logname_usage}, + APPLET("logname", logname_main, _BB_DIR_USR_BIN, logname_usage) #endif #ifdef BB_LS - {"ls", ls_main, _BB_DIR_BIN, ls_usage}, + APPLET("ls", ls_main, _BB_DIR_BIN, ls_usage) #endif #ifdef BB_LSMOD - {"lsmod", lsmod_main, _BB_DIR_SBIN, lsmod_usage}, + APPLET("lsmod", lsmod_main, _BB_DIR_SBIN, lsmod_usage) #endif #ifdef BB_MAKEDEVS - {"makedevs", makedevs_main, _BB_DIR_SBIN, makedevs_usage}, + APPLET("makedevs", makedevs_main, _BB_DIR_SBIN, makedevs_usage) #endif #ifdef BB_MD5SUM - {"md5sum", md5sum_main, _BB_DIR_USR_BIN, md5sum_usage}, + APPLET("md5sum", md5sum_main, _BB_DIR_USR_BIN, md5sum_usage) #endif #ifdef BB_MKDIR - {"mkdir", mkdir_main, _BB_DIR_BIN, mkdir_usage}, + APPLET("mkdir", mkdir_main, _BB_DIR_BIN, mkdir_usage) #endif #ifdef BB_MKFIFO - {"mkfifo", mkfifo_main, _BB_DIR_USR_BIN, mkfifo_usage}, + APPLET("mkfifo", mkfifo_main, _BB_DIR_USR_BIN, mkfifo_usage) #endif #ifdef BB_MKFS_MINIX - {"mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN, mkfs_minix_usage}, + APPLET("mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN, mkfs_minix_usage) #endif #ifdef BB_MKNOD - {"mknod", mknod_main, _BB_DIR_BIN, mknod_usage}, + APPLET("mknod", mknod_main, _BB_DIR_BIN, mknod_usage) #endif #ifdef BB_MKSWAP - {"mkswap", mkswap_main, _BB_DIR_SBIN, mkswap_usage}, + APPLET("mkswap", mkswap_main, _BB_DIR_SBIN, mkswap_usage) #endif #ifdef BB_MKTEMP - {"mktemp", mktemp_main, _BB_DIR_BIN, mktemp_usage}, + APPLET("mktemp", mktemp_main, _BB_DIR_BIN, mktemp_usage) #endif #ifdef BB_MORE - {"more", more_main, _BB_DIR_BIN, more_usage}, + APPLET("more", more_main, _BB_DIR_BIN, more_usage) #endif #ifdef BB_MOUNT - {"mount", mount_main, _BB_DIR_BIN, mount_usage}, + APPLET("mount", mount_main, _BB_DIR_BIN, mount_usage) #endif #ifdef BB_MT - {"mt", mt_main, _BB_DIR_BIN, mt_usage}, + APPLET("mt", mt_main, _BB_DIR_BIN, mt_usage) #endif #ifdef BB_CP_MV - {"mv", cp_mv_main, _BB_DIR_BIN, mv_usage}, + APPLET("mv", cp_mv_main, _BB_DIR_BIN, mv_usage) #endif #ifdef BB_NC - {"nc", nc_main, _BB_DIR_USR_BIN, nc_usage}, + APPLET("nc", nc_main, _BB_DIR_USR_BIN, nc_usage) #endif #ifdef BB_NSLOOKUP - {"nslookup", nslookup_main, _BB_DIR_USR_BIN, nslookup_usage}, + APPLET("nslookup", nslookup_main, _BB_DIR_USR_BIN, nslookup_usage) #endif #ifdef BB_PING - {"ping", ping_main, _BB_DIR_BIN, ping_usage}, + APPLET("ping", ping_main, _BB_DIR_BIN, ping_usage) #endif #ifdef BB_POWEROFF - {"poweroff", poweroff_main, _BB_DIR_SBIN, poweroff_usage}, + APPLET("poweroff", poweroff_main, _BB_DIR_SBIN, poweroff_usage) #endif #ifdef BB_PRINTF - {"printf", printf_main, _BB_DIR_USR_BIN, printf_usage}, + APPLET("printf", printf_main, _BB_DIR_USR_BIN, printf_usage) #endif #ifdef BB_PS - {"ps", ps_main, _BB_DIR_BIN, ps_usage}, + APPLET("ps", ps_main, _BB_DIR_BIN, ps_usage) #endif #ifdef BB_PWD - {"pwd", pwd_main, _BB_DIR_BIN, pwd_usage}, + APPLET("pwd", pwd_main, _BB_DIR_BIN, pwd_usage) #endif #ifdef BB_RDATE - {"rdate", rdate_main, _BB_DIR_USR_BIN, rdate_usage}, + APPLET("rdate", rdate_main, _BB_DIR_USR_BIN, rdate_usage) #endif #ifdef BB_READLINK - {"readlink", readlink_main, _BB_DIR_USR_BIN, readlink_usage}, + APPLET("readlink", readlink_main, _BB_DIR_USR_BIN, readlink_usage) #endif #ifdef BB_REBOOT - {"reboot", reboot_main, _BB_DIR_SBIN, reboot_usage}, + APPLET("reboot", reboot_main, _BB_DIR_SBIN, reboot_usage) #endif #ifdef BB_RENICE - {"renice", renice_main, _BB_DIR_USR_BIN, renice_usage}, + APPLET("renice", renice_main, _BB_DIR_USR_BIN, renice_usage) #endif #ifdef BB_RESET - {"reset", reset_main, _BB_DIR_USR_BIN, reset_usage}, + APPLET("reset", reset_main, _BB_DIR_USR_BIN, reset_usage) #endif #ifdef BB_RM - {"rm", rm_main, _BB_DIR_BIN, rm_usage}, + APPLET("rm", rm_main, _BB_DIR_BIN, rm_usage) #endif #ifdef BB_RMDIR - {"rmdir", rmdir_main, _BB_DIR_BIN, rmdir_usage}, + APPLET("rmdir", rmdir_main, _BB_DIR_BIN, rmdir_usage) #endif #ifdef BB_RMMOD - {"rmmod", rmmod_main, _BB_DIR_SBIN, rmmod_usage}, + APPLET("rmmod", rmmod_main, _BB_DIR_SBIN, rmmod_usage) #endif #ifdef BB_RPMUNPACK - {"rpmunpack", rpmunpack_main, _BB_DIR_USR_BIN, rpmunpack_usage}, + APPLET("rpmunpack", rpmunpack_main, _BB_DIR_USR_BIN, rpmunpack_usage) #endif #ifdef BB_SED - {"sed", sed_main, _BB_DIR_BIN, sed_usage}, + APPLET("sed", sed_main, _BB_DIR_BIN, sed_usage) #endif #ifdef BB_SETKEYCODES - {"setkeycodes", setkeycodes_main, _BB_DIR_USR_BIN, setkeycodes_usage}, + APPLET("setkeycodes", setkeycodes_main, _BB_DIR_USR_BIN, setkeycodes_usage) #endif #ifdef BB_SH - {"sh", shell_main, _BB_DIR_BIN, shell_usage}, + APPLET("sh", shell_main, _BB_DIR_BIN, shell_usage) #endif #ifdef BB_SLEEP - {"sleep", sleep_main, _BB_DIR_BIN, sleep_usage}, + APPLET("sleep", sleep_main, _BB_DIR_BIN, sleep_usage) #endif #ifdef BB_SORT - {"sort", sort_main, _BB_DIR_USR_BIN, sort_usage}, + APPLET("sort", sort_main, _BB_DIR_USR_BIN, sort_usage) #endif #ifdef BB_SWAPONOFF - {"swapoff", swap_on_off_main, _BB_DIR_SBIN, swapoff_usage}, + APPLET("swapoff", swap_on_off_main, _BB_DIR_SBIN, swapoff_usage) #endif #ifdef BB_SWAPONOFF - {"swapon", swap_on_off_main, _BB_DIR_SBIN, swapon_usage}, + APPLET("swapon", swap_on_off_main, _BB_DIR_SBIN, swapon_usage) #endif #ifdef BB_SYNC - {"sync", sync_main, _BB_DIR_BIN, sync_usage}, + APPLET("sync", sync_main, _BB_DIR_BIN, sync_usage) #endif #ifdef BB_SYSLOGD - {"syslogd", syslogd_main, _BB_DIR_SBIN, syslogd_usage}, + APPLET("syslogd", syslogd_main, _BB_DIR_SBIN, syslogd_usage) #endif #ifdef BB_TAIL - {"tail", tail_main, _BB_DIR_USR_BIN, tail_usage}, + APPLET("tail", tail_main, _BB_DIR_USR_BIN, tail_usage) #endif #ifdef BB_TAR - {"tar", tar_main, _BB_DIR_BIN, tar_usage}, + APPLET("tar", tar_main, _BB_DIR_BIN, tar_usage) #endif #ifdef BB_TEE - {"tee", tee_main, _BB_DIR_USR_BIN, tee_usage}, + APPLET("tee", tee_main, _BB_DIR_USR_BIN, tee_usage) #endif #ifdef BB_TELNET - {"telnet", telnet_main, _BB_DIR_USR_BIN, telnet_usage}, + APPLET("telnet", telnet_main, _BB_DIR_USR_BIN, telnet_usage) #endif #ifdef BB_TEST - {"test", test_main, _BB_DIR_USR_BIN, test_usage}, + APPLET("test", test_main, _BB_DIR_USR_BIN, test_usage) #endif #ifdef BB_TOUCH - {"touch", touch_main, _BB_DIR_BIN, touch_usage}, + APPLET("touch", touch_main, _BB_DIR_BIN, touch_usage) #endif #ifdef BB_TR - {"tr", tr_main, _BB_DIR_USR_BIN, tr_usage}, + APPLET("tr", tr_main, _BB_DIR_USR_BIN, tr_usage) #endif #ifdef BB_TRUE_FALSE - {"true", true_main, _BB_DIR_BIN, true_usage}, + APPLET("true", true_main, _BB_DIR_BIN, true_usage) #endif #ifdef BB_TTY - {"tty", tty_main, _BB_DIR_USR_BIN, tty_usage}, + APPLET("tty", tty_main, _BB_DIR_USR_BIN, tty_usage) #endif #ifdef BB_UMOUNT - {"umount", umount_main, _BB_DIR_BIN, umount_usage}, + APPLET("umount", umount_main, _BB_DIR_BIN, umount_usage) #endif #ifdef BB_UNAME - {"uname", uname_main, _BB_DIR_BIN, uname_usage}, + APPLET("uname", uname_main, _BB_DIR_BIN, uname_usage) #endif #ifdef BB_UNIQ - {"uniq", uniq_main, _BB_DIR_USR_BIN, uniq_usage}, + APPLET("uniq", uniq_main, _BB_DIR_USR_BIN, uniq_usage) #endif #ifdef BB_UNIX2DOS - {"unix2dos", unix2dos_main, _BB_DIR_USR_BIN, unix2dos_usage}, + APPLET("unix2dos", unix2dos_main, _BB_DIR_USR_BIN, unix2dos_usage) #endif #ifdef BB_UPDATE - {"update", update_main, _BB_DIR_SBIN, update_usage}, + APPLET("update", update_main, _BB_DIR_SBIN, update_usage) #endif #ifdef BB_UPTIME - {"uptime", uptime_main, _BB_DIR_USR_BIN, uptime_usage}, + APPLET("uptime", uptime_main, _BB_DIR_USR_BIN, uptime_usage) #endif #ifdef BB_USLEEP - {"usleep", usleep_main, _BB_DIR_BIN, usleep_usage}, + APPLET("usleep", usleep_main, _BB_DIR_BIN, usleep_usage) #endif #ifdef BB_UUDECODE - {"uudecode", uudecode_main, _BB_DIR_USR_BIN, uudecode_usage}, + APPLET("uudecode", uudecode_main, _BB_DIR_USR_BIN, uudecode_usage) #endif #ifdef BB_UUENCODE - {"uuencode", uuencode_main, _BB_DIR_USR_BIN, uuencode_usage}, + APPLET("uuencode", uuencode_main, _BB_DIR_USR_BIN, uuencode_usage) #endif #ifdef BB_WC - {"wc", wc_main, _BB_DIR_USR_BIN, wc_usage}, + APPLET("wc", wc_main, _BB_DIR_USR_BIN, wc_usage) #endif #ifdef BB_WGET - {"wget", wget_main, _BB_DIR_USR_BIN, wget_usage}, + APPLET("wget", wget_main, _BB_DIR_USR_BIN, wget_usage) #endif #ifdef BB_WHICH - {"which", which_main, _BB_DIR_USR_BIN, which_usage}, + APPLET("which", which_main, _BB_DIR_USR_BIN, which_usage) #endif #ifdef BB_WHOAMI - {"whoami", whoami_main, _BB_DIR_USR_BIN, whoami_usage}, + APPLET("whoami", whoami_main, _BB_DIR_USR_BIN, whoami_usage) #endif #ifdef BB_XARGS - {"xargs", xargs_main, _BB_DIR_USR_BIN, xargs_usage}, + APPLET("xargs", xargs_main, _BB_DIR_USR_BIN, xargs_usage) #endif #ifdef BB_YES - {"yes", yes_main, _BB_DIR_USR_BIN, yes_usage}, + APPLET("yes", yes_main, _BB_DIR_USR_BIN, yes_usage) #endif #ifdef BB_GUNZIP - {"zcat", gunzip_main, _BB_DIR_BIN, gunzip_usage}, + APPLET("zcat", gunzip_main, _BB_DIR_BIN, gunzip_usage) #endif - {0,NULL,0,NULL} + +#ifndef PROTOTYPES + { 0,NULL,0,NULL} }; /* The -1 arises because of the {0,NULL,0,NULL} entry above. */ size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1); +#endif diff --git a/applets/busybox.c b/applets/busybox.c index 0a3333d99..857367b5f 100644 --- a/applets/busybox.c +++ b/applets/busybox.c @@ -3,6 +3,10 @@ #include <stdio.h> #include <string.h> #include <errno.h> + +#undef APPLET +#undef APPLET_NOUSAGE +#undef PROTOTYPES #include "applets.h" #define bb_need_full_version @@ -3,6 +3,10 @@ #include <stdio.h> #include <string.h> #include <errno.h> + +#undef APPLET +#undef APPLET_NOUSAGE +#undef PROTOTYPES #include "applets.h" #define bb_need_full_version @@ -108,244 +108,19 @@ struct BB_applet { /* From busybox.c */ extern const struct BB_applet applets[]; -extern size_t NUM_APPLETS; - - -extern int applet_name_compare(const void *x, const void *y); - -extern int ar_main(int argc, char **argv); -extern int basename_main(int argc, char **argv); -extern int bogomips_main(int argc, char **argv); -extern int busybox_main(int argc, char** argv); -extern int cat_main(int argc, char** argv); -extern int chmod_chown_chgrp_main(int argc, char** argv); -extern int chroot_main(int argc, char** argv); -extern int chvt_main(int argc, char** argv); -extern int clear_main(int argc, char** argv); -extern int cmp_main(int argc, char** argv); -extern int cp_mv_main(int argc, char** argv); -extern int cut_main(int argc, char** argv); -extern int date_main(int argc, char** argv); -extern int dc_main(int argc, char** argv); -extern int dd_main(int argc, char** argv); -extern int dirname_main(int argc, char** argv); -extern int deallocvt_main(int argc, char** argv); -extern int df_main(int argc, char** argv); -extern int dmesg_main(int argc, char** argv); -extern int dos2unix_main(int argc, char** argv); -extern int du_main(int argc, char** argv); -extern int dumpkmap_main(int argc, char** argv); -extern int dutmp_main(int argc, char** argv); -extern int echo_main(int argc, char** argv); -extern int expr_main(int argc, char** argv); -extern int false_main(int argc, char** argv); -extern int fbset_main(int argc, char** argv); -extern int fdisk_main(int argc, char** argv); -extern int fdflush_main(int argc, char **argv); -extern int fsck_minix_main(int argc, char **argv); -extern int find_main(int argc, char** argv); -extern int free_main(int argc, char** argv); -extern int freeramdisk_main(int argc, char** argv); -extern int getopt_main(int argc, char** argv); -extern int grep_main(int argc, char** argv); -extern int gunzip_main (int argc, char** argv); -extern int gzip_main(int argc, char** argv); -extern int halt_main(int argc, char** argv); -extern int head_main(int argc, char** argv); -extern int hostid_main(int argc, char** argv); -extern int hostname_main(int argc, char** argv); -extern int id_main(int argc, char** argv); -extern int init_main(int argc, char** argv); -extern int insmod_main(int argc, char** argv); -extern int kill_main(int argc, char** argv); -extern int length_main(int argc, char** argv); -extern int ln_main(int argc, char** argv); -extern int loadacm_main(int argc, char** argv); -extern int loadfont_main(int argc, char** argv); -extern int loadkmap_main(int argc, char** argv); -extern int losetup_main(int argc, char** argv); -extern int logger_main(int argc, char **argv); -extern int logname_main(int argc, char **argv); -extern int ls_main(int argc, char** argv); -extern int lsmod_main(int argc, char** argv); -extern int makedevs_main(int argc, char** argv); -extern int md5sum_main(int argc, char** argv); -extern int mkdir_main(int argc, char** argv); -extern int mkfifo_main(int argc, char **argv); -extern int mkfs_minix_main(int argc, char **argv); -extern int mknod_main(int argc, char** argv); -extern int mkswap_main(int argc, char** argv); -extern int mktemp_main(int argc, char **argv); -extern int nc_main(int argc, char** argv); -extern int more_main(int argc, char** argv); -extern int mount_main(int argc, char** argv); -extern int mt_main(int argc, char** argv); -extern int nslookup_main(int argc, char **argv); -extern int ping_main(int argc, char **argv); -extern int poweroff_main(int argc, char **argv); -extern int printf_main(int argc, char** argv); -extern int ps_main(int argc, char** argv); -extern int pwd_main(int argc, char** argv); -extern int rdate_main(int argc, char** argv); -extern int readlink_main(int argc, char** argv); -extern int reboot_main(int argc, char** argv); -extern int renice_main(int argc, char** argv); -extern int reset_main(int argc, char** argv); -extern int rm_main(int argc, char** argv); -extern int rmdir_main(int argc, char **argv); -extern int rmmod_main(int argc, char** argv); -extern int rpmunpack_main(int argc, char** argv); -extern int sed_main(int argc, char** argv); -extern int sfdisk_main(int argc, char** argv); -extern int setkeycodes_main(int argc, char** argv); -extern int shell_main(int argc, char** argv); -extern int sleep_main(int argc, char** argv); -extern int sort_main(int argc, char** argv); -extern int swap_on_off_main(int argc, char** argv); -extern int sync_main(int argc, char** argv); -extern int syslogd_main(int argc, char **argv); -extern int tail_main(int argc, char** argv); -extern int tar_main(int argc, char** argv); -extern int tee_main(int argc, char** argv); -extern int test_main(int argc, char** argv); -extern int telnet_main(int argc, char** argv); -extern int touch_main(int argc, char** argv); -extern int tr_main(int argc, char** argv); -extern int true_main(int argc, char** argv); -extern int tput_main(int argc, char** argv); -extern int tryopen_main(int argc, char** argv); -extern int tty_main(int argc, char** argv); -extern int umount_main(int argc, char** argv); -extern int uname_main(int argc, char** argv); -extern int uniq_main(int argc, char** argv); -extern int unix2dos_main(int argc, char** argv); -extern int update_main(int argc, char** argv); -extern int uptime_main(int argc, char** argv); -extern int usleep_main(int argc, char** argv); -extern int uuencode_main(int argc, char** argv); -extern int uudecode_main(int argc, char** argv); -extern int wc_main(int argc, char** argv); -extern int wget_main(int argc, char** argv); -extern int which_main(int argc, char** argv); -extern int whoami_main(int argc, char** argv); -extern int xargs_main(int argc, char** argv); -extern int yes_main(int argc, char** argv); - -extern const char ar_usage[]; -extern const char basename_usage[]; -extern const char cat_usage[]; -extern const char chgrp_usage[]; -extern const char chmod_usage[]; -extern const char chown_usage[]; -extern const char chroot_usage[]; -extern const char chvt_usage[]; -extern const char clear_usage[]; -extern const char cmp_usage[]; -extern const char cp_usage[]; -extern const char cut_usage[]; -extern const char date_usage[]; -extern const char dc_usage[]; -extern const char dd_usage[]; -extern const char deallocvt_usage[]; -extern const char df_usage[]; -extern const char dirname_usage[]; -extern const char dmesg_usage[]; -extern const char dos2unix_usage[]; -extern const char du_usage[]; -extern const char dumpkmap_usage[]; -extern const char dutmp_usage[]; -extern const char echo_usage[]; -extern const char expr_usage[]; -extern const char false_usage[]; -extern const char fdflush_usage[]; -extern const char find_usage[]; -extern const char free_usage[]; -extern const char freeramdisk_usage[]; -extern const char fsck_minix_usage[]; -extern const char getopt_usage[]; -extern const char grep_usage[]; -extern const char gunzip_usage[]; -extern const char gzip_usage[]; -extern const char halt_usage[]; -extern const char head_usage[]; -extern const char hostid_usage[]; -extern const char hostname_usage[]; -extern const char id_usage[]; -extern const char insmod_usage[]; -extern const char kill_usage[]; -extern const char killall_usage[]; -extern const char length_usage[]; -extern const char ln_usage[]; -extern const char loadacm_usage[]; -extern const char loadfont_usage[]; -extern const char loadkmap_usage[]; -extern const char logger_usage[]; -extern const char logname_usage[]; -extern const char ls_usage[]; -extern const char lsmod_usage[]; -extern const char makedevs_usage[]; -extern const char md5sum_usage[]; -extern const char mkdir_usage[]; -extern const char mkfifo_usage[]; -extern const char mkfs_minix_usage[]; -extern const char mknod_usage[]; -extern const char mkswap_usage[]; -extern const char mktemp_usage[]; -extern const char more_usage[]; -extern const char mount_usage[]; -extern const char mt_usage[]; -extern const char mv_usage[]; -extern const char nc_usage[]; -extern const char nslookup_usage[]; -extern const char ping_usage[]; -extern const char poweroff_usage[]; -extern const char printf_usage[]; -extern const char ps_usage[]; -extern const char pwd_usage[]; -extern const char rdate_usage[]; -extern const char readlink_usage[]; -extern const char reboot_usage[]; -extern const char renice_usage[]; -extern const char reset_usage[]; -extern const char rm_usage[]; -extern const char rmdir_usage[]; -extern const char rmmod_usage[]; -extern const char rpmunpack_usage[]; -extern const char sed_usage[]; -extern const char setkeycodes_usage[]; -extern const char shell_usage[]; -extern const char sleep_usage[]; -extern const char sort_usage[]; -extern const char swapoff_usage[]; -extern const char swapon_usage[]; -extern const char sync_usage[]; -extern const char syslogd_usage[]; -extern const char tail_usage[]; -extern const char tar_usage[]; -extern const char tee_usage[]; -extern const char telnet_usage[]; -extern const char test_usage[]; -extern const char touch_usage[]; -extern const char tr_usage[]; -extern const char true_usage[]; -extern const char tty_usage[]; -extern const char umount_usage[]; -extern const char uname_usage[]; -extern const char uniq_usage[]; -extern const char unix2dos_usage[]; -extern const char update_usage[]; -extern const char uptime_usage[]; -extern const char usleep_usage[]; -extern const char uudecode_usage[]; -extern const char uuencode_usage[]; -extern const char wc_usage[]; -extern const char wget_usage[]; -extern const char which_usage[]; -extern const char whoami_usage[]; -extern const char xargs_usage[]; -extern const char yes_usage[]; +/* Automagically pull in all the applet function prototypes and + * applet usage strings. + * These are all of the form: + * extern int foo_main(int argc, char **argv); + * extern const char foo_usage[]; + * These are all autogenerated from the set of currently defined applets. + */ +#define PROTOTYPES +#include "applets.h" +#undef PROTOTYPES extern const char *applet_name; +extern int applet_name_compare(const void *x, const void *y); extern void usage(const char *usage) __attribute__ ((noreturn)); extern void errorMsg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); diff --git a/include/applets.h b/include/applets.h index a747b8619..254924a7a 100644 --- a/include/applets.h +++ b/include/applets.h @@ -10,366 +10,379 @@ * file result in the listing remaining in ascii order. You have been warned. */ +#ifndef PROTOTYPES const struct BB_applet applets[] = { +#define APPLET(a,b,c,d) {a,b,c,d}, +#define APPLET_NOUSAGE(a,b,c) {a,b,c,NULL}, +#else +#define APPLET(a,b,c,d) \ + extern int b(int argc, char **argv); \ + extern const char d[]; +#define APPLET_NOUSAGE(a,b,c) \ + extern int b(int argc, char **argv); +#endif #ifdef BB_TEST - {"[", test_main, _BB_DIR_USR_BIN, test_usage}, + APPLET("[", test_main, _BB_DIR_USR_BIN, test_usage) #endif #ifdef BB_AR - {"ar", ar_main, _BB_DIR_USR_BIN, ar_usage}, + APPLET("ar", ar_main, _BB_DIR_USR_BIN, ar_usage) #endif #ifdef BB_BASENAME - {"basename", basename_main, _BB_DIR_USR_BIN, basename_usage}, + APPLET("basename", basename_main, _BB_DIR_USR_BIN, basename_usage) #endif - {"busybox", busybox_main, _BB_DIR_BIN, NULL}, + APPLET_NOUSAGE("busybox", busybox_main, _BB_DIR_BIN) #ifdef BB_CAT - {"cat", cat_main, _BB_DIR_BIN, cat_usage}, + APPLET("cat", cat_main, _BB_DIR_BIN, cat_usage) #endif #ifdef BB_CHMOD_CHOWN_CHGRP - {"chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN, chgrp_usage}, + APPLET("chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN, chgrp_usage) #endif #ifdef BB_CHMOD_CHOWN_CHGRP - {"chmod", chmod_chown_chgrp_main, _BB_DIR_BIN, chmod_usage}, + APPLET("chmod", chmod_chown_chgrp_main, _BB_DIR_BIN, chmod_usage) #endif #ifdef BB_CHMOD_CHOWN_CHGRP - {"chown", chmod_chown_chgrp_main, _BB_DIR_BIN, chown_usage}, + APPLET("chown", chmod_chown_chgrp_main, _BB_DIR_BIN, chown_usage) #endif #ifdef BB_CHROOT - {"chroot", chroot_main, _BB_DIR_USR_SBIN, chroot_usage}, + APPLET("chroot", chroot_main, _BB_DIR_USR_SBIN, chroot_usage) #endif #ifdef BB_CHVT - {"chvt", chvt_main, _BB_DIR_USR_BIN, chvt_usage}, + APPLET("chvt", chvt_main, _BB_DIR_USR_BIN, chvt_usage) #endif #ifdef BB_CLEAR - {"clear", clear_main, _BB_DIR_USR_BIN, clear_usage}, + APPLET("clear", clear_main, _BB_DIR_USR_BIN, clear_usage) #endif #ifdef BB_CMP - {"cmp", cmp_main, _BB_DIR_USR_BIN, cmp_usage}, + APPLET("cmp", cmp_main, _BB_DIR_USR_BIN, cmp_usage) #endif #ifdef BB_CP_MV - {"cp", cp_mv_main, _BB_DIR_BIN, cp_usage}, + APPLET("cp", cp_mv_main, _BB_DIR_BIN, cp_usage) #endif #ifdef BB_CUT - {"cut", cut_main, _BB_DIR_USR_BIN, cut_usage}, + APPLET("cut", cut_main, _BB_DIR_USR_BIN, cut_usage) #endif #ifdef BB_DATE - {"date", date_main, _BB_DIR_BIN, date_usage}, + APPLET("date", date_main, _BB_DIR_BIN, date_usage) #endif #ifdef BB_DC - {"dc", dc_main, _BB_DIR_USR_BIN, dc_usage}, + APPLET("dc", dc_main, _BB_DIR_USR_BIN, dc_usage) #endif #ifdef BB_DD - {"dd", dd_main, _BB_DIR_BIN, dd_usage}, + APPLET("dd", dd_main, _BB_DIR_BIN, dd_usage) #endif #ifdef BB_DEALLOCVT - {"deallocvt", deallocvt_main, _BB_DIR_USR_BIN, deallocvt_usage}, + APPLET("deallocvt", deallocvt_main, _BB_DIR_USR_BIN, deallocvt_usage) #endif #ifdef BB_DF - {"df", df_main, _BB_DIR_BIN, df_usage}, + APPLET("df", df_main, _BB_DIR_BIN, df_usage) #endif #ifdef BB_DIRNAME - {"dirname", dirname_main, _BB_DIR_USR_BIN, dirname_usage}, + APPLET("dirname", dirname_main, _BB_DIR_USR_BIN, dirname_usage) #endif #ifdef BB_DMESG - {"dmesg", dmesg_main, _BB_DIR_BIN, dmesg_usage}, + APPLET("dmesg", dmesg_main, _BB_DIR_BIN, dmesg_usage) #endif #ifdef BB_DOS2UNIX - {"dos2unix", dos2unix_main, _BB_DIR_USR_BIN, dos2unix_usage}, + APPLET("dos2unix", dos2unix_main, _BB_DIR_USR_BIN, dos2unix_usage) #endif #ifdef BB_DU - {"du", du_main, _BB_DIR_USR_BIN, du_usage}, + APPLET("du", du_main, _BB_DIR_USR_BIN, du_usage) #endif #ifdef BB_DUMPKMAP - {"dumpkmap", dumpkmap_main, _BB_DIR_BIN, dumpkmap_usage}, + APPLET("dumpkmap", dumpkmap_main, _BB_DIR_BIN, dumpkmap_usage) #endif #ifdef BB_DUTMP - {"dutmp", dutmp_main, _BB_DIR_USR_SBIN, dutmp_usage}, + APPLET("dutmp", dutmp_main, _BB_DIR_USR_SBIN, dutmp_usage) #endif #ifdef BB_ECHO - {"echo", echo_main, _BB_DIR_BIN, echo_usage}, + APPLET("echo", echo_main, _BB_DIR_BIN, echo_usage) #endif #ifdef BB_EXPR - {"expr", expr_main, _BB_DIR_USR_BIN, expr_usage}, + APPLET("expr", expr_main, _BB_DIR_USR_BIN, expr_usage) #endif #ifdef BB_TRUE_FALSE - {"false", false_main, _BB_DIR_BIN, false_usage}, + APPLET("false", false_main, _BB_DIR_BIN, false_usage) #endif #ifdef BB_FBSET - {"fbset", fbset_main, _BB_DIR_USR_SBIN, NULL}, + APPLET_NOUSAGE("fbset", fbset_main, _BB_DIR_USR_SBIN) #endif #ifdef BB_FDFLUSH - {"fdflush", fdflush_main, _BB_DIR_BIN, fdflush_usage}, + APPLET("fdflush", fdflush_main, _BB_DIR_BIN, fdflush_usage) #endif #ifdef BB_FIND - {"find", find_main, _BB_DIR_USR_BIN, find_usage}, + APPLET("find", find_main, _BB_DIR_USR_BIN, find_usage) #endif #ifdef BB_FREE - {"free", free_main, _BB_DIR_USR_BIN, free_usage}, + APPLET("free", free_main, _BB_DIR_USR_BIN, free_usage) #endif #ifdef BB_FREERAMDISK - {"freeramdisk", freeramdisk_main, _BB_DIR_SBIN, freeramdisk_usage}, + APPLET("freeramdisk", freeramdisk_main, _BB_DIR_SBIN, freeramdisk_usage) #endif #ifdef BB_FSCK_MINIX - {"fsck.minix", fsck_minix_main, _BB_DIR_SBIN, fsck_minix_usage}, + APPLET("fsck.minix", fsck_minix_main, _BB_DIR_SBIN, fsck_minix_usage) #endif #ifdef BB_GETOPT - {"getopt", getopt_main, _BB_DIR_BIN, getopt_usage}, + APPLET("getopt", getopt_main, _BB_DIR_BIN, getopt_usage) #endif #ifdef BB_GREP - {"grep", grep_main, _BB_DIR_BIN, grep_usage}, + APPLET("grep", grep_main, _BB_DIR_BIN, grep_usage) #endif #ifdef BB_GUNZIP - {"gunzip", gunzip_main, _BB_DIR_BIN, gunzip_usage}, + APPLET("gunzip", gunzip_main, _BB_DIR_BIN, gunzip_usage) #endif #ifdef BB_GZIP - {"gzip", gzip_main, _BB_DIR_BIN, gzip_usage}, + APPLET("gzip", gzip_main, _BB_DIR_BIN, gzip_usage) #endif #ifdef BB_HALT - {"halt", halt_main, _BB_DIR_SBIN, halt_usage}, + APPLET("halt", halt_main, _BB_DIR_SBIN, halt_usage) #endif #ifdef BB_HEAD - {"head", head_main, _BB_DIR_USR_BIN, head_usage}, + APPLET("head", head_main, _BB_DIR_USR_BIN, head_usage) #endif #ifdef BB_HOSTID - {"hostid", hostid_main, _BB_DIR_USR_BIN, hostid_usage}, + APPLET("hostid", hostid_main, _BB_DIR_USR_BIN, hostid_usage) #endif #ifdef BB_HOSTNAME - {"hostname", hostname_main, _BB_DIR_BIN, hostname_usage}, + APPLET("hostname", hostname_main, _BB_DIR_BIN, hostname_usage) #endif #ifdef BB_ID - {"id", id_main, _BB_DIR_USR_BIN, id_usage}, + APPLET("id", id_main, _BB_DIR_USR_BIN, id_usage) #endif #ifdef BB_INIT - {"init", init_main, _BB_DIR_SBIN, NULL}, + APPLET_NOUSAGE("init", init_main, _BB_DIR_SBIN) #endif #ifdef BB_INSMOD - {"insmod", insmod_main, _BB_DIR_SBIN, insmod_usage}, + APPLET("insmod", insmod_main, _BB_DIR_SBIN, insmod_usage) #endif #ifdef BB_KILL - {"kill", kill_main, _BB_DIR_BIN, kill_usage}, + APPLET("kill", kill_main, _BB_DIR_BIN, kill_usage) #endif #ifdef BB_KILLALL - {"killall", kill_main, _BB_DIR_USR_BIN, kill_usage}, + APPLET("killall", kill_main, _BB_DIR_USR_BIN, killall_usage) #endif #ifdef BB_LENGTH - {"length", length_main, _BB_DIR_USR_BIN, length_usage}, + APPLET("length", length_main, _BB_DIR_USR_BIN, length_usage) #endif #ifdef BB_LINUXRC - {"linuxrc", init_main, _BB_DIR_ROOT, NULL}, + APPLET_NOUSAGE("linuxrc", init_main, _BB_DIR_ROOT) #endif #ifdef BB_LN - {"ln", ln_main, _BB_DIR_BIN, ln_usage}, + APPLET("ln", ln_main, _BB_DIR_BIN, ln_usage) #endif #ifdef BB_LOADACM - {"loadacm", loadacm_main, _BB_DIR_USR_BIN, loadacm_usage}, + APPLET("loadacm", loadacm_main, _BB_DIR_USR_BIN, loadacm_usage) #endif #ifdef BB_LOADFONT - {"loadfont", loadfont_main, _BB_DIR_USR_BIN, loadfont_usage}, + APPLET("loadfont", loadfont_main, _BB_DIR_USR_BIN, loadfont_usage) #endif #ifdef BB_LOADKMAP - {"loadkmap", loadkmap_main, _BB_DIR_SBIN, loadkmap_usage}, + APPLET("loadkmap", loadkmap_main, _BB_DIR_SBIN, loadkmap_usage) #endif #ifdef BB_LOGGER - {"logger", logger_main, _BB_DIR_USR_BIN, logger_usage}, + APPLET("logger", logger_main, _BB_DIR_USR_BIN, logger_usage) #endif #ifdef BB_LOGNAME - {"logname", logname_main, _BB_DIR_USR_BIN, logname_usage}, + APPLET("logname", logname_main, _BB_DIR_USR_BIN, logname_usage) #endif #ifdef BB_LS - {"ls", ls_main, _BB_DIR_BIN, ls_usage}, + APPLET("ls", ls_main, _BB_DIR_BIN, ls_usage) #endif #ifdef BB_LSMOD - {"lsmod", lsmod_main, _BB_DIR_SBIN, lsmod_usage}, + APPLET("lsmod", lsmod_main, _BB_DIR_SBIN, lsmod_usage) #endif #ifdef BB_MAKEDEVS - {"makedevs", makedevs_main, _BB_DIR_SBIN, makedevs_usage}, + APPLET("makedevs", makedevs_main, _BB_DIR_SBIN, makedevs_usage) #endif #ifdef BB_MD5SUM - {"md5sum", md5sum_main, _BB_DIR_USR_BIN, md5sum_usage}, + APPLET("md5sum", md5sum_main, _BB_DIR_USR_BIN, md5sum_usage) #endif #ifdef BB_MKDIR - {"mkdir", mkdir_main, _BB_DIR_BIN, mkdir_usage}, + APPLET("mkdir", mkdir_main, _BB_DIR_BIN, mkdir_usage) #endif #ifdef BB_MKFIFO - {"mkfifo", mkfifo_main, _BB_DIR_USR_BIN, mkfifo_usage}, + APPLET("mkfifo", mkfifo_main, _BB_DIR_USR_BIN, mkfifo_usage) #endif #ifdef BB_MKFS_MINIX - {"mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN, mkfs_minix_usage}, + APPLET("mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN, mkfs_minix_usage) #endif #ifdef BB_MKNOD - {"mknod", mknod_main, _BB_DIR_BIN, mknod_usage}, + APPLET("mknod", mknod_main, _BB_DIR_BIN, mknod_usage) #endif #ifdef BB_MKSWAP - {"mkswap", mkswap_main, _BB_DIR_SBIN, mkswap_usage}, + APPLET("mkswap", mkswap_main, _BB_DIR_SBIN, mkswap_usage) #endif #ifdef BB_MKTEMP - {"mktemp", mktemp_main, _BB_DIR_BIN, mktemp_usage}, + APPLET("mktemp", mktemp_main, _BB_DIR_BIN, mktemp_usage) #endif #ifdef BB_MORE - {"more", more_main, _BB_DIR_BIN, more_usage}, + APPLET("more", more_main, _BB_DIR_BIN, more_usage) #endif #ifdef BB_MOUNT - {"mount", mount_main, _BB_DIR_BIN, mount_usage}, + APPLET("mount", mount_main, _BB_DIR_BIN, mount_usage) #endif #ifdef BB_MT - {"mt", mt_main, _BB_DIR_BIN, mt_usage}, + APPLET("mt", mt_main, _BB_DIR_BIN, mt_usage) #endif #ifdef BB_CP_MV - {"mv", cp_mv_main, _BB_DIR_BIN, mv_usage}, + APPLET("mv", cp_mv_main, _BB_DIR_BIN, mv_usage) #endif #ifdef BB_NC - {"nc", nc_main, _BB_DIR_USR_BIN, nc_usage}, + APPLET("nc", nc_main, _BB_DIR_USR_BIN, nc_usage) #endif #ifdef BB_NSLOOKUP - {"nslookup", nslookup_main, _BB_DIR_USR_BIN, nslookup_usage}, + APPLET("nslookup", nslookup_main, _BB_DIR_USR_BIN, nslookup_usage) #endif #ifdef BB_PING - {"ping", ping_main, _BB_DIR_BIN, ping_usage}, + APPLET("ping", ping_main, _BB_DIR_BIN, ping_usage) #endif #ifdef BB_POWEROFF - {"poweroff", poweroff_main, _BB_DIR_SBIN, poweroff_usage}, + APPLET("poweroff", poweroff_main, _BB_DIR_SBIN, poweroff_usage) #endif #ifdef BB_PRINTF - {"printf", printf_main, _BB_DIR_USR_BIN, printf_usage}, + APPLET("printf", printf_main, _BB_DIR_USR_BIN, printf_usage) #endif #ifdef BB_PS - {"ps", ps_main, _BB_DIR_BIN, ps_usage}, + APPLET("ps", ps_main, _BB_DIR_BIN, ps_usage) #endif #ifdef BB_PWD - {"pwd", pwd_main, _BB_DIR_BIN, pwd_usage}, + APPLET("pwd", pwd_main, _BB_DIR_BIN, pwd_usage) #endif #ifdef BB_RDATE - {"rdate", rdate_main, _BB_DIR_USR_BIN, rdate_usage}, + APPLET("rdate", rdate_main, _BB_DIR_USR_BIN, rdate_usage) #endif #ifdef BB_READLINK - {"readlink", readlink_main, _BB_DIR_USR_BIN, readlink_usage}, + APPLET("readlink", readlink_main, _BB_DIR_USR_BIN, readlink_usage) #endif #ifdef BB_REBOOT - {"reboot", reboot_main, _BB_DIR_SBIN, reboot_usage}, + APPLET("reboot", reboot_main, _BB_DIR_SBIN, reboot_usage) #endif #ifdef BB_RENICE - {"renice", renice_main, _BB_DIR_USR_BIN, renice_usage}, + APPLET("renice", renice_main, _BB_DIR_USR_BIN, renice_usage) #endif #ifdef BB_RESET - {"reset", reset_main, _BB_DIR_USR_BIN, reset_usage}, + APPLET("reset", reset_main, _BB_DIR_USR_BIN, reset_usage) #endif #ifdef BB_RM - {"rm", rm_main, _BB_DIR_BIN, rm_usage}, + APPLET("rm", rm_main, _BB_DIR_BIN, rm_usage) #endif #ifdef BB_RMDIR - {"rmdir", rmdir_main, _BB_DIR_BIN, rmdir_usage}, + APPLET("rmdir", rmdir_main, _BB_DIR_BIN, rmdir_usage) #endif #ifdef BB_RMMOD - {"rmmod", rmmod_main, _BB_DIR_SBIN, rmmod_usage}, + APPLET("rmmod", rmmod_main, _BB_DIR_SBIN, rmmod_usage) #endif #ifdef BB_RPMUNPACK - {"rpmunpack", rpmunpack_main, _BB_DIR_USR_BIN, rpmunpack_usage}, + APPLET("rpmunpack", rpmunpack_main, _BB_DIR_USR_BIN, rpmunpack_usage) #endif #ifdef BB_SED - {"sed", sed_main, _BB_DIR_BIN, sed_usage}, + APPLET("sed", sed_main, _BB_DIR_BIN, sed_usage) #endif #ifdef BB_SETKEYCODES - {"setkeycodes", setkeycodes_main, _BB_DIR_USR_BIN, setkeycodes_usage}, + APPLET("setkeycodes", setkeycodes_main, _BB_DIR_USR_BIN, setkeycodes_usage) #endif #ifdef BB_SH - {"sh", shell_main, _BB_DIR_BIN, shell_usage}, + APPLET("sh", shell_main, _BB_DIR_BIN, shell_usage) #endif #ifdef BB_SLEEP - {"sleep", sleep_main, _BB_DIR_BIN, sleep_usage}, + APPLET("sleep", sleep_main, _BB_DIR_BIN, sleep_usage) #endif #ifdef BB_SORT - {"sort", sort_main, _BB_DIR_USR_BIN, sort_usage}, + APPLET("sort", sort_main, _BB_DIR_USR_BIN, sort_usage) #endif #ifdef BB_SWAPONOFF - {"swapoff", swap_on_off_main, _BB_DIR_SBIN, swapoff_usage}, + APPLET("swapoff", swap_on_off_main, _BB_DIR_SBIN, swapoff_usage) #endif #ifdef BB_SWAPONOFF - {"swapon", swap_on_off_main, _BB_DIR_SBIN, swapon_usage}, + APPLET("swapon", swap_on_off_main, _BB_DIR_SBIN, swapon_usage) #endif #ifdef BB_SYNC - {"sync", sync_main, _BB_DIR_BIN, sync_usage}, + APPLET("sync", sync_main, _BB_DIR_BIN, sync_usage) #endif #ifdef BB_SYSLOGD - {"syslogd", syslogd_main, _BB_DIR_SBIN, syslogd_usage}, + APPLET("syslogd", syslogd_main, _BB_DIR_SBIN, syslogd_usage) #endif #ifdef BB_TAIL - {"tail", tail_main, _BB_DIR_USR_BIN, tail_usage}, + APPLET("tail", tail_main, _BB_DIR_USR_BIN, tail_usage) #endif #ifdef BB_TAR - {"tar", tar_main, _BB_DIR_BIN, tar_usage}, + APPLET("tar", tar_main, _BB_DIR_BIN, tar_usage) #endif #ifdef BB_TEE - {"tee", tee_main, _BB_DIR_USR_BIN, tee_usage}, + APPLET("tee", tee_main, _BB_DIR_USR_BIN, tee_usage) #endif #ifdef BB_TELNET - {"telnet", telnet_main, _BB_DIR_USR_BIN, telnet_usage}, + APPLET("telnet", telnet_main, _BB_DIR_USR_BIN, telnet_usage) #endif #ifdef BB_TEST - {"test", test_main, _BB_DIR_USR_BIN, test_usage}, + APPLET("test", test_main, _BB_DIR_USR_BIN, test_usage) #endif #ifdef BB_TOUCH - {"touch", touch_main, _BB_DIR_BIN, touch_usage}, + APPLET("touch", touch_main, _BB_DIR_BIN, touch_usage) #endif #ifdef BB_TR - {"tr", tr_main, _BB_DIR_USR_BIN, tr_usage}, + APPLET("tr", tr_main, _BB_DIR_USR_BIN, tr_usage) #endif #ifdef BB_TRUE_FALSE - {"true", true_main, _BB_DIR_BIN, true_usage}, + APPLET("true", true_main, _BB_DIR_BIN, true_usage) #endif #ifdef BB_TTY - {"tty", tty_main, _BB_DIR_USR_BIN, tty_usage}, + APPLET("tty", tty_main, _BB_DIR_USR_BIN, tty_usage) #endif #ifdef BB_UMOUNT - {"umount", umount_main, _BB_DIR_BIN, umount_usage}, + APPLET("umount", umount_main, _BB_DIR_BIN, umount_usage) #endif #ifdef BB_UNAME - {"uname", uname_main, _BB_DIR_BIN, uname_usage}, + APPLET("uname", uname_main, _BB_DIR_BIN, uname_usage) #endif #ifdef BB_UNIQ - {"uniq", uniq_main, _BB_DIR_USR_BIN, uniq_usage}, + APPLET("uniq", uniq_main, _BB_DIR_USR_BIN, uniq_usage) #endif #ifdef BB_UNIX2DOS - {"unix2dos", unix2dos_main, _BB_DIR_USR_BIN, unix2dos_usage}, + APPLET("unix2dos", unix2dos_main, _BB_DIR_USR_BIN, unix2dos_usage) #endif #ifdef BB_UPDATE - {"update", update_main, _BB_DIR_SBIN, update_usage}, + APPLET("update", update_main, _BB_DIR_SBIN, update_usage) #endif #ifdef BB_UPTIME - {"uptime", uptime_main, _BB_DIR_USR_BIN, uptime_usage}, + APPLET("uptime", uptime_main, _BB_DIR_USR_BIN, uptime_usage) #endif #ifdef BB_USLEEP - {"usleep", usleep_main, _BB_DIR_BIN, usleep_usage}, + APPLET("usleep", usleep_main, _BB_DIR_BIN, usleep_usage) #endif #ifdef BB_UUDECODE - {"uudecode", uudecode_main, _BB_DIR_USR_BIN, uudecode_usage}, + APPLET("uudecode", uudecode_main, _BB_DIR_USR_BIN, uudecode_usage) #endif #ifdef BB_UUENCODE - {"uuencode", uuencode_main, _BB_DIR_USR_BIN, uuencode_usage}, + APPLET("uuencode", uuencode_main, _BB_DIR_USR_BIN, uuencode_usage) #endif #ifdef BB_WC - {"wc", wc_main, _BB_DIR_USR_BIN, wc_usage}, + APPLET("wc", wc_main, _BB_DIR_USR_BIN, wc_usage) #endif #ifdef BB_WGET - {"wget", wget_main, _BB_DIR_USR_BIN, wget_usage}, + APPLET("wget", wget_main, _BB_DIR_USR_BIN, wget_usage) #endif #ifdef BB_WHICH - {"which", which_main, _BB_DIR_USR_BIN, which_usage}, + APPLET("which", which_main, _BB_DIR_USR_BIN, which_usage) #endif #ifdef BB_WHOAMI - {"whoami", whoami_main, _BB_DIR_USR_BIN, whoami_usage}, + APPLET("whoami", whoami_main, _BB_DIR_USR_BIN, whoami_usage) #endif #ifdef BB_XARGS - {"xargs", xargs_main, _BB_DIR_USR_BIN, xargs_usage}, + APPLET("xargs", xargs_main, _BB_DIR_USR_BIN, xargs_usage) #endif #ifdef BB_YES - {"yes", yes_main, _BB_DIR_USR_BIN, yes_usage}, + APPLET("yes", yes_main, _BB_DIR_USR_BIN, yes_usage) #endif #ifdef BB_GUNZIP - {"zcat", gunzip_main, _BB_DIR_BIN, gunzip_usage}, + APPLET("zcat", gunzip_main, _BB_DIR_BIN, gunzip_usage) #endif - {0,NULL,0,NULL} + +#ifndef PROTOTYPES + { 0,NULL,0,NULL} }; /* The -1 arises because of the {0,NULL,0,NULL} entry above. */ size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1); +#endif diff --git a/include/busybox.h b/include/busybox.h index 3fc91a387..cff4af41d 100644 --- a/include/busybox.h +++ b/include/busybox.h @@ -108,244 +108,19 @@ struct BB_applet { /* From busybox.c */ extern const struct BB_applet applets[]; -extern size_t NUM_APPLETS; - - -extern int applet_name_compare(const void *x, const void *y); - -extern int ar_main(int argc, char **argv); -extern int basename_main(int argc, char **argv); -extern int bogomips_main(int argc, char **argv); -extern int busybox_main(int argc, char** argv); -extern int cat_main(int argc, char** argv); -extern int chmod_chown_chgrp_main(int argc, char** argv); -extern int chroot_main(int argc, char** argv); -extern int chvt_main(int argc, char** argv); -extern int clear_main(int argc, char** argv); -extern int cmp_main(int argc, char** argv); -extern int cp_mv_main(int argc, char** argv); -extern int cut_main(int argc, char** argv); -extern int date_main(int argc, char** argv); -extern int dc_main(int argc, char** argv); -extern int dd_main(int argc, char** argv); -extern int dirname_main(int argc, char** argv); -extern int deallocvt_main(int argc, char** argv); -extern int df_main(int argc, char** argv); -extern int dmesg_main(int argc, char** argv); -extern int dos2unix_main(int argc, char** argv); -extern int du_main(int argc, char** argv); -extern int dumpkmap_main(int argc, char** argv); -extern int dutmp_main(int argc, char** argv); -extern int echo_main(int argc, char** argv); -extern int expr_main(int argc, char** argv); -extern int false_main(int argc, char** argv); -extern int fbset_main(int argc, char** argv); -extern int fdisk_main(int argc, char** argv); -extern int fdflush_main(int argc, char **argv); -extern int fsck_minix_main(int argc, char **argv); -extern int find_main(int argc, char** argv); -extern int free_main(int argc, char** argv); -extern int freeramdisk_main(int argc, char** argv); -extern int getopt_main(int argc, char** argv); -extern int grep_main(int argc, char** argv); -extern int gunzip_main (int argc, char** argv); -extern int gzip_main(int argc, char** argv); -extern int halt_main(int argc, char** argv); -extern int head_main(int argc, char** argv); -extern int hostid_main(int argc, char** argv); -extern int hostname_main(int argc, char** argv); -extern int id_main(int argc, char** argv); -extern int init_main(int argc, char** argv); -extern int insmod_main(int argc, char** argv); -extern int kill_main(int argc, char** argv); -extern int length_main(int argc, char** argv); -extern int ln_main(int argc, char** argv); -extern int loadacm_main(int argc, char** argv); -extern int loadfont_main(int argc, char** argv); -extern int loadkmap_main(int argc, char** argv); -extern int losetup_main(int argc, char** argv); -extern int logger_main(int argc, char **argv); -extern int logname_main(int argc, char **argv); -extern int ls_main(int argc, char** argv); -extern int lsmod_main(int argc, char** argv); -extern int makedevs_main(int argc, char** argv); -extern int md5sum_main(int argc, char** argv); -extern int mkdir_main(int argc, char** argv); -extern int mkfifo_main(int argc, char **argv); -extern int mkfs_minix_main(int argc, char **argv); -extern int mknod_main(int argc, char** argv); -extern int mkswap_main(int argc, char** argv); -extern int mktemp_main(int argc, char **argv); -extern int nc_main(int argc, char** argv); -extern int more_main(int argc, char** argv); -extern int mount_main(int argc, char** argv); -extern int mt_main(int argc, char** argv); -extern int nslookup_main(int argc, char **argv); -extern int ping_main(int argc, char **argv); -extern int poweroff_main(int argc, char **argv); -extern int printf_main(int argc, char** argv); -extern int ps_main(int argc, char** argv); -extern int pwd_main(int argc, char** argv); -extern int rdate_main(int argc, char** argv); -extern int readlink_main(int argc, char** argv); -extern int reboot_main(int argc, char** argv); -extern int renice_main(int argc, char** argv); -extern int reset_main(int argc, char** argv); -extern int rm_main(int argc, char** argv); -extern int rmdir_main(int argc, char **argv); -extern int rmmod_main(int argc, char** argv); -extern int rpmunpack_main(int argc, char** argv); -extern int sed_main(int argc, char** argv); -extern int sfdisk_main(int argc, char** argv); -extern int setkeycodes_main(int argc, char** argv); -extern int shell_main(int argc, char** argv); -extern int sleep_main(int argc, char** argv); -extern int sort_main(int argc, char** argv); -extern int swap_on_off_main(int argc, char** argv); -extern int sync_main(int argc, char** argv); -extern int syslogd_main(int argc, char **argv); -extern int tail_main(int argc, char** argv); -extern int tar_main(int argc, char** argv); -extern int tee_main(int argc, char** argv); -extern int test_main(int argc, char** argv); -extern int telnet_main(int argc, char** argv); -extern int touch_main(int argc, char** argv); -extern int tr_main(int argc, char** argv); -extern int true_main(int argc, char** argv); -extern int tput_main(int argc, char** argv); -extern int tryopen_main(int argc, char** argv); -extern int tty_main(int argc, char** argv); -extern int umount_main(int argc, char** argv); -extern int uname_main(int argc, char** argv); -extern int uniq_main(int argc, char** argv); -extern int unix2dos_main(int argc, char** argv); -extern int update_main(int argc, char** argv); -extern int uptime_main(int argc, char** argv); -extern int usleep_main(int argc, char** argv); -extern int uuencode_main(int argc, char** argv); -extern int uudecode_main(int argc, char** argv); -extern int wc_main(int argc, char** argv); -extern int wget_main(int argc, char** argv); -extern int which_main(int argc, char** argv); -extern int whoami_main(int argc, char** argv); -extern int xargs_main(int argc, char** argv); -extern int yes_main(int argc, char** argv); - -extern const char ar_usage[]; -extern const char basename_usage[]; -extern const char cat_usage[]; -extern const char chgrp_usage[]; -extern const char chmod_usage[]; -extern const char chown_usage[]; -extern const char chroot_usage[]; -extern const char chvt_usage[]; -extern const char clear_usage[]; -extern const char cmp_usage[]; -extern const char cp_usage[]; -extern const char cut_usage[]; -extern const char date_usage[]; -extern const char dc_usage[]; -extern const char dd_usage[]; -extern const char deallocvt_usage[]; -extern const char df_usage[]; -extern const char dirname_usage[]; -extern const char dmesg_usage[]; -extern const char dos2unix_usage[]; -extern const char du_usage[]; -extern const char dumpkmap_usage[]; -extern const char dutmp_usage[]; -extern const char echo_usage[]; -extern const char expr_usage[]; -extern const char false_usage[]; -extern const char fdflush_usage[]; -extern const char find_usage[]; -extern const char free_usage[]; -extern const char freeramdisk_usage[]; -extern const char fsck_minix_usage[]; -extern const char getopt_usage[]; -extern const char grep_usage[]; -extern const char gunzip_usage[]; -extern const char gzip_usage[]; -extern const char halt_usage[]; -extern const char head_usage[]; -extern const char hostid_usage[]; -extern const char hostname_usage[]; -extern const char id_usage[]; -extern const char insmod_usage[]; -extern const char kill_usage[]; -extern const char killall_usage[]; -extern const char length_usage[]; -extern const char ln_usage[]; -extern const char loadacm_usage[]; -extern const char loadfont_usage[]; -extern const char loadkmap_usage[]; -extern const char logger_usage[]; -extern const char logname_usage[]; -extern const char ls_usage[]; -extern const char lsmod_usage[]; -extern const char makedevs_usage[]; -extern const char md5sum_usage[]; -extern const char mkdir_usage[]; -extern const char mkfifo_usage[]; -extern const char mkfs_minix_usage[]; -extern const char mknod_usage[]; -extern const char mkswap_usage[]; -extern const char mktemp_usage[]; -extern const char more_usage[]; -extern const char mount_usage[]; -extern const char mt_usage[]; -extern const char mv_usage[]; -extern const char nc_usage[]; -extern const char nslookup_usage[]; -extern const char ping_usage[]; -extern const char poweroff_usage[]; -extern const char printf_usage[]; -extern const char ps_usage[]; -extern const char pwd_usage[]; -extern const char rdate_usage[]; -extern const char readlink_usage[]; -extern const char reboot_usage[]; -extern const char renice_usage[]; -extern const char reset_usage[]; -extern const char rm_usage[]; -extern const char rmdir_usage[]; -extern const char rmmod_usage[]; -extern const char rpmunpack_usage[]; -extern const char sed_usage[]; -extern const char setkeycodes_usage[]; -extern const char shell_usage[]; -extern const char sleep_usage[]; -extern const char sort_usage[]; -extern const char swapoff_usage[]; -extern const char swapon_usage[]; -extern const char sync_usage[]; -extern const char syslogd_usage[]; -extern const char tail_usage[]; -extern const char tar_usage[]; -extern const char tee_usage[]; -extern const char telnet_usage[]; -extern const char test_usage[]; -extern const char touch_usage[]; -extern const char tr_usage[]; -extern const char true_usage[]; -extern const char tty_usage[]; -extern const char umount_usage[]; -extern const char uname_usage[]; -extern const char uniq_usage[]; -extern const char unix2dos_usage[]; -extern const char update_usage[]; -extern const char uptime_usage[]; -extern const char usleep_usage[]; -extern const char uudecode_usage[]; -extern const char uuencode_usage[]; -extern const char wc_usage[]; -extern const char wget_usage[]; -extern const char which_usage[]; -extern const char whoami_usage[]; -extern const char xargs_usage[]; -extern const char yes_usage[]; +/* Automagically pull in all the applet function prototypes and + * applet usage strings. + * These are all of the form: + * extern int foo_main(int argc, char **argv); + * extern const char foo_usage[]; + * These are all autogenerated from the set of currently defined applets. + */ +#define PROTOTYPES +#include "applets.h" +#undef PROTOTYPES extern const char *applet_name; +extern int applet_name_compare(const void *x, const void *y); extern void usage(const char *usage) __attribute__ ((noreturn)); extern void errorMsg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); @@ -52,6 +52,7 @@ #define MAX_LINE 256 /* size of input buffer for `read' builtin */ #define MAX_READ 128 /* size of input buffer for `read' builtin */ #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n" +extern size_t NUM_APPLETS; enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE, @@ -52,6 +52,7 @@ #define MAX_LINE 256 /* size of input buffer for `read' builtin */ #define MAX_READ 128 /* size of input buffer for `read' builtin */ #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n" +extern size_t NUM_APPLETS; enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE, diff --git a/shell/lash.c b/shell/lash.c index 87d4fbfbd..eba60b3b7 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -52,6 +52,7 @@ #define MAX_LINE 256 /* size of input buffer for `read' builtin */ #define MAX_READ 128 /* size of input buffer for `read' builtin */ #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n" +extern size_t NUM_APPLETS; enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE, |