]> Sergey Matveev's repositories - public-inbox.git/commitdiff
daemon: provide TCP_DEFER_ACCEPT for Perl <5.14
authorEric Wong <e@yhbt.net>
Sun, 26 Jan 2020 10:29:21 +0000 (10:29 +0000)
committerEric Wong <e@yhbt.net>
Tue, 28 Jan 2020 01:49:48 +0000 (01:49 +0000)
Socket::TCP_DEFER_ACCEPT() did not appear in the Socket module
distributed with Perl until 5.14, despite it being available
since Linux 2.4.

lib/PublicInbox/Daemon.pm
t/httpd-corner.t
t/httpd-https.t
t/httpd.t
t/nntpd-tls.t

index 278c80f56ca74d9603383b01f69f23c84100b471..15d8bd31438f37ee00b34105a29444c2beb8d4a1 100644 (file)
@@ -566,11 +566,12 @@ sub defer_accept ($$) {
        my ($s, $af_name) = @_;
        return unless defined $af_name;
        if ($^O eq 'linux') {
-               my $x = getsockopt($s, IPPROTO_TCP, Socket::TCP_DEFER_ACCEPT());
+               my $TCP_DEFER_ACCEPT = 9; # Socket::TCP_DEFER_ACCEPT is in 5.14+
+               my $x = getsockopt($s, IPPROTO_TCP, $TCP_DEFER_ACCEPT);
                return unless defined $x; # may be Unix socket
                my $sec = unpack('i', $x);
                return if $sec > 0; # systemd users may set a higher value
-               setsockopt($s, IPPROTO_TCP, Socket::TCP_DEFER_ACCEPT(), 1);
+               setsockopt($s, IPPROTO_TCP, $TCP_DEFER_ACCEPT, 1);
        } elsif ($^O eq 'freebsd') {
                my $x = getsockopt($s, SOL_SOCKET, SO_ACCEPTFILTER);
                return if defined $x; # don't change if set
index 4ed34934e500649470ba411629764afbe286f044..1f2bb53f7b932afacaedf22fca57ee871335d973 100644 (file)
@@ -28,10 +28,11 @@ open(STDIN, '<', '/dev/null') or die 'no /dev/null: $!';
 
 # Make sure we don't clobber socket options set by systemd or similar
 # using socket activation:
-my ($defer_accept_val, $accf_arg);
+my ($defer_accept_val, $accf_arg, $TCP_DEFER_ACCEPT);
 if ($^O eq 'linux') {
-       setsockopt($sock, IPPROTO_TCP, Socket::TCP_DEFER_ACCEPT(), 5) or die;
-       my $x = getsockopt($sock, IPPROTO_TCP, Socket::TCP_DEFER_ACCEPT());
+       $TCP_DEFER_ACCEPT = eval { Socket::TCP_DEFER_ACCEPT() } // 9;
+       setsockopt($sock, IPPROTO_TCP, $TCP_DEFER_ACCEPT, 5) or die;
+       my $x = getsockopt($sock, IPPROTO_TCP, $TCP_DEFER_ACCEPT);
        defined $x or die "getsockopt: $!";
        $defer_accept_val = unpack('i', $x);
        if ($defer_accept_val <= 0) {
@@ -526,7 +527,7 @@ SKIP: {
 
 SKIP: {
        skip 'TCP_DEFER_ACCEPT is Linux-only', 1 if $^O ne 'linux';
-       my $var = Socket::TCP_DEFER_ACCEPT();
+       my $var = $TCP_DEFER_ACCEPT;
        defined(my $x = getsockopt($sock, IPPROTO_TCP, $var)) or die;
        is(unpack('i', $x), $defer_accept_val,
                'TCP_DEFER_ACCEPT unchanged if previously set');
index 9ce060c8c7c1c8865648f92c381704eabac941c0..ee5ced0f6df9dd9f7aee8f320062e9fcb22afffe 100644 (file)
@@ -87,7 +87,7 @@ for my $args (
 
        SKIP: {
                skip 'TCP_DEFER_ACCEPT is Linux-only', 2 if $^O ne 'linux';
-               my $var = Socket::TCP_DEFER_ACCEPT();
+               my $var = eval { Socket::TCP_DEFER_ACCEPT() } // 9;
                defined(my $x = getsockopt($https, IPPROTO_TCP, $var)) or die;
                ok(unpack('i', $x) > 0, 'TCP_DEFER_ACCEPT set on https');
        };
index 880c69e62f601d9d54b48bd7624e6ff98f898f83..2972afb26a33cba68569a37fbd8415703c49b36c 100644 (file)
--- a/t/httpd.t
+++ b/t/httpd.t
@@ -81,7 +81,7 @@ EOF
 
 SKIP: {
        skip 'TCP_DEFER_ACCEPT is Linux-only', 1 if $^O ne 'linux';
-       my $var = Socket::TCP_DEFER_ACCEPT();
+       my $var = eval { Socket::TCP_DEFER_ACCEPT() } // 9;
        defined(my $x = getsockopt($sock, IPPROTO_TCP, $var)) or die;
        ok(unpack('i', $x) > 0, 'TCP_DEFER_ACCEPT set');
 };
index edc1fab4bbb40a2755c204356126c03a981cae8d..c97d179daf9d4fb13c4331b55e3b160342831cbb 100644 (file)
@@ -174,7 +174,7 @@ for my $args (
 
        SKIP: {
                skip 'TCP_DEFER_ACCEPT is Linux-only', 2 if $^O ne 'linux';
-               my $var = Socket::TCP_DEFER_ACCEPT();
+               my $var = eval { Socket::TCP_DEFER_ACCEPT() } // 9;
                defined(my $x = getsockopt($nntps, IPPROTO_TCP, $var)) or die;
                ok(unpack('i', $x) > 0, 'TCP_DEFER_ACCEPT set on NNTPS');
                defined($x = getsockopt($starttls, IPPROTO_TCP, $var)) or die;