sub read_msg { my ($sock, $bcount, $buf, $msg) = (shift, 0, '', ''); my $bytes_read; # Use sysread for stream-oriented sockets READ_MSG: while ($bytes_read = sysread($sock, $buf, 1024)) { # Handle partial read $bcount += $bytes_read; $msg .= $buf; } # sysread returns undef on system error, check $! if (not defined $bytes_read) { # Just in case, save $! value my $error = $!; # To be safe here... redo READ_MSG if $error =~ /Resource temporarily unavailable/; # All other errors trigger unconditional return with error return ($msg, $bcount, $error); } # Return success return ($msg, $bcount, ''); }