comparison 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
comparison
equal deleted inserted replaced
2238:a0784aa36bde 2239:95ad22a4da2d
367 #define sockshutdown() WSACleanup() 367 #define sockshutdown() WSACleanup()
368 #else /* !WIN32 */ 368 #else /* !WIN32 */
369 #define sockshutdown() 369 #define sockshutdown()
370 #endif 370 #endif
371 371
372 #ifdef HAVE_PIPE 372 #define oldsockpipe(pipes) { \
373 #define sockpipe(pipes) { if(pipe(pipes) < 0) pipes[0] = pipes[1] = -1; }
374 #elif !defined(NO_DOMAIN_SOCKETS)
375 #define sockpipe(pipes) { \
376 struct sockaddr_un un; \
377 int tmpsock = socket(AF_UNIX, SOCK_STREAM, 0); \
378 pipes[1] = socket(AF_UNIX, SOCK_STREAM, 0); \
379 memset(&un, 0, sizeof(un)); \
380 un.sun_family=AF_UNIX; \
381 sprintf(un.sun_path, PIPENAME, PIPEROOT, (int)getpid(), pipes[1]); \
382 unlink(un.sun_path); \
383 bind(tmpsock, (struct sockaddr *)&un, sizeof(un)); \
384 listen(tmpsock, 0); \
385 connect(pipes[1], (struct sockaddr *)&un, sizeof(un)); \
386 pipes[0] = accept(tmpsock, 0, 0); \
387 sockclose(tmpsock); \
388 }
389 #else
390 #define sockpipe(pipes) { \
391 struct sockaddr_in server_addr; \ 373 struct sockaddr_in server_addr; \
392 struct sockaddr_in listen_addr = { 0 }; \ 374 struct sockaddr_in listen_addr = { 0 }; \
393 int tmpsock, len = sizeof(struct sockaddr_in); \ 375 int tmpsock, len = sizeof(struct sockaddr_in); \
394 struct hostent *he = gethostbyname("localhost"); \ 376 struct hostent *he = gethostbyname("localhost"); \
395 pipes[0] = pipes[1] = -1; \ 377 pipes[0] = pipes[1] = -1; \
398 memset(&server_addr, 0, sizeof(server_addr)); \ 380 memset(&server_addr, 0, sizeof(server_addr)); \
399 server_addr.sin_family = AF_INET; \ 381 server_addr.sin_family = AF_INET; \
400 server_addr.sin_port = 0; \ 382 server_addr.sin_port = 0; \
401 server_addr.sin_addr.s_addr = INADDR_ANY; \ 383 server_addr.sin_addr.s_addr = INADDR_ANY; \
402 if ((tmpsock = socket(AF_INET, SOCK_STREAM, 0)) > -1 && bind(tmpsock, (struct sockaddr *)&server_addr, sizeof(server_addr)) > -1 && listen(tmpsock, 0) > -1) \ 384 if ((tmpsock = socket(AF_INET, SOCK_STREAM, 0)) > -1 && bind(tmpsock, (struct sockaddr *)&server_addr, sizeof(server_addr)) > -1 && listen(tmpsock, 0) > -1) \
403 { \ 385 { \
404 memset(&listen_addr, 0, sizeof(listen_addr)); \ 386 memset(&listen_addr, 0, sizeof(listen_addr)); \
405 getsockname(tmpsock, (struct sockaddr *)&listen_addr, &len); \ 387 getsockname(tmpsock, (struct sockaddr *)&listen_addr, &len); \
406 server_addr.sin_family = AF_INET; \ 388 server_addr.sin_family = AF_INET; \
407 server_addr.sin_port = listen_addr.sin_port; \ 389 server_addr.sin_port = listen_addr.sin_port; \
408 server_addr.sin_addr.s_addr = *((unsigned long *)he->h_addr); \ 390 server_addr.sin_addr.s_addr = *((unsigned long *)he->h_addr); \
409 if((pipes[1] = socket(AF_INET, SOCK_STREAM, 0)) > -1 && !connect(pipes[1], (struct sockaddr *)&server_addr, sizeof(server_addr))) \ 391 if((pipes[1] = socket(AF_INET, SOCK_STREAM, 0)) > -1 && !connect(pipes[1], (struct sockaddr *)&server_addr, sizeof(server_addr))) \
410 pipes[0] = accept(tmpsock, 0, 0); \ 392 pipes[0] = accept(tmpsock, 0, 0); \
411 } \ 393 } \
412 sockclose(tmpsock); \ 394 if(tmpsock > -1) \
395 sockclose(tmpsock); \
413 } \ 396 } \
414 } 397 }
398
399 #ifdef HAVE_PIPE
400 #define sockpipe(pipes) { if(pipe(pipes) < 0) pipes[0] = pipes[1] = -1; }
401 #elif !defined(NO_DOMAIN_SOCKETS)
402 #define sockpipe(pipes) { \
403 struct sockaddr_un un; \
404 int tmpsock = socket(AF_UNIX, SOCK_STREAM, 0); \
405 pipes[0] = pipes[1] = -1; \
406 if(tmpsock > -1 && (pipes[1] = socket(AF_UNIX, SOCK_STREAM, 0)) > -1) \
407 { \
408 memset(&un, 0, sizeof(un)); \
409 un.sun_family=AF_UNIX; \
410 sprintf(un.sun_path, PIPENAME, PIPEROOT, (int)getpid(), pipes[1]); \
411 unlink(un.sun_path); \
412 bind(tmpsock, (struct sockaddr *)&un, sizeof(un)); \
413 listen(tmpsock, 0); \
414 connect(pipes[1], (struct sockaddr *)&un, sizeof(un)); \
415 pipes[0] = accept(tmpsock, 0, 0); \
416 } else \
417 oldsockpipe(pipes); \
418 if(tmpsock > -1) \
419 sockclose(tmpsock); \
420 }
421 #else
422 #define sockpipe(pipes) oldsockpipe(pipes)
415 #endif 423 #endif
416 424
417 /* Ok Windows and OS/2 both seem to be missing this */ 425 /* Ok Windows and OS/2 both seem to be missing this */
418 #if defined(__WIN32__) || defined(__OS2__) 426 #if defined(__WIN32__) || defined(__OS2__)
419 typedef int socklen_t; 427 typedef int socklen_t;