opal/util/fd.c: add new convenience function for setting FD_CLOEXEC
Paul Hargrove pointed out that Stevens tells us that we should FD_GETFL before FD_SETFL. And so we shall. Make a new convenience function to do this (opal_fd_set_cloexec()), just so that we don't have to litter this 2-step process throughout the code. Refs trac:4550 This commit was SVN r31513. The following Trac tickets were found above: Ticket 4550 --> https://svn.open-mpi.org/trac/ompi/ticket/4550
Этот коммит содержится в:
родитель
410f5bfb91
Коммит
e1655ae68d
@ -69,3 +69,22 @@ int opal_fd_write(int fd, int len, const void *buffer)
|
||||
}
|
||||
|
||||
|
||||
int opal_fd_set_cloexec(int fd)
|
||||
{
|
||||
#ifdef FD_CLOEXEC
|
||||
int flags;
|
||||
|
||||
/* Stevens says that we should get the fd's flags before we set
|
||||
them. So say we all. */
|
||||
flags = fcntl(sd, F_GETFD, 0);
|
||||
if (-1 == flags) {
|
||||
return OPAL_ERR_IN_ERRNO;
|
||||
}
|
||||
|
||||
if (fcntl(sd, F_SETFD, FD_CLOEXEC | flags) == -1) {
|
||||
return OPAL_ERR_IN_ERRNO;
|
||||
}
|
||||
#endif
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
@ -49,6 +49,20 @@ OPAL_DECLSPEC int opal_fd_read(int fd, int len, void *buffer);
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_fd_write(int fd, int len, const void *buffer);
|
||||
|
||||
/**
|
||||
* Convenience function to set a file descriptor to be close-on-exec.
|
||||
*
|
||||
* @param fd File descriptor
|
||||
*
|
||||
* @returns OPAL_SUCCESS upon success (or if the system does not
|
||||
* support close-on-exec behavior).
|
||||
* @returns OPAL_ERR_IN_ERRNO otherwise.
|
||||
*
|
||||
* This is simply a convenience function because there's a few steps
|
||||
* to setting a file descriptor to be close-on-exec.
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_fd_set_cloexec(int fd);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
||||
|
@ -419,7 +419,7 @@ static int do_child(orte_app_context_t* context,
|
||||
}
|
||||
|
||||
/* Setup the pipe to be close-on-exec */
|
||||
fcntl(write_fd, F_SETFD, FD_CLOEXEC);
|
||||
opal_fd_set_cloexec(write_fd);
|
||||
|
||||
if (NULL != child) {
|
||||
/* setup stdout/stderr so that any error messages that we
|
||||
|
@ -55,6 +55,7 @@
|
||||
#include "opal/util/if.h"
|
||||
#include "opal/util/net.h"
|
||||
#include "opal/util/argv.h"
|
||||
#include "opal/util/fd.h"
|
||||
#include "opal/class/opal_hash_table.h"
|
||||
#include "opal/class/opal_list.h"
|
||||
|
||||
@ -132,8 +133,8 @@ int orte_oob_tcp_start_listening(void)
|
||||
|
||||
/* Make sure the pipe FDs are set to close-on-exec so that
|
||||
they don't leak into children */
|
||||
if (fcntl(mca_oob_tcp_component.stop_thread[0], F_SETFD, FD_CLOEXEC) == -1 ||
|
||||
fcntl(mca_oob_tcp_component.stop_thread[1], F_SETFD, FD_CLOEXEC) == -1) {
|
||||
if (opal_fd_set_cloexec(mca_oob_tcp_component.stop_thread[0]) != OPAL_SUCCESS ||
|
||||
opal_fd_set_cloexec(mca_oob_tcp_component.stop_thread[1]) != OPAL_SUCCESS) {
|
||||
close(mca_oob_tcp_component.stop_thread[0]);
|
||||
close(mca_oob_tcp_component.stop_thread[1]);
|
||||
ORTE_ERROR_LOG(ORTE_ERR_IN_ERRNO);
|
||||
|
@ -69,6 +69,7 @@
|
||||
#include "opal/util/opal_environ.h"
|
||||
#include "opal/util/opal_getcwd.h"
|
||||
#include "opal/util/show_help.h"
|
||||
#include "opal/util/fd.h"
|
||||
#include "opal/sys/atomic.h"
|
||||
#if OPAL_ENABLE_FT_CR == 1
|
||||
#include "opal/runtime/opal_cr.h"
|
||||
@ -3001,7 +3002,7 @@ static void open_fifo (void)
|
||||
}
|
||||
|
||||
/* Set this fd to be close-on-exec so that children don't see it */
|
||||
if (fcntl(attach_fd, F_SETFD, FD_CLOEXEC) == -1) {
|
||||
if (opal_fd_set_cloexec(attach_fd) != OPAL_SUCCESS) {
|
||||
opal_output(0, "%s unable to set debugger attach fifo to CLOEXEC",
|
||||
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME));
|
||||
close(attach_fd);
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user