diff options
author | 2023-03-14 11:02:59 +0100 | |
---|---|---|
committer | 2023-03-15 12:04:22 +0100 | |
commit | d5bd4e5f8d28c3fc6e7d15d639538ac9b6459e7a (patch) | |
tree | 3f3924dd4e659d4757e5e0590086a1d1dc75c68e /modules | |
parent | ChangeLog: Add reference to bug 901205 (diff) | |
download | eselect-d5bd4e5f8d28c3fc6e7d15d639538ac9b6459e7a.tar.gz eselect-d5bd4e5f8d28c3fc6e7d15d639538ac9b6459e7a.tar.bz2 eselect-d5bd4e5f8d28c3fc6e7d15d639538ac9b6459e7a.zip |
New "update" action in kernel module
* modules/kernel.eselect (do_update, describe_update)
(describe_update_options): New action, attempts to update the
/usr/src/linux symlink to point to the sources of the running
kernel. Bug 901209.
* man/kernel.eselect.5: Document it.
Thanks to ulm for helpful suggestions when working on this
functionality.
Bug: https://bugs.gentoo.org/901209
Signed-off-by: Florian Schmaus <flow@gentoo.org>
[Tweaked bash syntax. Fixed highlighting in man page.]
Signed-off-by: Ulrich Müller <ulm@gentoo.org>
Diffstat (limited to 'modules')
-rw-r--r-- | modules/kernel.eselect | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/modules/kernel.eselect b/modules/kernel.eselect index 64b5e77..e181886 100644 --- a/modules/kernel.eselect +++ b/modules/kernel.eselect @@ -1,5 +1,5 @@ # -*-eselect-*- vim: ft=eselect -# Copyright 2005-2020 Gentoo Authors +# Copyright 2005-2023 Gentoo Authors # Distributed under the terms of the GNU GPL version 2 or later DESCRIPTION="Manage the /usr/src/linux symlink" @@ -125,3 +125,72 @@ 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 ]]; then + if [[ ! -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 ]]; then + # The /usr/src/linux symlink exists, points to a path that + # exists, and 'ifunset' is provided. Nothing to do. + return + fi + fi + + local targets=( $(find_targets) ) + [[ ${#targets[@]} -gt 0 ]] || die -q "No target kernel-source trees found" + + local running_kernel_release + running_kernel_release=$(uname -r) || die -q "uname failed with $?" + local running_kernel_symlink_target="linux-${running_kernel_release}" + + if [[ -e ${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 + for target in "${targets[@]}"; do + if [[ ${target} == "${running_kernel_symlink_target}" ]]; then + set_symlink "${target}" + return + fi + done + + write_error_msg \ + "No sources for running kernel ${running_kernel_release} found." + if ! is_output_mode brief; then + do_list >&2 + fi + die -q "Could not update the kernel symlink" +} + +### helper functions ### + +test_for_root() { + if [[ ! -w ${EROOT}/usr/src ]]; then + die -q "${EROOT}/usr/src not writeable by current user. Are you root?" + fi +} |