aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--applets/busybox.c47
-rw-r--r--busybox.c47
-rw-r--r--busybox.def.h4
3 files changed, 78 insertions, 20 deletions
diff --git a/applets/busybox.c b/applets/busybox.c
index e454bb6ec..2a686041a 100644
--- a/applets/busybox.c
+++ b/applets/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 */
diff --git a/busybox.c b/busybox.c
index e454bb6ec..2a686041a 100644
--- 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 */
diff --git a/busybox.def.h b/busybox.def.h
index 4c74910d7..a07327e4b 100644
--- a/busybox.def.h
+++ b/busybox.def.h
@@ -232,8 +232,8 @@
//
// 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
//