Mercurial > dwindows
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 */