#!/bin/sh
#130402 sfs

extract_rpm ()
{
	leadsize=96
	o=`expr $leadsize + 8`
	set `od -j $o -N 8 -t u1 $pkg`
	il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
	dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`

	sigsize=`expr 8 + 16 \* $il + $dl`
	o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
	set `od -j $o -N 8 -t u1 $pkg`
	il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
	dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
	hdrsize=`expr 8 + 16 \* $il + $dl`
	o=`expr $o + $hdrsize`
}

mc_tmp () {
	TMP_DIR="`mktemp -d`"
#	TMP_DIR="/tmp/mc_rpm_temp"
#	[ ! -d $TMP_DIR ] && mkdir $TMP_DIR
	cd "$TMP_DIR"
#	dd if=$1 ibs=$o skip=1 2>/dev/null | bsdtar -xf - 
}
	
mc_list () {
    mc_tmp "$1"
	dd if="$1" ibs=$o skip=1 2>/dev/null | xz -d 2>/dev/null | cpio -i -d 2>/dev/null || \
	dd if="$1" ibs=$o skip=1 2>/dev/null | gzip -d| cpio -i -d 2>/dev/null 

T() {
	tar cf - . |tar -tvf - | awk '
{
	sub("/", " ", $2)
	date = substr($4, 6, 2) "-" substr($4, 9, 2) "-" substr($4, 1, 4) " " $5
	name = $6
	{if($7 != ""){name = name " " $7}}
	{if($8 != ""){name = name " " $8}}
	{if($9 != ""){name = name " " $9}}
	{if($10 != ""){name = name " " $10}}
	{if($11 != ""){name = name " " $11}}
	{if($12 != ""){name = name " " $12}}
	{if($13 != ""){name = name " " $13}}
	printf "%s 1 %s %s %s %s\n", $1, $2, $3, date, name
}'
}
mcls
	[ -d "$TMP_DIR" ] && rm -r "$TMP_DIR"
}

mc_copyout () {
    mc_tmp "$1"
	dd if="$1" ibs=$o skip=1 2>/dev/null | xz -d 2>/dev/null | cpio -i -d 2>/dev/null || \
	dd if="$1" ibs=$o skip=1 2>/dev/null | gzip -d| cpio -i -d 2>/dev/null 
	
#	dd if="$pkg" ibs=$o skip=1 2>/dev/null | xz   -d 2>/dev/null | cpio -i -d ./$2 2>/dev/null || \
#	dd if="$pkg" ibs=$o skip=1 2>/dev/null | gzip -d 2>/dev/null | cpio -i -d ./$2 2>/dev/null
	mv "$TMP_DIR"/"$2" "$3"
	[ -d "$TMP_DIR" ] && rm -r "$TMP_DIR"
}

LC_ALL=C

cmd="$1"
shift

pkg="$1"
#pkg="`realpath "$1"`"
extract_rpm "$pkg"

case "$cmd" in
  list)
    mc_list "$@";
    exit 0;;
  copyout)
    mc_copyout "$@";
    exit 0;;
esac
exit 1
