commit:     d5bd4e5f8d28c3fc6e7d15d639538ac9b6459e7a
Author:     Florian Schmaus <flow <AT> gentoo <DOT> org>
AuthorDate: Tue Mar 14 10:02:59 2023 +0000
Commit:     Ulrich Müller <ulm <AT> gentoo <DOT> org>
CommitDate: Wed Mar 15 11:04:22 2023 +0000
URL:        https://gitweb.gentoo.org/proj/eselect.git/commit/?id=d5bd4e5f

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 <AT> gentoo.org>
[Tweaked bash syntax. Fixed highlighting in man page.]
Signed-off-by: Ulrich Müller <ulm <AT> gentoo.org>

 ChangeLog              |  6 +++++
 man/kernel.eselect.5   | 16 ++++++++++--
 modules/kernel.eselect | 71 +++++++++++++++++++++++++++++++++++++++++++++++++-
 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  <f...@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 <ka0t...@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
+}

Reply via email to