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.
diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c
index 28977be..d4d1e64 100644
--- a/ripngd/ripng_interface.c
+++ b/ripngd/ripng_interface.c
@@ -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 @@
     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)
       {
 	/*