468efc80da
pclose(3) is now an alias for fclose(3). We could add a FORTIFY check that you use pclose(3) if and only if you used popen(3), but there seems little value to that when we can just do the right thing. This patch also adds the missing locking to _fwalk --- we need to lock both the global list of FILE*s and also each FILE* we touch. POSIX says that "The popen() function shall ensure that any streams from previous popen() calls that remain open in the parent process are closed in the new child process", which we implement via _fwalk(fclose) in the child, but we might want to just make *all* popen(3) file descriptors O_CLOEXEC in all cases. Ignore fewer errors in popen(3) failure cases. Improve popen(3) test coverage. Bug: http://b/72470344 Test: ran tests Change-Id: Ic937594bf28ec88b375f7e5825b9c05f500af438
36 lines
1.3 KiB
C
36 lines
1.3 KiB
C
/* $OpenBSD: thread_private.h,v 1.18 2006/02/22 07:16:31 otto Exp $ */
|
|
|
|
/* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <marc@snafu.org> */
|
|
|
|
#pragma once
|
|
|
|
#include <pthread.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
/*
|
|
* This file defines the thread library interface to libc. Thread
|
|
* libraries must implement the functions described here for proper
|
|
* inter-operation with libc. libc contains weak versions of the
|
|
* described functions for operation in a non-threaded environment.
|
|
*/
|
|
|
|
#define __MUTEX_NAME(name) __CONCAT(__libc_mutex_,name)
|
|
#define _THREAD_PRIVATE_MUTEX(name) static pthread_mutex_t __MUTEX_NAME(name) = PTHREAD_MUTEX_INITIALIZER
|
|
#define _THREAD_PRIVATE_MUTEX_LOCK(name) pthread_mutex_lock(&__MUTEX_NAME(name))
|
|
#define _THREAD_PRIVATE_MUTEX_UNLOCK(name) pthread_mutex_unlock(&__MUTEX_NAME(name))
|
|
|
|
/* Note that these aren't compatible with the usual OpenBSD ones which lazy-initialize! */
|
|
#define _MUTEX_LOCK(l) pthread_mutex_lock((pthread_mutex_t*) l)
|
|
#define _MUTEX_UNLOCK(l) pthread_mutex_unlock((pthread_mutex_t*) l)
|
|
|
|
__LIBC_HIDDEN__ void _thread_arc4_lock(void);
|
|
__LIBC_HIDDEN__ void _thread_arc4_unlock(void);
|
|
|
|
#define _ARC4_LOCK() _thread_arc4_lock()
|
|
#define _ARC4_UNLOCK() _thread_arc4_unlock()
|
|
#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f))
|
|
|
|
extern volatile sig_atomic_t _rs_forked;
|
|
|
|
__END_DECLS
|