From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202512 header.b=FRE7UDax; dkim-atps=neutral Received: from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 6A1EB5A0626 for ; Tue, 13 Jan 2026 04:06:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202512; t=1768273576; bh=t494Xfy0sSnZMB45XreUr+FqtmCjnn0VEFUDLENLRNo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FRE7UDax6mM/vYtOnnhMaM7t9illoTaRRokekx8tcw9+qjRFmhurFrVvnUVinjBe1 AMfdMh+9Mp3GWYG1fLR4zNdcVrgXe/XC92efiMcOU/GIOpawrOFLeyKrLSylqcC5+S Y9XqMFLRrcCgPktpJJWH7AXV3VGSJmhGrlNeG4QVT13v0ikqMFfvNG1uxFN0anNu42 E5k6jtITkx+wfDjKwtQKrM1x3ojxcEeObs6s0GOzQwNCVmeki7mWfa9wEjSHBh7PAM Goz/Wj/DgFTisW/1qXspq3ZU82xICRW7xjOz/nOsFqqDHGYtBpyV9wXzjVzepdjCia rzCRVZ9sMtNwg== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4dqvK41wTqz4wRG; Tue, 13 Jan 2026 14:06:16 +1100 (AEDT) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH v2 2/2] tcp, udp: Make {tcp,udp}_listen() return socket fds Date: Tue, 13 Jan 2026 14:06:14 +1100 Message-ID: <20260113030614.29309-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260113030614.29309-1-david@gibson.dropbear.id.au> References: <20260113030614.29309-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: XOLMGL6C53H773XK6KPTUVQKVIBPNI7E X-Message-ID-Hash: XOLMGL6C53H773XK6KPTUVQKVIBPNI7E X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: {tcp,udp}_listen() currently return 0 on success, rather than the socket fd they created. Historically, that was because these functions could sometimes create multiple sockets. We've now refactored things to avoid that, so it makes more sense for them to return the socket on success. Signed-off-by: David Gibson --- conf.c | 14 +++++++------- tcp.c | 7 ++----- udp.c | 4 ++-- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/conf.c b/conf.c index 9a0d945d..3eaa6c8c 100644 --- a/conf.c +++ b/conf.c @@ -149,7 +149,7 @@ static void conf_ports_range_except(const struct ctx *c, char optname, { bool bound_one = false; unsigned i; - int ret; + int fd; if (first == 0) { die("Can't forward port 0 for option '-%c %s'", @@ -185,23 +185,23 @@ static void conf_ports_range_except(const struct ctx *c, char optname, fwd->delta[i] = to - first; if (optname == 't') - ret = tcp_listen(c, PIF_HOST, addr, ifname, i); + fd = tcp_listen(c, PIF_HOST, addr, ifname, i); else if (optname == 'u') - ret = udp_listen(c, PIF_HOST, addr, ifname, i); + fd = udp_listen(c, PIF_HOST, addr, ifname, i); else /* No way to check in advance for -T and -U */ - ret = 0; + fd = 0; - if (ret == -ENFILE || ret == -EMFILE) { + if (fd == -ENFILE || fd == -EMFILE) { die("Can't open enough sockets for port specifier: %s", optarg); } - if (!ret) { + if (fd >= 0) { bound_one = true; } else if (!weak) { die("Failed to bind port %u (%s) for option '-%c %s'", - i, strerror_(-ret), optname, optarg); + i, strerror_(-fd), optname, optarg); } } diff --git a/tcp.c b/tcp.c index 664f843d..e1b38e85 100644 --- a/tcp.c +++ b/tcp.c @@ -2678,7 +2678,7 @@ void tcp_sock_handler(const struct ctx *c, union epoll_ref ref, * @ifname: Name of interface to bind to, NULL for any * @port: Port, host order * - * Return: 0 on success, negative error code on failure + * Return: socket fd on success, negative error code on failure */ int tcp_listen(const struct ctx *c, uint8_t pif, const union inany_addr *addr, const char *ifname, in_port_t port) @@ -2727,10 +2727,7 @@ int tcp_listen(const struct ctx *c, uint8_t pif, socks[port][V6] = s < 0 ? -1 : s; } - if (s < 0) - return s; - - return 0; + return s; } /** diff --git a/udp.c b/udp.c index ea28f5b3..993d53fc 100644 --- a/udp.c +++ b/udp.c @@ -1136,7 +1136,7 @@ int udp_tap_handler(const struct ctx *c, uint8_t pif, * @ifname: Name of interface to bind to, NULL if not configured * @port: Port, host order * - * Return: 0 on success, negative error code on failure + * Return: socket fd on success, negative error code on failure */ int udp_listen(const struct ctx *c, uint8_t pif, const union inany_addr *addr, const char *ifname, in_port_t port) @@ -1180,7 +1180,7 @@ int udp_listen(const struct ctx *c, uint8_t pif, if (!addr || !inany_v4(addr)) socks[V6][port] = s < 0 ? -1 : s; - return s < 0 ? s : 0; + return s; } /** -- 2.52.0