diff dwcompat.h @ 2239:95ad22a4da2d

Bump version to 3.2 now that we are post 3.1 release. Rename the fallback sockpipe() macro to oldsockpipe() which is now always available. If compiled with domain socket support and domain sockets fail to create, fallback to oldsockpipe(). This hopefully will let us just have a single build for Vista to 10 with domain socket support.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 15 Jan 2021 19:22:27 +0000
parents 2de088fb5dd4
children a1ac35abd5fd
line wrap: on
line diff
--- a/dwcompat.h	Wed Jan 06 17:52:51 2021 +0000
+++ b/dwcompat.h	Fri Jan 15 19:22:27 2021 +0000
@@ -369,25 +369,7 @@
 #define sockshutdown()
 #endif
 
-#ifdef HAVE_PIPE
-#define sockpipe(pipes) { if(pipe(pipes) < 0) pipes[0] = pipes[1] = -1; }
-#elif !defined(NO_DOMAIN_SOCKETS)
-#define sockpipe(pipes) { \
-	struct sockaddr_un un; \
-	int tmpsock = socket(AF_UNIX, SOCK_STREAM, 0); \
-	pipes[1] = socket(AF_UNIX, SOCK_STREAM, 0); \
-	memset(&un, 0, sizeof(un)); \
-	un.sun_family=AF_UNIX; \
-	sprintf(un.sun_path, PIPENAME, PIPEROOT, (int)getpid(), pipes[1]); \
-	unlink(un.sun_path); \
-	bind(tmpsock, (struct sockaddr *)&un, sizeof(un)); \
-	listen(tmpsock, 0); \
-	connect(pipes[1], (struct sockaddr *)&un, sizeof(un)); \
-	pipes[0] = accept(tmpsock, 0, 0); \
-	sockclose(tmpsock); \
-	}
-#else
-#define sockpipe(pipes) { \
+#define oldsockpipe(pipes) { \
 	struct sockaddr_in server_addr; \
 	struct sockaddr_in listen_addr = { 0 }; \
 	int tmpsock, len = sizeof(struct sockaddr_in); \
@@ -400,18 +382,44 @@
 		server_addr.sin_port   = 0; \
 		server_addr.sin_addr.s_addr = INADDR_ANY; \
 		if ((tmpsock = socket(AF_INET, SOCK_STREAM, 0)) > -1 && bind(tmpsock, (struct sockaddr *)&server_addr, sizeof(server_addr)) > -1 && listen(tmpsock, 0) > -1) \
-	    { \
-		    memset(&listen_addr, 0, sizeof(listen_addr)); \
-		    getsockname(tmpsock, (struct sockaddr *)&listen_addr, &len); \
-		    server_addr.sin_family      = AF_INET; \
-		    server_addr.sin_port        = listen_addr.sin_port; \
-		    server_addr.sin_addr.s_addr = *((unsigned long *)he->h_addr); \
-		    if((pipes[1] = socket(AF_INET, SOCK_STREAM, 0)) > -1 && !connect(pipes[1], (struct sockaddr *)&server_addr, sizeof(server_addr))) \
-			   pipes[0] = accept(tmpsock, 0, 0); \
-	    } \
-		sockclose(tmpsock); \
+		{ \
+			memset(&listen_addr, 0, sizeof(listen_addr)); \
+			getsockname(tmpsock, (struct sockaddr *)&listen_addr, &len); \
+			server_addr.sin_family      = AF_INET; \
+			server_addr.sin_port        = listen_addr.sin_port; \
+			server_addr.sin_addr.s_addr = *((unsigned long *)he->h_addr); \
+			if((pipes[1] = socket(AF_INET, SOCK_STREAM, 0)) > -1 && !connect(pipes[1], (struct sockaddr *)&server_addr, sizeof(server_addr))) \
+				pipes[0] = accept(tmpsock, 0, 0); \
+		} \
+		if(tmpsock > -1) \
+			sockclose(tmpsock); \
 	} \
 }
+
+#ifdef HAVE_PIPE
+#define sockpipe(pipes) { if(pipe(pipes) < 0) pipes[0] = pipes[1] = -1; }
+#elif !defined(NO_DOMAIN_SOCKETS)
+#define sockpipe(pipes) { \
+	struct sockaddr_un un; \
+	int tmpsock = socket(AF_UNIX, SOCK_STREAM, 0); \
+	pipes[0] = pipes[1] = -1; \
+	if(tmpsock > -1 && (pipes[1] = socket(AF_UNIX, SOCK_STREAM, 0)) > -1) \
+	{ \
+		memset(&un, 0, sizeof(un)); \
+		un.sun_family=AF_UNIX; \
+		sprintf(un.sun_path, PIPENAME, PIPEROOT, (int)getpid(), pipes[1]); \
+		unlink(un.sun_path); \
+		bind(tmpsock, (struct sockaddr *)&un, sizeof(un)); \
+		listen(tmpsock, 0); \
+		connect(pipes[1], (struct sockaddr *)&un, sizeof(un)); \
+		pipes[0] = accept(tmpsock, 0, 0); \
+	} else \
+		oldsockpipe(pipes); \
+	if(tmpsock > -1) \
+		sockclose(tmpsock); \
+	}
+#else
+#define sockpipe(pipes) oldsockpipe(pipes)
 #endif
 
 /* Ok Windows and OS/2 both seem to be missing this */