fixed base to use close on exec options whenever creating a socket
on posix compliant systems
This commit is contained in:
@@ -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" );
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ) );
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user