From 9449059d8b100f40d131e1d899a407eeac1e93a3 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 2 Apr 2023 11:58:50 -0700 Subject: [PATCH] expose wrappers for some evutil as expert API --- src/pvxs/util.h | 10 ++++++++++ src/util.cpp | 41 +++++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/pvxs/util.h b/src/pvxs/util.h index ffcfdff..8be750d 100644 --- a/src/pvxs/util.h +++ b/src/pvxs/util.h @@ -322,6 +322,16 @@ private: friend struct Pvt; }; +//! Allocate a pair of connected stream sockets +//! \since UNRELEASED +PVXS_API +void compat_socketpair(SOCKET sock[2]); + +//! Setup socket for non-blocking I/O +//! \since UNRELEASED +PVXS_API +void compat_make_socket_nonblocking(SOCKET sock); + #endif // PVXS_EXPERT_API_ENABLED } // namespace pvxs diff --git a/src/util.cpp b/src/util.cpp index 70eac89..f6cc330 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -4,6 +4,15 @@ * in file LICENSE that is included with this distribution. */ +#include + +#ifdef __has_include +# if defined(_WIN32) && __has_include() +# include +# define WIN_HAS_AFUNIX +# endif +#endif + // for signal handling #include @@ -228,15 +237,9 @@ void SigInt_handler(int signum); namespace { struct SocketPair { - evutil_socket_t s[2]; + SOCKET s[2]; SocketPair() { -#ifdef _WIN32 - auto err = evutil_socketpair(AF_INET, SOCK_STREAM, 0, s); -#else - auto err = evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, s); -#endif - if(err) - throw BAD_ALLOC(); + compat_socketpair(s); } ~SocketPair() { epicsSocketDestroy(s[0]); @@ -663,6 +666,28 @@ GetAddrInfo::~GetAddrInfo() evutil_freeaddrinfo(info); } +void compat_socketpair(SOCKET sock[2]) +{ + evutil_socket_t s[2]; + int err = -1; +#if !defined(_WIN32) || defined(WIN_HAS_AFUNIX) + err = evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, s); +#endif + if(err) + err = evutil_socketpair(AF_INET, SOCK_STREAM, 0, s); + if(err) + throw std::runtime_error(SB()<<"ERROR: "<<__func__<<" "<