1 /* vi: set sw=4 ts=4: */
8 #ifdef BB_LOCALE_SUPPORT
12 int been_there_done_that = 0; /* Also used in applets.c */
13 const char *applet_name;
15 #ifdef BB_FEATURE_INSTALLER
18 * this should be consistent w/ the enum, busybox.h::Location,
21 static char* install_dir[] = {
30 typedef int (*__link_f)(const char *, const char *);
33 * Where in the filesystem is this busybox?
35 * malloc'd string w/ full pathname of busybox's location
38 static char *busybox_fullpath()
46 sprintf(proc, "/proc/%d/exe", pid);
47 len = readlink(proc, path, 256);
51 perror_msg("%s", proc);
57 /* create (sym)links for each applet */
58 static void install_links(const char *busybox, int use_symbolic_links)
66 if (use_symbolic_links)
69 for (i = 0; applets[i].name != NULL; i++) {
70 fpc = concat_path_file(
71 install_dir[applets[i].location], applets[i].name);
72 rc = Link(busybox, fpc);
73 if (rc!=0 && errno!=EEXIST) {
74 perror_msg("%s", fpc);
80 #endif /* BB_FEATURE_INSTALLER */
82 int main(int argc, char **argv)
86 for (s = applet_name = argv[0]; *s != '\0';) {
92 /* Add in a special case hack -- whenever **argv == '-'
93 * (i.e. '-su' or '-sh') always invoke the shell */
94 if (**argv == '-' && *(*argv+1)!= '-') {
99 #ifdef BB_LOCALE_SUPPORT
100 if(getpid()!=1) /* Do not set locale for `init' */
101 setlocale(LC_ALL, "");
104 run_applet_by_name(applet_name, argc, argv);
105 error_msg_and_die("applet not found");
109 int busybox_main(int argc, char **argv)
113 #ifdef BB_FEATURE_INSTALLER
115 * This style of argument parsing doesn't scale well
116 * in the event that busybox starts wanting more --options.
117 * If someone has a cleaner approach, by all means implement it.
119 if (argc > 1 && (strcmp(argv[1], "--install") == 0)) {
120 int use_symbolic_links = 0;
124 /* to use symlinks, or not to use symlinks... */
126 if ((strcmp(argv[2], "-s") == 0)) {
127 use_symbolic_links = 1;
132 busybox = busybox_fullpath();
134 install_links(busybox, use_symbolic_links);
141 #endif /* BB_FEATURE_INSTALLER */
145 /* If we've already been here once, exit now */
146 if (been_there_done_that == 1 || argc < 1) {
147 const struct BB_applet *a = applets;
149 fprintf(stderr, "%s\n\n"
150 "Usage: busybox [function] [arguments]...\n"
151 " or: [function] [arguments]...\n\n"
152 "\tBusyBox is a multi-call binary that combines many common Unix\n"
153 "\tutilities into a single executable. Most people will create a\n"
154 "\tlink to busybox for each function they wish to use, and BusyBox\n"
155 "\twill act like whatever it was invoked as.\n"
156 "\nCurrently defined functions:\n", full_version);
158 while (a->name != 0) {
160 fprintf(stderr, "%s%s", ((col == 0) ? "\t" : ", "),
162 if (col > 60 && a->name != 0) {
163 fprintf(stderr, ",\n");
167 fprintf(stderr, "\n\n");
171 /* Flag that we've been here already */
172 been_there_done_that = 1;
174 /* Move the command line down a notch */
175 len = argv[argc] + strlen(argv[argc]) - argv[1];
176 memmove(argv[0], argv[1], len);
177 memset(argv[0] + len, 0, argv[1] - argv[0]);
179 /* Fix up the argv pointers */
180 len = argv[1] - argv[0];
181 memmove(argv, argv + 1, sizeof(char *) * (argc + 1));
182 for (i = 0; i < argc; i++)
185 return (main(argc, argv));
190 c-file-style: "linux"