From 24b0d7ec0075e5be6ebad0a2f603f9f42670d871 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 14 Mar 2023 11:02:59 +0100 Subject: [PATCH] Add 'update' action to kernel module The 'update' action attempts to update the /usr/src/linux symlink to point to the sources of the running kernel. Signed-off-by: Florian Schmaus --- modules/kernel.eselect | 64 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/modules/kernel.eselect b/modules/kernel.eselect index 64b5e773d68d..fbbf7a95d797 100644 --- a/modules/kernel.eselect +++ b/modules/kernel.eselect @@ -125,3 +125,67 @@ do_set() { set_symlink "$1" || die -q "Couldn't set a new symlink" } + +### update action ### + +describe_update() { + echo "Update the kernel symlink to running kernel" +} + +describe_update_options() { + echo "ifunset: Do not override currently set version" +} + +do_update() { + [[ -z $1 || $1 == ifunset ]] || die -q "Usage error" + [[ $# -gt 1 ]] && die -q "Too many parameters" + test_for_root + + if [[ -e ${EROOT}/usr/src/linux && ! -L ${EROOT}/usr/src/linux ]]; then + # we have something strange + die -q "${EROOT}/usr/src/linux exists but is not a symlink" + fi + + if [[ $1 == ifunset \ + && -L ${EROOT}/usr/src/linux \ + && -e ${EROOT}/usr/src/linux ]]; then + # The /usr/src/linux symlink exists, points to a path that + # exists, and 'ifunset' is provided. Nothing to do. + return + fi + + local targets=( $(find_targets) ) + local running_kernel_release=$(uname --kernel-release) + local running_kernel_symlink_target="linux-${running_kernel_release}" + + if [[ -L ${EROOT}/usr/src/linux ]]; then + local current_target + current_target=$(basename "$(canonicalise "${EROOT}/usr/src/linux")") + if [[ ${current_target} == ${running_kernel_symlink_target} ]]; then + # The /usr/src/linux symlink already points to the running + # kernel's sources. Nothing to do. + return + fi + fi + + local target + local target_list=() + for target in ${targets[@]}; do + if [[ ${target} == ${current_kernel_symlink_target} ]]; then + set_symlink "${target}" + return + fi + target_list+=("- ${target}\n") + done + + local msg + msg="No kernel sources for running kernel ${running_kernel_release} found." + msg+=" Available sources:\n${target_list[@]}" + die -q "${msg}" +} + +### helper functions ### + +test_for_root() { + [[ -w ${EROOT}/usr/src ]] || die -q "${EROOT}/usr/src not writeable by current user. Are you root?" +} -- 2.39.2