aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Schmaus <flow@gentoo.org>2023-03-14 11:02:59 +0100
committerUlrich Müller <ulm@gentoo.org>2023-03-15 12:04:22 +0100
commitd5bd4e5f8d28c3fc6e7d15d639538ac9b6459e7a (patch)
tree3f3924dd4e659d4757e5e0590086a1d1dc75c68e /modules/kernel.eselect
parentChangeLog: Add reference to bug 901205 (diff)
downloadeselect-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/kernel.eselect')
-rw-r--r--modules/kernel.eselect71
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
+}