Subject: | Fails on systems which must use send/recv not write/read |
On systems (such as BeOS) where you must use the socket calls recv() and
send() because read() and write() only work on files, LWP sends its data
to filedescriptors such as the console rather than the socket.
A fix for http.pm is (no doubt other protocols need fixing as well):
*** Ohttp.pm Thu Aug 26 18:46:11 2010
--- http.pm Thu Aug 26 19:52:32 2010
***************
*** 211,217 ****
{
# Since this just writes out the header block it should almost
# always succeed to send the whole buffer in a single
write call.
! my $n = $socket->syswrite($req_buf, length($req_buf));
unless (defined $n) {
redo WRITE if $!{EINTR};
if ($!{EAGAIN}) {
--- 211,222 ----
{
# Since this just writes out the header block it should almost
# always succeed to send the whole buffer in a single
write call.
! my $n;
! if($^O eq 'beos') {
! $n = send(*$socket, $req_buf, 0);
! } else {
! $n = $socket->syswrite($req_buf, length($req_buf));
! }
unless (defined $n) {
redo WRITE if $!{EINTR};
if ($!{EAGAIN}) {
***************
*** 295,301 ****
if (defined($rbits) && $rbits =~ /[^\0]/) {
# readable
my $buf = $socket->_rbuf;
! my $n = $socket->sysread($buf, 1024, length($buf));
unless (defined $n) {
die "read failed: $!" unless $!{EINTR} || $!{EAGAIN};
# if we get here the rest of the block will do nothing
--- 300,313 ----
if (defined($rbits) && $rbits =~ /[^\0]/) {
# readable
my $buf = $socket->_rbuf;
! my $n;
! if($^O eq 'beos') {
! # No check of offset - let's hope it all goes
! recv(*$socket, $buf, 1024, 0);
! $n = length($buf);
! } else {
! $n = $socket->sysread($buf, 1024, length($buf));
! }
unless (defined $n) {
die "read failed: $!" unless $!{EINTR} || $!{EAGAIN};
# if we get here the rest of the block will do nothing
***************
*** 325,331 ****
}
}
if (defined($wbits) && $wbits =~ /[^\0]/) {
! my $n = $socket->syswrite($$wbuf, length($$wbuf), $woffset);
unless (defined $n) {
die "write failed: $!" unless $!{EINTR} || $!{EAGAIN};
$n = 0; # will retry write on the next round
--- 337,350 ----
}
}
if (defined($wbits) && $wbits =~ /[^\0]/) {
! my $n;
! if($^O eq 'beos') {
! # No check of offset - let's hope it all goes
! send(*$socket, $$wbuf, 0);
! $n = length($$wbuf);
! } else {
! $n = $socket->syswrite($$wbuf, length($$wbuf), $woffset);
! }
unless (defined $n) {
die "write failed: $!" unless $!{EINTR} || $!{EAGAIN};
$n = 0; # will retry write on the next round
***************
*** 430,436 ****
# use select to wait for some data to arrive
$self->can_read(undef) || die "Assert";
}
! sysread($self, $_[0], $_[1], $_[2] || 0);
}
sub can_read {
--- 449,460 ----
# use select to wait for some data to arrive
$self->can_read(undef) || die "Assert";
}
! if($^O eq 'beos') {
! my $n = recv(*$self, $_[0], $_[1] || 0, 0);
! length($_[0]);
! } else {
! sysread($self, $_[0], $_[1], $_[2] || 0);
! }
}
sub can_read {