diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2013-10-22 16:29:30 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2013-10-22 16:29:30 +0100 |
commit | d7b750340c44a9fdb676f8b7876a30a00d968916 (patch) | |
tree | 9375eed107eca411bdb315e3cfc4725d288b0f63 /dgit | |
parent | 63b3ec362791edff468f2f3b70240c94eb306b4b (diff) |
fix file exchange protocol implementation
Diffstat (limited to 'dgit')
-rwxr-xr-x | dgit | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -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 ---------- |