static gboolean _serialize_ipv6(GSockAddr* addr, SerializeArchive* sa) { struct in6_addr* in6a; in6a = g_sockaddr_inet6_get_address(addr); return serialize_write_blob(sa, (gchar*) in6a, sizeof(*in6a)) && serialize_write_uint16(sa, htons(g_sockaddr_get_port(addr))); }
static gboolean afinet_setup_socket(gint fd, GSockAddr *addr, InetSocketOptions *sock_options, AFSocketDirection dir) { gint off = 0; if (!afsocket_setup_socket(fd, &sock_options->super, dir)) return FALSE; switch (addr->sa.sa_family) { case AF_INET: { struct ip_mreq mreq; if (IN_MULTICAST(ntohl(g_sockaddr_inet_get_address(addr).s_addr))) { if (dir & AFSOCKET_DIR_RECV) { memset(&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr = g_sockaddr_inet_get_address(addr); mreq.imr_interface.s_addr = INADDR_ANY; /*CID 10352 (#1 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) return FALSE; /*CID 10352 (#2 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &off, sizeof(off))) return FALSE; } if (dir & AFSOCKET_DIR_SEND) { if (sock_options->ttl) /*CID 10352 (#3 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IP, IP_MULTICAST_TTL, &sock_options->ttl, sizeof(sock_options->ttl))) return FALSE; } } else { if (sock_options->ttl && (dir & AFSOCKET_DIR_SEND)) /*CID 10352 (#4 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IP, IP_TTL, &sock_options->ttl, sizeof(sock_options->ttl))) return FALSE; } if (sock_options->tos && (dir & AFSOCKET_DIR_SEND)) /*CID 10352 (#5 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IP, IP_TOS, &sock_options->tos, sizeof(sock_options->tos))) return FALSE; break; } #if ENABLE_IPV6 case AF_INET6: { struct ipv6_mreq mreq6; if (IN6_IS_ADDR_MULTICAST(&g_sockaddr_inet6_get_sa(addr)->sin6_addr)) { if (dir & AFSOCKET_DIR_RECV) { memset(&mreq6, 0, sizeof(mreq6)); mreq6.ipv6mr_multiaddr = *g_sockaddr_inet6_get_address(addr); mreq6.ipv6mr_interface = 0; /*CID 10352 (#6 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IPV6, IPV6_JOIN_GROUP, &mreq6, sizeof(mreq6))) return FALSE; /*CID 10352 (#7 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IPV6, IPV6_MULTICAST_LOOP, &off, sizeof(off))) return FALSE; } if (dir & AFSOCKET_DIR_SEND) { if (sock_options->ttl) /*CID 10352 (#8 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IPV6, IPV6_MULTICAST_HOPS, &sock_options->ttl, sizeof(sock_options->ttl))) return FALSE; } } else { if (sock_options->ttl && (dir & AFSOCKET_DIR_SEND)) /*CID 10352 (#9 of 9): Unchecked return value from library*/ if(setsockopt(fd, SOL_IPV6, IPV6_UNICAST_HOPS, &sock_options->ttl, sizeof(sock_options->ttl))) return FALSE; } break; } #endif } return TRUE; }
static gboolean socket_options_inet_setup_socket(SocketOptions *s, gint fd, GSockAddr *addr, AFSocketDirection dir) { SocketOptionsInet *self = (SocketOptionsInet *) s; gint off = 0; if (!socket_options_setup_socket_method(s, fd, addr, dir)) return FALSE; if (self->tcp_keepalive_time > 0) { #ifdef TCP_KEEPIDLE setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &self->tcp_keepalive_time, sizeof(self->tcp_keepalive_time)); #else msg_error("tcp-keepalive-time() is set but no TCP_KEEPIDLE setsockopt on this platform"); return FALSE; #endif } if (self->tcp_keepalive_probes > 0) { #ifdef TCP_KEEPCNT setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &self->tcp_keepalive_probes, sizeof(self->tcp_keepalive_probes)); #else msg_error("tcp-keepalive-probes() is set but no TCP_KEEPCNT setsockopt on this platform"); return FALSE; #endif } if (self->tcp_keepalive_intvl > 0) { #ifdef TCP_KEEPINTVL setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &self->tcp_keepalive_intvl, sizeof(self->tcp_keepalive_intvl)); #else msg_error("tcp-keepalive-intvl() is set but no TCP_KEEPINTVL setsockopt on this platform"); return FALSE; #endif } switch (addr->sa.sa_family) { case AF_INET: { struct ip_mreq mreq; if (IN_MULTICAST(ntohl(g_sockaddr_inet_get_address(addr).s_addr))) { if (dir & AFSOCKET_DIR_RECV) { memset(&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr = g_sockaddr_inet_get_address(addr); mreq.imr_interface.s_addr = INADDR_ANY; setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &off, sizeof(off)); } if (dir & AFSOCKET_DIR_SEND) { if (self->ip_ttl) setsockopt(fd, SOL_IP, IP_MULTICAST_TTL, &self->ip_ttl, sizeof(self->ip_ttl)); } } else { if (self->ip_ttl && (dir & AFSOCKET_DIR_SEND)) setsockopt(fd, SOL_IP, IP_TTL, &self->ip_ttl, sizeof(self->ip_ttl)); } if (self->ip_tos && (dir & AFSOCKET_DIR_SEND)) setsockopt(fd, SOL_IP, IP_TOS, &self->ip_tos, sizeof(self->ip_tos)); break; } #if SYSLOG_NG_ENABLE_IPV6 case AF_INET6: { struct ipv6_mreq mreq6; if (IN6_IS_ADDR_MULTICAST(&g_sockaddr_inet6_get_sa(addr)->sin6_addr)) { if (dir & AFSOCKET_DIR_RECV) { memset(&mreq6, 0, sizeof(mreq6)); mreq6.ipv6mr_multiaddr = *g_sockaddr_inet6_get_address(addr); mreq6.ipv6mr_interface = 0; setsockopt(fd, SOL_IPV6, IPV6_JOIN_GROUP, &mreq6, sizeof(mreq6)); setsockopt(fd, SOL_IPV6, IPV6_MULTICAST_LOOP, &off, sizeof(off)); } if (dir & AFSOCKET_DIR_SEND) { if (self->ip_ttl) setsockopt(fd, SOL_IPV6, IPV6_MULTICAST_HOPS, &self->ip_ttl, sizeof(self->ip_ttl)); } } else { if (self->ip_ttl && (dir & AFSOCKET_DIR_SEND)) setsockopt(fd, SOL_IPV6, IPV6_UNICAST_HOPS, &self->ip_ttl, sizeof(self->ip_ttl)); } break; } #endif } return TRUE; }