aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lldb/include/lldb/Host/Terminal.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/lldb/include/lldb/Host/Terminal.h')
-rw-r--r--contrib/llvm-project/lldb/include/lldb/Host/Terminal.h174
1 files changed, 174 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/include/lldb/Host/Terminal.h b/contrib/llvm-project/lldb/include/lldb/Host/Terminal.h
new file mode 100644
index 000000000000..da0d05e8bd26
--- /dev/null
+++ b/contrib/llvm-project/lldb/include/lldb/Host/Terminal.h
@@ -0,0 +1,174 @@
+//===-- Terminal.h ----------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_HOST_TERMINAL_H
+#define LLDB_HOST_TERMINAL_H
+
+#include "lldb/lldb-private.h"
+#include "llvm/Support/Error.h"
+
+namespace lldb_private {
+
+class TerminalState;
+
+class Terminal {
+public:
+ enum class Parity {
+ No,
+ Even,
+ Odd,
+ Space,
+ Mark,
+ };
+
+ enum class ParityCheck {
+ // No parity checking
+ No,
+ // Replace erraneous bytes with NUL
+ ReplaceWithNUL,
+ // Ignore erraneous bytes
+ Ignore,
+ // Mark erraneous bytes by prepending them with \xFF\x00; real \xFF
+ // is escaped to \xFF\xFF
+ Mark,
+ };
+
+ Terminal(int fd = -1) : m_fd(fd) {}
+
+ ~Terminal() = default;
+
+ bool IsATerminal() const;
+
+ int GetFileDescriptor() const { return m_fd; }
+
+ void SetFileDescriptor(int fd) { m_fd = fd; }
+
+ bool FileDescriptorIsValid() const { return m_fd != -1; }
+
+ void Clear() { m_fd = -1; }
+
+ llvm::Error SetEcho(bool enabled);
+
+ llvm::Error SetCanonical(bool enabled);
+
+ llvm::Error SetRaw();
+
+ llvm::Error SetBaudRate(unsigned int baud_rate);
+
+ llvm::Error SetStopBits(unsigned int stop_bits);
+
+ llvm::Error SetParity(Parity parity);
+
+ llvm::Error SetParityCheck(ParityCheck parity_check);
+
+ llvm::Error SetHardwareFlowControl(bool enabled);
+
+protected:
+ struct Data;
+
+ int m_fd; // This may or may not be a terminal file descriptor
+
+ llvm::Expected<Data> GetData();
+ llvm::Error SetData(const Data &data);
+
+ friend class TerminalState;
+};
+
+/// \class TerminalState Terminal.h "lldb/Host/Terminal.h"
+/// A RAII-friendly terminal state saving/restoring class.
+///
+/// This class can be used to remember the terminal state for a file
+/// descriptor and later restore that state as it originally was.
+class TerminalState {
+public:
+ /// Construct a new instance and optionally save terminal state.
+ ///
+ /// \param[in] term
+ /// The Terminal instance holding the file descriptor to save the state
+ /// of. If the instance is not associated with a fd, no state will
+ /// be saved.
+ ///
+ /// \param[in] save_process_group
+ /// If \b true, save the process group settings, else do not
+ /// save the process group settings for a TTY.
+ TerminalState(Terminal term = -1, bool save_process_group = false);
+
+ /// Destroy the instance, restoring terminal state if saved. If restoring
+ /// state is undesirable, the instance needs to be reset before destruction.
+ ~TerminalState();
+
+ /// Save the TTY state for \a fd.
+ ///
+ /// Save the current state of the TTY for the file descriptor "fd" and if
+ /// "save_process_group" is true, attempt to save the process group info for
+ /// the TTY.
+ ///
+ /// \param[in] term
+ /// The Terminal instance holding fd to save.
+ ///
+ /// \param[in] save_process_group
+ /// If \b true, save the process group settings, else do not
+ /// save the process group settings for a TTY.
+ ///
+ /// \return
+ /// Returns \b true if \a fd describes a TTY and if the state
+ /// was able to be saved, \b false otherwise.
+ bool Save(Terminal term, bool save_process_group);
+
+ /// Restore the TTY state to the cached state.
+ ///
+ /// Restore the state of the TTY using the cached values from a previous
+ /// call to TerminalState::Save(int,bool).
+ ///
+ /// \return
+ /// Returns \b true if the TTY state was successfully restored,
+ /// \b false otherwise.
+ bool Restore() const;
+
+ /// Test for valid cached TTY state information.
+ ///
+ /// \return
+ /// Returns \b true if this object has valid saved TTY state
+ /// settings that can be used to restore a previous state,
+ /// \b false otherwise.
+ bool IsValid() const;
+
+ void Clear();
+
+protected:
+ /// Test if tflags is valid.
+ ///
+ /// \return
+ /// Returns \b true if \a m_tflags is valid and can be restored,
+ /// \b false otherwise.
+ bool TFlagsIsValid() const;
+
+ /// Test if ttystate is valid.
+ ///
+ /// \return
+ /// Returns \b true if \a m_ttystate is valid and can be
+ /// restored, \b false otherwise.
+ bool TTYStateIsValid() const;
+
+ /// Test if the process group information is valid.
+ ///
+ /// \return
+ /// Returns \b true if \a m_process_group is valid and can be
+ /// restored, \b false otherwise.
+ bool ProcessGroupIsValid() const;
+
+ // Member variables
+ Terminal m_tty; ///< A terminal
+ int m_tflags = -1; ///< Cached tflags information.
+ std::unique_ptr<Terminal::Data> m_data; ///< Platform-specific implementation.
+ lldb::pid_t m_process_group = -1; ///< Cached process group information.
+};
+
+} // namespace lldb_private
+
+#endif // LLDB_HOST_TERMINAL_H