| 224 | } |
| 225 | |
| 226 | bool guess_address(struct wireaddr *addr) |
| 227 | { |
| 228 | bool ret; |
| 229 | |
| 230 | /* We point to Google nameservers, works unless you're inside Google :) */ |
| 231 | switch (addr->type) { |
| 232 | case ADDR_TYPE_IPV4: { |
| 233 | struct sockaddr_in sin; |
| 234 | memset(&sin, 0, sizeof(sin)); |
| 235 | sin.sin_port = htons(53); |
| 236 | /* 8.8.8.8 */ |
| 237 | sin.sin_addr.s_addr = 0x08080808; |
| 238 | sin.sin_family = AF_INET; |
| 239 | ret = get_local_sockname(AF_INET, &sin, sizeof(sin)); |
| 240 | addr->addrlen = sizeof(sin.sin_addr); |
| 241 | memcpy(addr->addr, &sin.sin_addr, addr->addrlen); |
| 242 | return ret; |
| 243 | } |
| 244 | case ADDR_TYPE_IPV6: { |
| 245 | struct sockaddr_in6 sin6; |
| 246 | memset(&sin6, 0, sizeof(sin6)); |
| 247 | /* 2001:4860:4860::8888 */ |
| 248 | static const unsigned char pchGoogle[16] |
| 249 | = {0x20,0x01,0x48,0x60,0x48,0x60,0,0,0,0,0,0,8,8,8,8}; |
| 250 | memset(&sin6, 0, sizeof(sin6)); |
| 251 | sin6.sin6_port = htons(53); |
| 252 | sin6.sin6_family = AF_INET6; |
| 253 | memcpy(sin6.sin6_addr.s6_addr, pchGoogle, sizeof(pchGoogle)); |
| 254 | ret = get_local_sockname(AF_INET6, &sin6, sizeof(sin6)); |
| 255 | addr->addrlen = sizeof(sin6.sin6_addr); |
| 256 | memcpy(addr->addr, &sin6.sin6_addr, addr->addrlen); |
| 257 | return ret; |
| 258 | } |
| 259 | case ADDR_TYPE_TOR_V2_REMOVED: |
| 260 | case ADDR_TYPE_TOR_V3: |
| 261 | case ADDR_TYPE_DNS: |
| 262 | case ADDR_TYPE_WEBSOCKET: |
| 263 | status_broken("Cannot guess address type %u", addr->type); |
| 264 | break; |
| 265 | } |
| 266 | abort(); |
| 267 | } |
| 268 | |
| 269 | bool address_routable(const struct wireaddr *wireaddr, bool allow_localhost) |
| 270 | { |
no test coverage detected