From e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 22:34:10 +0200 Subject: Adding upstream version 4.2.2. Signed-off-by: Daniel Baumann --- wsutil/inet_addr.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 wsutil/inet_addr.c (limited to 'wsutil/inet_addr.c') diff --git a/wsutil/inet_addr.c b/wsutil/inet_addr.c new file mode 100644 index 00000000..e0f1df62 --- /dev/null +++ b/wsutil/inet_addr.c @@ -0,0 +1,102 @@ +/* inet_addr.c + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" +#define WS_LOG_DOMAIN LOG_DOMAIN_WSUTIL +#include "inet_addr.h" + +#include +#include + +#ifdef HAVE_ARPA_INET_H +#include +#endif + +#ifdef HAVE_NETINET_IN_H +#include +#endif + +#include + +#ifdef HAVE_SYS_SOCKET_H +#include /* needed to define AF_ values on UNIX */ +#endif + +#ifdef _WIN32 +#include /* indirectly defines AF_ values on Windows */ +#define _NTOP_SRC_CAST_ (PVOID) +#else +#define _NTOP_SRC_CAST_ +#endif + +#include "str_util.h" + +/* + * We assume and require an inet_pton/inet_ntop that supports AF_INET + * and AF_INET6. + */ + +static inline bool +inet_pton_internal(int af, const char *src, void *dst, size_t dst_size, + const char *af_str) +{ + int ret = inet_pton(af, src, dst); + if (ret < 0) { + int err = errno; + ws_log(WS_LOG_DOMAIN, LOG_LEVEL_CRITICAL, "inet_pton: %s (%d): %s", af_str, af, g_strerror(err)); + memset(dst, 0, dst_size); + errno = err; + return false; + } + /* ret == 0 invalid src representation, ret == 1 success. */ + return ret == 1; +} + +static inline const char * +inet_ntop_internal(int af, const void *src, char *dst, size_t dst_size, + const char *af_str) +{ + /* Add a cast to ignore 64-to-32 bit narrowing warnings with some + * compilers (POSIX uses socklen_t instead of size_t). */ + const char *ret = inet_ntop(af, _NTOP_SRC_CAST_ src, dst, (unsigned int)dst_size); + if (ret == NULL) { + int err = errno; + char errbuf[16]; + ws_log(WS_LOG_DOMAIN, LOG_LEVEL_CRITICAL, "inet_ntop: %s (%d): %s", af_str, af, g_strerror(err)); + /* set result to something that can't be confused with a valid conversion */ + (void)g_strlcpy(dst, ws_strerrorname_r(err, errbuf, sizeof(errbuf)), dst_size); + errno = err; + return dst; + } + return dst; +} + +const char * +ws_inet_ntop4(const void *src, char *dst, size_t dst_size) +{ + return inet_ntop_internal(AF_INET, src, dst, dst_size, "AF_INET"); +} + +bool +ws_inet_pton4(const char *src, ws_in4_addr *dst) +{ + return inet_pton_internal(AF_INET, src, dst, sizeof(*dst), "AF_INET"); +} + +const char * +ws_inet_ntop6(const void *src, char *dst, size_t dst_size) +{ + return inet_ntop_internal(AF_INET6, src, dst, dst_size, "AF_INET6"); +} + +bool +ws_inet_pton6(const char *src, ws_in6_addr *dst) +{ + return inet_pton_internal(AF_INET6, src, dst, sizeof(*dst), "AF_INET6"); +} -- cgit v1.2.3