2006-07-13 16:02:34 +02:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
2006-07-14 18:17:08 +02:00
|
|
|
# $NetBSD: checksum,v 1.7 2006/07/14 16:17:08 jlam Exp $
|
2006-07-13 16:02:34 +02:00
|
|
|
#
|
|
|
|
# Copyright (c) 2006 The NetBSD Foundation, Inc.
|
|
|
|
# All rights reserved.
|
|
|
|
#
|
|
|
|
# This code is derived from software contributed to The NetBSD Foundation
|
|
|
|
# by Johnny C. Lam.
|
|
|
|
#
|
|
|
|
# Redistribution and use in source and binary forms, with or without
|
|
|
|
# modification, are permitted provided that the following conditions
|
|
|
|
# are met:
|
|
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer.
|
|
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
|
|
# documentation and/or other materials provided with the distribution.
|
|
|
|
# 3. All advertising materials mentioning features or use of this software
|
|
|
|
# must display the following acknowledgement:
|
|
|
|
# This product includes software developed by the NetBSD
|
|
|
|
# Foundation, Inc. and its contributors.
|
|
|
|
# 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
|
|
# contributors may be used to endorse or promote products derived
|
|
|
|
# from this software without specific prior written permission.
|
|
|
|
#
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
|
|
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
|
|
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
|
|
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
#
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
#
|
|
|
|
# NAME
|
|
|
|
# checksum -- checksum files
|
|
|
|
#
|
|
|
|
# SYNOPSIS
|
|
|
|
# checksum [options] distinfo [file ...]
|
|
|
|
#
|
|
|
|
# DESCRIPTION
|
|
|
|
# checksum will verify the checksums in the distinfo file for each
|
|
|
|
# of the files specified.
|
|
|
|
#
|
|
|
|
# OPTIONS
|
|
|
|
# -a algorithm Only verify checksums for the specified algorithm.
|
|
|
|
#
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
set -e # exit on errors
|
|
|
|
|
|
|
|
: ${DIGEST:=digest}
|
|
|
|
: ${CAT:=cat}
|
|
|
|
: ${ECHO:=echo}
|
|
|
|
: ${TEST:=test}
|
|
|
|
|
|
|
|
self="${0##*/}"
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
${ECHO} 1>&2 "usage: $self [-a algorithm] distinfo [file ...]"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Process optional arguments
|
|
|
|
algorithm=
|
|
|
|
while ${TEST} $# -gt 0; do
|
|
|
|
case "$1" in
|
|
|
|
-a) algorithm="$2"; shift 2 ;;
|
|
|
|
--) shift; break ;;
|
|
|
|
-*) ${ECHO} 1>&2 "$self: unknown option -- ${1#-}"
|
|
|
|
usage
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
*) break ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# Process required arguments
|
|
|
|
${TEST} $# -gt 0 || { usage; exit 1; }
|
|
|
|
distinfo="$1"; shift
|
2006-07-13 18:23:14 +02:00
|
|
|
files="$@"
|
2006-07-13 16:02:34 +02:00
|
|
|
|
|
|
|
if ${TEST} ! -f "$distinfo"; then
|
|
|
|
${ECHO} 1>&2 "$self: distinfo file missing: $distinfo"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
digestcmd=
|
2006-07-13 18:02:09 +02:00
|
|
|
case "${DIGEST}" in
|
2006-07-13 16:02:34 +02:00
|
|
|
/*)
|
2006-07-13 18:02:09 +02:00
|
|
|
if ${TEST} -x "${DIGEST}"; then
|
|
|
|
digestcmd="${DIGEST}"
|
2006-07-13 16:02:34 +02:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
SAVEIFS="$IFS"; IFS=:
|
|
|
|
for i in $PATH; do
|
|
|
|
if ${TEST} -x "$i/${DIGEST}"; then
|
|
|
|
digestcmd="$i/${DIGEST}"
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
IFS="$SAVEIFS"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
if ${TEST} -z "$digestcmd"; then
|
|
|
|
${ECHO} 1>&2 "$self: \`\`${DIGEST}'' is missing"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
{ exitcode=0
|
|
|
|
while read d_alg d_file d_equals d_checksum; do
|
|
|
|
case "$d_alg" in
|
|
|
|
"#"*) continue ;; # skip comments
|
|
|
|
"\$"*) continue ;; # skip RCS ID
|
|
|
|
"") continue ;; # skip empty lines
|
|
|
|
Size) continue ;; # skip lines holding filesizes, not checksums
|
|
|
|
esac
|
|
|
|
|
|
|
|
if ${TEST} -n "$algorithm"; then
|
|
|
|
${TEST} "$d_alg" = "$algorithm" || continue
|
|
|
|
fi
|
|
|
|
|
2006-07-13 17:48:07 +02:00
|
|
|
eval "tmp=\"\$_alg_${d_alg}\""
|
2006-07-13 18:23:14 +02:00
|
|
|
${TEST} -n "$tmp" || eval "_alg_${d_alg}=\"$files\""
|
2006-07-13 16:02:34 +02:00
|
|
|
|
2006-07-13 18:44:14 +02:00
|
|
|
for file in $files; do
|
2006-07-14 18:17:08 +02:00
|
|
|
${TEST} "$d_file" = "($file)" || continue
|
2006-07-13 16:02:34 +02:00
|
|
|
|
2006-07-13 17:48:07 +02:00
|
|
|
eval "tmp=\"\$_alg_${d_alg}\""
|
2006-07-13 16:02:34 +02:00
|
|
|
case "$tmp" in
|
|
|
|
"$file"|"$file "*) tmp_pre= ;;
|
|
|
|
*" $file") tmp_pre="${tmp%% $file}" ;;
|
|
|
|
*) tmp_pre="${tmp%% $file *} " ;;
|
|
|
|
esac
|
|
|
|
case "$tmp" in
|
|
|
|
"$file"|*" $file") tmp_post= ;;
|
|
|
|
"$file "*) tmp_post="${tmp##$file }" ;;
|
|
|
|
*) tmp_post="${tmp##* $file }" ;;
|
|
|
|
esac
|
|
|
|
tmp="${tmp_pre}${tmp_post}"
|
|
|
|
eval "_alg_${d_alg}=\"$tmp\""
|
|
|
|
|
|
|
|
if ${TEST} "$d_checksum" = "IGNORE"; then
|
|
|
|
${ECHO} 1>&2 "WARNING: Ignoring checksum for $file"
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
checksum=`${DIGEST} $d_alg < $file`
|
|
|
|
if ${TEST} "$d_checksum" = "$checksum"; then
|
|
|
|
${ECHO} "=> Checksum $d_alg OK for $file"
|
|
|
|
else
|
|
|
|
${ECHO} 1>&2 "ERROR: Checksum $d_alg mismatch for $file"
|
|
|
|
exitcode=1
|
|
|
|
fi
|
|
|
|
break
|
|
|
|
done
|
|
|
|
|
2006-07-13 17:48:07 +02:00
|
|
|
eval "tmp=\"\$_alg_${d_alg}\""
|
2006-07-13 16:02:34 +02:00
|
|
|
${TEST} -n "$tmp" || eval "_alg_${d_alg}=DONE"
|
|
|
|
done
|
|
|
|
if ${TEST} -n "$algorithm"; then
|
2006-07-13 17:48:07 +02:00
|
|
|
eval "tmp=\"\$_alg_${algorithm}\""
|
2006-07-13 18:23:14 +02:00
|
|
|
${TEST} -n "$tmp" || tmp="$files"
|
2006-07-13 16:02:34 +02:00
|
|
|
if ${TEST} "$tmp" != DONE; then
|
|
|
|
for file in $tmp; do
|
|
|
|
${ECHO} 1>&2 "ERROR: No $algorithm checksum recorded for $file"
|
|
|
|
exitcode=1
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
fi
|
2006-07-13 18:44:14 +02:00
|
|
|
exit $exitcode; } < $distinfo
|