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 Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/net-snmp-coders