#!/bin/bash -e
# Check Checksums
# Christoph Lameter <clameter@debian.org> Feb 9, 1997

function checksum() {
	cd /
	if [ -f $1conffiles -a "$C_ALL" = "" ]; then
		CF=`cat $1conffiles|cut -c 2-`
		grep -Fv "$CF" <$1md5sums | md5sum -c$VOPT 2>&1 || RC=1
	else
		md5sum -c$VOPT $1md5sums 2>&1 || RC=1
	fi
}

if [ "$1" = "-l" ]; then
	echo "Checking for packages without md5sums list:"
	for i in /var/lib/dpkg/info/*.list; do
		PACKAGE="`expr $i : '/var/lib/dpkg/info/\(.*\)\.list'`"
		if [ ! -f /var/lib/dpkg/info/$PACKAGE.md5sums ]; then
			echo "$PACKAGE"
		fi
	done
	echo
	echo done.
	exit 0
fi

if [ "$1" = "-a" ]; then
	C_ALL=1
	shift
fi

RC=0
VOPT="v"
if [ "$1" = "-s" ]; then
	VOPT=""
	shift
fi

if [ "$1" = "" ]; then
	for i in /var/lib/dpkg/info/*.md5sums; do
		if [ "$VOPT" ]; then
			echo "-- Checksums from $i"
		fi
		checksum `expr $i : "\(.*\.\).*"` || echo "Checking against $i failed"
	done
fi

for i in $*; do
        if expr "$i" : ".*\.deb" >/dev/null; then
                if [ -f $i ]; then
                        WORKDIR=`mktemp -u /tmp/debsumXXXXXX` || exit 1
                        mkdir --mode=0700 $WORKDIR || exit 1
                        dpkg-deb --control $i $WORKDIR
                        if [ -f $WORKDIR/md5sums ]; then
				checksum $WORKDIR/
                        else
                                echo "Package $i has no checksums file"
                                rm -rf $WORKDIR
                                exit 1
                        fi
                        rm -rf $WORKDIR
                        exit 0
                else
                        echo "Package $i not found"
                        exit 1
                fi
        else
		F=/var/lib/dpkg/info/$i
		if [ -f $F.md5sums ]; then
			checksum $F.
		else
			if [ ! -f $F.list ]; then
				echo "Package $i is not installed"
			else
				echo "Package $i did not come with checksums"
			fi
		fi
	fi
done

exit $RC
