aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--man/kernel.eselect.516
-rw-r--r--modules/kernel.eselect71
3 files changed, 90 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 913494f..7bb4ea4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2023-03-14 Florian Schmaus <flow@gentoo.org>
+ * 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.
+
* libs/core.bash.in (find_module): Allow to specify an absolute
path as the module's filename, bug 901205.
diff --git a/man/kernel.eselect.5 b/man/kernel.eselect.5
index b3c5aa5..75d992f 100644
--- a/man/kernel.eselect.5
+++ b/man/kernel.eselect.5
@@ -1,7 +1,7 @@
-.\" Copyright 2005-2020 Gentoo Authors
+.\" Copyright 2005-2023 Gentoo Authors
.\" Distributed under the terms of the GNU GPL version 2 or later
.\"
-.TH kernel.eselect 5 "April 2009" "Gentoo Linux" eselect
+.TH kernel.eselect 5 "March 2023" "Gentoo Linux" eselect
.SH NAME
kernel.eselect \- The kernel symlink management module for Gentoo's eselect
.SH SYNOPSIS
@@ -14,6 +14,9 @@ kernel.eselect \- The kernel symlink management module for Gentoo's eselect
.I target
.br
.B eselect kernel show
+.br
+.B eselect kernel update
+.RB [ ifunset ]
.SH DESCRIPTION
.B eselect
is Gentoo's configuration and management tool. It features modules
@@ -45,6 +48,15 @@ output).
.B eselect kernel show
.br
Show the currently selected kernel.
+.SH ACTION: UPDATE
+.B eselect kernel update
+.RB [ ifunset ]
+.br
+Updates the /usr/src/linux symlink to point to the sources of the
+running kernel. If option
+.B ifunset
+is given, then the symlink will only be updated if it is not currently
+pointing to a valid kernel source tree.
.SH AUTHOR
Aaron Walker <ka0ttic@gentoo.org>
.SH SEE ALSO
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
+}