ConnectState * connectHostByName(const char *host, const char *service, Protocol proto, const ConnectFlags *flags, ConnectConnectCallback connectCallback, ConnectErrorCallback errorCallback, void *extra) { struct addrinfo hints; ConnectState *connectState; ResolveFlags resolveFlags; // Structure is empty (for now). assert(flags->familyDemand == PF_inet || flags->familyDemand == PF_inet6 || flags->familyDemand == PF_unspec); assert(flags->familyPrefer == PF_inet || flags->familyPrefer == PF_inet6 || flags->familyPrefer == PF_unspec); assert(proto == IPProto_tcp || proto == IPProto_udp); memset(&hints, '\0', sizeof hints); hints.ai_family = protocolFamilyTranslation[flags->familyDemand]; hints.ai_protocol = protocolTranslation[proto]; if (proto == IPProto_tcp) { hints.ai_socktype = SOCK_STREAM; } else { assert(proto == IPProto_udp); hints.ai_socktype = SOCK_DGRAM; } hints.ai_flags = 0; connectState = ConnectState_alloc(); connectState->refCount = 1; #ifdef DEBUG_CONNECT_REF log_add(log_Debug, "ConnectState %08" PRIxPTR ": ref=1 (%d)\n", (uintptr_t) connectState, connectState->refCount); #endif connectState->state = Connect_resolving; connectState->flags = *flags; connectState->connectCallback = connectCallback; connectState->errorCallback = errorCallback; connectState->extra = extra; connectState->info = NULL; connectState->infoPtr = NULL; connectState->nd = NULL; connectState->alarm = NULL; connectState->resolveState = getaddrinfoAsync( host, service, &hints, &resolveFlags, (ResolveCallback) connectHostResolveCallback, (ResolveErrorCallback) connectHostResolveErrorCallback, (ResolveCallbackArg) connectState); return connectState; }
// 'proto' is one of IPProto_tcp or IPProto_udp. ListenState * listenPort(const char *service, Protocol proto, const ListenFlags *flags, ListenConnectCallback connectCallback, ListenErrorCallback errorCallback, void *extra) { struct addrinfo hints; ListenState *listenState; ResolveFlags resolveFlags; // Structure is empty (for now). assert(flags->familyDemand == PF_inet || flags->familyDemand == PF_inet6 || flags->familyDemand == PF_unspec); assert(flags->familyPrefer == PF_inet || flags->familyPrefer == PF_inet6 || flags->familyPrefer == PF_unspec); assert(proto == IPProto_tcp || proto == IPProto_udp); // Acquire a list of addresses to bind to. memset(&hints, '\0', sizeof hints); hints.ai_family = protocolFamilyTranslation[flags->familyDemand]; hints.ai_protocol = protocolTranslation[proto]; if (proto == IPProto_tcp) { hints.ai_socktype = SOCK_STREAM; } else { assert(proto == IPProto_udp); hints.ai_socktype = SOCK_DGRAM; } hints.ai_flags = AI_PASSIVE; listenState = ListenState_alloc(); listenState->refCount = 1; #ifdef DEBUG_LISTEN_REF log_add(log_Debug, "ListenState %08" PRIxPTR ": ref=1 (%d)", (uintptr_t) listenState, listenState->refCount); #endif listenState->state = Listen_resolving; listenState->flags = *flags; listenState->connectCallback = connectCallback; listenState->errorCallback = errorCallback; listenState->extra = extra; listenState->nds = NULL; listenState->numNd = 0; listenState->resolveState = getaddrinfoAsync(NULL, service, &hints, &resolveFlags, listenPortResolveCallback, listenPortResolveErrorCallback, (ResolveCallbackArg) listenState); return listenState; }