*recv_cmd4 = sub ($$$) {
my ($s, undef, $len) = @_; # $_[1] = destination buffer
my $mh = Socket::MsgHdr->new(buflen => $len, controllen => 256);
- my $r = Socket::MsgHdr::recvmsg($s, $mh, 0) // return (undef);
+ my $r = Socket::MsgHdr::recvmsg($s, $mh, 0) // do {
+ $_[1] = '';
+ return (undef);
+ };
$_[1] = $mh->buf;
return () if $r == 0;
my (undef, undef, $data) = $mh->cmsghdr;
if (scalar(@fds) == 1 && !defined($fds[0])) {
return if $! == EAGAIN;
die "recvmsg: $!" if $! != ECONNRESET;
- $buf = '';
@fds = (); # for open loop below:
}
for (@fds) { open my $rfh, '+<&=', $_ }
if (scalar(@fds) == 1 && !defined($fds[0])) {
return if $!{EAGAIN};
die "recvmsg: $!" unless $!{ECONNRESET};
- $buf = '';
} else { # just in case open so perl can auto-close them:
for (@fds) { open my $fh, '+<&=', $_ };
}
msg.msg_controllen = CMSG_SPACE(SEND_FD_SPACE);
i = recvmsg(PerlIO_fileno(s), &msg, 0);
- if (i < 0)
- Inline_Stack_Push(&PL_sv_undef);
- else
+ if (i >= 0) {
SvCUR_set(buf, i);
+ } else {
+ Inline_Stack_Push(&PL_sv_undef);
+ SvCUR_set(buf, 0);
+ }
if (i > 0 && cmsg.hdr.cmsg_level == SOL_SOCKET &&
cmsg.hdr.cmsg_type == SCM_RIGHTS) {
size_t len = cmsg.hdr.cmsg_len;
msg_controllen,
0); # msg_flags
my $r = syscall($SYS_recvmsg, fileno($sock), $mh, 0);
- return (undef) if $r < 0; # $! set
+ if ($r < 0) { # $! is set
+ $_[1] = '';
+ return (undef);
+ }
substr($_[1], $r, length($_[1]), '');
my @ret;
if ($r > 0) {
$s2->blocking(0);
@fds = $recv->($s2, $buf, length($src) + 1);
ok($!{EAGAIN}, "EAGAIN set by ($desc)");
+ is($buf, '', "recv buffer emptied on EAGAIN ($desc)");
is_deeply(\@fds, [ undef ], "EAGAIN $desc");
$s2->blocking(1);