From 737d131e5e7a795ef771f987d7b02cbf4fa670d6 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 25 Aug 2007 18:25:24 +0000 Subject: [PATCH] support "#!/bin/busybox"-style wrappers. Needed for SELinux. Patch by Yuichi Nakamura --- Config.in | 29 ++++++++++++++++ Makefile.custom | 11 +++++++ applets/applets.c | 7 ++-- applets/install.sh | 82 +++++++++++++++++++++++++++------------------- libbb/getopt32.c | 2 +- 5 files changed, 94 insertions(+), 37 deletions(-) diff --git a/Config.in b/Config.in index 24e461eb7..450c4a6d4 100644 --- a/Config.in +++ b/Config.in @@ -465,6 +465,11 @@ config INSTALL_APPLET_HARDLINKS Install applets as hard-links to the busybox binary. This might count on a filesystem with few inodes. +config INSTALL_APPLET_SCRIPT_WRAPPERS + bool "as script wrappers" + help + Install applets as script wrappers that call the busybox binary. + config INSTALL_APPLET_DONT bool "not installed" depends on FEATURE_INSTALLER || FEATURE_SH_STANDALONE || FEATURE_PREFER_APPLETS @@ -474,6 +479,30 @@ config INSTALL_APPLET_DONT endchoice +choice + prompt "/bin/sh applet link" + default INSTALL_SH_APPLET_SYMLINK + depends on INSTALL_APPLET_SCRIPT_WRAPPERS + help + Choose how you install /bin/sh applet link. + +config INSTALL_SH_APPLET_SYMLINK + bool "as soft-link" + help + Install /bin/sh applet as soft-link to the busybox binary. + +config INSTALL_SH_APPLET_HARDLINK + bool "as hard-link" + help + Install /bin/sh applet as hard-link to the busybox binary. + +config INSTALL_SH_APPLET_SCRIPT_WRAPPER + bool "as script wrapper" + help + Install /bin/sh applet as script wrapper that call the busybox binary. + +endchoice + config PREFIX string "BusyBox installation prefix" default "./_install" diff --git a/Makefile.custom b/Makefile.custom index a011d53fd..5562ba396 100644 --- a/Makefile.custom +++ b/Makefile.custom @@ -12,6 +12,17 @@ endif ifeq ($(CONFIG_INSTALL_APPLET_HARDLINKS),y) INSTALL_OPTS:= --hardlinks endif +ifeq ($(CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS),y) +ifeq ($(CONFIG_INSTALL_SH_APPLET_SYMLINK),y) +INSTALL_OPTS:= --sw-sh-sym +endif +ifeq ($(CONFIG_INSTALL_SH_APPLET_HARDLINK),y) +INSTALL_OPTS:= --sw-sh-hard +endif +ifeq ($(CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER),y) +INSTALL_OPTS:= --scriptwrapper +endif +endif install: $(srctree)/applets/install.sh busybox busybox.links $(Q)DO_INSTALL_LIBS="$(strip $(LIBBUSYBOX_SONAME) $(DO_INSTALL_LIBS))" \ $(SHELL) $< $(CONFIG_PREFIX) $(INSTALL_OPTS) diff --git a/applets/applets.c b/applets/applets.c index 6de6db3cd..c2040b9a3 100644 --- a/applets/applets.c +++ b/applets/applets.c @@ -600,9 +600,10 @@ static int busybox_main(char **argv) /* "busybox arg1 arg2 ..." */ argv++; } - /* we want ": applet not found", not "busybox: ..." */ - applet_name = argv[0]; - run_applet_and_exit(argv[0], argv); + /* We support "busybox /a/path/to/applet args..." too. Allows for + * "#!/bin/busybox"-style wrappers */ + applet_name = bb_get_last_path_component(argv[0]); + run_applet_and_exit(applet_name, argv); bb_error_msg_and_die("applet not found"); } diff --git a/applets/install.sh b/applets/install.sh index b02350262..e94b2b98e 100755 --- a/applets/install.sh +++ b/applets/install.sh @@ -5,19 +5,23 @@ export LC_CTYPE=POSIX prefix=${1} if [ -z "$prefix" ]; then - echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks]" + echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks/--scriptwrapper]" exit 1; fi h=`sort busybox.links | uniq` +scriptwrapper="n" cleanup="0" noclobber="0" case "$2" in - --hardlinks) linkopts="-f";; - --symlinks) linkopts="-fs";; - --cleanup) cleanup="1";; - --noclobber) noclobber="1";; - "") h="";; - *) echo "Unknown install option: $2"; exit 1;; + --hardlinks) linkopts="-f";; + --symlinks) linkopts="-fs";; + --scriptwrapper) scriptwrapper="y";swrapall="y";; + --sw-sh-hard) scriptwrapper="y";linkopts="-f";; + --sw-sh-sym) scriptwrapper="y";linkopts="-fs";; + --cleanup) cleanup="1";; + --noclobber) noclobber="1";; + "") h="";; + *) echo "Unknown install option: $2"; exit 1;; esac if [ -n "$DO_INSTALL_LIBS" ] && [ "$DO_INSTALL_LIBS" != "n" ]; then @@ -52,6 +56,7 @@ if [ "$cleanup" = "1" ] && [ -e "$prefix/bin/busybox" ]; then cd "$pd" done ` + exit 0 fi rm -f $prefix/bin/busybox || exit 1 @@ -61,33 +66,44 @@ install -m 755 busybox $prefix/bin/busybox || exit 1 for i in $h; do appdir=`dirname $i` mkdir -p $prefix/$appdir || exit 1 - if [ "$2" = "--hardlinks" ]; then - bb_path="$prefix/bin/busybox" - else - case "$appdir" in - /) - bb_path="bin/busybox" - ;; - /bin) - bb_path="busybox" - ;; - /sbin) - bb_path="../bin/busybox" - ;; - /usr/bin|/usr/sbin) - bb_path="../../bin/busybox" - ;; - *) - echo "Unknown installation directory: $appdir" - exit 1 - ;; - esac - fi - if [ "$noclobber" = "0" ] || [ ! -e "$prefix$i" ]; then - echo " $prefix$i -> $bb_path" - ln $linkopts $bb_path $prefix$i || exit 1 + if [ "$scriptwrapper" = "y" ]; then + if [ "$swrapall" != "y" ] && [ "$i" = "/bin/sh" ]; then + ln $linkopts busybox $prefix$i || exit 1 + else + rm -f $prefix$i + echo "#!/bin/busybox" > $prefix$i + chmod +x $prefix/$i + fi + echo " $prefix$i" else - echo " $prefix$i already exists" + if [ "$2" = "--hardlinks" ]; then + bb_path="$prefix/bin/busybox" + else + case "$appdir" in + /) + bb_path="bin/busybox" + ;; + /bin) + bb_path="busybox" + ;; + /sbin) + bb_path="../bin/busybox" + ;; + /usr/bin|/usr/sbin) + bb_path="../../bin/busybox" + ;; + *) + echo "Unknown installation directory: $appdir" + exit 1 + ;; + esac + fi + if [ "$noclobber" = "0" ] || [ ! -e "$prefix$i" ]; then + echo " $prefix$i -> $bb_path" + ln $linkopts $bb_path $prefix$i || exit 1 + else + echo " $prefix$i already exists" + fi fi done diff --git a/libbb/getopt32.c b/libbb/getopt32.c index bcb7ea6a0..318f08059 100644 --- a/libbb/getopt32.c +++ b/libbb/getopt32.c @@ -268,7 +268,7 @@ Special characters: max 3 args; count uses of '-2'; min 2 args; if there is a '-2' option then unset '-3', '-X' and '-a'; if there is a '-2' and after it a '-x' then error out. - But it's far too obfuscated. Use ':' to separate groups. + But it's far too obfuscated. Use ':' to separate groups. */ /* Code here assumes that 'unsigned' is at least 32 bits wide */ -- 2.25.1