in src/LttngNetHelpers.c [26:107]
void lttngh_FormatSockaddr(const void* pSockaddr, unsigned cbSockaddr,
char* buf65)
{
static unsigned const SizeOfInet4ThroughAddr = offsetof(struct sockaddr_in, sin_zero);
static unsigned const SizeOfInet6ThroughAddr = offsetof(struct sockaddr_in6, sin6_scope_id);
static unsigned const SizeOfInet6ThroughScope = offsetof(struct sockaddr_in6, sin6_scope_id) + sizeof(uint32_t);
static unsigned const MaxHexDigits = LTTNGH_FORMAT_SOCKADDR_LEN - sizeof("0x");
char* pOut = buf65;
unsigned i, cb;
if (cbSockaddr >= 2)
{
switch (((struct sockaddr const*)pSockaddr)->sa_family)
{
case AF_INET:
if (cbSockaddr >= SizeOfInet4ThroughAddr)
{
struct sockaddr_in const* const pSock = (struct sockaddr_in const*)pSockaddr;
lttngh_FormatIPv4(&pSock->sin_addr, pOut);
if (pSock->sin_port != 0)
{
pOut += strlen(pOut);
sprintf(pOut, ":%u",
ntohs(pSock->sin_port));
}
goto Done;
}
break;
case AF_INET6:
if (cbSockaddr >= SizeOfInet6ThroughAddr)
{
struct sockaddr_in6 const* const pSock = (struct sockaddr_in6 const*)pSockaddr;
if (pSock->sin6_port != 0)
{
*pOut++ = '[';
}
lttngh_FormatIPv6(&pSock->sin6_addr, pOut);
if (cbSockaddr >= SizeOfInet6ThroughScope &&
pSock->sin6_scope_id != 0)
{
pOut += strlen(pOut);
sprintf(pOut, "%%%u",
ntohl(pSock->sin6_scope_id));
}
if (pSock->sin6_port != 0)
{
pOut += strlen(pOut);
sprintf(pOut, "]:%u",
ntohs(pSock->sin6_port));
}
goto Done;
}
break;
}
}
*pOut++ = '0';
*pOut++ = 'x';
*pOut = 0;
cb = cbSockaddr < (MaxHexDigits / 2) ? cbSockaddr : (MaxHexDigits / 2);
for (i = 0; i != cb; i += 1)
{
sprintf(pOut, "%02X", ((unsigned char const*)pSockaddr)[i]);
pOut += 2;
}
Done:
assert(strlen(buf65) < LTTNGH_FORMAT_SOCKADDR_LEN);
buf65[LTTNGH_FORMAT_SOCKADDR_LEN - 1] = 0;
}