diff options
-rwxr-xr-x | scripts/dpkg-source.pl | 114 |
1 files changed, 46 insertions, 68 deletions
diff --git a/scripts/dpkg-source.pl b/scripts/dpkg-source.pl index 0759c9e9d..4a5e3a4a5 100755 --- a/scripts/dpkg-source.pl +++ b/scripts/dpkg-source.pl @@ -1,4 +1,5 @@ #! /usr/bin/perl +# vim: set et sw=4 ts=8 use strict; use warnings; @@ -287,8 +288,6 @@ while (@ARGV && $ARGV[0] =~ m/^-/) { defined($opmode) || &usageerr(_g("need -x or -b")); -$SIG{'PIPE'} = 'DEFAULT'; - if ($opmode eq 'build') { @ARGV || &usageerr(_g("-b needs a directory")); @@ -655,15 +654,16 @@ if ($opmode eq 'build') { my $diff_handle; $compressor->compress(from_pipe => \$diff_handle, to_file => $newdiffgz); - defined(my $c2 = open(FIND, "-|")) || syserr(_g("fork for find")); - if (!$c2) { - chdir($dir) || syserr(_g("chdir to %s for find"), $dir); - exec('find','.','-print0') or &syserr(_g("exec find")); - } - $/= "\0"; + my $find_handle; + my $pid = fork_and_exec( + 'exec' => [ 'find', '.', '-print0' ], + 'chdir' => $dir, + 'to_pipe' => \$find_handle, + ); + $/ = "\0"; file: - while (defined($fn= <FIND>)) { + while (defined($fn= <$find_handle>)) { $fn =~ s/\0$//; next file if $fn =~ m/$diff_ignore_regexp/o; $fn =~ s,^\./,,; @@ -708,37 +708,40 @@ if ($opmode eq 'build') { _g("plain file")); next; } - defined(my $c3 = open(DIFFGEN, "-|")) || syserr(_g("fork for diff")); - if (!$c3) { - $ENV{'LC_ALL'}= 'C'; - $ENV{'LANG'}= 'C'; - $ENV{'TZ'}= 'UTC0'; - my $tab = ("$basedirname/$fn" =~ / /) ? "\t" : ''; - exec('diff','-u', - '-L',"$basedirname.orig/$fn$tab", - '-L',"$basedirname/$fn$tab", - '--',"$ofnread","$dir/$fn") or &syserr(_g("exec diff")); - } - my $difflinefound = 0; - $/= "\n"; - while (<DIFFGEN>) { + + my $tab = ("$basedirname/$fn" =~ / /) ? "\t" : ''; + my $diffgen; + my $diff_pid = fork_and_exec( + 'exec' => [ 'diff', '-u', '-p', + '-L', "$basedirname.orig/$fn$tab", + '-L', "$basedirname/$fn$tab", + '--', "$ofnread", "$dir/$fn" ], + 'env' => { LC_ALL => 'C', LANG => 'C', TZ => 'UTC0' }, + 'to_pipe' => \$diffgen + ); + my $difflinefound = 0; + $/ = "\n"; + while (<$diffgen>) { if (m/^binary/i) { - close(DIFFGEN); $/= "\0"; + close($diffgen); + $/ = "\0"; &unrepdiff(_g("binary file contents changed")); next file; } elsif (m/^[-+\@ ]/) { $difflinefound=1; } elsif (m/^\\ No newline at end of file$/) { - warning(_g("file %s has no final newline (either " . - "original or modified version)"), $fn); + warning(_g("file %s has no final newline (either " . + "original or modified version)"), $fn); } else { s/\n$//; - internerr(_g("unknown line from diff -u on %s: `%s'"), - $fn, $_); + internerr(_g("unknown line from diff -u on %s: `%s'"), + $fn, $_); } - print($diff_handle $_) || syserr(_g("failed to write to compression pipe")); + print($diff_handle $_) || syserr(_g("failed to write to compression pipe")); } - close(DIFFGEN); $/= "\0"; + close($diffgen); + wait_child($diff_pid, nocheck => 1, cmdline => 'diff'); + $/ = "\0"; my $es; if (WIFEXITED($?) && (($es=WEXITSTATUS($?))==0 || $es==1)) { if ($es==1 && !$difflinefound) { @@ -765,8 +768,9 @@ if ($opmode eq 'build') { &unrepdiff(sprintf(_g("unknown file type (%s)"), $!)); } } - close(FIND); $? && subprocerr("find on $dir"); - close($diff_handle) || syserr(_g("finish write to compression pipe")); + close($find_handle); + wait_child($pid); + close($diff_handle) || syserr(_g("finish write to compression pipe")); $compressor->wait_end_process(); rename($newdiffgz, $diffname) || syserr(_g("unable to rename `%s' (newly created) to `%s'"), @@ -774,13 +778,14 @@ if ($opmode eq 'build') { chmod(0666 &~ umask(), $diffname) || syserr(_g("unable to change permission of `%s'"), $diffname); - defined($c2= open(FIND,"-|")) || &syserr(_g("fork for 2nd find")); - if (!$c2) { - chdir($origdir) || syserr(_g("chdir to %s for 2nd find"), $origdir); - exec('find','.','-print0') or &syserr(_g("exec 2nd find")); - } - $/= "\0"; - while (defined($fn= <FIND>)) { + $find_handle = undef; + $pid = fork_and_exec( + 'exec' => [ 'find', '.', '-print0' ], + 'chdir' => $origdir, + 'to_pipe' => \$find_handle, + ); + $/ = "\0"; + while (defined($fn= <$find_handle>)) { $fn =~ s/\0$//; next if $fn =~ m/$diff_ignore_regexp/o; $fn =~ s,^\./,,; @@ -798,7 +803,8 @@ if ($opmode eq 'build') { _g('nonexistent')); } } - close(FIND); $? && subprocerr("find on $dirname"); + close($find_handle); + wait_child($pid); addfile($fields, $diffname); @@ -1161,34 +1167,6 @@ if ($opmode eq 'build') { warning(_g("%s is not a plain file"), "$newdirectory/debian/rules"); } - my $execmode = 0777 & ~umask; - (my @s = stat('.')) || syserr(_g("cannot stat `.'")); - my $dirmode = $execmode | ($s[2] & 02000); - my $plainmode = $execmode & ~0111; - my $fifomode = ($plainmode & 0222) | (($plainmode & 0222) << 1); - - for $fn (@filesinarchive) { - $fn=~ s,^$expectprefix,$newdirectory,; - (my @s = lstat($fn)) || - syserr(_g("cannot stat extracted object `%s'"), $fn); - my $mode = $s[2]; - my $newmode; - - if (-d _) { - $newmode= $dirmode; - } elsif (-f _) { - $newmode= ($mode & 0111) ? $execmode : $plainmode; - } elsif (-p _) { - $newmode= $fifomode; - } elsif (!-l _) { - internerr(_g("unknown object `%s' after extract (mode 0%o)"), - $fn, $mode); - } else { next; } - next if ($mode & 07777) == $newmode; - chmod($newmode,$fn) || - syserr(_g("cannot change mode of `%s' to 0%o from 0%o"), - $fn, $newmode, $mode); - } exit(0); } |