X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=userv-utils.git;a=blobdiff_plain;f=git-daemon%2Fgit-daemon.pl;h=4f8a7747cb72aa24d96023dffc8a8e65698eeb91;hp=df753e1f79ac67eb5aa884c489673b0346ec424f;hb=abb80356bb59bcc101a57949badbb85fde4db9ba;hpb=fbde0914d3e4fc184ac396dbb35ad6f77527b535 diff --git a/git-daemon/git-daemon.pl b/git-daemon/git-daemon.pl index df753e1..4f8a774 100755 --- a/git-daemon/git-daemon.pl +++ b/git-daemon/git-daemon.pl @@ -18,7 +18,7 @@ use Socket; use Sys::Syslog; use vars qw{ %vhost_default_user %vhost_user_from_tilde - $TILDE $REPO $HOSTNAME }; + $TILDE $REPO $HOSTNAME }; use lib '/etc/userv'; require 'git-daemon-vhosts.pl'; @@ -44,18 +44,14 @@ sub fail { sub xread { my $length = shift; my $buffer = ""; - my $count = 0; # simply die if the client takes too long alarm 30; while ($length > length $buffer) { - my ($data,$ret); - do { - $ret = sysread STDIN, $data, $length - } while not defined $ret and ($! == EINTR or $! == EAGAIN); - fail "read: $!" unless defined $ret; - fail "short read: expected $length bytes, got $count" if $ret == 0; - $buffer .= $data; - $count += $ret; + my $ret = sysread STDIN, $buffer, $length, length $buffer; + fail "short read: expected $length bytes, got " . length $buffer + if defined $ret and $ret == 0; + fail "read: $!" if not defined $ret and $! != EINTR and $! != EAGAIN; + $ret = 0 if not defined $ret; } alarm 0; return $buffer;