124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- TTYState.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//  Created by Greg Clayton on 3/26/07.
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __TTYState_h__
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __TTYState_h__
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <termios.h>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdint.h>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass TTYState
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TTYState();
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~TTYState();
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool    GetTTYState (int fd, bool saveProcessGroup);
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool    SetTTYState () const;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool    IsValid() const { return FileDescriptorValid() && TFlagsValid() && TTYStateValid(); }
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool    FileDescriptorValid() const { return m_fd >= 0; }
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool    TFlagsValid() const { return m_tflags != -1; }
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool    TTYStateValid() const { return m_ttystateErr == 0; }
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool    ProcessGroupValid() const { return m_processGroup != -1; }
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int             m_fd;                // File descriptor
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int             m_tflags;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int             m_ttystateErr;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct termios  m_ttystate;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    pid_t           m_processGroup;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass TTYStateSwitcher
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TTYStateSwitcher();
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~TTYStateSwitcher();
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool GetState(uint32_t idx, int fd, bool saveProcessGroup);
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool SetState(uint32_t idx) const;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t NumStates() const { return sizeof(m_ttystates)/sizeof(TTYState); }
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool ValidStateIndex(uint32_t idx) const { return idx < NumStates(); }
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable uint32_t    m_currentState;
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TTYState            m_ttystates[2];
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif