mingw does not have inet_pton, which were taken as is from the musl C library.
| 375 | // mingw does not have inet_pton, which were taken as is from the musl C library. |
| 376 | // |
| 377 | int inet_pton(int af, const char* s, void* a0) |
| 378 | { |
| 379 | #if defined(_WIN32) && defined(__GNUC__) |
| 380 | uint16_t ip[8]; |
| 381 | unsigned char* a = (unsigned char*) a0; |
| 382 | int i, j, v, d, brk = -1, need_v4 = 0; |
| 383 | |
| 384 | if (af == AF_INET) |
| 385 | { |
| 386 | for (i = 0; i < 4; i++) |
| 387 | { |
| 388 | for (v = j = 0; j < 3 && isdigit(s[j]); j++) |
| 389 | v = 10 * v + s[j] - '0'; |
| 390 | if (j == 0 || (j > 1 && s[0] == '0') || v > 255) return 0; |
| 391 | a[i] = v; |
| 392 | if (s[j] == 0 && i == 3) return 1; |
| 393 | if (s[j] != '.') return 0; |
| 394 | s += j + 1; |
| 395 | } |
| 396 | return 0; |
| 397 | } |
| 398 | else if (af != AF_INET6) |
| 399 | { |
| 400 | errno = EAFNOSUPPORT; |
| 401 | return -1; |
| 402 | } |
| 403 | |
| 404 | if (*s == ':' && *++s != ':') return 0; |
| 405 | |
| 406 | for (i = 0;; i++) |
| 407 | { |
| 408 | if (s[0] == ':' && brk < 0) |
| 409 | { |
| 410 | brk = i; |
| 411 | ip[i & 7] = 0; |
| 412 | if (!*++s) break; |
| 413 | if (i == 7) return 0; |
| 414 | continue; |
| 415 | } |
| 416 | for (v = j = 0; j < 4 && (d = hexval(s[j])) >= 0; j++) |
| 417 | v = 16 * v + d; |
| 418 | if (j == 0) return 0; |
| 419 | ip[i & 7] = v; |
| 420 | if (!s[j] && (brk >= 0 || i == 7)) break; |
| 421 | if (i == 7) return 0; |
| 422 | if (s[j] != ':') |
| 423 | { |
| 424 | if (s[j] != '.' || (i < 6 && brk < 0)) return 0; |
| 425 | need_v4 = 1; |
| 426 | i++; |
| 427 | break; |
| 428 | } |
| 429 | s += j + 1; |
| 430 | } |
| 431 | if (brk >= 0) |
| 432 | { |
| 433 | memmove(ip + brk + 7 - i, ip + brk, 2 * (i + 1 - brk)); |
| 434 | for (j = 0; j < 7 - i; j++) |