Похоже на ошибку в исходном коде . parse_numeric_port()
определяется только если
GETADDRINFO_EMU
не определено, но код использует parse_numeric_port()
, если GETADDRINFO_EMU
определено или нет (обратите внимание, мои комментарии добавлены в код):
#ifndef GETADDRINFO_EMU
struct getaddrinfo_arg
{
const char *node;
const char *service;
const struct addrinfo *hints;
struct addrinfo **res;
};
#ifdef HAVE_INET_PTON
static int
parse_numeric_port(const char *service, int *portp)
{
unsigned long u;
if (!service) {
*portp = 0;
return 1;
}
if (strspn(service, "0123456789") != strlen(service))
return 0;
errno = 0;
u = STRTOUL(service, NULL, 10);
if (errno)
return 0;
if (0x10000 <= u)
return 0;
*portp = (int)u;
return 1;
}
#endif
static void *
nogvl_getaddrinfo(void *arg)
{
int ret;
struct getaddrinfo_arg *ptr = arg;
ret = getaddrinfo(ptr->node, ptr->service, ptr->hints, ptr->res);
#ifdef __linux__
/* On Linux (mainly Ubuntu 13.04) /etc/nsswitch.conf has mdns4 and
* it cause getaddrinfo to return EAI_SYSTEM/ENOENT. [ruby-list:49420]
*/
if (ret == EAI_SYSTEM && errno == ENOENT)
ret = EAI_NONAME;
#endif
return (void *)(VALUE)ret;
}
#endif // *** This closes #ifndef GETADDRINFO_EMU ***
static int
numeric_getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res)
{
#ifdef HAVE_INET_PTON
# if defined __MINGW64__
# define inet_pton(f,s,d) rb_w32_inet_pton(f,s,d)
# endif
int port;
// *** But this uses parse_numeric_port() even if it wasn't defined ***
if (node && parse_numeric_port(service, &port)) {
static const struct {
int socktype;
Вы можете либо найти способ НЕ определять GETADDRINFO_EMU
при сборке, либо вы можете отправить отчет об ошибке и дождаться исправления.