hid:b0003g0001v00000627p00000001
  #   ƒˆl–ßi~”d
e¶¥8 ¸Û— 1hßÝ„d"m¯¿à ?÷     ƒ#!/usr/bin/bash
#
# functions used by dracut and other tools.
#
# Copyright 2005-2009 Red Hat, Inc.  All rights reserved.
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# 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 <http://www.gnu.org/licenses/>.
#
export LC_MESSAGES=C

# is_func <command>
# Check whether $1 is a function.
is_func() {
    [[ "$(type -t "$1")" == "function" ]]
}

# Generic substring function.  If $2 is in $1, return 0.
strstr() { [[ $1 == *"$2"* ]]; }
# Generic glob matching function. If glob pattern $2 matches anywhere in $1, OK
strglobin() { [[ $1 == *$2* ]]; }
# Generic glob matching function. If glob pattern $2 matches all of $1, OK
# shellcheck disable=SC2053
strglob() { [[ $1 == $2 ]]; }
# returns OK if $1 contains literal string $2 at the beginning, and isn't empty
str_starts() { [ "${1#"$2"*}" != "$1" ]; }
# returns OK if $1 contains literal string $2 at the end, and isn't empty
str_ends() { [ "${1%*"$2"}" != "$1" ]; }

# find a binary.  If we were not passed the full path directly,
# search in the usual places to find the binary.
find_binary() {
    local _delim
    local _path
    local l
    local p
    [[ -z ${1##/*} ]] || _delim="/"

    if [[ $1 == *.so* ]]; then
        # shellcheck disable=SC2154
        for l in $libdirs; do
            _path="${l}${_delim}${1}"
            if { $DRACUT_LDD "${dracutsysrootdir}${_path}" &> /dev/null; }; then
                printf "%s\n" "${_path}"
                return 0
            fi
        done
        _path="${_delim}${1}"
        if { $DRACUT_LDD "${dracutsysrootdir}${_path}" &> /dev/null; }; then
            printf "%s\n" "${_path}"
            return 0
        fi
    fi
    if [[ $1 == */* ]]; then
        _path="${_delim}${1}"
        if [[ -L ${dracutsysrootdir}${_path} ]] || [[ -x ${dracutsysrootdir}${_path} ]]; then
            printf "%s\n" "${_path}"
            return 0
        fi
    fi
    for p in $DRACUT_PATH; do
        _path="${p}${_delim}${1}"
        if [[ -L ${dracutsysrootdir}${_path} ]] || [[ -x ${dracutsysrootdir}${_path} ]]; then
            printf "%s\n" "${_path}"
            return 0
        fi
    done

    [[ -n $dracutsysrootdir ]] && return 1
    type -P "${1##*/}"
}

ldconfig_paths() {
    $DRACUT_LDCONFIG ${dracutsysrootdir:+-r ${dracutsysrootdir} -f /etc/ld.so.conf} -pN 2> /dev/null | grep -E -v '/(lib|lib64|usr/lib|usr/lib64)/[^/]*$' | sed -n 's,.* => \(.*\)/.*,\1,p' | sort | uniq
}

# Version comparision function.  Assumes Linux style version scheme.
# $1 = version a
# $2 = comparision op (gt, ge, eq, le, lt, ne)
# $3 = version b
vercmp() {
    local _n1
    read -r -a _n1 <<< "${1//./ }"
    local _op=$2
    local _n2
    read -r -a _n2 <<< "${3//./ }"
    local _i _res

    for ((_i = 0; ; _i++)); do
        if [[ ! ${_n1[_i]}${_n2[_i]} ]]; then
            _res=0
        elif ((${_n1[_i]:-0} > ${_n2[_i]:-0})); then
            _res=1
        elif ((${_n1[_i]:-0} < ${_n2[_i]:-0})); then
            _res=2
        else
            continue
        fi
        break
    done

    case $_op in
        gt) ((_res == 1)) ;;
        ge) ((_res != 2)) ;;
        eq) ((_res == 0)) ;;
        le) ((_res != 1)) ;;
        lt) ((_res == 2)) ;;
        ne) ((_res != 0)) ;;
    esac
}

# Create all subdirectories for given path without creating the last element.
# $1 = path
mksubdirs() {
    # shellcheck disable=SC2174
    [[ -e ${1%/*} ]] || mkdir -m 0755 -p -- "${1%/*}"
}

# Function prints global variables in format name=value line by li