blob: 4a7feefd269ef0bbc36646ecc930c166ea4a8dc4 [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
6static int been_there_done_that = 0;
7
8static const struct Applet applets[] = {
9
10#ifdef BB_BUSYBOX //bin
11 {"busybox", busybox_main},
12#endif
13#ifdef BB_BLOCK_DEVICE //sbin
14 {"block_device", block_device_main},
15#endif
16#ifdef BB_CAT //bin
Eric Andersene77ae3a1999-10-19 20:03:34 +000017 {"cat", cat_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000018#endif
Eric Andersen1b61f411999-10-13 18:56:42 +000019#ifdef BB_CHMOD_CHOWN_CHGRP //bin
20 {"chmod", chmod_chown_chgrp_main},
21 {"chown", chmod_chown_chgrp_main},
22 {"chgrp", chmod_chown_chgrp_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000023#endif
24#ifdef BB_CHROOT //sbin
25 {"chroot", chroot_main},
26#endif
27#ifdef BB_CLEAR //usr/bin
28 {"clear", clear_main},
29#endif
Eric Andersenabc0f4f1999-12-08 23:19:36 +000030#ifdef BB_CHVT //usr/bin
31 {"chvt", chvt_main},
32#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000033#ifdef BB_CP //bin
Eric Andersenf811e071999-10-09 00:25:00 +000034 {"cp", cp_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000035#endif
36#ifdef BB_DATE //bin
37 {"date", date_main},
38#endif
39#ifdef BB_DD //bin
40 {"dd", dd_main},
41#endif
42#ifdef BB_DF //bin
43 {"df", df_main},
44#endif
45#ifdef BB_DMESG //bin
46 {"dmesg", dmesg_main},
47#endif
John Beppu7a986061999-12-09 18:29:29 +000048#ifdef BB_DU //bin
49 {"du", du_main},
50#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000051#ifdef BB_DUTMP //usr/sbin
Eric Andersene77ae3a1999-10-19 20:03:34 +000052 {"dutmp", dutmp_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000053#endif
Erik Andersen1c5b2581999-12-16 20:59:36 +000054#ifdef BB_FBSET //usr/sbin
55 {"fbset", fbset_main},
56#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000057#ifdef BB_FDFLUSH //bin
Eric Andersenf6be9441999-10-13 21:12:06 +000058 {"fdflush", fdflush_main},
Eric Andersencc8ed391999-10-05 16:24:54 +000059#endif
60#ifdef BB_FIND //usr/bin
61 {"find", find_main},
62#endif
Eric Andersenabc0f4f1999-12-08 23:19:36 +000063#ifdef BB_FREE //usr/bin
64 {"free", free_main},
Eric Andersen0460ff21999-10-25 23:32:44 +000065#endif
66#ifdef BB_DEALLOCVT //usr/bin
67 {"deallocvt", deallocvt_main},
68#endif
Eric Andersene494fdd1999-10-19 20:23:03 +000069#ifdef BB_FSCK_MINIX //sbin
70 {"fsck.minix", fsck_minix_main},
71#endif
72#ifdef BB_MKFS_MINIX //sbin
73 {"mkfs.minix", mkfs_minix_main},
74#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000075#ifdef BB_GREP //bin
76 {"grep", grep_main},
77#endif
78#ifdef BB_HALT //sbin
79 {"halt", halt_main},
80#endif
John Beppu3157b1f1999-12-10 07:42:50 +000081#ifdef BB_HEAD //bin
82 {"head", head_main},
83#endif
Eric Andersen485b9551999-12-07 23:14:59 +000084#ifdef BB_HOSTNAME //bin
85 {"hostname", hostname_main},
86#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000087#ifdef BB_INIT //sbin
88 {"init", init_main},
89#endif
Erik Andersen6da0ae81999-12-17 01:08:27 +000090#ifdef BB_INSMOD //sbin
91 {"insmod", insmod_main},
92#endif
Eric Andersen6a76e651999-11-19 05:31:45 +000093#ifdef BB_FEATURE_LINUXRC //
94 {"linuxrc", init_main},
95#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000096#ifdef BB_KILL //bin
97 {"kill", kill_main},
98#endif
99#ifdef BB_LENGTH //usr/bin
100 {"length", length_main},
101#endif
102#ifdef BB_LN //bin
Eric Andersenf6be9441999-10-13 21:12:06 +0000103 {"ln", ln_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000104#endif
Erik Andersen7dc16072000-01-04 01:10:25 +0000105#ifdef BB_LOADACM //usr/bin
106 {"loadacm", loadacm_main},
107#endif
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000108#ifdef BB_LOADFONT //usr/bin
109 {"loadfont", loadfont_main},
110#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000111#ifdef BB_LOADKMAP //sbin
112 {"loadkmap", loadkmap_main},
113#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000114#ifdef BB_LS //bin
115 {"ls", ls_main},
116#endif
Erik Andersen6f23cec1999-12-15 22:14:12 +0000117#ifdef BB_LSMOD //sbin
118 {"lsmod", lsmod_main},
119#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000120#ifdef BB_MAKEDEVS //sbin
121 {"makedevs", makedevs_main},
122#endif
123#ifdef BB_MATH //usr/bin
124 {"math", math_main},
125#endif
126#ifdef BB_MKDIR //bin
Eric Andersenf6be9441999-10-13 21:12:06 +0000127 {"mkdir", mkdir_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000128#endif
Eric Andersen19db07b1999-12-11 08:41:28 +0000129#ifdef BB_MKFIFO //usr/bin
130 {"mkfifo", mkfifo_main},
131#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000132#ifdef BB_MKNOD //bin
133 {"mknod", mknod_main},
134#endif
135#ifdef BB_MKSWAP //sbin
136 {"mkswap", mkswap_main},
137#endif
138#ifdef BB_MNC //usr/bin
139 {"mnc", mnc_main},
140#endif
141#ifdef BB_MORE //bin
Eric Andersen4bea32a1999-10-06 00:30:51 +0000142 {"more", more_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000143#endif
144#ifdef BB_MOUNT //bin
145 {"mount", mount_main},
146#endif
147#ifdef BB_MT //bin
148 {"mt", mt_main},
149#endif
150#ifdef BB_MV //bin
Eric Andersen596e5461999-10-07 08:30:23 +0000151 {"mv", mv_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000152#endif
Eric Andersen485b9551999-12-07 23:14:59 +0000153#ifdef BB_PING //bin
154 {"ping", ping_main},
155#endif
Eric Andersen2cb55071999-12-10 08:25:07 +0000156#ifdef BB_POWEROFF //sbin
157 {"poweroff", poweroff_main},
158#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000159#ifdef BB_PRINTF //usr/bin
160 {"printf", printf_main},
161#endif
Eric Andersenef8b6c71999-10-20 08:05:35 +0000162#ifdef BB_PS //bin
163 {"ps", ps_main},
164#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000165#ifdef BB_PWD //bin
166 {"pwd", pwd_main},
167#endif
168#ifdef BB_REBOOT //sbin
169 {"reboot", reboot_main},
170#endif
171#ifdef BB_RM //bin
172 {"rm", rm_main},
173#endif
174#ifdef BB_RMDIR //bin
Eric Andersenf6be9441999-10-13 21:12:06 +0000175 {"rmdir", rmdir_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000176#endif
Erik Andersen3d7e3411999-12-16 23:04:20 +0000177#ifdef BB_RMMOD //sbin
178 {"rmmod", rmmod_main},
179#endif
Eric Andersene77ae3a1999-10-19 20:03:34 +0000180#ifdef BB_SFDISK //sbin
181 {"fdisk", sfdisk_main},
182 {"sfdisk", sfdisk_main},
183#endif
Eric Andersenc1525e81999-10-29 00:07:31 +0000184#ifdef BB_SED //bin
185 {"sed", sed_main},
186#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000187#ifdef BB_SLEEP //bin
188 {"sleep", sleep_main},
189#endif
John Beppu019513a1999-12-22 17:57:31 +0000190#ifdef BB_SORT //bin
191 {"sort", sort_main},
192#endif
Eric Andersen3843e961999-11-25 07:30:46 +0000193#ifdef BB_SYNC //bin
194 {"sync", sync_main},
195#endif
196#ifdef BB_SYSLOGD //sbin
197 {"syslogd", syslogd_main},
198#endif
199#ifdef BB_LOGGER //usr/bin
200 {"logger", logger_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000201#endif
Eric Andersen87590061999-10-18 21:22:59 +0000202#ifdef BB_SWAPONOFF //sbin
203 {"swapon", swap_on_off_main},
204 {"swapoff", swap_on_off_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000205#endif
Eric Andersenabc0f4f1999-12-08 23:19:36 +0000206#ifdef BB_TAIL //usr/bin
207 {"tail", tail_main},
208#endif
Eric Andersen3843e961999-11-25 07:30:46 +0000209#ifdef BB_TAR //bin
210 {"tar", tar_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000211#endif
John Beppu059f1521999-12-10 05:27:16 +0000212#ifdef BB_TEE //bin
213 {"tee", tee_main},
214#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000215#ifdef BB_TOUCH //usr/bin
Eric Andersen596e5461999-10-07 08:30:23 +0000216 {"touch", touch_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000217#endif
Eric Andersena3f09071999-10-19 16:39:10 +0000218#ifdef BB_TRUE_FALSE //bin
Eric Andersencc8ed391999-10-05 16:24:54 +0000219 {"true", true_main},
Eric Andersena3f09071999-10-19 16:39:10 +0000220 {"false", false_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000221#endif
Eric Andersen0460ff21999-10-25 23:32:44 +0000222#ifdef BB_UNAME //bin
223 {"uname", uname_main},
224#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000225#ifdef BB_UMOUNT //bin
Eric Andersen87590061999-10-18 21:22:59 +0000226 {"umount", umount_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000227#endif
John Beppuabb47722000-01-06 00:48:21 +0000228#ifdef BB_UNIQ //bin
229 {"uniq", uniq_main},
230#endif
Eric Andersencc8ed391999-10-05 16:24:54 +0000231#ifdef BB_UPDATE //sbin
232 {"update", update_main},
233#endif
Eric Andersend80e8511999-11-16 00:46:00 +0000234#ifdef BB_GUNZIP //bin
235 {"zcat", gunzip_main},
236 {"gunzip", gunzip_main},
Eric Andersencc8ed391999-10-05 16:24:54 +0000237#endif
238#ifdef BB_GZIP //bin
239 {"gzip", gzip_main},
240#endif
241 {0}
242};
243
244int main(int argc, char **argv)
245{
246 char *s = argv[0];
247 char *name = argv[0];
248 const struct Applet *a = applets;
249
250 while (*s != '\0') {
251 if (*s++ == '/')
252 name = s;
253 }
254
255 while (a->name != 0) {
256 if (strcmp(name, a->name) == 0) {
257 int status;
258
259 status = ((*(a->main)) (argc, argv));
260 if (status < 0) {
261 fprintf(stderr, "%s: %s\n", a->name, strerror(errno));
262 }
263 fprintf(stderr, "\n");
264 exit(status);
265 }
266 a++;
267 }
Eric Andersen2ce1edc1999-10-12 15:42:48 +0000268 exit (busybox_main(argc, argv));
Eric Andersencc8ed391999-10-05 16:24:54 +0000269}
270
271
272int busybox_main(int argc, char **argv)
273{
Eric Andersen17d49ef1999-10-06 20:25:32 +0000274 int col=0;
Eric Andersencc8ed391999-10-05 16:24:54 +0000275 argc--;
276 argv++;
277
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000278 if (been_there_done_that == 1 || argc < 1) {
Eric Andersencc8ed391999-10-05 16:24:54 +0000279 const struct Applet *a = applets;
Eric Andersend73dc5b1999-11-10 23:13:02 +0000280 fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
Eric Andersencc8ed391999-10-05 16:24:54 +0000281 BB_VER, BB_BT);
Eric Andersend73dc5b1999-11-10 23:13:02 +0000282 fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
283 fprintf(stderr, " or: [function] [arguments]...\n\n");
Eric Andersencc8ed391999-10-05 16:24:54 +0000284 fprintf(stderr,
Eric Andersend73dc5b1999-11-10 23:13:02 +0000285 "\tMost people will create a symlink to busybox for each\n"
Eric Andersencc8ed391999-10-05 16:24:54 +0000286 "\tfunction name, and busybox will act like whatever you invoke it as.\n");
287 fprintf(stderr, "\nCurrently defined functions:\n");
288
Eric Andersencc8ed391999-10-05 16:24:54 +0000289 while (a->name != 0) {
Eric Andersen2ce1edc1999-10-12 15:42:48 +0000290 col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), (a++)->name);
Eric Andersen17d49ef1999-10-06 20:25:32 +0000291 if (col>60) {
292 fprintf(stderr, ",\n");
293 col=0;
294 }
Eric Andersencc8ed391999-10-05 16:24:54 +0000295 }
296 fprintf(stderr, "\n\n");
297 exit(-1);
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000298 } else {
299 /* If we've already been here once, exit now */
300 been_there_done_that = 1;
Eric Andersencc8ed391999-10-05 16:24:54 +0000301 return (main(argc, argv));
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000302 }
Eric Andersencc8ed391999-10-05 16:24:54 +0000303}