#!/bin/sh -efu

fhs_config='/etc/sisyphus_check/fhs'

rpm_name="${rpm_name?RPM name required}"
rpm_filenames="${rpm_filenames?RPM file list required}"

fhs_exceptions()
{
	grep '^[^#].*[[:space:]].*/' "$fhs_config" |
	while read -r pkgname_pattern filename_re; do
		case "$rpm_name" in
			$pkgname_pattern) ;;
			*) continue ;;
		esac
		printf '%s\n' "$filename_re"
	done
}

# check for FHS violations
check_fhs()
{
	local f="$1" && shift || return 1

	# Do not check filesystem package.
	[ "$rpm_name" != filesystem ] || return 0

	local rc=0
	local fhs_re='^/(bin|boot|etc|lib(64)?|sbin|usr/(bin|etc|games|include|lib(exec|64)?|sbin|share|src)|var/(cache|games|lib|lock|log|run|spool|www|yp))/.*'
	local filenames bad_filenames except_re

	# Check packaged files.
	# NB: extra grep to exclude source packages.
	if [ -n "$rpm_filenames" ] &&
	   filenames=$(printf '%s\n' "$rpm_filenames" |grep '^/') &&
	   bad_filenames=$(printf '%s\n' "$filenames" |egrep -v -e "$fhs_re"); then
		except_re=$(fhs_exceptions)
		if [ -z "$except_re" ] ||
		   bad_filenames=$(printf '%s\n' "$bad_filenames" |egrep -v -e "$except_re"); then
			FileError "FHS violations: $(oneliner "$bad_filenames")" "$f"
			rc=1
		fi
	fi

	# Check provided paths.
	if [ -n "$rpm_provides" ] &&
	   filenames=$(printf '%s\n' "$rpm_provides" |grep -o '^/[^[:space:]]*') &&
	   bad_filenames=$(printf '%s\n' "$filenames" |egrep -v -e "$fhs_re"); then
		except_re=$(fhs_exceptions)
		if [ -z "$except_re" ] ||
		   bad_filenames=$(printf '%s\n' "$bad_filenames" |egrep -v -e "$except_re"); then
			FileError "FHS violations: provides $(oneliner "$bad_filenames")" "$f"
			rc=1
		fi
	fi

	return $rc
}

run_check() {
	if ! check_fhs "$1"; then
		CheckError 'FHS violation'
		return 1
	fi
}
