Added support for ignoring '-g' per GNU ls, thanks to David Vrabel
[oweals/busybox.git] / busybox.c
index e454bb6ec495275da6e0609952b7370c1027840e..486ef4d77b0fad777455cd7d1e973e31ba9e8ed7 100644 (file)
--- a/busybox.c
+++ b/busybox.c
@@ -361,49 +361,72 @@ const struct BB_applet applets[] = {
 #ifdef BB_FEATURE_INSTALLER
 /* 
  * directory table
- *      this should be consistent w/ the enum, internal.h::Location,
- *      or else...
+ *             this should be consistent w/ the enum, internal.h::Location,
+ *             or else...
  */
 static char* install_dir[] = {
-    "/",
-    "/bin",
-    "/sbin",
-    "/usr/bin",
-    "/usr/sbin",
-       NULL
+       "/",
+       "/bin",
+       "/sbin",
+       "/usr/bin",
+       "/usr/sbin",
 };
 
 /* abstract link() */
 typedef int (*__link_f)(const char *, const char *);
 
+/* 
+ * Where in the filesystem is this busybox?
+ * [return]
+ *             malloc'd string w/ full pathname of busybox's location
+ *             NULL on failure
+ */
+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 {
+               fprintf(stderr, "busybox : %s : %s\n", proc, strerror(errno));
+               return NULL;
+       }
+       return strdup(path);
+}
+
 /* create (sym)links for each applet */
 static int install_links(const char *busybox, int use_symbolic_links)
 {
-    __link_f Link = link;
+       __link_f Link = link;
 
-    char       command[256];
-       int             i;
-       int             rc = 0;
+       char command[256];
+       int i;
+       int rc = 0;
 
        if (use_symbolic_links) Link = symlink;
 
-    for (i = 0; applets[i].name != NULL; i++) {
-        sprintf (
+       for (i = 0; applets[i].name != NULL; i++) {
+               sprintf (
                        command, 
                        "%s/%s", 
                        install_dir[applets[i].location], 
                        applets[i].name
                );
-#if 0
-        rc |= Link(busybox, command);
+#if 1
+               rc |= Link(busybox, command);
 #else
-        puts(command);
+               puts(command);
 #endif
                if (rc) {
                        fprintf(stderr,"busybox : %s : %s\n", command, strerror(errno));
-                       break;
                }
-    }
+       }
        return rc;
 }
 
@@ -427,6 +450,8 @@ int main(int argc, char **argv)
         */
        if (argc > 1 && (strcmp(argv[1], "--install") == 0)) {
                int use_symbolic_links = 0;
+               int rc = 0;
+               char *busybox;
 
                /* to use symlinks, or not to use symlinks... */
                if (argc > 2) {
@@ -434,13 +459,16 @@ int main(int argc, char **argv)
                                use_symbolic_links = 1; 
                        }
                }
-               /* 
-                * FIXME : 
-                * I need a clever unix trick that'll tell
-                * me where to find the currently running
-                * busybox binary
-                */
-               return install_links("/bin/busybox", use_symbolic_links);
+
+               /* link */
+               busybox = busybox_fullpath();
+               if (busybox) {
+                       install_links(busybox, use_symbolic_links);
+                       free(busybox);
+               } else {
+                       rc = 1;
+               }
+               return rc;
        }
 #endif /* BB_FEATURE_INSTALLER */
 
@@ -451,6 +479,13 @@ int main(int argc, char **argv)
 
        *argv = name;
 
+#ifdef BB_SH
+       /* Add in a special case hack -- whenever **argv == '-'
+        * (i.e. '-su' or '-sh') always invoke the shell */
+       if (**argv == '-')
+               exit(((*(shell_main)) (argc, argv)));
+#endif
+
        while (a->name != 0) {
                if (strcmp(name, a->name) == 0) {
                        exit(((*(a->main)) (argc, argv)));