#include <string.h>
#include <errno.h>
+#ifndef BB_INIT
+#undef BB_FEATURE_LINUXRC
+#endif
+
static int been_there_done_that = 0;
+/* It has been alledged that doing such things can
+ * help reduce binary size when staticly linking,
+ * of course with glibc, this is unlikely as long
+ * as we use things like printf -- perhaps a printf
+ * replacement may be in order
+ */
+#if 0
+void exit (int status) __attribute__ ((noreturn));
+void exit (int status) { _exit(status); };
+void abort (void) __attribute__ ((__noreturn__));
+void abort (void) { _exit(0); };
+int atexit (void (*__func) (void)) { _exit(0); };
+void *__libc_stack_end;
+#endif
+
+
static const struct Applet applets[] = {
#ifdef BB_BUSYBOX //bin
{"block_device", block_device_main},
#endif
#ifdef BB_CAT //bin
- {"cat", cat_more_main},
-#endif
-#ifdef BB_CHGRP //bin
- {"chgrp", chgrp_main},
-#endif
-#ifdef BB_CHMOD //bin
- {"chmod", chmod_main},
+ {"cat", cat_main},
#endif
-#ifdef BB_CHOWN //bin
- {"chown", chown_main},
+#ifdef BB_CHMOD_CHOWN_CHGRP //bin
+ {"chmod", chmod_chown_chgrp_main},
+ {"chown", chmod_chown_chgrp_main},
+ {"chgrp", chmod_chown_chgrp_main},
#endif
#ifdef BB_CHROOT //sbin
{"chroot", chroot_main},
#ifdef BB_CLEAR //usr/bin
{"clear", clear_main},
#endif
+#ifdef BB_CHVT //usr/bin
+ {"chvt", chvt_main},
+#endif
#ifdef BB_CP //bin
- {"cp", dyadic_main},
+ {"cp", cp_main},
#endif
#ifdef BB_DATE //bin
{"date", date_main},
#ifdef BB_DMESG //bin
{"dmesg", dmesg_main},
#endif
+#ifdef BB_DU //bin
+ {"du", du_main},
+#endif
#ifdef BB_DUTMP //usr/sbin
- {"dutmp", cat_more_main},
+ {"dutmp", dutmp_main},
#endif
-#ifdef BB_FALSE //bin
- {"false", false_main},
+#ifdef BB_FBSET //usr/sbin
+ {"fbset", fbset_main},
#endif
#ifdef BB_FDFLUSH //bin
- {"fdflush", monadic_main},
+ {"fdflush", fdflush_main},
#endif
#ifdef BB_FIND //usr/bin
{"find", find_main},
#endif
+#ifdef BB_FREE //usr/bin
+ {"free", free_main},
+#endif
+#ifdef BB_DEALLOCVT //usr/bin
+ {"deallocvt", deallocvt_main},
+#endif
+#ifdef BB_FSCK_MINIX //sbin
+ {"fsck.minix", fsck_minix_main},
+#endif
+#ifdef BB_MKFS_MINIX //sbin
+ {"mkfs.minix", mkfs_minix_main},
+#endif
#ifdef BB_GREP //bin
{"grep", grep_main},
#endif
#ifdef BB_HALT //sbin
{"halt", halt_main},
#endif
+#ifdef BB_HEAD //bin
+ {"head", head_main},
+#endif
+#ifdef BB_HOSTID //usr/bin
+ {"hostid", hostid_main},
+#endif
+#ifdef BB_HOSTNAME //bin
+ {"hostname", hostname_main},
+#endif
#ifdef BB_INIT //sbin
{"init", init_main},
#endif
+#ifdef BB_INSMOD //sbin
+ {"insmod", insmod_main},
+#endif
+#ifdef BB_FEATURE_LINUXRC //
+ {"linuxrc", init_main},
+#endif
#ifdef BB_KILL //bin
{"kill", kill_main},
#endif
{"length", length_main},
#endif
#ifdef BB_LN //bin
- {"ln", dyadic_main},
+ {"ln", ln_main},
+#endif
+#ifdef BB_LOADACM //usr/bin
+ {"loadacm", loadacm_main},
+#endif
+#ifdef BB_LOADFONT //usr/bin
+ {"loadfont", loadfont_main},
#endif
#ifdef BB_LOADKMAP //sbin
{"loadkmap", loadkmap_main},
#endif
-#ifdef BB_LOSETUP //sbin
- {"losetup", losetup_main},
-#endif
#ifdef BB_LS //bin
{"ls", ls_main},
#endif
+#ifdef BB_LSMOD //sbin
+ {"lsmod", lsmod_main},
+#endif
#ifdef BB_MAKEDEVS //sbin
{"makedevs", makedevs_main},
#endif
{"math", math_main},
#endif
#ifdef BB_MKDIR //bin
- {"mkdir", monadic_main},
+ {"mkdir", mkdir_main},
+#endif
+#ifdef BB_MKFIFO //usr/bin
+ {"mkfifo", mkfifo_main},
#endif
#ifdef BB_MKNOD //bin
{"mknod", mknod_main},
{"mnc", mnc_main},
#endif
#ifdef BB_MORE //bin
- {"more", cat_more_main},
+ {"more", more_main},
#endif
#ifdef BB_MOUNT //bin
{"mount", mount_main},
{"mt", mt_main},
#endif
#ifdef BB_MV //bin
- {"mv", dyadic_main},
+ {"mv", mv_main},
+#endif
+#ifdef BB_PING //bin
+ {"ping", ping_main},
+#endif
+#ifdef BB_POWEROFF //sbin
+ {"poweroff", poweroff_main},
#endif
#ifdef BB_PRINTF //usr/bin
{"printf", printf_main},
#endif
+#ifdef BB_PS //bin
+ {"ps", ps_main},
+#endif
#ifdef BB_PWD //bin
{"pwd", pwd_main},
#endif
{"rm", rm_main},
#endif
#ifdef BB_RMDIR //bin
- {"rmdir", monadic_main},
+ {"rmdir", rmdir_main},
#endif
-#ifdef BB_SLEEP //bin
- {"sleep", sleep_main},
+#ifdef BB_RMMOD //sbin
+ {"rmmod", rmmod_main},
#endif
-#ifdef BB_TAR //bin
- {"tar", tar_main},
+#ifdef BB_SFDISK //sbin
+ {"fdisk", sfdisk_main},
+ {"sfdisk", sfdisk_main},
#endif
-#ifdef BB_SWAPOFF //sbin
- {"swapoff", monadic_main},
+#ifdef BB_SED //bin
+ {"sed", sed_main},
#endif
-#ifdef BB_SWAPON //sbin
- {"swapon", monadic_main},
+#ifdef BB_SLEEP //bin
+ {"sleep", sleep_main},
+#endif
+#ifdef BB_SORT //bin
+ {"sort", sort_main},
#endif
#ifdef BB_SYNC //bin
{"sync", sync_main},
#endif
+#ifdef BB_SYSLOGD //sbin
+ {"syslogd", syslogd_main},
+#endif
+#ifdef BB_LOGGER //usr/bin
+ {"logger", logger_main},
+#endif
+#ifdef BB_LOGNAME //usr/bin
+ {"logname", logname_main},
+#endif
+#ifdef BB_SWAPONOFF //sbin
+ {"swapon", swap_on_off_main},
+ {"swapoff", swap_on_off_main},
+#endif
+#ifdef BB_TAIL //usr/bin
+ {"tail", tail_main},
+#endif
+#ifdef BB_TAR //bin
+ {"tar", tar_main},
+#endif
+#ifdef BB_TEE //bin
+ {"tee", tee_main},
+#endif
#ifdef BB_TOUCH //usr/bin
- {"touch", monadic_main},
+ {"touch", touch_main},
#endif
-#ifdef BB_TRUE //bin
+#ifdef BB_TRUE_FALSE //bin
{"true", true_main},
+ {"false", false_main},
+#endif
+#ifdef BB_TTY //usr/bin
+ {"tty", tty_main},
+#endif
+#ifdef BB_UNAME //bin
+ {"uname", uname_main},
#endif
#ifdef BB_UMOUNT //bin
- {"umount", umount_main},
+ {"umount", umount_main},
+#endif
+#ifdef BB_UNIQ //bin
+ {"uniq", uniq_main},
#endif
#ifdef BB_UPDATE //sbin
{"update", update_main},
#endif
-#ifdef BB_ZCAT //bin
- {"zcat", zcat_main},
- {"gunzip", zcat_main},
+#ifdef BB_WC //usr/bin
+ {"wc", wc_main},
+#endif
+#ifdef BB_WHOAMI //usr/bin
+ {"whoami", whoami_main},
+#endif
+#ifdef BB_YES //usr/bin
+ {"yes", yes_main},
+#endif
+#ifdef BB_GUNZIP //bin
+ {"zcat", gunzip_main},
+ {"gunzip", gunzip_main},
#endif
#ifdef BB_GZIP //bin
{"gzip", gzip_main},
{0}
};
+
+
int main(int argc, char **argv)
{
char *s = argv[0];
}
a++;
}
- return (busybox_main(argc, argv));
+ exit (busybox_main(argc, argv));
}
int busybox_main(int argc, char **argv)
{
+ int col=0;
argc--;
argv++;
- /* If we've already been here once, exit now */
- if (been_there_done_that == 1)
- return -1;
- been_there_done_that = 1;
-
- if (argc < 1) {
+ if (been_there_done_that == 1 || argc < 1) {
const struct Applet *a = applets;
- fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n",
+ fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
BB_VER, BB_BT);
fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
+ fprintf(stderr, " or: [function] [arguments]...\n\n");
fprintf(stderr,
- "\n\tMost people will create a symlink to busybox for each\n"
+ "\tMost people will create a symlink to busybox for each\n"
"\tfunction name, and busybox will act like whatever you invoke it as.\n");
fprintf(stderr, "\nCurrently defined functions:\n");
- if (a->name != 0) {
- fprintf(stderr, "%s", a->name);
- a++;
- }
while (a->name != 0) {
- fprintf(stderr, ", %s", a->name);
- a++;
+ col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), (a++)->name);
+ if (col>60) {
+ fprintf(stderr, ",\n");
+ col=0;
+ }
}
fprintf(stderr, "\n\n");
exit(-1);
- } else
+ } else {
+ /* If we've already been here once, exit now */
+ been_there_done_that = 1;
return (main(argc, argv));
+ }
}