unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
* [PATCH 0/3] support sendmsg+recvmsg in pure Perl under Linux
@ 2022-03-23  8:54 Eric Wong
  2022-03-23  8:54 ` [PATCH 1/3] syscall: drop unused EEXIST import Eric Wong
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Eric Wong @ 2022-03-23  8:54 UTC (permalink / raw)
  To: meta

Most C compilers are bandwidth and storage hogs; while binary
distribution makes it harder for ordinary users to exercise
software freedom.  So no great options here, but relying on
the stable Linux ABI is probably the easiest for the majority
of our users (currently on x86-64 and x86 Linux).

Eric Wong (3):
  syscall: drop unused EEXIST import
  recv_cmd: do not undef recvmsg buffer arg on errors
  syscall: implement sendmsg+recvmsg in pure Perl

 devel/syscall-list         |  2 +
 lib/PublicInbox/CmdIPC4.pm |  4 +-
 lib/PublicInbox/Syscall.pm | 97 +++++++++++++++++++++++++++++++++++++-
 script/lei                 |  6 ++-
 t/cmd_ipc.t                | 13 ++++-
 5 files changed, 117 insertions(+), 5 deletions(-)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] syscall: drop unused EEXIST import
  2022-03-23  8:54 [PATCH 0/3] support sendmsg+recvmsg in pure Perl under Linux Eric Wong
@ 2022-03-23  8:54 ` Eric Wong
  2022-03-23  8:54 ` [PATCH 2/3] recv_cmd: do not undef recvmsg buffer arg on errors Eric Wong
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Eric Wong @ 2022-03-23  8:54 UTC (permalink / raw)
  To: meta

We've never used it, actually.
---
 lib/PublicInbox/Syscall.pm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/PublicInbox/Syscall.pm b/lib/PublicInbox/Syscall.pm
index a2b7490a..806c192e 100644
--- a/lib/PublicInbox/Syscall.pm
+++ b/lib/PublicInbox/Syscall.pm
@@ -15,7 +15,7 @@ package PublicInbox::Syscall;
 use strict;
 use v5.10.1;
 use parent qw(Exporter);
-use POSIX qw(ENOENT EEXIST ENOSYS EINVAL O_NONBLOCK);
+use POSIX qw(ENOENT ENOSYS EINVAL O_NONBLOCK);
 use Config;
 
 # $VERSION = '0.25'; # Sys::Syscall version

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/3] recv_cmd: do not undef recvmsg buffer arg on errors
  2022-03-23  8:54 [PATCH 0/3] support sendmsg+recvmsg in pure Perl under Linux Eric Wong
  2022-03-23  8:54 ` [PATCH 1/3] syscall: drop unused EEXIST import Eric Wong
@ 2022-03-23  8:54 ` Eric Wong
  2022-03-23  8:54 ` [PATCH 3/3] syscall: implement sendmsg+recvmsg in pure Perl Eric Wong
  2022-03-23 21:08 ` [PATCH 4/3] syscall: add sendmsg+recvmsg for remaining arches Eric Wong
  3 siblings, 0 replies; 5+ messages in thread
From: Eric Wong @ 2022-03-23  8:54 UTC (permalink / raw)
  To: meta

It's a waste of ops and cycles, and inconsistent with perl
sysread() behavior which doesn't touch the supplied buffer on
errors.
---
 lib/PublicInbox/CmdIPC4.pm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/PublicInbox/CmdIPC4.pm b/lib/PublicInbox/CmdIPC4.pm
index c3a7f56e..76938b6d 100644
--- a/lib/PublicInbox/CmdIPC4.pm
+++ b/lib/PublicInbox/CmdIPC4.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 
 # callers should use PublicInbox::CmdIPC4->can('send_cmd4') (or recv_cmd4)
@@ -32,7 +32,7 @@ no warnings 'once';
 *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 ($_[1] = undef);
+	my $r = Socket::MsgHdr::recvmsg($s, $mh, 0) // return (undef);
 	$_[1] = $mh->buf;
 	return () if $r == 0;
 	my (undef, undef, $data) = $mh->cmsghdr;

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 3/3] syscall: implement sendmsg+recvmsg in pure Perl
  2022-03-23  8:54 [PATCH 0/3] support sendmsg+recvmsg in pure Perl under Linux Eric Wong
  2022-03-23  8:54 ` [PATCH 1/3] syscall: drop unused EEXIST import Eric Wong
  2022-03-23  8:54 ` [PATCH 2/3] recv_cmd: do not undef recvmsg buffer arg on errors Eric Wong
@ 2022-03-23  8:54 ` Eric Wong
  2022-03-23 21:08 ` [PATCH 4/3] syscall: add sendmsg+recvmsg for remaining arches Eric Wong
  3 siblings, 0 replies; 5+ messages in thread
From: Eric Wong @ 2022-03-23  8:54 UTC (permalink / raw)
  To: meta

Socket::MsgHdr is only packaged for Debian and derivatives at
the moment, and Inline::C pulling in gcc/clang is a huge amount
of disk space and bandwidth for some users.

This enables disk space and/or bandwidth-limited users to use lei.

Only Linux guarantees a stable ABI and syscall numbers, but
that's the majority of our userbase.  FreeBSD users will still
have to use Inline::C (or get Socket::MsgHdr packaged).

x86, x32, and x86-64 are all currently supported, more to be added.
---
 devel/syscall-list         |  2 +
 lib/PublicInbox/Syscall.pm | 95 ++++++++++++++++++++++++++++++++++++++
 script/lei                 |  6 ++-
 t/cmd_ipc.t                | 13 +++++-
 4 files changed, 114 insertions(+), 2 deletions(-)

diff --git a/devel/syscall-list b/devel/syscall-list
index a6b1bfa7..d33a8a78 100755
--- a/devel/syscall-list
+++ b/devel/syscall-list
@@ -49,6 +49,8 @@ int main(void)
 	D(SYS_inotify_rm_watch);
 	D(SYS_prctl);
 	D(SYS_fstatfs);
+	D(SYS_sendmsg);
+	D(SYS_recvmsg);
 #ifdef FS_IOC_GETFLAGS
 	printf("FS_IOC_GETFLAGS=%#lx\nFS_IOC_SETFLAGS=%#lx\n",
 		(unsigned long)FS_IOC_GETFLAGS, (unsigned long)FS_IOC_SETFLAGS);
diff --git a/lib/PublicInbox/Syscall.pm b/lib/PublicInbox/Syscall.pm
index 806c192e..e9175ceb 100644
--- a/lib/PublicInbox/Syscall.pm
+++ b/lib/PublicInbox/Syscall.pm
@@ -2,6 +2,9 @@
 # specifically the Debian libsys-syscall-perl 0.25-6 version to
 # fix upstream regressions in 0.25.
 #
+# See devel/syscall-list in the public-inbox source tree for maintenance
+# <https://80x24.org/public-inbox.git>
+#
 # This license differs from the rest of public-inbox
 #
 # This module is Copyright (c) 2005 Six Apart, Ltd.
@@ -16,6 +19,7 @@ use strict;
 use v5.10.1;
 use parent qw(Exporter);
 use POSIX qw(ENOENT ENOSYS EINVAL O_NONBLOCK);
+use Socket qw(SOL_SOCKET SCM_RIGHTS);
 use Config;
 
 # $VERSION = '0.25'; # Sys::Syscall version
@@ -42,8 +46,19 @@ use constant {
 	EPOLL_CTL_ADD => 1,
 	EPOLL_CTL_DEL => 2,
 	EPOLL_CTL_MOD => 3,
+	SIZEOF_int => $Config{intsize},
+	SIZEOF_size_t => $Config{sizesize},
+	NUL => "\0",
+};
+
+use constant {
+	TMPL_size_t => SIZEOF_size_t == 8 ? 'Q' : 'L',
+	BYTES_4_hole => SIZEOF_size_t == 8 ? 'L' : '',
+	# cmsg_len, cmsg_level, cmsg_type
+	SIZEOF_cmsghdr => SIZEOF_int * 2 + SIZEOF_size_t,
 };
 
+my @BYTES_4_hole = BYTES_4_hole ? (0) : ();
 our $loaded_syscall = 0;
 
 sub _load_syscall {
@@ -68,6 +83,7 @@ our (
      $SYS_renameat2,
      );
 
+my ($SYS_sendmsg, $SYS_recvmsg);
 my $SYS_fstatfs; # don't need fstatfs64, just statfs.f_type
 my ($FS_IOC_GETFLAGS, $FS_IOC_SETFLAGS);
 my $SFD_CLOEXEC = 02000000; # Perl does not expose O_CLOEXEC
@@ -99,6 +115,8 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 327;
         $SYS_renameat2 //= 353;
 	$SYS_fstatfs = 100;
+	$SYS_sendmsg = 370;
+	$SYS_recvmsg = 372;
 	$FS_IOC_GETFLAGS = 0x80046601;
 	$FS_IOC_SETFLAGS = 0x40046602;
     } elsif ($machine eq "x86_64") {
@@ -108,6 +126,8 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 289;
 	$SYS_renameat2 //= 316;
 	$SYS_fstatfs = 138;
+	$SYS_sendmsg = 46;
+	$SYS_recvmsg = 47;
 	$FS_IOC_GETFLAGS = 0x80086601;
 	$FS_IOC_SETFLAGS = 0x40086602;
     } elsif ($machine eq 'x32') {
@@ -117,6 +137,8 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 1073742113;
 	$SYS_renameat2 //= 0x40000000 + 316;
 	$SYS_fstatfs = 138;
+	$SYS_sendmsg = 0x40000206;
+	$SYS_recvmsg = 0x40000207;
 	$FS_IOC_GETFLAGS = 0x80046601;
 	$FS_IOC_SETFLAGS = 0x40046602;
     } elsif ($machine eq 'sparc64') {
@@ -378,6 +400,79 @@ sub nodatacow_dir {
 	if (open my $fh, '<', $_[0]) { nodatacow_fh($fh) }
 }
 
+sub CMSG_ALIGN ($) { ($_[0] + SIZEOF_size_t - 1) & ~(SIZEOF_size_t - 1) }
+use constant CMSG_ALIGN_SIZEOF_cmsghdr => CMSG_ALIGN(SIZEOF_cmsghdr);
+sub CMSG_SPACE ($) { CMSG_ALIGN($_[0]) + CMSG_ALIGN_SIZEOF_cmsghdr }
+sub CMSG_LEN ($) { CMSG_ALIGN_SIZEOF_cmsghdr + $_[0] }
+
+if (defined($SYS_sendmsg) && defined($SYS_recvmsg)) {
+no warnings 'once';
+*send_cmd4 = sub ($$$$) {
+	my ($sock, $fds, undef, $flags) = @_;
+	my $iov = pack('P'.TMPL_size_t,
+			$_[2] // NUL, length($_[2] // NUL) || 1);
+	my $cmsghdr = pack(TMPL_size_t . # cmsg_len
+			'LL' .  # cmsg_level, cmsg_type,
+			('i' x scalar(@$fds)),
+			CMSG_LEN(scalar(@$fds) * SIZEOF_int), # cmsg_len
+			SOL_SOCKET, SCM_RIGHTS, # cmsg_{level,type}
+			@$fds); # CMSG_DATA
+	my $mh = pack('PL' . # msg_name, msg_namelen (socklen_t (U32))
+			BYTES_4_hole . # 4-byte padding on 64-bit
+			'P'.TMPL_size_t . # msg_iov, msg_iovlen,
+			'P'.TMPL_size_t . # msg_control, msg_controllen,
+			'i', # msg_flags
+			NUL, 0, # msg_name, msg_namelen (unused)
+			@BYTES_4_hole,
+			$iov, 1, # msg_iov, msg_iovlen
+			$cmsghdr, # msg_control
+			CMSG_SPACE(scalar(@$fds) * SIZEOF_int), # msg_controllen
+			0); # msg_flags
+	my $sent;
+	my $try = 0;
+	do {
+		$sent = syscall($SYS_sendmsg, fileno($sock), $mh, $flags);
+	} while ($sent < 0 &&
+			($!{ENOBUFS} || $!{ENOMEM} || $!{ETOOMANYREFS}) &&
+			(++$try < 50) &&
+			warn "sleeping on sendmsg: $! (#$try)\n" &&
+			select(undef, undef, undef, 0.1) == 0);
+	$sent >= 0 ? $sent : undef;
+};
+
+*recv_cmd4 = sub ($$$) {
+	my ($sock, undef, $len) = @_;
+	vec($_[1], ($len + 1) * 8, 1) = 0;
+	vec(my $cmsghdr = '', 256 * 8 - 1, 1) = 1;
+	my $iov = pack('P'.TMPL_size_t, $_[1], $len);
+	my $mh = pack('PL' . # msg_name, msg_namelen (socklen_t (U32))
+			BYTES_4_hole . # 4-byte padding on 64-bit
+			'P'.TMPL_size_t . # msg_iov, msg_iovlen,
+			'P'.TMPL_size_t . # msg_control, msg_controllen,
+			'i', # msg_flags
+			NUL, 0, # msg_name, msg_namelen (unused)
+			@BYTES_4_hole,
+			$iov, 1, # msg_iov, msg_iovlen
+			$cmsghdr, # msg_control
+			256, # msg_controllen
+			0); # msg_flags
+	my $r = syscall($SYS_recvmsg, fileno($sock), $mh, 0);
+	return (undef) if $r < 0; # $! set
+	substr($_[1], $r, length($_[1]), '');
+	my @ret;
+	if ($r > 0) {
+		my ($len, $lvl, $type, @fds) = unpack(TMPL_size_t . # cmsg_len
+					'LLi*', # cmsg_level, cmsg_type, @fds
+					$cmsghdr);
+		if ($lvl == SOL_SOCKET && $type == SCM_RIGHTS) {
+			$len -= CMSG_ALIGN_SIZEOF_cmsghdr;
+			@ret = @fds[0..(($len / SIZEOF_int) - 1)];
+		}
+	}
+	@ret;
+};
+}
+
 1;
 
 =head1 WARRANTY
diff --git a/script/lei b/script/lei
index 5cad19d7..adef9944 100755
--- a/script/lei
+++ b/script/lei
@@ -1,5 +1,5 @@
 #!perl -w
-# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict;
 use v5.10.1;
@@ -9,6 +9,10 @@ my $narg = 5;
 my $sock;
 my $recv_cmd = PublicInbox::CmdIPC4->can('recv_cmd4');
 my $send_cmd = PublicInbox::CmdIPC4->can('send_cmd4') // do {
+	require PublicInbox::Syscall;
+	$recv_cmd = PublicInbox::Syscall->can('recv_cmd4');
+	PublicInbox::Syscall->can('send_cmd4');
+} // do {
 	my $inline_dir = $ENV{PERL_INLINE_DIRECTORY} //= (
 			$ENV{XDG_CACHE_HOME} //
 			( ($ENV{HOME} // '/nonexistent').'/.cache' )
diff --git a/t/cmd_ipc.t b/t/cmd_ipc.t
index dd90fa2a..75697a15 100644
--- a/t/cmd_ipc.t
+++ b/t/cmd_ipc.t
@@ -1,5 +1,5 @@
 #!perl -w
-# Copyright (C) 2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict;
 use v5.10.1;
@@ -142,4 +142,15 @@ SKIP: {
 	}
 }
 
+SKIP: {
+	skip 'not Linux', 1 if $^O ne 'linux';
+	require_ok 'PublicInbox::Syscall';
+	$send = PublicInbox::Syscall->can('send_cmd4') or
+		skip 'send_cmd4 not defined for arch';
+	$recv = PublicInbox::Syscall->can('recv_cmd4') or
+		skip 'recv_cmd4 not defined for arch';
+	$do_test->(SOCK_STREAM, 0, 'PP Linux stream');
+	$do_test->($SOCK_SEQPACKET, MSG_EOR, 'PP Linux seqpacket');
+}
+
 done_testing;

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 4/3] syscall: add sendmsg+recvmsg for remaining arches
  2022-03-23  8:54 [PATCH 0/3] support sendmsg+recvmsg in pure Perl under Linux Eric Wong
                   ` (2 preceding siblings ...)
  2022-03-23  8:54 ` [PATCH 3/3] syscall: implement sendmsg+recvmsg in pure Perl Eric Wong
@ 2022-03-23 21:08 ` Eric Wong
  3 siblings, 0 replies; 5+ messages in thread
From: Eric Wong @ 2022-03-23 21:08 UTC (permalink / raw)
  To: meta

aarch64, ppc64le, sparc64, loongarch64, and mips (32-bit userspace)
are all tested via machines from the GCC Farm Project
<https://cfarm.tetaneutral.net/>

Remaining syscall numbers are from musl <https://musl.libc.org/>
---
 lib/PublicInbox/Syscall.pm | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/lib/PublicInbox/Syscall.pm b/lib/PublicInbox/Syscall.pm
index e9175ceb..e972aa41 100644
--- a/lib/PublicInbox/Syscall.pm
+++ b/lib/PublicInbox/Syscall.pm
@@ -3,7 +3,8 @@
 # fix upstream regressions in 0.25.
 #
 # See devel/syscall-list in the public-inbox source tree for maintenance
-# <https://80x24.org/public-inbox.git>
+# <https://80x24.org/public-inbox.git>, and machines from the GCC Farm:
+# <https://cfarm.tetaneutral.net/>
 #
 # This license differs from the rest of public-inbox
 #
@@ -150,6 +151,8 @@ if ($^O eq "linux") {
 	$SYS_renameat2 //= 345;
 	$SFD_CLOEXEC = 020000000;
 	$SYS_fstatfs = 158;
+	$SYS_sendmsg = 114;
+	$SYS_recvmsg = 113;
 	$FS_IOC_GETFLAGS = 0x40086601;
 	$FS_IOC_SETFLAGS = 0x80086602;
     } elsif ($machine =~ m/^parisc/) {
@@ -166,6 +169,8 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 313;
 	$SYS_renameat2 //= 357;
 	$SYS_fstatfs = 100;
+	$SYS_sendmsg = 341;
+	$SYS_recvmsg = 342;
 	$FS_IOC_GETFLAGS = 0x40086601;
 	$FS_IOC_SETFLAGS = 0x80086602;
     } elsif ($machine eq "ppc") {
@@ -178,7 +183,7 @@ if ($^O eq "linux") {
 	$SYS_fstatfs = 100;
 	$FS_IOC_GETFLAGS = 0x40086601;
 	$FS_IOC_SETFLAGS = 0x80086602;
-    } elsif ($machine =~ m/^s390/) {
+    } elsif ($machine =~ m/^s390/) { # untested, no machine on cfarm
         $SYS_epoll_create = 249;
         $SYS_epoll_ctl    = 250;
         $SYS_epoll_wait   = 251;
@@ -186,13 +191,15 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 322;
 	$SYS_renameat2 //= 347;
 	$SYS_fstatfs = 100;
-    } elsif ($machine eq "ia64") {
+	$SYS_sendmsg = 370;
+	$SYS_recvmsg = 372;
+    } elsif ($machine eq 'ia64') { # untested, no machine on cfarm
         $SYS_epoll_create = 1243;
         $SYS_epoll_ctl    = 1244;
         $SYS_epoll_wait   = 1245;
         $u64_mod_8        = 1;
         $SYS_signalfd4 = 289;
-    } elsif ($machine eq "alpha") {
+    } elsif ($machine eq "alpha") { # untested, no machine on cfarm
         # natural alignment, ints are 32-bits
         $SYS_epoll_create = 407;
         $SYS_epoll_ctl    = 408;
@@ -200,7 +207,7 @@ if ($^O eq "linux") {
         $u64_mod_8        = 1;
         $SYS_signalfd4 = 484;
 	$SFD_CLOEXEC = 010000000;
-    } elsif ($machine eq "aarch64") {
+    } elsif ($machine eq 'aarch64' || $machine eq 'loongarch64') {
         $SYS_epoll_create = 20;  # (sys_epoll_create1)
         $SYS_epoll_ctl    = 21;
         $SYS_epoll_wait   = 22;  # (sys_epoll_pwait)
@@ -209,10 +216,11 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 74;
 	$SYS_renameat2 //= 276;
 	$SYS_fstatfs = 44;
+	$SYS_sendmsg = 211;
+	$SYS_recvmsg = 212;
 	$FS_IOC_GETFLAGS = 0x80086601;
 	$FS_IOC_SETFLAGS = 0x40086602;
-    } elsif ($machine =~ m/arm(v\d+)?.*l/) {
-        # ARM OABI
+    } elsif ($machine =~ m/arm(v\d+)?.*l/) { # ARM OABI (untested on cfarm)
         $SYS_epoll_create = 250;
         $SYS_epoll_ctl    = 251;
         $SYS_epoll_wait   = 252;
@@ -220,7 +228,9 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 355;
 	$SYS_renameat2 //= 382;
 	$SYS_fstatfs = 100;
-    } elsif ($machine =~ m/^mips64/) {
+	$SYS_sendmsg = 296;
+	$SYS_recvmsg = 297;
+    } elsif ($machine =~ m/^mips64/) { # cfarm only has 32-bit userspace
         $SYS_epoll_create = 5207;
         $SYS_epoll_ctl    = 5208;
         $SYS_epoll_wait   = 5209;
@@ -228,9 +238,11 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 5283;
 	$SYS_renameat2 //= 5311;
 	$SYS_fstatfs = 5135;
+	$SYS_sendmsg = 5045;
+	$SYS_recvmsg = 5046;
 	$FS_IOC_GETFLAGS = 0x40046601;
 	$FS_IOC_SETFLAGS = 0x80046602;
-    } elsif ($machine =~ m/^mips/) {
+    } elsif ($machine =~ m/^mips/) { # 32-bit, tested on mips64 cfarm machine
         $SYS_epoll_create = 4248;
         $SYS_epoll_ctl    = 4249;
         $SYS_epoll_wait   = 4250;
@@ -238,6 +250,8 @@ if ($^O eq "linux") {
         $SYS_signalfd4 = 4324;
 	$SYS_renameat2 //= 4351;
 	$SYS_fstatfs = 4100;
+	$SYS_sendmsg = 4179;
+	$SYS_recvmsg = 4177;
 	$FS_IOC_GETFLAGS = 0x40046601;
 	$FS_IOC_SETFLAGS = 0x80046602;
     } else {

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-03-23 21:08 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-23  8:54 [PATCH 0/3] support sendmsg+recvmsg in pure Perl under Linux Eric Wong
2022-03-23  8:54 ` [PATCH 1/3] syscall: drop unused EEXIST import Eric Wong
2022-03-23  8:54 ` [PATCH 2/3] recv_cmd: do not undef recvmsg buffer arg on errors Eric Wong
2022-03-23  8:54 ` [PATCH 3/3] syscall: implement sendmsg+recvmsg in pure Perl Eric Wong
2022-03-23 21:08 ` [PATCH 4/3] syscall: add sendmsg+recvmsg for remaining arches Eric Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).