blob: 7f14473e06b329036c8d9dadad4325765a288f20 [file] [log] [blame]
Eric Andersencc8ed391999-10-05 16:24:54 +00001#include "internal.h"
2#include <stdio.h>
3#include <string.h>
4#include <errno.h>
5
Erik Andersen31638212000-01-15 22:28:50 +00006#ifndef BB_INIT
7#undef BB_FEATURE_LINUXRC
8#endif
9
Eric Andersencc8ed391999-10-05 16:24:54 +000010static int been_there_done_that = 0;
11
Erik Andersen31638212000-01-15 22:28:50 +000012/* It has been alledged that doing such things can
13 * help reduce binary size when staticly linking,
14 * of course with glibc, this is unlikely as long
15 * as we use things like printf -- perhaps a printf
16 * replacement may be in order
17 */
Erik Andersen05df2392000-01-13 04:43:48 +000018#if 0
19void exit (int status) __attribute__ ((noreturn));
20void exit (int status) { _exit(status); };
21void abort (void) __attribute__ ((__noreturn__));
22void abort (void) { _exit(0); };
23int atexit (void (*__func) (void)) { _exit(0); };
24void *__libc_stack_end;
25#endif
26
27
Eric Andersencc8ed391999-10-05 16:24:54 +000028static const struct Applet applets[] = {
29
30#ifdef BB_BUSYBOX //bin
31 {"busybox", busybox_main},
32#endif
33#ifdef BB_BLOCK_DEVICE //sbin
34 {"block_device", block_device_main},
35#endif
36#ifdef BB_CAT //bin
Eric Andersene77ae3a1999-10-19 20:03:34 +000037 {"cat", cat_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000038#endif
Eric Andersen1b61f411999-10-13 18:56:42 +000039#ifdef BB_CHMOD_CHOWN_CHGRP //bin
40 {"chmod", chmod_chown_chgrp_main},
41 {"chown", chmod_chown_chgrp_main},
42 {"chgrp", chmod_chown_chgrp_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000043#endif
44#ifdef BB_CHROOT //sbin
45 {"chroot", chroot_main},
46#endif
47#ifdef BB_CLEAR //usr/bin
48 {"clear", clear_main},
49#endif
Eric Andersenabc0f4f1999-12-08 23:19:36 +000050#ifdef BB_CHVT //usr/bin
51 {"chvt", chvt_main},
52#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000053#ifdef BB_CP //bin
Eric Andersenf811e071999-10-09 00:25:00 +000054 {"cp", cp_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000055#endif
56#ifdef BB_DATE //bin
57 {"date", date_main},
58#endif
59#ifdef BB_DD //bin
60 {"dd", dd_main},
61#endif
62#ifdef BB_DF //bin
63 {"df", df_main},
64#endif
65#ifdef BB_DMESG //bin
66 {"dmesg", dmesg_main},
67#endif
John Beppu7a986061999-12-09 18:29:29 +000068#ifdef BB_DU //bin
69 {"du", du_main},
70#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000071#ifdef BB_DUTMP //usr/sbin
Eric Andersene77ae3a1999-10-19 20:03:34 +000072 {"dutmp", dutmp_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000073#endif
Erik Andersen1c5b2581999-12-16 20:59:36 +000074#ifdef BB_FBSET //usr/sbin
75 {"fbset", fbset_main},
76#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000077#ifdef BB_FDFLUSH //bin
Eric Andersenf6be9441999-10-13 21:12:06 +000078 {"fdflush", fdflush_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000079#endif
80#ifdef BB_FIND //usr/bin
81 {"find", find_main},
82#endif
Eric Andersenabc0f4f1999-12-08 23:19:36 +000083#ifdef BB_FREE //usr/bin
84 {"free", free_main},
Eric Andersen0460ff21999-10-25 23:32:44 +000085#endif
Erik Andersen3fe39dc2000-01-25 18:13:53 +000086#ifdef BB_DEALLOCVT //usr/bin
Eric Andersen0460ff21999-10-25 23:32:44 +000087 {"deallocvt", deallocvt_main},
88#endif
Eric Andersene494fdd1999-10-19 20:23:03 +000089#ifdef BB_FSCK_MINIX //sbin
90 {"fsck.minix", fsck_minix_main},
91#endif
92#ifdef BB_MKFS_MINIX //sbin
93 {"mkfs.minix", mkfs_minix_main},
94#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000095#ifdef BB_GREP //bin
96 {"grep", grep_main},
97#endif
98#ifdef BB_HALT //sbin
99 {"halt", halt_main},
100#endif
John Beppu3157b1f1999-12-10 07:42:50 +0000101#ifdef BB_HEAD //bin
102 {"head", head_main},
103#endif
Erik Andersen31638212000-01-15 22:28:50 +0000104#ifdef BB_HOSTID //usr/bin
105 {"hostid", hostid_main},
106#endif
Eric Andersen485b9551999-12-07 23:14:59 +0000107#ifdef BB_HOSTNAME //bin
108 {"hostname", hostname_main},
109#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000110#ifdef BB_INIT //sbin
111 {"init", init_main},
112#endif
Erik Andersen6da0ae81999-12-17 01:08:27 +0000113#ifdef BB_INSMOD //sbin
114 {"insmod", insmod_main},
115#endif
Eric Andersen6a76e651999-11-19 05:31:45 +0000116#ifdef BB_FEATURE_LINUXRC //
117 {"linuxrc", init_main},
118#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000119#ifdef BB_KILL //bin
120 {"kill", kill_main},
121#endif
122#ifdef BB_LENGTH //usr/bin
123 {"length", length_main},
124#endif
125#ifdef BB_LN //bin
Eric Andersenf6be9441999-10-13 21:12:06 +0000126 {"ln", ln_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000127#endif
Erik Andersen7dc16072000-01-04 01:10:25 +0000128#ifdef BB_LOADACM //usr/bin
129 {"loadacm", loadacm_main},
130#endif
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000131#ifdef BB_LOADFONT //usr/bin
132 {"loadfont", loadfont_main},
133#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000134#ifdef BB_LOADKMAP //sbin
135 {"loadkmap", loadkmap_main},
136#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000137#ifdef BB_LS //bin
138 {"ls", ls_main},
139#endif
Erik Andersen6f23cec1999-12-15 22:14:12 +0000140#ifdef BB_LSMOD //sbin
141 {"lsmod", lsmod_main},
142#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000143#ifdef BB_MAKEDEVS //sbin
144 {"makedevs", makedevs_main},
145#endif
146#ifdef BB_MATH //usr/bin
147 {"math", math_main},
148#endif
149#ifdef BB_MKDIR //bin
Eric Andersenf6be9441999-10-13 21:12:06 +0000150 {"mkdir", mkdir_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000151#endif
Eric Andersen19db07b1999-12-11 08:41:28 +0000152#ifdef BB_MKFIFO //usr/bin
153 {"mkfifo", mkfifo_main},
154#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000155#ifdef BB_MKNOD //bin
156 {"mknod", mknod_main},
157#endif
158#ifdef BB_MKSWAP //sbin
159 {"mkswap", mkswap_main},
160#endif
161#ifdef BB_MNC //usr/bin
162 {"mnc", mnc_main},
163#endif
164#ifdef BB_MORE //bin
Eric Andersen4bea32a1999-10-06 00:30:51 +0000165 {"more", more_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000166#endif
167#ifdef BB_MOUNT //bin
168 {"mount", mount_main},
169#endif
170#ifdef BB_MT //bin
171 {"mt", mt_main},
172#endif
173#ifdef BB_MV //bin
Eric Andersen596e5461999-10-07 08:30:23 +0000174 {"mv", mv_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000175#endif
John Beppub332e772000-01-29 12:59:01 +0000176#ifdef BB_NSLOOKUP //bin
177 {"nslookup", nslookup_main},
178#endif
Eric Andersen485b9551999-12-07 23:14:59 +0000179#ifdef BB_PING //bin
180 {"ping", ping_main},
181#endif
Eric Andersen2cb55071999-12-10 08:25:07 +0000182#ifdef BB_POWEROFF //sbin
183 {"poweroff", poweroff_main},
184#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000185#ifdef BB_PRINTF //usr/bin
186 {"printf", printf_main},
187#endif
Eric Andersenef8b6c71999-10-20 08:05:35 +0000188#ifdef BB_PS //bin
189 {"ps", ps_main},
190#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000191#ifdef BB_PWD //bin
192 {"pwd", pwd_main},
193#endif
194#ifdef BB_REBOOT //sbin
195 {"reboot", reboot_main},
196#endif
197#ifdef BB_RM //bin
198 {"rm", rm_main},
199#endif
200#ifdef BB_RMDIR //bin
Eric Andersenf6be9441999-10-13 21:12:06 +0000201 {"rmdir", rmdir_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000202#endif
Erik Andersen3d7e3411999-12-16 23:04:20 +0000203#ifdef BB_RMMOD //sbin
204 {"rmmod", rmmod_main},
205#endif
Eric Andersene77ae3a1999-10-19 20:03:34 +0000206#ifdef BB_SFDISK //sbin
207 {"fdisk", sfdisk_main},
208 {"sfdisk", sfdisk_main},
209#endif
Eric Andersenc1525e81999-10-29 00:07:31 +0000210#ifdef BB_SED //bin
211 {"sed", sed_main},
212#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000213#ifdef BB_SLEEP //bin
214 {"sleep", sleep_main},
215#endif
John Beppu019513a1999-12-22 17:57:31 +0000216#ifdef BB_SORT //bin
217 {"sort", sort_main},
218#endif
Eric Andersen3843e961999-11-25 07:30:46 +0000219#ifdef BB_SYNC //bin
220 {"sync", sync_main},
221#endif
222#ifdef BB_SYSLOGD //sbin
223 {"syslogd", syslogd_main},
224#endif
225#ifdef BB_LOGGER //usr/bin
226 {"logger", logger_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000227#endif
Erik Andersen31638212000-01-15 22:28:50 +0000228#ifdef BB_LOGNAME //usr/bin
229 {"logname", logname_main},
230#endif
Eric Andersen87590061999-10-18 21:22:59 +0000231#ifdef BB_SWAPONOFF //sbin
232 {"swapon", swap_on_off_main},
233 {"swapoff", swap_on_off_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000234#endif
Eric Andersenabc0f4f1999-12-08 23:19:36 +0000235#ifdef BB_TAIL //usr/bin
236 {"tail", tail_main},
237#endif
Eric Andersen3843e961999-11-25 07:30:46 +0000238#ifdef BB_TAR //bin
239 {"tar", tar_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000240#endif
John Beppu059f1521999-12-10 05:27:16 +0000241#ifdef BB_TEE //bin
242 {"tee", tee_main},
243#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000244#ifdef BB_TOUCH //usr/bin
Eric Andersen596e5461999-10-07 08:30:23 +0000245 {"touch", touch_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000246#endif
Eric Andersena3f09071999-10-19 16:39:10 +0000247#ifdef BB_TRUE_FALSE //bin
Eric Andersencc8ed391999-10-05 16:24:54 +0000248 {"true", true_main},
Eric Andersena3f09071999-10-19 16:39:10 +0000249 {"false", false_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000250#endif
Erik Andersen31638212000-01-15 22:28:50 +0000251#ifdef BB_TTY //usr/bin
252 {"tty", tty_main},
Erik Andersen05df2392000-01-13 04:43:48 +0000253#endif
Eric Andersen0460ff21999-10-25 23:32:44 +0000254#ifdef BB_UNAME //bin
255 {"uname", uname_main},
256#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000257#ifdef BB_UMOUNT //bin
Eric Andersen87590061999-10-18 21:22:59 +0000258 {"umount", umount_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000259#endif
John Beppuabb47722000-01-06 00:48:21 +0000260#ifdef BB_UNIQ //bin
261 {"uniq", uniq_main},
262#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000263#ifdef BB_UPDATE //sbin
264 {"update", update_main},
265#endif
Erik Andersen31638212000-01-15 22:28:50 +0000266#ifdef BB_WC //usr/bin
267 {"wc", wc_main},
268#endif
269#ifdef BB_WHOAMI //usr/bin
270 {"whoami", whoami_main},
271#endif
272#ifdef BB_YES //usr/bin
273 {"yes", yes_main},
274#endif
Eric Andersend80e8511999-11-16 00:46:00 +0000275#ifdef BB_GUNZIP //bin
276 {"zcat", gunzip_main},
277 {"gunzip", gunzip_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000278#endif
279#ifdef BB_GZIP //bin
280 {"gzip", gzip_main},
281#endif
282 {0}
283};
284
Erik Andersen05df2392000-01-13 04:43:48 +0000285
286
Eric Andersencc8ed391999-10-05 16:24:54 +0000287int main(int argc, char **argv)
288{
289 char *s = argv[0];
290 char *name = argv[0];
291 const struct Applet *a = applets;
292
293 while (*s != '\0') {
294 if (*s++ == '/')
295 name = s;
296 }
297
298 while (a->name != 0) {
299 if (strcmp(name, a->name) == 0) {
300 int status;
301
302 status = ((*(a->main)) (argc, argv));
303 if (status < 0) {
304 fprintf(stderr, "%s: %s\n", a->name, strerror(errno));
305 }
306 fprintf(stderr, "\n");
307 exit(status);
308 }
309 a++;
310 }
Eric Andersen2ce1edc1999-10-12 15:42:48 +0000311 exit (busybox_main(argc, argv));
Eric Andersencc8ed391999-10-05 16:24:54 +0000312}
313
314
315int busybox_main(int argc, char **argv)
316{
Eric Andersen17d49ef1999-10-06 20:25:32 +0000317 int col=0;
Eric Andersencc8ed391999-10-05 16:24:54 +0000318 argc--;
319 argv++;
320
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000321 if (been_there_done_that == 1 || argc < 1) {
Eric Andersencc8ed391999-10-05 16:24:54 +0000322 const struct Applet *a = applets;
Eric Andersend73dc5b1999-11-10 23:13:02 +0000323 fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
Eric Andersencc8ed391999-10-05 16:24:54 +0000324 BB_VER, BB_BT);
Eric Andersend73dc5b1999-11-10 23:13:02 +0000325 fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
326 fprintf(stderr, " or: [function] [arguments]...\n\n");
Eric Andersencc8ed391999-10-05 16:24:54 +0000327 fprintf(stderr,
Eric Andersend73dc5b1999-11-10 23:13:02 +0000328 "\tMost people will create a symlink to busybox for each\n"
Eric Andersencc8ed391999-10-05 16:24:54 +0000329 "\tfunction name, and busybox will act like whatever you invoke it as.\n");
330 fprintf(stderr, "\nCurrently defined functions:\n");
331
Eric Andersencc8ed391999-10-05 16:24:54 +0000332 while (a->name != 0) {
Eric Andersen2ce1edc1999-10-12 15:42:48 +0000333 col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), (a++)->name);
Erik Andersen3fe39dc2000-01-25 18:13:53 +0000334 if (col>60 && a->name != 0) {
Eric Andersen17d49ef1999-10-06 20:25:32 +0000335 fprintf(stderr, ",\n");
336 col=0;
337 }
Eric Andersencc8ed391999-10-05 16:24:54 +0000338 }
339 fprintf(stderr, "\n\n");
340 exit(-1);
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000341 } else {
342 /* If we've already been here once, exit now */
343 been_there_done_that = 1;
Eric Andersencc8ed391999-10-05 16:24:54 +0000344 return (main(argc, argv));
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000345 }
Eric Andersencc8ed391999-10-05 16:24:54 +0000346}