#!/bin/dash
# jamesbond 2015
# MIT license
#
# Usage $1-deb $2-path to decompress
#

usage() {
	cat << EOF
Usage: undeb [options] /path/to/deb.deb dir-to-decompress
Options are:
    -x extract package contents (default)
    -X extract package contents, verbose
    -c list package contents
    -e extract package control files
EOF
	exit 1;
}

### args processing
DEB= TGT= CMD= VERBOSE=
for p; do 
	# process the same option as busybox dpkg-deb
	case "$p" in
		-c) CMD=list ;;
		-e) CMD=extract-control ;;
		-x) CMD=extract ;;
		-X) CMD=extract VERBOSE=v ;;
		-h) usage ;;
		*) [ -z "$DEB" ] && DEB="$p" && continue ||
		   [ -z "$TGT" ] && TGT="$p" ;;
	esac
done
#echo $CMD-$VERBOSE-$DEB-$TGT
[ -z "$CMD" ] && CMD=extract
if ! [ "$DEB" ] || ! [ "$TGT" ]; then usage; fi
! [ -d "$TGT" ] && echo "$TGT does not exist." && exit 2

### which AR to use
[ -z $AR ] && type ar > /dev/null && AR="ar"
[ -z $AR ] && type busybox > /dev/null && AR="busybox ar"
[ -z $AR ] && echo "Cannot find 'ar', needed to work." && exit 3

### do work
DEB="$(readlink -f "$DEB")"
cd "$TGT"

# BB ar can use "control.tar.*" etc., but full ar requires exact filenames
CONTROL_FILE="$($AR -t "$DEB" | grep -i '^control\.tar')"
DATA_FILE="$($AR -t "$DEB" | grep -i '^data\.tar')"

if type bsdtar > /dev/null 2>&1; then	# bsdtar can uncompress stdin without an explicit compression filter
	case $CMD in
		extract) $AR -p "$DEB" "$DATA_FILE" | bsdtar -${VERBOSE}xf - ;;
		extract-control) $AR -p "$DEB" "$CONTROL_FILE" | bsdtar -xf - ;;
		list) $AR -p "$DEB" "$DATA_FILE" | bsdtar -tf - ;;
	esac
else
	case $CMD in
		extract) $AR -p "$DEB" "$DATA_FILE" > "$DATA_FILE"; tar -${VERBOSE}xf "$DATA_FILE" ;;
		extract-control) $AR -p "$DEB" "$CONTROL_FILE" > "$CONTROL_FILE"; tar -xf "$CONTROL_FILE" ;;
		list) $AR -p "$DEB" "$DATA_FILE" > "$DATA_FILE"; tar -tf "$DATA_FILE" ;;
	esac
	rm -f "$CONTROL_FILE" "$DATA_FILE"
fi
