#!/usr/local/bin/cbsd
#v10.1.0
MYARG="jname part mode"
MYOPTARG="out hdrver"
MYDESC="Pack or extract chunk from from image"
ADDHELP="out=path_to_file for ascii-part or directory to extract for binary\n\
or for binary image from pack mode\n\
part variants: header,rcconf,fstab,pkginfo,descr,info,sysdata,data\n\
mode=pack,extract\n"

. ${subrdir}/nc.subr

. ${cbsdinit}

extractchunk()
{
	local _dir

	if [ -n "${out}" ]; then
		_dir=$( /usr/bin/dirname ${out} )
		if [ ! -d "${_dir}" ]; then
			/bin/mkdir ${_dir}
			/usr/sbin/chown ${cbsduser}:${cbsduser} ${_dir}
		fi
	fi

	if [ $BINARY -eq 0 ]; then
		if [ -n "${out}" ]; then
			if [ "$END" != "0" ]; then
				/usr/bin/tail -n +${FROM} ${SRC} | head -n${END} > ${out}
			else ##this is empty file
				/usr/bin/touch ${out}
			fi
		else
			/usr/bin/tail -n +${FROM} ${SRC} | /usr/bin/head -n${END}
		fi
	else
		[ -z "${out}" ] && out=$( pwd )
		/usr/bin/tail +${FROM} ${SRC} | tar xpf - -C "${out}" --numeric-owner
	fi
}

# $hdrver used for determine correct struct of header
extractme()
{
	local _imgpart=0

	if [ -f "${jname}" ]; then
		SRC="${jname}"
	else
		SRC="${importdir}/${jname}.img"
		[ ! -f ${SRC} ] && err 1 "${N1_COLOR}No such image: ${N2_COLOR}${SRC}${N0_COLOR}"
	fi

	[ -n "${hdrver}" ] && _imgpart=$1

	DEST="${DATA}/${jname}"

	SPACER="___NCSTART_"
	BINARY=0
	END=0

	case "${part}" in
		"header")
			FROM="$( ${AWK_CMD} '/^___NCSTART_HEADER=1/ { print NR + 1; exit 0; }' ${SRC} )"
			TO="$( ${AWK_CMD} '/^___NCSTART_RCCONF=1/ { print NR + 1; exit 0; }' ${SRC} )"
			END=$((TO - FROM -1))
			;;
		"rcconf")
			FROM="$( ${AWK_CMD} '/^___NCSTART_RCCONF=1/ { print NR + 1; exit 0; }' ${SRC} )"
			TO="$( ${AWK_CMD} '/^___NCSTART_FSTAB=1/ { print NR + 1; exit 0; }' ${SRC} )"
			END=$((TO - FROM -1))
			;;
		"fstab")
			FROM="$( ${AWK_CMD} '/^___NCSTART_FSTAB=1/ { print NR + 1; exit 0; }' ${SRC} )"
			TO="$( ${AWK_CMD} '/^___NCSTART_PKGINFO=1/ { print NR + 1; exit 0; }' ${SRC} )"
			END=$((TO - FROM -1))
			;;
		"pkginfo")
			FROM="$( ${AWK_CMD} '/^___NCSTART_PKGINFO=1/ { print NR + 1; exit 0; }' ${SRC} )"
			TO="$( ${AWK_CMD} '/^___NCSTART_DESCR=1/ { print NR + 1; exit 0; }' ${SRC} )"
			END=$((TO - FROM -1))
			;;
		"descr")
			FROM="$( ${AWK_CMD} '/^___NCSTART_DESCR=1/ { print NR + 1; exit 0; }' ${SRC} )"
			TO="$( ${AWK_CMD} '/^___NCSTART_INFO=1/ { print NR + 1; exit 0; }' ${SRC} )"
			END=$((TO - FROM -1))
			;;
		"info")
			FROM="$( ${AWK_CMD} '/^___NCSTART_INFO=1/ { print NR + 1; exit 0; }' ${SRC} )"
			if [ ${_imgpart} -ge 2 ]; then
				TO="$( ${AWK_CMD} '/^___NCSTART_LOCALFSTAB=1/ { print NR + 1; exit 0; }' ${SRC} )"
			else
				TO="$( ${AWK_CMD} '/^___NCSTART_SYSDATA=1/ { print NR + 1; exit 0; }' ${SRC} )"
			fi
			END=$((TO - FROM -1))
			;;
		"localfstab")
			FROM="$( ${AWK_CMD} '/^___NCSTART_LOCALFSTAB=1/ { print NR + 1; exit 0; }' ${SRC} )"
			TO="$( ${AWK_CMD} '/^___NCSTART_SYSDATA=1/ { print NR + 1; exit 0; }' ${SRC} )"
			END=$((TO - FROM -1))
			;;
		"sysdata")
			FROM="$( ${AWK_CMD} '/^___NCSTART_SYSDATA=1/ { print NR + 1; exit 0; }' ${SRC} )"
			TO="$( ${AWK_CMD} '/^___NCSTART_DATA=1/ { print NR + 1; exit 0; }' ${SRC} )"
			BINARY=1
			END=0
			;;
		"data")
			FROM="$( ${AWK_CMD} '/^___NCSTART_DATA=1/ { print NR + 1; exit 0; }' ${SRC} )"
			BINARY=1
			END=0
			;;
	esac

	if ! is_number ${FROM}; then
		[ $FROM -ge 0 ] && extractchunk
	else
		err 1 "${N1_COLOR}Error: image has no FROM/TO symbols. Looks like wrong format version or it is not CBSD image: ${N2_COLOR}${jname}${N0_COLOR}"
	fi
}


# MAIN
# cwd necessary for the relative actions
cd ${workdir}

case "$mode" in
	extract)
		extractme
		;;
	pack)
		[ -z "$out" ] && err 1 "${N1_COLOR}out=tofile is mandatory${N0_COLOR}"
		packme
		;;
esac
