//===-- PseudoTerminal.h ----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_PseudoTerminal_h_
#define liblldb_PseudoTerminal_h_
#if defined(__cplusplus)


#include <fcntl.h>
#include <string>

#include "lldb/lldb-defines.h"

namespace lldb_utility {

//----------------------------------------------------------------------
/// @class PseudoTerminal PseudoTerminal.h "lldb/Core/PseudoTerminal.h"
/// @brief A pseudo terminal helper class.
///
/// The pseudo terminal class abtracts the use of pseudo terminals on
/// the host system.
//----------------------------------------------------------------------
class PseudoTerminal
{
public:
    enum
    {
        invalid_fd = -1     ///< Invalid file descriptor value
    };

    //------------------------------------------------------------------
    /// Default constructor
    ///
    /// Constructs this object with invalid master and slave file
    /// descriptors.
    //------------------------------------------------------------------
    PseudoTerminal ();

    //------------------------------------------------------------------
    /// Destructor
    ///
    /// The destructor will close the master and slave file descriptors
    /// if they are valid and ownwership has not been released using
    /// one of:
    /// @li PseudoTerminal::ReleaseMasterFileDescriptor()
    /// @li PseudoTerminal::ReleaseSaveFileDescriptor()
    //------------------------------------------------------------------
    ~PseudoTerminal ();

    //------------------------------------------------------------------
    /// Close the master file descriptor if it is valid.
    //------------------------------------------------------------------
    void
    CloseMasterFileDescriptor ();

    //------------------------------------------------------------------
    /// Close the slave file descriptor if it is valid.
    //------------------------------------------------------------------
    void
    CloseSlaveFileDescriptor ();

    //------------------------------------------------------------------
    /// Fork a child process that uses pseudo terminals for its stdio.
    ///
    /// In the parent process, a call to this function results in a pid
    /// being returned. If the pid is valid, the master file descriptor
    /// can be used for read/write access to stdio of the child process.
    ///
    /// In the child process the stdin/stdout/stderr will already be
    /// routed to the slave pseudo terminal and the master file
    /// descriptor will be closed as it is no longer needed by the child
    /// process.
    ///
    /// This class will close the file descriptors for the master/slave
    /// when the destructor is called. The file handles can be released
    /// using either:
    /// @li PseudoTerminal::ReleaseMasterFileDescriptor()
    /// @li PseudoTerminal::ReleaseSaveFileDescriptor()
    ///
    /// @param[out] error
    ///     An pointer to an error that can describe any errors that
    ///     occur. This can be NULL if no error status is desired.
    ///
    /// @return
    ///     @li \b Parent process: a child process ID that is greater
    ///         than zero, or -1 if the fork fails.
    ///     @li \b Child process: zero.
    //------------------------------------------------------------------
    pid_t
    Fork (char *error_str, size_t error_len);

    //------------------------------------------------------------------
    /// The master file descriptor accessor.
    ///
    /// This object retains ownership of the master file descriptor when
    /// this accessor is used. Users can call the member function
    /// PseudoTerminal::ReleaseMasterFileDescriptor() if this
    /// object should release ownership of the slave file descriptor.
    ///
    /// @return
    ///     The master file descriptor, or PseudoTerminal::invalid_fd
    ///     if the master file  descriptor is not currently valid.
    ///
    /// @see PseudoTerminal::ReleaseMasterFileDescriptor()
    //------------------------------------------------------------------
    int
    GetMasterFileDescriptor () const;

    //------------------------------------------------------------------
    /// The slave file descriptor accessor.
    ///
    /// This object retains ownership of the slave file descriptor when
    /// this accessor is used. Users can call the member function
    /// PseudoTerminal::ReleaseSlaveFileDescriptor() if this
    /// object should release ownership of the slave file descriptor.
    ///
    /// @return
    ///     The slave file descriptor, or PseudoTerminal::invalid_fd
    ///     if the slave file descriptor is not currently valid.
    ///
    /// @see PseudoTerminal::ReleaseSlaveFileDescriptor()
    //------------------------------------------------------------------
    int
    GetSlaveFileDescriptor () const;

    //------------------------------------------------------------------
    /// Get the name of the slave pseudo terminal.
    ///
    /// A master pseudo terminal should already be valid prior to
    /// calling this function.
    ///
    /// @param[out] error
    ///     An pointer to an error that can describe any errors that
    ///     occur. This can be NULL if no error status is desired.
    ///
    /// @return
    ///     The name of the slave pseudo terminal as a NULL terminated
    ///     C. This string that comes from static memory, so a copy of
    ///     the string should be made as subsequent calls can change
    ///     this value. NULL is returned if this object doesn't have
    ///     a valid master pseudo terminal opened or if the call to
    ///     \c ptsname() fails.
    ///
    /// @see PseudoTerminal::OpenFirstAvailableMaster()
    //------------------------------------------------------------------
    const char*
    GetSlaveName (char *error_str, size_t error_len) const;

    //------------------------------------------------------------------
    /// Open the first available pseudo terminal.
    ///
    /// Opens the first available pseudo terminal with \a oflag as the
    /// permissions. The opened master file descriptor is stored in this
    /// object and can be accessed by calling the
    /// PseudoTerminal::GetMasterFileDescriptor() accessor. Clients
    /// can call the PseudoTerminal::ReleaseMasterFileDescriptor()
    /// accessor function if they wish to use the master file descriptor
    /// beyond the lifespan of this object.
    ///
    /// If this object still has a valid master file descriptor when its
    /// destructor is called, it will close it.
    ///
    /// @param[in] oflag
    ///     Flags to use when calling \c posix_openpt(\a oflag).
    ///     A value of "O_RDWR|O_NOCTTY" is suggested.
    ///
    /// @param[out] error
    ///     An pointer to an error that can describe any errors that
    ///     occur. This can be NULL if no error status is desired.
    ///
    /// @return
    ///     @li \b true when the a master files descriptor is
    ///         successfully opened.
    ///     @li \b false if anything goes wrong.
    ///
    /// @see PseudoTerminal::GetMasterFileDescriptor()
    /// @see PseudoTerminal::ReleaseMasterFileDescriptor()
    //------------------------------------------------------------------
    bool
    OpenFirstAvailableMaster (int oflag, char *error_str, size_t error_len);

    //------------------------------------------------------------------
    /// Open the slave for the current master pseudo terminal.
    ///
    /// A master pseudo terminal should already be valid prior to
    /// calling this function. The opened slave file descriptor is
    /// stored in this object and can be accessed by calling the
    /// PseudoTerminal::GetSlaveFileDescriptor() accessor. Clients
    /// can call the PseudoTerminal::ReleaseSlaveFileDescriptor()
    /// accessor function if they wish to use the slave file descriptor
    /// beyond the lifespan of this object.
    ///
    /// If this object still has a valid slave file descriptor when its
    /// destructor is called, it will close it.
    ///
    /// @param[in] oflag
    ///     Flags to use when calling \c open(\a oflag).
    ///
    /// @param[out] error
    ///     An pointer to an error that can describe any errors that
    ///     occur. This can be NULL if no error status is desired.
    ///
    /// @return
    ///     @li \b true when the a master files descriptor is
    ///         successfully opened.
    ///     @li \b false if anything goes wrong.
    ///
    /// @see PseudoTerminal::OpenFirstAvailableMaster()
    /// @see PseudoTerminal::GetSlaveFileDescriptor()
    /// @see PseudoTerminal::ReleaseSlaveFileDescriptor()
    //------------------------------------------------------------------
    bool
    OpenSlave (int oflag, char *error_str, size_t error_len);

    //------------------------------------------------------------------
    /// Release the master file descriptor.
    ///
    /// Releases ownership of the master pseudo terminal file descriptor
    /// without closing it. The destructor for this class will close the
    /// master file descriptor if the ownership isn't released using this
    /// call and the master file descriptor has been opened.
    ///
    /// @return
    ///     The master file descriptor, or PseudoTerminal::invalid_fd
    ///     if the mast file descriptor is not currently valid.
    //------------------------------------------------------------------
    int
    ReleaseMasterFileDescriptor ();

    //------------------------------------------------------------------
    /// Release the slave file descriptor.
    ///
    /// Release ownership of the slave pseudo terminal file descriptor
    /// without closing it. The destructor for this class will close the
    /// slave file descriptor if the ownership isn't released using this
    /// call and the slave file descriptor has been opened.
    ///
    /// @return
    ///     The slave file descriptor, or PseudoTerminal::invalid_fd
    ///     if the slave file descriptor is not currently valid.
    //------------------------------------------------------------------
    int
    ReleaseSlaveFileDescriptor ();

protected:
    //------------------------------------------------------------------
    // Member variables
    //------------------------------------------------------------------
    int m_master_fd;    ///< The file descriptor for the master.
    int m_slave_fd;     ///< The file descriptor for the slave.

private:
    DISALLOW_COPY_AND_ASSIGN (PseudoTerminal);

};

} // namespace lldb

#endif  // #if defined(__cplusplus)
#endif // #ifndef liblldb_PseudoTerminal_h_
