/src/wireshark/wsutil/inet_addr.c
Line | Count | Source |
1 | | /* inet_addr.c |
2 | | * |
3 | | * Wireshark - Network traffic analyzer |
4 | | * By Gerald Combs <gerald@wireshark.org> |
5 | | * Copyright 1998 Gerald Combs |
6 | | * |
7 | | * SPDX-License-Identifier: GPL-2.0-or-later |
8 | | */ |
9 | | |
10 | | #include "config.h" |
11 | 0 | #define WS_LOG_DOMAIN LOG_DOMAIN_WSUTIL |
12 | | #include "inet_addr.h" |
13 | | |
14 | | #include <errno.h> |
15 | | #include <string.h> |
16 | | |
17 | | #ifdef HAVE_ARPA_INET_H |
18 | | #include <arpa/inet.h> |
19 | | #endif |
20 | | |
21 | | #ifdef HAVE_NETINET_IN_H |
22 | | #include <netinet/in.h> |
23 | | #endif |
24 | | |
25 | | #include <sys/types.h> |
26 | | |
27 | | #ifdef HAVE_SYS_SOCKET_H |
28 | | #include <sys/socket.h> /* needed to define AF_ values on UNIX */ |
29 | | #endif |
30 | | |
31 | | #ifdef _WIN32 |
32 | | #include <ws2tcpip.h> /* indirectly defines AF_ values on Windows */ |
33 | | #define _NTOP_SRC_CAST_ (PVOID) |
34 | | #else |
35 | | #define _NTOP_SRC_CAST_ |
36 | | #endif |
37 | | |
38 | | #include "str_util.h" |
39 | | |
40 | | /* |
41 | | * We assume and require an inet_pton/inet_ntop that supports AF_INET |
42 | | * and AF_INET6. |
43 | | */ |
44 | | |
45 | | static inline bool |
46 | | inet_pton_internal(int af, const char *src, void *dst, size_t dst_size, |
47 | | const char *af_str) |
48 | 1.07k | { |
49 | 1.07k | int ret = inet_pton(af, src, dst); |
50 | 1.07k | if (ret < 0) { |
51 | 0 | int err = errno; |
52 | 0 | ws_log(WS_LOG_DOMAIN, LOG_LEVEL_CRITICAL, "inet_pton: %s (%d): %s", af_str, af, g_strerror(err)); |
53 | 0 | memset(dst, 0, dst_size); |
54 | 0 | errno = err; |
55 | 0 | return false; |
56 | 0 | } |
57 | | /* ret == 0 invalid src representation, ret == 1 success. */ |
58 | 1.07k | return ret == 1; |
59 | 1.07k | } |
60 | | |
61 | | static inline const char * |
62 | | inet_ntop_internal(int af, const void *src, char *dst, size_t dst_size, |
63 | | const char *af_str) |
64 | 138k | { |
65 | | /* Add a cast to ignore 64-to-32 bit narrowing warnings with some |
66 | | * compilers (POSIX uses socklen_t instead of size_t). */ |
67 | 138k | const char *ret = inet_ntop(af, _NTOP_SRC_CAST_ src, dst, (unsigned int)dst_size); |
68 | 138k | if (ret == NULL) { |
69 | 0 | int err = errno; |
70 | 0 | char errbuf[16]; |
71 | 0 | ws_log(WS_LOG_DOMAIN, LOG_LEVEL_CRITICAL, "inet_ntop: %s (%d): %s", af_str, af, g_strerror(err)); |
72 | | /* set result to something that can't be confused with a valid conversion */ |
73 | 0 | (void)g_strlcpy(dst, ws_strerrorname_r(err, errbuf, sizeof(errbuf)), dst_size); |
74 | 0 | errno = err; |
75 | 0 | return dst; |
76 | 0 | } |
77 | 138k | return dst; |
78 | 138k | } |
79 | | |
80 | | const char * |
81 | | ws_inet_ntop4(const void *src, char *dst, size_t dst_size) |
82 | 0 | { |
83 | 0 | return inet_ntop_internal(AF_INET, src, dst, dst_size, "AF_INET"); |
84 | 0 | } |
85 | | |
86 | | bool |
87 | | ws_inet_pton4(const char *src, ws_in4_addr *dst) |
88 | 1.05k | { |
89 | 1.05k | return inet_pton_internal(AF_INET, src, dst, sizeof(*dst), "AF_INET"); |
90 | 1.05k | } |
91 | | |
92 | | const char * |
93 | | ws_inet_ntop6(const void *src, char *dst, size_t dst_size) |
94 | 138k | { |
95 | 138k | return inet_ntop_internal(AF_INET6, src, dst, dst_size, "AF_INET6"); |
96 | 138k | } |
97 | | |
98 | | bool |
99 | | ws_inet_pton6(const char *src, ws_in6_addr *dst) |
100 | 21 | { |
101 | | return inet_pton_internal(AF_INET6, src, dst, sizeof(*dst), "AF_INET6"); |
102 | 21 | } |