1 /* vi: set sw=4 ts=4: */
14 #define bb_need_full_version
15 #define BB_DECLARE_EXTERN
18 static int been_there_done_that = 0;
19 const char *applet_name;
21 #ifdef BB_FEATURE_INSTALLER
24 * this should be consistent w/ the enum, busybox.h::Location,
27 static char* install_dir[] = {
36 typedef int (*__link_f)(const char *, const char *);
39 * Where in the filesystem is this busybox?
41 * malloc'd string w/ full pathname of busybox's location
44 static char *busybox_fullpath()
52 sprintf(proc, "/proc/%d/exe", pid);
53 len = readlink(proc, path, 256);
57 perror_msg("%s", proc);
63 /* create (sym)links for each applet */
64 static void install_links(const char *busybox, int use_symbolic_links)
72 if (use_symbolic_links)
75 for (i = 0; applets[i].name != NULL; i++) {
76 sprintf ( command, "%s/%s",
77 install_dir[applets[i].location], applets[i].name);
78 rc = Link(busybox, command);
81 perror_msg("%s", command);
86 #endif /* BB_FEATURE_INSTALLER */
88 int main(int argc, char **argv)
92 for (s = applet_name = argv[0]; *s != '\0';) {
98 /* Add in a special case hack -- whenever **argv == '-'
99 * (i.e. '-su' or '-sh') always invoke the shell */
100 if (**argv == '-' && *(*argv+1)!= '-') {
101 exit(((*(shell_main)) (argc, argv)));
105 run_applet_by_name(applet_name, argc, argv);
106 error_msg_and_die("applet not found");
110 int busybox_main(int argc, char **argv)
114 #ifdef BB_FEATURE_INSTALLER
116 * This style of argument parsing doesn't scale well
117 * in the event that busybox starts wanting more --options.
118 * If someone has a cleaner approach, by all means implement it.
120 if (argc > 1 && (strcmp(argv[1], "--install") == 0)) {
121 int use_symbolic_links = 0;
125 /* to use symlinks, or not to use symlinks... */
127 if ((strcmp(argv[2], "-s") == 0)) {
128 use_symbolic_links = 1;
133 busybox = busybox_fullpath();
135 install_links(busybox, use_symbolic_links);
142 #endif /* BB_FEATURE_INSTALLER */
146 /* If we've already been here once, exit now */
147 if (been_there_done_that == 1 || argc < 1) {
148 const struct BB_applet *a = applets;
150 fprintf(stderr, "%s\n\n"
151 "Usage: busybox [function] [arguments]...\n"
152 " or: [function] [arguments]...\n\n"
153 "\tBusyBox is a multi-call binary that combines many common Unix\n"
154 "\tutilities into a single executable. Most people will create a\n"
155 "\tlink to busybox for each function they wish to use, and BusyBox\n"
156 "\twill act like whatever it was invoked as.\n"
157 "\nCurrently defined functions:\n", full_version);
159 while (a->name != 0) {
161 fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "),
163 if (col > 60 && a->name != 0) {
164 fprintf(stderr, ",\n");
168 fprintf(stderr, "\n\n");
172 /* Flag that we've been here already */
173 been_there_done_that = 1;
175 /* Move the command line down a notch */
176 len = argv[argc] + strlen(argv[argc]) - argv[1];
177 memmove(argv[0], argv[1], len);
178 memset(argv[0] + len, 0, argv[1] - argv[0]);
180 /* Fix up the argv pointers */
181 len = argv[1] - argv[0];
182 memmove(argv, argv + 1, sizeof(char *) * (argc + 1));
183 for (i = 0; i < argc; i++)
186 return (main(argc, argv));
191 c-file-style: "linux"