summaryrefslogtreecommitdiffstats
path: root/rfc1035/rfc1035mksocket.c
blob: 45bb66a0eced0cbda3be41bf068cf5e9e2db281d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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));
}