lib: futher simplification of setsockopt_ipv4_multicast()

* sockopt.c (setsockopt_ipv4_multicast): check for wrong optname with
  assert(), rather than return an error.
This commit is contained in:
Dmitrij Tejblum 2011-08-19 23:00:30 +04:00 committed by Denis Ovsienko
parent e0afa6f44a
commit ee7e75d38b

View File

@ -214,42 +214,31 @@ setsockopt_ipv4_multicast(int sock,
struct ip_mreqn mreqn; struct ip_mreqn mreqn;
int ret; int ret;
switch (optname) assert(optname == IP_ADD_MEMBERSHIP || optname == IP_DROP_MEMBERSHIP);
memset (&mreqn, 0, sizeof(mreqn));
if (mcast_addr)
mreqn.imr_multiaddr.s_addr = mcast_addr;
mreqn.imr_ifindex = ifindex;
ret = setsockopt(sock, IPPROTO_IP, optname,
(void *)&mreqn, sizeof(mreqn));
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
{ {
case IP_ADD_MEMBERSHIP: /* see above: handle possible problem when interface comes back up */
case IP_DROP_MEMBERSHIP: char buf[1][INET_ADDRSTRLEN];
memset (&mreqn, 0, sizeof(mreqn)); zlog_info("setsockopt_ipv4_multicast attempting to drop and "
"re-add (fd %d, mcast %s, ifindex %u)",
if (mcast_addr) sock,
mreqn.imr_multiaddr.s_addr = mcast_addr; inet_ntop(AF_INET, &mreqn.imr_multiaddr,
buf[0], sizeof(buf[0])), ifindex);
mreqn.imr_ifindex = ifindex; setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
(void *)&mreqn, sizeof(mreqn));
ret = setsockopt(sock, IPPROTO_IP, optname, ret = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(void *)&mreqn, sizeof(mreqn)); (void *)&mreqn, sizeof(mreqn));
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
{
/* see above: handle possible problem when interface comes back up */
char buf[1][INET_ADDRSTRLEN];
zlog_info("setsockopt_ipv4_multicast attempting to drop and "
"re-add (fd %d, mcast %s, ifindex %u)",
sock,
inet_ntop(AF_INET, &mreqn.imr_multiaddr,
buf[0], sizeof(buf[0])), ifindex);
setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
(void *)&mreqn, sizeof(mreqn));
ret = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(void *)&mreqn, sizeof(mreqn));
}
return ret;
break;
default:
/* Can out and give an understandable error */
errno = EINVAL;
return -1;
break;
} }
return ret;
/* Example defines for another OS, boilerplate off other code in this /* Example defines for another OS, boilerplate off other code in this
function, AND handle optname as per other sections for consistency !! */ function, AND handle optname as per other sections for consistency !! */
@ -263,40 +252,31 @@ setsockopt_ipv4_multicast(int sock,
struct ip_mreq mreq; struct ip_mreq mreq;
int ret; int ret;
assert(optname == IP_ADD_MEMBERSHIP || optname == IP_DROP_MEMBERSHIP);
m.s_addr = htonl(ifindex); m.s_addr = htonl(ifindex);
switch (optname) memset (&mreq, 0, sizeof(mreq));
mreq.imr_multiaddr.s_addr = mcast_addr;
mreq.imr_interface = m;
ret = setsockopt (sock, IPPROTO_IP, optname, (void *)&mreq, sizeof(mreq));
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
{ {
case IP_ADD_MEMBERSHIP: /* see above: handle possible problem when interface comes back up */
case IP_DROP_MEMBERSHIP: char buf[1][INET_ADDRSTRLEN];
memset (&mreq, 0, sizeof(mreq)); zlog_info("setsockopt_ipv4_multicast attempting to drop and "
mreq.imr_multiaddr.s_addr = mcast_addr; "re-add (fd %d, mcast %s, ifindex %u)",
mreq.imr_interface = m; sock,
inet_ntop(AF_INET, &mreq.imr_multiaddr,
ret = setsockopt (sock, IPPROTO_IP, optname, (void *)&mreq, sizeof(mreq)); buf[0], sizeof(buf[0])), ifindex);
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE)) setsockopt (sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
{ (void *)&mreq, sizeof(mreq));
/* see above: handle possible problem when interface comes back up */ ret = setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
char buf[1][INET_ADDRSTRLEN]; (void *)&mreq, sizeof(mreq));
zlog_info("setsockopt_ipv4_multicast attempting to drop and "
"re-add (fd %d, mcast %s, ifindex %u)",
sock,
inet_ntop(AF_INET, &mreq.imr_multiaddr,
buf[0], sizeof(buf[0])), ifindex);
setsockopt (sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
(void *)&mreq, sizeof(mreq));
ret = setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(void *)&mreq, sizeof(mreq));
}
return ret;
break;
default:
/* Can out and give an understandable error */
errno = EINVAL;
return -1;
break;
} }
return ret;
#else #else
#error "Unsupported multicast API" #error "Unsupported multicast API"
#endif /* #if OS_TYPE */ #endif /* #if OS_TYPE */