| 967 | } |
| 968 | |
| 969 | int net_udp_send(NETSOCKET sock, const NETADDR *addr, const void *data, int size) |
| 970 | { |
| 971 | int d = -1; |
| 972 | |
| 973 | if(addr->type&NETTYPE_IPV4) |
| 974 | { |
| 975 | if(sock.ipv4sock >= 0) |
| 976 | { |
| 977 | struct sockaddr_in sa; |
| 978 | if(addr->type&NETTYPE_LINK_BROADCAST) |
| 979 | { |
| 980 | mem_zero(&sa, sizeof(sa)); |
| 981 | sa.sin_port = htons(addr->port); |
| 982 | sa.sin_family = AF_INET; |
| 983 | sa.sin_addr.s_addr = INADDR_BROADCAST; |
| 984 | } |
| 985 | else |
| 986 | netaddr_to_sockaddr_in(addr, &sa); |
| 987 | |
| 988 | d = sendto((int)sock.ipv4sock, (const char*)data, size, 0, (struct sockaddr *)&sa, sizeof(sa)); |
| 989 | } |
| 990 | else |
| 991 | dbg_msg("net", "can't sent ipv4 traffic to this socket"); |
| 992 | } |
| 993 | |
| 994 | if(addr->type&NETTYPE_IPV6) |
| 995 | { |
| 996 | if(sock.ipv6sock >= 0) |
| 997 | { |
| 998 | struct sockaddr_in6 sa; |
| 999 | if(addr->type&NETTYPE_LINK_BROADCAST) |
| 1000 | { |
| 1001 | mem_zero(&sa, sizeof(sa)); |
| 1002 | sa.sin6_port = htons(addr->port); |
| 1003 | sa.sin6_family = AF_INET6; |
| 1004 | sa.sin6_addr.s6_addr[0] = 0xff; /* multicast */ |
| 1005 | sa.sin6_addr.s6_addr[1] = 0x02; /* link local scope */ |
| 1006 | sa.sin6_addr.s6_addr[15] = 1; /* all nodes */ |
| 1007 | } |
| 1008 | else |
| 1009 | netaddr_to_sockaddr_in6(addr, &sa); |
| 1010 | |
| 1011 | d = sendto((int)sock.ipv6sock, (const char*)data, size, 0, (struct sockaddr *)&sa, sizeof(sa)); |
| 1012 | } |
| 1013 | else |
| 1014 | dbg_msg("net", "can't sent ipv6 traffic to this socket"); |
| 1015 | } |
| 1016 | /* |
| 1017 | else |
| 1018 | dbg_msg("net", "can't sent to network of type %d", addr->type); |
| 1019 | */ |
| 1020 | |
| 1021 | /*if(d < 0) |
| 1022 | { |
| 1023 | char addrstr[256]; |
| 1024 | net_addr_str(addr, addrstr, sizeof(addrstr)); |
| 1025 | |
| 1026 | dbg_msg("net", "sendto error (%d '%s')", errno, strerror(errno)); |
nothing calls this directly
no test coverage detected