elftool fails to repack the ELF boot image on Sony devices when a custom dtb file is not provided within the AnyKernel2 zip, because the "dtb" variable, that contains the name of the dtb file, is overridden before the dtb filename is actually passed to the "rpm" variable. Swapping these two lines of code fixes the issue (tested by me on a Sony Xperia SP).
503 lines
18 KiB
Bash
Executable File
503 lines
18 KiB
Bash
Executable File
## AnyKernel methods (DO NOT CHANGE)
|
|
# set up extracted files and directories
|
|
ramdisk=/tmp/anykernel/ramdisk;
|
|
bin=/tmp/anykernel/tools;
|
|
split_img=/tmp/anykernel/split_img;
|
|
patch=/tmp/anykernel/patch;
|
|
|
|
chmod -R 755 $bin;
|
|
mkdir -p $ramdisk $split_img;
|
|
|
|
FD=$1;
|
|
OUTFD=/proc/self/fd/$FD;
|
|
|
|
# ui_print <text>
|
|
ui_print() { echo -e "ui_print $1\nui_print" > $OUTFD; }
|
|
|
|
# contains <string> <substring>
|
|
contains() { test "${1#*$2}" != "$1" && return 0 || return 1; }
|
|
|
|
# reset anykernel directory
|
|
reset_ak() {
|
|
rm -rf $ramdisk $split_img /tmp/anykernel/rdtmp /tmp/anykernel/boot.img /tmp/anykernel/*-new.*;
|
|
. /tmp/anykernel/tools/ak2-core.sh $FD;
|
|
}
|
|
|
|
# dump boot and extract ramdisk
|
|
split_boot() {
|
|
if [ ! -e "$(echo $block | cut -d\ -f1)" ]; then
|
|
ui_print " "; ui_print "Invalid partition. Aborting..."; exit 1;
|
|
fi;
|
|
if [ -f "$bin/nanddump" ]; then
|
|
$bin/nanddump -f /tmp/anykernel/boot.img $block;
|
|
else
|
|
dd if=$block of=/tmp/anykernel/boot.img;
|
|
fi;
|
|
if [ "$(strings /tmp/anykernel/boot.img | grep -E 'Green Loader|Green Recovery')" ]; then
|
|
mv -f /tmp/anykernel/boot.img /tmp/anykernel/boot-orig.img;
|
|
dd bs=1048576 count=1 conv=notrunc if=/tmp/anykernel/boot-orig.img of=$split_img/boot.img-master_boot.key;
|
|
dd bs=1048576 skip=1 conv=notrunc if=/tmp/anykernel/boot-orig.img of=/tmp/anykernel/boot.img;
|
|
fi;
|
|
if [ -f "$bin/unpackelf" -a "$($bin/unpackelf -i /tmp/anykernel/boot.img -h -q 2>/dev/null; echo $?)" == 0 ]; then
|
|
if [ -f "$bin/elftool" ]; then
|
|
mkdir $split_img/elftool_out;
|
|
$bin/elftool unpack -i /tmp/anykernel/boot.img -o $split_img/elftool_out;
|
|
cp -f $split_img/elftool_out/header $split_img/boot.img-header;
|
|
fi;
|
|
$bin/unpackelf -i /tmp/anykernel/boot.img -o $split_img;
|
|
mv -f $split_img/boot.img-ramdisk.cpio.gz $split_img/boot.img-ramdisk.gz;
|
|
elif [ -f "$bin/dumpimage" ]; then
|
|
$bin/dumpimage -l /tmp/anykernel/boot.img;
|
|
$bin/dumpimage -l /tmp/anykernel/boot.img > $split_img/boot.img-header;
|
|
grep "Name:" $split_img/boot.img-header | cut -c15- > $split_img/boot.img-name;
|
|
grep "Type:" $split_img/boot.img-header | cut -c15- | cut -d\ -f1 > $split_img/boot.img-arch;
|
|
grep "Type:" $split_img/boot.img-header | cut -c15- | cut -d\ -f2 > $split_img/boot.img-os;
|
|
grep "Type:" $split_img/boot.img-header | cut -c15- | cut -d\ -f3 | cut -d- -f1 > $split_img/boot.img-type;
|
|
grep "Type:" $split_img/boot.img-header | cut -d\( -f2 | cut -d\) -f1 | cut -d\ -f1 | cut -d- -f1 > $split_img/boot.img-comp;
|
|
grep "Address:" $split_img/boot.img-header | cut -c15- > $split_img/boot.img-addr;
|
|
grep "Point:" $split_img/boot.img-header | cut -c15- > $split_img/boot.img-ep;
|
|
$bin/dumpimage -i /tmp/anykernel/boot.img -p 0 $split_img/boot.img-zImage;
|
|
test $? != 0 && dumpfail=1;
|
|
if [ "$(cat $split_img/boot.img-type)" == "Multi" ]; then
|
|
$bin/dumpimage -i /tmp/anykernel/boot.img -p 1 $split_img/boot.img-ramdisk.gz;
|
|
fi;
|
|
test $? != 0 && dumpfail=1;
|
|
elif [ -f "$bin/rkcrc" ]; then
|
|
dd bs=4096 skip=8 iflag=skip_bytes conv=notrunc if=/tmp/anykernel/boot.img of=$split_img/boot.img-ramdisk.gz;
|
|
elif [ -f "$bin/pxa-unpackbootimg" ]; then
|
|
$bin/pxa-unpackbootimg -i /tmp/anykernel/boot.img -o $split_img;
|
|
else
|
|
$bin/unpackbootimg -i /tmp/anykernel/boot.img -o $split_img;
|
|
fi;
|
|
if [ $? != 0 -o "$dumpfail" ]; then
|
|
ui_print " "; ui_print "Dumping/splitting image failed. Aborting..."; exit 1;
|
|
fi;
|
|
if [ -f "$bin/unpackelf" -a -f "$split_img/boot.img-dtb" ]; then
|
|
case $(od -ta -An -N4 $split_img/boot.img-dtb | sed -e 's/del //' -e 's/ //g') in
|
|
QCDT|ELF) ;;
|
|
*) gzip $split_img/boot.img-zImage;
|
|
mv -f $split_img/boot.img-zImage.gz $split_img/boot.img-zImage;
|
|
cat $split_img/boot.img-dtb >> $split_img/boot.img-zImage;
|
|
rm -f $split_img/boot.img-dtb;;
|
|
esac;
|
|
fi;
|
|
}
|
|
unpack_ramdisk() {
|
|
if [ -f "$bin/mkmtkhdr" ]; then
|
|
dd bs=512 skip=1 conv=notrunc if=$split_img/boot.img-ramdisk.gz of=$split_img/temprd;
|
|
mv -f $split_img/temprd $split_img/boot.img-ramdisk.gz;
|
|
fi;
|
|
mv -f $ramdisk /tmp/anykernel/rdtmp;
|
|
case $(od -ta -An -N4 $split_img/boot.img-ramdisk.gz) in
|
|
' us vt'*|' us rs'*) compext="gz"; unpackcmd="gzip";;
|
|
' ht L Z O') compext="lzo"; unpackcmd="lzop";;
|
|
' ] nul nul nul') compext="lzma"; unpackcmd="$bin/xz";;
|
|
' } 7 z X') compext="xz"; unpackcmd="$bin/xz";;
|
|
' B Z h'*) compext="bz2"; unpackcmd="bzip2";;
|
|
' stx ! L can') compext="lz4-l"; unpackcmd="$bin/lz4";;
|
|
' etx ! L can'|' eot " M can') compext="lz4"; unpackcmd="$bin/lz4";;
|
|
*) ui_print " "; ui_print "Unknown ramdisk compression. Aborting..."; exit 1;;
|
|
esac;
|
|
mv -f $split_img/boot.img-ramdisk.gz $split_img/boot.img-ramdisk.cpio.$compext;
|
|
mkdir -p $ramdisk;
|
|
chmod 755 $ramdisk;
|
|
cd $ramdisk;
|
|
$unpackcmd -dc $split_img/boot.img-ramdisk.cpio.$compext | cpio -i -d;
|
|
if [ $? != 0 -o -z "$(ls $ramdisk)" ]; then
|
|
ui_print " "; ui_print "Unpacking ramdisk failed. Aborting..."; exit 1;
|
|
fi;
|
|
test ! -z "$(ls /tmp/anykernel/rdtmp)" && cp -af /tmp/anykernel/rdtmp/* $ramdisk;
|
|
}
|
|
dump_boot() {
|
|
split_boot;
|
|
unpack_ramdisk;
|
|
}
|
|
|
|
# repack ramdisk then build and write image
|
|
repack_ramdisk() {
|
|
case $ramdisk_compression in
|
|
auto|"") compext=`echo $split_img/*-ramdisk.cpio.* | rev | cut -d. -f1 | rev`;;
|
|
*) compext=$ramdisk_compression;;
|
|
esac;
|
|
case $compext in
|
|
gz) repackcmd="gzip";;
|
|
lzo) repackcmd="lzo";;
|
|
lzma) repackcmd="$bin/xz -Flzma";;
|
|
xz) repackcmd="$bin/xz -Ccrc32";;
|
|
bz2) repackcmd="bzip2";;
|
|
lz4-l) repackcmd="$bin/lz4 -l";;
|
|
lz4) repackcmd="$bin/lz4";;
|
|
esac;
|
|
if [ -f "$bin/mkbootfs" ]; then
|
|
$bin/mkbootfs $ramdisk | $repackcmd -9c > /tmp/anykernel/ramdisk-new.cpio.$compext;
|
|
else
|
|
cd $ramdisk;
|
|
find . | cpio -H newc -o | $repackcmd -9c > /tmp/anykernel/ramdisk-new.cpio.$compext;
|
|
fi;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Repacking ramdisk failed. Aborting..."; exit 1;
|
|
fi;
|
|
cd /tmp/anykernel;
|
|
if [ -f "$bin/mkmtkhdr" ]; then
|
|
$bin/mkmtkhdr --rootfs ramdisk-new.cpio.$compext;
|
|
mv -f ramdisk-new.cpio.$compext-mtk ramdisk-new.cpio.$compext;
|
|
fi;
|
|
}
|
|
flash_boot() {
|
|
cd $split_img;
|
|
if [ -f "$bin/mkimage" ]; then
|
|
name=`cat *-name`;
|
|
arch=`cat *-arch`;
|
|
os=`cat *-os`;
|
|
type=`cat *-type`;
|
|
comp=`cat *-comp`;
|
|
test "$comp" == "uncompressed" && comp=none;
|
|
addr=`cat *-addr`;
|
|
ep=`cat *-ep`;
|
|
else
|
|
if [ -f *-cmdline ]; then
|
|
cmdline=`cat *-cmdline`;
|
|
fi;
|
|
if [ -f *-board ]; then
|
|
board=`cat *-board`;
|
|
fi;
|
|
base=`cat *-base`;
|
|
pagesize=`cat *-pagesize`;
|
|
kerneloff=`cat *-kerneloff`;
|
|
ramdiskoff=`cat *-ramdiskoff`;
|
|
if [ -f *-tagsoff ]; then
|
|
tagsoff=`cat *-tagsoff`;
|
|
fi;
|
|
if [ -f *-osversion ]; then
|
|
osver=`cat *-osversion`;
|
|
fi;
|
|
if [ -f *-oslevel ]; then
|
|
oslvl=`cat *-oslevel`;
|
|
fi;
|
|
if [ -f *-second ]; then
|
|
second=`ls *-second`;
|
|
second="--second $split_img/$second";
|
|
secondoff=`cat *-secondoff`;
|
|
secondoff="--second_offset $secondoff";
|
|
fi;
|
|
if [ -f *-hash ]; then
|
|
hash=`cat *-hash`;
|
|
test "$hash" == "unknown" && hash=sha1;
|
|
hash="--hash $hash";
|
|
fi;
|
|
if [ -f *-unknown ]; then
|
|
unknown=`cat *-unknown`;
|
|
fi;
|
|
fi;
|
|
for i in zImage zImage-dtb Image.gz Image Image-dtb Image.gz-dtb Image.bz2 Image.bz2-dtb Image.lzo Image.lzo-dtb Image.lzma Image.lzma-dtb Image.xz Image.xz-dtb Image.lz4 Image.lz4-dtb Image.fit; do
|
|
if [ -f /tmp/anykernel/$i ]; then
|
|
kernel=/tmp/anykernel/$i;
|
|
break;
|
|
fi;
|
|
done;
|
|
if [ ! "$kernel" ]; then
|
|
kernel=`ls *-zImage`;
|
|
kernel=$split_img/$kernel;
|
|
fi;
|
|
if [ -f /tmp/anykernel/ramdisk-new.cpio.$compext ]; then
|
|
rd=/tmp/anykernel/ramdisk-new.cpio.$compext;
|
|
else
|
|
rd=`ls *-ramdisk.*`;
|
|
rd="$split_img/$rd";
|
|
fi;
|
|
for i in dtb dt.img; do
|
|
if [ -f /tmp/anykernel/$i ]; then
|
|
dtb="--dt /tmp/anykernel/$i";
|
|
rpm="/tmp/anykernel/$i,rpm";
|
|
break;
|
|
fi;
|
|
done;
|
|
if [ ! "$dtb" -a -f *-dtb ]; then
|
|
dtb=`ls *-dtb`;
|
|
rpm="$split_img/$dtb,rpm";
|
|
dtb="--dt $split_img/$dtb";
|
|
fi;
|
|
cd /tmp/anykernel;
|
|
if [ -f "$bin/mkmtkhdr" ]; then
|
|
case $kernel in
|
|
$split_img/*) ;;
|
|
*) $bin/mkmtkhdr --kernel $kernel; kernel=$kernel-mtk;;
|
|
esac;
|
|
fi;
|
|
if [ -f "$bin/mkimage" ]; then
|
|
test "$type" == "Multi" && uramdisk=":$rd";
|
|
$bin/mkimage -A $arch -O $os -T $type -C $comp -a $addr -e $ep -n "$name" -d $kernel$uramdisk boot-new.img;
|
|
elif [ -f "$bin/elftool" ]; then
|
|
$bin/elftool pack -o boot-new.img header=$split_img/boot.img-header $kernel $rd,ramdisk $rpm $split_img/boot.img-cmdline@cmdline;
|
|
elif [ -f "$bin/rkcrc" ]; then
|
|
$bin/rkcrc -k $rd boot-new.img;
|
|
elif [ -f "$bin/pxa-mkbootimg" ]; then
|
|
$bin/pxa-mkbootimg --kernel $kernel --ramdisk $rd $second --cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff $secondoff --tags_offset "$tagsoff" --unknown $unknown $dtb --output boot-new.img;
|
|
else
|
|
$bin/mkbootimg --kernel $kernel --ramdisk $rd $second --cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff $secondoff --tags_offset "$tagsoff" --os_version "$osver" --os_patch_level "$oslvl" $hash $dtb --output boot-new.img;
|
|
fi;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Repacking image failed. Aborting..."; exit 1;
|
|
elif [ "$(wc -c < boot-new.img)" -gt "$(wc -c < boot.img)" ]; then
|
|
ui_print " "; ui_print "New image larger than boot partition. Aborting..."; exit 1;
|
|
fi;
|
|
if [ -f "$bin/futility" -a -d "$bin/chromeos" ]; then
|
|
$bin/futility vbutil_kernel --pack boot-new-signed.img --keyblock $bin/chromeos/kernel.keyblock --signprivate $bin/chromeos/kernel_data_key.vbprivk --version 1 --vmlinuz boot-new.img --bootloader $bin/chromeos/empty --config $bin/chromeos/empty --arch arm --flags 0x1;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Signing image failed. Aborting..."; exit 1;
|
|
fi;
|
|
mv -f boot-new-signed.img boot-new.img;
|
|
fi;
|
|
if [ -f "$bin/BootSignature_Android.jar" -a -d "$bin/avb" ]; then
|
|
if [ -f "/system/system/bin/dalvikvm" ]; then
|
|
umount /system;
|
|
umount /system 2>/dev/null;
|
|
mkdir /system_root;
|
|
mount -o ro -t auto /dev/block/bootdevice/by-name/system$slot /system_root;
|
|
mount -o bind /system_root/system /system;
|
|
fi;
|
|
pk8=`ls $bin/avb/*.pk8`;
|
|
cert=`ls $bin/avb/*.x509.*`;
|
|
case $block in
|
|
*recovery*|*SOS*) avbtype=recovery;;
|
|
*) avbtype=boot;;
|
|
esac;
|
|
savedpath="$LD_LIBRARY_PATH";
|
|
unset LD_LIBRARY_PATH;
|
|
/system/bin/dalvikvm -Xbootclasspath:/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/bouncycastle.jar -Xnodex2oat -Xnoimage-dex2oat -cp $bin/BootSignature_Android.jar com.android.verity.BootSignature /$avbtype boot-new.img $pk8 $cert boot-new-signed.img;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Signing image failed. Aborting..."; exit 1;
|
|
fi;
|
|
test "$savedpath" && export LD_LIBRARY_PATH="$savedpath";
|
|
mv -f boot-new-signed.img boot-new.img;
|
|
if [ -d "/system_root" ]; then
|
|
umount /system;
|
|
umount /system_root;
|
|
rmdir /system_root;
|
|
mount -o ro -t auto /system;
|
|
fi;
|
|
fi;
|
|
if [ -f "$bin/blobpack" ]; then
|
|
printf '-SIGNED-BY-SIGNBLOB-\00\00\00\00\00\00\00\00' > boot-new-signed.img;
|
|
$bin/blobpack tempblob LNX boot-new.img;
|
|
cat tempblob >> boot-new-signed.img;
|
|
mv -f boot-new-signed.img boot-new.img;
|
|
fi;
|
|
if [ -f "/data/custom_boot_image_patch.sh" ]; then
|
|
ash /data/custom_boot_image_patch.sh /tmp/anykernel/boot-new.img;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "User script execution failed. Aborting..."; exit 1;
|
|
fi;
|
|
fi;
|
|
if [ "$(strings /tmp/anykernel/boot.img | grep SEANDROIDENFORCE )" ]; then
|
|
printf 'SEANDROIDENFORCE' >> boot-new.img;
|
|
fi;
|
|
if [ -f "$bin/dhtbsign" ]; then
|
|
$bin/dhtbsign -i boot-new.img -o boot-new-signed.img;
|
|
mv -f boot-new-signed.img boot-new.img;
|
|
fi;
|
|
if [ -f "$split_img/boot.img-master_boot.key" ]; then
|
|
cat $split_img/boot.img-master_boot.key boot-new.img > boot-new-signed.img;
|
|
mv -f boot-new-signed.img boot-new.img;
|
|
fi;
|
|
if [ ! -f /tmp/anykernel/boot-new.img ]; then
|
|
ui_print " "; ui_print "Repacked image could not be found. Aborting..."; exit 1;
|
|
fi;
|
|
if [ -f "$bin/flash_erase" -a -f "$bin/nandwrite" ]; then
|
|
$bin/flash_erase $block 0 0;
|
|
$bin/nandwrite -p $block /tmp/anykernel/boot-new.img;
|
|
else
|
|
dd if=/dev/zero of=$block 2>/dev/null;
|
|
dd if=/tmp/anykernel/boot-new.img of=$block;
|
|
fi;
|
|
for i in dtbo dtbo.img; do
|
|
if [ -f /tmp/anykernel/$i ]; then
|
|
dtbo=$i;
|
|
break;
|
|
fi;
|
|
done;
|
|
if [ "$dtbo" ]; then
|
|
dtbo_block=/dev/block/bootdevice/by-name/dtbo$slot;
|
|
if [ ! -e "$(echo $dtbo_block)" ]; then
|
|
ui_print " "; ui_print "dtbo partition could not be found. Aborting..."; exit 1;
|
|
fi;
|
|
if [ -f "$bin/flash_erase" -a -f "$bin/nandwrite" ]; then
|
|
$bin/flash_erase $dtbo_block 0 0;
|
|
$bin/nandwrite -p $dtbo_block /tmp/anykernel/$dtbo;
|
|
else
|
|
dd if=/dev/zero of=$dtbo_block 2>/dev/null;
|
|
dd if=/tmp/anykernel/$dtbo of=$dtbo_block;
|
|
fi;
|
|
fi;
|
|
}
|
|
write_boot() {
|
|
repack_ramdisk;
|
|
flash_boot;
|
|
}
|
|
|
|
# backup_file <file>
|
|
backup_file() { test ! -f $1~ && cp $1 $1~; }
|
|
|
|
# replace_string <file> <if search string> <original string> <replacement string>
|
|
replace_string() {
|
|
if [ -z "$(grep "$2" $1)" ]; then
|
|
sed -i "s;${3};${4};" $1;
|
|
fi;
|
|
}
|
|
|
|
# replace_section <file> <begin search string> <end search string> <replacement string>
|
|
replace_section() {
|
|
begin=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
for end in `grep -n "$3" $1 | cut -d: -f1`; do
|
|
if [ "$begin" -lt "$end" ]; then
|
|
if [ "$3" == " " -o -z "$3" ]; then
|
|
sed -i "/${2//\//\\/}/,/^\s*$/d" $1;
|
|
else
|
|
sed -i "/${2//\//\\/}/,/${3//\//\\/}/d" $1;
|
|
fi;
|
|
sed -i "${begin}s;^;${4}\n;" $1;
|
|
break;
|
|
fi;
|
|
done;
|
|
}
|
|
|
|
# remove_section <file> <begin search string> <end search string>
|
|
remove_section() {
|
|
begin=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
for end in `grep -n "$3" $1 | cut -d: -f1`; do
|
|
if [ "$begin" -lt "$end" ]; then
|
|
if [ "$3" == " " -o -z "$3" ]; then
|
|
sed -i "/${2//\//\\/}/,/^\s*$/d" $1;
|
|
else
|
|
sed -i "/${2//\//\\/}/,/${3//\//\\/}/d" $1;
|
|
fi;
|
|
break;
|
|
fi;
|
|
done;
|
|
}
|
|
|
|
# insert_line <file> <if search string> <before|after> <line match string> <inserted line>
|
|
insert_line() {
|
|
if [ -z "$(grep "$2" $1)" ]; then
|
|
case $3 in
|
|
before) offset=0;;
|
|
after) offset=1;;
|
|
esac;
|
|
line=$((`grep -n "$4" $1 | head -n1 | cut -d: -f1` + offset));
|
|
if [ "$(wc -l $1 | cut -d\ -f1)" -lt "$line" ]; then
|
|
echo "$5" >> $1;
|
|
else
|
|
sed -i "${line}s;^;${5}\n;" $1;
|
|
fi;
|
|
fi;
|
|
}
|
|
|
|
# replace_line <file> <line replace string> <replacement line>
|
|
replace_line() {
|
|
if [ ! -z "$(grep "$2" $1)" ]; then
|
|
line=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
sed -i "${line}s;.*;${3};" $1;
|
|
fi;
|
|
}
|
|
|
|
# remove_line <file> <line match string>
|
|
remove_line() {
|
|
if [ ! -z "$(grep "$2" $1)" ]; then
|
|
line=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
sed -i "${line}d" $1;
|
|
fi;
|
|
}
|
|
|
|
# prepend_file <file> <if search string> <patch file>
|
|
prepend_file() {
|
|
if [ -z "$(grep "$2" $1)" ]; then
|
|
echo "$(cat $patch/$3 $1)" > $1;
|
|
fi;
|
|
}
|
|
|
|
# insert_file <file> <if search string> <before|after> <line match string> <patch file>
|
|
insert_file() {
|
|
if [ -z "$(grep "$2" $1)" ]; then
|
|
case $3 in
|
|
before) offset=0;;
|
|
after) offset=1;;
|
|
esac;
|
|
line=$((`grep -n "$4" $1 | head -n1 | cut -d: -f1` + offset));
|
|
sed -i "${line}s;^;\n;" $1;
|
|
sed -i "$((line - 1))r $patch/$5" $1;
|
|
fi;
|
|
}
|
|
|
|
# append_file <file> <if search string> <patch file>
|
|
append_file() {
|
|
if [ -z "$(grep "$2" $1)" ]; then
|
|
echo -ne "\n" >> $1;
|
|
cat $patch/$3 >> $1;
|
|
echo -ne "\n" >> $1;
|
|
fi;
|
|
}
|
|
|
|
# replace_file <file> <permissions> <patch file>
|
|
replace_file() {
|
|
cp -pf $patch/$3 $1;
|
|
chmod $2 $1;
|
|
}
|
|
|
|
# patch_fstab <fstab file> <mount match name> <fs match type> <block|mount|fstype|options|flags> <original string> <replacement string>
|
|
patch_fstab() {
|
|
entry=$(grep "$2" $1 | grep "$3");
|
|
if [ -z "$(echo "$entry" | grep "$6")" -o "$6" == " " -o -z "$6" ]; then
|
|
case $4 in
|
|
block) part=$(echo "$entry" | awk '{ print $1 }');;
|
|
mount) part=$(echo "$entry" | awk '{ print $2 }');;
|
|
fstype) part=$(echo "$entry" | awk '{ print $3 }');;
|
|
options) part=$(echo "$entry" | awk '{ print $4 }');;
|
|
flags) part=$(echo "$entry" | awk '{ print $5 }');;
|
|
esac;
|
|
newpart=$(echo "$part" | sed -e "s;${5};${6};" -e "s; ;;g" -e 's;,\{2,\};,;g' -e 's;,*$;;g' -e 's;^,;;g');
|
|
newentry=$(echo "$entry" | sed "s;${part};${newpart};");
|
|
sed -i "s;${entry};${newentry};" $1;
|
|
fi;
|
|
}
|
|
|
|
# patch_cmdline <cmdline entry name> <replacement string>
|
|
patch_cmdline() {
|
|
cmdfile=`ls $split_img/*-cmdline`;
|
|
if [ -z "$(grep "$1" $cmdfile)" ]; then
|
|
cmdtmp=`cat $cmdfile`;
|
|
echo "$cmdtmp $2" > $cmdfile;
|
|
sed -i -e 's; *; ;g' -e 's;[ \t]*$;;' $cmdfile;
|
|
else
|
|
match=$(grep -o "$1.*$" $cmdfile | cut -d\ -f1);
|
|
sed -i -e "s;${match};${2};" -e 's; *; ;g' -e 's;[ \t]*$;;' $cmdfile;
|
|
fi;
|
|
}
|
|
|
|
# patch_prop <prop file> <prop name> <new prop value>
|
|
patch_prop() {
|
|
if [ -z "$(grep "^$2=" $1)" ]; then
|
|
echo -ne "\n$2=$3\n" >> $1;
|
|
else
|
|
line=`grep -n "^$2=" $1 | head -n1 | cut -d: -f1`;
|
|
sed -i "${line}s;.*;${2}=${3};" $1;
|
|
fi;
|
|
}
|
|
|
|
# slot detection enabled by is_slot_device=1 (from anykernel.sh)
|
|
if [ "$is_slot_device" == 1 ]; then
|
|
slot=$(getprop ro.boot.slot_suffix 2>/dev/null);
|
|
test ! "$slot" && slot=$(grep -o 'androidboot.slot_suffix=.*$' /proc/cmdline | cut -d\ -f1 | cut -d= -f2);
|
|
if [ ! "$slot" ]; then
|
|
slot=$(getprop ro.boot.slot 2>/dev/null);
|
|
test ! "$slot" && slot=$(grep -o 'androidboot.slot=.*$' /proc/cmdline | cut -d\ -f1 | cut -d= -f2);
|
|
test "$slot" && slot=_$slot;
|
|
fi;
|
|
test "$slot" && block=$block$slot;
|
|
if [ $? != 0 -o ! -e "$block" ]; then
|
|
ui_print " "; ui_print "Unable to determine active boot slot. Aborting..."; exit 1;
|
|
fi;
|
|
fi;
|
|
|
|
## end methods
|
|
|