#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# Real-root variant of the ROCKNIX kernel-overlays-setup. This is the same
# logic as the initramfs hook, but operates on the live system (no /sysroot
# prefix) and is intended to be triggered as a oneshot service or after the
# user drops a new overlay into /storage/.cache/kernel-overlays/.
#
# Source: packages/sysutils/busybox/scripts/kernel-overlays-setup

set -u

SYSTEM_OVERLAYS_DIR=/usr/lib/kernel-overlays
OVERLAY_CONFIG_DIR=/storage/.cache/kernel-overlays
USER_FIRMWARE_DIR=/storage/.config/firmware
KVER=$(uname -r)
RUNTIME_DIR=/run/kernel-overlays
MODULES_DIR=$RUNTIME_DIR/modules/$KVER
FIRMWARE_DIR=$RUNTIME_DIR/firmware

log() { echo "kernel-overlays-setup: $*" | tee /dev/kmsg ; }

mkdir -p "$MODULES_DIR" "$FIRMWARE_DIR"

apply_overlay() {
    case "$1" in
        /*) base=$1 ;;
        *)  base=$SYSTEM_OVERLAYS_DIR/$1 ;;
    esac

    if [ -d "$base/lib/modules/$KVER" ]; then
        if cp -rsf "$base/lib/modules/$KVER"/* "$MODULES_DIR"/; then
            log "added modules from $base/lib/modules/$KVER"
            GOT_MODULE_OVERLAY=yes
        else
            log "failed to add modules from $base/lib/modules/$KVER"
        fi
    fi
    if [ -d "$base/lib/firmware" ]; then
        if cp -rsf "$base/lib/firmware"/* "$FIRMWARE_DIR"/; then
            log "added firmware from $base/lib/firmware"
        else
            log "failed to add firmware from $base/lib/firmware"
        fi
    fi
}

log "setup base modules"
GOT_MODULE_OVERLAY=no
apply_overlay base

if [ -d "$OVERLAY_CONFIG_DIR" ]; then
    log "adding overlays from $OVERLAY_CONFIG_DIR"
    for conf in "$OVERLAY_CONFIG_DIR"/*.conf; do
        [ -e "$conf" ] || continue
        name=$(cat "$conf")
        [ -n "$name" ] && apply_overlay "$name"
    done
fi

if [ -d "$USER_FIRMWARE_DIR" ] && [ -n "$(ls -A "$USER_FIRMWARE_DIR" 2>/dev/null)" ]; then
    if cp -rsf "$USER_FIRMWARE_DIR"/* "$FIRMWARE_DIR"/; then
        log "added firmware from $USER_FIRMWARE_DIR"
    fi
fi

if [ "$GOT_MODULE_OVERLAY" = yes ]; then
    log "running depmod"
    /usr/sbin/depmod -a "$KVER" >/dev/kmsg 2>&1
fi

log "done"
