From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server-vie001.gnuweeb.org X-Spam-Level: X-Spam-Status: No, score=-1.2 required=5.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_DBL_BLOCKED_OPENDNS, URIBL_ZEN_BLOCKED_OPENDNS autolearn=ham autolearn_force=no version=3.4.6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=new2025; t=1753931352; bh=2I3qyVJBfvJmPBGyiZJJagXhxLFQ4lBY92I+IFN09J0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Message-ID:Date:From: Reply-To:Subject:To:Cc:In-Reply-To:References:Resent-Date: Resent-From:Resent-To:Resent-Cc:User-Agent:Content-Type: Content-Transfer-Encoding; b=oUfLNIoobINaXtg6qfbLVANOinnKng3CNilenRpu37xVemG45i3ZyQIqymiqqlGgq TLqmpEK45h9FqYTjx6WZe2gQJt4UThagPGGIXLKXqdPR5cjJ0fvxgE+5koIC+pF8uN 3waXw6NIsf3biHIkAMFKegGlsGfsYm2yfJaWl0VyOrJpKIEZFMZI2yBNYwhAOtUMxZ 0qGuLRzpzY8eN+cJ9dMK4W/HZcy3HRwopB5FBu49GnCZT0zBeyEopEIQKMzYchb2GG 4j5UR1/YHGZPIdqfkDwd4DYO5I2+RP5TwvfCfI+xOKenc/GuQ2j+p0q4KNcTknsABS U1Nj5kIEWHrmA== Received: from zero (unknown [182.253.228.104]) by server-vie001.gnuweeb.org (Postfix) with ESMTPSA id 7EE1C3126F60; Thu, 31 Jul 2025 03:09:11 +0000 (UTC) From: Ahmad Gani To: Ammar Faizi Cc: Ahmad Gani , Alviro Iskandar Setiawan , GNU/Weeb Mailing List Subject: [PATCH gwproxy v1 1/3] dnslookup: split common functionality and struct into net.c Date: Thu, 31 Jul 2025 10:07:44 +0700 Message-ID: <20250731030856.366368-2-reyuki@gnuweeb.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250731030856.366368-1-reyuki@gnuweeb.org> References: <20250731030856.366368-1-reyuki@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: It's better to split these common function that used in more than one place. Signed-off-by: Ahmad Gani --- Makefile | 1 + src/gwproxy/dns.h | 9 +--- src/gwproxy/gwproxy.c | 29 ------------ src/gwproxy/net.c | 108 ++++++++++++++++++++++++++++++++++++++++++ src/gwproxy/net.h | 27 +++++++++++ 5 files changed, 137 insertions(+), 37 deletions(-) create mode 100644 src/gwproxy/net.c create mode 100644 src/gwproxy/net.h diff --git a/Makefile b/Makefile index d9952a12b2d2..76e12e0ae739 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,7 @@ GWPROXY_TARGET = gwproxy GWPROXY_CC_SOURCES = \ $(GWPROXY_DIR)/gwproxy.c \ $(GWPROXY_DIR)/log.c \ + $(GWPROXY_DIR)/net.c \ $(GWPROXY_DIR)/ev/epoll.c diff --git a/src/gwproxy/dns.h b/src/gwproxy/dns.h index 7d62d3f9b89e..290325d4f989 100644 --- a/src/gwproxy/dns.h +++ b/src/gwproxy/dns.h @@ -9,17 +9,10 @@ #include #include #include +#include struct gwp_dns_wrk; -struct gwp_sockaddr { - union { - struct sockaddr sa; - struct sockaddr_in i4; - struct sockaddr_in6 i6; - }; -}; - struct gwp_dns_entry { char *name; char *service; diff --git a/src/gwproxy/gwproxy.c b/src/gwproxy/gwproxy.c index f465f82446ec..5bc4f3ff62bb 100644 --- a/src/gwproxy/gwproxy.c +++ b/src/gwproxy/gwproxy.c @@ -270,35 +270,6 @@ static inline ssize_t gwp_eventfd_write(int fd, uint64_t val) return 0; } -__hot -static int convert_ssaddr_to_str(char buf[FULL_ADDRSTRLEN], - const struct gwp_sockaddr *gs) -{ - int f = gs->sa.sa_family; - uint16_t port = 0; - size_t l; - - if (f == AF_INET) { - if (!inet_ntop(f, &gs->i4.sin_addr, buf, INET_ADDRSTRLEN)) - return -EINVAL; - l = strlen(buf); - port = ntohs(gs->i4.sin_port); - } else if (f == AF_INET6) { - buf[0] = '['; - if (!inet_ntop(f, &gs->i6.sin6_addr, buf + 1, INET6_ADDRSTRLEN)) - return -EINVAL; - l = strlen(buf); - buf[l++] = ']'; - port = ntohs(gs->i6.sin6_port); - } else { - return -EINVAL; - } - - buf[l++] = ':'; - snprintf(buf + l, FULL_ADDRSTRLEN - l, "%hu", port); - return 0; -} - __hot const char *ip_to_str(const struct gwp_sockaddr *gs) { diff --git a/src/gwproxy/net.c b/src/gwproxy/net.c new file mode 100644 index 000000000000..7427f87ae300 --- /dev/null +++ b/src/gwproxy/net.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include + +int init_addr(const char *addr, struct gwp_sockaddr *addr_st, uint16_t port) +{ + char *separator, *ipstr, *port_str; + char tmp[FULL_ADDRSTRLEN]; + unsigned short nport, af; + struct sockaddr_in6 *i6; + struct sockaddr_in *i4; + size_t addrlen; + int i, hport; + + i6 = (void *)addr_st; + i4 = (void *)addr_st; + separator = NULL; + addrlen = strlen(addr) + 1; + if (addrlen > FULL_ADDRSTRLEN) + return -EINVAL; + + strncpy(tmp, addr, FULL_ADDRSTRLEN); + for (i = addrlen - 1; i > 0; i--) { + if (tmp[i] == ':') { + separator = &tmp[i]; + break; + } + } + + if (separator) { + *separator = '\0'; + + port_str = separator + 1; + hport = atoi(port_str); + if (!hport) + return -EINVAL; + if (hport > 65535 || hport < 0) + return -EINVAL; + nport = htons(hport); + } else { + nport = htons(port); + } + + if (*tmp == '[') { + af = AF_INET6; + /* replace ']' with null-terminated byte */ + if (separator) { + if (*(separator - 1) != ']') + return -EINVAL; + *(separator - 1) = '\0'; + } else { + tmp[addrlen - 1] = '\0'; + } + ipstr = tmp + 1; + } else { + af = AF_INET; + ipstr = tmp; + } + + addr_st->sa.sa_family = af; + switch (af) { + case AF_INET: + i4->sin_port = nport; + if (!inet_pton(AF_INET, ipstr, &i4->sin_addr)) + return -EINVAL; + + break; + case AF_INET6: + i6->sin6_port = nport; + if (!inet_pton(AF_INET6, ipstr, &i6->sin6_addr)) + return -EINVAL; + + break; + } + + return 0; +} + +int convert_ssaddr_to_str(char buf[FULL_ADDRSTRLEN], + const struct gwp_sockaddr *gs) +{ + int f = gs->sa.sa_family; + uint16_t port = 0; + size_t l; + + if (f == AF_INET) { + if (!inet_ntop(f, &gs->i4.sin_addr, buf, INET_ADDRSTRLEN)) + return -EINVAL; + l = strlen(buf); + port = ntohs(gs->i4.sin_port); + } else if (f == AF_INET6) { + buf[0] = '['; + if (!inet_ntop(f, &gs->i6.sin6_addr, buf + 1, INET6_ADDRSTRLEN)) + return -EINVAL; + l = strlen(buf); + buf[l++] = ']'; + port = ntohs(gs->i6.sin6_port); + } else { + return -EINVAL; + } + + buf[l++] = ':'; + snprintf(buf + l, FULL_ADDRSTRLEN - l, "%hu", port); + return 0; +} diff --git a/src/gwproxy/net.h b/src/gwproxy/net.h new file mode 100644 index 000000000000..ebfebca5d840 --- /dev/null +++ b/src/gwproxy/net.h @@ -0,0 +1,27 @@ +/* + * utility for network-related stuff + */ + +#include + +#define FULL_ADDRSTRLEN (INET6_ADDRSTRLEN + sizeof(":65535[]") - 1) + +struct gwp_sockaddr { + union { + struct sockaddr sa; + struct sockaddr_in i4; + struct sockaddr_in6 i6; + }; +}; + +/* + * Initialize address structure + * + * @param addr + * @param addr_st + * @param port in host byte order when the string does not contain port + */ +int init_addr(const char *addr, struct gwp_sockaddr *addr_st, uint16_t port); + +int convert_ssaddr_to_str(char buf[FULL_ADDRSTRLEN], + const struct gwp_sockaddr *gs); base-commit: 0753f2d766e85fcbffc1f83dfd4e67d6206591cb -- Ahmad Gani