Mercurial > dwindows
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; |