+/**
+ * \brief Allocate a new zeroed addrinfo for the specified address
+ */
+struct addrinfo *int_new_addrinfo(int af, const void *addrdata)
+{
+ size_t addrlen = 0;
+ switch(af)
+ {
+ case AF_INET:
+ addrlen = sizeof(struct sockaddr_in);
+ break;
+ case AF_INET6:
+ addrlen = sizeof(struct sockaddr_in6);
+ break;
+ default:
+ _SysDebug("int_new_addrinfo: ERROR - Unknown AF %i", af);
+ return NULL;
+ }
+ struct addrinfo* ret = malloc(sizeof(struct addrinfo) + addrlen);
+ ret->ai_family = af;
+ ret->ai_socktype = 0;
+ ret->ai_protocol = 0;
+ ret->ai_addrlen = addrlen;
+ ret->ai_addr = (void*)( ret + 1 );
+ ret->ai_canonname = 0;
+ ret->ai_next = 0;
+ switch(af)
+ {
+ case AF_INET:
+ ((struct sockaddr_in*)ret->ai_addr)->sin_family = AF_INET;
+ ((struct sockaddr_in*)ret->ai_addr)->sin_port = 0;
+ memcpy( &((struct sockaddr_in*)ret->ai_addr)->sin_addr, addrdata, 4 );
+ break;
+ case AF_INET6:
+ ((struct sockaddr_in6*)ret->ai_addr)->sin6_family = AF_INET6;
+ ((struct sockaddr_in6*)ret->ai_addr)->sin6_port = 0;
+ memcpy( &((struct sockaddr_in6*)ret->ai_addr)->sin6_addr, addrdata, 16 );
+ break;
+ default:
+ _SysDebug("int_new_addrinfo: BUGCHECK - Unhandled AF %i", af);
+ return NULL;
+ }
+ return ret;
+}
+
+// Callback for getaddrinfo's call to Net_Lookup_Addrs
+int int_getaddinfo_lookupcb(void *info_v, int addr_type, const void *addr)
+{
+ struct sLookupInfo *info = info_v;
+ struct addrinfo *ent;
+ switch( addr_type )
+ {
+ case NET_ADDRTYPE_IPV4:
+ ent = int_new_addrinfo(AF_INET, addr);
+ break;
+ case NET_ADDRTYPE_IPV6:
+ ent = int_new_addrinfo(AF_INET6, addr);
+ break;
+ default:
+ // Huh... unknown address type, just ignore it
+ return 0;
+ }
+ ent->ai_next = *info->ret_p;
+ *info->ret_p = ent;
+ return 0;
+}
+