git » nmdb » master » tree

[master] / nmdb / netutils.c

#include <arpa/inet.h>		/* htonl() and friends */
#include "netutils.h"


/* ntohll() and htonll() are not standard, so we define it using an UGLY trick
 * because there is no standard way to check for endianness at runtime! */
uint64_t ntohll(uint64_t x)
{
	static int endianness = 0;

	/* determine the endianness by checking how htonl() behaves; use -1
	 * for little endian and 1 for big endian */
	if (endianness == 0) {
		if (htonl(1) == 1)
			endianness = 1;
		else
			endianness = -1;
	}

	if (endianness == 1) {
		/* big endian */
		return x;
	}

	/* little endian */
	return ( ntohl( (x >> 32) & 0xFFFFFFFF ) | \
			( (uint64_t) ntohl(x & 0xFFFFFFFF) ) << 32 );
}

uint64_t htonll(uint64_t x)
{
	static int endianness = 0;

	/* determine the endianness by checking how htonl() behaves; use -1
	 * for little endian and 1 for big endian */
	if (endianness == 0) {
		if (htonl(1) == 1)
			endianness = 1;
		else
			endianness = -1;
	}

	if (endianness == 1) {
		/* big endian */
		return x;
	}

	/* little endian */
	return ( htonl( (x >> 32) & 0xFFFFFFFF ) | \
			( (uint64_t) htonl(x & 0xFFFFFFFF) ) << 32 );
}