/* vi: set sw=4 ts=4: */
-#include "busybox.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
+#include "busybox.h"
+#ifdef BB_LOCALE_SUPPORT
+#include <locale.h>
+#endif
-#undef APPLET
-#undef APPLET_NOUSAGE
-#undef PROTOTYPES
-#include "applets.h"
-
-#define bb_need_full_version
-#define BB_DECLARE_EXTERN
-#include "messages.c"
-
-static int been_there_done_that = 0;
+int been_there_done_that = 0; /* Also used in applets.c */
const char *applet_name;
#ifdef BB_FEATURE_INSTALLER
{
__link_f Link = link;
- char command[256];
+ char *fpc;
int i;
int rc;
Link = symlink;
for (i = 0; applets[i].name != NULL; i++) {
- sprintf ( command, "%s/%s",
- install_dir[applets[i].location], applets[i].name);
- rc = Link(busybox, command);
-
- if (rc) {
- perror_msg("%s", command);
+ fpc = concat_path_file(
+ install_dir[applets[i].location], applets[i].name);
+ rc = Link(busybox, fpc);
+ if (rc!=0 && errno!=EEXIST) {
+ perror_msg("%s", fpc);
}
+ free(fpc);
}
}
int main(int argc, char **argv)
{
- struct BB_applet search_applet, *applet;
- const char *s;
+ const char *s;
for (s = applet_name = argv[0]; *s != '\0';) {
if (*s++ == '/')
/* Add in a special case hack -- whenever **argv == '-'
* (i.e. '-su' or '-sh') always invoke the shell */
if (**argv == '-' && *(*argv+1)!= '-') {
- exit(((*(shell_main)) (argc, argv)));
+ applet_name = "sh";
}
#endif
- /* Do a binary search to find the applet entry given the name. */
- search_applet.name = applet_name;
- applet = bsearch(&search_applet, applets, NUM_APPLETS,
- sizeof(struct BB_applet), applet_name_compare);
- if (applet != NULL) {
- if (applet->usage && argv[1] && strcmp(argv[1], "--help") == 0)
- usage(applet->usage);
- exit((*(applet->main)) (argc, argv));
- }
+#ifdef BB_LOCALE_SUPPORT
+ if(getpid()!=1) /* Do not set locale for `init' */
+ setlocale(LC_ALL, "");
+#endif
+ run_applet_by_name(applet_name, argc, argv);
error_msg_and_die("applet not found");
}
}
}
fprintf(stderr, "\n\n");
- exit(-1);
+ exit(0);
}
/* Flag that we've been here already */