]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
easier tube fallback
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 6 Jul 2010 09:20:12 +0000 (09:20 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 6 Jul 2010 09:20:12 +0000 (09:20 +0000)
git-svn-id: file:///svn/unbound/trunk@2183 be551aaa-1e26-0410-a405-d3ace91eadb9

util/tube.c

index 27af15a55c285568c8ed243de3bb107450d43b14..a7a749fd277961b0b7f52f3d907aeae1cf4343da 100644 (file)
 /* 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(tp),
-       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 = 0;
-       if(the_port == 0) 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, (struct sockaddr*)&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, (struct sockaddr*)&addr, len) == -1) {
-               log_err("connect: %s", strerror(errno));
-               close(s);
-               close(t);
-               return -1;
-       }
-
-       len = (socklen_t)sizeof(addr);
-       sv[0] = accept(s, (struct sockaddr*)&addr, &len);
-       if(sv[0] == -1) {
-               log_err("accept: %s", strerror(errno));
-               close(s);
-               close(t);
-               return -1;
-       }
-       sv[1] = t;
-       close(s);
-       return 0;
-}
+/** no socketpair() available, like on Minix 3.1.7, use pipe */
+#define socketpair(f, t, p, sv) pipe(sv) 
 #endif /* HAVE_SOCKETPAIR */
 
 struct tube* tube_create(void)