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=fVW2Z1e7; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 8CA4E5A0657 for ; Mon, 05 Jan 2026 09:28:54 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202512; t=1767601732; bh=fd49f5VsCISx8jsE5hCQ+WY2DO2waQBrdot4C4Iovw8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fVW2Z1e73J/j+IBvkq50B3tBGFlem3Sq9WokkBxhsMDGnokH2sFyjJa7hrOVrXuEO IbTgXDZSgA6fIBgujbYRKk1PGZ1srjuFnRlOjz1UyxnxzGIiy4pP7P/cSpf49kfZnH 0E0VV0NwCmb5J1XnuMeQ8/FIt2DT9AamrBeoz1GHTjmqwxfRZFUcsJwRElFBGHYtLd mKHTWUZfbXif9ENG5kmly2VABKo4Ky5RO1fCCWOFseQedy1/IPWLPpXdaSuoo/GuJg T7ExoPop5d4QtRDeNPz+kzecSMfMlOO9cX0EYATXNchjf0xw8sjimMtupCDJ6OAiqd 4HmECl9YqmNMQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4dl6s02W8Wz4wDl; Mon, 05 Jan 2026 19:28:52 +1100 (AEDT) From: David Gibson To: Stefano Brivio , passt-dev@passt.top Subject: [PATCH 3/3] tcp, udp: Make {tcp,udp}_listen() return socket fds Date: Mon, 5 Jan 2026 19:28:50 +1100 Message-ID: <20260105082850.1985300-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260105082850.1985300-1-david@gibson.dropbear.id.au> References: <20260105082850.1985300-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: PN2GUPM5YKXQE7XQRHCFXSDH3XCABLC3 X-Message-ID-Hash: PN2GUPM5YKXQE7XQRHCFXSDH3XCABLC3 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 cc3c20a9..5db49653 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 67007c05..80b47f3c 100644 --- a/tcp.c +++ b/tcp.c @@ -2680,7 +2680,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) @@ -2729,10 +2729,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 8cfa1e1f..63dc7c25 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