#!/bin/sh
#v10.1.2
globalconf="${workdir}/cbsd.conf";
MYARG=""
MYOPTARG="ver stable rev scmbase dst apply_cbsd_patch"
MYDESC="Apply CBSD patch for FreeBSD source tree in $srcdir"
ADDHELP="ver=head for current.\n\
stable=1 for STABLE_X\n\
rev=XXX where XXX - svn revision\n\
scmbase - alternative svn base URL\n\
dst - alternative dst dir\n\
apply_cbsd_patch=[1,0] overwrite srcup.conf settings\n"

set -e
. ${globalconf}
set +e

. ${subr}

init $*

[ -n "${apply_cbsd_patch}" ] && oapply_cbsd_patch="${apply_cbsd_patch}"

readconf srcup.conf

over="${ver}"
oarch="${arch}"
# restore args value
[ -n "${oapply_cbsd_patch}" ] && apply_cbsd_patch="${oapply_cbsd_patch}"

patch_kmem110()
{
	local _dir="kmem-11.0"
	set +e
	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-kern-kern_jail.c patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm-drmP.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-jail.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-priv.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	set -e
}

patch_kmem111()
{
	local _dir="kmem-11.1"
	set +e
	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-kern-kern_jail.c patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm-drmP.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-jail.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-priv.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	set -e
}

patch_kmem120()
{
	local _dir="kmem-12.0"
	set +e

	if [ -f "${dst}/sys/kern/kern_jail.c" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-kern-kern_jail.c patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c
	fi

	if [ -f "${dst}/sys/dev/drm/drmP.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm-drmP.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h
	fi

	if [ -f "${dst}/sys/dev/drm2/drmP.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h
	fi

	if [ -f "${dst}/sys/sys/jail.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-jail.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h
	fi

	if [ -f "${dst}/sys/sys/priv.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-priv.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	fi

	if [ -f "${dst}/sys/dev/drm/drm_os_freebsd.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drm_os_freebsd.h >/dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm-drm_os_freebsd.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drm_os_freebsd.h
	fi

	set -e
}

patch_kmem102()
{
	local _dir="kmem-10.2"
	set +e
	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-kern-kern_jail.c patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm-drmP.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-jail.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-11x-sys-sys-priv.h patch for: ${GREEN}allow_kmem${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	set -e
}

patch_9p()
{
	local _dir="p9"
	set +e

	if [ ! -r ${dst}/contrib/lib9p/Makefile ]; then
		# upstream here: https://github.com/freenas/lib9p
		${ECHO} "${MAGENTA}clone https://github.com/olevole/lib9p.git into ${GREEN}${dst}/contrib/libp9${NORMAL}"
		git clone https://github.com/olevole/lib9p.git ${dst}/contrib/lib9p
	fi

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-12x-etc-mtree-BSD.include.dist" ] && cd ${dst}/etc/mtree/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-12x-etc-mtree-BSD.include.dist > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-etc-mtree-BSD.include.dist patch for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-etc-mtree-BSD.include.dist

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-12x-lib-Makefile" ] && cd ${dst}/lib/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-12x-lib-Makefile > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-lib-Makefile patch for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-lib-Makefile

	[ ! -d ${dst}/lib/lib9p ] && mkdir -p ${dst}/lib/lib9p

	if [ ! -r ${dst}/lib/lib9p/Makefile ]; then
		cd ${dst}/lib/lib9p/
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-lib-lib9p-Makefile for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-lib-lib9p-Makefile
	fi

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-12x-share-mk-bsd.libnames.mk" ] && cd ${dst}/share/mk/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-12x-share-mk-bsd.libnames.mk > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-share-mk-bsd.libnames.mk patch for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-share-mk-bsd.libnames.mk

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-12x-share-mk-src.libnames.mk" ] && cd ${dst}/share/mk/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-12x-share-mk-src.libnames.mk > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-share-mk-src.libnames.mk patch for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-share-mk-src.libnames.mk

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-12x-usr.sbin-bhyve-Makefile" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-12x-usr.sbin-bhyve-Makefile > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-usr.sbin-bhyve-Makefile patch for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-usr.sbin-bhyve-Makefile

	if [ ! -r ${dst}/usr.sbin/bhyve/pci_virtio_9p.c ]; then
		cd ${dst}/usr.sbin/bhyve
		[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-lib-lib9p-Makefile for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-usr.sbin-bhyve-pci_virtio_9p.c
	fi

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-12x-usr.sbin-bhyve-virtio.h" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${distdir}/upgrade/patch/${_dir}/patch-12x-usr.sbin-bhyve-virtio.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${MAGENTA}apply patch-12x-usr.sbin-bhyve-virtio.h patch for: ${GREEN}p9${NORMAL}" && patch < ${distdir}/upgrade/patch/${_dir}/patch-12x-usr.sbin-bhyve-virtio.h

	set -e
}

apply_cbsd_patchset()
{
	case "${ver}" in
		10.0)
			${ECHO} "${MAGENTA}kmem patchset for ${GREEN}${ver}${MAGENTA} unsupported${NORMAL}"
			return 0
			;;
		10.1)
			${ECHO} "${MAGENTA}kmem patchset for ${GREEN}${ver}${MAGENTA} unsupported${NORMAL}"
			return 0
			;;
		10.2)
			# support for FreeBSD 10.2+
			patch_kmem102
			;;
		10*)
			# support for FreeBSD 10.2+
			patch_kmem102
			;;
		11.0)
			patch_kmem110
			;;
		11.1)
			patch_kmem111
			;;
		12*)
			patch_kmem120
			;;
	esac

	return 0
}

### MAIN ###
. ${buildconf}
readconf buildworld.conf
. ${workdir}/universe.subr

init_target_arch
init_srcdir
init_supported_arch

set +e
. ${buildconf}
set -e

if [ -n "${dst}" ]; then
	dst="${srcdir}/src_${ver}/src"
else
	dst="${SRC_DIR}"
fi

if [ "${apply_cbsd_patch}" = "1" ]; then
	apply_cbsd_patchset
else
	${ECHO} "${MAGENTA}Skip for additional CBSD patchset: ${GREEN}apply_cbsd_patch${MAGENTA} set to ${GREEN}0${NORMAL}"
fi

if [ "${apply_cbsd_9p_patch}" = "1" ]; then
	patch_9p
fi
