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
This commit is contained in:
Steven Dake 2004-07-26 22:17:36 +00:00
parent 093cccd334
commit f446ed6a5b

View File

@ -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));
}