From d456d570f035ee206503da8a98ee3fd7d3ec3f02 Mon Sep 17 00:00:00 2001 From: Martin Matous Date: Wed, 30 Mar 2022 22:18:25 +0200 Subject: [PATCH] initial commit Signed-off-by: Martin Matous --- ld.eselect | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 ld.eselect diff --git a/ld.eselect b/ld.eselect new file mode 100644 index 0000000..1f4fefb --- /dev/null +++ b/ld.eselect @@ -0,0 +1,108 @@ +# Copyright (C) 2022 Martin Matouš + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +DESCRIPTION="Manage linker symlink" +MAINTAINER="Martin Matouš " +VERSION="1.0.0" + +BIN_DIR="${EROOT%/}/usr/bin" + +find_targets() { + local linker + # get all ld.* files + for linker in "${BIN_DIR}/"ld.*; do + [[ -f ${linker} ]] && basename "${linker}" + done +} + +remove_symlink() { + [[ ! -e "${BIN_DIR}/ld" ]] && return + [[ -L "${BIN_DIR}/ld" ]] || die -q "${BIN_DIR}/ld is not a symlink!" + rm -f "${BIN_DIR}/ld" +} + +set_symlink() { + local target="$1" + if is_number "${target}"; then + local -r targets=( $(find_targets) ) + [[ ${target} -ge 1 && ${target} -le ${#targets[@]} ]] \ + || die -q "Number out of range: $1" + target=${targets[target-1]} + elif [[ ! "$target" == "ld."* ]]; then + target="ld.$target" + fi + + if [[ ! -L "${BIN_DIR}/${target}" ]]; then + die -q "Target \"${1}\" (${BIN_DIR}/${target}) doesn't appear to be valid!" + fi + + remove_symlink || die -q "Couldn't remove existing symlink" + ln -s "${target}" "${BIN_DIR}/ld" +} + +### show action ### + +describe_show() { + echo "Show the current linker symlink" +} + +do_show() { + write_list_start "Current linker symlink:" + if [[ -L "${BIN_DIR}/ld" ]]; then + # "dereference" only 1 layer od symlinking, unlike readlink/canonicalize + local -r linker=$(find "${BIN_DIR}/ld" -printf %l) + write_kv_list_entry "${linker}" "" + else + write_kv_list_entry "(unset)" "" + fi +} + +### list action ### + +describe_list() { + echo "List available linkers" +} + +do_list() { + local i + local targets=( $(find_targets) ) + + write_list_start "Available linker symlink targets:" + for (( i = 0; i < ${#targets[@]}; i++ )); do + [[ ${targets[i]} = $(find "${BIN_DIR}/ld" -printf %l) ]] \ + && targets[i]=$(highlight_marker "${targets[i]}") + done + write_numbered_list -m "(none found)" "${targets[@]}" +} + +### set action ### + +describe_set() { + echo "Set a new linker symlink target" +} + +describe_set_parameters() { + echo "" +} + +describe_set_options() { + echo "target : Target name or number (from 'list' action)" +} + +do_set() { + local -r linker="$1" + [[ -z "$linker" ]] && die -q "You didn't tell me what to set the symlink to" + [[ $# -gt 1 ]] && die -q "Too many parameters" + set_symlink "$linker" || die -q "Couldn't set a new symlink" +}