Another update from Larry:
[oweals/busybox.git] / busybox.c
index 0439fb566cb5892d8abed2a1ff784d6750ddecac..badd53d79de9a7c28dc34fbf1c46903d1f96e8b1 100644 (file)
--- a/busybox.c
+++ b/busybox.c
@@ -1,21 +1,15 @@
 /* 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
@@ -43,21 +37,10 @@ typedef int (*__link_f)(const char *, const char *);
  */
 static char *busybox_fullpath()
 {
-       pid_t pid;
-       char path[256];
        char proc[256];
-       int len;
-
-       pid = getpid();
-       sprintf(proc, "/proc/%d/exe", pid);
-       len = readlink(proc, path, 256);
-       if (len != -1) {
-               path[len] = 0;
-       } else {
-               perror_msg("%s", proc);
-               return NULL;
-       }
-       return strdup(path);
+
+       sprintf(proc, "/proc/%d/exe", getpid());
+       return xreadlink(proc);
 }
 
 /* create (sym)links for each applet */
@@ -65,21 +48,21 @@ static void install_links(const char *busybox, int use_symbolic_links)
 {
        __link_f Link = link;
 
-       char command[256];
+       char *fpc;
        int i;
        int rc;
 
-       if (use_symbolic_links) Link = symlink;
+       if (use_symbolic_links) 
+               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);
        }
 }
 
@@ -87,9 +70,34 @@ static void install_links(const char *busybox, int use_symbolic_links)
 
 int main(int argc, char **argv)
 {
-       struct BB_applet search_applet, *applet;
-       const char                              *s;
-       applet_name = "busybox";
+       const char *s;
+
+       for (s = applet_name = argv[0]; *s != '\0';) {
+               if (*s++ == '/')
+                       applet_name = s;
+       }
+
+#ifdef BB_SH
+       /* Add in a special case hack -- whenever **argv == '-'
+        * (i.e. '-su' or '-sh') always invoke the shell */
+       if (**argv == '-' && *(*argv+1)!= '-') {
+               applet_name = "sh";
+       }
+#endif
+
+#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");
+}
+
+
+int busybox_main(int argc, char **argv)
+{
+       int col = 0, len, i;
 
 #ifdef BB_FEATURE_INSTALLER    
        /* 
@@ -121,37 +129,6 @@ int main(int argc, char **argv)
        }
 #endif /* BB_FEATURE_INSTALLER */
 
-       for (s = applet_name = argv[0]; *s != '\0';) {
-               if (*s++ == '/')
-                       applet_name = s;
-       }
-
-#ifdef BB_SH
-       /* 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)));
-       }
-#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));
-       }
-
-       return(busybox_main(argc, argv));
-}
-
-
-int busybox_main(int argc, char **argv)
-{
-       int col = 0, len, i;
-
        argc--;
 
        /* If we've already been here once, exit now */
@@ -177,7 +154,7 @@ int busybox_main(int argc, char **argv)
                        }
                }
                fprintf(stderr, "\n\n");
-               exit(-1);
+               exit(0);
        }
 
        /* Flag that we've been here already */
@@ -190,7 +167,7 @@ int busybox_main(int argc, char **argv)
 
        /* Fix up the argv pointers */
        len = argv[1] - argv[0];
-       memmove(argv, argv+1, sizeof(char *) * (argc + 1));
+       memmove(argv, argv + 1, sizeof(char *) * (argc + 1));
        for (i = 0; i < argc; i++)
                argv[i] -= len;