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:
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;
}