Example #1
0
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;
}
Example #2
0
//
// 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;
}