#!/bin/sh

set -e

uname_fixer() {
	local kvers src_dir mod_dir uname uname_fake uname_fake_relative uname_real
	kvers=$(ls /usr/src/kernels | head -n1)
	if [ "$kvers" = '' ]; then
		echo "$0: uname_fixer: no kernel found."
		return
	fi
	uname="/usr/bin/uname"
	uname_fake_relative="uname-fake"
	uname_fake="${uname}-fake"
	uname_real="${uname}-real"
	if [ -r "${uname_fake}" ]; then
		echo "$0: $uname_fake already exists, not regerating wrapper for $kvers".
		return
	fi
	if [ -r "${uname_real}" ]; then
		echo "$0: $uname_real already exists, not regerating wrapper for $kvers".
		return
	fi
	if [ ! -x "${uname}" ]; then
		echo "$0: $uname_real already exists, not regerating wrapper for $kvers".
		return
	fi
	src_dir="/usr/src/kernels/$kvers"
	mod_dir="/lib/modules/$kvers"
	if [ ! -d "$mod_dir" ]; then
		mkdir -p "$mod_dir"
		ln -s "$src_dir" "$mod_dir/build"
	fi
	cat >"$uname_fake" <<EOF
#!/bin/sh
UNAME_REAL="$uname_real"
RELEASE_WANTED="$kvers"
release=\`\$UNAME_REAL -r\`
output=\`\$UNAME_REAL "\$@"\`
rc=\$?
echo "\$output" | sed -e "s/\$release/\$RELEASE_WANTED/"
exit \$rc
EOF
	chmod +x "$uname_fake"
	mv "$uname" "$uname_real"
	ln -s "$uname_fake_relative" "$uname"

	echo "$0: uname_fixer: Set fake kernel to [$kvers]."
}

avoid_dracut() {
	mkdir -p /etc/dkms/framework.conf.d
	echo "post_transaction=" >/etc/dkms/framework.conf.d/nopost.conf
}

package="xpmem"
spec_file="$package.spec"
rpm_ver=$(awk '/Version:/ {print $2}' "$spec_file")
#rpm_rel="1"
tar_name="${package}-${rpm_ver}.tar.gz"
prefix="${package}-${rpm_ver}/"
topdir="topdir"
full_topdir=$(realpath "$topdir")
srcdir="$topdir/SOURCES"
tar_path="$srcdir/$tar_name"

rm -rf "$topdir"
mkdir -p "$srcdir"
git archive --prefix="$prefix" HEAD | gzip -9 > "$tar_path"
rpmbuild -ba --define "_topdir $full_topdir" "$spec_file"

dnf install -y dkms kernel-devel
uname_fixer
avoid_dracut
rpm -Uv "$topdir/RPMS"/*/*.rpm
