unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
* [PATCH 0/7] various build fixes + OpenBSD compat
@ 2023-08-30  5:10 Eric Wong
  2023-08-30  5:10 ` [PATCH 1/7] treewide: drop MSG_EOR with AF_UNIX+SOCK_SEQPACKET Eric Wong
                   ` (7 more replies)
  0 siblings, 8 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

7/7 had me shaking my head for a bit, but I'd rather pay
that price than introduce weirdness with C++ templates.

Eric Wong (7):
  treewide: drop MSG_EOR with AF_UNIX+SOCK_SEQPACKET
  Makefile.PL: fix syntax for ASan and valgrind targets
  Makefile.PL: depend on autodie, at least for tests
  t/kqnotify: improve test reliability on OpenBSD
  xap_helper.h: don't compress debug sections on OpenBSD
  xap_helper.h: limit stderr assignment to glibc+FreeBSD
  xap_helper.h: fix double-free on OpenBSD hdestroy

 INSTALL                          |  1 +
 Makefile.PL                      | 10 +++--
 lib/PublicInbox/CodeSearchIdx.pm |  8 ++--
 lib/PublicInbox/IPC.pm           | 10 ++---
 lib/PublicInbox/LEI.pm           | 28 ++++++-------
 lib/PublicInbox/PktOp.pm         |  4 +-
 lib/PublicInbox/WQBlocked.pm     |  3 +-
 lib/PublicInbox/XapClient.pm     |  4 +-
 lib/PublicInbox/XapHelperCxx.pm  |  4 +-
 lib/PublicInbox/xap_helper.h     | 68 ++++++++++++++++++++++++++++----
 script/lei                       | 10 ++---
 t/check-www-inbox.perl           |  4 +-
 t/cmd_ipc.t                      |  8 ++--
 t/kqnotify.t                     | 55 +++++++++++++++++++-------
 t/lei-daemon.t                   |  4 +-
 t/xap_helper.t                   | 11 +++---
 16 files changed, 158 insertions(+), 74 deletions(-)

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

* [PATCH 1/7] treewide: drop MSG_EOR with AF_UNIX+SOCK_SEQPACKET
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
@ 2023-08-30  5:10 ` Eric Wong
  2023-08-30  5:10 ` [PATCH 2/7] Makefile.PL: fix syntax for ASan and valgrind targets Eric Wong
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

It's apparently not needed for AF_UNIX + SOCK_SEQPACKET as our
receivers never check for MSG_EOR in "struct msghdr".msg_flags
anyways.  I don't believe POSIX is clear on the exact semantics
of MSG_EOR on this socket type.  This works around truncation
problems on OpenBSD recvmsg when MSG_EOR is used by the sender.

Link: https://marc.info/?i=20230826020759.M335788@dcvr
---
 lib/PublicInbox/CodeSearchIdx.pm |  8 ++++----
 lib/PublicInbox/IPC.pm           | 10 +++++-----
 lib/PublicInbox/LEI.pm           | 28 ++++++++++++++--------------
 lib/PublicInbox/PktOp.pm         |  4 ++--
 lib/PublicInbox/WQBlocked.pm     |  3 +--
 lib/PublicInbox/XapClient.pm     |  4 ++--
 script/lei                       | 10 +++++-----
 t/check-www-inbox.perl           |  4 ++--
 t/cmd_ipc.t                      |  8 ++++----
 t/lei-daemon.t                   |  4 ++--
 t/xap_helper.t                   |  4 ++--
 11 files changed, 43 insertions(+), 44 deletions(-)

diff --git a/lib/PublicInbox/CodeSearchIdx.pm b/lib/PublicInbox/CodeSearchIdx.pm
index f9251be5..2e46e30a 100644
--- a/lib/PublicInbox/CodeSearchIdx.pm
+++ b/lib/PublicInbox/CodeSearchIdx.pm
@@ -55,7 +55,7 @@ use PublicInbox::CidxLogP;
 use PublicInbox::CidxComm;
 use PublicInbox::Git qw(%OFMT2HEXLEN);
 use PublicInbox::Compat qw(uniqstr);
-use Socket qw(MSG_EOR AF_UNIX SOCK_SEQPACKET);
+use Socket qw(AF_UNIX SOCK_SEQPACKET);
 use Carp ();
 our (
 	$LIVE, # pid => cmd
@@ -253,7 +253,7 @@ sub cidx_reap_log { # awaitpid cb
 	my ($pid, $self, $op_p) = @_;
 	if (!$? || ($DO_QUIT && (($? & 127) == $DO_QUIT ||
 				($? & 127) == POSIX::SIGPIPE))) {
-		send($op_p, "shard_done $self->{shard}", MSG_EOR);
+		send($op_p, "shard_done $self->{shard}", 0);
 	} else {
 		warn "E: git @LOG_STDIN: \$?=$?\n";
 		$self->{xdb}->cancel_transaction;
@@ -501,7 +501,7 @@ sub shard_commit { # via wq_io_do
 	my ($self) = @_;
 	my $op_p = delete($self->{0}) // die 'BUG: no {0} op_p';
 	$self->commit_txn_lazy;
-	send($op_p, "shard_done $self->{shard}", MSG_EOR);
+	send($op_p, "shard_done $self->{shard}", 0);
 }
 
 sub assoc_max_init ($) {
@@ -782,7 +782,7 @@ sub prune_commit { # via wq_io_do in IDX_SHARDS
 	my $prune_op_p = delete $self->{0} // die 'BUG: no {0} op_p';
 	my $nr = delete $self->{nr_prune} // die 'BUG: nr_prune undef';
 	cidx_ckpoint($self, "prune [$self->{shard}] $nr done") if $nr;
-	send($prune_op_p, "prune_done $self->{shard}", MSG_EOR);
+	send($prune_op_p, "prune_done $self->{shard}", 0);
 }
 
 sub shards_active { # post_loop_do
diff --git a/lib/PublicInbox/IPC.pm b/lib/PublicInbox/IPC.pm
index 84765748..766c377f 100644
--- a/lib/PublicInbox/IPC.pm
+++ b/lib/PublicInbox/IPC.pm
@@ -16,7 +16,7 @@ use PublicInbox::DS qw(awaitpid);
 use PublicInbox::Spawn;
 use PublicInbox::OnDestroy;
 use PublicInbox::WQWorker;
-use Socket qw(AF_UNIX MSG_EOR SOCK_STREAM);
+use Socket qw(AF_UNIX SOCK_STREAM);
 my $MY_MAX_ARG_STRLEN = 4096 * 33; # extra 4K for serialization
 my $SEQPACKET = eval { Socket::SOCK_SEQPACKET() }; # portable enough?
 our @EXPORT_OK = qw(ipc_freeze ipc_thaw nproc_shards);
@@ -279,7 +279,7 @@ sub wq_broadcast {
 		my $buf = ipc_freeze([$sub, @args]);
 		for my $bcast1 (values %$wkr) {
 			my $sock = $bcast1 // $self->{-wq_s1} // next;
-			send($sock, $buf, MSG_EOR) // croak "send: $!";
+			send($sock, $buf, 0) // croak "send: $!";
 			# XXX shouldn't have to deal with EMSGSIZE here...
 		}
 	} else {
@@ -294,7 +294,7 @@ sub stream_in_full ($$$) {
 		croak "socketpair: $!";
 	my $n = send_cmd($s1, [ fileno($r) ],
 			ipc_freeze(['do_sock_stream', length($buf)]),
-			MSG_EOR) // croak "sendmsg: $!";
+			0) // croak "sendmsg: $!";
 	undef $r;
 	$n = send_cmd($w, $fds, $buf, 0) // croak "sendmsg: $!";
 	while ($n < length($buf)) {
@@ -316,7 +316,7 @@ sub wq_io_do { # always async
 		if (length($buf) > $MY_MAX_ARG_STRLEN) {
 			stream_in_full($s1, $fds, $buf);
 		} else {
-			my $n = send_cmd $s1, $fds, $buf, MSG_EOR;
+			my $n = send_cmd $s1, $fds, $buf, 0;
 			return if defined($n); # likely
 			$!{ETOOMANYREFS} and
 				croak "sendmsg: $! (check RLIMIT_NOFILE)";
@@ -365,7 +365,7 @@ sub wq_nonblock_do { # always async
 	if ($self->{wqb}) { # saturated once, assume saturated forever
 		$self->{wqb}->flush_send($buf);
 	} else {
-		$send_cmd->($self->{-wq_s1}, [], $buf, MSG_EOR) //
+		$send_cmd->($self->{-wq_s1}, [], $buf, 0) //
 			($!{EAGAIN} ? PublicInbox::WQBlocked->new($self, $buf)
 					: croak("sendmsg: $!"));
 	}
diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm
index 578686e2..5fbb1211 100644
--- a/lib/PublicInbox/LEI.pm
+++ b/lib/PublicInbox/LEI.pm
@@ -10,7 +10,7 @@ use v5.12;
 use parent qw(PublicInbox::DS PublicInbox::LeiExternal
 	PublicInbox::LeiQuery);
 use Getopt::Long ();
-use Socket qw(AF_UNIX SOCK_SEQPACKET MSG_EOR pack_sockaddr_un);
+use Socket qw(AF_UNIX SOCK_SEQPACKET pack_sockaddr_un);
 use Errno qw(EPIPE EAGAIN ECONNREFUSED ENOENT ECONNRESET);
 use Cwd qw(getcwd);
 use POSIX qw(strftime);
@@ -481,7 +481,7 @@ sub x_it ($$) {
 	if ($self->{pkt_op_p}) { # worker => lei-daemon
 		$self->{pkt_op_p}->pkt_do('x_it', $code);
 	} elsif ($self->{sock}) { # lei->daemon => lei(1) client
-		send($self->{sock}, "x_it $code", MSG_EOR);
+		send($self->{sock}, "x_it $code", 0);
 	} elsif ($quit == \&CORE::exit) { # an admin (one-shot) command
 		exit($code >> 8);
 	} # else ignore if client disconnected
@@ -548,7 +548,7 @@ sub child_error { # passes non-fatal curl exit codes to user
 	if ($self->{pkt_op_p}) { # to top lei-daemon
 		$self->{pkt_op_p}->pkt_do('child_error', $child_error);
 	} elsif ($self->{sock}) { # to lei(1) client
-		send($self->{sock}, "child_error $child_error", MSG_EOR);
+		send($self->{sock}, "child_error $child_error", 0);
 	} # else noop if client disconnected
 }
 
@@ -1017,7 +1017,7 @@ sub send_exec_cmd { # tell script/lei to execute a command
 	PublicInbox::IPC::send_cmd(
 			$self->{sock} // die('lei client gone'),
 			[ map { fileno($_) } @$io ],
-			exec_buf($cmd, $env), MSG_EOR) //
+			exec_buf($cmd, $env), 0) //
 		Carp::croak("sendmsg: $!");
 }
 
@@ -1028,7 +1028,7 @@ sub poke_mua { # forces terminal MUAs to wake up and hopefully notice new mail
 	while (my $op = shift(@$alerts)) {
 		if ($op eq ':WINCH') {
 			# hit the process group that started the MUA
-			send($sock, '-WINCH', MSG_EOR) if $sock;
+			send($sock, '-WINCH', 0) if $sock;
 		} elsif ($op eq ':bell') {
 			out($self, "\a");
 		} elsif ($op =~ /(?<!\\),/) { # bare ',' (not ',,')
@@ -1037,7 +1037,7 @@ sub poke_mua { # forces terminal MUAs to wake up and hopefully notice new mail
 			my $cmd = $1; # run an arbitrary command
 			require Text::ParseWords;
 			$cmd = [ Text::ParseWords::shellwords($cmd) ];
-			send($sock, exec_buf($cmd, {}), MSG_EOR) if $sock;
+			send($sock, exec_buf($cmd, {}), 0) if $sock;
 		} else {
 			warn("W: unsupported --alert=$op\n"); # non-fatal
 		}
@@ -1093,7 +1093,7 @@ sub pgr_err {
 	print { $self->{2} } @msg;
 	$self->{2}->autoflush(1);
 	stop_pager($self);
-	send($self->{sock}, 'wait', MSG_EOR); # wait for user to quit pager
+	send($self->{sock}, 'wait', 0); # wait for user to quit pager
 }
 
 sub stop_pager {
@@ -1110,25 +1110,25 @@ sub accept_dispatch { # Listener {post_accept} callback
 	my $self = bless { sock => $sock }, __PACKAGE__;
 	vec(my $rvec = '', fileno($sock), 1) = 1;
 	select($rvec, undef, undef, 60) or
-		return send($sock, 'timed out waiting to recv FDs', MSG_EOR);
+		return send($sock, 'timed out waiting to recv FDs', 0);
 	# (4096 * 33) >MAX_ARG_STRLEN
 	my @fds = PublicInbox::IPC::recv_cmd($sock, my $buf, 4096 * 33) or
 		return; # EOF
 	if (!defined($fds[0])) {
 		warn(my $msg = "recv_cmd failed: $!");
-		return send($sock, $msg, MSG_EOR);
+		return send($sock, $msg, 0);
 	} else {
 		my $i = 0;
 		for my $fd (@fds) {
 			open($self->{$i++}, '+<&=', $fd) and next;
-			send($sock, "open(+<&=$fd) (FD=$i): $!", MSG_EOR);
+			send($sock, "open(+<&=$fd) (FD=$i): $!", 0);
 		}
-		$i == 4 or return send($sock, 'not enough FDs='.($i-1), MSG_EOR)
+		$i == 4 or return send($sock, 'not enough FDs='.($i-1), 0)
 	}
 	# $ENV_STR = join('', map { "\0$_=$ENV{$_}" } keys %ENV);
 	# $buf = "$argc\0".join("\0", @ARGV).$ENV_STR."\0\0";
 	substr($buf, -2, 2, '') eq "\0\0" or  # s/\0\0\z//
-		return send($sock, 'request command truncated', MSG_EOR);
+		return send($sock, 'request command truncated', 0);
 	my ($argc, @argv) = split(/\0/, $buf, -1);
 	undef $buf;
 	my %env = map { split(/=/, $_, 2) } splice(@argv, $argc);
@@ -1174,7 +1174,7 @@ sub event_step {
 			die "unrecognized client signal: $buf";
 		}
 		my $s = $self->{-socks} // []; # lei up --all
-		@$s = grep { send($_, $buf, MSG_EOR) } @$s;
+		@$s = grep { send($_, $buf, 0) } @$s;
 	};
 	if (my $err = $@) {
 		eval { $self->fail($err) };
@@ -1534,7 +1534,7 @@ sub cfg_dump ($$) {
 sub request_umask {
 	my ($lei) = @_;
 	my $s = $lei->{sock} // return;
-	send($s, 'umask', MSG_EOR) // die "send: $!";
+	send($s, 'umask', 0) // die "send: $!";
 	vec(my $rvec = '', fileno($s), 1) = 1;
 	select($rvec, undef, undef, 2) or die 'timeout waiting for umask';
 	recv($s, my $v, 5, 0) // die "recv: $!";
diff --git a/lib/PublicInbox/PktOp.pm b/lib/PublicInbox/PktOp.pm
index 4c434566..dc432307 100644
--- a/lib/PublicInbox/PktOp.pm
+++ b/lib/PublicInbox/PktOp.pm
@@ -11,7 +11,7 @@ use v5.10.1;
 use parent qw(PublicInbox::DS);
 use Errno qw(EAGAIN ECONNRESET);
 use PublicInbox::Syscall qw(EPOLLIN);
-use Socket qw(AF_UNIX MSG_EOR SOCK_SEQPACKET);
+use Socket qw(AF_UNIX SOCK_SEQPACKET);
 use PublicInbox::IPC qw(ipc_freeze ipc_thaw);
 use Scalar::Util qw(blessed);
 
@@ -32,7 +32,7 @@ sub pair {
 
 sub pkt_do { # for the producer to trigger event_step in consumer
 	my ($self, $cmd, @args) = @_;
-	send($self->{op_p}, @args ? "$cmd\0".ipc_freeze(\@args) : $cmd, MSG_EOR)
+	send($self->{op_p}, @args ? "$cmd\0".ipc_freeze(\@args) : $cmd, 0)
 }
 
 sub event_step {
diff --git a/lib/PublicInbox/WQBlocked.pm b/lib/PublicInbox/WQBlocked.pm
index fbb43600..8d931fa9 100644
--- a/lib/PublicInbox/WQBlocked.pm
+++ b/lib/PublicInbox/WQBlocked.pm
@@ -8,7 +8,6 @@ use parent qw(PublicInbox::DS);
 use PublicInbox::Syscall qw(EPOLLOUT EPOLLONESHOT);
 use PublicInbox::IPC;
 use Carp ();
-use Socket qw(MSG_EOR);
 
 sub new {
 	my ($cls, $wq, $buf) = @_;
@@ -25,7 +24,7 @@ sub flush_send {
 		} else {
 			my $wq_s1 = $self->{sock};
 			my $n = $PublicInbox::IPC::send_cmd->($wq_s1, [], $buf,
-								MSG_EOR);
+								0);
 			next if defined($n);
 			Carp::croak("sendmsg: $!") unless $!{EAGAIN};
 			PublicInbox::DS::epwait($wq_s1, EPOLLOUT|EPOLLONESHOT);
diff --git a/lib/PublicInbox/XapClient.pm b/lib/PublicInbox/XapClient.pm
index 56e3c3b4..f6c09c3b 100644
--- a/lib/PublicInbox/XapClient.pm
+++ b/lib/PublicInbox/XapClient.pm
@@ -9,7 +9,7 @@
 package PublicInbox::XapClient;
 use v5.12;
 use PublicInbox::Spawn qw(spawn);
-use Socket qw(AF_UNIX SOCK_SEQPACKET MSG_EOR);
+use Socket qw(AF_UNIX SOCK_SEQPACKET);
 use PublicInbox::IPC;
 
 sub mkreq {
@@ -21,7 +21,7 @@ sub mkreq {
 	}
 	my @fds = map fileno($_), @$ios;
 	my $buf = join("\0", @arg, '');
-	$n = PublicInbox::IPC::send_cmd($self->{io}, \@fds, $buf, MSG_EOR) //
+	$n = PublicInbox::IPC::send_cmd($self->{io}, \@fds, $buf, 0) //
 		die "send_cmd: $!";
 	$n == length($buf) or die "send_cmd: $n != ".length($buf);
 	$r;
diff --git a/script/lei b/script/lei
index 5feb7751..a77ea880 100755
--- a/script/lei
+++ b/script/lei
@@ -2,7 +2,7 @@
 # Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use v5.12;
-use Socket qw(AF_UNIX SOCK_SEQPACKET MSG_EOR pack_sockaddr_un);
+use Socket qw(AF_UNIX SOCK_SEQPACKET pack_sockaddr_un);
 use PublicInbox::CmdIPC4;
 my $narg = 5;
 my $sock;
@@ -109,9 +109,9 @@ open my $dh, '<', '.' or die "open(.) $!";
 my $buf = join("\0", scalar(@ARGV), @ARGV);
 while (my ($k, $v) = each %ENV) { $buf .= "\0$k=$v" }
 $buf .= "\0\0";
-$send_cmd->($sock, [0, 1, 2, fileno($dh)], $buf, MSG_EOR) or die "sendmsg: $!";
-$SIG{TSTP} = sub { send($sock, 'STOP', MSG_EOR); kill 'STOP', $$ };
-$SIG{CONT} = sub { send($sock, 'CONT', MSG_EOR) };
+$send_cmd->($sock, [0, 1, 2, fileno($dh)], $buf, 0) or die "sendmsg: $!";
+$SIG{TSTP} = sub { send($sock, 'STOP', 0); kill 'STOP', $$ };
+$SIG{CONT} = sub { send($sock, 'CONT', 0) };
 
 my $x_it_code = 0;
 while (1) {
@@ -126,7 +126,7 @@ while (1) {
 	} elsif ($buf eq '-WINCH') {
 		kill($buf, @parent); # for MUA
 	} elsif ($buf eq 'umask') {
-		send($sock, 'u'.pack('V', umask), MSG_EOR) or die "send: $!"
+		send($sock, 'u'.pack('V', umask), 0) or die "send: $!"
 	} elsif ($buf =~ /\Ax_it ([0-9]+)\z/) {
 		$x_it_code ||= $1 + 0;
 		last;
diff --git a/t/check-www-inbox.perl b/t/check-www-inbox.perl
index 033b90d1..46f9ce1e 100644
--- a/t/check-www-inbox.perl
+++ b/t/check-www-inbox.perl
@@ -123,7 +123,7 @@ while (keys %workers) { # reacts to SIGCHLD
 		}
 	}
 	while ($u = shift @queue) {
-		my $s = $todo[1]->send($u, MSG_EOR);
+		my $s = $todo[1]->send($u, 0);
 		if ($!{EAGAIN}) {
 			unshift @queue, $u;
 			last;
@@ -177,7 +177,7 @@ sub worker_loop {
 		foreach my $l (@links, "DONE\t$u") {
 			next if $l eq '' || $l =~ /\.mbox(?:\.gz)\z/;
 			do {
-				$s = $done_wr->send($l, MSG_EOR);
+				$s = $done_wr->send($l, 0);
 			} while (!defined $s && $!{EINTR});
 			die "$$ send $!\n" unless defined $s;
 			my $n = length($l);
diff --git a/t/cmd_ipc.t b/t/cmd_ipc.t
index cd76d5e8..403d0eed 100644
--- a/t/cmd_ipc.t
+++ b/t/cmd_ipc.t
@@ -5,7 +5,7 @@ use strict;
 use v5.10.1;
 use Test::More;
 use PublicInbox::TestCommon;
-use Socket qw(AF_UNIX SOCK_STREAM MSG_EOR);
+use Socket qw(AF_UNIX SOCK_STREAM);
 pipe(my ($r, $w)) or BAIL_OUT;
 my ($send, $recv);
 require_ok 'PublicInbox::Spawn';
@@ -122,7 +122,7 @@ SKIP: {
 	$send = $send_ic;
 	$recv = $recv_ic;
 	$do_test->(SOCK_STREAM, 0, 'Inline::C stream');
-	$do_test->($SOCK_SEQPACKET, MSG_EOR, 'Inline::C seqpacket');
+	$do_test->($SOCK_SEQPACKET, 0, 'Inline::C seqpacket');
 }
 
 SKIP: {
@@ -131,7 +131,7 @@ SKIP: {
 	$send = PublicInbox::CmdIPC4->can('send_cmd4');
 	$recv = PublicInbox::CmdIPC4->can('recv_cmd4');
 	$do_test->(SOCK_STREAM, 0, 'MsgHdr stream');
-	$do_test->($SOCK_SEQPACKET, MSG_EOR, 'MsgHdr seqpacket');
+	$do_test->($SOCK_SEQPACKET, 0, 'MsgHdr seqpacket');
 	SKIP: {
 		($send_ic && $recv_ic) or
 			skip 'Inline::C not installed/enabled', 12;
@@ -149,7 +149,7 @@ SKIP: {
 	$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');
+	$do_test->($SOCK_SEQPACKET, 0, 'PP Linux seqpacket');
 }
 
 done_testing;
diff --git a/t/lei-daemon.t b/t/lei-daemon.t
index e11105bc..78ed265e 100644
--- a/t/lei-daemon.t
+++ b/t/lei-daemon.t
@@ -2,7 +2,7 @@
 # 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; use PublicInbox::TestCommon;
-use Socket qw(AF_UNIX SOCK_SEQPACKET MSG_EOR pack_sockaddr_un);
+use Socket qw(AF_UNIX SOCK_SEQPACKET pack_sockaddr_un);
 
 test_lei({ daemon_only => 1 }, sub {
 	my $send_cmd = PublicInbox::Spawn->can('send_cmd4') // do {
@@ -40,7 +40,7 @@ test_lei({ daemon_only => 1 }, sub {
 			socket(my $c, AF_UNIX, SOCK_SEQPACKET, 0) or
 							BAIL_OUT "socket: $!";
 			connect($c, $addr) or BAIL_OUT "connect: $!";
-			$send_cmd->($c, \@fds, 'hi',  MSG_EOR);
+			$send_cmd->($c, \@fds, 'hi',  0);
 		}
 		lei_ok('daemon-pid');
 		chomp($pid = $lei_out);
diff --git a/t/xap_helper.t b/t/xap_helper.t
index 3646cf97..73c1c849 100644
--- a/t/xap_helper.t
+++ b/t/xap_helper.t
@@ -7,7 +7,7 @@ require_mods(qw(DBD::SQLite Search::Xapian));
 my $msg = no_scm_rights;
 plan(skip_all => $msg) if $msg; # TODO: FIFO support?
 use PublicInbox::Spawn qw(spawn);
-use Socket qw(AF_UNIX SOCK_SEQPACKET SOCK_STREAM MSG_EOR);
+use Socket qw(AF_UNIX SOCK_SEQPACKET SOCK_STREAM);
 require PublicInbox::AutoReap;
 require PublicInbox::IPC;
 require PublicInbox::XapClient;
@@ -54,7 +54,7 @@ my $doreq = sub {
 	my $buf = join("\0", @arg, '');
 	my @fds = fileno($y);
 	push @fds, fileno($err) if $err;
-	my $n = PublicInbox::IPC::send_cmd($s, \@fds, $buf, MSG_EOR);
+	my $n = PublicInbox::IPC::send_cmd($s, \@fds, $buf, 0);
 	$n // xbail "send: $!";
 	my $arg = "@arg";
 	$arg =~ s/\Q$tmp\E/\$TMP/gs;

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

* [PATCH 2/7] Makefile.PL: fix syntax for ASan and valgrind targets
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
  2023-08-30  5:10 ` [PATCH 1/7] treewide: drop MSG_EOR with AF_UNIX+SOCK_SEQPACKET Eric Wong
@ 2023-08-30  5:10 ` Eric Wong
  2023-08-30  5:10 ` [PATCH 3/7] Makefile.PL: depend on autodie, at least for tests Eric Wong
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

Mixing various quoting and escaping rules between shell, make,
and Perl got confusing in Makefile.PL :x  This hopefully sorts
out my confusion.

We'll also fix and use TEST_XH_CXX_ONLY=1 to avoid needlessly
running the tests on the XS||SWIG implementation when we're
checking for memory errors.

Fixes: 2312ca26023fcbe3 (makefile: add targets for ASan and valgrind)
---
 Makefile.PL    | 9 +++++----
 t/xap_helper.t | 7 +++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/Makefile.PL b/Makefile.PL
index 5865a252..d2309336 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -264,12 +264,13 @@ lib/PublicInbox.pm : FORCE
 	VERSION=\$(VERSION) \$(PERL) -w ./version-gen.perl
 
 test-asan : pure_all
-	CXXFLAGS='-O0 -Wall -ggdb3 -fsanitize=address' \
+	TEST_XH_CXX_ONLY=1 CXXFLAGS='-O0 -Wall -ggdb3 -fsanitize=address' \\
 		prove -bvw t/xap_helper.t
 
-VG_OPT = '-v --trace-children=yes --track-fds=yes'
-VG_OPT += ' --leak-check=yes --track-origins=yes'
+VG_OPT = -v --trace-children=yes --track-fds=yes
+VG_OPT += --leak-check=yes --track-origins=yes
 test-valgrind : pure_all
-	VALGRIND="valgrind \$\$(VG_OPT)" prove -bvw t/xap_helper.t
+	TEST_XH_CXX_ONLY=1 VALGRIND="valgrind \$(VG_OPT)" \\
+		prove -bvw t/xap_helper.t
 EOF
 }
diff --git a/t/xap_helper.t b/t/xap_helper.t
index 73c1c849..b68f2773 100644
--- a/t/xap_helper.t
+++ b/t/xap_helper.t
@@ -107,13 +107,12 @@ my $test = sub {
 };
 my $ar;
 
-my @NO_CXX;
-if (!$ENV{TEST_XH_CXX_ONLY}) {
+my @NO_CXX = (1);
+unless ($ENV{TEST_XH_CXX_ONLY}) {
 	$ar = $test->(qw[-MPublicInbox::XapHelper -e
 			PublicInbox::XapHelper::start('-j0')]);
 	$ar = $test->(qw[-MPublicInbox::XapHelper -e
 			PublicInbox::XapHelper::start('-j1')]);
-	push @NO_CXX, 0;
 }
 SKIP: {
 	eval {
@@ -121,8 +120,8 @@ SKIP: {
 		PublicInbox::XapHelperCxx::check_build();
 	};
 	skip "XapHelperCxx build: $@", 1 if $@;
-	push @NO_CXX, 1;
 
+	@NO_CXX = $ENV{TEST_XH_CXX_ONLY} ? (0) : (0, 1);
 	$ar = $test->(qw[-MPublicInbox::XapHelperCxx -e
 			PublicInbox::XapHelperCxx::start('-j0')]);
 	$ar = $test->(qw[-MPublicInbox::XapHelperCxx -e

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

* [PATCH 3/7] Makefile.PL: depend on autodie, at least for tests
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
  2023-08-30  5:10 ` [PATCH 1/7] treewide: drop MSG_EOR with AF_UNIX+SOCK_SEQPACKET Eric Wong
  2023-08-30  5:10 ` [PATCH 2/7] Makefile.PL: fix syntax for ASan and valgrind targets Eric Wong
@ 2023-08-30  5:10 ` Eric Wong
  2023-08-30  5:10 ` [PATCH 4/7] t/kqnotify: improve test reliability on OpenBSD Eric Wong
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

While using autodie everywhere is not appropriate[*], many of
our tests and FS access code can be easier-to-write and more
readable using autodie as we've started doing in XapHelperCxx.pm
and xap_helper.t

[*] - EAGAIN on non-blocking I/O shouldn't die, nor should
      certain cases of opening maybe-missing files for reading
---
 INSTALL     | 1 +
 Makefile.PL | 1 +
 2 files changed, 2 insertions(+)

diff --git a/INSTALL b/INSTALL
index f5e14ebe..5f080f28 100644
--- a/INSTALL
+++ b/INSTALL
@@ -201,6 +201,7 @@ library.  Debian-based distros put them in "libperl5.$MINOR" or
 "perl-modules-5.$MINOR"; and FreeBSD puts them in "perl5".
 RPM-based distros split them out into separate packages:
 
+* autodie                          rpm: perl-autodie
 * Digest::SHA                      rpm: perl-Digest-SHA
 * Data::Dumper                     rpm: perl-Data-Dumper
 * Encode                           rpm: perl-Encode
diff --git a/Makefile.PL b/Makefile.PL
index d2309336..5a5628ba 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -150,6 +150,7 @@ WriteMakefile(
 
 		# perl-modules-5.xx or libperl5.xx in Debian-based
 		# part of "perl5" on FreeBSD
+		'autodie' => 0,
 		'Compress::Raw::Zlib' => 0,
 		'Compress::Zlib' => 0,
 		'Data::Dumper' => 0,

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

* [PATCH 4/7] t/kqnotify: improve test reliability on OpenBSD
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
                   ` (2 preceding siblings ...)
  2023-08-30  5:10 ` [PATCH 3/7] Makefile.PL: depend on autodie, at least for tests Eric Wong
@ 2023-08-30  5:10 ` Eric Wong
  2023-08-30  5:10 ` [PATCH 5/7] xap_helper.h: don't compress debug sections " Eric Wong
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

Unlike FreeBSD, OpenBSD (tested 7.3) kevent doesn't document
EVFILT_VNODE behavior when directories are being watched.

Regardless, FreeBSD semantics appear to be mostly (if not
unreliably) supported.  Detecting rename(2) isn't reliable
at all and events seem to get lost and the test needs to
retry the rename(2) to succeed.  Fortunately, rename(2)
isn't recommended for Maildirs anyways since it can clobber
existing files.

link(2) detection appears to be merely delayed on OpenBSD,
so the test merely needs an occasional delay.
---
 t/kqnotify.t | 55 +++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 14 deletions(-)

diff --git a/t/kqnotify.t b/t/kqnotify.t
index 902ce0f1..21381806 100644
--- a/t/kqnotify.t
+++ b/t/kqnotify.t
@@ -1,36 +1,63 @@
 #!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>
 #
 # Ensure KQNotify can pick up rename(2) and link(2) operations
 # used by Maildir writing tools
-use strict;
-use Test::More;
+use v5.12;
 use PublicInbox::TestCommon;
+use autodie;
 plan skip_all => 'KQNotify is only for *BSD systems' if $^O !~ /bsd/;
 require_mods('IO::KQueue');
 use_ok 'PublicInbox::KQNotify';
 my ($tmpdir, $for_destroy) = tmpdir();
-mkdir "$tmpdir/new" or BAIL_OUT "mkdir: $!";
-open my $fh, '>', "$tmpdir/tst" or BAIL_OUT "open: $!";
-close $fh or BAIL_OUT "close: $!";
+mkdir "$tmpdir/new";
 
 my $kqn = PublicInbox::KQNotify->new;
 my $mask = PublicInbox::KQNotify::MOVED_TO_OR_CREATE();
 my $w = $kqn->watch("$tmpdir/new", $mask);
 
-rename("$tmpdir/tst", "$tmpdir/new/tst") or BAIL_OUT "rename: $!";
+# Unlike FreeBSD, OpenBSD (tested 7.3) kevent NOTE_EXTEND doesn't detect
+# renames into directories reliably.  It's kevent(3) manpage doesn't
+# document this behavior (unlike FreeBSD), but it sometimes works...
+open my $fh, '>', "$tmpdir/tst";
+close $fh;
+rename("$tmpdir/tst", "$tmpdir/new/tst");
 my $hit = [ map { $_->fullname } $kqn->read ];
-is_deeply($hit, ["$tmpdir/new/tst"], 'rename(2) detected (via NOTE_EXTEND)');
+my $try = 0;
+while (!@$hit && $^O eq 'openbsd' && $try++ < 30) {
+	diag "retrying NOTE_EXTEND detection for $^O (#$try)";
+	# kevent can totally ignore the event, so delaying hasn't worked;
+	# keep doing the same thing until kevent notices one of them
+	open $fh, '>', "$tmpdir/tst";
+	close $fh;
+	rename("$tmpdir/tst", "$tmpdir/new/tst");
+	$hit = [ map { $_->fullname } $kqn->read ]
+}
+is_deeply($hit, ["$tmpdir/new/tst"],
+		'rename(2) detected (via NOTE_EXTEND)')
+		or diag explain($hit);
 
-open $fh, '>', "$tmpdir/tst" or BAIL_OUT "open: $!";
-close $fh or BAIL_OUT "close: $!";
-link("$tmpdir/tst", "$tmpdir/new/link") or BAIL_OUT "link: $!";
-$hit = [ grep m!/link$!, map { $_->fullname } $kqn->read ];
-is_deeply($hit, ["$tmpdir/new/link"], 'link(2) detected (via NOTE_WRITE)');
+# OpenBSD (tested 7.3) doesn't reliably trigger NOTE_WRITE on link(2)
+# into directories, but usually it does (and more reliably than rename(2)
+# above) and doesn't drop the event entirely.
+open $fh, '>', "$tmpdir/tst";
+close $fh;
+link("$tmpdir/tst", "$tmpdir/new/link");
+my @read = map { $_->fullname } $kqn->read;
+$try = 0;
+while (!@read && $^O eq 'openbsd' && $try++ < 30) {
+	diag "delaying and retrying NOTE_WRITE detection for $^O (#$try)";
+	tick;
+	# no need to link(2) again, at least, kevent can just be late, here
+	@read = map { $_->fullname } $kqn->read;
+}
+$hit = [ grep(m!/link$!, @read) ];
+is_deeply($hit, ["$tmpdir/new/link"], 'link(2) detected (via NOTE_WRITE)')
+	or diag explain(\@read);
 
 $w->cancel;
-link("$tmpdir/new/tst", "$tmpdir/new/link2") or BAIL_OUT "link: $!";
+link("$tmpdir/new/tst", "$tmpdir/new/link2");
 $hit = [ map { $_->fullname } $kqn->read ];
 is_deeply($hit, [], 'link(2) not detected after cancel');
 

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

* [PATCH 5/7] xap_helper.h: don't compress debug sections on OpenBSD
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
                   ` (3 preceding siblings ...)
  2023-08-30  5:10 ` [PATCH 4/7] t/kqnotify: improve test reliability on OpenBSD Eric Wong
@ 2023-08-30  5:10 ` Eric Wong
  2023-08-30  5:10 ` [PATCH 6/7] xap_helper.h: limit stderr assignment to glibc+FreeBSD Eric Wong
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

ld(1) on OpenBSD 7.3 doesn't appear to support zlib-compressed
debug sections out-of-the-box.  Oh well, being able to build
this C++ bit at all is required to get acceptable performance
with -cindex --associate.
---
 lib/PublicInbox/XapHelperCxx.pm | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lib/PublicInbox/XapHelperCxx.pm b/lib/PublicInbox/XapHelperCxx.pm
index 4571676b..a22dda1e 100644
--- a/lib/PublicInbox/XapHelperCxx.pm
+++ b/lib/PublicInbox/XapHelperCxx.pm
@@ -15,8 +15,10 @@ my $bin = "$dir/xap_helper";
 my ($srcpfx) = (__FILE__ =~ m!\A(.+/)[^/]+\z!);
 my @srcs = map { $srcpfx.$_ } qw(xap_helper.h);
 my @pm_dep = map { $srcpfx.$_ } qw(Search.pm CodeSearch.pm);
+my $ldflags = '-Wl,-O1';
+$ldflags .= ' -Wl,--compress-debug-sections=zlib' if $^O ne 'openbsd';
 my $xflags = ($ENV{CXXFLAGS} // '-Wall -ggdb3 -O0') . ' ' .
-	($ENV{LDFLAGS} // '-Wl,-O1 -Wl,--compress-debug-sections=zlib') .
+	($ENV{LDFLAGS} // $ldflags) .
 	qq{ -DTHREADID=}.PublicInbox::Search::THREADID;
 
 sub xflags_chg () {

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

* [PATCH 6/7] xap_helper.h: limit stderr assignment to glibc+FreeBSD
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
                   ` (4 preceding siblings ...)
  2023-08-30  5:10 ` [PATCH 5/7] xap_helper.h: don't compress debug sections " Eric Wong
@ 2023-08-30  5:10 ` Eric Wong
  2023-08-30  5:10 ` [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy Eric Wong
  2023-08-30 12:34 ` [PATCH 0/7] various build fixes + OpenBSD compat, " Štěpán Němec
  7 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

This fixes the C++ xap_helper compilation on OpenBSD.
Assignable `FILE *' pointers appear to only be supported on
FreeBSD and glibc.  Based on my reading of musl and NetBSD
source code, this should also fix builds on those platforms.
---
 lib/PublicInbox/xap_helper.h | 55 ++++++++++++++++++++++++++++++++----
 1 file changed, 49 insertions(+), 6 deletions(-)

diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h
index e10527d1..92210511 100644
--- a/lib/PublicInbox/xap_helper.h
+++ b/lib/PublicInbox/xap_helper.h
@@ -50,9 +50,18 @@
 #	define SET_MAX_EXPANSION set_max_wildcard_expansion
 #endif
 
+#if defined(__FreeBSD__) || defined(__GLIBC__)
+#	define STDERR_ASSIGNABLE (1)
+#else
+#	define STDERR_ASSIGNABLE (0)
+#endif
+
 static const int sock_fd = 0; // SOCK_SEQPACKET as stdin :P
 static pid_t parent_pid;
+#if STDERR_ASSIGNABLE
 static FILE *orig_err = stderr;
+#endif
+static int orig_err_fd = -1;
 static void *srch_tree; // tsearch + tdelete + twalk
 static pid_t *worker_pids; // nr => pid
 static unsigned long nworker;
@@ -820,6 +829,37 @@ static void cleanup_pids(void)
 	worker_pids = NULL;
 }
 
+static void stderr_set(FILE *tmp_err)
+{
+#if STDERR_ASSIGNABLE
+	if (my_setlinebuf(tmp_err))
+		perror("W: setlinebuf(tmp_err)");
+	stderr = tmp_err;
+	return;
+#endif
+	int fd = fileno(tmp_err);
+	if (fd < 0) err(EXIT_FAILURE, "BUG: fileno(tmp_err)");
+	while (dup2(fd, STDERR_FILENO) < 0) {
+		if (errno != EINTR)
+			err(EXIT_FAILURE, "dup2(%d => 2)", fd);
+	}
+}
+
+static void stderr_restore(FILE *tmp_err)
+{
+#if STDERR_ASSIGNABLE
+	stderr = orig_err;
+	return;
+#endif
+	if (ferror(stderr) | fflush(stderr))
+		perror("ferror|fflush stderr");
+	while (dup2(orig_err_fd, STDERR_FILENO) < 0) {
+		if (errno != EINTR)
+			err(EXIT_FAILURE, "dup2(%d => 2)", orig_err_fd);
+	}
+	clearerr(stderr);
+}
+
 static void recv_loop(void) // worker process loop
 {
 	static char rbuf[4096 * 33]; // per-process
@@ -828,18 +868,15 @@ static void recv_loop(void) // worker process loop
 		struct req req = {};
 		if (!recv_req(&req, rbuf, &len))
 			continue;
-		if (req.fp[1]) {
-			if (my_setlinebuf(req.fp[1]))
-				perror("W: setlinebuf(req.fp[1])");
-			stderr = req.fp[1];
-		}
+		if (req.fp[1])
+			stderr_set(req.fp[1]);
 		req.argc = (int)SPLIT2ARGV(req.argv, rbuf, len);
 		if (req.argc > 0)
 			dispatch(&req);
 		if (ferror(req.fp[0]) | fclose(req.fp[0]))
 			perror("ferror|fclose fp[0]");
 		if (req.fp[1]) {
-			stderr = orig_err;
+			stderr_restore(req.fp[1]);
 			if (ferror(req.fp[1]) | fclose(req.fp[1]))
 				perror("ferror|fclose fp[1]");
 		}
@@ -895,6 +932,12 @@ int main(int argc, char *argv[])
 	code_nrp_init();
 	atexit(cleanup_all);
 
+	if (!STDERR_ASSIGNABLE) {
+		orig_err_fd = dup(STDERR_FILENO);
+		if (orig_err_fd < 0)
+			err(EXIT_FAILURE, "dup(2)");
+	}
+
 	nworker = 0;
 #ifdef _SC_NPROCESSORS_ONLN
 	long j = sysconf(_SC_NPROCESSORS_ONLN);

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

* [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
                   ` (5 preceding siblings ...)
  2023-08-30  5:10 ` [PATCH 6/7] xap_helper.h: limit stderr assignment to glibc+FreeBSD Eric Wong
@ 2023-08-30  5:10 ` Eric Wong
  2023-08-30 12:34 ` [PATCH 0/7] various build fixes + OpenBSD compat, " Štěpán Němec
  7 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-08-30  5:10 UTC (permalink / raw)
  To: meta

hdestroy on OpenBSD assumes each key in the table can be freed,
so use strdup to fulfil that requirement.

This behavior differs from tested behavior on glibc and FreeBSD,
as well as what I can see from reading the musl and NetBSD
source code.  OpenBSD may be the only relevant OS which requires
this workaround.
---
 lib/PublicInbox/xap_helper.h | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h
index 92210511..17085adc 100644
--- a/lib/PublicInbox/xap_helper.h
+++ b/lib/PublicInbox/xap_helper.h
@@ -460,6 +460,16 @@ static enum exc_iter dump_roots_iter(struct req *req,
 	return ITER_OK;
 }
 
+static char *hsearch_enter_key(char *s)
+{
+#if defined(__OpenBSD__) /* hdestroy frees each key */
+	char *ret = strdup(s);
+	if (!ret) perror("strdup");
+	return ret;
+#endif // glibc, musl, FreeBSD, NetBSD do not free keys
+	return s;
+}
+
 static bool cmd_dump_roots(struct req *req)
 {
 	CLEANUP_DUMP_ROOTS struct dump_roots_tmp drt = {};
@@ -511,7 +521,8 @@ static bool cmd_dump_roots(struct req *req)
 	}
 	for (size_t i = 0; i < tot; ) {
 		ENTRY e;
-		e.key = drt.entries[i++];
+		e.key = hsearch_enter_key(drt.entries[i++]);
+		if (!e.key) return false;
 		e.data = drt.entries[i++];
 		if (!hsearch(e, ENTER)) {
 			warn("hsearch(%s => %s, ENTER)", e.key,

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

* Re: [PATCH 0/7] various build fixes + OpenBSD compat, [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy
  2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
                   ` (6 preceding siblings ...)
  2023-08-30  5:10 ` [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy Eric Wong
@ 2023-08-30 12:34 ` Štěpán Němec
  2023-08-30 21:18   ` Eric Wong
  7 siblings, 1 reply; 20+ messages in thread
From: Štěpán Němec @ 2023-08-30 12:34 UTC (permalink / raw)
  To: Eric Wong; +Cc: meta

On Wed, 30 Aug 2023 05:10:38 +0000
Eric Wong wrote:

> 7/7 had me shaking my head for a bit, but I'd rather pay
> that price than introduce weirdness with C++ templates.

On Wed, 30 Aug 2023 05:10:45 +0000
Eric Wong wrote:

> hdestroy on OpenBSD assumes each key in the table can be freed,
> so use strdup to fulfil that requirement.
>
> This behavior differs from tested behavior on glibc and FreeBSD,
> as well as what I can see from reading the musl and NetBSD
> source code.  OpenBSD may be the only relevant OS which requires
> this workaround.

I guess this won't help any, but it caught my attention and I've already
done the digging, so I might as well share the findings:

OpenBSD actually copied this behavior with the initial import (of
hcreate.c) from NetBSD:

  $OpenBSD: hcreate.c,v 1.1 2004/06/24 04:43:33 millert Exp $
  https://github.com/openbsd/src/commit/46f8fdc8de36
  Commit: millert <millert@openbsd.org>
  CommitDate: Thu Jun 24 04:43:33 2004 +0000

  Working hcreate(3) et al from NetBSD (cgd) via ray at cyth dot
  net. Now passes the regress tests.

NetBSD only changed the default to match FreeBSD in 2014, and also added
hdestroy1 to allow caller control of element freeing:

  $NetBSD: hcreate.c,v 1.9 2014/07/20 13:34:17 christos Exp $
  https://github.com/netbsd/src/commit/3b1b85d301bf6e608ce20b4152
  Commit:     christos <christos@NetBSD.org>
  CommitDate: Sun Jul 20 13:34:17 2014 +0000

  Our hdestroy implementation was non-conformant because it freed the
  key of each entry. Add a new function hdestroy1 that allows the user
  to control what gets freed. Pointed out by Pedro Giffuni at FreeBSD.

That said, I'm not sure what "non-conformant" in the NetBSD commit
message refers to.  POSIX doesn't say anything on the matter
https://pubs.opengroup.org/onlinepubs/9699919799/functions/hcreate.html
and there don't seem to be any other relevant standards.

The NetBSD original (with the unconditional freeing) was apparently a
from-scratch implementation from 2001:

/*
 * hcreate() / hsearch() / hdestroy()
 *
 * SysV/XPG4 hash table functions.
 *
 * Implementation done based on NetBSD manual page and Solaris manual page,
 * plus my own personal experience about how they're supposed to work.
 *
 * I tried to look at Knuth (as cited by the Solaris manual page), but
 * nobody had a copy in the office, so...
 */

In any case, it does suck that OpenBSD is now the odd one out, but
having no experience with the interface myself, I have no opinion on
which behavior makes more sense.

Thanks for working on these (though I've had no complaints regarding the
actual functionality I need on OpenBSD so far) and let me know if you
want me to test something.  (With cindex.t out of the way (says 'ok'
now, plus a few W: reaped unknown PID), "make test" now gets stuck on
lei-import-http.t for me (with or without this series; still the same
test instance); I haven't seen kqnotify.t fail in the few runs I did.)

-- 
Štěpán

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

* Re: [PATCH 0/7] various build fixes + OpenBSD compat, [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy
  2023-08-30 12:34 ` [PATCH 0/7] various build fixes + OpenBSD compat, " Štěpán Němec
@ 2023-08-30 21:18   ` Eric Wong
  2023-08-31  9:11     ` Štěpán Němec
  0 siblings, 1 reply; 20+ messages in thread
From: Eric Wong @ 2023-08-30 21:18 UTC (permalink / raw)
  To: Štěpán Němec; +Cc: meta

Štěpán Němec <stepnem@smrk.net> wrote:

<snip> thanks for the additional notes.

> In any case, it does suck that OpenBSD is now the odd one out, but
> having no experience with the interface myself, I have no opinion on
> which behavior makes more sense.

Yeah, it's very limited and neglected interface that hardly
anybody uses; but it's all POSIX C offers.  Most C projects end
up implementing their own hash table or importing something
well-known (Attractive Chaos khash, ccan, gnulib, etc...).


I intend to use rculfhash from Userspace-RCU for the lei FUSE
component.  That'll likely be Linux-only since I can't bear
using FUSE without threads nor readdirplus (only in FUSE 3+)
when dealing with Maildirs.  I don't think FUSE 3 support exists
outside of Linux, yet...

> Thanks for working on these (though I've had no complaints regarding the
> actual functionality I need on OpenBSD so far) and let me know if you
> want me to test something.  (With cindex.t out of the way (says 'ok'
> now, plus a few W: reaped unknown PID), "make test" now gets stuck on
> lei-import-http.t for me (with or without this series; still the same
> test instance); I haven't seen kqnotify.t fail in the few runs I did.)

What's lei-import-http.t stuck on?  I haven't seen that...

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

* Re: [PATCH 0/7] various build fixes + OpenBSD compat, [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy
  2023-08-30 21:18   ` Eric Wong
@ 2023-08-31  9:11     ` Štěpán Němec
  2023-08-31 17:26       ` Štěpán Němec
  0 siblings, 1 reply; 20+ messages in thread
From: Štěpán Němec @ 2023-08-31  9:11 UTC (permalink / raw)
  To: Eric Wong; +Cc: meta

On Wed, 30 Aug 2023 21:18:49 +0000
Eric Wong wrote:

> What's lei-import-http.t stuck on?  I haven't seen that...

Have you tried without p5-Inline?  I installed it now and the test passes.

Without it, it just hangs here:

t/lei-import-http.t .......... 1/? # inherited [::1]:34584 fd=3

in

perl -httpd -W0 --stdout=/tmp/pi-lei-import-http-91165-_BAi/1 --stderr=/tmp/pi-lei-import-http-91165-_BAi/2

kdump -TR -m 100: (2.2MB)
https://smrk.net/tmp/lei-import-http.t.kdump

(the end after the 37950 mark is just me interrupting the process this
morning)

-- 
Štěpán

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

* Re: [PATCH 0/7] various build fixes + OpenBSD compat, [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy
  2023-08-31  9:11     ` Štěpán Němec
@ 2023-08-31 17:26       ` Štěpán Němec
  2023-09-01 11:09         ` Eric Wong
  0 siblings, 1 reply; 20+ messages in thread
From: Štěpán Němec @ 2023-08-31 17:26 UTC (permalink / raw)
  To: Eric Wong; +Cc: meta

On Thu, 31 Aug 2023 11:11:52 +0200
Štěpán Němec wrote:

> On Wed, 30 Aug 2023 21:18:49 +0000
> Eric Wong wrote:
>
>> What's lei-import-http.t stuck on?  I haven't seen that...
>
> Have you tried without p5-Inline?  I installed it now and the test passes.

Ah, I see now that PERFORMANCE NOTES in lei-overview.pod says Inline::C
is required, so perhaps just some adjustments to the test
skipping/diagnostics and INSTALL instructions (which say Inline::C is
optional) would be helpful?

-- 
Štěpán

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

* Re: [PATCH 0/7] various build fixes + OpenBSD compat, [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy
  2023-08-31 17:26       ` Štěpán Němec
@ 2023-09-01 11:09         ` Eric Wong
  2023-09-02 10:54           ` Štěpán Němec
  0 siblings, 1 reply; 20+ messages in thread
From: Eric Wong @ 2023-09-01 11:09 UTC (permalink / raw)
  To: Štěpán Němec; +Cc: meta

Štěpán Němec <stepnem@smrk.net> wrote:
> On Thu, 31 Aug 2023 11:11:52 +0200
> Štěpán Němec wrote:
> > On Wed, 30 Aug 2023 21:18:49 +0000
> > Eric Wong wrote:
> >
> >> What's lei-import-http.t stuck on?  I haven't seen that...
> >
> > Have you tried without p5-Inline?  I installed it now and the test passes.
> 
> Ah, I see now that PERFORMANCE NOTES in lei-overview.pod says Inline::C
> is required, so perhaps just some adjustments to the test
> skipping/diagnostics and INSTALL instructions (which say Inline::C is
> optional) would be helpful?

Actually, Inline::C is only needed for lei on *BSDs nowadays.
Common/available-on-cfarm Linux arches can rely on stable
syscall numbers to do FD passing.

The problems with the lei tests w/o Inline::C on *BSD is trying
to skip them too fast is more likely to trigger a race with
EVFILT_SIGNAL (but not Linux signalfd).  Still working on
patches to fix it and other subtle things around signal
handling...

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

* Re: [PATCH 0/7] various build fixes + OpenBSD compat, [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy
  2023-09-01 11:09         ` Eric Wong
@ 2023-09-02 10:54           ` Štěpán Němec
  2023-09-02 11:07             ` [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere) Štěpán Němec
  0 siblings, 1 reply; 20+ messages in thread
From: Štěpán Němec @ 2023-09-02 10:54 UTC (permalink / raw)
  To: Eric Wong; +Cc: meta

On Fri, 01 Sep 2023 11:09:03 +0000
Eric Wong wrote:

> Štěpán Němec <stepnem@smrk.net> wrote:
>> Ah, I see now that PERFORMANCE NOTES in lei-overview.pod says Inline::C
>> is required, so perhaps just some adjustments to the test
>> skipping/diagnostics and INSTALL instructions (which say Inline::C is
>> optional) would be helpful?
>
> Actually, Inline::C is only needed for lei on *BSDs nowadays.
> Common/available-on-cfarm Linux arches can rely on stable
> syscall numbers to do FD passing.

I see, thanks.  How about this then:

-- >8 --
Subject: [PATCH] Clarify Inline::C dependency (optional on Linux, required
 elsewhere)

Link: https://public-inbox.org/meta/20230901110903.M876537@dcvr/
Fixes: 88c7c7c26b44 ("lei: wire up pure Perl sendmsg/recvmsg for Linux users")
Fixes: acefd91b302d ("syscall: implement sendmsg+recvmsg in pure Perl")
---
 Documentation/lei-overview.pod | 12 +++++++-----
 INSTALL                        |  7 ++++---
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/Documentation/lei-overview.pod b/Documentation/lei-overview.pod
index 7095b504cdb8..e9a97d64fb56 100644
--- a/Documentation/lei-overview.pod
+++ b/Documentation/lei-overview.pod
@@ -119,11 +119,13 @@ code repository.
 
 =head1 PERFORMANCE NOTES
 
-L<Inline::C> is required, lei runs as a background daemon to reduce
-startup costs and can provide real-time L<kqueue(2)>/L<inotify(7)>
-Maildir monitoring.  L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and
-L<Linux::Inotify2> (liblinux-inotify2-perl and perl-Linux-Inotify2 in
-.deb and .rpm-based distros, respectively) are recommended.
+L<Inline::C> is required on BSDs and can speed things up on Linux.
+
+lei runs as a background daemon to reduce startup costs and can
+provide real-time L<kqueue(2)>/L<inotify(7)> Maildir monitoring.
+L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and L<Linux::Inotify2>
+(liblinux-inotify2-perl and perl-Linux-Inotify2 in .deb and .rpm-based
+distros, respectively) are recommended.
 
 L<Socket::MsgHdr> is optional (libsocket-msghdr-perl in Debian),
 and further improves startup performance.  Its effect is most felt
diff --git a/INSTALL b/INSTALL
index 5f080f2889ce..e8d686d8f21b 100644
--- a/INSTALL
+++ b/INSTALL
@@ -60,7 +60,7 @@ Where "deb" indicates package names for Debian-derived distributions,
 "pkg" is for the FreeBSD package (maybe other common BSDs, too), and
 "rpm" is for RPM-based distributions (only known to work on Fedora).
 
-Numerous optional modules are likely to be useful as well:
+Numerous other modules are likely to be useful as well:
 
 - DBD::SQLite                      deb: libdbd-sqlite3-perl
                                    pkg: p5-DBD-SQLite
@@ -76,8 +76,9 @@ Numerous optional modules are likely to be useful as well:
 - Inline::C                        deb: libinline-c-perl
                                    pkg: p5-Inline-C
                                    rpm: perl-Inline (or perl-Inline-C)
-                                   (speeds up process spawning on Linux,
-                                    see public-inbox-daemon(8))
+                                   (required for lei on *BSD; speeds up process
+				    spawning on Linux, see
+				    public-inbox-daemon(8))
 
 - Email::Address::XS               deb: libemail-address-xs-perl
                                    pkg: p5-Email-Address-XS

-- 
2.42.0


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

* [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere)
  2023-09-02 10:54           ` Štěpán Němec
@ 2023-09-02 11:07             ` Štěpán Němec
  2023-09-02 18:50               ` Eric Wong
  0 siblings, 1 reply; 20+ messages in thread
From: Štěpán Němec @ 2023-09-02 11:07 UTC (permalink / raw)
  To: Eric Wong; +Cc: meta


Link: https://public-inbox.org/meta/20230901110903.M876537@dcvr/
Fixes: 88c7c7c26b44 ("lei: wire up pure Perl sendmsg/recvmsg for Linux users")
Fixes: acefd91b302d ("syscall: implement sendmsg+recvmsg in pure Perl")
---
v2: expand tabs, sorry about that...

 Documentation/lei-overview.pod | 12 +++++++-----
 INSTALL                        |  7 ++++---
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/Documentation/lei-overview.pod b/Documentation/lei-overview.pod
index 7095b504cdb8..e9a97d64fb56 100644
--- a/Documentation/lei-overview.pod
+++ b/Documentation/lei-overview.pod
@@ -119,11 +119,13 @@ code repository.
 
 =head1 PERFORMANCE NOTES
 
-L<Inline::C> is required, lei runs as a background daemon to reduce
-startup costs and can provide real-time L<kqueue(2)>/L<inotify(7)>
-Maildir monitoring.  L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and
-L<Linux::Inotify2> (liblinux-inotify2-perl and perl-Linux-Inotify2 in
-.deb and .rpm-based distros, respectively) are recommended.
+L<Inline::C> is required on BSDs and can speed things up on Linux.
+
+lei runs as a background daemon to reduce startup costs and can
+provide real-time L<kqueue(2)>/L<inotify(7)> Maildir monitoring.
+L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and L<Linux::Inotify2>
+(liblinux-inotify2-perl and perl-Linux-Inotify2 in .deb and .rpm-based
+distros, respectively) are recommended.
 
 L<Socket::MsgHdr> is optional (libsocket-msghdr-perl in Debian),
 and further improves startup performance.  Its effect is most felt
diff --git a/INSTALL b/INSTALL
index 5f080f2889ce..8f08a11f7ee1 100644
--- a/INSTALL
+++ b/INSTALL
@@ -60,7 +60,7 @@ Where "deb" indicates package names for Debian-derived distributions,
 "pkg" is for the FreeBSD package (maybe other common BSDs, too), and
 "rpm" is for RPM-based distributions (only known to work on Fedora).
 
-Numerous optional modules are likely to be useful as well:
+Numerous other modules are likely to be useful as well:
 
 - DBD::SQLite                      deb: libdbd-sqlite3-perl
                                    pkg: p5-DBD-SQLite
@@ -76,8 +76,9 @@ Numerous optional modules are likely to be useful as well:
 - Inline::C                        deb: libinline-c-perl
                                    pkg: p5-Inline-C
                                    rpm: perl-Inline (or perl-Inline-C)
-                                   (speeds up process spawning on Linux,
-                                    see public-inbox-daemon(8))
+                                   (required for lei on *BSD; speeds up process
+                                    spawning on Linux, see
+                                    public-inbox-daemon(8))
 
 - Email::Address::XS               deb: libemail-address-xs-perl
                                    pkg: p5-Email-Address-XS

-- 
2.42.0


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

* Re: [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere)
  2023-09-02 11:07             ` [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere) Štěpán Němec
@ 2023-09-02 18:50               ` Eric Wong
  2023-09-02 19:08                 ` Štěpán Němec
  0 siblings, 1 reply; 20+ messages in thread
From: Eric Wong @ 2023-09-02 18:50 UTC (permalink / raw)
  To: Štěpán Němec; +Cc: meta

Štěpán Němec <stepnem@smrk.net> wrote:
> +++ b/Documentation/lei-overview.pod
> @@ -119,11 +119,13 @@ code repository.
>  
>  =head1 PERFORMANCE NOTES
>  
> -L<Inline::C> is required, lei runs as a background daemon to reduce
> -startup costs and can provide real-time L<kqueue(2)>/L<inotify(7)>
> -Maildir monitoring.  L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and
> -L<Linux::Inotify2> (liblinux-inotify2-perl and perl-Linux-Inotify2 in
> -.deb and .rpm-based distros, respectively) are recommended.
> +L<Inline::C> is required on BSDs and can speed things up on Linux.
> +
> +lei runs as a background daemon to reduce startup costs and can
> +provide real-time L<kqueue(2)>/L<inotify(7)> Maildir monitoring.
> +L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and L<Linux::Inotify2>
> +(liblinux-inotify2-perl and perl-Linux-Inotify2 in .deb and .rpm-based
> +distros, respectively) are recommended.

Thanks, this hunk I agree with.

>  L<Socket::MsgHdr> is optional (libsocket-msghdr-perl in Debian),
>  and further improves startup performance.  Its effect is most felt
> diff --git a/INSTALL b/INSTALL
> index 5f080f2889ce..8f08a11f7ee1 100644
> --- a/INSTALL
> +++ b/INSTALL
> @@ -60,7 +60,7 @@ Where "deb" indicates package names for Debian-derived distributions,
>  "pkg" is for the FreeBSD package (maybe other common BSDs, too), and
>  "rpm" is for RPM-based distributions (only known to work on Fedora).
>  
> -Numerous optional modules are likely to be useful as well:
> +Numerous other modules are likely to be useful as well:

What is the reasoning for this change?
"optional" is an important point to state, IMHO.
Using "other" is more ambiguous, I think.

> @@ -76,8 +76,9 @@ Numerous optional modules are likely to be useful as well:
>  - Inline::C                        deb: libinline-c-perl
>                                     pkg: p5-Inline-C
>                                     rpm: perl-Inline (or perl-Inline-C)
> -                                   (speeds up process spawning on Linux,
> -                                    see public-inbox-daemon(8))
> +                                   (required for lei on *BSD; speeds up process
> +                                    spawning on Linux, see
> +                                    public-inbox-daemon(8))

I think breaking up the lines on punctuation improves readability:

                                   (required for lei on *BSD;
                                    speeds up process spawning on Linux,
                                    see public-inbox-daemon(8))

I particularly dislike having "process" and "spawning"
being on separate lines.

Thanks.

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

* Re: [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere)
  2023-09-02 18:50               ` Eric Wong
@ 2023-09-02 19:08                 ` Štěpán Němec
  2023-09-02 19:44                   ` Eric Wong
  0 siblings, 1 reply; 20+ messages in thread
From: Štěpán Němec @ 2023-09-02 19:08 UTC (permalink / raw)
  To: Eric Wong; +Cc: meta

On Sat, 02 Sep 2023 18:50:15 +0000
Eric Wong wrote:

> Štěpán Němec <stepnem@smrk.net> wrote:
>> -Numerous optional modules are likely to be useful as well:
>> +Numerous other modules are likely to be useful as well:
>
> What is the reasoning for this change?
> "optional" is an important point to state, IMHO.
> Using "other" is more ambiguous, I think.

We've now established that at least Inline::C is not optional on all
systems.  Is that really the only case?  (I mean, some of the modules
have "optional" again in their respective parentheticals: is that just
redundancy, or does it imply that the others are less optional?)  Even
if it _is_ the only case, isn't saying "optional" misleading?

>> @@ -76,8 +76,9 @@ Numerous optional modules are likely to be useful as well:
>>  - Inline::C                        deb: libinline-c-perl
>>                                     pkg: p5-Inline-C
>>                                     rpm: perl-Inline (or perl-Inline-C)
>> -                                   (speeds up process spawning on Linux,
>> -                                    see public-inbox-daemon(8))
>> +                                   (required for lei on *BSD; speeds up process
>> +                                    spawning on Linux, see
>> +                                    public-inbox-daemon(8))
>
> I think breaking up the lines on punctuation improves readability:
>
>                                    (required for lei on *BSD;
>                                     speeds up process spawning on Linux,
>                                     see public-inbox-daemon(8))

That's much better, thank you!

> I particularly dislike having "process" and "spawning"
> being on separate lines.

Yeah, it's horrible, but somehow your sane version didn't occur to me...

Thanks,

  Štěpán

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

* Re: [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere)
  2023-09-02 19:08                 ` Štěpán Němec
@ 2023-09-02 19:44                   ` Eric Wong
  2023-09-02 20:45                     ` Štěpán Němec
  0 siblings, 1 reply; 20+ messages in thread
From: Eric Wong @ 2023-09-02 19:44 UTC (permalink / raw)
  To: Štěpán Němec; +Cc: meta

Štěpán Němec <stepnem@smrk.net> wrote:
> On Sat, 02 Sep 2023 18:50:15 +0000
> Eric Wong wrote:
> 
> > Štěpán Němec <stepnem@smrk.net> wrote:
> >> -Numerous optional modules are likely to be useful as well:
> >> +Numerous other modules are likely to be useful as well:
> >
> > What is the reasoning for this change?
> > "optional" is an important point to state, IMHO.
> > Using "other" is more ambiguous, I think.
> 
> We've now established that at least Inline::C is not optional on all
> systems.  Is that really the only case?  (I mean, some of the modules
> have "optional" again in their respective parentheticals: is that just
> redundancy, or does it imply that the others are less optional?)  Even
> if it _is_ the only case, isn't saying "optional" misleading?

Perhaps the per-module "optional, for .." statements should be
"only for ...".

Aside from the new WIP -cindex; all public-inbox-* tools should
all work fine without Inline::C.  lei isn't likely running on
most public-facing servers.

In fact, all the components of public-inbox are optional
depending on which pieces you want to use it for.

The original public-inbox-* stuff (mda/learn/watch/WWW/httpd/CGI)
should work w/o SQLite for v1 inboxes, even (I need to test before
releases).

IOW, I'm trying to keep installations that were configured
and setup in back in 2014 working with no new dependencies.

Honestly, I wish I could tell users a C compiler is required to
make my life easier (heck, Varnish requires one); but gcc and
clang are both gigantic; and tcc (while active) hasn't had a
release in ages.

Thanks.

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

* Re: [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere)
  2023-09-02 19:44                   ` Eric Wong
@ 2023-09-02 20:45                     ` Štěpán Němec
  2023-09-02 20:56                       ` Eric Wong
  0 siblings, 1 reply; 20+ messages in thread
From: Štěpán Němec @ 2023-09-02 20:45 UTC (permalink / raw)
  To: Eric Wong; +Cc: meta

On Sat, 02 Sep 2023 19:44:07 +0000
Eric Wong wrote:

> Perhaps the per-module "optional, for .." statements should be
> "only for ...".

Well, if that's really true (i.e., they're not needed/useful for
anything else)...

I guess you see INSTALL as mainly for public-inbox without lei (and
indeed the first sentence is "This is for folks who want to set up their
own public-inbox instance."), so from that perspective saying "optional"
about something that is optional for public-inbox but required for lei
makes sense, but lei is then mentioned repeatedly in the dependencies
section, and it seems a safe bet there are much more people using lei
than there are people setting up public-inbox instances, so I'm not sure
maintaining that perspective in INSTALL is the best way to help those
users.

Then again, maybe it's just in my head and I might as well let such
users speak for themselves if they exist and ever wish to do so.

So here's just a reroll with your suggestions implemented:

-- 8< --
Subject: [PATCH v3] Clarify Inline::C dependency (optional on Linux, required
 elsewhere)

Link: https://public-inbox.org/meta/20230901110903.M876537@dcvr/
Link: https://public-inbox.org/meta/20230902194407.M464597@dcvr/
Fixes: 88c7c7c26b44 ("lei: wire up pure Perl sendmsg/recvmsg for Linux users")
Fixes: acefd91b302d ("syscall: implement sendmsg+recvmsg in pure Perl")
---
changes since v2:
- add another Link: to the parent of this message
- don't change "optional" to "other", focus is on public-inbox
- don't repeat "optional" in individual module items, say "only for"

 Documentation/lei-overview.pod | 12 +++++++-----
 INSTALL                        | 11 ++++++-----
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/Documentation/lei-overview.pod b/Documentation/lei-overview.pod
index 7095b504cdb8..e9a97d64fb56 100644
--- a/Documentation/lei-overview.pod
+++ b/Documentation/lei-overview.pod
@@ -119,11 +119,13 @@ code repository.
 
 =head1 PERFORMANCE NOTES
 
-L<Inline::C> is required, lei runs as a background daemon to reduce
-startup costs and can provide real-time L<kqueue(2)>/L<inotify(7)>
-Maildir monitoring.  L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and
-L<Linux::Inotify2> (liblinux-inotify2-perl and perl-Linux-Inotify2 in
-.deb and .rpm-based distros, respectively) are recommended.
+L<Inline::C> is required on BSDs and can speed things up on Linux.
+
+lei runs as a background daemon to reduce startup costs and can
+provide real-time L<kqueue(2)>/L<inotify(7)> Maildir monitoring.
+L<IO::KQueue> (p5-IO-KQueue on FreeBSD) and L<Linux::Inotify2>
+(liblinux-inotify2-perl and perl-Linux-Inotify2 in .deb and .rpm-based
+distros, respectively) are recommended.
 
 L<Socket::MsgHdr> is optional (libsocket-msghdr-perl in Debian),
 and further improves startup performance.  Its effect is most felt
diff --git a/INSTALL b/INSTALL
index 5f080f2889ce..2e1c7ef7bb0a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -76,7 +76,8 @@ Numerous optional modules are likely to be useful as well:
 - Inline::C                        deb: libinline-c-perl
                                    pkg: p5-Inline-C
                                    rpm: perl-Inline (or perl-Inline-C)
-                                   (speeds up process spawning on Linux,
+                                   (required for lei on *BSD;
+                                    speeds up process spawning on Linux,
                                     see public-inbox-daemon(8))
 
 - Email::Address::XS               deb: libemail-address-xs-perl
@@ -88,17 +89,17 @@ Numerous optional modules are likely to be useful as well:
 - Parse::RecDescent                deb: libparse-recdescent-perl
                                    pkg: p5-Parse-RecDescent
                                    rpm: perl-ParseRecDescent
-                                   (optional, for public-inbox-imapd(1))
+                                   (only for public-inbox-imapd(1))
 
 - Mail::IMAPClient                 deb: libmail-imapclient-perl
                                    pkg: p5-Mail-IMAPClient
                                    rpm: perl-Mail-IMAPClient
-                                   (optional for lei and public-inbox-watch)
+                                   (only for lei and public-inbox-watch)
 
 - BSD::Resource                    deb: libbsd-resource-perl
                                    pkg: p5-BSD-Resource
                                    rpm: perl-BSD-Resource
-                                   (optional, for PSGI limiters
+                                   (only for PSGI limiters,
                                     see public-inbox-config(5))
 
 - Plack::Middleware::ReverseProxy  deb: libplack-middleware-reverseproxy-perl
@@ -113,7 +114,7 @@ Numerous optional modules are likely to be useful as well:
 * xapian-compact (tool)            deb: xapian-tools
                                    pkg: xapian-core
                                    rpm: xapian-core
-                                   (optional, for public-inbox-compact(1))
+                                   (only for public-inbox-compact(1))
 
 * curl (tool)                      deb, pkg, rpm: curl
                                    (for HTTP(S) externals with curl)

-- 
2.42.0

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

* Re: [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere)
  2023-09-02 20:45                     ` Štěpán Němec
@ 2023-09-02 20:56                       ` Eric Wong
  0 siblings, 0 replies; 20+ messages in thread
From: Eric Wong @ 2023-09-02 20:56 UTC (permalink / raw)
  To: Štěpán Němec; +Cc: meta

Štěpán Němec <stepnem@smrk.net> wrote:
> On Sat, 02 Sep 2023 19:44:07 +0000
> Eric Wong wrote:
> 
> > Perhaps the per-module "optional, for .." statements should be
> > "only for ...".
> 
> Well, if that's really true (i.e., they're not needed/useful for
> anything else)...
> 
> I guess you see INSTALL as mainly for public-inbox without lei (and
> indeed the first sentence is "This is for folks who want to set up their
> own public-inbox instance."), so from that perspective saying "optional"
> about something that is optional for public-inbox but required for lei
> makes sense, but lei is then mentioned repeatedly in the dependencies
> section, and it seems a safe bet there are much more people using lei
> than there are people setting up public-inbox instances, so I'm not sure
> maintaining that perspective in INSTALL is the best way to help those
> users.

Perhaps a separate "INSTALL-lei" file is warranted.  lei is newer,
and parts of it still somewhat unrefined/experimental IMHO.

> Then again, maybe it's just in my head and I might as well let such
> users speak for themselves if they exist and ever wish to do so.

Thanks for the different perspective.  In my mind, public-inbox-mda
and PublicInbox::WWW were "first" and everything came after.

> So here's just a reroll with your suggestions implemented:
> 
> -- 8< --
> Subject: [PATCH v3] Clarify Inline::C dependency (optional on Linux, required
>  elsewhere)

Thanks, applied as commit 18c6c4e81dca1d81f6ff2bb284554b5fca2ef163

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

end of thread, other threads:[~2023-09-02 20:58 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-30  5:10 [PATCH 0/7] various build fixes + OpenBSD compat Eric Wong
2023-08-30  5:10 ` [PATCH 1/7] treewide: drop MSG_EOR with AF_UNIX+SOCK_SEQPACKET Eric Wong
2023-08-30  5:10 ` [PATCH 2/7] Makefile.PL: fix syntax for ASan and valgrind targets Eric Wong
2023-08-30  5:10 ` [PATCH 3/7] Makefile.PL: depend on autodie, at least for tests Eric Wong
2023-08-30  5:10 ` [PATCH 4/7] t/kqnotify: improve test reliability on OpenBSD Eric Wong
2023-08-30  5:10 ` [PATCH 5/7] xap_helper.h: don't compress debug sections " Eric Wong
2023-08-30  5:10 ` [PATCH 6/7] xap_helper.h: limit stderr assignment to glibc+FreeBSD Eric Wong
2023-08-30  5:10 ` [PATCH 7/7] xap_helper.h: fix double-free on OpenBSD hdestroy Eric Wong
2023-08-30 12:34 ` [PATCH 0/7] various build fixes + OpenBSD compat, " Štěpán Němec
2023-08-30 21:18   ` Eric Wong
2023-08-31  9:11     ` Štěpán Němec
2023-08-31 17:26       ` Štěpán Němec
2023-09-01 11:09         ` Eric Wong
2023-09-02 10:54           ` Štěpán Němec
2023-09-02 11:07             ` [PATCH v2] Clarify Inline::C dependency (optional on Linux, required elsewhere) Štěpán Němec
2023-09-02 18:50               ` Eric Wong
2023-09-02 19:08                 ` Štěpán Němec
2023-09-02 19:44                   ` Eric Wong
2023-09-02 20:45                     ` Štěpán Němec
2023-09-02 20:56                       ` 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).