summaryrefslogtreecommitdiffstats
path: root/rfc1035/rfc1035mksocket.c
diff options
context:
space:
mode:
authorSam Varshavchik2013-08-19 16:39:41 -0400
committerSam Varshavchik2013-08-25 14:43:51 -0400
commit9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch)
tree7a81a04cb51efb078ee350859a64be2ebc6b8813 /rfc1035/rfc1035mksocket.c
parenta9520698b770168d1f33d6301463bb70a19655ec (diff)
downloadcourier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2
Initial checkin
Imported from subversion report, converted to git. Updated all paths in scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'rfc1035/rfc1035mksocket.c')
-rw-r--r--rfc1035/rfc1035mksocket.c39
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));
+}