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)
{
/*