]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
tube compat
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 5 Jul 2010 15:49:49 +0000 (15:49 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 5 Jul 2010 15:49:49 +0000 (15:49 +0000)
git-svn-id: file:///svn/unbound/trunk@2180 be551aaa-1e26-0410-a405-d3ace91eadb9

util/tube.c

index 63810f7398f1c3008b02455e186653924d692552..3befc694552d4b97ebb040950c4ae98e232396ba 100644 (file)
 #ifndef USE_WINSOCK
 /* on unix */
 
+#ifndef HAVE_SOCKETPAIR
+/** define socketpair to another name in case it sneakily exists somehow */
+#define socketpair socketpair_compat
+static int socketpair(int ATTR_UNUSED(f), int ATTR_UNUSED(t),
+       int ATTR_UNUSED(p), int sv[2])
+{
+       /* no socketpair() available, like on Minix 3.1.7,
+        * create two TCP sockets connected to each other on 127.0.0.1 */
+       struct sockaddr_storage addr;
+       socklen_t len;
+       int s, t;
+       /* hope this port is not in use ... */
+       static int the_port = 1025 + (getpid() % 16384);
+       s = socket(AF_INET, SOCK_STREAM, 0);
+       if(s == -1) {
+               log_err("socket: %s", strerror(errno));
+               return -1;
+       }
+       if(extstrtoaddr("127.0.0.1@0", &addr, &len) == 0) {
+               log_err("internal error, cannot parse in socketpair_compat");
+               close(s);
+               errno=EINVAL;
+               return -1;
+       }
+       ((struct sockaddr_in*)&addr)->sin_port = htons(the_port++);
+       if(bind(s, &addr, len) == -1) {
+               log_err("bind: %s", strerror(errno));
+               close(s);
+               return -1;
+       }
+       if(listen(s, 5) == -1) {
+               log_err("listen: %s", strerror(errno));
+               close(s);
+               return -1;
+       }
+
+       /* create send sock */
+       t = socket(AF_INET, SOCK_STREAM, 0);
+       if(t == -1) {
+               log_err("socket: %s", strerror(errno));
+               close(s);
+               return -1;
+       }
+       if(connect(t, &addr, len) == -1) {
+               log_err("connect: %s", strerror(errno));
+               close(s);
+               close(t);
+               return -1;
+       }
+
+       len = (socklen_t)sizeof(addr);
+       sv[0] = accept(s, &addr, &len, 0);
+       if(sv[0] == -1) {
+               log_err("accept: %s", strerror(errno));
+               close(s);
+               close(t);
+               return -1;
+       }
+       sv[1] = t;
+       close(s)
+       return 0;
+}
+#endif /* HAVE_SOCKETPAIR */
+
 struct tube* tube_create(void)
 {
        struct tube* tube = (struct tube*)calloc(1, sizeof(*tube));