support "#!/bin/busybox"-style wrappers. Needed for SELinux.

Patch by Yuichi Nakamura <ynakam@hitachisoft.jp>
This commit is contained in:
Denis Vlasenko 2007-08-25 18:25:24 +00:00
parent 5222677176
commit 737d131e5e
5 changed files with 94 additions and 37 deletions

View File

@ -465,6 +465,11 @@ config INSTALL_APPLET_HARDLINKS
Install applets as hard-links to the busybox binary. This might count Install applets as hard-links to the busybox binary. This might count
on a filesystem with few inodes. 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 config INSTALL_APPLET_DONT
bool "not installed" bool "not installed"
depends on FEATURE_INSTALLER || FEATURE_SH_STANDALONE || FEATURE_PREFER_APPLETS depends on FEATURE_INSTALLER || FEATURE_SH_STANDALONE || FEATURE_PREFER_APPLETS
@ -474,6 +479,30 @@ config INSTALL_APPLET_DONT
endchoice 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 config PREFIX
string "BusyBox installation prefix" string "BusyBox installation prefix"
default "./_install" default "./_install"

View File

@ -12,6 +12,17 @@ endif
ifeq ($(CONFIG_INSTALL_APPLET_HARDLINKS),y) ifeq ($(CONFIG_INSTALL_APPLET_HARDLINKS),y)
INSTALL_OPTS:= --hardlinks INSTALL_OPTS:= --hardlinks
endif 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 install: $(srctree)/applets/install.sh busybox busybox.links
$(Q)DO_INSTALL_LIBS="$(strip $(LIBBUSYBOX_SONAME) $(DO_INSTALL_LIBS))" \ $(Q)DO_INSTALL_LIBS="$(strip $(LIBBUSYBOX_SONAME) $(DO_INSTALL_LIBS))" \
$(SHELL) $< $(CONFIG_PREFIX) $(INSTALL_OPTS) $(SHELL) $< $(CONFIG_PREFIX) $(INSTALL_OPTS)

View File

@ -600,9 +600,10 @@ static int busybox_main(char **argv)
/* "busybox <applet> arg1 arg2 ..." */ /* "busybox <applet> arg1 arg2 ..." */
argv++; argv++;
} }
/* we want "<argv[0]>: applet not found", not "busybox: ..." */ /* We support "busybox /a/path/to/applet args..." too. Allows for
applet_name = argv[0]; * "#!/bin/busybox"-style wrappers */
run_applet_and_exit(argv[0], argv); applet_name = bb_get_last_path_component(argv[0]);
run_applet_and_exit(applet_name, argv);
bb_error_msg_and_die("applet not found"); bb_error_msg_and_die("applet not found");
} }

View File

@ -5,19 +5,23 @@ export LC_CTYPE=POSIX
prefix=${1} prefix=${1}
if [ -z "$prefix" ]; then if [ -z "$prefix" ]; then
echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks]" echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks/--scriptwrapper]"
exit 1; exit 1;
fi fi
h=`sort busybox.links | uniq` h=`sort busybox.links | uniq`
scriptwrapper="n"
cleanup="0" cleanup="0"
noclobber="0" noclobber="0"
case "$2" in case "$2" in
--hardlinks) linkopts="-f";; --hardlinks) linkopts="-f";;
--symlinks) linkopts="-fs";; --symlinks) linkopts="-fs";;
--cleanup) cleanup="1";; --scriptwrapper) scriptwrapper="y";swrapall="y";;
--noclobber) noclobber="1";; --sw-sh-hard) scriptwrapper="y";linkopts="-f";;
"") h="";; --sw-sh-sym) scriptwrapper="y";linkopts="-fs";;
*) echo "Unknown install option: $2"; exit 1;; --cleanup) cleanup="1";;
--noclobber) noclobber="1";;
"") h="";;
*) echo "Unknown install option: $2"; exit 1;;
esac esac
if [ -n "$DO_INSTALL_LIBS" ] && [ "$DO_INSTALL_LIBS" != "n" ]; then if [ -n "$DO_INSTALL_LIBS" ] && [ "$DO_INSTALL_LIBS" != "n" ]; then
@ -52,6 +56,7 @@ if [ "$cleanup" = "1" ] && [ -e "$prefix/bin/busybox" ]; then
cd "$pd" cd "$pd"
done done
` `
exit 0
fi fi
rm -f $prefix/bin/busybox || exit 1 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 for i in $h; do
appdir=`dirname $i` appdir=`dirname $i`
mkdir -p $prefix/$appdir || exit 1 mkdir -p $prefix/$appdir || exit 1
if [ "$2" = "--hardlinks" ]; then if [ "$scriptwrapper" = "y" ]; then
bb_path="$prefix/bin/busybox" 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 else
case "$appdir" in if [ "$2" = "--hardlinks" ]; then
/) bb_path="$prefix/bin/busybox"
bb_path="bin/busybox" else
;; case "$appdir" in
/bin) /)
bb_path="busybox" bb_path="bin/busybox"
;; ;;
/sbin) /bin)
bb_path="../bin/busybox" bb_path="busybox"
;; ;;
/usr/bin|/usr/sbin) /sbin)
bb_path="../../bin/busybox" bb_path="../bin/busybox"
;; ;;
*) /usr/bin|/usr/sbin)
echo "Unknown installation directory: $appdir" bb_path="../../bin/busybox"
exit 1 ;;
;; *)
esac echo "Unknown installation directory: $appdir"
fi exit 1
if [ "$noclobber" = "0" ] || [ ! -e "$prefix$i" ]; then ;;
echo " $prefix$i -> $bb_path" esac
ln $linkopts $bb_path $prefix$i || exit 1 fi
else if [ "$noclobber" = "0" ] || [ ! -e "$prefix$i" ]; then
echo " $prefix$i already exists" echo " $prefix$i -> $bb_path"
ln $linkopts $bb_path $prefix$i || exit 1
else
echo " $prefix$i already exists"
fi
fi fi
done done

View File

@ -268,7 +268,7 @@ Special characters:
max 3 args; count uses of '-2'; min 2 args; if there is 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' option then unset '-3', '-X' and '-a'; if there is
a '-2' and after it a '-x' then error out. 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 */ /* Code here assumes that 'unsigned' is at least 32 bits wide */