From 47d96ab8adf0bb72e8070ea9d41e4a782f35f362 Mon Sep 17 00:00:00 2001 From: Patrick Wyatt Date: Wed, 29 Apr 2026 21:44:41 -0700 Subject: [PATCH] Display actual port when binding --port 0 This change causes lightpanda to display the actual port number (instead of 0) when binding a dynamic port (--port 0), which makes automating based on scraping lightpanda output simple. --- src/Server.zig | 5 +++-- src/network/Network.zig | 9 ++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Server.zig b/src/Server.zig index 50f81d8a..d99347dc 100644 --- a/src/Server.zig +++ b/src/Server.zig @@ -57,8 +57,9 @@ pub fn init(app: *App, address: net.Address) !*Server { .clients_pool = std.heap.MemoryPool(Client).init(allocator), }; - try self.app.network.bind(address, self, onAccept); - log.info(.app, "server running", .{ .address = address }); + var bound_address = address; + try self.app.network.bind(&bound_address, self, onAccept); + log.info(.app, "server running", .{ .address = bound_address }); return self; } diff --git a/src/network/Network.zig b/src/network/Network.zig index 42756783..4057641c 100644 --- a/src/network/Network.zig +++ b/src/network/Network.zig @@ -351,7 +351,7 @@ pub fn deinit(self: *Network) void { pub fn bind( self: *Network, - address: net.Address, + address: *net.Address, ctx: *anyopaque, on_accept: *const fn (ctx: *anyopaque, socket: posix.socket_t) void, ) !void { @@ -367,6 +367,13 @@ pub fn bind( try posix.bind(listener, &address.any, address.getOsSockLen()); try posix.listen(listener, self.config.maxPendingConnections()); + // When the caller requests port 0, the OS assigns an ephemeral port; read + // the actual bound address back so callers (e.g. logging) see the real port. + var bound: posix.sockaddr.storage = undefined; + var bound_len: posix.socklen_t = @sizeOf(posix.sockaddr.storage); + try posix.getsockname(listener, @ptrCast(&bound), &bound_len); + address.* = net.Address.initPosix(@ptrCast(@alignCast(&bound))); + if (self.listener != null) return error.TooManyListeners; self.listener = .{