From bbdf63635abc197839dad387d47d6d2c8007d0bc Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Wed, 22 Jan 2025 16:08:22 +0100 Subject: [PATCH] server: REUSEPORT is not allowed on unix socket see https://github.com/torvalds/linux/commit/5b0af621c3f6ef9261cf6067812f2fd9943acb4b --- src/server.zig | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/server.zig b/src/server.zig index df25f4f6..b498e24a 100644 --- a/src/server.zig +++ b/src/server.zig @@ -498,19 +498,22 @@ fn isUnixSocket(addr: std.net.Address) bool { } pub fn listen(address: std.net.Address) !std.posix.socket_t { + const isunixsock = isUnixSocket(address); // create socket const flags = std.posix.SOCK.STREAM | std.posix.SOCK.CLOEXEC | std.posix.SOCK.NONBLOCK; - const proto = if (isUnixSocket(address)) @as(u32, 0) else std.posix.IPPROTO.TCP; + const proto = if (isunixsock) @as(u32, 0) else std.posix.IPPROTO.TCP; const sockfd = try std.posix.socket(address.any.family, flags, proto); errdefer std.posix.close(sockfd); // socket options - if (@hasDecl(std.posix.SO, "REUSEPORT")) { + // + // REUSEPORT can't be set on unix socket anymore. + // see https://github.com/torvalds/linux/commit/5b0af621c3f6ef9261cf6067812f2fd9943acb4b + if (@hasDecl(std.posix.SO, "REUSEPORT") and !isunixsock) { try setSockOpt(sockfd, std.posix.SOL.SOCKET, std.posix.SO.REUSEPORT, 1); - } else { - try setSockOpt(sockfd, std.posix.SOL.SOCKET, std.posix.SO.REUSEADDR, 1); } + try setSockOpt(sockfd, std.posix.SOL.SOCKET, std.posix.SO.REUSEADDR, 1); if (!isUnixSocket(address)) { if (builtin.target.os.tag == .linux) { // posix.TCP not available on MacOS // WARNING: disable Nagle's alogrithm to avoid latency issues