---
 .../mibgroup/if-mib/data_access/interface_linux.c  |   55 +++++++++++---------
 1 file changed, 31 insertions(+), 24 deletions(-)

diff --git a/agent/mibgroup/if-mib/data_access/interface_linux.c 
b/agent/mibgroup/if-mib/data_access/interface_linux.c
index e291b9f..d4ac61b 100644
--- a/agent/mibgroup/if-mib/data_access/interface_linux.c
+++ b/agent/mibgroup/if-mib/data_access/interface_linux.c
@@ -69,14 +69,12 @@ typedef __u8 u8;           /* ditto */
 #define SIOCGMIIREG 0x8948
 #endif
 
-#ifdef NETSNMP_ENABLE_IPV6
 #if defined(HAVE_LINUX_RTNETLINK_H)
 #include <linux/rtnetlink.h>
-#ifdef RTMGRP_IPV6_PREFIX
+#if defined(NETSNMP_ENABLE_IPV6) && defined(RTMGRP_IPV6_PREFIX)
 #define SUPPORT_PREFIX_FLAGS 1
-#endif  /* RTMGRP_IPV6_PREFIX */
+#endif
 #endif  /* HAVE_LINUX_RTNETLINK_H */
-#endif  /* NETSNMP_ENABLE_IPV6 */
 unsigned long long
 netsnmp_linux_interface_get_if_speed(int fd, const char *name,
         unsigned long long defaultspeed);
@@ -1023,42 +1021,51 @@ netsnmp_linux_interface_get_if_speed(int fd, const char 
*name,
     }
     return retspeed;
 }
-#ifdef SUPPORT_PREFIX_FLAGS
-void netsnmp_prefix_process(int fd, void *data);
 
-/* Open netlink socket to watch new ipv6 addresses and prefixes. */
-int netsnmp_prefix_listen()
+#ifdef HAVE_LINUX_RTNETLINK_H
+static int netsnmp_netlink_listen(unsigned subscriptions)
 {
-    struct {
-                struct nlmsghdr n;
-                struct ifinfomsg r;
-                char   buf[1024];
-    } req;
-
-    struct rtattr      *rta;
-    int                status;
     struct sockaddr_nl localaddrinfo;
-    unsigned           groups = 0;
-
     int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
     if (fd < 0) {
-        snmp_log(LOG_ERR, "netsnmp_prefix_listen: Cannot create socket.\n");
-        return -1;
+       snmp_log(LOG_ERR, "netsnmp_netlink_listen: Cannot create socket.\n");
+       return -1;
     }
 
     memset(&localaddrinfo, 0, sizeof(struct sockaddr_nl));
 
-    groups |= RTMGRP_IPV6_IFADDR;
-    groups |= RTMGRP_IPV6_PREFIX;
     localaddrinfo.nl_family = AF_NETLINK;
-    localaddrinfo.nl_groups = groups;
+    localaddrinfo.nl_groups = subscriptions;
 
     if (bind(fd, (struct sockaddr*)&localaddrinfo, sizeof(localaddrinfo)) < 0) 
{
-        snmp_log(LOG_ERR,"netsnmp_prefix_listen: Bind failed.\n");
+        snmp_log(LOG_ERR,"netsnmp_netlink_listen: Bind failed.\n");
         close(fd);
         return -1;
     }
 
+    return fd;
+}
+#endif
+    
+#ifdef SUPPORT_PREFIX_FLAGS
+void netsnmp_prefix_process(int fd, void *data);
+
+/* Open netlink socket to watch new ipv6 addresses and prefixes. */
+int netsnmp_prefix_listen()
+{
+    struct {
+                struct nlmsghdr n;
+                struct ifinfomsg r;
+                char   buf[1024];
+    } req;
+
+    struct rtattr      *rta;
+    int                status;
+
+    int fd = netsnmp_netlink_listen(RTMGRP_IPV6_IFADDR |
+                                   RTMGRP_IPV6_PREFIX);
+    if (fd < 0) return -1;
+
     memset(&req, 0, sizeof(req));
     req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
     req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
-- 
1.7.10.4


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Net-snmp-coders mailing list
Net-snmp-coders@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to