--- /dev/null
+# md5sums -- lintian check script -*- perl -*-
+
+# Copyright (C) 1998 Christian Schwarz and Richard Braakman
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, you can find it on the World Wide
+# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+package Lintian::md5sums;
+use strict;
+use Tags;
+use Util;
+
+sub run {
+
+my $pkg = shift;
+my $type = shift;
+
+my $control = "control/md5sums";
+
+my %control_entry;
+my %info_entry;
+my %conffile;
+
+# read in md5sums info file
+open(C, '<', "md5sums") or fail("cannot open md5sums info file: $!");
+while (<C>) {
+ chop;
+ next if m/^\s*$/;
+ m/^(\S+)\s*(\S.*)$/ or fail("syntax error in md5sums info file: $_");
+ my $zzsum = $1;
+ my $zzfile = $2;
+ $zzfile =~ s,^(\./)?,,;
+ $info_entry{$zzfile} = $zzsum;
+}
+close(C);
+
+# read in conffiles
+if (-f "control/conffiles") {
+ open(C, '<', "control/conffiles")
+ or fail("cannot open control file conffiles: $!");
+ while (<C>) {
+ chop;
+ next if m/^\s*$/;
+ s,^/,,;
+ $conffile{$_} = 1;
+ }
+ close(C);
+}
+
+# Is there a md5sums control file?
+unless (-f $control) {
+ # ignore if package contains no files
+ return 0 if -z "md5sums";
+
+ # check if package contains non-conffiles
+ # debhelper doesn't create entries in md5sums
+ # for conffiles since this information would
+ # be redundant
+ my $only_conffiles = 1;
+ foreach my $file (keys %info_entry) {
+ unless ($conffile{$file}) {
+ $only_conffiles = 0;
+ last;
+ }
+ }
+
+ tag "no-md5sums-control-file", "" unless $only_conffiles;
+ return 0;
+}
+
+# Is it empty? Then skip it. Tag will be issued by control-files
+if (-z $control) {
+ return 0;
+}
+
+# read in md5sums control file
+open(C, '<', $control)
+ or fail("cannot open md5sums control file $control: $!");
+while (<C>) {
+ chop;
+ next if m/^\s*$/;
+ if (m{^([a-f0-9]+)\s*(?:\./)?(\S.*)$} && length($1) == 32) {
+ $control_entry{$2} = $1;
+ } else {
+ tag "malformed-md5sums-control-file", "line $.";
+ }
+}
+close(C);
+
+for my $file (keys %control_entry) {
+
+ if (not exists $info_entry{$file}) {
+ tag "md5sums-lists-nonexisting-file", "$file";
+ } elsif ($info_entry{$file} ne $control_entry{$file}) {
+ tag "md5sum-mismatch", "$file";
+ }
+
+ delete $info_entry{$file};
+}
+for my $file (keys %info_entry) {
+ tag "file-missing-in-md5sums", "$file"
+ unless ($conffile{$file} || $file =~ m%^var/lib/[ai]spell/.%);
+}
+
+}
+
+1;
+
+# vim: syntax=perl