blob: d59b2855e1f0b2e0b1fa7d4ce65744273cf74ce4 [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
Eric Andersen485b9551999-12-07 23:14:59 +0000176#ifdef BB_PING //bin
177 {"ping", ping_main},
178#endif
Eric Andersen2cb55071999-12-10 08:25:07 +0000179#ifdef BB_POWEROFF //sbin
180 {"poweroff", poweroff_main},
181#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000182#ifdef BB_PRINTF //usr/bin
183 {"printf", printf_main},
184#endif
Eric Andersenef8b6c71999-10-20 08:05:35 +0000185#ifdef BB_PS //bin
186 {"ps", ps_main},
187#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000188#ifdef BB_PWD //bin
189 {"pwd", pwd_main},
190#endif
191#ifdef BB_REBOOT //sbin
192 {"reboot", reboot_main},
193#endif
194#ifdef BB_RM //bin
195 {"rm", rm_main},
196#endif
197#ifdef BB_RMDIR //bin
Eric Andersenf6be9441999-10-13 21:12:06 +0000198 {"rmdir", rmdir_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000199#endif
Erik Andersen3d7e3411999-12-16 23:04:20 +0000200#ifdef BB_RMMOD //sbin
201 {"rmmod", rmmod_main},
202#endif
Eric Andersene77ae3a1999-10-19 20:03:34 +0000203#ifdef BB_SFDISK //sbin
204 {"fdisk", sfdisk_main},
205 {"sfdisk", sfdisk_main},
206#endif
Eric Andersenc1525e81999-10-29 00:07:31 +0000207#ifdef BB_SED //bin
208 {"sed", sed_main},
209#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000210#ifdef BB_SLEEP //bin
211 {"sleep", sleep_main},
212#endif
John Beppu019513a1999-12-22 17:57:31 +0000213#ifdef BB_SORT //bin
214 {"sort", sort_main},
215#endif
Eric Andersen3843e961999-11-25 07:30:46 +0000216#ifdef BB_SYNC //bin
217 {"sync", sync_main},
218#endif
219#ifdef BB_SYSLOGD //sbin
220 {"syslogd", syslogd_main},
221#endif
222#ifdef BB_LOGGER //usr/bin
223 {"logger", logger_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000224#endif
Erik Andersen31638212000-01-15 22:28:50 +0000225#ifdef BB_LOGNAME //usr/bin
226 {"logname", logname_main},
227#endif
Eric Andersen87590061999-10-18 21:22:59 +0000228#ifdef BB_SWAPONOFF //sbin
229 {"swapon", swap_on_off_main},
230 {"swapoff", swap_on_off_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000231#endif
Eric Andersenabc0f4f1999-12-08 23:19:36 +0000232#ifdef BB_TAIL //usr/bin
233 {"tail", tail_main},
234#endif
Eric Andersen3843e961999-11-25 07:30:46 +0000235#ifdef BB_TAR //bin
236 {"tar", tar_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000237#endif
John Beppu059f1521999-12-10 05:27:16 +0000238#ifdef BB_TEE //bin
239 {"tee", tee_main},
240#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000241#ifdef BB_TOUCH //usr/bin
Eric Andersen596e5461999-10-07 08:30:23 +0000242 {"touch", touch_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000243#endif
Eric Andersena3f09071999-10-19 16:39:10 +0000244#ifdef BB_TRUE_FALSE //bin
Eric Andersencc8ed391999-10-05 16:24:54 +0000245 {"true", true_main},
Eric Andersena3f09071999-10-19 16:39:10 +0000246 {"false", false_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000247#endif
Erik Andersen31638212000-01-15 22:28:50 +0000248#ifdef BB_TTY //usr/bin
249 {"tty", tty_main},
Erik Andersen05df2392000-01-13 04:43:48 +0000250#endif
Eric Andersen0460ff21999-10-25 23:32:44 +0000251#ifdef BB_UNAME //bin
252 {"uname", uname_main},
253#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000254#ifdef BB_UMOUNT //bin
Eric Andersen87590061999-10-18 21:22:59 +0000255 {"umount", umount_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000256#endif
John Beppuabb47722000-01-06 00:48:21 +0000257#ifdef BB_UNIQ //bin
258 {"uniq", uniq_main},
259#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000260#ifdef BB_UPDATE //sbin
261 {"update", update_main},
262#endif
Erik Andersen31638212000-01-15 22:28:50 +0000263#ifdef BB_WC //usr/bin
264 {"wc", wc_main},
265#endif
266#ifdef BB_WHOAMI //usr/bin
267 {"whoami", whoami_main},
268#endif
269#ifdef BB_YES //usr/bin
270 {"yes", yes_main},
271#endif
Eric Andersend80e8511999-11-16 00:46:00 +0000272#ifdef BB_GUNZIP //bin
273 {"zcat", gunzip_main},
274 {"gunzip", gunzip_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000275#endif
276#ifdef BB_GZIP //bin
277 {"gzip", gzip_main},
278#endif
279 {0}
280};
281
Erik Andersen05df2392000-01-13 04:43:48 +0000282
283
Eric Andersencc8ed391999-10-05 16:24:54 +0000284int main(int argc, char **argv)
285{
286 char *s = argv[0];
287 char *name = argv[0];
288 const struct Applet *a = applets;
289
290 while (*s != '\0') {
291 if (*s++ == '/')
292 name = s;
293 }
294
295 while (a->name != 0) {
296 if (strcmp(name, a->name) == 0) {
297 int status;
298
299 status = ((*(a->main)) (argc, argv));
300 if (status < 0) {
301 fprintf(stderr, "%s: %s\n", a->name, strerror(errno));
302 }
303 fprintf(stderr, "\n");
304 exit(status);
305 }
306 a++;
307 }
Eric Andersen2ce1edc1999-10-12 15:42:48 +0000308 exit (busybox_main(argc, argv));
Eric Andersencc8ed391999-10-05 16:24:54 +0000309}
310
311
312int busybox_main(int argc, char **argv)
313{
Eric Andersen17d49ef1999-10-06 20:25:32 +0000314 int col=0;
Eric Andersencc8ed391999-10-05 16:24:54 +0000315 argc--;
316 argv++;
317
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000318 if (been_there_done_that == 1 || argc < 1) {
Eric Andersencc8ed391999-10-05 16:24:54 +0000319 const struct Applet *a = applets;
Eric Andersend73dc5b1999-11-10 23:13:02 +0000320 fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
Eric Andersencc8ed391999-10-05 16:24:54 +0000321 BB_VER, BB_BT);
Eric Andersend73dc5b1999-11-10 23:13:02 +0000322 fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
323 fprintf(stderr, " or: [function] [arguments]...\n\n");
Eric Andersencc8ed391999-10-05 16:24:54 +0000324 fprintf(stderr,
Eric Andersend73dc5b1999-11-10 23:13:02 +0000325 "\tMost people will create a symlink to busybox for each\n"
Eric Andersencc8ed391999-10-05 16:24:54 +0000326 "\tfunction name, and busybox will act like whatever you invoke it as.\n");
327 fprintf(stderr, "\nCurrently defined functions:\n");
328
Eric Andersencc8ed391999-10-05 16:24:54 +0000329 while (a->name != 0) {
Eric Andersen2ce1edc1999-10-12 15:42:48 +0000330 col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), (a++)->name);
Erik Andersen3fe39dc2000-01-25 18:13:53 +0000331 if (col>60 && a->name != 0) {
Eric Andersen17d49ef1999-10-06 20:25:32 +0000332 fprintf(stderr, ",\n");
333 col=0;
334 }
Eric Andersencc8ed391999-10-05 16:24:54 +0000335 }
336 fprintf(stderr, "\n\n");
337 exit(-1);
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000338 } else {
339 /* If we've already been here once, exit now */
340 been_there_done_that = 1;
Eric Andersencc8ed391999-10-05 16:24:54 +0000341 return (main(argc, argv));
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000342 }
Eric Andersencc8ed391999-10-05 16:24:54 +0000343}