pmaports/main/ldpath/ldpath.sh
Robert Yang 75feba5476
New aport ldpath
Utility to add or remove paths from musl dynamic linker config file
2018-11-27 07:47:11 +01:00

168 lines
3.3 KiB
Bash

#!/bin/sh
#
# Add or remove paths from musl dynamic linker
# path file (/etc/ld-musl-$ARCH.path)
#
# usage example:
# $ ldpath.sh add /usr/lib/libdrm-grate
default_ld_paths() {
echo "/lib:/usr/local/lib:/usr/lib"
}
###############################################
# Processor arch in the convention used by the
# musl dynamic linker.
# See musl source code: ldso/dynlink.c
# Arguments:
# kernel machine hardware name (uname -m)
# Returns:
# musl ldso processor arch
###############################################
kernel_arch_to_ldso_arch() {
local karch=$1
local ld_arch=""
case "$karch" in
armv7l)
ld_arch=armhf
;;
*)
ld_arch="$karch"
;;
esac
echo "$ld_arch"
}
default_ld_musl_file() {
local ld_arch
ld_arch=$(kernel_arch_to_ldso_arch "$(uname -m)")
echo "/etc/ld-musl-${ld_arch}.path"
}
###############################################
# Prepend a path to dynamic linker path file
# Arguments:
# Shared library directory
# ld musl path file
###############################################
add_path() {
local ld_library_path=$1
local ld_musl_file=$2
# Don't allow duplicates
if [ -f "$ld_musl_file" ]; then
if grep -q "$ld_library_path" "$ld_musl_file"; then
return 0
fi
fi
if [ -f "$ld_musl_file" ]; then
echo "${ld_library_path}:$(cat "$ld_musl_file")" > \
"$ld_musl_file"
else
echo "${ld_library_path}:$(default_ld_paths)" > "$ld_musl_file"
fi
}
###############################################
# Remove a path from dynamic linker path file
# Arguments:
# Shared library directory
# ld musl path file
###############################################
remove_path() {
local ld_library_path=$1
local ld_musl_file=$2
local conf
if [ ! -f "$ld_musl_file" ]; then
return 0
fi
# Don't remove default paths
if default_ld_paths | grep -q "$ld_library_path"; then
return 0
fi
conf=$(awk -v ld_path="$ld_library_path" '{n=split($0, array, ":")} END {
for (i in array) {
if (array[i]!=ld_path) {
printf array[i]
if (i<n)
printf ":"
}
}
}' < "$ld_musl_file")
echo "$conf" > "$ld_musl_file"
}
print_usage() {
local ld_arch
ld_arch=$(kernel_arch_to_ldso_arch "$(uname -m)")
echo "usage: $(basename "$1") [-h] [-f FILE] {add,remove} LD_LIBRARY_PATH"
echo ""
echo "Add or remove LD_LIBRARY_PATH in $(default_ld_musl_file)"
echo ""
echo "optional arguments:"
echo " -h, --help show this help message and exit"
echo " -f, --file override ld musl path file"
}
parse_args() {
local have_file_arg=""
while [ "${1:-}" != "" ]; do
case $1 in
add|remove)
ldpath_func="$1"
ldpath_arg="$2"
shift
shift
;;
-f|--file)
have_file_arg="1"
ld_musl_file="$2"
shift
shift
;;
-h|--help)
shift
return 0
;;
*)
echo "Invalid argument: $1"
shift
return 0
;;
esac
done
if [ -z "$ldpath_func" ] || [ -z "$ldpath_arg" ]; then
return 0
fi
if [ "$have_file_arg" = "1" ] &&
[ -z "$ld_musl_file" ]; then
return 0
fi
return 1
}
main() {
if [ -z "$ld_musl_file" ]; then
ld_musl_file=$(default_ld_musl_file)
fi
if [ "$ldpath_func" = "add" ]; then
add_path "$ldpath_arg" "$ld_musl_file"
elif [ "$ldpath_func" = "remove" ]; then
remove_path "$ldpath_arg" "$ld_musl_file"
fi
}
if parse_args "$@"; then
print_usage "$0"
return 1
fi
main "$0"