static void ClientAddress(struct sockaddr *from, ARRAY8Ptr addr, /* return */ ARRAY8Ptr port, /* return */ CARD16 *type) /* return */ { int length, family; char *data; data = NetaddrPort((XdmcpNetaddr)from, &length); XdmcpAllocARRAY8(port, length); memmove(port->data, data, length); port->length = length; family = ConvertAddr((XdmcpNetaddr)from, &length, &data); XdmcpAllocARRAY8(addr, length); memmove(addr->data, data, length); addr->length = length; *type = family; }
// // For copying sock addr collection info passed back by IHXResolveResponse. // Use FreeAddrVec() when you are done. // // XXXLCM something like IHXSockAddrList (GetCount, GetAt, etc.) would be // nicer/safer. Or a generic IHXList (of IUnknown* or void*) // // family is a filter that specifies which addresses to extract // // HX_RESULT HXSockUtil::AllocAddrVec(IHXSockAddr** ppAddrVec, UINT32& nVecLen, IHXSockAddr**& ppAddrVecOut, HXSockFamily familyOut, bool convert, IHXNetServices* pNetServices) { HX_ASSERT(nVecLen > 0); HX_ASSERT(ppAddrVec); HX_ASSERT(familyOut == HX_SOCK_FAMILY_INANY || familyOut == HX_SOCK_FAMILY_IN4 || familyOut == HX_SOCK_FAMILY_IN6); HX_RESULT hxr = HXR_OUTOFMEMORY; ppAddrVecOut = new IHXSockAddr*[nVecLen]; if(ppAddrVecOut) { UINT32 idxOut = 0; for(UINT32 idxSource = 0; idxSource < nVecLen; ++idxSource) { IHXSockAddr* pOther = ppAddrVec[idxSource]; if(familyOut == HX_SOCK_FAMILY_INANY || familyOut == pOther->GetFamily()) { // no conversion needed (family matches) or family out is 'any' ppAddrVecOut[idxOut] = ppAddrVec[idxSource]; HX_ASSERT(ppAddrVecOut[idxOut]); ppAddrVecOut[idxOut]->AddRef(); ++idxOut; } else if (convert) { // convert to family HX_ASSERT(pNetServices); IHXSockAddr* pAddr = 0; HX_RESULT hrConvert = ConvertAddr(pNetServices, familyOut, pOther, pAddr); if(SUCCEEDED(hrConvert)) { ppAddrVecOut[idxOut] = pAddr; HX_ASSERT(ppAddrVecOut[idxOut]); ++idxOut; } } } nVecLen = idxOut; if( nVecLen > 0) { hxr = HXR_OK; } else { // // Most likely case is output family is IPv4 and source vector contains // only non-mapped IPv6 addresss that can't be converted. // HX_VECTOR_DELETE(ppAddrVecOut); hxr = HXR_FAIL; } } return hxr; }