1 /* vi: set sw=4 ts=4: */
7 static int been_there_done_that = 0;
9 /* It has been alledged that doing such things can
10 * help reduce binary size when staticly linking,
11 * of course with glibc, this is unlikely as long
12 * as we use things like printf -- perhaps a printf
13 * replacement may be in order
16 void exit(int status) __attribute__ ((noreturn));
21 void abort(void) __attribute__ ((__noreturn__));
26 int atexit(void (*__func) (void))
30 void *__libc_stack_end;
33 const struct BB_applet applets[] = {
36 {"ar", ar_main, _BB_DIR_USR_BIN},
39 {"basename", basename_main, _BB_DIR_USR_BIN},
41 {"busybox", busybox_main, _BB_DIR_BIN},
42 #ifdef BB_BLOCK_DEVICE
43 {"block_device", block_device_main, _BB_DIR_SBIN},
46 {"cat", cat_main, _BB_DIR_BIN},
48 #ifdef BB_CHMOD_CHOWN_CHGRP
49 {"chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN},
51 #ifdef BB_CHMOD_CHOWN_CHGRP
52 {"chmod", chmod_chown_chgrp_main, _BB_DIR_BIN},
54 #ifdef BB_CHMOD_CHOWN_CHGRP
55 {"chown", chmod_chown_chgrp_main, _BB_DIR_BIN},
58 {"chroot", chroot_main, _BB_DIR_SBIN},
61 {"clear", clear_main, _BB_DIR_USR_BIN},
64 {"chvt", chvt_main, _BB_DIR_USR_BIN},
67 {"cp", cp_mv_main, _BB_DIR_BIN},
70 {"cut", cut_main, _BB_DIR_USR_BIN},
73 {"date", date_main, _BB_DIR_BIN},
76 {"dd", dd_main, _BB_DIR_BIN},
79 {"df", df_main, _BB_DIR_BIN},
82 {"dirname", dirname_main, _BB_DIR_USR_BIN},
85 {"dmesg", dmesg_main, _BB_DIR_BIN},
88 {"du", du_main, _BB_DIR_BIN},
91 {"dutmp", dutmp_main, _BB_DIR_USR_SBIN},
94 {"echo", echo_main, _BB_DIR_BIN},
97 {"false", false_main, _BB_DIR_BIN},
100 {"fbset", fbset_main, _BB_DIR_USR_SBIN},
103 {"fdflush", fdflush_main, _BB_DIR_BIN},
106 {"find", find_main, _BB_DIR_USR_BIN},
109 {"free", free_main, _BB_DIR_USR_BIN},
111 #ifdef BB_FREERAMDISK
112 {"freeramdisk", freeramdisk_main, _BB_DIR_SBIN},
115 {"deallocvt", deallocvt_main, _BB_DIR_USR_BIN},
118 {"fsck.minix", fsck_minix_main, _BB_DIR_SBIN},
121 {"grep", grep_main, _BB_DIR_BIN},
124 {"gunzip", gunzip_main, _BB_DIR_BIN},
127 {"gzip", gzip_main, _BB_DIR_BIN},
130 {"halt", halt_main, _BB_DIR_SBIN},
133 {"head", head_main, _BB_DIR_BIN},
136 {"hostid", hostid_main, _BB_DIR_USR_BIN},
139 {"hostname", hostname_main, _BB_DIR_BIN},
142 {"id", id_main, _BB_DIR_USR_BIN},
145 {"init", init_main, _BB_DIR_SBIN},
148 {"insmod", insmod_main, _BB_DIR_SBIN},
151 {"kill", kill_main, _BB_DIR_BIN},
154 {"killall", kill_main, _BB_DIR_USR_BIN},
157 {"length", length_main, _BB_DIR_USR_BIN},
160 {"linuxrc", init_main, _BB_DIR_ROOT},
163 {"ln", ln_main, _BB_DIR_BIN},
166 {"loadacm", loadacm_main, _BB_DIR_USR_BIN},
169 {"loadfont", loadfont_main, _BB_DIR_USR_BIN},
172 {"loadkmap", loadkmap_main, _BB_DIR_SBIN},
175 {"logger", logger_main, _BB_DIR_USR_BIN},
178 {"logname", logname_main, _BB_DIR_USR_BIN},
181 {"ls", ls_main, _BB_DIR_BIN},
184 {"lsmod", lsmod_main, _BB_DIR_SBIN},
187 {"makedevs", makedevs_main, _BB_DIR_SBIN},
190 {"math", math_main, _BB_DIR_USR_BIN},
193 {"md5sum", md5sum_main, _BB_DIR_USR_BIN},
196 {"mkdir", mkdir_main, _BB_DIR_BIN},
199 {"mkfifo", mkfifo_main, _BB_DIR_USR_BIN},
202 {"mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN},
205 {"mknod", mknod_main, _BB_DIR_BIN},
208 {"mkswap", mkswap_main, _BB_DIR_SBIN},
211 {"mktemp", mktemp_main, _BB_DIR_BIN},
214 {"nc", nc_main, _BB_DIR_USR_BIN},
217 {"more", more_main, _BB_DIR_BIN},
220 {"mount", mount_main, _BB_DIR_BIN},
223 {"mt", mt_main, _BB_DIR_BIN},
226 {"mv", cp_mv_main, _BB_DIR_BIN},
229 {"nslookup", nslookup_main, _BB_DIR_USR_BIN},
232 {"ping", ping_main, _BB_DIR_BIN},
235 {"poweroff", poweroff_main, _BB_DIR_SBIN},
238 {"printf", printf_main, _BB_DIR_USR_BIN},
241 {"ps", ps_main, _BB_DIR_BIN},
244 {"pwd", pwd_main, _BB_DIR_BIN},
247 {"reboot", reboot_main, _BB_DIR_SBIN},
250 {"rm", rm_main, _BB_DIR_BIN},
253 {"rmdir", rmdir_main, _BB_DIR_BIN},
256 {"rmmod", rmmod_main, _BB_DIR_SBIN},
259 {"sed", sed_main, _BB_DIR_BIN},
261 #ifdef BB_SETKEYCODES
262 {"setkeycodes", setkeycodes_main, _BB_DIR_USR_BIN},
265 {"sfdisk", sfdisk_main, _BB_DIR_SBIN},
268 {"sh", shell_main, _BB_DIR_BIN},
271 {"sleep", sleep_main, _BB_DIR_BIN},
274 {"sort", sort_main, _BB_DIR_BIN},
277 {"sync", sync_main, _BB_DIR_BIN},
280 {"syslogd", syslogd_main, _BB_DIR_SBIN},
283 {"swapon", swap_on_off_main, _BB_DIR_SBIN},
286 {"swapoff", swap_on_off_main, _BB_DIR_SBIN},
289 {"tail", tail_main, _BB_DIR_USR_BIN},
292 {"tar", tar_main, _BB_DIR_BIN},
295 {"telnet", telnet_main, _BB_DIR_USR_BIN},
298 {"test", test_main, _BB_DIR_USR_BIN},
301 {"tee", tee_main, _BB_DIR_BIN},
304 {"touch", touch_main, _BB_DIR_USR_BIN},
307 {"tr", tr_main, _BB_DIR_USR_BIN},
310 {"true", true_main, _BB_DIR_BIN},
313 {"tty", tty_main, _BB_DIR_USR_BIN},
316 {"umount", umount_main, _BB_DIR_BIN},
319 {"uname", uname_main, _BB_DIR_BIN},
322 {"uniq", uniq_main, _BB_DIR_USR_BIN},
325 {"update", update_main, _BB_DIR_SBIN},
328 {"uptime", uptime_main, _BB_DIR_USR_BIN},
331 {"uuencode", uuencode_main, _BB_DIR_USR_BIN},
334 {"uudecode", uudecode_main, _BB_DIR_USR_BIN},
337 {"usleep", usleep_main, _BB_DIR_BIN},
340 {"wc", wc_main, _BB_DIR_USR_BIN},
343 {"which", which_main, _BB_DIR_USR_BIN},
346 {"whoami", whoami_main, _BB_DIR_USR_BIN},
349 {"yes", yes_main, _BB_DIR_USR_BIN},
352 {"zcat", gunzip_main, _BB_DIR_BIN},
355 {"[", test_main, _BB_DIR_USR_BIN},
362 int main(int argc, char **argv)
366 const struct BB_applet *a = applets;
368 for (s = name = argv[0]; *s != '\0';) {
375 while (a->name != 0) {
376 if (strcmp(name, a->name) == 0) {
379 status = ((*(a->main)) (argc, argv));
381 fprintf(stderr, "%s: %s\n", a->name, strerror(errno));
383 fprintf(stderr, "\n");
388 exit(busybox_main(argc, argv));
392 int busybox_main(int argc, char **argv)
399 if (been_there_done_that == 1 || argc < 1) {
400 const struct BB_applet *a = applets;
402 fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n"
403 "Usage: busybox [function] [arguments]...\n"
404 " or: [function] [arguments]...\n\n"
405 "\tBusyBox is a multi-call binary that combines many common Unix\n"
406 "\tutilities into a single executable. Most people will create a\n"
407 "\tlink to busybox for each function they wish to use, and BusyBox\n"
408 "\twill act like whatever it was invoked as.\n"
409 "\nCurrently defined functions:\n", BB_VER, BB_BT);
411 while (a->name != 0) {
413 fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "),
415 if (col > 60 && a->name != 0) {
416 fprintf(stderr, ",\n");
420 fprintf(stderr, "\n\n");
423 /* If we've already been here once, exit now */
424 been_there_done_that = 1;
425 return (main(argc, argv));
431 c-file-style: "linux"