File kgraft-rpm-helper of Package kgraft

#!/bin/bash

USAGE="$0 <check|install|remove> <package-version-release>"

if test "$1" = "-h" -o "$1" = "--help"; then
	echo "$USAGE"
	exit 0
fi
if test "$#" -ne 2; then
	echo "$USAGE" >&2
	exit 1
fi

cmd=$1
package=$2
shopt -s nullglob

do_check()
{
	local dir pid pids=() status
	local proc_mounted=false kgr_supported=false read_ok=true

	if test -e /.buildenv; then
		echo "Skipping kGraft patches in buildroot"
		return 0
	fi
	for dir in /proc/*; do
		proc_mounted=true
		pid=${dir##*/}
		case "$pid" in
		*[^0-9]*)
			continue
		esac
		if test ! -f "$dir/kgr_in_progress"; then
			continue
		fi
		kgr_supported=true
		status=$(< "$dir/kgr_in_progress")
		if test $? -ne 0; then
			read_ok=false
			continue
		fi
		if test "$status" -ne 0; then
			pids[${#pids[@]}]=$pid
		fi
	done
	if ! $proc_mounted; then
		echo "Warning: /proc is not mounted" >&2
		return 0
	fi
	if ! $kgr_supported; then
		echo "Warning: the running kernel does not have kGraft support" >&2
		return 0
	fi
	if ! $read_ok; then
		echo "Warning: could not read some files in /proc"
	fi
	if test ${#pids[@]} -ne 0; then
		echo "Error: following processes have not finished a previous kGraft patch yet:" >&2
		echo "${pids[@]}" >&2
		return 1
	fi
}

package_krel()
{
	local package=$1 nv krel flavor

	nv=${package%-*}
	flavor=${nv%-*}
	flavor=${flavor##*-}
	krel=${nv##*-}
	krel=${krel/_/-}-$flavor

	echo "$krel"
}

refresh_initrd()
{
	local krel=$1 image

	/sbin/depmod -F "/boot/System.map-$krel" -e "$krel" || return
	# copied from weak-modules2
	for image in vmlinuz image vmlinux linux bzImage uImage Image; do
		if test -f "/boot/$image-$krel"; then
			mkdir -p /var/run/regenerate-initrd
			touch "/var/run/regenerate-initrd/$image-$krel"
			break
		fi
	done
}

do_install()
{
	local krel mod modules err

	if test -e /.buildenv; then
		return 0
	fi

	krel=$(package_krel "$package")
	refresh_initrd "$krel"
	if test "$(uname -r)" != "$krel"; then
		return 0
	fi
	err=0
	modules=($(rpm -ql "$package" | sed -rn 's:.*/(kgraft-patch[^/]*)\.ko$:\1:p'))
	for mod in "${modules[@]}"; do
		echo "[kGraft] Loading $mod"
		modprobe "$mod" || err=$?
	done
	return $err
}

do_remove()
{
	local krel

	if test -e /.buildenv; then
		return 0
	fi

	krel=$(package_krel "$package")
	refresh_initrd "$krel"
}

case "$cmd" in
check|install|remove)
	do_$cmd "$package"
	exit
	;;
*)
	echo "$USAGE" >&2
	exit 1
esac
openSUSE Build Service is sponsored by