Skip to content
2 changes: 2 additions & 0 deletions device.mk
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ PRODUCT_PROPERTY_OVERRIDES := \
PRODUCT_COPY_FILES := \
$(if $(wildcard $(PRODUCT_DIR)init.rc),$(PRODUCT_DIR)init.rc:root/init.rc) \
$(if $(wildcard $(PRODUCT_DIR)init.sh),$(PRODUCT_DIR),$(LOCAL_PATH)/)init.sh:system/etc/init.sh \
$(if $(wildcard $(PRODUCT_DIR)init.fstab.sh),$(PRODUCT_DIR),$(LOCAL_PATH)/)init.fstab.sh:$(TARGET_COPY_OUT_VENDOR)/etc/init.fstab.sh \
$(if $(wildcard $(PRODUCT_DIR)init.zram.sh),$(PRODUCT_DIR),$(LOCAL_PATH)/)init.zram.sh:$(TARGET_COPY_OUT_VENDOR)/etc/init.zram.sh \
$(if $(wildcard $(PRODUCT_DIR)modules.blocklist),$(PRODUCT_DIR),$(LOCAL_PATH)/)modules.blocklist:system/etc/modules.blocklist \
$(if $(wildcard $(PRODUCT_DIR)modules.options),$(PRODUCT_DIR),$(LOCAL_PATH)/)modules.options:system/etc/modules.options \
Expand Down Expand Up @@ -152,6 +153,7 @@ endif
PRODUCT_COPY_FILES += \
$(if $(wildcard $(PRODUCT_DIR)init.recovery.$(TARGET_PRODUCT).rc),$(PRODUCT_DIR)init.recovery.$(TARGET_PRODUCT).rc,$(LOCAL_PATH)/init.recovery.x86.rc):recovery/root/init.recovery.$(TARGET_PRODUCT).rc \
$(if $(wildcard $(PRODUCT_DIR)init.recovery.sh),$(PRODUCT_DIR),$(LOCAL_PATH)/)init.recovery.sh:recovery/root/system/etc/init.recovery.sh \
$(if $(wildcard $(PRODUCT_DIR)init.fstab.sh),$(PRODUCT_DIR),$(LOCAL_PATH)/)init.fstab.sh:recovery/root/system/etc/init.fstab.sh \

PRODUCT_TAGS += dalvik.gc.type-precise

Expand Down
33 changes: 33 additions & 0 deletions init.fstab.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#
# Copyright (C) 2024 Shadichy <shadichy@blisslabs.org>
#
# License: GNU Public License v2 or later
#

function map_device_link() {
# shellcheck disable=2012,2046
mknod /dev/block/by-name/"${1#'#>'}" b "$2" "$3"
}

function init_loop_links() {
mkdir -p /dev/block/by-name

while read -r line; do
case "$line" in
'#>'*) map_device_link $line ;;
*) ;;
esac
done <"$(ls /fstab.*)"

ln -s /dev/block/by-name/kernel_a /dev/block/by-name/boot_a
ln -s /dev/block/by-name/kernel_b /dev/block/by-name/boot_b

ln -s /dev/block/by-name/recovery_a /dev/block/by-name/ramdisk-recovery_a
ln -s /dev/block/by-name/recovery_b /dev/block/by-name/ramdisk-recovery_b

# Handle for misc symlink specifically
mv /dev/block/by-name/misc /dev/block/by-name/misc-device
ln -s misc-device /dev/block/by-name/misc
}

init_loop_links
90 changes: 19 additions & 71 deletions init.recovery.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,77 +23,25 @@ function init_misc()
fi
}

function init_loop_links()
function init_recovery_device_link()
{
# Setup partitions loop
if [ "$(cat /proc/cmdline | grep androidboot.slot_suffix)" ]; then
mkdir -p /dev/block/by-name
for part in kernel initrd system recovery; do
for suffix in _a _b; do
loop_device=$(losetup -a | grep "$part$suffix" | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
if [ ! -z "$loop_device_num" ]; then
mknod "/dev/block/by-name/$part$suffix" b 7 $loop_device_num
fi
done
done

loop_device=$(losetup -a | grep kernel_a | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
mknod "/dev/block/by-name/boot_a" b 7 $loop_device_num
loop_device=$(losetup -a | grep kernel_b | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
mknod "/dev/block/by-name/boot_b" b 7 $loop_device_num

loop_device=$(losetup -a | grep misc | cut -d ":" -f1)
ln -s $loop_device /dev/block/by-name/misc

ln -s /dev/block/by-name/recovery_a /dev/block/by-name/ramdisk-recovery_a
ln -s /dev/block/by-name/recovery_b /dev/block/by-name/ramdisk-recovery_b
else
mkdir -p /dev/block/by-name
for part in kernel initrd system recovery; do
loop_device=$(losetup -a | grep "$part" | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
if [ ! -z "$loop_device_num" ]; then
mknod "/dev/block/by-name/$part" b 7 $loop_device_num
fi
done
loop_device=$(losetup -a | grep kernel | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
mknod "/dev/block/by-name/boot" b 7 $loop_device_num

loop_device=$(losetup -a | grep misc | cut -d ":" -f1)
ln -s $loop_device /dev/block/by-name/misc
fi

# Insert /data to recovery.fstab
if [ "$(getprop sys.recovery.data_is_part)" ] && [ "$(getprop sys.recovery.data_part)" ]; then
data_part=$(getprop sys.recovery.data_part)
if [ "$(toybox blkid /dev/block/$data_part | grep ext4)" ]; then
echo "/dev/block/$data_part /data ext4 rw,noatime defaults" >> /etc/recovery.fstab
elif [ "$(toybox blkid /dev/block/$data_part | grep f2fs)" ]; then
echo "/dev/block/$data_part /data f2fs rw,noatime defaults" >> /etc/recovery.fstab
fi
fi
if [ "$(getprop sys.recovery.data_is_part)" ] && [ "$(getprop sys.recovery.data_is_img)" ]; then
loop_device=$(losetup -a | grep data | cut -d ":" -f1)
ln -s $loop_device /dev/block/by-name/userdata
echo "/dev/block/by-name/userdata /data ext4 defaults defaults" >> /etc/recovery.fstab
fi

# Insert /system into recovery.fstab
ab_slot=$(getprop ro.boot.slot_suffix)
if [ ! -z "$ab_slot" ]; then
echo "/dev/block/by-name/system /system ext4 defaults slotselect,first_stage_mount" >> /etc/recovery.fstab
else
echo "/dev/block/by-name/system /system ext4 defaults defaults" >> /etc/recovery.fstab
fi

# Create /dev/block/bootdevice/by-name
# because some scripts are dumb
mkdir -p /dev/block/bootdevice
ln -s /dev/block/by-name /dev/block/bootdevice/by-name
# Insert /data to recovery.fstab
if _data=$(grep -E '^ */dev/block/.+ /data ' "$(ls /fstab.*)") && ! { set -- $_data && mount "$1" "$2" -t "$3" -o "$4"; }; then
echo "$_data" >>/etc/recovery.fstab
set_property sys.recovery.data_is_part true
fi

# Insert /system into recovery.fstab
if [ "$(getprop ro.boot.slot_suffix)" ]; then
echo "/dev/block/by-name/system /system ext4 defaults slotselect,first_stage_mount" >> /etc/recovery.fstab
else
echo "/dev/block/by-name/system /system ext4 defaults defaults" >> /etc/recovery.fstab
fi

# Create /dev/block/bootdevice/by-name
# because some scripts are dumb
mkdir -p /dev/block/bootdevice
ln -s /dev/block/by-name /dev/block/bootdevice/by-name
}

function do_netconsole()
Expand All @@ -104,7 +52,7 @@ function do_netconsole()
function do_init()
{
init_misc
init_loop_links
init_recovery_device_link
}

# import cmdline variables
Expand Down
3 changes: 3 additions & 0 deletions init.recovery.x86.rc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ on early-boot
ifup ${vendor.recovery.ethernet.dhcp.iface:-eth0}
start dhcpclient

on early-fs
exec u:r:init:s0 -- /system/bin/sh /system/etc/init.fstab.sh

on post-fs
exec u:r:init:s0 -- /system/bin/sh /system/etc/init.recovery.sh

Expand Down
28 changes: 0 additions & 28 deletions init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -862,33 +862,6 @@ function set_custom_ota()

}

function init_loop_links()
{
mkdir -p /dev/block/by-name
for part in kernel initrd system recovery; do
for suffix in _a _b; do
loop_device=$(losetup -a | grep "$part$suffix" | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
if [ ! -z "$loop_device_num" ]; then
mknod "/dev/block/by-name/$part$suffix" b 7 $loop_device_num
fi
done
done

loop_device=$(losetup -a | grep kernel_a | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
mknod "/dev/block/by-name/boot_a" b 7 $loop_device_num
loop_device=$(losetup -a | grep kernel_b | cut -d ":" -f1)
loop_device_num=$(echo $loop_device | cut -d '/' -f 4 | cut -d 'p' -f 2)
mknod "/dev/block/by-name/boot_b" b 7 $loop_device_num

loop_device=$(losetup -a | grep misc | cut -d ":" -f1)
ln -s $loop_device /dev/block/by-name/misc

ln -s /dev/block/by-name/recovery_a /dev/block/by-name/ramdisk-recovery_a
ln -s /dev/block/by-name/recovery_b /dev/block/by-name/ramdisk-recovery_b
}

function init_prepare_ota()
{
# If there's slot set, turn on bootctrl
Expand Down Expand Up @@ -939,7 +912,6 @@ function do_init()
init_hal_surface
init_tscal
init_ril
init_loop_links
init_prepare_ota
post_init
}
Expand Down
3 changes: 3 additions & 0 deletions init.x86.rc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ on early-init && property:mesa.galliumhud.period=*
on init
write /proc/sys/vm/page-cluster 0

on early-fs
exec u:r:init:s0 -- /system/bin/logwrapper /system/bin/sh /vendor/etc/init.fstab.sh

on fs
mkdir /mnt/vendor/shared 0770 system system
mount_all /fstab.${ro.hardware}
Expand Down