On 07/20 10:46, Eric Wong wrote:
> merch-redmine / jeremyevans.net wrote:
> > Bug #11364: Use smaller buffer for sendmsg
> > https://bugs.ruby-lang.org/issues/11364
> > 
> > OpenBSD's limit is less than 128.
> 
> Btw, this is pretty disappointing since I want to use SOCK_SEQPACKET
> more for IPC in some projects.
> 
> Does SO_RCVBUF/SO_SNDBUF help in OpenBSD with SOCK_SEQPACKET sockets?

Looks like my initial analysis was partially wrong.  OpenBSD's default
buffer for SEQPACKET sockets is 4096.  However, ancdata.c needs a patch
to handle EMSGSIZE.

Here's a diff that should fix things.  Hopefully it works on other
operating systems as well, but if not, I can wrap things in an ifdef.

Thanks,
Jeremy

From ea53434c4fda387347228e29856537d24f4dc649 Mon Sep 17 00:00:00 2001
From: Jeremy Evans <code / jeremyevans.net>
Date: Mon, 20 Jul 2015 17:20:58 -0600
Subject: [PATCH] Treat EMSGSIZE similar to EWOULDBLOCK for sendmsg_nonblock

OpenBSD uses EMSGSIZE if you try to send data on a nonblocking
socket that would cause it to block.

Restore previous limits in tests.
---
 ext/socket/ancdata.c         | 2 +-
 test/socket/test_nonblock.rb | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index da8b816..3440dd4 100644
--- ext/socket/ancdata.c
+++ ext/socket/ancdata.c
@@ -1284,7 +1284,7 @@ bsock_sendmsg_internal(int argc, VALUE *argv, VALUE sock, int nonblock)
             rb_io_check_closed(fptr);
             goto retry;
         }
-        if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN)) {
+        if (nonblock && (errno == EWOULDBLOCK || errno == EMSGSIZE || errno == EAGAIN)) {
 	    if (rsock_opt_false_p(opts, sym_exception)) {
 		return sym_wait_writable;
 	    }
diff --git a/test/socket/test_nonblock.rb b/test/socket/test_nonblock.rb
index 39999ca..4edcbc0 100644
--- test/socket/test_nonblock.rb
+++ test/socket/test_nonblock.rb
@@ -299,7 +299,7 @@ class TestSocketNonblock < Test::Unit::TestCase
 
   if defined?(UNIXSocket) && defined?(Socket::SOCK_SEQPACKET)
     def test_sendmsg_nonblock_seqpacket
-      buf = '*' * 63
+      buf = '*' * 4096
       UNIXSocket.pair(:SEQPACKET) do |s1, s2|
         assert_raise(IO::WaitWritable) do
           loop { s1.sendmsg_nonblock(buf) }
@@ -310,7 +310,7 @@ class TestSocketNonblock < Test::Unit::TestCase
     end
 
     def test_sendmsg_nonblock_no_exception
-      buf = '*' * 63
+      buf = '*' * 128
       UNIXSocket.pair(:SEQPACKET) do |s1, s2|
         n = 0
         Timeout.timeout(60) do
-- 
2.4.5