summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2013-10-22 16:29:30 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2013-10-22 16:29:30 +0100
commitd7b750340c44a9fdb676f8b7876a30a00d968916 (patch)
tree9375eed107eca411bdb315e3cfc4725d288b0f63
parent63b3ec362791edff468f2f3b70240c94eb306b4b (diff)
fix file exchange protocol implementation
-rwxr-xr-xdgit16
1 files changed, 10 insertions, 6 deletions
diff --git a/dgit b/dgit
index e12bfdc..31e57c5 100755
--- a/dgit
+++ b/dgit
@@ -206,17 +206,19 @@ sub protocol_send_file ($$) {
my $d;
my $got = read PF, $d, 65536;
die "$ourfn: $!" unless defined $got;
- last if $got;
+ last if !$got;
print $fh "data-block ".length($d)."\n" or die $!;
print $d or die $!;
}
+ PF->eof or die "$ourfn $!";
+ PF->error and die "$ourfn $!";
print $fh "data-end\n" or die $!;
close PF;
}
sub protocol_read_bytes ($$) {
my ($fh, $nbytes) = @_;
- $nbytes =~ m/^\d{1,6}$/ or badproto \*RO, "bad byte count";
+ $nbytes =~ m/^[1-9]\d{0,5}$/ or badproto \*RO, "bad byte count";
my $d;
my $got = read $fh, $d, $nbytes;
$got==$nbytes or badproto $fh, "eof during data block";
@@ -228,14 +230,16 @@ sub protocol_receive_file ($$) {
open PF, ">", $ourfn or die "$ourfn: $!";
for (;;) {
my ($y,$l) = protocol_expect {
- m/^data-block (.*})$|data-end$/;
- length $1 ? (1,$1) : (0);
+ m/^data-block (.*)$/ ? (1,$1) :
+ m/^data-end$/ ? (0,) :
+ ();
} $fh;
last unless $y;
- my $d = protocol_read_bytes $fh, $1;
+ my $d = protocol_read_bytes $fh, $l;
print PF $d or die $!;
}
- printdebug "received into $ourfn\n";
+ close PF or die $!;
+ printdebug "() $ourfn\n";
}
#---------- remote protocol support, responder ----------