#ifndef AF_PORTABILITY_H
#define AF_PORTABILITY_H

#include <netinet/in.h>
#include <sys/socket.h>

/* _x_ must be a pointer to a sockaddr structure */

#define SAFAM(_x_)	(((struct sockaddr *)(_x_))->sa_family)

#ifdef HAVE_NEW_SS_FAMILY
#define SSFAM(_x_)	(((struct sockaddr_storage *)(_x_))->ss_family)
#else
#define SSFAM(_x_)	(((struct sockaddr_storage *)(_x_))->__ss_family)
#endif

#define SIN4ADDR(_x_)	(((struct sockaddr_in *)(_x_))->sin_addr)
#define SIN4PORT(_x_)	(((struct sockaddr_in *)(_x_))->sin_port)
#define SIN6ADDR(_x_)	(((struct sockaddr_in6 *)(_x_))->sin6_addr)
#define SIN6PORT(_x_)	(((struct sockaddr_in6 *)(_x_))->sin6_port)

#ifdef INET6
#define SINADDR(_x_)	((SAFAM(_x_)==AF_INET6) ? SIN6ADDR(_x_) : SIN4ADDR(_x_))
#define SINPORT(_x_)	((SAFAM(_x_)==AF_INET6) ? SIN6PORT(_x_) : SIN4PORT(_x_))
#else
#define SINADDR(_x_)    SIN4ADDR(_x_)
#define SINPORT(_x_)    SIN4PORT(_x_)
#endif

#ifndef INET_ADDRSTRLEN
#define INET_ADDRSTRLEN 16
#endif

#ifndef INET6_ADDRSTRLEN
#define INET6_ADDRSTRLEN 46 
#endif

#ifdef INET6
#define IP6_ADDRSTRLEN INET6_ADDRSTRLEN
#define IP4_ADDRSTRLEN INET_ADDRSTRLEN
#define IP_ADDRSTRLEN INET6_ADDRSTRLEN
#else
#define IP_ADDRSTRLEN INET_ADDRSTRLEN
#endif

#ifdef INET6
typedef struct sockaddr_storage sockaddr_storage_t;
#else
typedef struct sockaddr_in sockaddr_storage_t;
#endif 

#endif /* AF_PORTABILITY_H */


syntax highlighted by Code2HTML, v. 0.9.1