[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH] Use the new Dpkg::Checksums module in scripts



* scripts/dpkg-genchanges.pl, scripts/dpkg-source.pl: Convert
all checksum handling code to use the new module.
---
 scripts/dpkg-genchanges.pl |   34 ++++++++++++++++------------------
 scripts/dpkg-source.pl     |   40 ++++++++++++++++------------------------
 2 files changed, 32 insertions(+), 42 deletions(-)

diff --git a/scripts/dpkg-genchanges.pl b/scripts/dpkg-genchanges.pl
index 9fb13fc..38b7ecb 100755
--- a/scripts/dpkg-genchanges.pl
+++ b/scripts/dpkg-genchanges.pl
@@ -8,6 +8,7 @@ use POSIX qw(:errno_h :signal_h);
 use English;
 use Dpkg;
 use Dpkg::Gettext;
+use Dpkg::Checksums;
 use Dpkg::ErrorHandling qw(warning error failure unknown internerr syserr
                            subprocerr usageerr);
 use Dpkg::Arch qw(get_host_arch debarch_eq debarch_is);
@@ -35,6 +36,7 @@ my $sourcestyle = 'i';
 my $quiet = 0;
 my $host_arch = get_host_arch();
 my $changes_format = "1.7";
+my $checksum = 'md5sum';
 
 my %f2p;           # - file to package map
 my %p2f;           # - package to file map, has entries for "packagename"
@@ -52,7 +54,8 @@ my @descriptions;
 my @sourcefiles;
 my @fileslistfiles;
 
-my %md5sum;        # - md5sum to file map
+my %checksum;      # - file to checksum map
+my %size;          # - file to size map
 my %remove;        # - fields to remove
 my %override;
 my %archadded;
@@ -382,9 +385,9 @@ if (!is_binaryonly) {
     my $files = $dsc_fields->{'Files'};
     for my $file (split(/\n /, $files)) {
         next if $file eq '';
-        $file =~ m/^([0-9a-f]{32})[ \t]+\d+[ \t]+([0-9a-zA-Z][-+:.,=0-9a-zA-Z_~]+)$/
+	$file =~ m/^($check_regex)[ \t]+(\d+)[ \t]+([0-9a-zA-Z][-+:.,=0-9a-zA-Z_~]+)$/
             || error(_g("Files field contains bad line \`%s'"), $file);
-        ($md5sum{$2},$file) = ($1,$2);
+	($checksum{$3},$size{$3},$file) = ($1,$2,$3);
         push(@sourcefiles,$file);
     }
     for my $f (@sourcefiles) {
@@ -438,21 +441,16 @@ for my $f (@sourcefiles, @fileslistfiles) {
     next if ($include == ARCH_INDEP and not debarch_eq('all', $p2arch{$f2p{$f}}));
     next if $filedone{$f}++;
     my $uf = "$uploadfilesdir/$f";
-    open(STDIN, "<", $uf) ||
-	syserr(_g("cannot open upload file %s for reading"), $uf);
-    (my @s = stat(STDIN)) || syserr(_g("cannot fstat upload file %s"), $uf);
-    my $size = $s[7];
-    $size || warning(_g("upload file %s is empty"), $uf);
-    my $md5sum = `md5sum`;
-    $? && subprocerr(_g("md5sum upload file %s"), $uf);
-    $md5sum =~ m/^([0-9a-f]{32})\s*-?\s*$/i ||
-        failure(_g("md5sum upload file %s gave strange output \`%s'"),
-                $uf, $md5sum);
-    $md5sum= $1;
-    defined($md5sum{$f}) && $md5sum{$f} ne $md5sum &&
-        error(_g("md5sum of source file %s (%s) is different from md5sum " .
-                 "in %s (%s)"), $uf, $md5sum, $dsc, $md5sum{$f});
-    $fields->{'Files'}.= "\n $md5sum $size $f2sec{$f} $f2pri{$f} $f";
+    my ($sum, $size) = getchecksum($checksum, $uf);
+    if (defined($checksum{$f})) { # verify checksums from .dsc
+	if (length($checksum{$f}) != length($sum)) { # different algorithm
+	    verifychecksum($uf, $checksum{$f}, $size{$f}, $dsc);
+	} elsif ($checksum{$f} ne $sum) {
+	    error(_g("checksum of source file %s (%s) is different from checksum " .
+		     "in %s (%s)"), $uf, $sum, $dsc, $checksum{$f});
+	}
+    }
+    $fields->{'Files'}.= "\n $sum $size $f2sec{$f} $f2pri{$f} $f";
 }
 
 $fields->{'Source'}= $sourcepackage;
diff --git a/scripts/dpkg-source.pl b/scripts/dpkg-source.pl
index af4cd57..afe97cd 100755
--- a/scripts/dpkg-source.pl
+++ b/scripts/dpkg-source.pl
@@ -5,6 +5,7 @@ use warnings;
 
 use Dpkg;
 use Dpkg::Gettext;
+use Dpkg::Checksums;
 use Dpkg::ErrorHandling qw(warning warnerror error failure unknown
                            internerr syserr subprocerr usageerr
                            $warnable_error $quiet_warnings);
@@ -93,12 +94,15 @@ my $compression = 'gzip';
 my $comp_level = '9';
 my $comp_ext = $comp_ext{$compression};
 
+# Checksum
+my $checksum = 'md5sum';
+
 # Packages
 my %remove;
 my %override;
 
 # Files
-my %md5sum;
+my %checksum;
 my %size;
 my %type;		 # used by checktype
 my %filepatched;	 # used by checkdiff
@@ -873,10 +877,13 @@ if ($opmode eq 'build') {
     my $debianfile;
     my %seen;
     for my $file (split(/\n /, $files)) {
-        next if $file eq '';
-        $file =~ m/^([0-9a-f]{32})[ \t]+(\d+)[ \t]+([0-9a-zA-Z][-+:.,=0-9a-zA-Z_~]+)$/
-            || error(_g("Files field contains bad line `%s'"), $file);
-        ($md5sum{$3},$size{$3},$file) = ($1,$2,$3);
+	next if $file eq '';
+	$file =~ m/^($check_regex)                         # checksum
+                    [ \t]+(\d+)                            # size
+                    [ \t]+([0-9a-zA-Z][-+:.,=0-9a-zA-Z_~]+)# filename
+                  $/x
+	  || error(_g("Files field contains bad line `%s'"), $file);
+	($checksum{$3},$size{$3},$file) = ($1,$2,$3);
 	local $_ = $file;
 
 	error(_g("Files field contains invalid filename `%s'"), $file)
@@ -1124,19 +1131,8 @@ if ($opmode eq 'build') {
 }
 
 sub checkstats {
-    my $dscdir = shift;
-    my ($f) = @_;
-    my @s;
-    my $m;
-    open(STDIN, "< $dscdir/$f") || syserr(_g("cannot read %s"), "$dscdir/$f");
-    (@s = stat(STDIN)) || syserr(_g("cannot fstat %s"), "$dscdir/$f");
-    $s[7] == $size{$f} || error(_g("file %s has size %s instead of expected %s"),
-                                $f, $s[7], $size{$f});
-    $m= `md5sum`; $? && subprocerr("md5sum $f"); $m =~ s/\n$//;
-    $m = readmd5sum( $m );
-    $m eq $md5sum{$f} || error(_g("file %s has md5sum %s instead of expected %s"),
-                               $f, $m, $md5sum{$f});
-    open(STDIN,"</dev/null") || &syserr(_g("reopen stdin from /dev/null"));
+    my ($dscdir, $f) = @_;
+    verifychecksum("$dscdir/$f", $checksum{$f}, $size{$f}, ".dsc")
 }
 
 sub erasedir {
@@ -1634,12 +1630,8 @@ sub addfile {
     my ($fields, $filename)= @_;
     $added_files{$filename}++ &&
         internerr(_g("tried to add file `%s' twice"), $filename);
-    stat($filename) || syserr(_g("could not stat output file `%s'"), $filename);
-    my $size = (stat _)[7];
-    my $md5sum= `md5sum <$filename`;
-    $? && &subprocerr("md5sum $filename");
-    $md5sum = readmd5sum( $md5sum );
-    $fields->{'Files'}.= "\n $md5sum $size $filename";
+    my ($sum, $size) = getchecksum($checksum, $filename);
+    $fields->{'Files'}.= "\n $sum $size $filename";
 }
 
 # replace \ddd with their corresponding character, refuse \ddd > \377
-- 
1.5.3.8


Reply to: