]> git.proxmox.com Git - mirror_frr.git/commitdiff
2004-07-01 Greg Troxel <gdt@fnord.ir.bbn.com>
authorgdt <gdt>
Thu, 1 Jul 2004 19:26:33 +0000 (19:26 +0000)
committergdt <gdt>
Thu, 1 Jul 2004 19:26:33 +0000 (19:26 +0000)
        * ripng_interface.c (ripng_multicast_join): Use privs to do join,
        to work around bug on gif(4) on NetBSD 1.6.2.

ripngd/ChangeLog
ripngd/ripng_interface.c

index 8122ec55e31b2f67708fecbe23ec4073ad125701..059ee7571f4cf8f3d252c612357b77da546ebf5a 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-01  Greg Troxel  <gdt@fnord.ir.bbn.com>
+
+       * ripng_interface.c (ripng_multicast_join): Use privs to do join,
+       to work around bug on gif(4) on NetBSD 1.6.2.
+
 2004-05-11 Paul Jakma <paul@dishone.st>
 
        * ripng_nexthop.h: SUNOS_5 does not define s6_addr32
index 28977bea302c572c1dd4cbfc7bc97115cf794d93..d4d1e6426c6e4a110cd789a86311ef752b67da86 100644 (file)
@@ -34,6 +34,7 @@
 #include "command.h"
 #include "table.h"
 #include "thread.h"
+#include "privs.h"
 
 #include "ripngd/ripngd.h"
 #include "ripngd/ripng_debug.h"
@@ -46,6 +47,8 @@
 #define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP 
 #endif
 
+extern struct zebra_privs_t ripngd_privs;
+
 /* Static utility function. */
 static void ripng_enable_apply (struct interface *);
 static void ripng_passive_interface_apply (struct interface *);
@@ -65,9 +68,20 @@ ripng_multicast_join (struct interface *ifp)
     inet_pton(AF_INET6, RIPNG_GROUP, &mreq.ipv6mr_multiaddr);
     mreq.ipv6mr_interface = ifp->ifindex;
 
+    /*
+     * NetBSD 1.6.2 requires root to join groups on gif(4).
+     * While this is bogus, privs are available and easy to use
+     * for this call as a workaround.
+     */
+    if (ripngd_privs.change (ZPRIVS_RAISE))
+      zlog_err ("ripng_multicast_join: could not raise privs");
+
     ret = setsockopt (ripng->sock, IPPROTO_IPV6, IPV6_JOIN_GROUP,
                      (char *) &mreq, sizeof (mreq));
 
+    if (ripngd_privs.change (ZPRIVS_LOWER))
+      zlog_err ("ripng_multicast_join: could not lower privs");
+
     if (ret < 0 && errno == EADDRINUSE)
       {
        /*