Introduce functions for converting Net-SNMP endpoint definitions into
struct netsnmp_ep. Calls to these functions will be added in a later
patch.
---
include/net-snmp/library/snmpIPBaseDomain.h | 18 +++++++++++
include/net-snmp/library/snmpIPv4BaseDomain.h | 5 +++
include/net-snmp/library/snmpIPv6BaseDomain.h | 3 ++
snmplib/transports/snmpIPv4BaseDomain.c | 26 ++++++++++++---
snmplib/transports/snmpIPv6BaseDomain.c | 32 +++++++++++++------
5 files changed, 70 insertions(+), 14 deletions(-)
diff --git a/include/net-snmp/library/snmpIPBaseDomain.h
b/include/net-snmp/library/snmpIPBaseDomain.h
index fb79a9365c4e..6eaf37ac4253 100644
--- a/include/net-snmp/library/snmpIPBaseDomain.h
+++ b/include/net-snmp/library/snmpIPBaseDomain.h
@@ -1,6 +1,24 @@
#ifndef _SNMPIPBASEDOMAIN_H_
#define _SNMPIPBASEDOMAIN_H_
+#include <net-snmp/types.h>
+
+/**
+ * SNMP endpoint specification.
+ * @a: Address family, network address and port number.
+ * @iface: Network interface name in ASCII format. May be empty.
+ */
+struct netsnmp_ep {
+ union {
+ struct sockaddr_in sin;
+#if defined(NETSNMP_TRANSPORT_UDPIPV6_DOMAIN) || \
+ defined(NETSNMP_TRANSPORT_TCPIPV6_DOMAIN)
+ struct sockaddr_in6 sin6;
+#endif
+ } a;
+ char iface[16];
+};
+
/**
* SNMP endpoint with the network name in ASCII format.
* @addr: Network address or host name as an ASCII string.
diff --git a/include/net-snmp/library/snmpIPv4BaseDomain.h
b/include/net-snmp/library/snmpIPv4BaseDomain.h
index 71804e3b1d72..536bf5bfe3d6 100644
--- a/include/net-snmp/library/snmpIPv4BaseDomain.h
+++ b/include/net-snmp/library/snmpIPv4BaseDomain.h
@@ -15,6 +15,8 @@ config_require(IPBase)
extern "C" {
#endif
+ struct netsnmp_ep;
+
/*
* Prototypes
*/
@@ -36,6 +38,9 @@ extern "C" {
int remote_port);
int netsnmp_sockaddr_in2(struct sockaddr_in *addr, const char *inpeername,
const char *default_target);
+ int
+ netsnmp_sockaddr_in3(struct netsnmp_ep *ep,
+ const char *inpeername, const char *default_target);
#ifdef __cplusplus
}
diff --git a/include/net-snmp/library/snmpIPv6BaseDomain.h
b/include/net-snmp/library/snmpIPv6BaseDomain.h
index 2f44e6a1b088..ac4c84ebe1af 100644
--- a/include/net-snmp/library/snmpIPv6BaseDomain.h
+++ b/include/net-snmp/library/snmpIPv6BaseDomain.h
@@ -30,6 +30,9 @@ extern "C" {
const char *default_target);
int netsnmp_sockaddr_in6(struct sockaddr_in6 *addr,
const char *inpeername, int remote_port);
+ int
+ netsnmp_sockaddr_in6_3(struct netsnmp_ep *ep,
+ const char *inpeername, const char *default_target);
#ifdef __cplusplus
}
diff --git a/snmplib/transports/snmpIPv4BaseDomain.c
b/snmplib/transports/snmpIPv4BaseDomain.c
index 003e53a49e45..d8537fbdc912 100644
--- a/snmplib/transports/snmpIPv4BaseDomain.c
+++ b/snmplib/transports/snmpIPv4BaseDomain.c
@@ -57,19 +57,34 @@ int
netsnmp_sockaddr_in2(struct sockaddr_in *addr,
const char *inpeername, const char *default_target)
{
+ struct netsnmp_ep ep;
+ int ret;
+
+ ret = netsnmp_sockaddr_in3(&ep, inpeername, default_target);
+ if (ret == 0)
+ return 0;
+ *addr = ep.a.sin;
+ return ret;
+}
+
+int
+netsnmp_sockaddr_in3(struct netsnmp_ep *ep,
+ const char *inpeername, const char *default_target)
+{
+ struct sockaddr_in *addr = &ep->a.sin;
struct netsnmp_ep_str ep_str;
int ret;
- if (addr == NULL) {
+ if (ep == NULL) {
return 0;
}
DEBUGMSGTL(("netsnmp_sockaddr_in",
"addr %p, inpeername \"%s\", default_target \"%s\"\n",
- addr, inpeername ? inpeername : "[NIL]",
+ ep, inpeername ? inpeername : "[NIL]",
default_target ? default_target : "[NIL]"));
- memset(addr, 0, sizeof(struct sockaddr_in));
+ memset(ep, 0, sizeof(*ep));
addr->sin_addr.s_addr = htonl(INADDR_ANY);
addr->sin_family = AF_INET;
addr->sin_port = htons((u_short)SNMP_PORT);
@@ -82,8 +97,9 @@ netsnmp_sockaddr_in2(struct sockaddr_in *addr,
if (port != 0) {
ep_str.port = port;
} else if (default_target != NULL) {
- netsnmp_sockaddr_in2(addr, default_target, NULL);
- strlcpy(ep_str.addr, inet_ntoa(addr->sin_addr),
sizeof(ep_str.addr));
+ netsnmp_sockaddr_in3(ep, default_target, NULL);
+ strlcpy(ep_str.addr, inet_ntoa(addr->sin_addr),
+ sizeof(ep_str.addr));
ep_str.port = ntohs(addr->sin_port);
}
}
diff --git a/snmplib/transports/snmpIPv6BaseDomain.c
b/snmplib/transports/snmpIPv6BaseDomain.c
index 600bc602428b..8e2fb8c86dd3 100644
--- a/snmplib/transports/snmpIPv6BaseDomain.c
+++ b/snmplib/transports/snmpIPv6BaseDomain.c
@@ -248,18 +248,33 @@ int
netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr,
const char *inpeername, const char *default_target)
{
+ struct netsnmp_ep ai;
+ int ret;
+
+ ret = netsnmp_sockaddr_in6_3(&ai, inpeername, default_target);
+ if (ret == 0)
+ return 0;
+ *addr = ai.a.sin6;
+ return ret;
+}
+
+int
+netsnmp_sockaddr_in6_3(struct netsnmp_ep *ep,
+ const char *inpeername, const char *default_target)
+{
+ struct sockaddr_in6 *addr = &ep->a.sin6;
char debug_addr[INET6_ADDRSTRLEN];
- if (addr == NULL) {
+ if (ep == NULL) {
return 0;
}
- DEBUGMSGTL(("netsnmp_sockaddr_in6_2",
- "addr %p, peername \"%s\", default_target \"%s\"\n",
- addr, inpeername ? inpeername : "[NIL]",
+ DEBUGMSGTL(("netsnmp_sockaddr_in6",
+ "ep %p, peername \"%s\", default_target \"%s\"\n",
+ ep, inpeername ? inpeername : "[NIL]",
default_target ? default_target : "[NIL]"));
- memset(addr, 0, sizeof(struct sockaddr_in6));
+ memset(ep, 0, sizeof(*ep));
addr->sin6_family = AF_INET6;
addr->sin6_addr = in6addr_any;
addr->sin6_port = htons((u_short)SNMP_PORT);
@@ -270,7 +285,7 @@ netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr,
if (port != 0)
addr->sin6_port = htons((u_short)port);
else if (default_target != NULL)
- netsnmp_sockaddr_in6_2(addr, default_target, NULL);
+ netsnmp_sockaddr_in6_3(ep, default_target, NULL);
}
if (inpeername != NULL) {
@@ -297,13 +312,12 @@ netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr,
if (ep_str.port)
addr->sin6_port = htons(ep_str.port);
}
-
} else {
- DEBUGMSGTL(("netsnmp_sockaddr_in6_2", "NULL peername"));
+ DEBUGMSGTL(("netsnmp_sockaddr_in6", "NULL peername"));
return 0;
}
- DEBUGMSGTL(("netsnmp_sockaddr_in6_2", "return { AF_INET6, [%s]:%hu }\n",
+ DEBUGMSGTL(("netsnmp_sockaddr_in6", "return { AF_INET6, [%s]:%hu }\n",
inet_ntop(AF_INET6, &addr->sin6_addr, debug_addr,
sizeof(debug_addr)), ntohs(addr->sin6_port)));
return 1;
--
2.19.1
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders