1 /* vi: set sw=4 ts=4: */
7 #define bb_need_full_version
8 #define BB_DECLARE_EXTERN
11 static int been_there_done_that = 0;
13 const struct BB_applet applets[] = {
16 {"ar", ar_main, _BB_DIR_USR_BIN, ar_usage},
19 {"basename", basename_main, _BB_DIR_USR_BIN, basename_usage},
21 {"busybox", busybox_main, _BB_DIR_BIN, NULL},
23 {"cat", cat_main, _BB_DIR_BIN, cat_usage},
25 #ifdef BB_CHMOD_CHOWN_CHGRP
26 {"chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN, chgrp_usage},
28 #ifdef BB_CHMOD_CHOWN_CHGRP
29 {"chmod", chmod_chown_chgrp_main, _BB_DIR_BIN, chmod_usage},
31 #ifdef BB_CHMOD_CHOWN_CHGRP
32 {"chown", chmod_chown_chgrp_main, _BB_DIR_BIN, chown_usage},
35 {"chroot", chroot_main, _BB_DIR_USR_SBIN, chroot_usage},
38 {"clear", clear_main, _BB_DIR_USR_BIN, clear_usage},
41 {"chvt", chvt_main, _BB_DIR_USR_BIN, chvt_usage},
44 {"cp", cp_mv_main, _BB_DIR_BIN, cp_usage},
47 {"cut", cut_main, _BB_DIR_USR_BIN, cut_usage},
50 {"date", date_main, _BB_DIR_BIN, date_usage},
53 {"dc", dc_main, _BB_DIR_USR_BIN, dc_usage},
56 {"dd", dd_main, _BB_DIR_BIN, dd_usage},
59 {"df", df_main, _BB_DIR_BIN, df_usage},
62 {"dirname", dirname_main, _BB_DIR_USR_BIN, dirname_usage},
65 {"dmesg", dmesg_main, _BB_DIR_BIN, dmesg_usage},
68 {"du", du_main, _BB_DIR_USR_BIN, du_usage},
71 {"dumpkmap", dumpkmap_main, _BB_DIR_BIN, dumpkmap_usage},
74 {"dutmp", dutmp_main, _BB_DIR_USR_SBIN, dutmp_usage},
77 {"echo", echo_main, _BB_DIR_BIN, echo_usage},
80 {"false", false_main, _BB_DIR_BIN, false_usage},
83 {"fbset", fbset_main, _BB_DIR_USR_SBIN, NULL},
86 {"fdflush", fdflush_main, _BB_DIR_BIN, fdflush_usage},
89 {"find", find_main, _BB_DIR_USR_BIN, find_usage},
92 {"free", free_main, _BB_DIR_USR_BIN, free_usage},
95 {"freeramdisk", freeramdisk_main, _BB_DIR_SBIN, freeramdisk_usage},
98 {"deallocvt", deallocvt_main, _BB_DIR_USR_BIN, deallocvt_usage},
101 {"fsck.minix", fsck_minix_main, _BB_DIR_SBIN, fsck_minix_usage},
104 {"getopt", getopt_main, _BB_DIR_BIN},
107 {"grep", grep_main, _BB_DIR_BIN, grep_usage},
110 {"gunzip", gunzip_main, _BB_DIR_BIN, gunzip_usage},
113 {"gzip", gzip_main, _BB_DIR_BIN, gzip_usage},
116 {"halt", halt_main, _BB_DIR_SBIN, halt_usage},
119 {"head", head_main, _BB_DIR_USR_BIN, head_usage},
122 {"hostid", hostid_main, _BB_DIR_USR_BIN, hostid_usage},
125 {"hostname", hostname_main, _BB_DIR_BIN, hostname_usage},
128 {"id", id_main, _BB_DIR_USR_BIN, id_usage},
131 {"init", init_main, _BB_DIR_SBIN, NULL},
134 {"insmod", insmod_main, _BB_DIR_SBIN, insmod_usage},
137 {"kill", kill_main, _BB_DIR_BIN, kill_usage},
140 {"killall", kill_main, _BB_DIR_USR_BIN, kill_usage},
143 {"length", length_main, _BB_DIR_USR_BIN, length_usage},
146 {"linuxrc", init_main, _BB_DIR_ROOT, NULL},
149 {"ln", ln_main, _BB_DIR_BIN, ln_usage},
152 {"loadacm", loadacm_main, _BB_DIR_USR_BIN, loadacm_usage},
155 {"loadfont", loadfont_main, _BB_DIR_USR_BIN, loadfont_usage},
158 {"loadkmap", loadkmap_main, _BB_DIR_SBIN, loadkmap_usage},
161 {"logger", logger_main, _BB_DIR_USR_BIN, logger_usage},
164 {"logname", logname_main, _BB_DIR_USR_BIN, logname_usage},
167 {"ls", ls_main, _BB_DIR_BIN, ls_usage},
170 {"lsmod", lsmod_main, _BB_DIR_SBIN, lsmod_usage},
173 {"makedevs", makedevs_main, _BB_DIR_SBIN, makedevs_usage},
176 {"md5sum", md5sum_main, _BB_DIR_USR_BIN, md5sum_usage},
179 {"mkdir", mkdir_main, _BB_DIR_BIN, mkdir_usage},
182 {"mkfifo", mkfifo_main, _BB_DIR_USR_BIN, mkfifo_usage},
185 {"mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN, mkfs_minix_usage},
188 {"mknod", mknod_main, _BB_DIR_BIN, mknod_usage},
191 {"mkswap", mkswap_main, _BB_DIR_SBIN, mkswap_usage},
194 {"mktemp", mktemp_main, _BB_DIR_BIN, mktemp_usage},
197 {"nc", nc_main, _BB_DIR_USR_BIN, nc_usage},
200 {"more", more_main, _BB_DIR_BIN, more_usage},
203 {"mount", mount_main, _BB_DIR_BIN, mount_usage},
206 {"mt", mt_main, _BB_DIR_BIN, mt_usage},
209 {"mv", cp_mv_main, _BB_DIR_BIN, mv_usage},
212 {"nslookup", nslookup_main, _BB_DIR_USR_BIN, nslookup_usage},
215 {"ping", ping_main, _BB_DIR_BIN, ping_usage},
218 {"poweroff", poweroff_main, _BB_DIR_SBIN, poweroff_usage},
221 {"printf", printf_main, _BB_DIR_USR_BIN, printf_usage},
224 {"ps", ps_main, _BB_DIR_BIN, ps_usage},
227 {"pwd", pwd_main, _BB_DIR_BIN, pwd_usage},
230 {"rdate", rdate_main, _BB_DIR_USR_BIN, rdate_usage},
233 {"reboot", reboot_main, _BB_DIR_SBIN, reboot_usage},
236 {"renice", renice_main, _BB_DIR_USR_BIN},
239 {"reset", reset_main, _BB_DIR_USR_BIN, reset_usage},
242 {"rm", rm_main, _BB_DIR_BIN, rm_usage},
245 {"rmdir", rmdir_main, _BB_DIR_BIN, rmdir_usage},
248 {"rmmod", rmmod_main, _BB_DIR_SBIN, rmmod_usage},
251 {"sed", sed_main, _BB_DIR_BIN, sed_usage},
253 #ifdef BB_SETKEYCODES
254 {"setkeycodes", setkeycodes_main, _BB_DIR_USR_BIN, setkeycodes_usage},
257 {"sh", shell_main, _BB_DIR_BIN, shell_usage},
260 {"sleep", sleep_main, _BB_DIR_BIN, sleep_usage},
263 {"sort", sort_main, _BB_DIR_USR_BIN, sort_usage},
266 {"sync", sync_main, _BB_DIR_BIN, sync_usage},
269 {"syslogd", syslogd_main, _BB_DIR_SBIN, syslogd_usage},
272 {"swapon", swap_on_off_main, _BB_DIR_SBIN, swapon_usage},
275 {"swapoff", swap_on_off_main, _BB_DIR_SBIN, swapoff_usage},
278 {"tail", tail_main, _BB_DIR_USR_BIN, tail_usage},
281 {"tar", tar_main, _BB_DIR_BIN, tar_usage},
284 {"telnet", telnet_main, _BB_DIR_USR_BIN, telnet_usage},
287 {"test", test_main, _BB_DIR_USR_BIN, test_usage},
290 {"tee", tee_main, _BB_DIR_USR_BIN, tee_usage},
293 {"touch", touch_main, _BB_DIR_BIN, touch_usage},
296 {"tr", tr_main, _BB_DIR_USR_BIN, tr_usage},
299 {"true", true_main, _BB_DIR_BIN, true_usage},
302 {"tty", tty_main, _BB_DIR_USR_BIN, tty_usage},
305 {"umount", umount_main, _BB_DIR_BIN, umount_usage},
308 {"uname", uname_main, _BB_DIR_BIN, uname_usage},
311 {"uniq", uniq_main, _BB_DIR_USR_BIN, uniq_usage},
314 {"update", update_main, _BB_DIR_SBIN, update_usage},
317 {"uptime", uptime_main, _BB_DIR_USR_BIN, uptime_usage},
320 {"uuencode", uuencode_main, _BB_DIR_USR_BIN, uuencode_usage},
323 {"uudecode", uudecode_main, _BB_DIR_USR_BIN, uudecode_usage},
326 {"usleep", usleep_main, _BB_DIR_BIN, usleep_usage},
329 {"wc", wc_main, _BB_DIR_USR_BIN, wc_usage},
332 {"which", which_main, _BB_DIR_USR_BIN, which_usage},
335 {"whoami", whoami_main, _BB_DIR_USR_BIN, whoami_usage},
338 {"yes", yes_main, _BB_DIR_USR_BIN, yes_usage},
341 {"zcat", gunzip_main, _BB_DIR_BIN, gunzip_usage},
344 {"[", test_main, _BB_DIR_USR_BIN, test_usage},
349 const char *applet_name;
351 #ifdef BB_FEATURE_INSTALLER
354 * this should be consistent w/ the enum, internal.h::Location,
357 static char* install_dir[] = {
365 /* abstract link() */
366 typedef int (*__link_f)(const char *, const char *);
369 * Where in the filesystem is this busybox?
371 * malloc'd string w/ full pathname of busybox's location
374 static char *busybox_fullpath()
382 sprintf(proc, "/proc/%d/exe", pid);
383 len = readlink(proc, path, 256);
387 errorMsg("%s: %s\n", proc, strerror(errno));
393 /* create (sym)links for each applet */
394 static int install_links(const char *busybox, int use_symbolic_links)
396 __link_f Link = link;
402 if (use_symbolic_links) Link = symlink;
404 for (i = 0; applets[i].name != NULL; i++) {
408 install_dir[applets[i].location],
412 rc |= Link(busybox, command);
417 errorMsg("%s: %s\n", command, strerror(errno));
423 #endif /* BB_FEATURE_INSTALLER */
426 int main(int argc, char **argv)
429 const struct BB_applet *a = applets;
430 applet_name = "busybox";
432 #ifdef BB_FEATURE_INSTALLER
434 * This style of argument parsing doesn't scale well
435 * in the event that busybox starts wanting more --options.
436 * If someone has a cleaner approach, by all means implement it.
438 if (argc > 1 && (strcmp(argv[1], "--install") == 0)) {
439 int use_symbolic_links = 0;
443 /* to use symlinks, or not to use symlinks... */
445 if ((strcmp(argv[2], "-s") == 0)) {
446 use_symbolic_links = 1;
451 busybox = busybox_fullpath();
453 install_links(busybox, use_symbolic_links);
460 #endif /* BB_FEATURE_INSTALLER */
462 for (s = applet_name = argv[0]; *s != '\0';) {
467 *argv = (char*)applet_name;
470 /* Add in a special case hack -- whenever **argv == '-'
471 * (i.e. '-su' or '-sh') always invoke the shell */
472 if (**argv == '-' && *(*argv+1)!= '-') {
473 exit(((*(shell_main)) (argc, argv)));
477 while (a->name != 0) {
478 if (strcmp(applet_name, a->name) == 0) {
479 if (a->usage && argv[1] && strcmp(argv[1], "--help") == 0)
481 exit(((*(a->main)) (argc, argv)));
485 return(busybox_main(argc, argv));
489 int busybox_main(int argc, char **argv)
496 if (been_there_done_that == 1 || argc < 1) {
497 const struct BB_applet *a = applets;
499 fprintf(stderr, "%s\n\n"
500 "Usage: busybox [function] [arguments]...\n"
501 " or: [function] [arguments]...\n\n"
502 "\tBusyBox is a multi-call binary that combines many common Unix\n"
503 "\tutilities into a single executable. Most people will create a\n"
504 "\tlink to busybox for each function they wish to use, and BusyBox\n"
505 "\twill act like whatever it was invoked as.\n"
506 "\nCurrently defined functions:\n", full_version);
508 while (a->name != 0) {
510 fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "),
512 if (col > 60 && a->name != 0) {
513 fprintf(stderr, ",\n");
517 fprintf(stderr, "\n\n");
520 /* If we've already been here once, exit now */
521 been_there_done_that = 1;
522 return (main(argc, argv));
527 c-file-style: "linux"