shlist

share and manage lists between multiple people
Log | Files | Refs

commit 95740c319f3b65aeaf02ea1d964f4437d36e2d41
parent faf07dafd5d9ee8904d07b48718fe25512317c02
Author: Kyle Milz <kyle@0x30.net>
Date:   Sun, 24 Jan 2016 19:10:09 -0700

sl: some fixes for send_all and read_all

- use 3 argument sysread() and stop concatenating temporary buffer
  - just keep track of how many bytes we've seen so far and index into a single
    buffer directly
- in send_all fix a bug and use consistent variable names wrt read_all

Diffstat:
Mserver/sl | 21+++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/server/sl b/server/sl @@ -134,22 +134,23 @@ sub recv_msg { } sub read_all { - my ($sock, $bytes_left) = @_; + my ($sock, $bytes_total) = @_; my $data; - while ($bytes_left > 0) { - my $bytes_read = $sock->sysread(my $tmp, $bytes_left); + my $bytes_read = 0; + while ($bytes_total > 0) { + my $read = $sock->sysread($data, $bytes_total, $bytes_read); - if (!defined $bytes_read) { + if (!defined $read) { $log->print("error: read failed: $!\n"); exit 0; - } elsif ($bytes_read == 0) { + } elsif ($read == 0) { $log->print("disconnected!\n"); exit 0; } - $data .= $tmp; - $bytes_left -= $bytes_read; + $bytes_total -= $read; + $bytes_read += $read; } return $data; @@ -170,13 +171,13 @@ sub send_msg { } sub send_all { - my ($socket, $bytes, $bytes_total) = @_; + my ($socket, $data, $bytes_total) = @_; my $bytes_written = 0; while ($bytes_total) { - my $wrote = $socket->syswrite($bytes, $bytes_total, $bytes_written); + my $wrote = $socket->syswrite($data, $bytes_total, $bytes_written); - unless (defined $bytes_written) { + unless (defined $wrote) { $log->print("error: write failed: $!\n"); exit 0; }