diff options
Diffstat (limited to 'rfc1035/rfc1035mksocket.c')
| -rw-r--r-- | rfc1035/rfc1035mksocket.c | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/rfc1035/rfc1035mksocket.c b/rfc1035/rfc1035mksocket.c new file mode 100644 index 0000000..45bb66a --- /dev/null +++ b/rfc1035/rfc1035mksocket.c @@ -0,0 +1,39 @@ +/* +** Copyright 1998 - 2011 Double Precision, Inc. +** See COPYING for distribution information. +*/ +#include	"config.h" +#include	"rfc1035.h" +#include	<sys/types.h> +#include	<sys/socket.h> +#include	<arpa/inet.h> +#include	<errno.h> + + +/* +**	Create a socket.  Duh.  If we've compiled IPv6 support, but we can't +**	create an IPv6 socket, create an IPv4 socket.  This can happen, say, +**	on Linux with IPv6 runtime libraries, but without IPv6 in the kernel. +*/ + +int	rfc1035_mksocket(int sock_type, int sock_protocol, int *af) +{ +#if	RFC1035_IPV6 +	int	s; +	int	on=0; + +	*af=AF_INET6; +	if ( (s=socket(PF_INET6, sock_type, sock_protocol)) >= 0) +	{ +#ifdef IPV6_V6ONLY + +		setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, +			   (char *)&on, sizeof(on)); +#endif + +		return (s); +	} +#endif +	*af=AF_INET; +	return (socket(PF_INET, sock_type, sock_protocol)); +} | 
