Add inet_pton/inet_ntop interface to libwsutil

Change-Id: Ifc344ed33f2f7ca09a6912a5adb49dc35f07c81f
Reviewed-on: https://code.wireshark.org/review/13881
Petri-Dish: João Valverde <j@v6e.pt>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: João Valverde <j@v6e.pt>
This commit is contained in:
João Valverde 2016-02-10 09:11:12 +00:00 committed by João Valverde
parent 5fec8fa746
commit 8bee8bad81
20 changed files with 221 additions and 275 deletions

View File

@ -117,6 +117,7 @@ endif()
check_function_exists("getprotobynumber" HAVE_GETPROTOBYNUMBER)
check_function_exists("inet_aton" HAVE_INET_ATON)
check_function_exists("inet_ntop" HAVE_INET_NTOP_PROTO)
check_function_exists("inet_pton" HAVE_INET_PTON)
check_function_exists("issetugid" HAVE_ISSETUGID)
check_function_exists("mkdtemp" HAVE_MKDTEMP)
check_function_exists("mkstemp" HAVE_MKSTEMP)

View File

@ -28,22 +28,6 @@
#include <string.h>
#include <stdio.h>
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> /* needed to define AF_ values on UNIX */
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h> /* needed to define AF_ values on Windows */
#endif
#ifdef NEED_INET_V6DEFS_H
# include "wsutil/inet_v6defs.h"
#endif
#include <glib.h>
#include "capture_opts.h"
@ -56,6 +40,7 @@
#include "log.h"
#include <caputils/capture_ifinfo.h>
#include <wsutil/inet_addr.h>
#ifdef HAVE_PCAP_REMOTE
static GList *remote_interface_list = NULL;
@ -187,10 +172,9 @@ capture_interface_list(int *err, char **err_str, void (*update_cb)(void))
addr_parts = g_strsplit(if_parts[4], ",", 0);
for (j = 0; addr_parts[j] != NULL; j++) {
if_addr = g_new0(if_addr_t,1);
if (inet_pton(AF_INET, addr_parts[j], &if_addr->addr.ip4_addr) > 0) {
if (ws_inet_pton4(addr_parts[j], &if_addr->addr.ip4_addr)) {
if_addr->ifat_type = IF_AT_IPv4;
} else if (inet_pton(AF_INET6, addr_parts[j],
&if_addr->addr.ip6_addr) > 0) {
} else if (ws_inet_pton6(addr_parts[j], (struct e_in6_addr *)&if_addr->addr.ip6_addr)) {
if_addr->ifat_type = IF_AT_IPv6;
} else {
g_free(if_addr);

View File

@ -112,6 +112,9 @@
/* Define if inet_ntop() prototype exists */
#cmakedefine HAVE_INET_NTOP_PROTO 1
/* Define to 1 if you have the `inet_pton' function. */
#cmakedefine HAVE_INET_PTON 1
/* Define to 1 if you have the `inflatePrime' function. */
#cmakedefine HAVE_INFLATEPRIME 1
@ -357,9 +360,6 @@
/* HTML viewer, e.g. mozilla */
#cmakedefine HTML_VIEWER "${HTML_VIEWER_EXECUTABLE}"
/* Define if inet/v6defs.h needs to be included */
#cmakedefine NEED_INET_V6DEFS_H 1
/* Name of package */
#cmakedefine PACKAGE
@ -468,6 +468,5 @@
# define UNICODE 1
# define _UNICODE 1
# define NEED_INET_V6DEFS_H 1
# define NEED_STRPTIME_H 1
#endif

View File

@ -217,8 +217,6 @@
/* Define if you have the strptime function. */
/* #undef HAVE_STRPTIME 1 */
#define NEED_INET_V6DEFS_H 1
#ifndef WIN32
#define WIN32 1
#endif

View File

@ -2945,6 +2945,8 @@ have_inet_pton=no)
if test "$have_inet_pton" = no; then
INET_PTON_LO="inet_pton.lo"
else
AC_DEFINE(HAVE_INET_NTOP, 1,
[Define to 1 if you have the `inet_pton' function.])
INET_PTON_LO=""
fi
AM_CONDITIONAL(NEED_INET_PTON_LO, test "x$have_inet_pton" = "xno")
@ -2974,9 +2976,7 @@ extern const char *inet_ntop(int, const void *, char *, socklen_t);],, [
[Define if inet_ntop() prototype exists])], [
AC_MSG_RESULT(no)])])
INET_NTOP_LO=""], [
INET_NTOP_LO="inet_ntop.lo"
AC_DEFINE(NEED_INET_V6DEFS_H, 1,
[Define if inet/v6defs.h needs to be included])])
INET_NTOP_LO="inet_ntop.lo"])
AM_CONDITIONAL(NEED_INET_NTOP_LO, test "x$INET_NTOP_LO" != "x")
AC_SUBST(INET_NTOP_LO)

View File

@ -95,10 +95,6 @@
#include <sys/un.h>
#endif
#ifdef NEED_INET_V6DEFS_H
# include "wsutil/inet_v6defs.h"
#endif
#include <wsutil/clopts_common.h>
#include <wsutil/privileges.h>
@ -116,6 +112,7 @@
#include "wsutil/file_util.h"
#include "wsutil/os_version_info.h"
#include "wsutil/str_util.h"
#include "wsutil/inet_addr.h"
#include "caputils/ws80211_utils.h"
@ -859,7 +856,7 @@ print_machine_readable_interfaces(GList *if_list)
if_addr = (if_addr_t *)addr->data;
switch(if_addr->ifat_type) {
case IF_AT_IPv4:
if (inet_ntop(AF_INET, &if_addr->addr.ip4_addr, addr_str,
if (ws_inet_ntop4(&if_addr->addr.ip4_addr, addr_str,
ADDRSTRLEN)) {
printf("%s", addr_str);
} else {
@ -867,7 +864,7 @@ print_machine_readable_interfaces(GList *if_list)
}
break;
case IF_AT_IPv6:
if (inet_ntop(AF_INET6, &if_addr->addr.ip6_addr,
if (ws_inet_ntop6(&if_addr->addr.ip6_addr,
addr_str, ADDRSTRLEN)) {
printf("%s", addr_str);
} else {
@ -1390,7 +1387,7 @@ cap_open_socket(char *pipename, pcap_options *pcap_opts, char *errmsg, int errms
g_snprintf ( buf,(gulong)len + 1, "%s", sockname );
buf[len] = '\0';
if (inet_pton(AF_INET, buf, &sa.sin_addr) <= 0) {
if (!ws_inet_pton4(buf, (guint32 *)&sa.sin_addr)) {
goto fail_invalid;
}

View File

@ -73,10 +73,6 @@
#include <netdb.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> /* needed to define AF_ values on UNIX */
#endif
@ -85,10 +81,6 @@
#include <winsock2.h> /* needed to define AF_ values on Windows */
#endif
#ifdef NEED_INET_V6DEFS_H
# include "wsutil/inet_v6defs.h"
#endif
#ifdef _WIN32
# include <ws2tcpip.h>
#endif
@ -109,7 +101,6 @@
# endif /* HAVE_GNU_ADNS */
#endif /* HAVE_C_ARES */
#include <glib.h>
#include "packet.h"
@ -122,6 +113,7 @@
#include <wsutil/file_util.h>
#include <wsutil/pint.h>
#include "wsutil/inet_aton.h"
#include <wsutil/inet_addr.h>
#include <epan/strutil.h>
#include <epan/to_str-int.h>
@ -1960,10 +1952,11 @@ read_hosts_file (const char *hostspath, gboolean store_entries)
char *line = NULL;
int size = 0;
gchar *cp;
guint32 host_addr[4]; /* IPv4 or IPv6 */
struct e_in6_addr ip6_addr;
union {
guint32 ip4_addr;
struct e_in6_addr ip6_addr;
} host_addr;
gboolean is_ipv6, entry_found = FALSE;
int ret;
/*
* See the hosts(4) or hosts(5) man page for hosts file format
@ -1979,17 +1972,14 @@ read_hosts_file (const char *hostspath, gboolean store_entries)
if ((cp = strtok(line, " \t")) == NULL)
continue; /* no tokens in the line */
ret = inet_pton(AF_INET6, cp, &host_addr);
if (ret < 0)
continue; /* error parsing */
if (ret > 0) {
if (ws_inet_pton6(cp, &host_addr.ip6_addr)) {
/* Valid IPv6 */
is_ipv6 = TRUE;
} else {
/* Not valid IPv6 - valid IPv4? */
if (!str_to_ip(cp, &host_addr))
continue; /* no */
} else if (ws_inet_pton4(cp, &host_addr.ip4_addr)) {
/* Valid IPv4 */
is_ipv6 = FALSE;
} else {
continue;
}
if ((cp = strtok(NULL, " \t")) == NULL)
@ -1998,26 +1988,10 @@ read_hosts_file (const char *hostspath, gboolean store_entries)
entry_found = TRUE;
if (store_entries) {
if (is_ipv6) {
memcpy(&ip6_addr, host_addr, sizeof ip6_addr);
add_ipv6_name(&ip6_addr, cp);
} else
add_ipv4_name(host_addr[0], cp);
#if 0
/*
* Add the aliases, too, if there are any.
* XXX - except we only store the last one added. The name
* resolver returns the first name in the hosts file, we should
* too.
*/
while ((cp = strtok(NULL, " \t")) != NULL) {
if (is_ipv6) {
memcpy(&ip6_addr, host_addr, sizeof ip6_addr);
add_ipv6_name(&ip6_addr, cp);
} else
add_ipv4_name(host_addr[0], cp);
add_ipv6_name(&host_addr.ip6_addr, cp);
} else {
add_ipv4_name(host_addr.ip4_addr, cp);
}
#endif
}
}
g_free(line);
@ -2053,36 +2027,30 @@ add_hosts_file (const char *hosts_file)
gboolean
add_ip_name_from_string (const char *addr, const char *name)
{
guint32 host_addr[4]; /* IPv4 */
struct e_in6_addr ip6_addr; /* IPv6 */
union {
guint32 ip4_addr;
struct e_in6_addr ip6_addr;
} host_addr;
gboolean is_ipv6;
int ret;
resolved_ipv4_t *resolved_ipv4_entry;
resolved_ipv6_t *resolved_ipv6_entry;
ret = inet_pton(AF_INET6, addr, &ip6_addr);
if (ret < 0)
/* Error parsing address */
return FALSE;
if (ret > 0) {
/* Valid IPv6 */
if (ws_inet_pton6(addr, &host_addr.ip6_addr)) {
is_ipv6 = TRUE;
} else {
/* Not valid IPv6 - valid IPv4? */
if (!str_to_ip(addr, &host_addr))
return FALSE; /* no */
} else if (ws_inet_pton4(addr, &host_addr.ip4_addr)) {
is_ipv6 = FALSE;
} else {
return FALSE;
}
if (is_ipv6) {
resolved_ipv6_entry = g_new(resolved_ipv6_t, 1);
memcpy(&(resolved_ipv6_entry->ip6_addr), &ip6_addr, 16);
memcpy(&(resolved_ipv6_entry->ip6_addr), &host_addr.ip6_addr, 16);
g_strlcpy(resolved_ipv6_entry->name, name, MAXNAMELEN);
manually_resolved_ipv6_list = g_slist_prepend(manually_resolved_ipv6_list, resolved_ipv6_entry);
} else {
resolved_ipv4_entry = g_new(resolved_ipv4_t, 1);
resolved_ipv4_entry->host_addr = host_addr[0];
resolved_ipv4_entry->host_addr = host_addr.ip4_addr;
g_strlcpy(resolved_ipv4_entry->name, name, MAXNAMELEN);
manually_resolved_ipv4_list = g_slist_prepend(manually_resolved_ipv4_list, resolved_ipv4_entry);
}
@ -3499,13 +3467,13 @@ addr_resolv_cleanup(void)
gboolean
str_to_ip(const char *str, void *dst)
{
return inet_pton(AF_INET, str, dst) > 0;
return ws_inet_pton4(str, (guint32 *)dst);
}
gboolean
str_to_ip6(const char *str, void *dst)
{
return inet_pton(AF_INET6, str, dst) > 0;
return ws_inet_pton6(str, (struct e_in6_addr *)dst);
}
/*

View File

@ -21,18 +21,6 @@
#include "config.h"
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h> /* needed for <arpa/inet.h> on some platforms */
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> /* needed to define AF_ values on UNIX */
#endif
#include <string.h> /* for memcmp */
#include "packet.h"
#include "address_types.h"
@ -41,7 +29,7 @@
#include "addr_resolv.h"
#include "wsutil/pint.h"
#include "wsutil/str_util.h"
#include "wsutil/inet_v6defs.h"
#include "wsutil/inet_addr.h"
#include <epan/dissectors/packet-mtp3.h>
@ -599,7 +587,7 @@ ib_addr_to_str( const address *addr, gchar *buf, int buf_len){
#define PREAMBLE_STR_LEN ((int)(sizeof("GID: ") - 1))
g_strlcpy(buf, "GID: ", buf_len);
if (buf_len < PREAMBLE_STR_LEN ||
inet_ntop(AF_INET6, addr->data, buf + PREAMBLE_STR_LEN,
ws_inet_ntop6(addr->data, buf + PREAMBLE_STR_LEN,
buf_len - PREAMBLE_STR_LEN) == NULL ) /* Returns NULL if no space and does not touch buf */
g_strlcpy(buf, BUF_TOO_SMALL_ERR, buf_len); /* Let the unexpected value alert user */
} else { /* this is a LID (16 bits) */

View File

@ -26,14 +26,7 @@
#include "epan/packet.h"
#include "epan/prefs.h"
#include "wsutil/report_err.h"
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_WINSOCK2_H
# include <winsock2.h> /* Needed for AF_INET on Windows */
#endif
#include "wsutil/inet_v6defs.h"
#include "wsutil/inet_addr.h"
#include "packet-uaudp.h"
@ -71,7 +64,7 @@ static int hf_uaudp_sntseq = -1;
static gint ett_uaudp = -1;
/* pref */
static guint8 sys_ip[4];
static guint32 sys_ip;
static const char* pref_sys_ip_s = "";
static gboolean use_sys_ip = FALSE;
@ -366,12 +359,12 @@ static int dissect_uaudp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
/* server address, if present, has precedence on ports */
if (use_sys_ip) {
/* use server address to find direction*/
if (memcmp((pinfo->src).data, sys_ip, 4) == 0)
if (memcmp((pinfo->src).data, &sys_ip, sizeof(sys_ip)) == 0)
{
_dissect_uaudp(tvb, pinfo, tree, SYS_TO_TERM);
return tvb_captured_length(tvb);
}
else if (memcmp((pinfo->dst).data, sys_ip, 4) == 0)
else if (memcmp((pinfo->dst).data, &sys_ip, sizeof(sys_ip)) == 0)
{
_dissect_uaudp(tvb, pinfo, tree, TERM_TO_SYS);
return tvb_captured_length(tvb);
@ -638,7 +631,7 @@ void proto_reg_handoff_uaudp(void)
dissector_delete_uint("udp.port", ports[i].last_port, uaudp_handle);
}
if (*pref_sys_ip_s) {
use_sys_ip = inet_pton(AF_INET, pref_sys_ip_s, sys_ip) == 1;
use_sys_ip = ws_inet_pton4(pref_sys_ip_s, &sys_ip);
if (!use_sys_ip) {
report_failure("Invalid value for pref uaudp.system_ip: %s",
pref_sys_ip_s);

View File

@ -114,6 +114,7 @@
#include <wsutil/crash_info.h>
#include <wsutil/ws_diag_control.h>
#include <wsutil/ws_version_info.h>
#include <wsutil/inet_addr.h>
#include <time.h>
#include <glib.h>
@ -144,22 +145,6 @@
#include <wsutil/unicode-utils.h>
#endif /* _WIN32 */
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h> /* needed to define AF_ values on Windows */
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef NEED_INET_V6DEFS_H
# include "wsutil/inet_v6defs.h"
#endif
/*--- Options --------------------------------------------------------------------*/
/* File format */
@ -182,9 +167,9 @@ static long hdr_ip_proto = 0;
/* Destination and source addresses for IP header */
static guint32 hdr_ip_dest_addr = 0;
static guint32 hdr_ip_src_addr = 0;
static guint8 hdr_ipv6_dest_addr[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static guint8 hdr_ipv6_src_addr[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static guint8 NO_IPv6_ADDRESS[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static struct e_in6_addr hdr_ipv6_dest_addr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
static struct e_in6_addr hdr_ipv6_src_addr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
static struct e_in6_addr NO_IPv6_ADDRESS = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
/* Dummy UDP header */
static int hdr_udp = FALSE;
@ -344,17 +329,6 @@ static struct { /* pseudo header for checksum calculation */
/* headers taken from glibc */
/* IPv6 address */
struct hdr_in6_addr
{
union
{
guint8 __u6_addr8[16];
guint16 __u6_addr16[8];
guint32 __u6_addr32[4];
} __in6_u;
};
typedef struct {
union {
struct ip6_hdrctl {
@ -365,15 +339,15 @@ typedef struct {
} ip6_un1;
guint8 ip6_un2_vfc; /* 4 bits version, 4 bits priority */
} ip6_ctlun;
struct hdr_in6_addr ip6_src; /* source address */
struct hdr_in6_addr ip6_dst; /* destination address */
struct e_in6_addr ip6_src; /* source address */
struct e_in6_addr ip6_dst; /* destination address */
} hdr_ipv6_t;
static hdr_ipv6_t HDR_IPv6;
static struct { /* pseudo header ipv6 for checksum calculation */
struct hdr_in6_addr src_addr6;
struct hdr_in6_addr dst_addr6;
struct e_in6_addr src_addr6;
struct e_in6_addr dst_addr6;
guint32 protocol;
guint32 zero;
} pseudoh6;
@ -697,10 +671,10 @@ write_current_packet (gboolean cont)
HDR_IP.hdr_checksum = in_checksum(&HDR_IP, sizeof(HDR_IP));
write_bytes((const char *)&HDR_IP, sizeof(HDR_IP));
} else if (hdr_ipv6) {
if (memcmp(isInbound ? hdr_ipv6_dest_addr : hdr_ipv6_src_addr, NO_IPv6_ADDRESS, sizeof(struct hdr_in6_addr)))
memcpy(&HDR_IPv6.ip6_src, isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, sizeof(struct hdr_in6_addr));
if (memcmp(isInbound ? hdr_ipv6_src_addr : hdr_ipv6_dest_addr, NO_IPv6_ADDRESS, sizeof(struct hdr_in6_addr)))
memcpy(&HDR_IPv6.ip6_dst, isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, sizeof(struct hdr_in6_addr));
if (memcmp(isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, &NO_IPv6_ADDRESS, sizeof(struct e_in6_addr)))
memcpy(&HDR_IPv6.ip6_src, isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, sizeof(struct e_in6_addr));
if (memcmp(isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, &NO_IPv6_ADDRESS, sizeof(struct e_in6_addr)))
memcpy(&HDR_IPv6.ip6_dst, isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, sizeof(struct e_in6_addr));
HDR_IPv6.ip6_ctlun.ip6_un2_vfc &= 0x0F;
HDR_IPv6.ip6_ctlun.ip6_un2_vfc |= (6<< 4);
@ -1762,13 +1736,13 @@ parse_options (int argc, char *argv[])
hdr_ethernet = TRUE;
if (hdr_ipv6 == TRUE) {
if (inet_pton( AF_INET6, optarg, hdr_ipv6_src_addr) <= 0) {
if (!ws_inet_pton6(optarg, &hdr_ipv6_src_addr)) {
fprintf(stderr, "Bad src addr -%c '%s'\n", c, p);
print_usage(stderr);
exit(1);
}
} else {
if (inet_pton( AF_INET, optarg, &hdr_ip_src_addr) <= 0) {
if (!ws_inet_pton4(optarg, &hdr_ip_src_addr)) {
fprintf(stderr, "Bad src addr -%c '%s'\n", c, p);
print_usage(stderr);
exit(1);
@ -1783,13 +1757,13 @@ parse_options (int argc, char *argv[])
}
if (hdr_ipv6 == TRUE) {
if (inet_pton( AF_INET6, p, hdr_ipv6_dest_addr) <= 0) {
if (!ws_inet_pton6(p, &hdr_ipv6_dest_addr)) {
fprintf(stderr, "Bad dest addr for -%c '%s'\n", c, p);
print_usage(stderr);
exit(1);
}
} else {
if (inet_pton( AF_INET, p, &hdr_ip_dest_addr) <= 0) {
if (!ws_inet_pton4(p, &hdr_ip_dest_addr)) {
fprintf(stderr, "Bad dest addr for -%c '%s'\n", c, p);
print_usage(stderr);
exit(1);

View File

@ -13,3 +13,5 @@ asn1/*/packet-*-template.c
extcap/*
tools/lemon/*
wsutil/inet_aton.c
wsutil/inet_ntop.c
wsutil/inet_pton.c

View File

@ -53,6 +53,7 @@ set(WSUTIL_FILES
filesystem.c
frequency-utils.c
g711.c
inet_addr.c
jsmn.c
md4.c
md5.c

View File

@ -82,7 +82,7 @@ EXTRA_libwsutil_la_SOURCES = \
inet_aton.h \
inet_ntop.c \
inet_pton.c \
inet_v6defs.h \
inet_addr-int.h \
popcount.c \
popcount.h \
strptime.c \

View File

@ -50,6 +50,7 @@ LIBWSUTIL_COMMON_SRC = \
filesystem.c \
frequency-utils.c \
g711.c \
inet_addr.c \
jsmn.c \
md4.c \
md5.c \
@ -100,6 +101,7 @@ libwsutil_nonrepl_INCLUDES = \
filesystem.h \
frequency-utils.h \
g711.h \
inet_addr.h \
jsmn.h \
md4.h \
md5.h \

View File

@ -1,4 +1,4 @@
/* inet_v6defs.h
/* inet_addr-int.h
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
@ -19,30 +19,36 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef __INET_V6DEFS_H__
#define __INET_V6DEFS_H__
#ifndef __WS_INET_ADDR_INT_H__
#define __WS_INET_ADDR_INT_H__
#include "ws_symbol_export.h"
#include "config.h"
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> /* needed to define AF_ values on UNIX */
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h> /* needed to define AF_ values on Windows */
#if _MSC_VER < 1600 /* errno.h defines EAFNOSUPPORT in Windows VC10 (and presumably eventually in VC11 ...) */
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#endif
#endif
/*
* Versions of "inet_pton()" and "inet_ntop()", for the benefit of OSes that
* don't have it.
*/
/* Windows does not have inet_pton() and inet_ntop() until Vista. In order
* to allow binaries compiled on Vista or later to work on pre-Vista Windows
* (without resorting to fragile link ordering tricks), we give our versions
* of those functions Wireshark-specific names.
*/
#ifdef _WIN32
#define inet_pton ws_inet_pton
#define inet_ntop ws_inet_ntop
WS_DLL_PUBLIC int inet_pton(int af, const char *src, void *dst);
#ifndef HAVE_INET_PTON
extern int inet_pton(int af, const char *src, void *dst);
#endif
#ifndef HAVE_INET_NTOP_PROTO
WS_DLL_PUBLIC const char *inet_ntop(int af, const void *src, char *dst,
size_t size);
extern const char *inet_ntop(int af, const void *src, char *dst, size_t size);
#endif
/*
@ -53,13 +59,4 @@ WS_DLL_PUBLIC const char *inet_ntop(int af, const void *src, char *dst,
#define AF_INET6 127 /* pick a value unlikely to duplicate an existing AF_ value */
#endif
/*
* And if __P isn't defined, define it here, so we can use it in
* "inet_ntop.c" and "inet_pton.c" (rather than having to change them
* not to use it).
*/
#ifndef __P
#define __P(args) args
#endif
#endif

60
wsutil/inet_addr.c Normal file
View File

@ -0,0 +1,60 @@
/* inet_addr.c
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "inet_addr.h"
#include "inet_addr-int.h"
static inline gboolean
_inet_pton(int af, const gchar *src, gpointer dst)
{
gint ret;
ret = inet_pton(af, src, dst);
g_assert(ret >= 0);
return ret == 1;
}
const gchar *
ws_inet_ntop4(gconstpointer src, gchar *dst, gsize dst_size)
{
return inet_ntop(AF_INET, src, dst, dst_size);
}
gboolean
ws_inet_pton4(const gchar *src, guint32 *dst)
{
return _inet_pton(AF_INET, src, dst);
}
const gchar *
ws_inet_ntop6(gconstpointer src, gchar *dst, gsize dst_size)
{
return inet_ntop(AF_INET6, src, dst, dst_size);
}
gboolean
ws_inet_pton6(const gchar *src, struct e_in6_addr *dst)
{
return _inet_pton(AF_INET6, src, dst);
}

43
wsutil/inet_addr.h Normal file
View File

@ -0,0 +1,43 @@
/* inet_addr.h
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef __WS_INET_ADDR_H__
#define __WS_INET_ADDR_H__
#include "ws_symbol_export.h"
#include <glib.h>
#include <epan/ipv6.h>
WS_DLL_PUBLIC const gchar *
ws_inet_ntop4(gconstpointer src, gchar *dst, gsize dst_size);
WS_DLL_PUBLIC gboolean
ws_inet_pton4(const gchar *src, guint32 *dst);
WS_DLL_PUBLIC const gchar *
ws_inet_ntop6(gconstpointer src, gchar *dst, gsize dst_size);
WS_DLL_PUBLIC gboolean
ws_inet_pton6(const gchar *src, struct e_in6_addr *dst);
#endif

View File

@ -35,6 +35,8 @@
static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
#endif /* LIBC_SCCS and not lint */
#include <ctype.h>
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif

View File

@ -15,48 +15,21 @@
* SOFTWARE.
*/
#include "config.h"
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#include "inet_addr-int.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> /* needed to define AF_ values on UNIX */
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h> /* needed to define AF_ values on Windows */
#if _MSC_VER < 1600 /* errno.h defines EAFNOSUPPORT in Windows VC10 (and presumably eventually in VC11 ...) */
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#endif
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#include <arpa/nameser.h>
#endif
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include "inet_v6defs.h"
#include <errno.h>
#include <glib.h>
#include <wsutil/ws_diag_control.h>
#ifndef __P
#define __P(args) args
#endif
#ifndef NS_INADDRSZ
#define NS_INADDRSZ 4
#endif
@ -67,6 +40,8 @@
#define NS_INT16SZ 2
#endif
DIAG_OFF(c++-compat)
/*
* WARNING: Don't even consider trying to compile this on a system where
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
@ -84,11 +59,7 @@ static const char *inet_ntop6 __P((const u_char *src, char *dst, size_t size));
* Paul Vixie, 1996.
*/
const char *
inet_ntop(af, src, dst, size)
int af;
const void *src;
char *dst;
size_t size;
inet_ntop(int af, const void *src, char *dst, size_t size)
{
switch (af) {
case AF_INET:
@ -114,10 +85,7 @@ inet_ntop(af, src, dst, size)
* Paul Vixie, 1996.
*/
static const char *
inet_ntop4(src, dst, size)
const u_char *src;
char *dst;
size_t size;
inet_ntop4(const u_char *src, char *dst, size_t size)
{
static const char fmt[] = "%u.%u.%u.%u";
char tmp[sizeof "255.255.255.255"];
@ -140,10 +108,7 @@ inet_ntop4(src, dst, size)
* Paul Vixie, 1996.
*/
static const char *
inet_ntop6(src, dst, size)
const u_char *src;
char *dst;
size_t size;
inet_ntop6(const u_char *src, char *dst, size_t size)
{
/*
* Note that int32_t and int16_t need only be "at least" large enough

View File

@ -17,41 +17,18 @@
#include "config.h"
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> /* needed to define AF_ values on UNIX */
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h> /* needed to define AF_ values on Windows */
#if _MSC_VER < 1600 /* errno.h defines EAFNOSUPPORT in Windows VC10 (and presumably eventually in VC11 ...) */
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#endif
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#include <arpa/nameser.h>
#endif
#include "inet_addr-int.h"
#include <string.h>
#include <errno.h>
#include "inet_v6defs.h"
#include <glib.h>
#include <wsutil/ws_diag_control.h>
#ifndef __P
#define __P(args) args
#endif
#ifndef NS_INADDRSZ
#define NS_INADDRSZ 4
@ -63,6 +40,8 @@
#define NS_INT16SZ 2
#endif
DIAG_OFF(c++-compat)
/*
* WARNING: Don't even consider trying to compile this on a system where
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
@ -87,10 +66,7 @@ static int inet_pton6 __P((const char *src, u_char *dst));
* Paul Vixie, 1996.
*/
int
inet_pton(af, src, dst)
int af;
const char *src;
void *dst;
inet_pton(int af, const char *src, void *dst)
{
switch (af) {
#ifdef AF_INET
@ -120,9 +96,7 @@ inet_pton(af, src, dst)
* Paul Vixie, 1996.
*/
static int
inet_pton4(src, dst)
const char *src;
u_char *dst;
inet_pton4(const char *src, u_char *dst)
{
static const char digits[] = "0123456789";
int saw_digit, octets, ch;
@ -175,9 +149,7 @@ inet_pton4(src, dst)
* Paul Vixie, 1996.
*/
static int
inet_pton6(src, dst)
const char *src;
u_char *dst;
inet_pton6(const char *src, u_char *dst)
{
static const char xdigits_l[] = "0123456789abcdef",
xdigits_u[] = "0123456789ABCDEF";