blob: 4db0e32c93b7f88e59947c3447b624f7220b9ebc [file] [log] [blame]
//===-- Pipe.cpp ------------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Host/Pipe.h"
#if defined(_WIN32)
#include <io.h>
#include <fcntl.h>
#else
#include <unistd.h>
#endif
using namespace lldb_private;
int Pipe::kInvalidDescriptor = -1;
enum PIPES { READ, WRITE }; // Constants 0 and 1 for READ and WRITE
Pipe::Pipe()
{
m_fds[READ] = Pipe::kInvalidDescriptor;
m_fds[WRITE] = Pipe::kInvalidDescriptor;
}
Pipe::~Pipe()
{
Close();
}
bool
Pipe::Open()
{
if (IsValid())
return true;
#ifdef _WIN32
if (::_pipe(m_fds, 256, O_BINARY) == 0)
return true;
#else
if (::pipe(m_fds) == 0)
return true;
#endif
m_fds[READ] = Pipe::kInvalidDescriptor;
m_fds[WRITE] = Pipe::kInvalidDescriptor;
return false;
}
int
Pipe::GetReadFileDescriptor() const
{
return m_fds[READ];
}
int
Pipe::GetWriteFileDescriptor() const
{
return m_fds[WRITE];
}
int
Pipe::ReleaseReadFileDescriptor()
{
const int fd = m_fds[READ];
m_fds[READ] = Pipe::kInvalidDescriptor;
return fd;
}
int
Pipe::ReleaseWriteFileDescriptor()
{
const int fd = m_fds[WRITE];
m_fds[WRITE] = Pipe::kInvalidDescriptor;
return fd;
}
void
Pipe::Close()
{
CloseReadFileDescriptor();
CloseWriteFileDescriptor();
}
bool
Pipe::ReadDescriptorIsValid() const
{
return m_fds[READ] != Pipe::kInvalidDescriptor;
}
bool
Pipe::WriteDescriptorIsValid() const
{
return m_fds[WRITE] != Pipe::kInvalidDescriptor;
}
bool
Pipe::IsValid() const
{
return ReadDescriptorIsValid() && WriteDescriptorIsValid();
}
bool
Pipe::CloseReadFileDescriptor()
{
if (ReadDescriptorIsValid())
{
int err;
#ifdef _WIN32
err = _close(m_fds[READ]);
#else
err = close(m_fds[READ]);
#endif
m_fds[READ] = Pipe::kInvalidDescriptor;
return err == 0;
}
return true;
}
bool
Pipe::CloseWriteFileDescriptor()
{
if (WriteDescriptorIsValid())
{
int err;
#ifdef _WIN32
err = _close(m_fds[WRITE]);
#else
err = close(m_fds[WRITE]);
#endif
m_fds[WRITE] = Pipe::kInvalidDescriptor;
return err == 0;
}
return true;
}
size_t
Pipe::Read (void *buf, size_t num_bytes)
{
if (ReadDescriptorIsValid())
{
const int fd = GetReadFileDescriptor();
#ifdef _WIN32
return _read (fd, (char *)buf, num_bytes);
#else
return read (fd, buf, num_bytes);
#endif
}
return 0; // Return 0 since errno won't be set if we didn't call read
}
size_t
Pipe::Write (const void *buf, size_t num_bytes)
{
if (WriteDescriptorIsValid())
{
const int fd = GetWriteFileDescriptor();
#ifdef _WIN32
return _write (fd, (char *)buf, num_bytes);
#else
return write (fd, buf, num_bytes);
#endif
}
return 0; // Return 0 since errno won't be set if we didn't call write
}