busybox/scripts/embedded_scripts
Ron Yorston 71df2d3589 hush: allow hush to run embedded scripts
Embedded scripts require a shell to be present in the BusyBox
binary.  Allow either ash or hush to be used for this purpose.
If both are enabled ash takes precedence.

The size of the binary is unchanged in the default configuration:
both ash and hush are present but support for embedded scripts
isn't compiled into hush.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2018-11-27 16:13:07 +01:00

126 lines
2.3 KiB
Bash
Executable File

#!/bin/sh
. ./.config || exit 1
target="$1"
custom_loc="$2"
applet_loc="$3"
test "$target" || exit 1
test "$SED" || SED=sed
test "$DD" || DD=dd
if [ x"$CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS" != x"y" ]
then
printf '#define NUM_SCRIPTS 0\n' >"$target"
exit 0
fi
# Some people were bitten by their system lacking a (proper) od
od -v -b </dev/null >/dev/null
if test $? != 0; then
echo 'od tool is not installed or cannot accept "-v -b" options'
exit 1
fi
custom_scripts=""
if [ -d "$custom_loc" ]
then
custom_scripts=$(cd $custom_loc; ls * 2>/dev/null)
fi
all_scripts=$($srctree/applets/busybox.mkscripts)
# all_scripts includes applet scripts and custom scripts, sort them out
applet_scripts=""
for i in $all_scripts
do
found=0
for j in $custom_scripts
do
if [ "$i" = "$j" ]
then
found=1
break;
fi
done
if [ $found -eq 0 ]
then
# anything that isn't a custom script is an applet script
applet_scripts="$applet_scripts $i"
fi
done
# we know the custom scripts are present but applet scripts might have
# become detached from their configuration
for i in $applet_scripts
do
#if [ ! -f "$applet_loc/$i" -a ! -f "$custom_loc/$i" ]
if [ ! -f "$applet_loc/$i" ]
then
echo "missing applet script $i"
exit 1
fi
done
n=$(echo $custom_scripts $applet_scripts | wc -w)
nall=$(echo $all_scripts | wc -w)
if [ $n -ne $nall ]
then
echo "script mismatch $n != $nall"
exit 1
fi
concatenate_scripts() {
for i in $custom_scripts
do
cat $custom_loc/$i
printf '\000'
done
for i in $applet_scripts
do
cat $applet_loc/$i
printf '\000'
done
}
exec >"$target.$$"
if [ $n -ne 0 ]
then
printf '#ifdef DEFINE_SCRIPT_DATA\n'
printf 'const uint16_t applet_numbers[] = {\n'
for i in $custom_scripts $applet_scripts
do
# TODO support applets with names including invalid characters
printf '\tAPPLET_NO_%s,\n' $i
done
printf '};\n'
printf '#else\n'
printf 'extern const uint16_t applet_numbers[];\n'
printf '#endif\n'
fi
printf "\n"
printf '#define NUM_SCRIPTS %d\n' $n
printf "\n"
if [ $n -ne 0 ]
then
printf '#define UNPACKED_SCRIPTS_LENGTH '
concatenate_scripts | wc -c
printf '#define PACKED_SCRIPTS \\\n'
concatenate_scripts | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | \
od -v -b \
| grep -v '^ ' \
| $SED -e 's/^[^ ]*//' \
-e 's/ //g' \
-e '/^$/d' \
-e 's/\(...\)/0\1,/g' \
-e 's/$/ \\/'
printf '\n'
fi
mv -- "$target.$$" "$target"