/* ============= 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 }