fixed base to use close on exec options whenever creating a socket

on posix compliant systems
This commit is contained in:
Jeff Hill
2003-07-16 22:05:54 +00:00
parent faf5bc3b0e
commit bb92682ed1
10 changed files with 53 additions and 15 deletions

View File

@@ -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" );

View File

@@ -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,

View File

@@ -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,

View File

@@ -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 );

View File

@@ -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 );

View File

@@ -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);

View File

@@ -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 );

View File

@@ -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

View File

@@ -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 ) );

View File

@@ -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;