From b11d5476994e24af9b64c327aef8d0841dfef468 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Wed, 30 Jul 2003 21:32:36 +0000 Subject: [PATCH] set close-on-exec flag --- src/ca/iocinf.c | 8 ++++++ src/ca/posix_depen.c | 35 +------------------------ src/ca/repeater.c | 1 + src/cas/io/bsdSocket/casDGIntfIO.cc | 1 + src/cas/io/bsdSocket/casIntfIO.cc | 6 +++++ src/libCom/bsdSocketResource.h | 2 ++ src/libCom/os/VMS/bsdSockResource.c | 7 +++++ src/libCom/os/WIN32/bsdSockResource.c | 7 +++++ src/libCom/os/generic/bsdSockResource.c | 16 +++++++++++ src/libCom/os/vxWorks/bsdSockResource.c | 9 ++++++- 10 files changed, 57 insertions(+), 35 deletions(-) diff --git a/src/ca/iocinf.c b/src/ca/iocinf.c index 24b4f452d..735a153df 100644 --- a/src/ca/iocinf.c +++ b/src/ca/iocinf.c @@ -57,6 +57,11 @@ /* kernels that support multicast */ /* * $Log$ + * Revision 1.84.4.6 2003/06/13 00:27:26 jhill + * set retry number to 4 when there is a beacon anomaly or when a + * channel disconnects. This starts the searcch delay at .4 seconds + * instead of at 0.25 seconds. + * * Revision 1.84.4.5 2002/07/12 22:16:02 jba * Updated license comments. * @@ -321,6 +326,7 @@ int net_proto UNLOCK; return ECA_SOCK; } + setCloseOnExec ( sock ); piiu->sock_chan = sock; @@ -471,6 +477,7 @@ int net_proto UNLOCK; return ECA_SOCK; } + setCloseOnExec ( sock ); piiu->sock_chan = sock; @@ -1659,6 +1666,7 @@ int repeater_installed() UNLOCK; return installed; } + setCloseOnExec ( sock ); memset((char *)&bd,0,sizeof bd); bd.sin_family = AF_INET; diff --git a/src/ca/posix_depen.c b/src/ca/posix_depen.c index 74a429bb7..0a63efcd6 100644 --- a/src/ca/posix_depen.c +++ b/src/ca/posix_depen.c @@ -156,32 +156,6 @@ char *localUserName() return pTmp; } - -/* - * max_unix_fd() - * - * attempt to determine the maximum file descriptor - * on all UNIX systems - */ -int max_unix_fd( ) -{ - int max; - static const int bestGuess = 1024; - -# if defined(OPEN_MAX) - max = OPEN_MAX; /* posix */ -# elif defined(_SC_OPEN_MAX) - max = sysconf (_SC_OPEN_MAX); - if (max<0) { - max = bestGuess; - } -# else - max = bestGuess; -# endif - - return max; -} - /* * ca_spawn_repeater() @@ -211,16 +185,9 @@ void ca_spawn_repeater() } /* - * close all open files except for STDIO so they will not + * all open sockets closed by CLOSEXC flag so they will not * be inherited by the repeater task */ - maxfd = max_unix_fd (); - for (fd = 0; fd<=maxfd; fd++) { - if (fd==STDIN_FILENO) continue; - if (fd==STDOUT_FILENO) continue; - if (fd==STDERR_FILENO) continue; - close (fd); - } /* * running in the repeater process diff --git a/src/ca/repeater.c b/src/ca/repeater.c index 54bb780a1..ef0a55284 100644 --- a/src/ca/repeater.c +++ b/src/ca/repeater.c @@ -333,6 +333,7 @@ LOCAL makeSocketReturn makeSocket(unsigned short port, int reuseAddr) msr.pErrStr = SOCKERRSTR; return msr; } + setCloseOnExec ( msr.sock ); /* * no need to bind if unconstrained diff --git a/src/cas/io/bsdSocket/casDGIntfIO.cc b/src/cas/io/bsdSocket/casDGIntfIO.cc index 7e820aeb2..b875e1b05 100644 --- a/src/cas/io/bsdSocket/casDGIntfIO.cc +++ b/src/cas/io/bsdSocket/casDGIntfIO.cc @@ -115,6 +115,7 @@ caStatus casDGIntfIO::init(const caNetAddr &addr, unsigned connectWithThisPortIn "CAS: unable to create cast socket\n"); return S_cas_noMemory; } + setCloseOnExec ( this->sock ); status = setsockopt( this->sock, diff --git a/src/cas/io/bsdSocket/casIntfIO.cc b/src/cas/io/bsdSocket/casIntfIO.cc index 98f63baa9..b17a2af78 100644 --- a/src/cas/io/bsdSocket/casIntfIO.cc +++ b/src/cas/io/bsdSocket/casIntfIO.cc @@ -15,6 +15,9 @@ // // // $Log$ +// Revision 1.7.8.4 2002/07/12 22:16:51 jba +// Updated license comments. +// // Revision 1.7.8.3 2001/03/06 00:24:42 jhill // fixed R3.13 for Linux's new socklen_t // @@ -89,6 +92,7 @@ caStatus casIntfIO::init(const caNetAddr &addrIn, casDGClient &dgClientIn, printf("No socket error was %s\n", SOCKERRSTR); return S_cas_noFD; } + setCloseOnExec ( this->sock ); /* * release the port in case we exit early @@ -247,6 +251,8 @@ casStreamOS *casIntfIO::newStreamClient(caServerI &cas) const ca_printf("CAS: accept returned bad address len?\n"); return NULL; } + setCloseOnExec ( newSock ); + ioArgsToNewStreamIO args; args.addr = newAddr; diff --git a/src/libCom/bsdSocketResource.h b/src/libCom/bsdSocketResource.h index 7b181a271..604896042 100644 --- a/src/libCom/bsdSocketResource.h +++ b/src/libCom/bsdSocketResource.h @@ -52,6 +52,8 @@ epicsShareFunc const char * epicsShareAPI getLastWSAErrorAsString(); epicsShareFunc unsigned epicsShareAPI wsaMajorVersion(); #endif +epicsShareFunc void epicsShareAPI setCloseOnExec ( SOCKET sock ); + #ifdef __cplusplus } #endif diff --git a/src/libCom/os/VMS/bsdSockResource.c b/src/libCom/os/VMS/bsdSockResource.c index 139e5c0b3..3c8437099 100644 --- a/src/libCom/os/VMS/bsdSockResource.c +++ b/src/libCom/os/VMS/bsdSockResource.c @@ -110,3 +110,10 @@ epicsShareFunc int epicsShareAPI hostToIPAddr */ return -1; } + +/* + * setCloseOnExec() + */ +epicsShareFunc void epicsShareAPI setCloseOnExec ( SOCKET sock ) +{ +} diff --git a/src/libCom/os/WIN32/bsdSockResource.c b/src/libCom/os/WIN32/bsdSockResource.c index 610f3f463..026d362a1 100644 --- a/src/libCom/os/WIN32/bsdSockResource.c +++ b/src/libCom/os/WIN32/bsdSockResource.c @@ -181,3 +181,10 @@ epicsShareFunc int epicsShareAPI hostToIPAddr return -1; } +/* + * setCloseOnExec() + */ +epicsShareFunc void epicsShareAPI setCloseOnExec ( SOCKET sock ) +{ +} + diff --git a/src/libCom/os/generic/bsdSockResource.c b/src/libCom/os/generic/bsdSockResource.c index 436ee14a9..aae557ce5 100644 --- a/src/libCom/os/generic/bsdSockResource.c +++ b/src/libCom/os/generic/bsdSockResource.c @@ -18,6 +18,8 @@ #include #include #include +#include +#include #define epicsExportSharedSymbols #include "bsdSocketResource.h" @@ -110,3 +112,17 @@ epicsShareFunc int epicsShareAPI hostToIPAddr */ return -1; } + +/* + * setCloseOnExec() + */ +epicsShareFunc void epicsShareAPI setCloseOnExec ( SOCKET sock ) +{ + int status = fcntl ( sock, F_SETFD, FD_CLOEXEC ); + if ( status < 0 ) { + errlogPrintf ( + "epicsSocketCreate: failed to " + "fcntl FD_CLOEXEC\n" ); + } +} + diff --git a/src/libCom/os/vxWorks/bsdSockResource.c b/src/libCom/os/vxWorks/bsdSockResource.c index 33f86695d..d94051f9b 100644 --- a/src/libCom/os/vxWorks/bsdSockResource.c +++ b/src/libCom/os/vxWorks/bsdSockResource.c @@ -97,4 +97,11 @@ epicsShareFunc int epicsShareAPI hostToIPAddr * success */ return 0; -} \ No newline at end of file +} + +/* + * setCloseOnExec() + */ +epicsShareFunc void epicsShareAPI setCloseOnExec ( SOCKET sock ) +{ +}