#!/usr/bin/env bash

# This script scans $(HOST_DIR)/{bin,sbin} for all ELF files, and checks
# they have an RPATH to $(HOST_DIR)/lib if they need libraries from
# there.

# Override the user's locale so we are sure we can parse the output of
# readelf(1) and file(1)
export LC_ALL=C

main() {
    local pkg="${1}"
    local hostdir="${2}"
    local file ret

    # Remove duplicate and trailing '/' for proper match
    hostdir="$( sed -r -e 's:/+:/:g; s:/$::;' <<<"${hostdir}" )"

    ret=0
    while read file; do
        is_elf "${file}" || continue
        elf_needs_rpath "${file}" "${hostdir}" || continue
        check_elf_has_rpath "${file}" "${hostdir}" && continue
        if [ ${ret} -eq 0 ]; then
            ret=1
            printf "***\n"
            printf "*** ERROR: package %s installs executables without proper RPATH:\n" "${pkg}"
        fi
        printf "***   %s\n" "${file}"
    done < <( find "${hostdir}"/{bin,sbin} -type f 2>/dev/null )

    return ${ret}
}

is_elf() {
    local f="${1}"

    readelf -l "${f}" 2>/dev/null \
    |grep -E 'Requesting program interpreter:' >/dev/null 2>&1
}

elf_needs_rpath() {
    local file="${1}"
    local hostdir="${2}"
    local lib

    while read lib; do
        [ -e "${hostdir}/lib/${lib}" ] && return 0
    done < <( readelf -d "${file}"                                         \
              |sed -r -e '/^.* \(NEEDED\) .*Shared library: \[(.+)\]$/!d;' \
                     -e 's//\1/;'                                          \
            )

    return 1
}

check_elf_has_rpath() {
    local file="${1}"
    local hostdir="${2}"
    local rpath dir

    while read rpath; do
        for dir in ${rpath//:/ }; do
            # Remove duplicate and trailing '/' for proper match
            dir="$( sed -r -e 's:/+:/:g; s:/$::;' <<<"${dir}" )"
            [ "${dir}" = "${hostdir}/lib" -o "${dir}" = "\$ORIGIN/../lib" ] && return 0
        done
    done < <( readelf -d "${file}"                                              \
              |sed -r -e '/.* \(R(UN)?PATH\) +Library r(un)?path: \[(.+)\]$/!d' \
                      -e 's//\3/;'                                              \
            )

    return 1
}

main "${@}"
