You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/sys-libs/musl/files/ldconfig.in-r3

161 lines
3.0 KiB

#!/bin/bash -e
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
ROOT="/"
EPREFIX="@GENTOO_PORTAGE_EPREFIX@"
LDSO_CONF_FILE="/etc/ld.so.conf"
VERBOSE=0
UPDATE_LINKS=1
get_options() {
LDSO_CONF=""
while getopts "vnNXf:C:r:p" opt "$@"; do
case $opt in
v)
echo "ldconfig for musl in Gentoo"
VERBOSE=1
;;
r)
ROOT=${OPTARG}
;;
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 [[ -z ${LDSO_CONF} ]]; then
LDSO_CONF=${ROOT}${EPREFIX}${LDSO_CONF_FILE}
fi
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 "${EPREFIX}/lib" ${drs} || drs="${EPREFIX}/lib ${drs}"
repeated "${EPREFIX}/usr/lib" ${drs} || drs="${EPREFIX}/usr/lib ${drs}"
echo ${drs}
}
changed() {
[[ -f ${ETC_LDSO_PATH} ]] || return 0
local current=$(<${ETC_LDSO_PATH})
current=${current//$'\n'/ }
[[ ${current} != ${drs} ]] || return 1
}
get_options "$@"
if [[ ! -e ${LDSO_CONF} ]]; then
echo "${LDSO_CONF} not found" >&2
exit 1
fi
LDSO_CONF_DIR=$(dirname ${LDSO_CONF})
drs=$(read_ldso_conf "${LDSO_CONF}")
drs=$(sanitize ${drs})
ARCH=@@ARCH@@
LDSO_PATH="${ROOT}${EPREFIX}/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}${EPREFIX}/etc/${LDSO_NAME}.path"
changed || exit 0
X=$(mktemp -p /tmp ${LDSO_NAME}.XXXXXX)
for d in ${drs}; do
echo ${d} >> ${X}
done
chmod 644 ${X}
# busybox doesn't support mz -Z
cp ${X} ${ETC_LDSO_PATH}
rm ${X}