support "#!/bin/busybox"-style wrappers. Needed for SELinux. Patch by Yuichi Nakamura
No binary (build failed)
—
(log yok)
| @@ -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" | |
| @@ -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) | |
| @@ -600,9 +600,10 @@ static int busybox_main(char **argv) | |
| /* "busybox <applet> arg1 arg2 ..." */ | |
| argv++; | |
| } | |
| - | /* we want "<argv[0]>: 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"); | |
| } | |
| @@ -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 | |
| @@ -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 */ | |