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)
90 struct BB_applet search_applet, *applet;
93 for (s = applet_name = argv[0]; *s != '\0';) {
99 /* Add in a special case hack -- whenever **argv == '-'
100 * (i.e. '-su' or '-sh') always invoke the shell */
101 if (**argv == '-' && *(*argv+1)!= '-') {
102 exit(((*(shell_main)) (argc, argv)));
106 /* Do a binary search to find the applet entry given the name. */
107 search_applet.name = applet_name;
108 applet = bsearch(&search_applet, applets, NUM_APPLETS,
109 sizeof(struct BB_applet), applet_name_compare);
110 if (applet != NULL) {
111 if (applet->usage && argv[1] && strcmp(argv[1], "--help") == 0)
112 usage(applet->usage);
113 exit((*(applet->main)) (argc, argv));
116 error_msg_and_die("applet not found\n");
120 int busybox_main(int argc, char **argv)
124 #ifdef BB_FEATURE_INSTALLER
126 * This style of argument parsing doesn't scale well
127 * in the event that busybox starts wanting more --options.
128 * If someone has a cleaner approach, by all means implement it.
130 if (argc > 1 && (strcmp(argv[1], "--install") == 0)) {
131 int use_symbolic_links = 0;
135 /* to use symlinks, or not to use symlinks... */
137 if ((strcmp(argv[2], "-s") == 0)) {
138 use_symbolic_links = 1;
143 busybox = busybox_fullpath();
145 install_links(busybox, use_symbolic_links);
152 #endif /* BB_FEATURE_INSTALLER */
156 /* If we've already been here once, exit now */
157 if (been_there_done_that == 1 || argc < 1) {
158 const struct BB_applet *a = applets;
160 fprintf(stderr, "%s\n\n"
161 "Usage: busybox [function] [arguments]...\n"
162 " or: [function] [arguments]...\n\n"
163 "\tBusyBox is a multi-call binary that combines many common Unix\n"
164 "\tutilities into a single executable. Most people will create a\n"
165 "\tlink to busybox for each function they wish to use, and BusyBox\n"
166 "\twill act like whatever it was invoked as.\n"
167 "\nCurrently defined functions:\n", full_version);
169 while (a->name != 0) {
171 fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "),
173 if (col > 60 && a->name != 0) {
174 fprintf(stderr, ",\n");
178 fprintf(stderr, "\n\n");
182 /* Flag that we've been here already */
183 been_there_done_that = 1;
185 /* Move the command line down a notch */
186 len = argv[argc] + strlen(argv[argc]) - argv[1];
187 memmove(argv[0], argv[1], len);
188 memset(argv[0] + len, 0, argv[1] - argv[0]);
190 /* Fix up the argv pointers */
191 len = argv[1] - argv[0];
192 memmove(argv, argv + 1, sizeof(char *) * (argc + 1));
193 for (i = 0; i < argc; i++)
196 return (main(argc, argv));
201 c-file-style: "linux"