auto_modules ()
{
    aliases=$(find /sys/devices/ -name modalias -exec cat {} \;)
    modprobe --show-depends -a $aliases 2>/dev/null |\
        sed "s|insmod \(.*\)|\1|" | grep ${@} | sort -u
}

all_modules ()
{
    find ${MODULEDIR} -name *.ko 2>/dev/null |\
        grep ${@} | sort -u
}

msg() { [ "${QUIET}" = "n" ] && echo "${@}"; }
err() { echo "ERROR: ${@}" >&2; }

add_dir()
{
    if [ "x${1}" != "x" -a "${1}" != "/" ]; then

        if ! grep "dir ${1} " "${FILELIST}" 2>&1 > /dev/null; then
            add_dir $(dirname "${1}")
            msg "  adding  dir ${1}"
            echo "dir ${1} 755 0 0" >> "${FILELIST}"
        fi
    fi
}

# add_devnode /dev/foo type major minor [permissions]
add_device()
{
    if [ $# -ge 4 ]; then
        local perms
        perms="${5:-644}"
        if ! grep "nod ${1}" "${FILELIST}" 2>&1 > /dev/null; then
			add_dir $(dirname "${1}")
            msg "  adding node ${1}"
            echo "nod ${1} ${perms} 0 0 ${2} ${3} ${4}" >> "${FILELIST}"
        fi
    else
        err "invalid device node format: $@"
        return 1
    fi
}

add_symlink ()
{
    local fil dest dir
    if [ -L ${1} ]; then
        fil="${1}"
        dest="${fil##$BASEDIR}"
        add_dir $(dirname "${dest}")
        if ! grep "slink ${dest} " "${FILELIST}" 2>&1 > /dev/null; then
            msg "  adding symlink ${dest}"
            echo "slink ${dest} ${fil} $(stat -c '%a %u %g' ${fil})" >> "${FILELIST}"
        fi
    fi
	#fail quietly
}

add_file ()
{
    local fil lnk dir dest
    if [ -e "${1}" ]; then
        fil="${1}"
        lnk=$(readlink -f "${fil}")
        if [ -n "${lnk}" ]; then
            add_symlink "${fil}"
            fil="${lnk}"
        fi
        if [ $# -eq 2 ]; then
            dest="${2}"
        else
            dest="${fil##$BASEDIR}"
        fi

        add_dir $(dirname "${dest}")

        if ! grep "file ${dest} " "${FILELIST}" 2>&1 > /dev/null; then
            msg "  adding file ${dest}"
            echo "file ${dest} ${fil} $(stat -c '%a %u %g' ${fil})" >> "${FILELIST}"
        fi
    else
        err "file '${1}' does not exist"
        return 1
    fi
}

HAS_MODULES="n"
add_module()
{
    local fil path mod deps
    #cleanup - remove .ko, replace - and _ with [-_] to match either
    fil=$(basename "${1}" | sed -e "s|[-_]|\[-_\]|g" -e "s|\.ko$||g")

    for path in $(find "${MODULEDIR}" -type f -name "${fil}.ko"); do
        for mod in $(modinfo -F depends "${path}" | tr ',' ' '); do
            if [ "x${mod}" != "x" ]; then
                add_module "${mod}"
                HAS_MODULES="y"
            fi
        done
        add_file "${path}"
    done
}

add_binary()
{
    local bin type lib
    bin=$(which "${1}")
    if [ $? -ne 0 ]; then
        bin="${1}"
    fi

    if [ ! -f "${bin}" ]; then
        err "'${bin}' is not a file"
        return 1
    fi

    if [ $? -eq 0 ]; then
        type=$(file -b "${bin}")
        case "${type}" in
            *script*)
            msg "   adding '${type}' script, ensure proper interp exists..."
            add_file "${bin}"
            ;;
            *executable*)
            add_file "${bin}"
            #note, this will also handle 'not a dynamic executable' spit out by
            # static binaries... the deps will produce nothing
            for lib in $(ldd ${bin} 2>/dev/null | sed "s|.*=>\(.*\)|\1|"); do
                if [ "x${lib}" != "x" ]; then
                    #remove TLS libraries
                    notls=$(echo ${lib} | sed 's|/lib/tls.*/\(lib.*\)|/lib/\1|')
                    [ -e "${notls}" ] && lib="${notls}"
                    [ -f "${lib}" ] && add_file "${lib}"
                fi
            done
            ;;
            *)
            err "unknown type '${type}' for binary '${bin}'"
            return 1
            ;;
        esac
    fi
}

parse_hook()
{
    local mod bin fil
    for mod in $MODULES; do
        if [ "x${mod}" != "x" ]; then
            add_module "${mod}"
        fi
    done

    for bin in $BINARIES; do
        if [ "x${bin}" != "x" ]; then
            add_binary "${bin}"
        fi
    done

    for fil in $FILES; do
        if [ "x${fil}" != "x" ]; then
            add_file "${fil}"
        fi
    done

	if [ "x${SCRIPT}" != "x" ]; then
		add_file "${HOOKDIR}/${SCRIPT}" "/hooks/${SCRIPT}"
	fi
}
# vim: set ft=sh ts=4 sw=4 noet: