Exemple #1
0
/*
=============
Sys_StringToSockaddr
=============
 */
static qboolean Sys_StringToSockaddr(const char *s, struct sockaddr *sadr, int sadr_len, sa_family_t family) {
    struct addrinfo hints;
    struct addrinfo *res = NULL;
    struct addrinfo *search = NULL;
    struct addrinfo *hintsp;
    int retval;

    memset(sadr, '\0', sizeof (*sadr));
    memset(&hints, '\0', sizeof (hints));

    hintsp = &hints;
    hintsp->ai_family = family;
    hintsp->ai_socktype = SOCK_DGRAM;

    retval = getaddrinfo(s, NULL, hintsp, &res);

    if (!retval) {
        if (family == AF_UNSPEC) {
            // Decide here and now which protocol family to use
            if (net_enabled->integer & NET_PRIOV6) {
                if (net_enabled->integer & NET_ENABLEV6)
                    search = SearchAddrInfo(res, AF_INET6);

                if (!search && (net_enabled->integer & NET_ENABLEV4))
                    search = SearchAddrInfo(res, AF_INET);
            } else {
                if (net_enabled->integer & NET_ENABLEV4)
                    search = SearchAddrInfo(res, AF_INET);

                if (!search && (net_enabled->integer & NET_ENABLEV6))
                    search = SearchAddrInfo(res, AF_INET6);
            }
        } else
            search = SearchAddrInfo(res, family);

        if (search) {
            if (res->ai_addrlen > sadr_len)
                res->ai_addrlen = sadr_len;

            memcpy(sadr, res->ai_addr, res->ai_addrlen);
            freeaddrinfo(res);

            return qtrue;
        } else
            Com_Printf("Sys_StringToSockaddr: Error resolving %s: No address of required type found.\n", s);
    } else
        Com_Printf("Sys_StringToSockaddr: Error resolving %s: %s\n", s, gai_strerror(retval));

    if (res)
        freeaddrinfo(res);

    return qfalse;
}
/*
=============
Sys_StringToSockaddr
=============
*/
static qboolean Sys_StringToSockaddr(const char *s, struct sockaddr *sadr, int sadr_len, sa_family_t family)
{
#ifdef FEATURE_IPV6
	struct addrinfo hints;
	struct addrinfo *res    = NULL;
	struct addrinfo *search = NULL;
	struct addrinfo *hintsp;
	int             retval;

	memset(sadr, '\0', sizeof(*sadr));
	memset(&hints, '\0', sizeof(hints));

	hintsp              = &hints;
	hintsp->ai_family   = family;
	hintsp->ai_socktype = SOCK_DGRAM;

	retval = getaddrinfo(s, NULL, hintsp, &res);

	if (!retval)
	{
		if (family == AF_UNSPEC)
		{
			// Decide here and now which protocol family to use
			if (net_enabled->integer & NET_PRIOV6)
			{
				if (net_enabled->integer & NET_ENABLEV6)
				{
					search = SearchAddrInfo(res, AF_INET6);
				}

				if (!search && (net_enabled->integer & NET_ENABLEV4))
				{
					search = SearchAddrInfo(res, AF_INET);
				}
			}
			else
			{
				if (net_enabled->integer & NET_ENABLEV4)
				{
					search = SearchAddrInfo(res, AF_INET);
				}

				if (!search && (net_enabled->integer & NET_ENABLEV6))
				{
					search = SearchAddrInfo(res, AF_INET6);
				}
			}
		}
		else
		{
			search = SearchAddrInfo(res, family);
		}

		if (search)
		{
			if (res->ai_addrlen > sadr_len)
			{
				res->ai_addrlen = sadr_len;
			}

			memcpy(sadr, res->ai_addr, res->ai_addrlen);
			freeaddrinfo(res);

			return qtrue;
		}
		else
		{
			Com_Printf("Sys_StringToSockaddr: Error resolving %s: No address of required type found.\n", s);
		}
	}
	else
	{
		Com_Printf("Sys_StringToSockaddr: Error resolving %s: %s\n", s, gai_strerror(retval));
	}

	if (res)
	{
		freeaddrinfo(res);
	}

	return qfalse;
#else
	struct hostent *h;

	memset(sadr, 0, sizeof(*sadr));
	((struct sockaddr_in *)sadr)->sin_family = AF_INET;

	((struct sockaddr_in *)sadr)->sin_port = 0;

	if (s[0] >= '0' && s[0] <= '9')
	{
		*(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(s);
	}
	else
	{
		if (!(h = gethostbyname(s)))
		{
			return qfalse;
		}
		*(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0];
	}

	return qtrue;
#endif
}