1 /* vi: set sw=4 ts=4: */
13 #define bb_need_full_version
14 #define BB_DECLARE_EXTERN
17 static int been_there_done_that = 0;
20 const char *applet_name;
22 #ifdef BB_FEATURE_INSTALLER
25 * this should be consistent w/ the enum, busybox.h::Location,
28 static char* install_dir[] = {
37 typedef int (*__link_f)(const char *, const char *);
40 * Where in the filesystem is this busybox?
42 * malloc'd string w/ full pathname of busybox's location
45 static char *busybox_fullpath()
53 sprintf(proc, "/proc/%d/exe", pid);
54 len = readlink(proc, path, 256);
58 perror_msg("%s", proc);
64 /* create (sym)links for each applet */
65 static void install_links(const char *busybox, int use_symbolic_links)
73 if (use_symbolic_links) Link = symlink;
75 for (i = 0; applets[i].name != NULL; i++) {
76 sprintf ( command, "%s/%s",
77 install_dir[applets[i].location],
79 rc = Link(busybox, command);
82 perror_msg("%s", command);
87 #endif /* BB_FEATURE_INSTALLER */
89 int main(int argc, char **argv)
91 struct BB_applet search_applet, *applet;
94 for (s = applet_name = argv[0]; *s != '\0';) {
100 /* Add in a special case hack -- whenever **argv == '-'
101 * (i.e. '-su' or '-sh') always invoke the shell */
102 if (**argv == '-' && *(*argv+1)!= '-') {
103 exit(((*(shell_main)) (argc, argv)));
107 /* Do a binary search to find the applet entry given the name. */
108 search_applet.name = applet_name;
109 applet = bsearch(&search_applet, applets, NUM_APPLETS,
110 sizeof(struct BB_applet), applet_name_compare);
111 if (applet != NULL) {
112 if (applet->usage && argv[1] && strcmp(argv[1], "--help") == 0)
113 usage(applet->usage);
114 exit((*(applet->main)) (argc, argv));
117 error_msg_and_die("applet not found\n");
121 int busybox_main(int argc, char **argv)
125 #ifdef BB_FEATURE_INSTALLER
127 * This style of argument parsing doesn't scale well
128 * in the event that busybox starts wanting more --options.
129 * If someone has a cleaner approach, by all means implement it.
131 if (argc > 1 && (strcmp(argv[1], "--install") == 0)) {
132 int use_symbolic_links = 0;
136 /* to use symlinks, or not to use symlinks... */
138 if ((strcmp(argv[2], "-s") == 0)) {
139 use_symbolic_links = 1;
144 busybox = busybox_fullpath();
146 install_links(busybox, use_symbolic_links);
153 #endif /* BB_FEATURE_INSTALLER */
157 /* If we've already been here once, exit now */
158 if (been_there_done_that == 1 || argc < 1) {
159 const struct BB_applet *a = applets;
161 fprintf(stderr, "%s\n\n"
162 "Usage: busybox [function] [arguments]...\n"
163 " or: [function] [arguments]...\n\n"
164 "\tBusyBox is a multi-call binary that combines many common Unix\n"
165 "\tutilities into a single executable. Most people will create a\n"
166 "\tlink to busybox for each function they wish to use, and BusyBox\n"
167 "\twill act like whatever it was invoked as.\n"
168 "\nCurrently defined functions:\n", full_version);
170 while (a->name != 0) {
172 fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "),
174 if (col > 60 && a->name != 0) {
175 fprintf(stderr, ",\n");
179 fprintf(stderr, "\n\n");
183 /* Flag that we've been here already */
184 been_there_done_that = 1;
186 /* Move the command line down a notch */
187 len = argv[argc] + strlen(argv[argc]) - argv[1];
188 memmove(argv[0], argv[1], len);
189 memset(argv[0] + len, 0, argv[1] - argv[0]);
191 /* Fix up the argv pointers */
192 len = argv[1] - argv[0];
193 memmove(argv, argv+1, sizeof(char *) * (argc + 1));
194 for (i = 0; i < argc; i++)
197 return (main(argc, argv));
202 c-file-style: "linux"