| 80 | } |
| 81 | |
| 82 | static void sockaddr_to_netaddr_websocket(const sockaddr *src, socklen_t src_len, NETADDR *dst) |
| 83 | { |
| 84 | *dst = NETADDR_ZEROED; |
| 85 | if(src->sa_family == AF_INET && src_len >= (socklen_t)sizeof(sockaddr_in)) |
| 86 | { |
| 87 | const sockaddr_in *src_in = (const sockaddr_in *)src; |
| 88 | dst->type = NETTYPE_WEBSOCKET_IPV4; |
| 89 | dst->port = htons(src_in->sin_port); |
| 90 | static_assert(sizeof(dst->ip) >= sizeof(src_in->sin_addr.s_addr)); |
| 91 | mem_copy(dst->ip, &src_in->sin_addr.s_addr, sizeof(src_in->sin_addr.s_addr)); |
| 92 | } |
| 93 | else if(src->sa_family == AF_INET6 && src_len >= (socklen_t)sizeof(sockaddr_in6)) |
| 94 | { |
| 95 | const sockaddr_in6 *src_in6 = (const sockaddr_in6 *)src; |
| 96 | dst->type = NETTYPE_WEBSOCKET_IPV6; |
| 97 | dst->port = htons(src_in6->sin6_port); |
| 98 | static_assert(sizeof(dst->ip) >= sizeof(src_in6->sin6_addr.s6_addr)); |
| 99 | mem_copy(dst->ip, &src_in6->sin6_addr.s6_addr, sizeof(src_in6->sin6_addr.s6_addr)); |
| 100 | } |
| 101 | else |
| 102 | { |
| 103 | log_warn("websockets", "Cannot convert sockaddr of family %d", src->sa_family); |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | static int websocket_protocol_callback(lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) |
| 108 | { |
no test coverage detected