/* vi: set sw=4 ts=4: */ #include "internal.h" #include #include #include #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 {"busybox", busybox_main}, #endif #ifdef BB_BLOCK_DEVICE //sbin {"block_device", block_device_main}, #endif #ifdef BB_CAT //bin {"cat", cat_main}, #endif #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}, #endif #ifdef BB_CLEAR //usr/bin {"clear", clear_main}, #endif #ifdef BB_CHVT //usr/bin {"chvt", chvt_main}, #endif #ifdef BB_CP_MV //bin {"cp", cp_mv_main}, {"mv", cp_mv_main}, #endif #ifdef BB_DATE //bin {"date", date_main}, #endif #ifdef BB_DD //bin {"dd", dd_main}, #endif #ifdef BB_DF //bin {"df", df_main}, #endif #ifdef BB_DMESG //bin {"dmesg", dmesg_main}, #endif #ifdef BB_DU //bin {"du", du_main}, #endif #ifdef BB_DUTMP //usr/sbin {"dutmp", dutmp_main}, #endif #ifdef BB_FBSET //usr/sbin {"fbset", fbset_main}, #endif #ifdef BB_FDFLUSH //bin {"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 #ifdef BB_LENGTH //usr/bin {"length", length_main}, #endif #ifdef BB_LN //bin {"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_LS //bin {"ls", ls_main}, #endif #ifdef BB_LSMOD //sbin {"lsmod", lsmod_main}, #endif #ifdef BB_MAKEDEVS //sbin {"makedevs", makedevs_main}, #endif #ifdef BB_MATH //usr/bin {"math", math_main}, #endif #ifdef BB_MKDIR //bin {"mkdir", mkdir_main}, #endif #ifdef BB_MKFIFO //usr/bin {"mkfifo", mkfifo_main}, #endif #ifdef BB_MKNOD //bin {"mknod", mknod_main}, #endif #ifdef BB_MKSWAP //sbin {"mkswap", mkswap_main}, #endif #ifdef BB_MNC //usr/bin {"mnc", mnc_main}, #endif #ifdef BB_MORE //bin {"more", more_main}, #endif #ifdef BB_MOUNT //bin {"mount", mount_main}, #endif #ifdef BB_MT //bin {"mt", mt_main}, #endif #ifdef BB_NSLOOKUP //usr/bin {"nslookup", nslookup_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 #ifdef BB_REBOOT //sbin {"reboot", reboot_main}, #endif #ifdef BB_RM //bin {"rm", rm_main}, #endif #ifdef BB_RMDIR //bin {"rmdir", rmdir_main}, #endif #ifdef BB_RMMOD //sbin {"rmmod", rmmod_main}, #endif #ifdef BB_SFDISK //sbin {"fdisk", sfdisk_main}, {"sfdisk", sfdisk_main}, #endif #ifdef BB_SED //bin {"sed", sed_main}, #endif #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", touch_main}, #endif #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}, #endif #ifdef BB_UNIQ //bin {"uniq", uniq_main}, #endif #ifdef BB_UPDATE //sbin {"update", update_main}, #endif #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}, #endif {0} }; int main(int argc, char **argv) { char *s = argv[0]; char *name = argv[0]; const struct Applet *a = applets; while (*s != '\0') { if (*s++ == '/') name = s; } while (a->name != 0) { if (strcmp(name, a->name) == 0) { int status; status = ((*(a->main)) (argc, argv)); if (status < 0) { fprintf(stderr, "%s: %s\n", a->name, strerror(errno)); } fprintf(stderr, "\n"); exit(status); } a++; } exit(busybox_main(argc, argv)); } int busybox_main(int argc, char **argv) { int col = 0; argc--; argv++; if (been_there_done_that == 1 || argc < 1) { const struct Applet *a = applets; fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n", BB_VER, BB_BT); fprintf(stderr, "Usage: busybox [function] [arguments]...\n"); fprintf(stderr, " or: [function] [arguments]...\n\n"); fprintf(stderr, "\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"); while (a->name != 0) { col += fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "), (a++)->name); if (col > 60 && a->name != 0) { fprintf(stderr, ",\n"); col = 0; } } fprintf(stderr, "\n\n"); exit(-1); } else { /* If we've already been here once, exit now */ been_there_done_that = 1; return (main(argc, argv)); } }