traceroute: fix help text to not show -6 when traceroute6 is off
[oweals/busybox.git] / libbb / appletlib.c
index 7b3f27c3658accae2004a2ab6c8576c37953c58a..b31532a931be0120b280f2a1192330161387cfd1 100644 (file)
  * 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() */
@@ -73,8 +75,7 @@ static const char *unpack_usage_messages(void)
 
        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 */
@@ -117,7 +118,8 @@ void FAST_FUNC bb_show_usage(void)
                        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();
@@ -130,7 +132,7 @@ void FAST_FUNC bb_show_usage(void)
                        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 {
@@ -140,7 +142,8 @@ void FAST_FUNC bb_show_usage(void)
                        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();
@@ -569,12 +572,12 @@ static void check_suid(int applet_no)
 #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);
        }
@@ -586,7 +589,8 @@ static void check_suid(int applet_no)
 
 #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,
@@ -612,7 +616,7 @@ static void install_links(const char *busybox, int use_symbolic_links)
 
        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);
@@ -624,7 +628,7 @@ static void install_links(const char *busybox, int use_symbolic_links)
        }
 }
 #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..." */
@@ -643,9 +647,10 @@ static int busybox_main(char **argv)
                }
 
                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"
@@ -655,7 +660,7 @@ static int busybox_main(char **argv)
                       "\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;
@@ -683,12 +688,16 @@ static int busybox_main(char **argv)
        }
 
        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;
        }
 
@@ -756,6 +765,24 @@ int lbb_main(char **argv)
 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" */