diff options
Diffstat (limited to 'pimd/pim_sock.c')
| -rw-r--r-- | pimd/pim_sock.c | 653 |
1 files changed, 335 insertions, 318 deletions
diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c index ba70cf2e11..a4d3d7e4b3 100644 --- a/pimd/pim_sock.c +++ b/pimd/pim_sock.c @@ -42,292 +42,305 @@ /* GLOBAL VARS */ -int -pim_socket_raw (int protocol) +int pim_socket_raw(int protocol) { - int fd; + int fd; - if ( pimd_privs.change (ZPRIVS_RAISE) ) - zlog_err ("pim_sockek_raw: could not raise privs, %s", - safe_strerror (errno) ); + if (pimd_privs.change(ZPRIVS_RAISE)) + zlog_err("pim_sockek_raw: could not raise privs, %s", + safe_strerror(errno)); - fd = socket(AF_INET, SOCK_RAW, protocol); + fd = socket(AF_INET, SOCK_RAW, protocol); - if ( pimd_privs.change (ZPRIVS_LOWER) ) - zlog_err ("pim_socket_raw: could not lower privs, %s", - safe_strerror (errno) ); + if (pimd_privs.change(ZPRIVS_LOWER)) + zlog_err("pim_socket_raw: could not lower privs, %s", + safe_strerror(errno)); - if (fd < 0) { - zlog_warn("Could not create raw socket: errno=%d: %s", - errno, safe_strerror(errno)); - return PIM_SOCK_ERR_SOCKET; - } - - return fd; + if (fd < 0) { + zlog_warn("Could not create raw socket: errno=%d: %s", errno, + safe_strerror(errno)); + return PIM_SOCK_ERR_SOCKET; + } + + return fd; } -int -pim_socket_ip_hdr (int fd) +int pim_socket_ip_hdr(int fd) { - const int on = 1; - int ret; + const int on = 1; + int ret; - if (pimd_privs.change (ZPRIVS_RAISE)) - zlog_err ("%s: could not raise privs, %s", - __PRETTY_FUNCTION__, safe_strerror (errno)); + if (pimd_privs.change(ZPRIVS_RAISE)) + zlog_err("%s: could not raise privs, %s", __PRETTY_FUNCTION__, + safe_strerror(errno)); - ret = setsockopt (fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof (on)); + ret = setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); - if (pimd_privs.change (ZPRIVS_LOWER)) - zlog_err ("%s: could not lower privs, %s", - __PRETTY_FUNCTION__, safe_strerror (errno)); + if (pimd_privs.change(ZPRIVS_LOWER)) + zlog_err("%s: could not lower privs, %s", __PRETTY_FUNCTION__, + safe_strerror(errno)); - return ret; + return ret; } /* * Given a socket and a interface, * Bind that socket to that interface */ -int -pim_socket_bind (int fd, struct interface *ifp) +int pim_socket_bind(int fd, struct interface *ifp) { - int ret = 0; + int ret = 0; #ifdef SO_BINDTODEVICE - if (pimd_privs.change (ZPRIVS_RAISE)) - zlog_err ("%s: could not raise privs, %s", - __PRETTY_FUNCTION__, safe_strerror (errno)); + if (pimd_privs.change(ZPRIVS_RAISE)) + zlog_err("%s: could not raise privs, %s", __PRETTY_FUNCTION__, + safe_strerror(errno)); - ret = setsockopt (fd, SOL_SOCKET, - SO_BINDTODEVICE, ifp->name, strlen (ifp->name)); + ret = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifp->name, + strlen(ifp->name)); - if (pimd_privs.change (ZPRIVS_LOWER)) - zlog_err ("%s: could not lower privs, %s", - __PRETTY_FUNCTION__, safe_strerror (errno)); + if (pimd_privs.change(ZPRIVS_LOWER)) + zlog_err("%s: could not lower privs, %s", __PRETTY_FUNCTION__, + safe_strerror(errno)); #endif - return ret; + return ret; } -int pim_socket_mcast(int protocol, struct in_addr ifaddr, struct interface *ifp, u_char loop) +int pim_socket_mcast(int protocol, struct in_addr ifaddr, struct interface *ifp, + u_char loop) { - int rcvbuf = 1024 * 1024 * 8; + int rcvbuf = 1024 * 1024 * 8; #ifdef HAVE_STRUCT_IP_MREQN_IMR_IFINDEX - struct ip_mreqn mreq; + struct ip_mreqn mreq; #else - struct ip_mreq mreq; + struct ip_mreq mreq; #endif - int fd; + int fd; - fd = pim_socket_raw(protocol); - if (fd < 0) { - zlog_warn("Could not create multicast socket: errno=%d: %s", - errno, safe_strerror(errno)); - return PIM_SOCK_ERR_SOCKET; - } + fd = pim_socket_raw(protocol); + if (fd < 0) { + zlog_warn("Could not create multicast socket: errno=%d: %s", + errno, safe_strerror(errno)); + return PIM_SOCK_ERR_SOCKET; + } #ifdef SO_BINDTODEVICE - if (protocol == IPPROTO_PIM) - { - int ret; - - ret = pim_socket_bind (fd, ifp); - if (ret) - { - close (fd); - zlog_warn("Could not set fd: %d for interface: %s to device", - fd, ifp->name); - return PIM_SOCK_ERR_BIND; + if (protocol == IPPROTO_PIM) { + int ret; + + ret = pim_socket_bind(fd, ifp); + if (ret) { + close(fd); + zlog_warn( + "Could not set fd: %d for interface: %s to device", + fd, ifp->name); + return PIM_SOCK_ERR_BIND; + } } - } #else - /* XXX: use IP_PKTINFO / IP_RECVIF to emulate behaviour? Or change to - * only use 1 socket for all interfaces? */ +/* XXX: use IP_PKTINFO / IP_RECVIF to emulate behaviour? Or change to + * only use 1 socket for all interfaces? */ #endif - /* Needed to obtain destination address from recvmsg() */ - { + /* Needed to obtain destination address from recvmsg() */ + { #if defined(HAVE_IP_PKTINFO) - /* Linux and Solaris IP_PKTINFO */ - int opt = 1; - if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt))) { - zlog_warn("Could not set IP_PKTINFO on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - } + /* Linux and Solaris IP_PKTINFO */ + int opt = 1; + if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt))) { + zlog_warn( + "Could not set IP_PKTINFO on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + } #elif defined(HAVE_IP_RECVDSTADDR) - /* BSD IP_RECVDSTADDR */ - int opt = 1; - if (setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &opt, sizeof(opt))) { - zlog_warn("Could not set IP_RECVDSTADDR on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - } + /* BSD IP_RECVDSTADDR */ + int opt = 1; + if (setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &opt, + sizeof(opt))) { + zlog_warn( + "Could not set IP_RECVDSTADDR on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + } #else - zlog_err("%s %s: Missing IP_PKTINFO and IP_RECVDSTADDR: unable to get dst addr from recvmsg()", - __FILE__, __PRETTY_FUNCTION__); - close(fd); - return PIM_SOCK_ERR_DSTADDR; + zlog_err( + "%s %s: Missing IP_PKTINFO and IP_RECVDSTADDR: unable to get dst addr from recvmsg()", + __FILE__, __PRETTY_FUNCTION__); + close(fd); + return PIM_SOCK_ERR_DSTADDR; #endif - } - - - /* Set router alert (RFC 2113) for all IGMP messages (RFC 3376 4. Message Formats)*/ - if (protocol == IPPROTO_IGMP) { - uint8_t ra[4]; - ra[0] = 148; - ra[1] = 4; - ra[2] = 0; - ra[3] = 0; - if (setsockopt(fd, IPPROTO_IP, IP_OPTIONS, ra, 4)) { - zlog_warn("Could not set Router Alert Option on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - close(fd); - return PIM_SOCK_ERR_RA; - } - } - - { - int reuse = 1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, - (void *) &reuse, sizeof(reuse))) { - zlog_warn("Could not set Reuse Address Option on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - close(fd); - return PIM_SOCK_ERR_REUSE; - } - } - - { - const int MTTL = 1; - int ttl = MTTL; - if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, - (void *) &ttl, sizeof(ttl))) { - zlog_warn("Could not set multicast TTL=%d on socket fd=%d: errno=%d: %s", - MTTL, fd, errno, safe_strerror(errno)); - close(fd); - return PIM_SOCK_ERR_TTL; - } - } - - if (setsockopt_ipv4_multicast_loop (fd, loop)) { - zlog_warn("Could not %s Multicast Loopback Option on socket fd=%d: errno=%d: %s", - loop ? "enable" : "disable", - fd, errno, safe_strerror(errno)); - close(fd); - return PIM_SOCK_ERR_LOOP; - } - - memset (&mreq, 0, sizeof (mreq)); + } + + + /* Set router alert (RFC 2113) for all IGMP messages (RFC 3376 4. + * Message Formats)*/ + if (protocol == IPPROTO_IGMP) { + uint8_t ra[4]; + ra[0] = 148; + ra[1] = 4; + ra[2] = 0; + ra[3] = 0; + if (setsockopt(fd, IPPROTO_IP, IP_OPTIONS, ra, 4)) { + zlog_warn( + "Could not set Router Alert Option on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + close(fd); + return PIM_SOCK_ERR_RA; + } + } + + { + int reuse = 1; + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, + sizeof(reuse))) { + zlog_warn( + "Could not set Reuse Address Option on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + close(fd); + return PIM_SOCK_ERR_REUSE; + } + } + + { + const int MTTL = 1; + int ttl = MTTL; + if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&ttl, + sizeof(ttl))) { + zlog_warn( + "Could not set multicast TTL=%d on socket fd=%d: errno=%d: %s", + MTTL, fd, errno, safe_strerror(errno)); + close(fd); + return PIM_SOCK_ERR_TTL; + } + } + + if (setsockopt_ipv4_multicast_loop(fd, loop)) { + zlog_warn( + "Could not %s Multicast Loopback Option on socket fd=%d: errno=%d: %s", + loop ? "enable" : "disable", fd, errno, + safe_strerror(errno)); + close(fd); + return PIM_SOCK_ERR_LOOP; + } + + memset(&mreq, 0, sizeof(mreq)); #ifdef HAVE_STRUCT_IP_MREQN_IMR_IFINDEX - mreq.imr_ifindex = ifp->ifindex; + mreq.imr_ifindex = ifp->ifindex; #else - /* - * I am not sure what to do here yet for *BSD - */ - //mreq.imr_interface = ifindex; +/* + * I am not sure what to do here yet for *BSD + */ +// mreq.imr_interface = ifindex; #endif - if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, - (void *) &mreq, sizeof(mreq))) { - zlog_warn("Could not set Outgoing Interface Option on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - close(fd); - return PIM_SOCK_ERR_IFACE; - } - - if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf))) - zlog_warn("%s: Failure to set buffer size to %d", - __PRETTY_FUNCTION__, rcvbuf); - - { - long flags; - - flags = fcntl(fd, F_GETFL, 0); - if (flags < 0) { - zlog_warn("Could not get fcntl(F_GETFL,O_NONBLOCK) on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - close(fd); - return PIM_SOCK_ERR_NONBLOCK_GETFL; - } - - if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) { - zlog_warn("Could not set fcntl(F_SETFL,O_NONBLOCK) on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - close(fd); - return PIM_SOCK_ERR_NONBLOCK_SETFL; - } - } - - return fd; + if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (void *)&mreq, + sizeof(mreq))) { + zlog_warn( + "Could not set Outgoing Interface Option on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + close(fd); + return PIM_SOCK_ERR_IFACE; + } + + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf))) + zlog_warn("%s: Failure to set buffer size to %d", + __PRETTY_FUNCTION__, rcvbuf); + + { + long flags; + + flags = fcntl(fd, F_GETFL, 0); + if (flags < 0) { + zlog_warn( + "Could not get fcntl(F_GETFL,O_NONBLOCK) on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + close(fd); + return PIM_SOCK_ERR_NONBLOCK_GETFL; + } + + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) { + zlog_warn( + "Could not set fcntl(F_SETFL,O_NONBLOCK) on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + close(fd); + return PIM_SOCK_ERR_NONBLOCK_SETFL; + } + } + + return fd; } -int pim_socket_join(int fd, struct in_addr group, - struct in_addr ifaddr, ifindex_t ifindex) +int pim_socket_join(int fd, struct in_addr group, struct in_addr ifaddr, + ifindex_t ifindex) { - int ret; + int ret; #ifdef HAVE_STRUCT_IP_MREQN_IMR_IFINDEX - struct ip_mreqn opt; + struct ip_mreqn opt; #else - struct ip_mreq opt; + struct ip_mreq opt; #endif - opt.imr_multiaddr = group; + opt.imr_multiaddr = group; #ifdef HAVE_STRUCT_IP_MREQN_IMR_IFINDEX - opt.imr_address = ifaddr; - opt.imr_ifindex = ifindex; + opt.imr_address = ifaddr; + opt.imr_ifindex = ifindex; #else - opt.imr_interface = ifaddr; + opt.imr_interface = ifaddr; #endif - ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &opt, sizeof(opt)); - if (ret) { - char group_str[INET_ADDRSTRLEN]; - char ifaddr_str[INET_ADDRSTRLEN]; - if (!inet_ntop(AF_INET, &group, group_str , sizeof(group_str))) - sprintf(group_str, "<group?>"); - if (!inet_ntop(AF_INET, &ifaddr, ifaddr_str , sizeof(ifaddr_str))) - sprintf(ifaddr_str, "<ifaddr?>"); - - zlog_err("Failure socket joining fd=%d group %s on interface address %s: errno=%d: %s", - fd, group_str, ifaddr_str, errno, safe_strerror(errno)); - return ret; - } - - if (PIM_DEBUG_TRACE) { - char group_str[INET_ADDRSTRLEN]; - char ifaddr_str[INET_ADDRSTRLEN]; - if (!inet_ntop(AF_INET, &group, group_str , sizeof(group_str))) - sprintf(group_str, "<group?>"); - if (!inet_ntop(AF_INET, &ifaddr, ifaddr_str , sizeof(ifaddr_str))) - sprintf(ifaddr_str, "<ifaddr?>"); - - zlog_debug("Socket fd=%d joined group %s on interface address %s", - fd, group_str, ifaddr_str); - } - - return ret; + ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &opt, sizeof(opt)); + if (ret) { + char group_str[INET_ADDRSTRLEN]; + char ifaddr_str[INET_ADDRSTRLEN]; + if (!inet_ntop(AF_INET, &group, group_str, sizeof(group_str))) + sprintf(group_str, "<group?>"); + if (!inet_ntop(AF_INET, &ifaddr, ifaddr_str, + sizeof(ifaddr_str))) + sprintf(ifaddr_str, "<ifaddr?>"); + + zlog_err( + "Failure socket joining fd=%d group %s on interface address %s: errno=%d: %s", + fd, group_str, ifaddr_str, errno, safe_strerror(errno)); + return ret; + } + + if (PIM_DEBUG_TRACE) { + char group_str[INET_ADDRSTRLEN]; + char ifaddr_str[INET_ADDRSTRLEN]; + if (!inet_ntop(AF_INET, &group, group_str, sizeof(group_str))) + sprintf(group_str, "<group?>"); + if (!inet_ntop(AF_INET, &ifaddr, ifaddr_str, + sizeof(ifaddr_str))) + sprintf(ifaddr_str, "<ifaddr?>"); + + zlog_debug( + "Socket fd=%d joined group %s on interface address %s", + fd, group_str, ifaddr_str); + } + + return ret; } -int pim_socket_join_source(int fd, ifindex_t ifindex, - struct in_addr group_addr, - struct in_addr source_addr, - const char *ifname) +int pim_socket_join_source(int fd, ifindex_t ifindex, struct in_addr group_addr, + struct in_addr source_addr, const char *ifname) { - if (pim_igmp_join_source(fd, ifindex, group_addr, source_addr)) { - char group_str[INET_ADDRSTRLEN]; - char source_str[INET_ADDRSTRLEN]; - pim_inet4_dump("<grp?>", group_addr, group_str, sizeof(group_str)); - pim_inet4_dump("<src?>", source_addr, source_str, sizeof(source_str)); - zlog_warn("%s: setsockopt(fd=%d) failure for IGMP group %s source %s ifindex %d on interface %s: errno=%d: %s", - __PRETTY_FUNCTION__, - fd, group_str, source_str, ifindex, ifname, - errno, safe_strerror(errno)); - return -1; - } - - return 0; + if (pim_igmp_join_source(fd, ifindex, group_addr, source_addr)) { + char group_str[INET_ADDRSTRLEN]; + char source_str[INET_ADDRSTRLEN]; + pim_inet4_dump("<grp?>", group_addr, group_str, + sizeof(group_str)); + pim_inet4_dump("<src?>", source_addr, source_str, + sizeof(source_str)); + zlog_warn( + "%s: setsockopt(fd=%d) failure for IGMP group %s source %s ifindex %d on interface %s: errno=%d: %s", + __PRETTY_FUNCTION__, fd, group_str, source_str, ifindex, + ifname, errno, safe_strerror(errno)); + return -1; + } + + return 0; } int pim_socket_recvfromto(int fd, uint8_t *buf, size_t len, @@ -335,117 +348,121 @@ int pim_socket_recvfromto(int fd, uint8_t *buf, size_t len, struct sockaddr_in *to, socklen_t *tolen, ifindex_t *ifindex) { - struct msghdr msgh; - struct cmsghdr *cmsg; - struct iovec iov; - char cbuf[1000]; - int err; - - /* - * IP_PKTINFO / IP_RECVDSTADDR don't yield sin_port. - * Use getsockname() to get sin_port. - */ - if (to) { - struct sockaddr_in si; - socklen_t si_len = sizeof(si); - - memset (&si, 0, sizeof (si)); - to->sin_family = AF_INET; - - pim_socket_getsockname(fd, (struct sockaddr *) &si, &si_len); - - to->sin_port = si.sin_port; - to->sin_addr = si.sin_addr; - - if (tolen) - *tolen = sizeof(si); - } - - memset(&msgh, 0, sizeof(struct msghdr)); - iov.iov_base = buf; - iov.iov_len = len; - msgh.msg_control = cbuf; - msgh.msg_controllen = sizeof(cbuf); - msgh.msg_name = from; - msgh.msg_namelen = fromlen ? *fromlen : 0; - msgh.msg_iov = &iov; - msgh.msg_iovlen = 1; - msgh.msg_flags = 0; - - err = recvmsg(fd, &msgh, 0); - if (err < 0) - return err; - - if (fromlen) - *fromlen = msgh.msg_namelen; - - for (cmsg = CMSG_FIRSTHDR(&msgh); - cmsg != NULL; - cmsg = CMSG_NXTHDR(&msgh,cmsg)) { + struct msghdr msgh; + struct cmsghdr *cmsg; + struct iovec iov; + char cbuf[1000]; + int err; + + /* + * IP_PKTINFO / IP_RECVDSTADDR don't yield sin_port. + * Use getsockname() to get sin_port. + */ + if (to) { + struct sockaddr_in si; + socklen_t si_len = sizeof(si); + + memset(&si, 0, sizeof(si)); + to->sin_family = AF_INET; + + pim_socket_getsockname(fd, (struct sockaddr *)&si, &si_len); + + to->sin_port = si.sin_port; + to->sin_addr = si.sin_addr; + + if (tolen) + *tolen = sizeof(si); + } + + memset(&msgh, 0, sizeof(struct msghdr)); + iov.iov_base = buf; + iov.iov_len = len; + msgh.msg_control = cbuf; + msgh.msg_controllen = sizeof(cbuf); + msgh.msg_name = from; + msgh.msg_namelen = fromlen ? *fromlen : 0; + msgh.msg_iov = &iov; + msgh.msg_iovlen = 1; + msgh.msg_flags = 0; + + err = recvmsg(fd, &msgh, 0); + if (err < 0) + return err; + + if (fromlen) + *fromlen = msgh.msg_namelen; + + for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msgh, cmsg)) { #ifdef HAVE_IP_PKTINFO - if ((cmsg->cmsg_level == IPPROTO_IP) && (cmsg->cmsg_type == IP_PKTINFO)) { - struct in_pktinfo *i = (struct in_pktinfo *) CMSG_DATA(cmsg); - if (to) - ((struct sockaddr_in *) to)->sin_addr = i->ipi_addr; - if (tolen) - *tolen = sizeof(struct sockaddr_in); - if (ifindex) - *ifindex = i->ipi_ifindex; - - break; - } + if ((cmsg->cmsg_level == IPPROTO_IP) + && (cmsg->cmsg_type == IP_PKTINFO)) { + struct in_pktinfo *i = + (struct in_pktinfo *)CMSG_DATA(cmsg); + if (to) + ((struct sockaddr_in *)to)->sin_addr = + i->ipi_addr; + if (tolen) + *tolen = sizeof(struct sockaddr_in); + if (ifindex) + *ifindex = i->ipi_ifindex; + + break; + } #endif #ifdef HAVE_IP_RECVDSTADDR - if ((cmsg->cmsg_level == IPPROTO_IP) && (cmsg->cmsg_type == IP_RECVDSTADDR)) { - struct in_addr *i = (struct in_addr *) CMSG_DATA(cmsg); - if (to) - ((struct sockaddr_in *) to)->sin_addr = *i; - if (tolen) - *tolen = sizeof(struct sockaddr_in); - - break; - } + if ((cmsg->cmsg_level == IPPROTO_IP) + && (cmsg->cmsg_type == IP_RECVDSTADDR)) { + struct in_addr *i = (struct in_addr *)CMSG_DATA(cmsg); + if (to) + ((struct sockaddr_in *)to)->sin_addr = *i; + if (tolen) + *tolen = sizeof(struct sockaddr_in); + + break; + } #endif #if defined(HAVE_IP_RECVIF) && defined(CMSG_IFINDEX) - if (cmsg->cmsg_type == IP_RECVIF) - if (ifindex) - *ifindex = CMSG_IFINDEX(cmsg); + if (cmsg->cmsg_type == IP_RECVIF) + if (ifindex) + *ifindex = CMSG_IFINDEX(cmsg); #endif - } /* for (cmsg) */ + } /* for (cmsg) */ - return err; /* len */ + return err; /* len */ } int pim_socket_mcastloop_get(int fd) { - int loop; - socklen_t loop_len = sizeof(loop); - - if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, - &loop, &loop_len)) { - int e = errno; - zlog_warn("Could not get Multicast Loopback Option on socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - errno = e; - return PIM_SOCK_ERR_LOOP; - } - - return loop; + int loop; + socklen_t loop_len = sizeof(loop); + + if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, &loop_len)) { + int e = errno; + zlog_warn( + "Could not get Multicast Loopback Option on socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + errno = e; + return PIM_SOCK_ERR_LOOP; + } + + return loop; } int pim_socket_getsockname(int fd, struct sockaddr *name, socklen_t *namelen) { - if (getsockname(fd, name, namelen)) { - int e = errno; - zlog_warn("Could not get Socket Name for socket fd=%d: errno=%d: %s", - fd, errno, safe_strerror(errno)); - errno = e; - return PIM_SOCK_ERR_NAME; - } - - return PIM_SOCK_ERR_NONE; + if (getsockname(fd, name, namelen)) { + int e = errno; + zlog_warn( + "Could not get Socket Name for socket fd=%d: errno=%d: %s", + fd, errno, safe_strerror(errno)); + errno = e; + return PIM_SOCK_ERR_NAME; + } + + return PIM_SOCK_ERR_NONE; } |
