commit:     9d41e6bdaff27bd16fbd33f46406f77e9074ae78
Author:     Wiktor Kerr <w <AT> kerr <DOT> sh>
AuthorDate: Thu Nov 18 00:43:49 2021 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Fri Nov 19 03:02:31 2021 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=9d41e6bd

sys-libs/musl: make ldconfig script respect -r

Bug: https://bugs.gentoo.org/666246
Signed-off-by: Wiktor Kerr <w <AT> kerr.sh>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 sys-libs/musl/files/ldconfig.in-r1 | 146 +++++++++++++++++++++++++++++++++++++
 1 file changed, 146 insertions(+)

diff --git a/sys-libs/musl/files/ldconfig.in-r1 
b/sys-libs/musl/files/ldconfig.in-r1
new file mode 100644
index 000000000000..362d11ce815a
--- /dev/null
+++ b/sys-libs/musl/files/ldconfig.in-r1
@@ -0,0 +1,146 @@
+#!/bin/bash -e
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+ROOT="/"
+
+LDSO_CONF="/etc/ld.so.conf"
+if [[ ! -e $LDSO_CONF ]]; then
+       echo "$LDSO_CONF not found" >&2
+       exit 1
+fi
+
+LDSO_CONF_DIR=$(dirname $LDSO_CONF)
+
+VERBOSE=0
+
+UPDATE_LINKS=1
+
+get_options() {
+       while getopts "vnNXf:C:r:p" opt "$@"; do
+               case $opt in
+               v)
+                       echo "ldconfig for musl in Gentoo"
+                       VERBOSE=1
+                       ;;
+               r)
+                       ROOT=$OPTARG
+                       LDSO_CONF=$ROOT$LDSO_CONF
+                       LDSO_CONF_DIR=$(dirname $LDSO_CONF)
+                       ;;
+               f)
+                       LDSO_CONF=$OPTARG
+                       ;;
+               X)
+                       UPDATE_LINKS=0
+                       ;;
+               \?)
+                       echo "Invalid option: -$opt" >&2
+                       exit 1
+                       ;;
+               n|N|C|p)
+                       echo "Unimplemented option: -$opt" >&2
+                       exit 1
+                       ;;
+               esac
+       done
+
+       if [[ $UPDATE_LINKS == 1 ]]; then
+               echo "Updating links is not implemented."
+       fi
+}
+
+
+repeated() {
+       local l=$1
+       local drs="${@:2}"
+       for m in $drs; do
+               [[ $m == $l ]] && return 0
+       done
+       return 1
+}
+
+expand() {
+       # We are assuming the ld.so.conf's 'include' is not recursive
+       local f line l
+       local glob="$LDSO_CONF_DIR/$1"
+       local drs="${@:2} "
+
+       for f in $glob; do
+               [[ ! -f $f ]] && continue
+               while read line; do
+                       line=${line%%#*}
+                       line=${line//:/ }
+                       line=${line//,/ }
+                       for l in $line; do
+                               #We must add this whether or not the directory 
exists
+                               repeated $l $drs && continue
+                               drs+=" $l "
+                       done
+               done < $f
+       done
+
+       echo $drs
+}
+
+read_ldso_conf() {
+       local drs=" "
+
+       while read line; do
+               # Sanitize the line - see ldconfig(8) for delimiters
+               # Note: bash read turns tabs into spaces and read already
+               # delimits on newlines with the default $IFS
+               line=${line%%#*}   # Remove comments
+               line=${line//:/ }  # Change colon delimiter to space
+               line=${line//,/ }  # Change comma delimiter to space
+
+               next=0
+               for l in $line; do
+                       if [[ $next == 1 ]]; then
+                               next=0
+                               drs=$(expand $l $drs)
+                       elif [[ $l == "include" ]]; then
+                               next=1
+                       else
+                               # glibc's ldconfig silently skips non 
directories
+                               if [[ -d $l ]]; then
+                                       repeated $l $drs && continue
+                                       drs+=" $l "
+                               fi
+                       fi
+               done
+       done < $1
+
+       echo $drs
+}
+
+sanitize() {
+       local drs=$@
+
+       repeated "/lib" $drs || drs="/lib $drs"
+       repeated "/usr/lib" $drs || drs="/usr/lib $drs"
+
+       echo $drs
+}
+
+get_options "$@"
+drs=$(read_ldso_conf "$LDSO_CONF")
+drs=$(sanitize $drs)
+
+ARCH=@@ARCH@@
+LDSO_PATH="$ROOT/lib/ld-musl-${ARCH}.so.1"
+if [[ ! -e $LDSO_PATH ]]; then
+       echo "$LDSO_PATH not found" >&2
+       exit 1
+fi
+
+LDSO_ARCH=$(basename $LDSO_PATH)
+LDSO_NAME=${LDSO_ARCH%.so.1}
+ETC_LDSO_PATH="$ROOT/etc/${LDSO_NAME}.path"
+
+X=$(mktemp -p /tmp ${LDSO_NAME}.XXXXXX)
+for d in $drs; do
+       echo $d >> $X
+done
+chmod 644 $X
+mv $X $ETC_LDSO_PATH

Reply via email to