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

Reply via email to