diff options
author | Eric Wong <e@80x24.org> | 2021-01-13 19:06:14 -1200 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-01-14 23:14:08 +0000 |
commit | 7dd5b28cb9bdcfa262ddad47d7f033f600675dc3 (patch) | |
tree | c55a8afc5163ad33b37911fabbfd699b1b953143 /lib/PublicInbox/Spawn.pm | |
parent | b0898d18efbc8f646b736088f9600b87be88f91e (diff) | |
download | public-inbox-7dd5b28cb9bdcfa262ddad47d7f033f600675dc3.tar.gz |
We'll ensure our {send,recv}_cmd4 implementations are consistent w.r.t. non-blocking and interrupted sockets. We'll also support receiving messages without FDs associated so we don't have to send dummy FDs to keep receivers from reporting EOF.
Diffstat (limited to 'lib/PublicInbox/Spawn.pm')
-rw-r--r-- | lib/PublicInbox/Spawn.pm | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/PublicInbox/Spawn.pm b/lib/PublicInbox/Spawn.pm index ef822e1b..e5c0b1e9 100644 --- a/lib/PublicInbox/Spawn.pm +++ b/lib/PublicInbox/Spawn.pm @@ -216,12 +216,13 @@ union my_cmsg { char pad[sizeof(struct cmsghdr) + 16 + SEND_FD_SPACE]; }; -int send_cmd4(PerlIO *s, SV *svfds, SV *data, int flags) +SV *send_cmd4(PerlIO *s, SV *svfds, SV *data, int flags) { struct msghdr msg = { 0 }; union my_cmsg cmsg = { 0 }; STRLEN dlen = 0; struct iovec iov; + ssize_t sent; AV *fds = (AV *)SvRV(svfds); I32 i, nfds = av_len(fds) + 1; int *fdp; @@ -252,7 +253,8 @@ int send_cmd4(PerlIO *s, SV *svfds, SV *data, int flags) *fdp++ = SvIV(*fd); } } - return sendmsg(PerlIO_fileno(s), &msg, flags) >= 0; + sent = sendmsg(PerlIO_fileno(s), &msg, flags); + return sent >= 0 ? newSViv(sent) : &PL_sv_undef; } void recv_cmd4(PerlIO *s, SV *buf, STRLEN n) @@ -260,7 +262,7 @@ void recv_cmd4(PerlIO *s, SV *buf, STRLEN n) union my_cmsg cmsg = { 0 }; struct msghdr msg = { 0 }; struct iovec iov; - size_t i; + ssize_t i; Inline_Stack_Vars; Inline_Stack_Reset; @@ -275,8 +277,9 @@ void recv_cmd4(PerlIO *s, SV *buf, STRLEN n) i = recvmsg(PerlIO_fileno(s), &msg, 0); if (i < 0) - croak("recvmsg: %s", strerror(errno)); - SvCUR_set(buf, i); + Inline_Stack_Push(&PL_sv_undef); + else + SvCUR_set(buf, i); if (i > 0 && cmsg.hdr.cmsg_level == SOL_SOCKET && cmsg.hdr.cmsg_type == SCM_RIGHTS) { size_t len = cmsg.hdr.cmsg_len; |