POSIX::dup2 does not do anything in addition to dup2(2) and is
thus immune to Perl automatically setting FD_CLOEXEC on FDs it
makes into IO objects/globs.
---
 lib/PublicInbox/TestCommon.pm | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm
index 888c1f1e..179f8bae 100644
--- a/lib/PublicInbox/TestCommon.pm
+++ b/lib/PublicInbox/TestCommon.pm
@@ -479,16 +479,9 @@ sub start_script {
                # pretend to be systemd (cf. sd_listen_fds(3))
                # 3 == SD_LISTEN_FDS_START
                my $fd;
-               for ($fd = 0; 1; $fd++) {
-                       my $s = $opt->{$fd};
-                       last if $fd >= 3 && !defined($s);
-                       next unless $s;
-                       my $fl = fcntl($s, F_GETFD, 0);
-                       if (($fl & FD_CLOEXEC) != FD_CLOEXEC) {
-                               warn "got FD:".fileno($s)." w/o CLOEXEC\n";
-                       }
-                       fcntl($s, F_SETFD, $fl &= ~FD_CLOEXEC);
-                       dup2(fileno($s), $fd) or die "dup2 failed: $!\n";
+               for ($fd = 0; $fd < 3 || defined($opt->{$fd}); $fd++) {
+                       my $io = $opt->{$fd} // next;
+                       dup2(fileno($io), $fd) or die "dup2($io, $fd): $!";
                }
                %ENV = (%ENV, %$env) if $env;
                my $fds = $fd - 3;

Reply via email to