403b14008d4e136e0092e59705b6f51e16764bcf
[oweals/busybox.git] / busybox.c
1 #include "internal.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <errno.h>
5
6 static int been_there_done_that = 0;
7
8 static 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
17     {"cat", cat_main},
18 #endif
19 #ifdef BB_CHMOD_CHOWN_CHGRP     //bin
20     {"chmod", chmod_chown_chgrp_main},
21     {"chown", chmod_chown_chgrp_main},
22     {"chgrp", chmod_chown_chgrp_main},
23 #endif
24 #ifdef BB_CHROOT                //sbin
25     {"chroot", chroot_main},
26 #endif
27 #ifdef BB_CLEAR                 //usr/bin
28     {"clear", clear_main},
29 #endif
30 #ifdef BB_CHVT                  //usr/bin
31     {"chvt", chvt_main},
32 #endif
33 #ifdef BB_CP                    //bin
34     {"cp", cp_main},
35 #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
48 #ifdef BB_DU                    //bin
49     {"du", du_main},
50 #endif
51 #ifdef BB_DUTMP                 //usr/sbin
52     {"dutmp", dutmp_main},
53 #endif
54 #ifdef BB_FBSET                 //usr/sbin
55     {"fbset", fbset_main},
56 #endif
57 #ifdef BB_FDFLUSH               //bin
58     {"fdflush", fdflush_main},
59 #endif
60 #ifdef BB_FIND                  //usr/bin
61     {"find", find_main},
62 #endif
63 #ifdef BB_FREE                  //usr/bin
64     {"free", free_main},
65 #endif
66 #ifdef BB_DEALLOCVT                     //usr/bin
67     {"deallocvt", deallocvt_main},
68 #endif
69 #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
75 #ifdef BB_GREP                  //bin
76     {"grep", grep_main},
77 #endif
78 #ifdef BB_HALT                  //sbin
79     {"halt", halt_main},
80 #endif
81 #ifdef BB_HEAD                  //bin
82     {"head", head_main},
83 #endif
84 #ifdef BB_HOSTNAME              //bin
85     {"hostname", hostname_main},
86 #endif
87 #ifdef BB_INIT                  //sbin
88     {"init", init_main},
89 #endif
90 #ifdef BB_INSMOD                //sbin
91     {"insmod", insmod_main},
92 #endif
93 #ifdef BB_FEATURE_LINUXRC       //
94     {"linuxrc", init_main},
95 #endif
96 #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
103     {"ln", ln_main},
104 #endif
105 #ifdef BB_LOADFONT              //usr/bin
106     {"loadfont", loadfont_main},
107 #endif
108 #ifdef BB_LOADKMAP              //sbin
109     {"loadkmap", loadkmap_main},
110 #endif
111 #ifdef BB_LS                    //bin
112     {"ls", ls_main},
113 #endif
114 #ifdef BB_LSMOD                 //sbin
115     {"lsmod", lsmod_main},
116 #endif
117 #ifdef BB_MAKEDEVS              //sbin
118     {"makedevs", makedevs_main},
119 #endif
120 #ifdef BB_MATH                  //usr/bin
121     {"math", math_main},
122 #endif
123 #ifdef BB_MKDIR                 //bin
124     {"mkdir", mkdir_main},
125 #endif
126 #ifdef BB_MKFIFO                //usr/bin
127     {"mkfifo", mkfifo_main},
128 #endif
129 #ifdef BB_MKNOD                 //bin
130     {"mknod", mknod_main},
131 #endif
132 #ifdef BB_MKSWAP                //sbin
133     {"mkswap", mkswap_main},
134 #endif
135 #ifdef BB_MNC                   //usr/bin
136     {"mnc", mnc_main},
137 #endif
138 #ifdef BB_MORE                  //bin
139     {"more", more_main},
140 #endif
141 #ifdef BB_MOUNT                 //bin
142     {"mount", mount_main},
143 #endif
144 #ifdef BB_MT                    //bin
145     {"mt", mt_main},
146 #endif
147 #ifdef BB_MV                    //bin
148     {"mv", mv_main},
149 #endif
150 #ifdef BB_PING                  //bin
151     {"ping", ping_main},
152 #endif
153 #ifdef BB_POWEROFF              //sbin
154     {"poweroff", poweroff_main},
155 #endif
156 #ifdef BB_PRINTF                //usr/bin
157     {"printf", printf_main},
158 #endif
159 #ifdef BB_PS                    //bin
160     {"ps", ps_main},
161 #endif
162 #ifdef BB_PWD                   //bin
163     {"pwd", pwd_main},
164 #endif
165 #ifdef BB_REBOOT                //sbin
166     {"reboot", reboot_main},
167 #endif
168 #ifdef BB_RM                    //bin
169     {"rm", rm_main},
170 #endif
171 #ifdef BB_RMDIR                 //bin
172     {"rmdir", rmdir_main},
173 #endif
174 #ifdef BB_RMMOD                 //sbin
175     {"rmmod", rmmod_main},
176 #endif
177 #ifdef BB_SFDISK                //sbin
178     {"fdisk", sfdisk_main},
179     {"sfdisk", sfdisk_main},
180 #endif
181 #ifdef BB_SED                   //bin
182     {"sed", sed_main},
183 #endif
184 #ifdef BB_SLEEP                 //bin
185     {"sleep", sleep_main},
186 #endif
187 #ifdef BB_SORT                  //bin
188     {"sort", sort_main},
189 #endif
190 #ifdef BB_SYNC                  //bin
191     {"sync", sync_main},
192 #endif
193 #ifdef BB_SYSLOGD               //sbin
194     {"syslogd", syslogd_main},
195 #endif
196 #ifdef BB_LOGGER                //usr/bin
197     {"logger", logger_main},
198 #endif
199 #ifdef BB_SWAPONOFF             //sbin
200     {"swapon", swap_on_off_main},
201     {"swapoff", swap_on_off_main},
202 #endif
203 #ifdef BB_TAIL                  //usr/bin
204     {"tail", tail_main},
205 #endif
206 #ifdef BB_TAR                   //bin
207     {"tar", tar_main},
208 #endif
209 #ifdef BB_TEE                   //bin
210     {"tee", tee_main},
211 #endif
212 #ifdef BB_TOUCH                 //usr/bin
213     {"touch", touch_main},
214 #endif
215 #ifdef BB_TRUE_FALSE            //bin
216     {"true", true_main},
217     {"false", false_main},
218 #endif
219 #ifdef BB_UNAME                 //bin
220     {"uname",  uname_main},
221 #endif
222 #ifdef BB_UMOUNT                //bin
223     {"umount",  umount_main},
224 #endif
225 #ifdef BB_UPDATE                //sbin
226     {"update", update_main},
227 #endif
228 #ifdef BB_GUNZIP                //bin
229     {"zcat", gunzip_main},
230     {"gunzip", gunzip_main},
231 #endif
232 #ifdef BB_GZIP                  //bin
233     {"gzip", gzip_main},
234 #endif
235 #ifdef BB_LOADACM               //usr/bin
236     {"loadacm", loadacm_main},
237 #endif    
238     {0}
239 };
240
241 int main(int argc, char **argv)
242 {
243     char *s = argv[0];
244     char *name = argv[0];
245     const struct Applet *a = applets;
246
247     while (*s != '\0') {
248         if (*s++ == '/')
249             name = s;
250     }
251
252     while (a->name != 0) {
253         if (strcmp(name, a->name) == 0) {
254             int status;
255
256             status = ((*(a->main)) (argc, argv));
257             if (status < 0) {
258                 fprintf(stderr, "%s: %s\n", a->name, strerror(errno));
259             }
260             fprintf(stderr, "\n");
261             exit(status);
262         }
263         a++;
264     }
265     exit (busybox_main(argc, argv));
266 }
267
268
269 int busybox_main(int argc, char **argv)
270 {
271     int col=0;
272     argc--;
273     argv++;
274
275     if (been_there_done_that == 1 || argc < 1) {
276         const struct Applet *a = applets;
277         fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
278                 BB_VER, BB_BT);
279         fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
280         fprintf(stderr, "   or: [function] [arguments]...\n\n");
281         fprintf(stderr,
282                 "\tMost people will create a symlink to busybox for each\n"
283                 "\tfunction name, and busybox will act like whatever you invoke it as.\n");
284         fprintf(stderr, "\nCurrently defined functions:\n");
285
286         while (a->name != 0) {
287             col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), (a++)->name);
288             if (col>60) {
289                 fprintf(stderr, ",\n");
290                 col=0;
291             }
292         }
293         fprintf(stderr, "\n\n");
294         exit(-1);
295     } else {
296         /* If we've already been here once, exit now */
297         been_there_done_that = 1;
298         return (main(argc, argv));
299     }
300 }