use IO::Socket;
use POSIX qw(WNOHANG :signal_h);
use Socket qw(IPPROTO_TCP SOL_SOCKET);
-sub SO_ACCEPTFILTER () { 0x1000 }
STDOUT->autoflush(1);
STDERR->autoflush(1);
use PublicInbox::DS qw(now);
use PublicInbox::EOFpipe;
use PublicInbox::Sigfd;
use PublicInbox::GitAsyncCat;
+our $SO_ACCEPTFILTER = 0x1000;
my @CMD;
my ($set_user, $oldset);
my (@cfg_listen, $stdout, $stderr, $group, $user, $pid_file, $daemonize);
return if $sec > 0; # systemd users may set a higher value
setsockopt($s, IPPROTO_TCP, $TCP_DEFER_ACCEPT, 1);
} elsif ($^O eq 'freebsd') {
- my $x = getsockopt($s, SOL_SOCKET, SO_ACCEPTFILTER);
+ my $x = getsockopt($s, SOL_SOCKET, $SO_ACCEPTFILTER);
return if defined $x; # don't change if set
my $accf_arg = pack('a16a240', $af_name, '');
- setsockopt($s, SOL_SOCKET, SO_ACCEPTFILTER, $accf_arg);
+ setsockopt($s, SOL_SOCKET, $SO_ACCEPTFILTER, $accf_arg);
}
}
}
} elsif ($^O eq 'freebsd' && system('kldstat -m accf_data >/dev/null') == 0) {
require PublicInbox::Daemon;
- my $var = PublicInbox::Daemon::SO_ACCEPTFILTER();
+ my $var = $PublicInbox::Daemon::SO_ACCEPTFILTER;
$accf_arg = pack('a16a240', 'dataready', '');
setsockopt($sock, SOL_SOCKET, $var, $accf_arg) or die "setsockopt: $!";
}
SKIP: {
skip 'SO_ACCEPTFILTER is FreeBSD-only', 1 if $^O ne 'freebsd';
skip 'accf_data not loaded: kldload accf_data' if !defined $accf_arg;
- my $var = PublicInbox::Daemon::SO_ACCEPTFILTER();
+ my $var = $PublicInbox::Daemon::SO_ACCEPTFILTER;
defined(my $x = getsockopt($sock, SOL_SOCKET, $var)) or die;
is($x, $accf_arg, 'SO_ACCEPTFILTER unchanged if previously set');
};
skip 'accf_data not loaded? kldload accf_data', 2;
}
require PublicInbox::Daemon;
- my $var = PublicInbox::Daemon::SO_ACCEPTFILTER();
- my $x = getsockopt($https, SOL_SOCKET, $var);
+ ok(defined($PublicInbox::Daemon::SO_ACCEPTFILTER),
+ 'SO_ACCEPTFILTER defined');
+ my $x = getsockopt($https, SOL_SOCKET,
+ $PublicInbox::Daemon::SO_ACCEPTFILTER);
like($x, qr/\Adataready\0+\z/, 'got dataready accf for https');
};
skip 'accf_http not loaded: kldload accf_http', 1;
}
require PublicInbox::Daemon;
- my $var = PublicInbox::Daemon::SO_ACCEPTFILTER();
- my $x = getsockopt($sock, SOL_SOCKET, $var);
+ ok(defined($PublicInbox::Daemon::SO_ACCEPTFILTER),
+ 'SO_ACCEPTFILTER defined');
+ my $x = getsockopt($sock, SOL_SOCKET,
+ $PublicInbox::Daemon::SO_ACCEPTFILTER);
like($x, qr/\Ahttpready\0+\z/, 'got httpready accf for HTTP');
};
skip 'accf_data not loaded? kldload accf_data', 2;
}
require PublicInbox::Daemon;
- my $var = PublicInbox::Daemon::SO_ACCEPTFILTER();
- my $x = getsockopt($imaps, SOL_SOCKET, $var);
+ my $x = getsockopt($imaps, SOL_SOCKET,
+ $PublicInbox::Daemon::SO_ACCEPTFILTER);
like($x, qr/\Adataready\0+\z/, 'got dataready accf for IMAPS');
- $x = getsockopt($starttls, IPPROTO_TCP, $var);
+ $x = getsockopt($starttls, IPPROTO_TCP,
+ $PublicInbox::Daemon::SO_ACCEPTFILTER);
is($x, undef, 'no BSD accept filter for plain IMAP');
};
skip 'accf_data not loaded? kldload accf_data', 2;
}
require PublicInbox::Daemon;
- my $var = PublicInbox::Daemon::SO_ACCEPTFILTER();
- my $x = getsockopt($nntps, SOL_SOCKET, $var);
+ my $x = getsockopt($nntps, SOL_SOCKET,
+ $PublicInbox::Daemon::SO_ACCEPTFILTER);
like($x, qr/\Adataready\0+\z/, 'got dataready accf for NNTPS');
- $x = getsockopt($starttls, IPPROTO_TCP, $var);
+ $x = getsockopt($starttls, IPPROTO_TCP,
+ $PublicInbox::Daemon::SO_ACCEPTFILTER);
is($x, undef, 'no BSD accept filter for plain NNTP');
};