[PATCH 2/6] libsnmp/transports: Introduce netsnmp_sockaddr_in3() and netsnmp_sockaddr_in6_3()

Bart Van Assche <[email protected]>
Newsgroups gmane.network.net-snmp.devel
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.