* FEATURE_INSTALLER or FEATURE_SUID will still link printf routines in. :(
*/
-#include <assert.h>
#include "busybox.h"
+#include <assert.h>
+#include <malloc.h>
+#include <sys/user.h> /* PAGE_SIZE */
/* Declare <applet>_main() */
i = start_bunzip(&bd,
/* src_fd: */ -1,
-//FIXME: can avoid storing these 2 bytes!
- /* inbuf: */ (void *)packed_usage + 2,
+ /* inbuf: */ (void *)packed_usage,
/* len: */ sizeof(packed_usage));
/* read_bunzip can longjmp to start_bunzip, and ultimately
* end up here with i != 0 on read data errors! Not trivial */
full_write2_str(p);
full_write2_str("\n\n");
}
- dealloc_usage_messages((char*)usage_string);
+ if (ENABLE_FEATURE_CLEAN_UP)
+ dealloc_usage_messages((char*)usage_string);
#else
const char *p;
const char *usage_string = p = unpack_usage_messages();
ap--;
}
full_write2_str(bb_banner);
- full_write2_str(" multi-call binary\n");
+ full_write2_str(" multi-call binary.\n");
if (*p == '\b')
full_write2_str("\nNo help available.\n\n");
else {
full_write2_str(p);
full_write2_str("\n\n");
}
- dealloc_usage_messages((char*)usage_string);
+ if (ENABLE_FEATURE_CLEAN_UP)
+ dealloc_usage_messages((char*)usage_string);
#endif
}
xfunc_die();
#endif
check_need_suid:
#endif
- if (APPLET_SUID(applet_no) == _BB_SUID_ALWAYS) {
+ if (APPLET_SUID(applet_no) == _BB_SUID_REQUIRE) {
/* Real uid is not 0. If euid isn't 0 too, suid bit
* is most probably not set on our executable */
if (geteuid())
bb_error_msg_and_die("must be suid to work properly");
- } else if (APPLET_SUID(applet_no) == _BB_SUID_NEVER) {
+ } else if (APPLET_SUID(applet_no) == _BB_SUID_DROP) {
xsetgid(rgid); /* drop all privileges */
xsetuid(ruid);
}
#if ENABLE_FEATURE_INSTALLER
/* create (sym)links for each applet */
-static void install_links(const char *busybox, int use_symbolic_links)
+static void install_links(const char *busybox, int use_symbolic_links,
+ char *custom_install_dir)
{
/* directory table
* this should be consistent w/ the enum,
for (i = 0; i < ARRAY_SIZE(applet_main); i++) {
fpc = concat_path_file(
- install_dir[APPLET_INSTALL_LOC(i)],
+ custom_install_dir ? custom_install_dir : install_dir[APPLET_INSTALL_LOC(i)],
APPLET_NAME(i));
// debug: bb_error_msg("%slinking %s to busybox",
// use_symbolic_links ? "sym" : "", fpc);
}
}
#else
-#define install_links(x,y) ((void)0)
+#define install_links(x,y,z) ((void)0)
#endif /* FEATURE_INSTALLER */
/* If we were called as "busybox..." */
}
dup2(1, 2);
- full_write2_str(bb_banner); /* reuse const string... */
- full_write2_str(" multi-call binary\n"
- "Copyright (C) 1998-2008 Erik Andersen, Rob Landley, Denys Vlasenko\n"
+ full_write2_str(bb_banner); /* reuse const string */
+ full_write2_str(" multi-call binary.\n"); /* reuse */
+ full_write2_str(
+ "Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko\n"
"and others. Licensed under GPLv2.\n"
"See source distribution for full notice.\n"
"\n"
"\tBusyBox is a multi-call binary that combines many common Unix\n"
"\tutilities into a single executable. Most people will create a\n"
"\tlink to busybox for each function they wish to use and BusyBox\n"
- "\twill act like whatever it was invoked as!\n"
+ "\twill act like whatever it was invoked as.\n"
"\n"
"Currently defined functions:\n");
col = 0;
}
if (ENABLE_FEATURE_INSTALLER && strcmp(argv[1], "--install") == 0) {
+ int use_symbolic_links;
const char *busybox;
busybox = xmalloc_readlink(bb_busybox_exec_path);
if (!busybox)
busybox = bb_busybox_exec_path;
- /* -s makes symlinks */
- install_links(busybox, argv[2] && strcmp(argv[2], "-s") == 0);
+ /* busybox --install [-s] [DIR]: */
+ /* -s: make symlinks */
+ /* DIR: directory to install links to */
+ use_symbolic_links = (argv[2] && strcmp(argv[2], "-s") == 0 && argv++);
+ install_links(busybox, use_symbolic_links, argv[2]);
return 0;
}
int main(int argc UNUSED_PARAM, char **argv)
#endif
{
+ /* Tweak malloc for reduced memory consumption */
+#ifndef PAGE_SIZE
+# define PAGE_SIZE (4*1024) /* guess */
+#endif
+#ifdef M_TRIM_THRESHOLD
+ /* M_TRIM_THRESHOLD is the maximum amount of freed top-most memory
+ * to keep before releasing to the OS
+ * Default is way too big: 256k
+ */
+ mallopt(M_TRIM_THRESHOLD, 2 * PAGE_SIZE);
+#endif
+#ifdef M_MMAP_THRESHOLD
+ /* M_MMAP_THRESHOLD is the request size threshold for using mmap()
+ * Default is too big: 256k
+ */
+ mallopt(M_MMAP_THRESHOLD, 8 * PAGE_SIZE - 256);
+#endif
+
#if defined(SINGLE_APPLET_MAIN)
/* Only one applet is selected by the user! */
/* applet_names in this case is just "applet\0\0" */