124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- PseudoTerminal.h ----------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_PseudoTerminal_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_PseudoTerminal_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(__cplusplus)
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <fcntl.h>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-defines.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_utility {
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class PseudoTerminal PseudoTerminal.h "lldb/Core/PseudoTerminal.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A pseudo terminal helper class.
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The pseudo terminal class abtracts the use of pseudo terminals on
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// the host system.
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass PseudoTerminal
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3496f5ac65fe54bae98f8d5ce11553c14e1885476eEli Friedman        invalid_fd = -1     ///< Invalid file descriptor value
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Default constructor
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Constructs this object with invalid master and slave file
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// descriptors.
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PseudoTerminal ();
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The destructor will close the master and slave file descriptors
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// if they are valid and ownwership has not been released using
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// one of:
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @li PseudoTerminal::ReleaseMasterFileDescriptor()
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @li PseudoTerminal::ReleaseSaveFileDescriptor()
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~PseudoTerminal ();
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Close the master file descriptor if it is valid.
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CloseMasterFileDescriptor ();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Close the slave file descriptor if it is valid.
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CloseSlaveFileDescriptor ();
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Fork a child process that uses pseudo terminals for its stdio.
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// In the parent process, a call to this function results in a pid
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// being returned. If the pid is valid, the master file descriptor
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// can be used for read/write access to stdio of the child process.
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// In the child process the stdin/stdout/stderr will already be
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// routed to the slave pseudo terminal and the master file
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// descriptor will be closed as it is no longer needed by the child
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// process.
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// This class will close the file descriptors for the master/slave
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// when the destructor is called. The file handles can be released
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// using either:
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @li PseudoTerminal::ReleaseMasterFileDescriptor()
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @li PseudoTerminal::ReleaseSaveFileDescriptor()
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] error
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An pointer to an error that can describe any errors that
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     occur. This can be NULL if no error status is desired.
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li \b Parent process: a child process ID that is greater
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///         than zero, or -1 if the fork fails.
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li \b Child process: zero.
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
95d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton    lldb::pid_t
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Fork (char *error_str, size_t error_len);
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The master file descriptor accessor.
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// This object retains ownership of the master file descriptor when
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// this accessor is used. Users can call the member function
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// PseudoTerminal::ReleaseMasterFileDescriptor() if this
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// object should release ownership of the slave file descriptor.
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The master file descriptor, or PseudoTerminal::invalid_fd
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     if the master file  descriptor is not currently valid.
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::ReleaseMasterFileDescriptor()
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMasterFileDescriptor () const;
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The slave file descriptor accessor.
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// This object retains ownership of the slave file descriptor when
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// this accessor is used. Users can call the member function
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// PseudoTerminal::ReleaseSlaveFileDescriptor() if this
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// object should release ownership of the slave file descriptor.
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The slave file descriptor, or PseudoTerminal::invalid_fd
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     if the slave file descriptor is not currently valid.
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::ReleaseSlaveFileDescriptor()
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSlaveFileDescriptor () const;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the name of the slave pseudo terminal.
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// A master pseudo terminal should already be valid prior to
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// calling this function.
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] error
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An pointer to an error that can describe any errors that
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     occur. This can be NULL if no error status is desired.
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The name of the slave pseudo terminal as a NULL terminated
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     C. This string that comes from static memory, so a copy of
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     the string should be made as subsequent calls can change
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     this value. NULL is returned if this object doesn't have
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     a valid master pseudo terminal opened or if the call to
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \c ptsname() fails.
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::OpenFirstAvailableMaster()
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char*
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSlaveName (char *error_str, size_t error_len) const;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Open the first available pseudo terminal.
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Opens the first available pseudo terminal with \a oflag as the
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// permissions. The opened master file descriptor is stored in this
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// object and can be accessed by calling the
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// PseudoTerminal::GetMasterFileDescriptor() accessor. Clients
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// can call the PseudoTerminal::ReleaseMasterFileDescriptor()
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// accessor function if they wish to use the master file descriptor
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// beyond the lifespan of this object.
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// If this object still has a valid master file descriptor when its
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// destructor is called, it will close it.
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] oflag
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Flags to use when calling \c posix_openpt(\a oflag).
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A value of "O_RDWR|O_NOCTTY" is suggested.
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] error
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An pointer to an error that can describe any errors that
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     occur. This can be NULL if no error status is desired.
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li \b true when the a master files descriptor is
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///         successfully opened.
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li \b false if anything goes wrong.
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::GetMasterFileDescriptor()
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::ReleaseMasterFileDescriptor()
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OpenFirstAvailableMaster (int oflag, char *error_str, size_t error_len);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Open the slave for the current master pseudo terminal.
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// A master pseudo terminal should already be valid prior to
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// calling this function. The opened slave file descriptor is
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// stored in this object and can be accessed by calling the
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// PseudoTerminal::GetSlaveFileDescriptor() accessor. Clients
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// can call the PseudoTerminal::ReleaseSlaveFileDescriptor()
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// accessor function if they wish to use the slave file descriptor
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// beyond the lifespan of this object.
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// If this object still has a valid slave file descriptor when its
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// destructor is called, it will close it.
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] oflag
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Flags to use when calling \c open(\a oflag).
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] error
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An pointer to an error that can describe any errors that
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     occur. This can be NULL if no error status is desired.
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li \b true when the a master files descriptor is
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///         successfully opened.
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     @li \b false if anything goes wrong.
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::OpenFirstAvailableMaster()
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::GetSlaveFileDescriptor()
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see PseudoTerminal::ReleaseSlaveFileDescriptor()
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OpenSlave (int oflag, char *error_str, size_t error_len);
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Release the master file descriptor.
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Releases ownership of the master pseudo terminal file descriptor
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// without closing it. The destructor for this class will close the
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// master file descriptor if the ownership isn't released using this
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// call and the master file descriptor has been opened.
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The master file descriptor, or PseudoTerminal::invalid_fd
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     if the mast file descriptor is not currently valid.
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReleaseMasterFileDescriptor ();
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Release the slave file descriptor.
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Release ownership of the slave pseudo terminal file descriptor
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// without closing it. The destructor for this class will close the
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// slave file descriptor if the ownership isn't released using this
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// call and the slave file descriptor has been opened.
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The slave file descriptor, or PseudoTerminal::invalid_fd
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     if the slave file descriptor is not currently valid.
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReleaseSlaveFileDescriptor ();
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Member variables
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int m_master_fd;    ///< The file descriptor for the master.
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int m_slave_fd;     ///< The file descriptor for the slave.
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (PseudoTerminal);
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // #if defined(__cplusplus)
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #ifndef liblldb_PseudoTerminal_h_
267