From f446ed6a5b535901610c522c2bcce7d7a5ca16bc Mon Sep 17 00:00:00 2001 From: Steven Dake Date: Mon, 26 Jul 2004 22:17:36 +0000 Subject: [PATCH] Remove BINDTODEVICE socket option and replace with MULTICAST_IF to be more portable and require less root privs. (Logical change 1.42) git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@121 fd59a12c-fef9-0310-b244-a6a79926bd2f --- exec/gmi.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/exec/gmi.c b/exec/gmi.c index 353f016f..690f04a4 100644 --- a/exec/gmi.c +++ b/exec/gmi.c @@ -400,7 +400,7 @@ static int message_handler_memb_join (struct sockaddr_in *, struct iovec *, int, static int message_handler_memb_form_token (struct sockaddr_in *, struct iovec *, int, int); static void memb_conf_id_build (struct memb_conf_id *, struct in_addr); static int recv_handler (poll_handle handle, int fd, int revents, void *data); -static int netif_determine (struct sockaddr_in *bindnet, struct sockaddr_in *bound_to, char *name); +static int netif_determine (struct sockaddr_in *bindnet, struct sockaddr_in *bound_to); static int gmi_build_sockets (struct sockaddr_in *sockaddr_mcast, struct sockaddr_in *sockaddr_bindnet, int *fd_mcast, @@ -726,8 +726,7 @@ printf ("CALCULATED TOTAL is %d\n", calced_total); } static int netif_determine (struct sockaddr_in *bindnet, - struct sockaddr_in *bound_to, - char *ifname) + struct sockaddr_in *bound_to) { struct sockaddr_in *sockaddr_in; int id_fd; @@ -766,8 +765,6 @@ static int netif_determine (struct sockaddr_in *bindnet, (bindnet->sin_addr.s_addr & mask_addr)) { bound_to->sin_addr.s_addr = sockaddr_in->sin_addr.s_addr; - - strcpy (ifname, ifc.ifc_ifcu.ifcu_req[i].ifr_ifrn.ifrn_name); res = i; break; /* for */ } @@ -787,18 +784,16 @@ static int gmi_build_sockets (struct sockaddr_in *sockaddr_mcast, struct ip_mreq mreq; struct sockaddr_in sockaddr_in; char flag; - struct ifreq interface; int res; memset (&mreq, 0, sizeof (struct ip_mreq)); - memset (&interface, 0, sizeof (struct ifreq)); /* * Determine the ip address bound to and the interface name */ res = netif_determine (sockaddr_bindnet, - bound_to, - interface.ifr_ifrn.ifrn_name); + bound_to); + if (res == -1) { return (-1); } @@ -817,11 +812,9 @@ static int gmi_build_sockets (struct sockaddr_in *sockaddr_mcast, return (-1); } - /* - * Bind the multicast socket to the correct device (eth0, eth1) - */ - if (setsockopt(*fd_mcast, SOL_SOCKET, SO_BINDTODEVICE, - (char *)&interface, sizeof(interface)) < 0) { + if (setsockopt (*fd_mcast, SOL_IP, IP_MULTICAST_IF, + &bound_to->sin_addr, sizeof (struct in_addr)) < 0) { + gmi_log_printf (gmi_log_level_warning, "Could not bind to device for multicast, group messaging may not work properly. (%s)\n", strerror (errno)); }