File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mtr / packet / sockaddr.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:07:30 2021 UTC (3 years, 4 months ago) by misho
Branches: mtr, MAIN
CVS tags: v0_94, HEAD
mtr 0.94

#include <stddef.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void *sockaddr_addr_offset(const void *x)
{
	if( x == NULL )
		return NULL;

	if( ((struct sockaddr *)(x))->sa_family == AF_INET )
	{
		return ((void *)(x) + offsetof(struct sockaddr_in, sin_addr));
	}else
	if( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
	{
		return ((void *)(x) + offsetof(struct sockaddr_in6, sin6_addr));
	}

	return NULL;
}

unsigned int sockaddr_addr_size(const void *x)
{
	if( x == NULL )
		return 0;
	if( ((struct sockaddr *)(x))->sa_family == AF_INET )
	{
		return sizeof(struct in_addr);
	}else
	if( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
	{
		return sizeof(struct in6_addr);
	}
	return 0;
}


unsigned int sockaddr_size(const void *x)
{
	if( x == NULL )
		return 0;
	if( ((struct sockaddr *)(x))->sa_family == AF_INET )
	{
		return sizeof(struct sockaddr_in);
	}else
	if( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
	{
		return sizeof(struct sockaddr_in6);
	}
	return 0;
}

in_port_t *sockaddr_port_offset(const void *x)
{
	if( x == NULL )
		return NULL;

	if( ((struct sockaddr *)(x))->sa_family == AF_INET )
	{
		return ((void *)(x) + offsetof(struct sockaddr_in, sin_port));
	}else
	if( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
	{
		return ((void *)(x) + offsetof(struct sockaddr_in6, sin6_port));
	}

	return NULL;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>