summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Host/posix/PipePosix.h2
-rw-r--r--lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp2
-rw-r--r--lldb/source/Host/posix/PipePosix.cpp39
3 files changed, 40 insertions, 3 deletions
diff --git a/lldb/include/lldb/Host/posix/PipePosix.h b/lldb/include/lldb/Host/posix/PipePosix.h
index 0102124d947..254edc60faf 100644
--- a/lldb/include/lldb/Host/posix/PipePosix.h
+++ b/lldb/include/lldb/Host/posix/PipePosix.h
@@ -36,7 +36,7 @@ public:
~Pipe();
bool
- Open();
+ Open(bool child_processes_inherit = false);
bool
IsValid() const;
diff --git a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
index f251e67ce02..c0f13f60240 100644
--- a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
+++ b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
@@ -96,7 +96,7 @@ ConnectionFileDescriptor::OpenCommandPipe()
Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION));
// Make the command file descriptor here:
- if (!m_pipe.Open())
+ if (!m_pipe.Open(m_child_processes_inherit))
{
if (log)
log->Printf("%p ConnectionFileDescriptor::OpenCommandPipe () - could not make pipe: %s", static_cast<void *>(this),
diff --git a/lldb/source/Host/posix/PipePosix.cpp b/lldb/source/Host/posix/PipePosix.cpp
index ebc2033268e..bf6863c5411 100644
--- a/lldb/source/Host/posix/PipePosix.cpp
+++ b/lldb/source/Host/posix/PipePosix.cpp
@@ -10,6 +10,7 @@
#include "lldb/Host/posix/PipePosix.h"
#include <unistd.h>
+#include <fcntl.h>
using namespace lldb_private;
@@ -17,6 +18,25 @@ int Pipe::kInvalidDescriptor = -1;
enum PIPES { READ, WRITE }; // Constants 0 and 1 for READ and WRITE
+// pipe2 is supported by Linux, FreeBSD v10 and higher.
+// TODO: Add more platforms that support pipe2.
+#define PIPE2_SUPPORTED defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD__ >= 10)
+
+namespace
+{
+
+#if defined(FD_CLOEXEC) && !PIPE2_SUPPORTED
+bool SetCloexecFlag(int fd)
+{
+ int flags = ::fcntl(fd, F_GETFD);
+ if (flags == -1)
+ return false;
+ return (::fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == 0);
+}
+#endif
+
+}
+
Pipe::Pipe()
{
m_fds[READ] = Pipe::kInvalidDescriptor;
@@ -29,13 +49,30 @@ Pipe::~Pipe()
}
bool
-Pipe::Open()
+Pipe::Open(bool child_processes_inherit)
{
if (IsValid())
return true;
+#if PIPE2_SUPPORTED
+ if (::pipe2(m_fds, (child_processes_inherit) ? 0 : O_CLOEXEC) == 0)
+ return true;
+#else
if (::pipe(m_fds) == 0)
+ {
+#ifdef FD_CLOEXEC
+ if (!child_processes_inherit)
+ {
+ if (!SetCloexecFlag(m_fds[0]) || !SetCloexecFlag(m_fds[1]))
+ {
+ Close();
+ return false;
+ }
+ }
+#endif
return true;
+ }
+#endif
m_fds[READ] = Pipe::kInvalidDescriptor;
m_fds[WRITE] = Pipe::kInvalidDescriptor;
OpenPOWER on IntegriCloud