diff --git a/src/cas/io/bsdSocket/casIntfIO.cc b/src/cas/io/bsdSocket/casIntfIO.cc index 064b5456c..d313eeccd 100644 --- a/src/cas/io/bsdSocket/casIntfIO.cc +++ b/src/cas/io/bsdSocket/casIntfIO.cc @@ -174,13 +174,10 @@ casStreamOS *casIntfIO::newStreamClient ( caServerI & cas, clientBufMemoryManager & bufMgr ) const { static bool oneMsgFlag = false; + struct sockaddr newAddr; - SOCKET newSock; - osiSocklen_t length; - casStreamOS * pOS; - - length = ( osiSocklen_t ) sizeof ( newAddr ); - newSock = accept ( this->sock, & newAddr, & length ); + osiSocklen_t length = ( osiSocklen_t ) sizeof ( newAddr ); + SOCKET newSock = epicsSocketAccept ( this->sock, & newAddr, & length ); if ( newSock == INVALID_SOCKET ) { int errnoCpy = SOCKERRNO; if ( errnoCpy != SOCK_EWOULDBLOCK && ! oneMsgFlag ) { @@ -201,7 +198,7 @@ casStreamOS *casIntfIO::newStreamClient ( caServerI & cas, ioArgsToNewStreamIO args; args.addr = newAddr; args.sock = newSock; - pOS = new casStreamOS ( cas, bufMgr, args ); + casStreamOS * pOS = new casStreamOS ( cas, bufMgr, args ); if ( ! pOS ) { errMessage ( S_cas_noMemory, "unable to create data structures for a new client" ); diff --git a/src/libCom/osi/os/VMS/osdSock.h b/src/libCom/osi/os/VMS/osdSock.h index 90c9a7177..968da0fae 100644 --- a/src/libCom/osi/os/VMS/osdSock.h +++ b/src/libCom/osi/os/VMS/osdSock.h @@ -60,7 +60,6 @@ extern "C" { #if defined(MULTINET) && defined(MULTINET_NO_PROTOTYPES) int gettimeofday (struct timeval *tp, struct timezone *tzp); int gethostname (char *name, int namelen); -int accept (int socket, struct sockaddr *addr, int *addrlen); int getpeername (int socket, struct sockaddr *name, int *namelen); int connect (int socket, struct sockaddr *name, int namelen); int setsockopt (int socket, int level, int optname, diff --git a/src/libCom/osi/os/VMS/osiSock.h b/src/libCom/osi/os/VMS/osiSock.h index 64692db05..905c1f96d 100644 --- a/src/libCom/osi/os/VMS/osiSock.h +++ b/src/libCom/osi/os/VMS/osiSock.h @@ -60,7 +60,6 @@ extern "C" { #if defined(MULTINET) && defined(MULTINET_NO_PROTOTYPES) int gettimeofday (struct timeval *tp, struct timezone *tzp); int gethostname (char *name, int namelen); -int accept (int socket, struct sockaddr *addr, int *addrlen); int getpeername (int socket, struct sockaddr *name, int *namelen); int connect (int socket, struct sockaddr *name, int namelen); int setsockopt (int socket, int level, int optname, diff --git a/src/libCom/osi/os/WIN32/osdSock.c b/src/libCom/osi/os/WIN32/osdSock.c index 7e38fc651..b1e554a97 100644 --- a/src/libCom/osi/os/WIN32/osdSock.c +++ b/src/libCom/osi/os/WIN32/osdSock.c @@ -122,6 +122,12 @@ epicsShareFunc SOCKET epicsShareAPI epicsSocketCreate ( return socket ( domain, type, protocol ); } +epicsShareFunc int epicsShareAPI epicsSocketAccept ( + int sock, struct sockaddr * pAddr, osiSocklen_t * addrlen ) +{ + return accept ( sock, pAddr, addrlen ); +} + epicsShareFunc void epicsShareAPI epicsSocketDestroy ( SOCKET s ) { int status = closesocket ( s ); diff --git a/src/libCom/osi/os/posix/osdSock.c b/src/libCom/osi/os/posix/osdSock.c index e14919b26..5ef797bb0 100644 --- a/src/libCom/osi/os/posix/osdSock.c +++ b/src/libCom/osi/os/posix/osdSock.c @@ -93,6 +93,29 @@ epicsShareFunc SOCKET epicsShareAPI epicsSocketCreate ( return sock; } +epicsShareFunc int epicsShareAPI epicsSocketAccept ( + int sock, struct sockaddr * pAddr, osiSocklen_t * addrlen ) +{ + int newSock = accept ( sock, pAddr, addrlen ); + if ( newSock < 0 ) { + newSock = INVALID_SOCKET; + } + else { + int status = fcntl ( newSock, F_SETFD, FD_CLOEXEC ); + if ( status < 0 ) { + char buf [ 64 ]; + epicsSocketConvertErrnoToString ( buf, sizeof ( buf ) ); + errlogPrintf ( + "epicsSocketCreate: failed to " + "fcntl FD_CLOEXEC because \"%s\"\n", + buf ): + close ( newSock ); + newSock = INVALID_SOCKET; + } + } + return newSock; +} + epicsShareFunc void epicsShareAPI epicsSocketDestroy ( SOCKET s ) { int status = close ( s ); diff --git a/src/libCom/osi/os/sun4/osdSock.h b/src/libCom/osi/os/sun4/osdSock.h index ffec9f1c2..ffc04dad9 100644 --- a/src/libCom/osi/os/sun4/osdSock.h +++ b/src/libCom/osi/os/sun4/osdSock.h @@ -55,7 +55,6 @@ int gethostname (char *name, int namelen); #else # ifdef OSISOCK_ANSI_FUNC_PROTO int listen (int socket, int backlog); - int accept (int socket, struct sockaddr *addr, int *addrlen); int shutdown (int socket, int how); int getpeername (int socket, struct sockaddr *name, int *namelen); int connect (int socket, struct sockaddr *name, int namelen); diff --git a/src/libCom/osi/os/vxWorks/osdSock.c b/src/libCom/osi/os/vxWorks/osdSock.c index 03cb26400..6638577d9 100644 --- a/src/libCom/osi/os/vxWorks/osdSock.c +++ b/src/libCom/osi/os/vxWorks/osdSock.c @@ -40,6 +40,16 @@ epicsShareFunc SOCKET epicsShareAPI epicsSocketCreate ( return sock; } +epicsShareFunc int epicsShareAPI epicsSocketAccept ( + int sock, struct sockaddr * pAddr, osiSocklen_t * addrlen ) +{ + int newSock = accept ( sock, pAddr, addrlen ); + if ( newSock < 0 ) { + newSock = INVALID_SOCKET; + } + return newSock; +} + epicsShareFunc void epicsShareAPI epicsSocketDestroy ( SOCKET s ) { int status = close ( s ); diff --git a/src/libCom/osi/osiSock.h b/src/libCom/osi/osiSock.h index 3391a9b81..8113a51fd 100644 --- a/src/libCom/osi/osiSock.h +++ b/src/libCom/osi/osiSock.h @@ -30,8 +30,12 @@ struct sockaddr; struct sockaddr_in; struct in_addr; -epicsShareFunc SOCKET epicsShareAPI epicsSocketCreate ( int domain, int type, int protocol ); -epicsShareFunc void epicsShareAPI epicsSocketDestroy ( SOCKET ); +epicsShareFunc SOCKET epicsShareAPI epicsSocketCreate ( + int domain, int type, int protocol ); +epicsShareFunc int epicsShareAPI epicsSocketAccept ( + int sock, struct sockaddr * pAddr, osiSocklen_t * addrlen ); +epicsShareFunc void epicsShareAPI epicsSocketDestroy ( + SOCKET ); /* * Fortunately, on most systems the combination of a shutdown of both diff --git a/src/rsrv/caservertask.c b/src/rsrv/caservertask.c index 7829af1de..e78a9ce22 100644 --- a/src/rsrv/caservertask.c +++ b/src/rsrv/caservertask.c @@ -196,7 +196,8 @@ LOCAL void req_server (void *pParm) struct sockaddr sockAddr; osiSocklen_t addLen = sizeof(sockAddr); - if ( ( clientSock = accept ( IOC_sock, &sockAddr, &addLen ) ) == INVALID_SOCKET ) { + clientSock = epicsSocketAccept ( IOC_sock, &sockAddr, &addLen ); + if ( clientSock == INVALID_SOCKET ) { char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); diff --git a/src/util/iocLogServer.c b/src/util/iocLogServer.c index a0b3f44b4..c7cf02c7a 100644 --- a/src/util/iocLogServer.c +++ b/src/util/iocLogServer.c @@ -442,8 +442,8 @@ static void acceptNewClient ( void *pParam ) } addrSize = sizeof ( addr ); - pclient->insock = accept ( pserver->sock, (struct sockaddr *)&addr, &addrSize ); - if ( pclient->insock<0 || addrSize < sizeof (addr) ) { + pclient->insock = epicsSocketAccept ( pserver->sock, (struct sockaddr *)&addr, &addrSize ); + if ( pclient->insock==INVALID_SOCKET || addrSize < sizeof (addr) ) { static unsigned acceptErrCount; static int lastErrno; int thisErrno;