6 static int been_there_done_that = 0;
9 void exit (int status) __attribute__ ((noreturn));
10 void exit (int status) { _exit(status); };
11 void abort (void) __attribute__ ((__noreturn__));
12 void abort (void) { _exit(0); };
13 int atexit (void (*__func) (void)) { _exit(0); };
14 void *__libc_stack_end;
18 static const struct Applet applets[] = {
20 #ifdef BB_BUSYBOX //bin
21 {"busybox", busybox_main},
23 #ifdef BB_BLOCK_DEVICE //sbin
24 {"block_device", block_device_main},
29 #ifdef BB_CHMOD_CHOWN_CHGRP //bin
30 {"chmod", chmod_chown_chgrp_main},
31 {"chown", chmod_chown_chgrp_main},
32 {"chgrp", chmod_chown_chgrp_main},
34 #ifdef BB_CHROOT //sbin
35 {"chroot", chroot_main},
37 #ifdef BB_CLEAR //usr/bin
38 {"clear", clear_main},
40 #ifdef BB_CHVT //usr/bin
56 {"dmesg", dmesg_main},
61 #ifdef BB_DUTMP //usr/sbin
62 {"dutmp", dutmp_main},
64 #ifdef BB_FBSET //usr/sbin
65 {"fbset", fbset_main},
67 #ifdef BB_FDFLUSH //bin
68 {"fdflush", fdflush_main},
70 #ifdef BB_FIND //usr/bin
73 #ifdef BB_FREE //usr/bin
76 #ifdef BB_DEALLOCVT //usr/bin
77 {"deallocvt", deallocvt_main},
79 #ifdef BB_FSCK_MINIX //sbin
80 {"fsck.minix", fsck_minix_main},
82 #ifdef BB_MKFS_MINIX //sbin
83 {"mkfs.minix", mkfs_minix_main},
94 #ifdef BB_HOSTNAME //bin
95 {"hostname", hostname_main},
100 #ifdef BB_INSMOD //sbin
101 {"insmod", insmod_main},
103 #ifdef BB_FEATURE_LINUXRC //
104 {"linuxrc", init_main},
109 #ifdef BB_LENGTH //usr/bin
110 {"length", length_main},
115 #ifdef BB_LOADACM //usr/bin
116 {"loadacm", loadacm_main},
118 #ifdef BB_LOADFONT //usr/bin
119 {"loadfont", loadfont_main},
121 #ifdef BB_LOADKMAP //sbin
122 {"loadkmap", loadkmap_main},
127 #ifdef BB_LSMOD //sbin
128 {"lsmod", lsmod_main},
130 #ifdef BB_MAKEDEVS //sbin
131 {"makedevs", makedevs_main},
133 #ifdef BB_MATH //usr/bin
136 #ifdef BB_MKDIR //bin
137 {"mkdir", mkdir_main},
139 #ifdef BB_MKFIFO //usr/bin
140 {"mkfifo", mkfifo_main},
142 #ifdef BB_MKNOD //bin
143 {"mknod", mknod_main},
145 #ifdef BB_MKSWAP //sbin
146 {"mkswap", mkswap_main},
148 #ifdef BB_MNC //usr/bin
154 #ifdef BB_MOUNT //bin
155 {"mount", mount_main},
166 #ifdef BB_POWEROFF //sbin
167 {"poweroff", poweroff_main},
169 #ifdef BB_PRINTF //usr/bin
170 {"printf", printf_main},
178 #ifdef BB_REBOOT //sbin
179 {"reboot", reboot_main},
184 #ifdef BB_RMDIR //bin
185 {"rmdir", rmdir_main},
187 #ifdef BB_RMMOD //sbin
188 {"rmmod", rmmod_main},
190 #ifdef BB_SFDISK //sbin
191 {"fdisk", sfdisk_main},
192 {"sfdisk", sfdisk_main},
197 #ifdef BB_SLEEP //bin
198 {"sleep", sleep_main},
206 #ifdef BB_SYSLOGD //sbin
207 {"syslogd", syslogd_main},
209 #ifdef BB_LOGGER //usr/bin
210 {"logger", logger_main},
212 #ifdef BB_SWAPONOFF //sbin
213 {"swapon", swap_on_off_main},
214 {"swapoff", swap_on_off_main},
216 #ifdef BB_TAIL //usr/bin
225 #ifdef BB_TOUCH //usr/bin
226 {"touch", touch_main},
228 #ifdef BB_TRUE_FALSE //bin
230 {"false", false_main},
232 #ifdef BB_WC //usr/bin
235 #ifdef BB_UNAME //bin
236 {"uname", uname_main},
238 #ifdef BB_UMOUNT //bin
239 {"umount", umount_main},
244 #ifdef BB_UPDATE //sbin
245 {"update", update_main},
247 #ifdef BB_GUNZIP //bin
248 {"zcat", gunzip_main},
249 {"gunzip", gunzip_main},
259 int main(int argc, char **argv)
262 char *name = argv[0];
263 const struct Applet *a = applets;
270 while (a->name != 0) {
271 if (strcmp(name, a->name) == 0) {
274 status = ((*(a->main)) (argc, argv));
276 fprintf(stderr, "%s: %s\n", a->name, strerror(errno));
278 fprintf(stderr, "\n");
283 exit (busybox_main(argc, argv));
287 int busybox_main(int argc, char **argv)
293 if (been_there_done_that == 1 || argc < 1) {
294 const struct Applet *a = applets;
295 fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
297 fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
298 fprintf(stderr, " or: [function] [arguments]...\n\n");
300 "\tMost people will create a symlink to busybox for each\n"
301 "\tfunction name, and busybox will act like whatever you invoke it as.\n");
302 fprintf(stderr, "\nCurrently defined functions:\n");
304 while (a->name != 0) {
305 col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), (a++)->name);
307 fprintf(stderr, ",\n");
311 fprintf(stderr, "\n\n");
314 /* If we've already been here once, exit now */
315 been_there_done_that = 1;
316 return (main(argc, argv));