@@ -112,11 +112,10 @@ Perl_setfd_cloexec_or_inhexec_by_sysfdness(pTHX_ int fd)
112112 } while(0)
113113#if defined(HAS_FCNTL ) && defined(F_SETFD ) && defined(FD_CLOEXEC ) && \
114114 defined(F_GETFD )
115- enum { CLOEXEC_EXPERIMENT , CLOEXEC_AT_OPEN , CLOEXEC_AFTER_OPEN };
116- # define DO_GENOPEN_EXPERIMENTING_CLOEXEC (TESTFD , GENOPEN_CLOEXEC , \
115+ enum { CLOEXEC_EXPERIMENT = 0 , CLOEXEC_AT_OPEN , CLOEXEC_AFTER_OPEN };
116+ # define DO_GENOPEN_EXPERIMENTING_CLOEXEC (strategy , TESTFD , GENOPEN_CLOEXEC , \
117117 GENOPEN_NORMAL , GENSETFD_CLOEXEC ) \
118118 do { \
119- static int strategy = CLOEXEC_EXPERIMENT; \
120119 switch (strategy) { \
121120 case CLOEXEC_EXPERIMENT: default: { \
122121 int res = (GENOPEN_CLOEXEC), eno; \
@@ -149,7 +148,7 @@ enum { CLOEXEC_EXPERIMENT, CLOEXEC_AT_OPEN, CLOEXEC_AFTER_OPEN };
149148 } \
150149 } while(0)
151150#else
152- # define DO_GENOPEN_EXPERIMENTING_CLOEXEC (TESTFD , GENOPEN_CLOEXEC , \
151+ # define DO_GENOPEN_EXPERIMENTING_CLOEXEC (strategy , TESTFD , GENOPEN_CLOEXEC , \
153152 GENOPEN_NORMAL , GENSETFD_CLOEXEC ) \
154153 DO_GENOPEN_THEN_CLOEXEC(GENOPEN_NORMAL, GENSETFD_CLOEXEC)
155154#endif
@@ -160,10 +159,13 @@ enum { CLOEXEC_EXPERIMENT, CLOEXEC_AT_OPEN, CLOEXEC_AFTER_OPEN };
160159 DO_GENOPEN_THEN_CLOEXEC(fd = (ONEOPEN_NORMAL), \
161160 setfd_cloexec(fd)); \
162161 } while(0)
163- #define DO_ONEOPEN_EXPERIMENTING_CLOEXEC (ONEOPEN_CLOEXEC , ONEOPEN_NORMAL ) \
162+ #define DO_ONEOPEN_EXPERIMENTING_CLOEXEC (strategy , \
163+ ONEOPEN_CLOEXEC , ONEOPEN_NORMAL ) \
164164 do { \
165165 int fd; \
166- DO_GENOPEN_EXPERIMENTING_CLOEXEC(fd, fd = (ONEOPEN_CLOEXEC), \
166+ DO_GENOPEN_EXPERIMENTING_CLOEXEC(strategy, \
167+ fd, \
168+ fd = (ONEOPEN_CLOEXEC), \
167169 fd = (ONEOPEN_NORMAL), setfd_cloexec(fd)); \
168170 } while(0)
169171
@@ -174,9 +176,10 @@ enum { CLOEXEC_EXPERIMENT, CLOEXEC_AT_OPEN, CLOEXEC_AFTER_OPEN };
174176 } while(0)
175177#define DO_PIPEOPEN_THEN_CLOEXEC (PIPEFD , PIPEOPEN_NORMAL ) \
176178 DO_GENOPEN_THEN_CLOEXEC(PIPEOPEN_NORMAL, DO_PIPESETFD_CLOEXEC(PIPEFD))
177- #define DO_PIPEOPEN_EXPERIMENTING_CLOEXEC (PIPEFD , PIPEOPEN_CLOEXEC , \
179+ #define DO_PIPEOPEN_EXPERIMENTING_CLOEXEC (strategy , PIPEFD , PIPEOPEN_CLOEXEC , \
178180 PIPEOPEN_NORMAL ) \
179- DO_GENOPEN_EXPERIMENTING_CLOEXEC((PIPEFD)[0], PIPEOPEN_CLOEXEC, \
181+ DO_GENOPEN_EXPERIMENTING_CLOEXEC(strategy, \
182+ (PIPEFD)[0], PIPEOPEN_CLOEXEC, \
180183 PIPEOPEN_NORMAL, DO_PIPESETFD_CLOEXEC(PIPEFD))
181184
182185int
@@ -188,7 +191,9 @@ Perl_PerlLIO_dup_cloexec(pTHX_ int oldfd)
188191 * to extend it, so for the time being this just isn't available on
189192 * PERL_IMPLICIT_SYS builds.
190193 */
194+ dVAR ;
191195 DO_ONEOPEN_EXPERIMENTING_CLOEXEC (
196+ PL_strategy_dup ,
192197 fcntl (oldfd , F_DUPFD_CLOEXEC , 0 ),
193198 PerlLIO_dup (oldfd ));
194199#else
@@ -205,7 +210,9 @@ Perl_PerlLIO_dup2_cloexec(pTHX_ int oldfd, int newfd)
205210 * to extend it, so for the time being this just isn't available on
206211 * PERL_IMPLICIT_SYS builds.
207212 */
213+ dVAR ;
208214 DO_ONEOPEN_EXPERIMENTING_CLOEXEC (
215+ PL_strategy_dup2 ,
209216 dup3 (oldfd , newfd , O_CLOEXEC ),
210217 PerlLIO_dup2 (oldfd , newfd ));
211218#else
@@ -216,9 +223,11 @@ Perl_PerlLIO_dup2_cloexec(pTHX_ int oldfd, int newfd)
216223int
217224Perl_PerlLIO_open_cloexec (pTHX_ const char * file , int flag )
218225{
226+ dVAR ;
219227 PERL_ARGS_ASSERT_PERLLIO_OPEN_CLOEXEC ;
220228#if defined(O_CLOEXEC )
221229 DO_ONEOPEN_EXPERIMENTING_CLOEXEC (
230+ PL_strategy_open ,
222231 PerlLIO_open (file , flag | O_CLOEXEC ),
223232 PerlLIO_open (file , flag ));
224233#else
@@ -229,9 +238,11 @@ Perl_PerlLIO_open_cloexec(pTHX_ const char *file, int flag)
229238int
230239Perl_PerlLIO_open3_cloexec (pTHX_ const char * file , int flag , int perm )
231240{
241+ dVAR ;
232242 PERL_ARGS_ASSERT_PERLLIO_OPEN3_CLOEXEC ;
233243#if defined(O_CLOEXEC )
234244 DO_ONEOPEN_EXPERIMENTING_CLOEXEC (
245+ PL_strategy_open3 ,
235246 PerlLIO_open3 (file , flag | O_CLOEXEC , perm ),
236247 PerlLIO_open3 (file , flag , perm ));
237248#else
@@ -242,9 +253,11 @@ Perl_PerlLIO_open3_cloexec(pTHX_ const char *file, int flag, int perm)
242253int
243254Perl_my_mkstemp_cloexec (char * templte )
244255{
256+ dVAR ;
245257 PERL_ARGS_ASSERT_MY_MKSTEMP_CLOEXEC ;
246258#if defined(O_CLOEXEC )
247259 DO_ONEOPEN_EXPERIMENTING_CLOEXEC (
260+ PL_strategy_mkstemp ,
248261 Perl_my_mkostemp (templte , O_CLOEXEC ),
249262 Perl_my_mkstemp (templte ));
250263#else
@@ -256,14 +269,15 @@ Perl_my_mkstemp_cloexec(char *templte)
256269int
257270Perl_PerlProc_pipe_cloexec (pTHX_ int * pipefd )
258271{
272+ dVAR ;
259273 PERL_ARGS_ASSERT_PERLPROC_PIPE_CLOEXEC ;
260274 /*
261275 * struct IPerlProc doesn't cover pipe2(), and there's no clear way
262276 * to extend it, so for the time being this just isn't available on
263277 * PERL_IMPLICIT_SYS builds.
264278 */
265279# if !defined(PERL_IMPLICIT_SYS ) && defined(HAS_PIPE2 ) && defined(O_CLOEXEC )
266- DO_PIPEOPEN_EXPERIMENTING_CLOEXEC (pipefd ,
280+ DO_PIPEOPEN_EXPERIMENTING_CLOEXEC (PL_strategy_pipe , pipefd ,
267281 pipe2 (pipefd , O_CLOEXEC ),
268282 PerlProc_pipe (pipefd ));
269283# else
278292Perl_PerlSock_socket_cloexec (pTHX_ int domain , int type , int protocol )
279293{
280294# if defined(SOCK_CLOEXEC )
295+ dVAR ;
281296 DO_ONEOPEN_EXPERIMENTING_CLOEXEC (
297+ PL_strategy_socket ,
282298 PerlSock_socket (domain , type | SOCK_CLOEXEC , protocol ),
283299 PerlSock_socket (domain , type , protocol ));
284300# else
@@ -297,7 +313,9 @@ Perl_PerlSock_accept_cloexec(pTHX_ int listenfd, struct sockaddr *addr,
297313 * way to extend it, so for the time being this just isn't available
298314 * on PERL_IMPLICIT_SYS builds.
299315 */
316+ dVAR ;
300317 DO_ONEOPEN_EXPERIMENTING_CLOEXEC (
318+ PL_strategy_accept ,
301319 accept4 (listenfd , addr , addrlen , SOCK_CLOEXEC ),
302320 PerlSock_accept (listenfd , addr , addrlen ));
303321# else
314332Perl_PerlSock_socketpair_cloexec (pTHX_ int domain , int type , int protocol ,
315333 int * pairfd )
316334{
335+ dVAR ;
317336 PERL_ARGS_ASSERT_PERLSOCK_SOCKETPAIR_CLOEXEC ;
318337# ifdef SOCK_CLOEXEC
319- DO_PIPEOPEN_EXPERIMENTING_CLOEXEC (pairfd ,
338+ DO_PIPEOPEN_EXPERIMENTING_CLOEXEC (PL_strategy_socketpair , pairfd ,
320339 PerlSock_socketpair (domain , type | SOCK_CLOEXEC , protocol , pairfd ),
321340 PerlSock_socketpair (domain , type , protocol , pairfd ));
322341# else
0 commit comments