+ busybox --install [-s]
authorJohn Beppu <beppu@lbox.org>
Wed, 28 Jun 2000 00:41:26 +0000 (00:41 -0000)
committerJohn Beppu <beppu@lbox.org>
Wed, 28 Jun 2000 00:41:26 +0000 (00:41 -0000)
  is functional (but disabled in busybox.def.h by default)
  Someone email the guy who originally wanted this.

applets/busybox.c
busybox.c
busybox.def.h

index e454bb6ec495275da6e0609952b7370c1027840e..2a686041a933c0d96f7d30ac0e2cd844667e11ee 100644 (file)
@@ -376,6 +376,31 @@ static char* install_dir[] = {
 /* 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)
 {
@@ -394,14 +419,13 @@ static int install_links(const char *busybox, int use_symbolic_links)
                        install_dir[applets[i].location], 
                        applets[i].name
                );
-#if 0
+#if 1
         rc |= Link(busybox, command);
 #else
         puts(command);
 #endif
                if (rc) {
                        fprintf(stderr,"busybox : %s : %s\n", command, strerror(errno));
-                       break;
                }
     }
        return rc;
@@ -427,6 +451,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 +460,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 */
 
index e454bb6ec495275da6e0609952b7370c1027840e..2a686041a933c0d96f7d30ac0e2cd844667e11ee 100644 (file)
--- a/busybox.c
+++ b/busybox.c
@@ -376,6 +376,31 @@ static char* install_dir[] = {
 /* 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)
 {
@@ -394,14 +419,13 @@ static int install_links(const char *busybox, int use_symbolic_links)
                        install_dir[applets[i].location], 
                        applets[i].name
                );
-#if 0
+#if 1
         rc |= Link(busybox, command);
 #else
         puts(command);
 #endif
                if (rc) {
                        fprintf(stderr,"busybox : %s : %s\n", command, strerror(errno));
-                       break;
                }
     }
        return rc;
@@ -427,6 +451,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 +460,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 */
 
index 4c74910d71dd0945cd7bfffd0a8fb72f318154ca..a07327e4b6ca365dd78ed88a055acabdbeb04053 100644 (file)
 //
 // Enable busybox --install [-s]
 // to create links (or symlinks) for all the commands that are 
-// compiled into the binary.
-#define BB_FEATURE_INSTALLER
+// compiled into the binary.  (needs /proc filesystem)
+// #define BB_FEATURE_INSTALLER
 //
 // End of Features List
 //